vrshoot

annotate src/audio/ovstream.cc @ 0:b2f14e535253

initial commit
author John Tsiombikas <nuclear@member.fsf.org>
date Sat, 01 Feb 2014 19:58:19 +0200
parents
children
rev   line source
nuclear@0 1 #include <stdio.h>
nuclear@0 2 #include <assert.h>
nuclear@0 3 #include "datapath.h"
nuclear@0 4 #include "logger.h"
nuclear@0 5 #include "ovstream.h"
nuclear@0 6
nuclear@0 7 OggVorbisStream::OggVorbisStream()
nuclear@0 8 {
nuclear@0 9 vfopen = false;
nuclear@0 10
nuclear@0 11 pthread_mutex_init(&vflock, 0);
nuclear@0 12 }
nuclear@0 13
nuclear@0 14 OggVorbisStream::~OggVorbisStream()
nuclear@0 15 {
nuclear@0 16 close();
nuclear@0 17 }
nuclear@0 18
nuclear@0 19 bool OggVorbisStream::open(const char *fname)
nuclear@0 20 {
nuclear@0 21 close();
nuclear@0 22
nuclear@0 23 pthread_mutex_lock(&vflock);
nuclear@0 24
nuclear@0 25 std::string fpath = datafile_path(fname);
nuclear@0 26 info_log("opening ogg/vorbis stream: %s -> %s\n", (fname && *fname) ? fname : "<not found>", (!fpath.empty()) ? fpath.c_str() : "<not found>");
nuclear@0 27
nuclear@0 28 if(fpath.empty() || ov_fopen(fpath.c_str(), &vf) != 0) {
nuclear@0 29 error_log("failed to open ogg/vorbis stream: %s\n", fname ? fname : "<not found>");
nuclear@0 30 pthread_mutex_unlock(&vflock);
nuclear@0 31 return false;
nuclear@0 32 }
nuclear@0 33
nuclear@0 34 vfopen = true;
nuclear@0 35 pthread_mutex_unlock(&vflock);
nuclear@0 36 return true;
nuclear@0 37 }
nuclear@0 38
nuclear@0 39 void OggVorbisStream::close()
nuclear@0 40 {
nuclear@0 41 pthread_mutex_lock(&vflock);
nuclear@0 42 if(vfopen) {
nuclear@0 43 ov_clear(&vf);
nuclear@0 44 vfopen = false;
nuclear@0 45 }
nuclear@0 46 pthread_mutex_unlock(&vflock);
nuclear@0 47 }
nuclear@0 48
nuclear@0 49 void OggVorbisStream::play(AUDIO_PLAYMODE mode)
nuclear@0 50 {
nuclear@0 51 if (vfopen)
nuclear@0 52 {
nuclear@0 53 AudioStream::play(mode);
nuclear@0 54 } else {
nuclear@0 55 error_log("failed to play audio track.\n");
nuclear@0 56 }
nuclear@0 57 }
nuclear@0 58
nuclear@0 59 void OggVorbisStream::rewind()
nuclear@0 60 {
nuclear@0 61 pthread_mutex_lock(&vflock);
nuclear@0 62 if(vfopen) {
nuclear@0 63 ov_raw_seek(&vf, 0);
nuclear@0 64 }
nuclear@0 65 pthread_mutex_unlock(&vflock);
nuclear@0 66 }
nuclear@0 67
nuclear@0 68 bool OggVorbisStream::more_samples(AudioStreamBuffer *buf)
nuclear@0 69 {
nuclear@0 70 pthread_mutex_lock(&vflock);
nuclear@0 71
nuclear@0 72 vorbis_info *vinfo = ov_info(&vf, -1);
nuclear@0 73 buf->channels = vinfo->channels;
nuclear@0 74 buf->sample_rate = vinfo->rate;
nuclear@0 75 assert(buf->channels == 2);
nuclear@0 76 assert(buf->sample_rate == 44100);
nuclear@0 77
nuclear@0 78 long bufsz = AUDIO_BUFFER_BYTES;
nuclear@0 79 long total_read = 0;
nuclear@0 80 while(total_read < bufsz) {
nuclear@0 81 int bitstream;
nuclear@0 82 long rd = ov_read(&vf, buf->samples + total_read, bufsz - total_read, 0, 2, 1, &bitstream);
nuclear@0 83
nuclear@0 84 if(!rd) {
nuclear@0 85 bufsz = total_read;
nuclear@0 86 } else {
nuclear@0 87 total_read += rd;
nuclear@0 88 }
nuclear@0 89 }
nuclear@0 90
nuclear@0 91 if(!total_read) {
nuclear@0 92 buf->num_samples = 0;
nuclear@0 93 pthread_mutex_unlock(&vflock);
nuclear@0 94 return false;
nuclear@0 95 }
nuclear@0 96
nuclear@0 97 buf->num_samples = bufsz / vinfo->channels / 2;
nuclear@0 98 pthread_mutex_unlock(&vflock);
nuclear@0 99 return true;
nuclear@0 100 }