diff options
Diffstat (limited to 'intern/audaspace/SRC')
-rw-r--r-- | intern/audaspace/SRC/AUD_SRCResampleFactory.cpp | 24 | ||||
-rw-r--r-- | intern/audaspace/SRC/AUD_SRCResampleFactory.h | 9 | ||||
-rw-r--r-- | intern/audaspace/SRC/AUD_SRCResampleReader.cpp | 36 | ||||
-rw-r--r-- | intern/audaspace/SRC/AUD_SRCResampleReader.h | 29 |
4 files changed, 45 insertions, 53 deletions
diff --git a/intern/audaspace/SRC/AUD_SRCResampleFactory.cpp b/intern/audaspace/SRC/AUD_SRCResampleFactory.cpp index caafbd14327..b421bb777e1 100644 --- a/intern/audaspace/SRC/AUD_SRCResampleFactory.cpp +++ b/intern/audaspace/SRC/AUD_SRCResampleFactory.cpp @@ -26,28 +26,18 @@ #include "AUD_SRCResampleFactory.h" #include "AUD_SRCResampleReader.h" -AUD_SRCResampleFactory::AUD_SRCResampleFactory(AUD_IReader* reader, - AUD_DeviceSpecs specs) : - AUD_ResampleFactory(reader, specs) {} - AUD_SRCResampleFactory::AUD_SRCResampleFactory(AUD_IFactory* factory, AUD_DeviceSpecs specs) : - AUD_ResampleFactory(factory, specs) {} - -AUD_SRCResampleFactory::AUD_SRCResampleFactory(AUD_DeviceSpecs specs) : - AUD_ResampleFactory(specs) {} + AUD_ResampleFactory(factory, specs) +{ +} -AUD_IReader* AUD_SRCResampleFactory::createReader() +AUD_IReader* AUD_SRCResampleFactory::createReader() const { AUD_IReader* reader = getReader(); - if(reader != 0) - { - if(reader->getSpecs().rate != m_specs.rate) - { - reader = new AUD_SRCResampleReader(reader, m_specs.specs); - AUD_NEW("reader") - } - } + if(reader->getSpecs().rate != m_specs.rate) + reader = new AUD_SRCResampleReader(reader, m_specs.specs); + return reader; } diff --git a/intern/audaspace/SRC/AUD_SRCResampleFactory.h b/intern/audaspace/SRC/AUD_SRCResampleFactory.h index 4b16c70169c..4edb0e76181 100644 --- a/intern/audaspace/SRC/AUD_SRCResampleFactory.h +++ b/intern/audaspace/SRC/AUD_SRCResampleFactory.h @@ -34,12 +34,15 @@ */ class AUD_SRCResampleFactory : public AUD_ResampleFactory { +private: + // hide copy constructor and operator= + AUD_SRCResampleFactory(const AUD_SRCResampleFactory&); + AUD_SRCResampleFactory& operator=(const AUD_SRCResampleFactory&); + public: - AUD_SRCResampleFactory(AUD_IReader* reader, AUD_DeviceSpecs specs); AUD_SRCResampleFactory(AUD_IFactory* factory, AUD_DeviceSpecs specs); - AUD_SRCResampleFactory(AUD_DeviceSpecs specs); - virtual AUD_IReader* createReader(); + virtual AUD_IReader* createReader() const; }; #endif //AUD_SRCRESAMPLEFACTORY diff --git a/intern/audaspace/SRC/AUD_SRCResampleReader.cpp b/intern/audaspace/SRC/AUD_SRCResampleReader.cpp index e89857635de..91bf7002a49 100644 --- a/intern/audaspace/SRC/AUD_SRCResampleReader.cpp +++ b/intern/audaspace/SRC/AUD_SRCResampleReader.cpp @@ -24,7 +24,6 @@ */ #include "AUD_SRCResampleReader.h" -#include "AUD_Buffer.h" #include <cmath> #include <cstring> @@ -35,16 +34,18 @@ static long src_callback(void *cb_data, float **data) return ((AUD_SRCResampleReader*)cb_data)->doCallback(data); } +static const char* state_error = "AUD_SRCResampleReader: SRC State couldn't be " + "created."; + AUD_SRCResampleReader::AUD_SRCResampleReader(AUD_IReader* reader, AUD_Specs specs) : - AUD_EffectReader(reader) + AUD_EffectReader(reader), + m_sspecs(reader->getSpecs()), + m_factor(double(specs.rate) / double(m_sspecs.rate)), + m_tspecs(specs), + m_position(0) { - m_sspecs = reader->getSpecs(); - - m_tspecs = specs; m_tspecs.channels = m_sspecs.channels; - m_factor = (double)m_tspecs.rate / (double)m_sspecs.rate; - m_position = 0; int error; m_src = src_callback_new(src_callback, @@ -56,23 +57,18 @@ AUD_SRCResampleReader::AUD_SRCResampleReader(AUD_IReader* reader, if(!m_src) { // XXX printf("%s\n", src_strerror(error)); - delete m_reader; AUD_DELETE("reader") - AUD_THROW(AUD_ERROR_READER); + AUD_THROW(AUD_ERROR_SRC, state_error); } - - m_buffer = new AUD_Buffer(); AUD_NEW("buffer") } AUD_SRCResampleReader::~AUD_SRCResampleReader() { src_delete(m_src); - - delete m_buffer; AUD_DELETE("buffer") } long AUD_SRCResampleReader::doCallback(float** data) { - int length = m_buffer->getSize() / AUD_SAMPLE_SIZE(m_tspecs); + int length = m_buffer.getSize() / AUD_SAMPLE_SIZE(m_tspecs); sample_t* buffer; m_reader->read(length, buffer); @@ -88,17 +84,17 @@ void AUD_SRCResampleReader::seek(int position) m_position = position; } -int AUD_SRCResampleReader::getLength() +int AUD_SRCResampleReader::getLength() const { return m_reader->getLength() * m_factor; } -int AUD_SRCResampleReader::getPosition() +int AUD_SRCResampleReader::getPosition() const { return m_position; } -AUD_Specs AUD_SRCResampleReader::getSpecs() +AUD_Specs AUD_SRCResampleReader::getSpecs() const { return m_tspecs; } @@ -107,10 +103,10 @@ void AUD_SRCResampleReader::read(int & length, sample_t* & buffer) { int size = length * AUD_SAMPLE_SIZE(m_tspecs); - if(m_buffer->getSize() < size) - m_buffer->resize(size); + if(m_buffer.getSize() < size) + m_buffer.resize(size); - buffer = m_buffer->getBuffer(); + buffer = m_buffer.getBuffer(); length = src_callback_read(m_src, m_factor, length, buffer); diff --git a/intern/audaspace/SRC/AUD_SRCResampleReader.h b/intern/audaspace/SRC/AUD_SRCResampleReader.h index e09d1b66f13..5e3dafb359b 100644 --- a/intern/audaspace/SRC/AUD_SRCResampleReader.h +++ b/intern/audaspace/SRC/AUD_SRCResampleReader.h @@ -27,7 +27,7 @@ #define AUD_SRCRESAMPLEREADER #include "AUD_EffectReader.h" -class AUD_Buffer; +#include "AUD_Buffer.h" #include <samplerate.h> @@ -38,14 +38,19 @@ class AUD_SRCResampleReader : public AUD_EffectReader { private: /** + * The sample specification of the source. + */ + const AUD_Specs m_sspecs; + + /** * The resampling factor. */ - double m_factor; + const double m_factor; /** * The sound output buffer. */ - AUD_Buffer *m_buffer; + AUD_Buffer m_buffer; /** * The target specification. @@ -53,11 +58,6 @@ private: AUD_Specs m_tspecs; /** - * The sample specification of the source. - */ - AUD_Specs m_sspecs; - - /** * The src state structure. */ SRC_STATE* m_src; @@ -67,14 +67,17 @@ private: */ int m_position; + // hide copy constructor and operator= + AUD_SRCResampleReader(const AUD_SRCResampleReader&); + AUD_SRCResampleReader& operator=(const AUD_SRCResampleReader&); + public: /** * Creates a resampling reader. * \param reader The reader to mix. * \param specs The target specification. * \exception AUD_Exception Thrown if the source specification cannot be - * mixed to the target specification or if the reader is - * NULL. + * resampled to the target specification. */ AUD_SRCResampleReader(AUD_IReader* reader, AUD_Specs specs); @@ -92,9 +95,9 @@ public: long doCallback(float** data); virtual void seek(int position); - virtual int getLength(); - virtual int getPosition(); - virtual AUD_Specs getSpecs(); + virtual int getLength() const; + virtual int getPosition() const; + virtual AUD_Specs getSpecs() const; virtual void read(int & length, sample_t* & buffer); }; |