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 +}