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 }