vrshoot
diff 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 |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/src/audio/ovstream.cc Sat Feb 01 19:58:19 2014 +0200 1.3 @@ -0,0 +1,100 @@ 1.4 +#include <stdio.h> 1.5 +#include <assert.h> 1.6 +#include "datapath.h" 1.7 +#include "logger.h" 1.8 +#include "ovstream.h" 1.9 + 1.10 +OggVorbisStream::OggVorbisStream() 1.11 +{ 1.12 + vfopen = false; 1.13 + 1.14 + pthread_mutex_init(&vflock, 0); 1.15 +} 1.16 + 1.17 +OggVorbisStream::~OggVorbisStream() 1.18 +{ 1.19 + close(); 1.20 +} 1.21 + 1.22 +bool OggVorbisStream::open(const char *fname) 1.23 +{ 1.24 + close(); 1.25 + 1.26 + pthread_mutex_lock(&vflock); 1.27 + 1.28 + std::string fpath = datafile_path(fname); 1.29 + info_log("opening ogg/vorbis stream: %s -> %s\n", (fname && *fname) ? fname : "<not found>", (!fpath.empty()) ? fpath.c_str() : "<not found>"); 1.30 + 1.31 + if(fpath.empty() || ov_fopen(fpath.c_str(), &vf) != 0) { 1.32 + error_log("failed to open ogg/vorbis stream: %s\n", fname ? fname : "<not found>"); 1.33 + pthread_mutex_unlock(&vflock); 1.34 + return false; 1.35 + } 1.36 + 1.37 + vfopen = true; 1.38 + pthread_mutex_unlock(&vflock); 1.39 + return true; 1.40 +} 1.41 + 1.42 +void OggVorbisStream::close() 1.43 +{ 1.44 + pthread_mutex_lock(&vflock); 1.45 + if(vfopen) { 1.46 + ov_clear(&vf); 1.47 + vfopen = false; 1.48 + } 1.49 + pthread_mutex_unlock(&vflock); 1.50 +} 1.51 + 1.52 +void OggVorbisStream::play(AUDIO_PLAYMODE mode) 1.53 +{ 1.54 + if (vfopen) 1.55 + { 1.56 + AudioStream::play(mode); 1.57 + } else { 1.58 + error_log("failed to play audio track.\n"); 1.59 + } 1.60 +} 1.61 + 1.62 +void OggVorbisStream::rewind() 1.63 +{ 1.64 + pthread_mutex_lock(&vflock); 1.65 + if(vfopen) { 1.66 + ov_raw_seek(&vf, 0); 1.67 + } 1.68 + pthread_mutex_unlock(&vflock); 1.69 +} 1.70 + 1.71 +bool OggVorbisStream::more_samples(AudioStreamBuffer *buf) 1.72 +{ 1.73 + pthread_mutex_lock(&vflock); 1.74 + 1.75 + vorbis_info *vinfo = ov_info(&vf, -1); 1.76 + buf->channels = vinfo->channels; 1.77 + buf->sample_rate = vinfo->rate; 1.78 + assert(buf->channels == 2); 1.79 + assert(buf->sample_rate == 44100); 1.80 + 1.81 + long bufsz = AUDIO_BUFFER_BYTES; 1.82 + long total_read = 0; 1.83 + while(total_read < bufsz) { 1.84 + int bitstream; 1.85 + long rd = ov_read(&vf, buf->samples + total_read, bufsz - total_read, 0, 2, 1, &bitstream); 1.86 + 1.87 + if(!rd) { 1.88 + bufsz = total_read; 1.89 + } else { 1.90 + total_read += rd; 1.91 + } 1.92 + } 1.93 + 1.94 + if(!total_read) { 1.95 + buf->num_samples = 0; 1.96 + pthread_mutex_unlock(&vflock); 1.97 + return false; 1.98 + } 1.99 + 1.100 + buf->num_samples = bufsz / vinfo->channels / 2; 1.101 + pthread_mutex_unlock(&vflock); 1.102 + return true; 1.103 +}