From d22bea5eab9e8064738aab4456952bda3bb88f95 Mon Sep 17 00:00:00 2001 From: Nicolay Korslund Date: Wed, 30 Dec 2009 12:36:35 +0100 Subject: [PATCH] Added more capabilities to Audiere sources --- sound/source.h | 3 ++- sound/sources/audiere_source.cpp | 25 ++++++++++++++++--------- sound/sources/audiere_source.h | 4 ++++ 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/sound/source.h b/sound/source.h index 7361fb118..db5bc6b47 100644 --- a/sound/source.h +++ b/sound/source.h @@ -33,7 +33,8 @@ class SampleSource : public Stream::Stream bool eof() const { return isEof; } - // Disabled functions + // Disabled functions by default. You can still override them in + // subclasses. void seek(size_t pos) const { assert(0); } size_t tell() const { assert(0); } size_t size() const { assert(0); } diff --git a/sound/sources/audiere_source.cpp b/sound/sources/audiere_source.cpp index 6ebc4f881..d99c6c4ee 100644 --- a/sound/sources/audiere_source.cpp +++ b/sound/sources/audiere_source.cpp @@ -28,11 +28,14 @@ void AudiereSource::getInfo(int32_t *rate, int32_t *channels, int32_t *bits) { SampleFormat fmt; sample->getFormat(*channels, *rate, fmt); - if(fmt == SF_U8) - *bits = 8; - else if(fmt == SF_S16) - *bits = 16; - else assert(0); + if(bits) + { + if(fmt == SF_U8) + *bits = 8; + else if(fmt == SF_S16) + *bits = 16; + else assert(0); + } } /* @@ -103,7 +106,7 @@ AudiereSource::AudiereSource(const std::string &file) if(!sample) fail("Couldn't load file " + file); - getFormat(); + setup(); } AudiereSource::AudiereSource(Stream::Stream *input) @@ -114,15 +117,15 @@ AudiereSource::AudiereSource(Stream::Stream *input) if(!sample) fail("Couldn't load stream"); - getFormat(); + setup(); } AudiereSource::AudiereSource(audiere::SampleSourcePtr src) : sample(src) -{ assert(sample); getFormat(); } +{ assert(sample); setup(); } // Common function called from all constructors -AudiereSource::getFormat() +AudiereSource::setup() { assert(sample); @@ -136,4 +139,8 @@ AudiereSource::getFormat() // Make sure that our pullover hack will work. Increase this size if // this doesn't work in all cases. assert(frameSize <= PSIZE); + + isSeekable = sample->isSeekable(); + hasPosition = true; + hasSize = true; } diff --git a/sound/sources/audiere_source.h b/sound/sources/audiere_source.h index 12ae81bce..1348e112c 100644 --- a/sound/sources/audiere_source.h +++ b/sound/sources/audiere_source.h @@ -40,6 +40,10 @@ class AudiereSource : public SampleSource void getInfo(int32_t *rate, int32_t *channels, int32_t *bits); size_t read(void *data, size_t length); + + void seek(size_t pos) const { sample->setPosition(pos); } + size_t tell() const { return sample->getPosition(); } + size_t size() const { return sample->getLength(); } }; #include "loadertemplate.h"