dungeon_crawler
diff prototype/src/audio/ovstream.cc @ 55:4c427e28ca00
music playback bugfixing
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Wed, 19 Sep 2012 08:19:10 +0300 |
parents | 1ea56011c1ff |
children | f9b8bbebc9b3 |
line diff
1.1 --- a/prototype/src/audio/ovstream.cc Wed Sep 19 05:22:43 2012 +0300 1.2 +++ b/prototype/src/audio/ovstream.cc Wed Sep 19 08:19:10 2012 +0300 1.3 @@ -1,16 +1,80 @@ 1.4 +#include <stdio.h> 1.5 +#include <assert.h> 1.6 #include "ovstream.h" 1.7 1.8 OggVorbisStream::OggVorbisStream() 1.9 { 1.10 - ov_clear(&vf); 1.11 + vfopen = false; 1.12 } 1.13 1.14 OggVorbisStream::~OggVorbisStream() 1.15 { 1.16 - ov_clear(&vf); 1.17 + close(); 1.18 } 1.19 1.20 -bool OggVorbisStream::more_samples() 1.21 +bool OggVorbisStream::open(const char *fname) 1.22 { 1.23 - return false; 1.24 + close(); 1.25 + 1.26 + std::lock_guard<std::mutex> lock(vflock); 1.27 + 1.28 + printf("opening ogg/vorbis stream: %s\n", fname ? fname : "<not found>"); 1.29 + 1.30 + if(!fname || ov_fopen(fname, &vf) != 0) { 1.31 + fprintf(stderr, "failed to open ogg/vorbis stream: %s\n", fname ? fname : "<not found>"); 1.32 + return false; 1.33 + } 1.34 + vfopen = true; 1.35 + return true; 1.36 } 1.37 + 1.38 +void OggVorbisStream::close() 1.39 +{ 1.40 + std::lock_guard<std::mutex> lock(vflock); 1.41 + 1.42 + if(vfopen) { 1.43 + ov_clear(&vf); 1.44 + vfopen = false; 1.45 + } 1.46 +} 1.47 + 1.48 +void OggVorbisStream::rewind() 1.49 +{ 1.50 + std::lock_guard<std::mutex> lock(vflock); 1.51 + 1.52 + if(vfopen) { 1.53 + ov_raw_seek(&vf, 0); 1.54 + } 1.55 +} 1.56 + 1.57 +bool OggVorbisStream::more_samples(AudioStreamBuffer *buf) 1.58 +{ 1.59 + std::lock_guard<std::mutex> lock(vflock); 1.60 + 1.61 + vorbis_info *vinfo = ov_info(&vf, -1); 1.62 + buf->channels = vinfo->channels; 1.63 + buf->sample_rate = vinfo->rate; 1.64 + 1.65 + assert(buf->channels == 2); 1.66 + assert(buf->sample_rate == 44100); 1.67 + 1.68 + long bufsz = AUDIO_BUFFER_BYTES; 1.69 + long total_read = 0; 1.70 + while(total_read < bufsz) { 1.71 + int bitstream; 1.72 + long rd = ov_read(&vf, buf->samples + total_read, bufsz, 0, 2, 1, &bitstream); 1.73 + if(!rd) { 1.74 + bufsz = total_read; 1.75 + } else { 1.76 + total_read += rd; 1.77 + } 1.78 + } 1.79 + 1.80 + if(!total_read) { 1.81 + buf->num_samples = 0; 1.82 + return false; 1.83 + } 1.84 + 1.85 + buf->num_samples = bufsz / vinfo->channels / 2; 1.86 + return true; 1.87 +}