7 OggVorbisStream::OggVorbisStream()
11 pthread_mutex_init(&vflock, 0);
14 OggVorbisStream::~OggVorbisStream()
19 static int io_fseek(void *fp, ogg_int64_t offs, int whence)
21 if(ass_fseek(fp, offs, whence) != -1) {
27 static int io_close(void *fp)
34 bool OggVorbisStream::open(const char *fname)
38 pthread_mutex_lock(&vflock);
41 if(!(fp = ass_fopen(fname, "rb"))) {
42 error_log("failed to open ogg/vorbis stream: %s: %s\n", fname, strerror(ass_errno));
43 pthread_mutex_unlock(&vflock);
47 ov_callbacks iofuncs = { ass_fread, io_fseek, io_close, ass_ftell };
48 if(ov_open_callbacks(fp, &vf, 0, 0, iofuncs) != 0) {
49 error_log("failed to open ogg/vorbis stream: %s: %s\n", fname, strerror(ass_errno));
51 pthread_mutex_unlock(&vflock);
56 pthread_mutex_unlock(&vflock);
60 void OggVorbisStream::close()
62 pthread_mutex_lock(&vflock);
67 pthread_mutex_unlock(&vflock);
70 void OggVorbisStream::rewind()
72 pthread_mutex_lock(&vflock);
76 pthread_mutex_unlock(&vflock);
79 bool OggVorbisStream::more_samples(AudioStreamBuffer *buf)
81 pthread_mutex_lock(&vflock);
83 vorbis_info *vinfo = ov_info(&vf, -1);
84 buf->channels = vinfo->channels;
85 buf->sample_rate = vinfo->rate;
86 assert(buf->channels == 2);
87 assert(buf->sample_rate == 44100);
89 long bufsz = AUDIO_BUFFER_BYTES;
91 while(total_read < bufsz) {
93 long rd = ov_read(&vf, buf->samples + total_read, bufsz - total_read, 0, 2, 1, &bitstream);
103 buf->num_samples = 0;
104 pthread_mutex_unlock(&vflock);
108 buf->num_samples = bufsz / vinfo->channels / 2;
109 pthread_mutex_unlock(&vflock);