dungeon_crawler
annotate 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 |
rev | line source |
---|---|
nuclear@55 | 1 #include <stdio.h> |
nuclear@55 | 2 #include <assert.h> |
nuclear@53 | 3 #include "ovstream.h" |
nuclear@53 | 4 |
nuclear@53 | 5 OggVorbisStream::OggVorbisStream() |
nuclear@53 | 6 { |
nuclear@55 | 7 vfopen = false; |
nuclear@53 | 8 } |
nuclear@53 | 9 |
nuclear@53 | 10 OggVorbisStream::~OggVorbisStream() |
nuclear@53 | 11 { |
nuclear@55 | 12 close(); |
nuclear@53 | 13 } |
nuclear@53 | 14 |
nuclear@55 | 15 bool OggVorbisStream::open(const char *fname) |
nuclear@53 | 16 { |
nuclear@55 | 17 close(); |
nuclear@55 | 18 |
nuclear@55 | 19 std::lock_guard<std::mutex> lock(vflock); |
nuclear@55 | 20 |
nuclear@55 | 21 printf("opening ogg/vorbis stream: %s\n", fname ? fname : "<not found>"); |
nuclear@55 | 22 |
nuclear@55 | 23 if(!fname || ov_fopen(fname, &vf) != 0) { |
nuclear@55 | 24 fprintf(stderr, "failed to open ogg/vorbis stream: %s\n", fname ? fname : "<not found>"); |
nuclear@55 | 25 return false; |
nuclear@55 | 26 } |
nuclear@55 | 27 vfopen = true; |
nuclear@55 | 28 return true; |
nuclear@53 | 29 } |
nuclear@55 | 30 |
nuclear@55 | 31 void OggVorbisStream::close() |
nuclear@55 | 32 { |
nuclear@55 | 33 std::lock_guard<std::mutex> lock(vflock); |
nuclear@55 | 34 |
nuclear@55 | 35 if(vfopen) { |
nuclear@55 | 36 ov_clear(&vf); |
nuclear@55 | 37 vfopen = false; |
nuclear@55 | 38 } |
nuclear@55 | 39 } |
nuclear@55 | 40 |
nuclear@55 | 41 void OggVorbisStream::rewind() |
nuclear@55 | 42 { |
nuclear@55 | 43 std::lock_guard<std::mutex> lock(vflock); |
nuclear@55 | 44 |
nuclear@55 | 45 if(vfopen) { |
nuclear@55 | 46 ov_raw_seek(&vf, 0); |
nuclear@55 | 47 } |
nuclear@55 | 48 } |
nuclear@55 | 49 |
nuclear@55 | 50 bool OggVorbisStream::more_samples(AudioStreamBuffer *buf) |
nuclear@55 | 51 { |
nuclear@55 | 52 std::lock_guard<std::mutex> lock(vflock); |
nuclear@55 | 53 |
nuclear@55 | 54 vorbis_info *vinfo = ov_info(&vf, -1); |
nuclear@55 | 55 buf->channels = vinfo->channels; |
nuclear@55 | 56 buf->sample_rate = vinfo->rate; |
nuclear@55 | 57 |
nuclear@55 | 58 assert(buf->channels == 2); |
nuclear@55 | 59 assert(buf->sample_rate == 44100); |
nuclear@55 | 60 |
nuclear@55 | 61 long bufsz = AUDIO_BUFFER_BYTES; |
nuclear@55 | 62 long total_read = 0; |
nuclear@55 | 63 while(total_read < bufsz) { |
nuclear@55 | 64 int bitstream; |
nuclear@55 | 65 long rd = ov_read(&vf, buf->samples + total_read, bufsz, 0, 2, 1, &bitstream); |
nuclear@55 | 66 if(!rd) { |
nuclear@55 | 67 bufsz = total_read; |
nuclear@55 | 68 } else { |
nuclear@55 | 69 total_read += rd; |
nuclear@55 | 70 } |
nuclear@55 | 71 } |
nuclear@55 | 72 |
nuclear@55 | 73 if(!total_read) { |
nuclear@55 | 74 buf->num_samples = 0; |
nuclear@55 | 75 return false; |
nuclear@55 | 76 } |
nuclear@55 | 77 |
nuclear@55 | 78 buf->num_samples = bufsz / vinfo->channels / 2; |
nuclear@55 | 79 return true; |
nuclear@55 | 80 } |