dungeon_crawler

view prototype/src/audio/ovstream.cc @ 56:f9b8bbebc9b3

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