From 7296600434c49b40215ba842af73a8b1517e12eb Mon Sep 17 00:00:00 2001 From: Joerg Mueller Date: Wed, 28 Jul 2010 09:36:03 +0000 Subject: [PATCH] Audaspace: HUGE Refactor. Some points of the refactor not sorted by importance: * Fixed immutability of readers and factories (there are exceptions...) * Fixed copy constructors and = operators * Removed messaging system * Removed reader types * Added const where possible * Using initalisers when possible * Avoided use of pointers when possible * Removed AUD_NEW and AUD_DELETE macros * Removed useless NULL pointer checks * Fixed exception catching * Fixed some yet unknown bugs * Lots of other stuff --- .../audaspace/FX/AUD_AccumulatorFactory.cpp | 22 +-- intern/audaspace/FX/AUD_AccumulatorFactory.h | 14 +- intern/audaspace/FX/AUD_AccumulatorReader.cpp | 36 ++--- intern/audaspace/FX/AUD_AccumulatorReader.h | 26 ++-- .../audaspace/FX/AUD_ButterworthFactory.cpp | 22 +-- intern/audaspace/FX/AUD_ButterworthFactory.h | 14 +- intern/audaspace/FX/AUD_ButterworthReader.cpp | 37 ++--- intern/audaspace/FX/AUD_ButterworthReader.h | 18 ++- intern/audaspace/FX/AUD_DelayFactory.cpp | 26 +--- intern/audaspace/FX/AUD_DelayFactory.h | 24 ++-- intern/audaspace/FX/AUD_DelayReader.cpp | 56 ++++---- intern/audaspace/FX/AUD_DelayReader.h | 25 ++-- intern/audaspace/FX/AUD_DoubleFactory.cpp | 19 +-- intern/audaspace/FX/AUD_DoubleFactory.h | 6 +- intern/audaspace/FX/AUD_DoubleReader.cpp | 106 +++++--------- intern/audaspace/FX/AUD_DoubleReader.h | 21 +-- intern/audaspace/FX/AUD_EffectFactory.cpp | 13 +- intern/audaspace/FX/AUD_EffectFactory.h | 22 +-- intern/audaspace/FX/AUD_EffectReader.cpp | 22 +-- intern/audaspace/FX/AUD_EffectReader.h | 16 ++- intern/audaspace/FX/AUD_EnvelopeFactory.cpp | 28 +--- intern/audaspace/FX/AUD_EnvelopeFactory.h | 24 ++-- intern/audaspace/FX/AUD_EnvelopeReader.cpp | 32 ++--- intern/audaspace/FX/AUD_EnvelopeReader.h | 38 +++-- intern/audaspace/FX/AUD_FaderFactory.cpp | 44 ++---- intern/audaspace/FX/AUD_FaderFactory.h | 47 ++----- intern/audaspace/FX/AUD_FaderReader.cpp | 54 +++++--- intern/audaspace/FX/AUD_FaderReader.h | 34 ++--- intern/audaspace/FX/AUD_HighpassFactory.cpp | 23 +-- intern/audaspace/FX/AUD_HighpassFactory.h | 17 +-- intern/audaspace/FX/AUD_HighpassReader.cpp | 40 ++---- intern/audaspace/FX/AUD_HighpassReader.h | 18 ++- intern/audaspace/FX/AUD_LimiterFactory.cpp | 30 +--- intern/audaspace/FX/AUD_LimiterFactory.h | 29 ++-- intern/audaspace/FX/AUD_LimiterReader.cpp | 36 +++-- intern/audaspace/FX/AUD_LimiterReader.h | 13 +- intern/audaspace/FX/AUD_LoopFactory.cpp | 26 +--- intern/audaspace/FX/AUD_LoopFactory.h | 26 ++-- intern/audaspace/FX/AUD_LoopReader.cpp | 79 +++++------ intern/audaspace/FX/AUD_LoopReader.h | 29 ++-- intern/audaspace/FX/AUD_LowpassFactory.cpp | 23 +-- intern/audaspace/FX/AUD_LowpassFactory.h | 17 +-- intern/audaspace/FX/AUD_LowpassReader.cpp | 40 ++---- intern/audaspace/FX/AUD_LowpassReader.h | 18 ++- intern/audaspace/FX/AUD_PingPongFactory.cpp | 45 ++---- intern/audaspace/FX/AUD_PingPongFactory.h | 9 +- intern/audaspace/FX/AUD_PitchFactory.cpp | 21 +-- intern/audaspace/FX/AUD_PitchFactory.h | 27 +--- intern/audaspace/FX/AUD_PitchReader.cpp | 5 +- intern/audaspace/FX/AUD_PitchReader.h | 9 +- intern/audaspace/FX/AUD_RectifyFactory.cpp | 20 +-- intern/audaspace/FX/AUD_RectifyFactory.h | 14 +- intern/audaspace/FX/AUD_RectifyReader.cpp | 13 +- intern/audaspace/FX/AUD_RectifyReader.h | 14 +- intern/audaspace/FX/AUD_ReverseFactory.cpp | 17 +-- intern/audaspace/FX/AUD_ReverseFactory.h | 12 +- intern/audaspace/FX/AUD_ReverseReader.cpp | 33 ++--- intern/audaspace/FX/AUD_ReverseReader.h | 31 ++--- intern/audaspace/FX/AUD_SquareFactory.cpp | 26 +--- intern/audaspace/FX/AUD_SquareFactory.h | 24 ++-- intern/audaspace/FX/AUD_SquareReader.cpp | 14 +- intern/audaspace/FX/AUD_SquareReader.h | 16 +-- intern/audaspace/FX/AUD_SumFactory.cpp | 18 +-- intern/audaspace/FX/AUD_SumFactory.h | 9 +- intern/audaspace/FX/AUD_SumReader.cpp | 27 ++-- intern/audaspace/FX/AUD_SumReader.h | 16 +-- intern/audaspace/FX/AUD_SuperposeFactory.cpp | 18 +-- intern/audaspace/FX/AUD_SuperposeFactory.h | 6 +- intern/audaspace/FX/AUD_SuperposeReader.cpp | 60 ++------ intern/audaspace/FX/AUD_SuperposeReader.h | 21 +-- intern/audaspace/FX/AUD_VolumeFactory.cpp | 26 +--- intern/audaspace/FX/AUD_VolumeFactory.h | 24 ++-- intern/audaspace/FX/AUD_VolumeReader.cpp | 26 +--- intern/audaspace/FX/AUD_VolumeReader.h | 17 +-- intern/audaspace/OpenAL/AUD_OpenALDevice.cpp | 131 ++++++------------ intern/audaspace/OpenAL/AUD_OpenALDevice.h | 13 +- intern/audaspace/Python/AUD_PyAPI.cpp | 7 +- intern/audaspace/SDL/AUD_SDLDevice.h | 4 + .../audaspace/SRC/AUD_SRCResampleFactory.cpp | 24 +--- intern/audaspace/SRC/AUD_SRCResampleFactory.h | 13 +- .../audaspace/SRC/AUD_SRCResampleReader.cpp | 32 ++--- intern/audaspace/SRC/AUD_SRCResampleReader.h | 29 ++-- intern/audaspace/ffmpeg/AUD_FFMPEGFactory.cpp | 36 ++--- intern/audaspace/ffmpeg/AUD_FFMPEGFactory.h | 19 +-- intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp | 107 +++++++------- intern/audaspace/ffmpeg/AUD_FFMPEGReader.h | 26 ++-- intern/audaspace/fftw/AUD_BandPassReader.h | 1 - intern/audaspace/intern/AUD_Buffer.cpp | 21 +-- intern/audaspace/intern/AUD_Buffer.h | 8 +- intern/audaspace/intern/AUD_BufferReader.cpp | 33 ++--- intern/audaspace/intern/AUD_BufferReader.h | 14 +- intern/audaspace/intern/AUD_C-API.cpp | 82 +++++------ .../intern/AUD_ChannelMapperFactory.cpp | 35 ++--- .../intern/AUD_ChannelMapperFactory.h | 8 +- .../intern/AUD_ChannelMapperReader.cpp | 36 ++--- .../intern/AUD_ChannelMapperReader.h | 12 +- .../audaspace/intern/AUD_ConverterFactory.cpp | 23 +-- .../audaspace/intern/AUD_ConverterFactory.h | 13 +- .../audaspace/intern/AUD_ConverterReader.cpp | 18 +-- intern/audaspace/intern/AUD_ConverterReader.h | 15 +- intern/audaspace/intern/AUD_DefaultMixer.cpp | 63 +++++++++ intern/audaspace/intern/AUD_DefaultMixer.h | 53 +++++++ intern/audaspace/intern/AUD_FileFactory.cpp | 51 +++---- intern/audaspace/intern/AUD_FileFactory.h | 19 +-- intern/audaspace/intern/AUD_IDevice.h | 12 +- intern/audaspace/intern/AUD_IFactory.h | 2 +- intern/audaspace/intern/AUD_IReader.h | 25 +--- .../intern/AUD_LinearResampleFactory.cpp | 24 +--- .../intern/AUD_LinearResampleFactory.h | 13 +- .../intern/AUD_LinearResampleReader.cpp | 45 +++--- .../intern/AUD_LinearResampleReader.h | 42 +++--- intern/audaspace/intern/AUD_Mixer.cpp | 74 ++-------- intern/audaspace/intern/AUD_Mixer.h | 57 +++----- intern/audaspace/intern/AUD_MixerFactory.cpp | 73 +--------- intern/audaspace/intern/AUD_MixerFactory.h | 58 ++------ intern/audaspace/intern/AUD_NULLDevice.cpp | 16 +-- intern/audaspace/intern/AUD_NULLDevice.h | 9 +- intern/audaspace/intern/AUD_ReadDevice.cpp | 10 +- intern/audaspace/intern/AUD_ReadDevice.h | 10 +- intern/audaspace/intern/AUD_Reference.h | 22 +-- .../audaspace/intern/AUD_SequencerFactory.cpp | 32 +++-- .../audaspace/intern/AUD_SequencerFactory.h | 8 +- .../audaspace/intern/AUD_SequencerReader.cpp | 77 ++++------ intern/audaspace/intern/AUD_SequencerReader.h | 26 ++-- intern/audaspace/intern/AUD_SinusFactory.cpp | 19 +-- intern/audaspace/intern/AUD_SinusFactory.h | 20 ++- intern/audaspace/intern/AUD_SinusReader.cpp | 41 ++---- intern/audaspace/intern/AUD_SinusReader.h | 29 ++-- .../audaspace/intern/AUD_SoftwareDevice.cpp | 56 +++----- intern/audaspace/intern/AUD_SoftwareDevice.h | 3 +- intern/audaspace/intern/AUD_Space.h | 53 ------- .../intern/AUD_StreamBufferFactory.cpp | 17 +-- .../intern/AUD_StreamBufferFactory.h | 6 +- intern/audaspace/jack/AUD_JackDevice.cpp | 41 +++--- intern/audaspace/jack/AUD_JackDevice.h | 16 ++- .../audaspace/sndfile/AUD_SndFileFactory.cpp | 34 ++--- intern/audaspace/sndfile/AUD_SndFileFactory.h | 19 +-- .../audaspace/sndfile/AUD_SndFileReader.cpp | 46 ++---- intern/audaspace/sndfile/AUD_SndFileReader.h | 21 +-- 139 files changed, 1502 insertions(+), 2428 deletions(-) create mode 100644 intern/audaspace/intern/AUD_DefaultMixer.cpp create mode 100644 intern/audaspace/intern/AUD_DefaultMixer.h diff --git a/intern/audaspace/FX/AUD_AccumulatorFactory.cpp b/intern/audaspace/FX/AUD_AccumulatorFactory.cpp index 20709c57ee5..6e9130d174b 100644 --- a/intern/audaspace/FX/AUD_AccumulatorFactory.cpp +++ b/intern/audaspace/FX/AUD_AccumulatorFactory.cpp @@ -29,21 +29,11 @@ AUD_AccumulatorFactory::AUD_AccumulatorFactory(AUD_IFactory* factory, bool additive) : AUD_EffectFactory(factory), - m_additive(additive) {} - -AUD_AccumulatorFactory::AUD_AccumulatorFactory(bool additive) : - AUD_EffectFactory(0), - m_additive(additive) {} - -AUD_IReader* AUD_AccumulatorFactory::createReader() + m_additive(additive) { - AUD_IReader* reader = getReader(); - - if(reader != 0) - { - reader = new AUD_AccumulatorReader(reader, m_additive); - AUD_NEW("reader") - } - - return reader; +} + +AUD_IReader* AUD_AccumulatorFactory::createReader() const +{ + return new AUD_AccumulatorReader(getReader(), m_additive); } diff --git a/intern/audaspace/FX/AUD_AccumulatorFactory.h b/intern/audaspace/FX/AUD_AccumulatorFactory.h index e475a19ccf6..2b90fa43bdf 100644 --- a/intern/audaspace/FX/AUD_AccumulatorFactory.h +++ b/intern/audaspace/FX/AUD_AccumulatorFactory.h @@ -37,7 +37,11 @@ private: /** * Whether the accumulator is additive. */ - bool m_additive; + const bool m_additive; + + // hide copy constructor and operator= + AUD_AccumulatorFactory(const AUD_AccumulatorFactory&); + AUD_AccumulatorFactory& operator=(const AUD_AccumulatorFactory&); public: /** @@ -47,13 +51,7 @@ public: */ AUD_AccumulatorFactory(AUD_IFactory* factory, bool additive = false); - /** - * Creates a new accumulator factory. - * \param additive Whether the accumulator is additive. - */ - AUD_AccumulatorFactory(bool additive = false); - - virtual AUD_IReader* createReader(); + virtual AUD_IReader* createReader() const; }; #endif //AUD_ACCUMULATORFACTORY diff --git a/intern/audaspace/FX/AUD_AccumulatorReader.cpp b/intern/audaspace/FX/AUD_AccumulatorReader.cpp index 67ab4157f9c..a8964edcac7 100644 --- a/intern/audaspace/FX/AUD_AccumulatorReader.cpp +++ b/intern/audaspace/FX/AUD_AccumulatorReader.cpp @@ -24,7 +24,6 @@ */ #include "AUD_AccumulatorReader.h" -#include "AUD_Buffer.h" #include @@ -33,25 +32,12 @@ AUD_AccumulatorReader::AUD_AccumulatorReader(AUD_IReader* reader, bool additive) : AUD_EffectReader(reader), - m_additive(additive) + m_additive(additive), + m_sums(AUD_SAMPLE_SIZE(reader->getSpecs())), + m_prevs(AUD_SAMPLE_SIZE(reader->getSpecs())) { - AUD_Specs specs = reader->getSpecs(); - int samplesize = AUD_SAMPLE_SIZE(specs); - - m_buffer = new AUD_Buffer(); AUD_NEW("buffer") - - m_sums = new AUD_Buffer(samplesize); AUD_NEW("buffer") - memset(m_sums->getBuffer(), 0, samplesize); - - m_prevs = new AUD_Buffer(samplesize); AUD_NEW("buffer") - memset(m_prevs->getBuffer(), 0, samplesize); -} - -AUD_AccumulatorReader::~AUD_AccumulatorReader() -{ - delete m_buffer; AUD_DELETE("buffer") - delete m_sums; AUD_DELETE("buffer") - delete m_prevs; AUD_DELETE("buffer") + memset(m_sums.getBuffer(), 0, m_sums.getSize()); + memset(m_prevs.getBuffer(), 0, m_prevs.getSize()); } void AUD_AccumulatorReader::read(int & length, sample_t* & buffer) @@ -59,16 +45,16 @@ void AUD_AccumulatorReader::read(int & length, sample_t* & buffer) sample_t* buf; sample_t* sums; sample_t* prevs; - sums = m_sums->getBuffer(); - prevs = m_prevs->getBuffer(); + sums = m_sums.getBuffer(); + prevs = m_prevs.getBuffer(); AUD_Specs specs = m_reader->getSpecs(); m_reader->read(length, buf); - if(m_buffer->getSize() < length * AUD_SAMPLE_SIZE(specs)) - m_buffer->resize(length * AUD_SAMPLE_SIZE(specs)); + if(m_buffer.getSize() < length * AUD_SAMPLE_SIZE(specs)) + m_buffer.resize(length * AUD_SAMPLE_SIZE(specs)); - buffer = m_buffer->getBuffer(); + buffer = m_buffer.getBuffer(); if(m_additive) { @@ -87,7 +73,7 @@ void AUD_AccumulatorReader::read(int & length, sample_t* & buffer) { for(int channel = 0; channel < specs.channels; channel++) { - for(int i = 0; i < length * specs.channels; i++) + for(int i = 0; i < length; i++) { if(buf[i * CC] > prevs[channel]) sums[channel] += buf[i * CC] - prevs[channel]; diff --git a/intern/audaspace/FX/AUD_AccumulatorReader.h b/intern/audaspace/FX/AUD_AccumulatorReader.h index 8ad1dda30f6..68c1360731d 100644 --- a/intern/audaspace/FX/AUD_AccumulatorReader.h +++ b/intern/audaspace/FX/AUD_AccumulatorReader.h @@ -27,7 +27,7 @@ #define AUD_ACCUMULATORREADER #include "AUD_EffectReader.h" -class AUD_Buffer; +#include "AUD_Buffer.h" /** * This class represents an accumulator. @@ -35,40 +35,38 @@ class AUD_Buffer; class AUD_AccumulatorReader : public AUD_EffectReader { private: + /** + * Whether the accumulator is additive. + */ + const bool m_additive; + /** * The playback buffer. */ - AUD_Buffer *m_buffer; + AUD_Buffer m_buffer; /** * The sums of the specific channels. */ - AUD_Buffer *m_sums; + AUD_Buffer m_sums; /** * The previous results of the specific channels. */ - AUD_Buffer *m_prevs; + AUD_Buffer m_prevs; - /** - * Whether the accumulator is additive. - */ - bool m_additive; + // hide copy constructor and operator= + AUD_AccumulatorReader(const AUD_AccumulatorReader&); + AUD_AccumulatorReader& operator=(const AUD_AccumulatorReader&); public: /** * Creates a new accumulator reader. * \param reader The reader to read from. * \param additive Whether the accumulator is additive. - * \exception AUD_Exception Thrown if the reader specified is NULL. */ AUD_AccumulatorReader(AUD_IReader* reader, bool additive); - /** - * Destroys the reader. - */ - virtual ~AUD_AccumulatorReader(); - virtual void read(int & length, sample_t* & buffer); }; diff --git a/intern/audaspace/FX/AUD_ButterworthFactory.cpp b/intern/audaspace/FX/AUD_ButterworthFactory.cpp index fd0a53def7c..1bb1d726a98 100644 --- a/intern/audaspace/FX/AUD_ButterworthFactory.cpp +++ b/intern/audaspace/FX/AUD_ButterworthFactory.cpp @@ -29,21 +29,11 @@ AUD_ButterworthFactory::AUD_ButterworthFactory(AUD_IFactory* factory, float frequency) : AUD_EffectFactory(factory), - m_frequency(frequency) {} - -AUD_ButterworthFactory::AUD_ButterworthFactory(float frequency) : - AUD_EffectFactory(0), - m_frequency(frequency) {} - -AUD_IReader* AUD_ButterworthFactory::createReader() + m_frequency(frequency) { - AUD_IReader* reader = getReader(); - - if(reader != 0) - { - reader = new AUD_ButterworthReader(reader, m_frequency); - AUD_NEW("reader") - } - - return reader; +} + +AUD_IReader* AUD_ButterworthFactory::createReader() const +{ + return new AUD_ButterworthReader(getReader(), m_frequency); } diff --git a/intern/audaspace/FX/AUD_ButterworthFactory.h b/intern/audaspace/FX/AUD_ButterworthFactory.h index 69169531d70..30b7a402c57 100644 --- a/intern/audaspace/FX/AUD_ButterworthFactory.h +++ b/intern/audaspace/FX/AUD_ButterworthFactory.h @@ -37,7 +37,11 @@ private: /** * The attack value in seconds. */ - float m_frequency; + const float m_frequency; + + // hide copy constructor and operator= + AUD_ButterworthFactory(const AUD_ButterworthFactory&); + AUD_ButterworthFactory& operator=(const AUD_ButterworthFactory&); public: /** @@ -47,13 +51,7 @@ public: */ AUD_ButterworthFactory(AUD_IFactory* factory, float frequency); - /** - * Creates a new butterworth factory. - * \param frequency The cutoff frequency. - */ - AUD_ButterworthFactory(float frequency); - - virtual AUD_IReader* createReader(); + virtual AUD_IReader* createReader() const; }; #endif //AUD_BUTTERWORTHFACTORY diff --git a/intern/audaspace/FX/AUD_ButterworthReader.cpp b/intern/audaspace/FX/AUD_ButterworthReader.cpp index 2129dfef798..cfe4205c7f8 100644 --- a/intern/audaspace/FX/AUD_ButterworthReader.cpp +++ b/intern/audaspace/FX/AUD_ButterworthReader.cpp @@ -24,7 +24,6 @@ */ #include "AUD_ButterworthReader.h" -#include "AUD_Buffer.h" #include #include @@ -39,20 +38,14 @@ AUD_ButterworthReader::AUD_ButterworthReader(AUD_IReader* reader, float frequency) : - AUD_EffectReader(reader) + AUD_EffectReader(reader), + m_outvalues(AUD_SAMPLE_SIZE(reader->getSpecs()) * 5), + m_invalues(AUD_SAMPLE_SIZE(reader->getSpecs()) * 5), + m_position(0) { AUD_Specs specs = reader->getSpecs(); - int samplesize = AUD_SAMPLE_SIZE(specs); - - m_buffer = new AUD_Buffer(); AUD_NEW("buffer") - - m_outvalues = new AUD_Buffer(samplesize * 5); AUD_NEW("buffer") - memset(m_outvalues->getBuffer(), 0, samplesize * 5); - - m_invalues = new AUD_Buffer(samplesize * 5); AUD_NEW("buffer") - memset(m_invalues->getBuffer(), 0, samplesize * 5); - - m_position = 0; + memset(m_outvalues.getBuffer(), 0, m_outvalues.getSize()); + memset(m_invalues.getBuffer(), 0, m_invalues.getSize()); // calculate coefficients float omega = 2 * tan(frequency * M_PI / specs.rate); @@ -74,31 +67,23 @@ AUD_ButterworthReader::AUD_ButterworthReader(AUD_IReader* reader, m_coeff[1][2] = 6 * o4 / norm; } -AUD_ButterworthReader::~AUD_ButterworthReader() -{ - delete m_buffer; AUD_DELETE("buffer") - - delete m_outvalues; AUD_DELETE("buffer") - delete m_invalues; AUD_DELETE("buffer"); -} - void AUD_ButterworthReader::read(int & length, sample_t* & buffer) { sample_t* buf; sample_t* outvalues; sample_t* invalues; - outvalues = m_outvalues->getBuffer(); - invalues = m_invalues->getBuffer(); + outvalues = m_outvalues.getBuffer(); + invalues = m_invalues.getBuffer(); AUD_Specs specs = m_reader->getSpecs(); m_reader->read(length, buf); - if(m_buffer->getSize() < length * AUD_SAMPLE_SIZE(specs)) - m_buffer->resize(length * AUD_SAMPLE_SIZE(specs)); + if(m_buffer.getSize() < length * AUD_SAMPLE_SIZE(specs)) + m_buffer.resize(length * AUD_SAMPLE_SIZE(specs)); - buffer = m_buffer->getBuffer(); + buffer = m_buffer.getBuffer(); int channels = specs.channels; for(int channel = 0; channel < channels; channel++) diff --git a/intern/audaspace/FX/AUD_ButterworthReader.h b/intern/audaspace/FX/AUD_ButterworthReader.h index b1cbd4e3820..52cbb642540 100644 --- a/intern/audaspace/FX/AUD_ButterworthReader.h +++ b/intern/audaspace/FX/AUD_ButterworthReader.h @@ -27,7 +27,7 @@ #define AUD_BUTTERWORTHREADER #include "AUD_EffectReader.h" -class AUD_Buffer; +#include "AUD_Buffer.h" /** * This class represents a butterworth filter. @@ -38,17 +38,17 @@ private: /** * The playback buffer. */ - AUD_Buffer *m_buffer; + AUD_Buffer m_buffer; /** * The last out values buffer. */ - AUD_Buffer *m_outvalues; + AUD_Buffer m_outvalues; /** * The last in values buffer. */ - AUD_Buffer *m_invalues; + AUD_Buffer m_invalues; /** * The position for buffer cycling. @@ -60,6 +60,10 @@ private: */ float m_coeff[2][5]; + // hide copy constructor and operator= + AUD_ButterworthReader(const AUD_ButterworthReader&); + AUD_ButterworthReader& operator=(const AUD_ButterworthReader&); + public: /** * Creates a new butterworth reader. @@ -68,15 +72,9 @@ public: * \param release The release value in seconds. * \param threshold The threshold value. * \param arthreshold The attack/release threshold value. - * \exception AUD_Exception Thrown if the reader specified is NULL. */ AUD_ButterworthReader(AUD_IReader* reader, float frequency); - /** - * Destroys the reader. - */ - virtual ~AUD_ButterworthReader(); - virtual void read(int & length, sample_t* & buffer); }; diff --git a/intern/audaspace/FX/AUD_DelayFactory.cpp b/intern/audaspace/FX/AUD_DelayFactory.cpp index 25ce4faed4c..f98743d6fb7 100644 --- a/intern/audaspace/FX/AUD_DelayFactory.cpp +++ b/intern/audaspace/FX/AUD_DelayFactory.cpp @@ -29,30 +29,16 @@ AUD_DelayFactory::AUD_DelayFactory(AUD_IFactory* factory, float delay) : AUD_EffectFactory(factory), - m_delay(delay) {} + m_delay(delay) +{ +} -AUD_DelayFactory::AUD_DelayFactory(float delay) : - AUD_EffectFactory(0), - m_delay(delay) {} - -float AUD_DelayFactory::getDelay() +float AUD_DelayFactory::getDelay() const { return m_delay; } -void AUD_DelayFactory::setDelay(float delay) +AUD_IReader* AUD_DelayFactory::createReader() const { - m_delay = delay; -} - -AUD_IReader* AUD_DelayFactory::createReader() -{ - AUD_IReader* reader = getReader(); - - if(reader != 0) - { - reader = new AUD_DelayReader(reader, m_delay); AUD_NEW("reader") - } - - return reader; + return new AUD_DelayReader(getReader(), m_delay); } diff --git a/intern/audaspace/FX/AUD_DelayFactory.h b/intern/audaspace/FX/AUD_DelayFactory.h index 5ad4b9ab996..721262fb73f 100644 --- a/intern/audaspace/FX/AUD_DelayFactory.h +++ b/intern/audaspace/FX/AUD_DelayFactory.h @@ -37,7 +37,11 @@ private: /** * The delay in samples. */ - float m_delay; + const float m_delay; + + // hide copy constructor and operator= + AUD_DelayFactory(const AUD_DelayFactory&); + AUD_DelayFactory& operator=(const AUD_DelayFactory&); public: /** @@ -45,26 +49,14 @@ public: * \param factory The input factory. * \param delay The desired delay in seconds. */ - AUD_DelayFactory(AUD_IFactory* factory = 0, float delay = 0); - - /** - * Creates a new delay factory. - * \param delay The desired delay in seconds. - */ - AUD_DelayFactory(float delay); + AUD_DelayFactory(AUD_IFactory* factory, float delay = 0); /** * Returns the delay in seconds. */ - float getDelay(); + float getDelay() const; - /** - * Sets the delay. - * \param delay The new delay value in seconds. - */ - void setDelay(float delay); - - virtual AUD_IReader* createReader(); + virtual AUD_IReader* createReader() const; }; #endif //AUD_DELAYFACTORY diff --git a/intern/audaspace/FX/AUD_DelayReader.cpp b/intern/audaspace/FX/AUD_DelayReader.cpp index f2521f645aa..e9f0c15b9b4 100644 --- a/intern/audaspace/FX/AUD_DelayReader.cpp +++ b/intern/audaspace/FX/AUD_DelayReader.cpp @@ -24,28 +24,19 @@ */ #include "AUD_DelayReader.h" -#include "AUD_Buffer.h" #include AUD_DelayReader::AUD_DelayReader(AUD_IReader* reader, float delay) : - AUD_EffectReader(reader) + AUD_EffectReader(reader), + m_delay(int(delay * reader->getSpecs().rate)), + m_remdelay(int(delay * reader->getSpecs().rate)), + m_empty(true) { - m_delay = (int)(delay * reader->getSpecs().rate); - m_remdelay = m_delay; - m_buffer = new AUD_Buffer(); AUD_NEW("buffer") -} - -AUD_DelayReader::~AUD_DelayReader() -{ - delete m_buffer; AUD_DELETE("buffer") } void AUD_DelayReader::seek(int position) { - if(position < 0) - return; - if(position < m_delay) { m_remdelay = m_delay - position; @@ -58,18 +49,18 @@ void AUD_DelayReader::seek(int position) } } -int AUD_DelayReader::getLength() +int AUD_DelayReader::getLength() const { int len = m_reader->getLength(); if(len < 0) return len; - return len+m_delay; + return len + m_delay; } -int AUD_DelayReader::getPosition() +int AUD_DelayReader::getPosition() const { if(m_remdelay > 0) - return m_delay-m_remdelay; + return m_delay - m_remdelay; return m_reader->getPosition() + m_delay; } @@ -80,26 +71,41 @@ void AUD_DelayReader::read(int & length, sample_t* & buffer) AUD_Specs specs = m_reader->getSpecs(); int samplesize = AUD_SAMPLE_SIZE(specs); - if(m_buffer->getSize() < length * samplesize) - m_buffer->resize(length * samplesize); + if(m_buffer.getSize() < length * samplesize) + { + m_buffer.resize(length * samplesize); + m_empty = false; + } + + buffer = m_buffer.getBuffer(); if(length > m_remdelay) { - memset(m_buffer->getBuffer(), 0, m_remdelay * samplesize); + if(!m_empty) + memset(buffer, 0, m_remdelay * samplesize); + int len = length - m_remdelay; - m_reader->read(len, buffer); - memcpy(m_buffer->getBuffer() + m_remdelay * specs.channels, - buffer, len * samplesize); + sample_t* buf; + m_reader->read(len, buf); + + memcpy(buffer + m_remdelay * specs.channels, + buf, len * samplesize); + if(len < length-m_remdelay) length = m_remdelay + len; + m_remdelay = 0; + m_empty = false; } else { - memset(m_buffer->getBuffer(), 0, length * samplesize); + if(!m_empty) + { + memset(buffer, 0, length * samplesize); + m_empty = true; + } m_remdelay -= length; } - buffer = m_buffer->getBuffer(); } else m_reader->read(length, buffer); diff --git a/intern/audaspace/FX/AUD_DelayReader.h b/intern/audaspace/FX/AUD_DelayReader.h index 4662b455dfc..121842b0c6b 100644 --- a/intern/audaspace/FX/AUD_DelayReader.h +++ b/intern/audaspace/FX/AUD_DelayReader.h @@ -27,7 +27,7 @@ #define AUD_DELAYREADER #include "AUD_EffectReader.h" -class AUD_Buffer; +#include "AUD_Buffer.h" /** * This class reads another reader and changes it's delay. @@ -38,35 +38,38 @@ private: /** * The playback buffer. */ - AUD_Buffer *m_buffer; + AUD_Buffer m_buffer; /** * The delay level. */ - int m_delay; + const int m_delay; /** * The remaining delay for playback. */ int m_remdelay; + /** + * Whether the buffer is currently filled with zeros. + */ + bool m_empty; + + // hide copy constructor and operator= + AUD_DelayReader(const AUD_DelayReader&); + AUD_DelayReader& operator=(const AUD_DelayReader&); + public: /** * Creates a new delay reader. * \param reader The reader to read from. * \param delay The delay in seconds. - * \exception AUD_Exception Thrown if the reader specified is NULL. */ AUD_DelayReader(AUD_IReader* reader, float delay); - /** - * Destroys the reader. - */ - virtual ~AUD_DelayReader(); - virtual void seek(int position); - virtual int getLength(); - virtual int getPosition(); + virtual int getLength() const; + virtual int getPosition() const; virtual void read(int & length, sample_t* & buffer); }; diff --git a/intern/audaspace/FX/AUD_DoubleFactory.cpp b/intern/audaspace/FX/AUD_DoubleFactory.cpp index 402d884be9f..9f625d0763f 100644 --- a/intern/audaspace/FX/AUD_DoubleFactory.cpp +++ b/intern/audaspace/FX/AUD_DoubleFactory.cpp @@ -27,29 +27,24 @@ #include "AUD_DoubleReader.h" AUD_DoubleFactory::AUD_DoubleFactory(AUD_IFactory* factory1, AUD_IFactory* factory2) : - m_factory1(factory1), m_factory2(factory2) {} + m_factory1(factory1), m_factory2(factory2) +{ +} -AUD_IReader* AUD_DoubleFactory::createReader() +AUD_IReader* AUD_DoubleFactory::createReader() const { AUD_IReader* reader1 = m_factory1->createReader(); - if(!reader1) - return 0; AUD_IReader* reader2; + try { reader2 = m_factory2->createReader(); - if(!reader2) - { - delete reader1; AUD_DELETE("reader") - return 0; - } } catch(AUD_Exception&) { - delete reader1; AUD_DELETE("reader") + delete reader1; throw; } - AUD_IReader* reader = new AUD_DoubleReader(reader1, reader2); - return reader; + return new AUD_DoubleReader(reader1, reader2); } diff --git a/intern/audaspace/FX/AUD_DoubleFactory.h b/intern/audaspace/FX/AUD_DoubleFactory.h index 03c7de19f06..f2e83b2e27a 100644 --- a/intern/audaspace/FX/AUD_DoubleFactory.h +++ b/intern/audaspace/FX/AUD_DoubleFactory.h @@ -45,6 +45,10 @@ private: */ AUD_IFactory* m_factory2; + // hide copy constructor and operator= + AUD_DoubleFactory(const AUD_DoubleFactory&); + AUD_DoubleFactory& operator=(const AUD_DoubleFactory&); + public: /** * Creates a new double factory. @@ -53,7 +57,7 @@ public: */ AUD_DoubleFactory(AUD_IFactory* factory1, AUD_IFactory* factory2); - virtual AUD_IReader* createReader(); + virtual AUD_IReader* createReader() const; }; #endif //AUD_DOUBLEFACTORY diff --git a/intern/audaspace/FX/AUD_DoubleReader.cpp b/intern/audaspace/FX/AUD_DoubleReader.cpp index 1e51a094427..6b39e01270f 100644 --- a/intern/audaspace/FX/AUD_DoubleReader.cpp +++ b/intern/audaspace/FX/AUD_DoubleReader.cpp @@ -24,80 +24,48 @@ */ #include "AUD_DoubleReader.h" -#include "AUD_Buffer.h" #include AUD_DoubleReader::AUD_DoubleReader(AUD_IReader* reader1, AUD_IReader* reader2) : - m_reader1(reader1), m_reader2(reader2) + m_reader1(reader1), m_reader2(reader2), m_finished1(false) { - try + AUD_Specs s1, s2; + s1 = reader1->getSpecs(); + s2 = reader2->getSpecs(); + if(memcmp(&s1, &s2, sizeof(AUD_Specs)) != 0) { - if(!reader1) - AUD_THROW(AUD_ERROR_READER); - - if(!reader2) - AUD_THROW(AUD_ERROR_READER); - - AUD_Specs s1, s2; - s1 = reader1->getSpecs(); - s2 = reader2->getSpecs(); - if(memcmp(&s1, &s2, sizeof(AUD_Specs)) != 0) - AUD_THROW(AUD_ERROR_READER); + delete reader1; + delete reader2; + AUD_THROW(AUD_ERROR_READER); } - - catch(AUD_Exception) - { - if(reader1) - { - delete reader1; AUD_DELETE("reader") - } - if(reader2) - { - delete reader2; AUD_DELETE("reader") - } - - throw; - } - - m_buffer = new AUD_Buffer(); AUD_NEW("buffer") - m_finished1 = false; } AUD_DoubleReader::~AUD_DoubleReader() { - delete m_reader1; AUD_DELETE("reader") - delete m_reader2; AUD_DELETE("reader") - delete m_buffer; AUD_DELETE("buffer") + delete m_reader1; + delete m_reader2; } -bool AUD_DoubleReader::isSeekable() +bool AUD_DoubleReader::isSeekable() const { - return false; + return m_reader1->isSeekable() && m_reader2->isSeekable(); } void AUD_DoubleReader::seek(int position) { - int length1 = m_reader1->getLength(); + m_reader1->seek(position); - if(position < 0) - position = 0; + int pos1 = m_reader1->getPosition(); - if(position < length1) - { - m_reader1->seek(position); - m_reader2->seek(0); - m_finished1 = false; - } + if((m_finished1 = (pos1 < position))) + m_reader2->seek(position - pos1); else - { - m_reader2->seek(position-length1); - m_finished1 = true; - } + m_reader2->seek(0); } -int AUD_DoubleReader::getLength() +int AUD_DoubleReader::getLength() const { int len1 = m_reader1->getLength(); int len2 = m_reader2->getLength(); @@ -106,49 +74,45 @@ int AUD_DoubleReader::getLength() return len1 + len2; } -int AUD_DoubleReader::getPosition() +int AUD_DoubleReader::getPosition() const { return m_reader1->getPosition() + m_reader2->getPosition(); } -AUD_Specs AUD_DoubleReader::getSpecs() +AUD_Specs AUD_DoubleReader::getSpecs() const { return m_reader1->getSpecs(); } -AUD_ReaderType AUD_DoubleReader::getType() -{ - if(m_reader1->getType() == AUD_TYPE_BUFFER && - m_reader2->getType() == AUD_TYPE_BUFFER) - return AUD_TYPE_BUFFER; - return AUD_TYPE_STREAM; -} - -bool AUD_DoubleReader::notify(AUD_Message &message) -{ - return m_reader1->notify(message) | m_reader2->notify(message); -} - void AUD_DoubleReader::read(int & length, sample_t* & buffer) { if(!m_finished1) { int len = length; m_reader1->read(len, buffer); + if(len < length) { AUD_Specs specs = m_reader1->getSpecs(); int samplesize = AUD_SAMPLE_SIZE(specs); - if(m_buffer->getSize() < length * samplesize) - m_buffer->resize(length * samplesize); - memcpy(m_buffer->getBuffer(), buffer, len * samplesize); + + if(m_buffer.getSize() < length * samplesize) + m_buffer.resize(length * samplesize); + + sample_t* buf = buffer; + buffer = m_buffer.getBuffer(); + + memcpy(buffer, buf, len * samplesize); + len = length - len; length -= len; - m_reader2->read(len, buffer); - memcpy(m_buffer->getBuffer() + length * specs.channels, buffer, + m_reader2->read(len, buf); + + memcpy(buffer + length * specs.channels, buf, len * samplesize); + length += len; - buffer = m_buffer->getBuffer(); + m_finished1 = true; } } diff --git a/intern/audaspace/FX/AUD_DoubleReader.h b/intern/audaspace/FX/AUD_DoubleReader.h index d82b81ec0ba..d80ba33dfe3 100644 --- a/intern/audaspace/FX/AUD_DoubleReader.h +++ b/intern/audaspace/FX/AUD_DoubleReader.h @@ -27,7 +27,7 @@ #define AUD_DOUBLEREADER #include "AUD_IReader.h" -class AUD_Buffer; +#include "AUD_Buffer.h" /** * This reader plays two readers with the same specs sequently. @@ -53,15 +53,18 @@ private: /** * The playback buffer for the intersecting part. */ - AUD_Buffer* m_buffer; + AUD_Buffer m_buffer; + + // hide copy constructor and operator= + AUD_DoubleReader(const AUD_DoubleReader&); + AUD_DoubleReader& operator=(const AUD_DoubleReader&); public: /** * Creates a new ping pong reader. * \param reader1 The first reader to read from. * \param reader2 The second reader to read from. - * \exception AUD_Exception Thrown if one of the reader specified is NULL - * or the specs from the readers differ. + * \exception AUD_Exception Thrown if the specs from the readers differ. */ AUD_DoubleReader(AUD_IReader* reader1, AUD_IReader* reader2); @@ -70,13 +73,11 @@ public: */ virtual ~AUD_DoubleReader(); - virtual bool isSeekable(); + virtual bool isSeekable() const; virtual void seek(int position); - virtual int getLength(); - virtual int getPosition(); - virtual AUD_Specs getSpecs(); - virtual AUD_ReaderType getType(); - virtual bool notify(AUD_Message &message); + virtual int getLength() const; + virtual int getPosition() const; + virtual AUD_Specs getSpecs() const; virtual void read(int & length, sample_t* & buffer); }; diff --git a/intern/audaspace/FX/AUD_EffectFactory.cpp b/intern/audaspace/FX/AUD_EffectFactory.cpp index 882499416b7..eda4e4e04b2 100644 --- a/intern/audaspace/FX/AUD_EffectFactory.cpp +++ b/intern/audaspace/FX/AUD_EffectFactory.cpp @@ -26,25 +26,16 @@ #include "AUD_EffectFactory.h" #include "AUD_IReader.h" -AUD_IReader* AUD_EffectFactory::getReader() -{ - if(m_factory != 0) - return m_factory->createReader(); - - return 0; -} - AUD_EffectFactory::AUD_EffectFactory(AUD_IFactory* factory) { m_factory = factory; } -void AUD_EffectFactory::setFactory(AUD_IFactory* factory) +AUD_EffectFactory::~AUD_EffectFactory() { - m_factory = factory; } -AUD_IFactory* AUD_EffectFactory::getFactory() +AUD_IFactory* AUD_EffectFactory::getFactory() const { return m_factory; } diff --git a/intern/audaspace/FX/AUD_EffectFactory.h b/intern/audaspace/FX/AUD_EffectFactory.h index 67259b9e6c3..fd3746d0da3 100644 --- a/intern/audaspace/FX/AUD_EffectFactory.h +++ b/intern/audaspace/FX/AUD_EffectFactory.h @@ -34,6 +34,11 @@ */ class AUD_EffectFactory : public AUD_IFactory { +private: + // hide copy constructor and operator= + AUD_EffectFactory(const AUD_EffectFactory&); + AUD_EffectFactory& operator=(const AUD_EffectFactory&); + protected: /** * If there is no reader it is created out of this factory. @@ -44,9 +49,12 @@ protected: * Returns the reader created out of the factory. * This method can be used for the createReader function of the implementing * classes. - * \return The reader created out of the factory or NULL if there is none. + * \return The reader created out of the factory. */ - AUD_IReader* getReader(); + inline AUD_IReader* getReader() const + { + return m_factory->createReader(); + } public: /** @@ -58,19 +66,13 @@ public: /** * Destroys the factory. */ - virtual ~AUD_EffectFactory() {} - - /** - * Sets the input factory. - * \param factory The input factory. - */ - void setFactory(AUD_IFactory* factory); + virtual ~AUD_EffectFactory(); /** * Returns the saved factory. * \return The factory or NULL if there has no factory been saved. */ - AUD_IFactory* getFactory(); + AUD_IFactory* getFactory() const; }; #endif //AUD_EFFECTFACTORY diff --git a/intern/audaspace/FX/AUD_EffectReader.cpp b/intern/audaspace/FX/AUD_EffectReader.cpp index 47026b88440..b54ca279088 100644 --- a/intern/audaspace/FX/AUD_EffectReader.cpp +++ b/intern/audaspace/FX/AUD_EffectReader.cpp @@ -27,17 +27,15 @@ AUD_EffectReader::AUD_EffectReader(AUD_IReader* reader) { - if(!reader) - AUD_THROW(AUD_ERROR_READER); m_reader = reader; } AUD_EffectReader::~AUD_EffectReader() { - delete m_reader; AUD_DELETE("reader") + delete m_reader; } -bool AUD_EffectReader::isSeekable() +bool AUD_EffectReader::isSeekable() const { return m_reader->isSeekable(); } @@ -47,31 +45,21 @@ void AUD_EffectReader::seek(int position) m_reader->seek(position); } -int AUD_EffectReader::getLength() +int AUD_EffectReader::getLength() const { return m_reader->getLength(); } -int AUD_EffectReader::getPosition() +int AUD_EffectReader::getPosition() const { return m_reader->getPosition(); } -AUD_Specs AUD_EffectReader::getSpecs() +AUD_Specs AUD_EffectReader::getSpecs() const { return m_reader->getSpecs(); } -AUD_ReaderType AUD_EffectReader::getType() -{ - return m_reader->getType(); -} - -bool AUD_EffectReader::notify(AUD_Message &message) -{ - return m_reader->notify(message); -} - void AUD_EffectReader::read(int & length, sample_t* & buffer) { m_reader->read(length, buffer); diff --git a/intern/audaspace/FX/AUD_EffectReader.h b/intern/audaspace/FX/AUD_EffectReader.h index f64bf34077d..c447f79bc6e 100644 --- a/intern/audaspace/FX/AUD_EffectReader.h +++ b/intern/audaspace/FX/AUD_EffectReader.h @@ -34,6 +34,11 @@ */ class AUD_EffectReader : public AUD_IReader { +private: + // hide copy constructor and operator= + AUD_EffectReader(const AUD_EffectReader&); + AUD_EffectReader& operator=(const AUD_EffectReader&); + protected: /** * The reader to read from. @@ -44,7 +49,6 @@ public: /** * Creates a new effect reader. * \param reader The reader to read from. - * \exception AUD_Exception Thrown if the reader specified is NULL. */ AUD_EffectReader(AUD_IReader* reader); @@ -53,13 +57,11 @@ public: */ virtual ~AUD_EffectReader(); - virtual bool isSeekable(); + virtual bool isSeekable() const; virtual void seek(int position); - virtual int getLength(); - virtual int getPosition(); - virtual AUD_Specs getSpecs(); - virtual AUD_ReaderType getType(); - virtual bool notify(AUD_Message &message); + virtual int getLength() const; + virtual int getPosition() const; + virtual AUD_Specs getSpecs() const; virtual void read(int & length, sample_t* & buffer); }; diff --git a/intern/audaspace/FX/AUD_EnvelopeFactory.cpp b/intern/audaspace/FX/AUD_EnvelopeFactory.cpp index c3b2c3f24fe..1c625067f1c 100644 --- a/intern/audaspace/FX/AUD_EnvelopeFactory.cpp +++ b/intern/audaspace/FX/AUD_EnvelopeFactory.cpp @@ -33,26 +33,12 @@ AUD_EnvelopeFactory::AUD_EnvelopeFactory(AUD_IFactory* factory, float attack, m_attack(attack), m_release(release), m_threshold(threshold), - m_arthreshold(arthreshold) {} - -AUD_EnvelopeFactory::AUD_EnvelopeFactory(float attack, float release, - float threshold, float arthreshold) : - AUD_EffectFactory(0), - m_attack(attack), - m_release(release), - m_threshold(threshold), - m_arthreshold(arthreshold) {} - -AUD_IReader* AUD_EnvelopeFactory::createReader() + m_arthreshold(arthreshold) { - AUD_IReader* reader = getReader(); - - if(reader != 0) - { - reader = new AUD_EnvelopeReader(reader, m_attack, m_release, - m_threshold, m_arthreshold); - AUD_NEW("reader") - } - - return reader; +} + +AUD_IReader* AUD_EnvelopeFactory::createReader() const +{ + return new AUD_EnvelopeReader(getReader(), m_attack, m_release, m_threshold, + m_arthreshold); } diff --git a/intern/audaspace/FX/AUD_EnvelopeFactory.h b/intern/audaspace/FX/AUD_EnvelopeFactory.h index c79e5472e30..c31c6727d03 100644 --- a/intern/audaspace/FX/AUD_EnvelopeFactory.h +++ b/intern/audaspace/FX/AUD_EnvelopeFactory.h @@ -37,22 +37,26 @@ private: /** * The attack value in seconds. */ - float m_attack; + const float m_attack; /** * The release value in seconds. */ - float m_release; + const float m_release; /** * The threshold value. */ - float m_threshold; + const float m_threshold; /** * The attack/release threshold value. */ - float m_arthreshold; + const float m_arthreshold; + + // hide copy constructor and operator= + AUD_EnvelopeFactory(const AUD_EnvelopeFactory&); + AUD_EnvelopeFactory& operator=(const AUD_EnvelopeFactory&); public: /** @@ -66,17 +70,7 @@ public: AUD_EnvelopeFactory(AUD_IFactory* factory, float attack, float release, float threshold, float arthreshold); - /** - * Creates a new envelope factory. - * \param attack The attack value in seconds. - * \param release The release value in seconds. - * \param threshold The threshold value. - * \param arthreshold The attack/release threshold value. - */ - AUD_EnvelopeFactory(float attack, float release, float threshold, - float arthreshold); - - virtual AUD_IReader* createReader(); + virtual AUD_IReader* createReader() const; }; #endif //AUD_ENVELOPEFACTORY diff --git a/intern/audaspace/FX/AUD_EnvelopeReader.cpp b/intern/audaspace/FX/AUD_EnvelopeReader.cpp index 71ccbfd6503..ef64b6fa4eb 100644 --- a/intern/audaspace/FX/AUD_EnvelopeReader.cpp +++ b/intern/audaspace/FX/AUD_EnvelopeReader.cpp @@ -24,7 +24,6 @@ */ #include "AUD_EnvelopeReader.h" -#include "AUD_Buffer.h" #include #include @@ -33,40 +32,27 @@ AUD_EnvelopeReader::AUD_EnvelopeReader(AUD_IReader* reader, float attack, float release, float threshold, float arthreshold) : AUD_EffectReader(reader), - m_threshold(threshold) + m_bAttack(pow(arthreshold, 1.0f/(reader->getSpecs().rate * attack))), + m_bRelease(pow(arthreshold, 1.0f/(reader->getSpecs().rate * release))), + m_threshold(threshold), + m_envelopes(AUD_SAMPLE_SIZE(reader->getSpecs())) { - AUD_Specs specs = reader->getSpecs(); - int samplesize = AUD_SAMPLE_SIZE(specs); - - m_buffer = new AUD_Buffer(); AUD_NEW("buffer") - - m_envelopes = new AUD_Buffer(samplesize); - AUD_NEW("buffer") - memset(m_envelopes->getBuffer(), 0, samplesize); - - m_bAttack = pow(arthreshold, 1.0f/(specs.rate * attack)); - m_bRelease = pow(arthreshold, 1.0f/(specs.rate * release)); -} - -AUD_EnvelopeReader::~AUD_EnvelopeReader() -{ - delete m_buffer; AUD_DELETE("buffer") - delete m_envelopes; AUD_DELETE("buffer") + memset(m_envelopes.getBuffer(), 0, m_envelopes.getSize()); } void AUD_EnvelopeReader::read(int & length, sample_t* & buffer) { sample_t* buf; sample_t* envelopes; - envelopes = m_envelopes->getBuffer(); + envelopes = m_envelopes.getBuffer(); AUD_Specs specs = m_reader->getSpecs(); m_reader->read(length, buf); - if(m_buffer->getSize() < length * AUD_SAMPLE_SIZE(specs)) - m_buffer->resize(length * AUD_SAMPLE_SIZE(specs)); + if(m_buffer.getSize() < length * AUD_SAMPLE_SIZE(specs)) + m_buffer.resize(length * AUD_SAMPLE_SIZE(specs)); - buffer = m_buffer->getBuffer(); + buffer = m_buffer.getBuffer(); sample_t value; diff --git a/intern/audaspace/FX/AUD_EnvelopeReader.h b/intern/audaspace/FX/AUD_EnvelopeReader.h index ff9dd23d34c..b452ee2119a 100644 --- a/intern/audaspace/FX/AUD_EnvelopeReader.h +++ b/intern/audaspace/FX/AUD_EnvelopeReader.h @@ -27,7 +27,7 @@ #define AUD_ENVELOPEREADER #include "AUD_EffectReader.h" -class AUD_Buffer; +#include "AUD_Buffer.h" /** * This class represents an envelope follower. @@ -35,30 +35,34 @@ class AUD_Buffer; class AUD_EnvelopeReader : public AUD_EffectReader { private: - /** - * The playback buffer. - */ - AUD_Buffer *m_buffer; - - /** - * The last envelopes buffer. - */ - AUD_Buffer *m_envelopes; - /** * Attack b value. */ - float m_bAttack; + const float m_bAttack; /** * Release b value. */ - float m_bRelease; + const float m_bRelease; /** * Threshold value. */ - float m_threshold; + const float m_threshold; + + /** + * The playback buffer. + */ + AUD_Buffer m_buffer; + + /** + * The last envelopes buffer. + */ + AUD_Buffer m_envelopes; + + // hide copy constructor and operator= + AUD_EnvelopeReader(const AUD_EnvelopeReader&); + AUD_EnvelopeReader& operator=(const AUD_EnvelopeReader&); public: /** @@ -68,16 +72,10 @@ public: * \param release The release value in seconds. * \param threshold The threshold value. * \param arthreshold The attack/release threshold value. - * \exception AUD_Exception Thrown if the reader specified is NULL. */ AUD_EnvelopeReader(AUD_IReader* reader, float attack, float release, float threshold, float arthreshold); - /** - * Destroys the reader. - */ - virtual ~AUD_EnvelopeReader(); - virtual void read(int & length, sample_t* & buffer); }; diff --git a/intern/audaspace/FX/AUD_FaderFactory.cpp b/intern/audaspace/FX/AUD_FaderFactory.cpp index 4357e11bd43..bbe9319c928 100644 --- a/intern/audaspace/FX/AUD_FaderFactory.cpp +++ b/intern/audaspace/FX/AUD_FaderFactory.cpp @@ -31,54 +31,26 @@ AUD_FaderFactory::AUD_FaderFactory(AUD_IFactory* factory, AUD_FadeType type, AUD_EffectFactory(factory), m_type(type), m_start(start), - m_length(length) {} + m_length(length) +{ +} -AUD_FaderFactory::AUD_FaderFactory(AUD_FadeType type, - float start, float length) : - AUD_EffectFactory(0), - m_type(type), - m_start(start), - m_length(length) {} - -AUD_FadeType AUD_FaderFactory::getType() +AUD_FadeType AUD_FaderFactory::getType() const { return m_type; } -void AUD_FaderFactory::setType(AUD_FadeType type) -{ - m_type = type; -} - -float AUD_FaderFactory::getStart() +float AUD_FaderFactory::getStart() const { return m_start; } -void AUD_FaderFactory::setStart(float start) -{ - m_start = start; -} - -float AUD_FaderFactory::getLength() +float AUD_FaderFactory::getLength() const { return m_length; } -void AUD_FaderFactory::setLength(float length) +AUD_IReader* AUD_FaderFactory::createReader() const { - m_length = length; -} - -AUD_IReader* AUD_FaderFactory::createReader() -{ - AUD_IReader* reader = getReader(); - - if(reader != 0) - { - reader = new AUD_FaderReader(reader, m_type, m_start, m_length); - AUD_NEW("reader") - } - - return reader; + return new AUD_FaderReader(getReader(), m_type, m_start, m_length); } diff --git a/intern/audaspace/FX/AUD_FaderFactory.h b/intern/audaspace/FX/AUD_FaderFactory.h index 4999ccac8f1..af5d18538ea 100644 --- a/intern/audaspace/FX/AUD_FaderFactory.h +++ b/intern/audaspace/FX/AUD_FaderFactory.h @@ -39,17 +39,21 @@ private: /** * The fading type. */ - AUD_FadeType m_type; + const AUD_FadeType m_type; /** * The fading start. */ - float m_start; + const float m_start; /** * The fading length. */ - float m_length; + const float m_length; + + // hide copy constructor and operator= + AUD_FaderFactory(const AUD_FaderFactory&); + AUD_FaderFactory& operator=(const AUD_FaderFactory&); public: /** @@ -59,53 +63,26 @@ public: * \param start The time where fading should start in seconds. * \param length How long fading should last in seconds. */ - AUD_FaderFactory(AUD_IFactory* factory = 0, + AUD_FaderFactory(AUD_IFactory* factory, AUD_FadeType type = AUD_FADE_IN, float start = 0.0f, float length = 1.0f); - /** - * Creates a new fader factory. - * \param type The fading type. - * \param start The time where fading should start in seconds. - * \param length How long fading should last in seconds. - */ - AUD_FaderFactory(AUD_FadeType type = AUD_FADE_IN, - float start = 0.0f, float length = 1.0f); - /** * Returns the fading type. */ - AUD_FadeType getType(); - - /** - * Sets the fading type. - * \param type The new fading type: AUD_FADE_IN or AUD_FADE_OUT. - */ - void setType(AUD_FadeType type); + AUD_FadeType getType() const; /** * Returns the fading start. */ - float getStart(); - - /** - * Sets the fading start. - * \param start The new fading start. - */ - void setStart(float start); + float getStart() const; /** * Returns the fading length. */ - float getLength(); + float getLength() const; - /** - * Sets the fading length. - * \param start The new fading length. - */ - void setLength(float length); - - virtual AUD_IReader* createReader(); + virtual AUD_IReader* createReader() const; }; #endif //AUD_FADERFACTORY diff --git a/intern/audaspace/FX/AUD_FaderReader.cpp b/intern/audaspace/FX/AUD_FaderReader.cpp index 4e919fff323..2292fa06102 100644 --- a/intern/audaspace/FX/AUD_FaderReader.cpp +++ b/intern/audaspace/FX/AUD_FaderReader.cpp @@ -24,7 +24,6 @@ */ #include "AUD_FaderReader.h" -#include "AUD_Buffer.h" #include @@ -33,19 +32,9 @@ AUD_FaderReader::AUD_FaderReader(AUD_IReader* reader, AUD_FadeType type, AUD_EffectReader(reader), m_type(type), m_start(start), - m_length(length) + m_length(length), + m_empty(true) { - m_buffer = new AUD_Buffer(); AUD_NEW("buffer") -} - -AUD_FaderReader::~AUD_FaderReader() -{ - delete m_buffer; AUD_DELETE("buffer") -} - -bool AUD_FaderReader::notify(AUD_Message &message) -{ - return m_reader->notify(message); } void AUD_FaderReader::read(int & length, sample_t* & buffer) @@ -56,28 +45,50 @@ void AUD_FaderReader::read(int & length, sample_t* & buffer) m_reader->read(length, buffer); - if(m_buffer->getSize() < length * samplesize) - m_buffer->resize(length * samplesize); - if((position + length) / (float)specs.rate <= m_start) { if(m_type != AUD_FADE_OUT) { - buffer = m_buffer->getBuffer(); - memset(buffer, 0, length * samplesize); + if(m_buffer.getSize() < length * samplesize) + { + m_buffer.resize(length * samplesize); + m_empty = false; + } + + buffer = m_buffer.getBuffer(); + + if(!m_empty) + { + memset(buffer, 0, length * samplesize); + m_empty = true; + } } } else if(position / (float)specs.rate >= m_start+m_length) { if(m_type == AUD_FADE_OUT) { - buffer = m_buffer->getBuffer(); - memset(buffer, 0, length * samplesize); + if(m_buffer.getSize() < length * samplesize) + { + m_buffer.resize(length * samplesize); + m_empty = false; + } + + buffer = m_buffer.getBuffer(); + + if(!m_empty) + { + memset(buffer, 0, length * samplesize); + m_empty = true; + } } } else { - sample_t* buf = m_buffer->getBuffer(); + if(m_buffer.getSize() < length * samplesize) + m_buffer.resize(length * samplesize); + + sample_t* buf = m_buffer.getBuffer(); float volume = 1.0f; for(int i = 0; i < length * specs.channels; i++) @@ -98,5 +109,6 @@ void AUD_FaderReader::read(int & length, sample_t* & buffer) } buffer = buf; + m_empty = false; } } diff --git a/intern/audaspace/FX/AUD_FaderReader.h b/intern/audaspace/FX/AUD_FaderReader.h index a75ac6e7a47..d9d685af956 100644 --- a/intern/audaspace/FX/AUD_FaderReader.h +++ b/intern/audaspace/FX/AUD_FaderReader.h @@ -27,7 +27,7 @@ #define AUD_FADERREADER #include "AUD_EffectReader.h" -class AUD_Buffer; +#include "AUD_Buffer.h" /** * This class fades another reader. @@ -37,25 +37,34 @@ class AUD_Buffer; class AUD_FaderReader : public AUD_EffectReader { private: - /** - * The playback buffer. - */ - AUD_Buffer *m_buffer; - /** * The fading type. */ - AUD_FadeType m_type; + const AUD_FadeType m_type; /** * The fading start. */ - float m_start; + const float m_start; /** * The fading length. */ - float m_length; + const float m_length; + + /** + * The playback buffer. + */ + AUD_Buffer m_buffer; + + /** + * Whether the buffer is empty. + */ + bool m_empty; + + // hide copy constructor and operator= + AUD_FaderReader(const AUD_FaderReader&); + AUD_FaderReader& operator=(const AUD_FaderReader&); public: /** @@ -63,17 +72,10 @@ public: * \param type The fading type. * \param start The time where fading should start in seconds. * \param length How long fading should last in seconds. - * \exception AUD_Exception Thrown if the reader specified is NULL. */ AUD_FaderReader(AUD_IReader* reader, AUD_FadeType type, float start,float length); - /** - * Destroys the reader. - */ - virtual ~AUD_FaderReader(); - - virtual bool notify(AUD_Message &message); virtual void read(int & length, sample_t* & buffer); }; diff --git a/intern/audaspace/FX/AUD_HighpassFactory.cpp b/intern/audaspace/FX/AUD_HighpassFactory.cpp index 384d36beab7..1ab5237c8ff 100644 --- a/intern/audaspace/FX/AUD_HighpassFactory.cpp +++ b/intern/audaspace/FX/AUD_HighpassFactory.cpp @@ -30,22 +30,11 @@ AUD_HighpassFactory::AUD_HighpassFactory(AUD_IFactory* factory, float frequency, float Q) : AUD_EffectFactory(factory), m_frequency(frequency), - m_Q(Q) {} - -AUD_HighpassFactory::AUD_HighpassFactory(float frequency, float Q) : - AUD_EffectFactory(0), - m_frequency(frequency), - m_Q(Q) {} - -AUD_IReader* AUD_HighpassFactory::createReader() + m_Q(Q) { - AUD_IReader* reader = getReader(); - - if(reader != 0) - { - reader = new AUD_HighpassReader(reader, m_frequency, m_Q); - AUD_NEW("reader") - } - - return reader; +} + +AUD_IReader* AUD_HighpassFactory::createReader() const +{ + return new AUD_HighpassReader(getReader(), m_frequency, m_Q); } diff --git a/intern/audaspace/FX/AUD_HighpassFactory.h b/intern/audaspace/FX/AUD_HighpassFactory.h index 5e31053ed6c..1220157a776 100644 --- a/intern/audaspace/FX/AUD_HighpassFactory.h +++ b/intern/audaspace/FX/AUD_HighpassFactory.h @@ -37,12 +37,16 @@ private: /** * The attack value in seconds. */ - float m_frequency; + const float m_frequency; /** * The Q factor. */ - float m_Q; + const float m_Q; + + // hide copy constructor and operator= + AUD_HighpassFactory(const AUD_HighpassFactory&); + AUD_HighpassFactory& operator=(const AUD_HighpassFactory&); public: /** @@ -53,14 +57,7 @@ public: */ AUD_HighpassFactory(AUD_IFactory* factory, float frequency, float Q = 1.0f); - /** - * Creates a new highpass factory. - * \param frequency The cutoff frequency. - * \param Q The Q factor. - */ - AUD_HighpassFactory(float frequency, float Q = 1.0f); - - virtual AUD_IReader* createReader(); + virtual AUD_IReader* createReader() const; }; #endif //AUD_HIGHPASSFACTORY diff --git a/intern/audaspace/FX/AUD_HighpassReader.cpp b/intern/audaspace/FX/AUD_HighpassReader.cpp index 36b1bb8082e..904d6a95867 100644 --- a/intern/audaspace/FX/AUD_HighpassReader.cpp +++ b/intern/audaspace/FX/AUD_HighpassReader.cpp @@ -24,7 +24,6 @@ */ #include "AUD_HighpassReader.h" -#include "AUD_Buffer.h" #include #include @@ -37,22 +36,15 @@ AUD_HighpassReader::AUD_HighpassReader(AUD_IReader* reader, float frequency, float Q) : - AUD_EffectReader(reader) + AUD_EffectReader(reader), + m_outvalues(AUD_SAMPLE_SIZE(reader->getSpecs()) * AUD_HIGHPASS_ORDER), + m_invalues(AUD_SAMPLE_SIZE(reader->getSpecs()) * AUD_HIGHPASS_ORDER), + m_position(0) { + memset(m_outvalues.getBuffer(), 0, m_outvalues.getSize()); + memset(m_invalues.getBuffer(), 0, m_invalues.getSize()); + AUD_Specs specs = reader->getSpecs(); - int samplesize = AUD_SAMPLE_SIZE(specs); - - m_buffer = new AUD_Buffer(); AUD_NEW("buffer") - - m_outvalues = new AUD_Buffer(samplesize * AUD_HIGHPASS_ORDER); - AUD_NEW("buffer") - memset(m_outvalues->getBuffer(), 0, samplesize * AUD_HIGHPASS_ORDER); - - m_invalues = new AUD_Buffer(samplesize * AUD_HIGHPASS_ORDER); - AUD_NEW("buffer") - memset(m_invalues->getBuffer(), 0, samplesize * AUD_HIGHPASS_ORDER); - - m_position = 0; // calculate coefficients float w0 = 2 * M_PI * frequency / specs.rate; @@ -65,31 +57,23 @@ AUD_HighpassReader::AUD_HighpassReader(AUD_IReader* reader, float frequency, m_coeff[1][1] = (-1 - cos(w0)) / norm; } -AUD_HighpassReader::~AUD_HighpassReader() -{ - delete m_buffer; AUD_DELETE("buffer") - - delete m_outvalues; AUD_DELETE("buffer") - delete m_invalues; AUD_DELETE("buffer"); -} - void AUD_HighpassReader::read(int & length, sample_t* & buffer) { sample_t* buf; sample_t* outvalues; sample_t* invalues; - outvalues = m_outvalues->getBuffer(); - invalues = m_invalues->getBuffer(); + outvalues = m_outvalues.getBuffer(); + invalues = m_invalues.getBuffer(); AUD_Specs specs = m_reader->getSpecs(); m_reader->read(length, buf); - if(m_buffer->getSize() < length * AUD_SAMPLE_SIZE(specs)) - m_buffer->resize(length * AUD_SAMPLE_SIZE(specs)); + if(m_buffer.getSize() < length * AUD_SAMPLE_SIZE(specs)) + m_buffer.resize(length * AUD_SAMPLE_SIZE(specs)); - buffer = m_buffer->getBuffer(); + buffer = m_buffer.getBuffer(); int channels = specs.channels; for(int channel = 0; channel < channels; channel++) diff --git a/intern/audaspace/FX/AUD_HighpassReader.h b/intern/audaspace/FX/AUD_HighpassReader.h index dc28a62e45b..845e764ac9f 100644 --- a/intern/audaspace/FX/AUD_HighpassReader.h +++ b/intern/audaspace/FX/AUD_HighpassReader.h @@ -27,7 +27,7 @@ #define AUD_HIGHPASSREADER #include "AUD_EffectReader.h" -class AUD_Buffer; +#include "AUD_Buffer.h" #define AUD_HIGHPASS_ORDER 3 @@ -40,17 +40,17 @@ private: /** * The playback buffer. */ - AUD_Buffer *m_buffer; + AUD_Buffer m_buffer; /** * The last out values buffer. */ - AUD_Buffer *m_outvalues; + AUD_Buffer m_outvalues; /** * The last in values buffer. */ - AUD_Buffer *m_invalues; + AUD_Buffer m_invalues; /** * The position for buffer cycling. @@ -62,21 +62,19 @@ private: */ float m_coeff[2][AUD_HIGHPASS_ORDER]; + // hide copy constructor and operator= + AUD_HighpassReader(const AUD_HighpassReader&); + AUD_HighpassReader& operator=(const AUD_HighpassReader&); + public: /** * Creates a new highpass reader. * \param reader The reader to read from. * \param frequency The cutoff frequency. * \param Q The Q factor. - * \exception AUD_Exception Thrown if the reader specified is NULL. */ AUD_HighpassReader(AUD_IReader* reader, float frequency, float Q); - /** - * Destroys the reader. - */ - virtual ~AUD_HighpassReader(); - virtual void read(int & length, sample_t* & buffer); }; diff --git a/intern/audaspace/FX/AUD_LimiterFactory.cpp b/intern/audaspace/FX/AUD_LimiterFactory.cpp index 6f19575240a..75501afcec3 100644 --- a/intern/audaspace/FX/AUD_LimiterFactory.cpp +++ b/intern/audaspace/FX/AUD_LimiterFactory.cpp @@ -31,37 +31,21 @@ AUD_LimiterFactory::AUD_LimiterFactory(AUD_IFactory* factory, float start, float end) : AUD_EffectFactory(factory), m_start(start), - m_end(end) {} + m_end(end) +{ +} -float AUD_LimiterFactory::getStart() +float AUD_LimiterFactory::getStart() const { return m_start; } -void AUD_LimiterFactory::setStart(float start) -{ - m_start = start; -} - -float AUD_LimiterFactory::getEnd() +float AUD_LimiterFactory::getEnd() const { return m_end; } -void AUD_LimiterFactory::setEnd(float end) +AUD_IReader* AUD_LimiterFactory::createReader() const { - m_end = end; -} - -AUD_IReader* AUD_LimiterFactory::createReader() -{ - AUD_IReader* reader = getReader(); - - if(reader != 0) - { - reader = new AUD_LimiterReader(reader, m_start, m_end); - AUD_NEW("reader") - } - - return reader; + return new AUD_LimiterReader(getReader(), m_start, m_end); } diff --git a/intern/audaspace/FX/AUD_LimiterFactory.h b/intern/audaspace/FX/AUD_LimiterFactory.h index 588fea6eb4b..5d9491f60aa 100644 --- a/intern/audaspace/FX/AUD_LimiterFactory.h +++ b/intern/audaspace/FX/AUD_LimiterFactory.h @@ -37,12 +37,16 @@ private: /** * The start time. */ - float m_start; + const float m_start; /** * The end time. */ - float m_end; + const float m_end; + + // hide copy constructor and operator= + AUD_LimiterFactory(const AUD_LimiterFactory&); + AUD_LimiterFactory& operator=(const AUD_LimiterFactory&); public: /** @@ -52,33 +56,20 @@ public: * \param end The desired end time, a negative value signals that it should * play to the end. */ - AUD_LimiterFactory(AUD_IFactory* factory = 0, + AUD_LimiterFactory(AUD_IFactory* factory, float start = 0, float end = -1); /** * Returns the start time. */ - float getStart(); - - /** - * Sets the start time. - * \param start The new start time. - */ - void setStart(float start); + float getStart() const; /** * Returns the end time. */ - float getEnd(); + float getEnd() const; - /** - * Sets the end time. - * \param end The new end time, a negative value signals that it should play - * to the end. - */ - void setEnd(float end); - - virtual AUD_IReader* createReader(); + virtual AUD_IReader* createReader() const; }; #endif //AUD_LIMITERFACTORY diff --git a/intern/audaspace/FX/AUD_LimiterReader.cpp b/intern/audaspace/FX/AUD_LimiterReader.cpp index 05882369001..dd7301213c9 100644 --- a/intern/audaspace/FX/AUD_LimiterReader.cpp +++ b/intern/audaspace/FX/AUD_LimiterReader.cpp @@ -30,31 +30,27 @@ AUD_LimiterReader::AUD_LimiterReader(AUD_IReader* reader, float start, float end) : - AUD_EffectReader(reader) + AUD_EffectReader(reader), + m_start(int(start * reader->getSpecs().rate)), + m_end(int(end * reader->getSpecs().rate)) { - m_end = (int)(end * reader->getSpecs().rate); - - if(start <= 0) - m_start = 0; - else + if(m_start > 0) { - m_start = (int)(start * reader->getSpecs().rate); if(m_reader->isSeekable()) m_reader->seek(m_start); else { // skip first m_start samples by reading them - int length; + int length = AUD_DEFAULT_BUFFER_SIZE; sample_t* buffer; - for(int i = m_start; - i >= AUD_DEFAULT_BUFFER_SIZE; - i -= AUD_DEFAULT_BUFFER_SIZE) + for(int len = m_start; + length == AUD_DEFAULT_BUFFER_SIZE; + len -= AUD_DEFAULT_BUFFER_SIZE) { - length = AUD_DEFAULT_BUFFER_SIZE; + if(len < AUD_DEFAULT_BUFFER_SIZE) + length = len; m_reader->read(length, buffer); - length = i; } - m_reader->read(length, buffer); } } } @@ -64,18 +60,18 @@ void AUD_LimiterReader::seek(int position) m_reader->seek(position + m_start); } -int AUD_LimiterReader::getLength() +int AUD_LimiterReader::getLength() const { int len = m_reader->getLength(); - if(m_reader->getType() != AUD_TYPE_BUFFER || len < 0 || - (len > m_end && m_end >= 0)) + if(len < 0 || (len > m_end && m_end >= 0)) len = m_end; return len - m_start; } -int AUD_LimiterReader::getPosition() +int AUD_LimiterReader::getPosition() const { - return m_reader->getPosition() - m_start; + int pos = m_reader->getPosition(); + return AUD_MIN(pos, m_end) - m_start; } void AUD_LimiterReader::read(int & length, sample_t* & buffer) @@ -83,7 +79,7 @@ void AUD_LimiterReader::read(int & length, sample_t* & buffer) if(m_end >= 0) { int position = m_reader->getPosition(); - if(position+length > m_end) + if(position + length > m_end) length = m_end - position; if(length < 0) { diff --git a/intern/audaspace/FX/AUD_LimiterReader.h b/intern/audaspace/FX/AUD_LimiterReader.h index 9921f5ee1b0..59d6096dcba 100644 --- a/intern/audaspace/FX/AUD_LimiterReader.h +++ b/intern/audaspace/FX/AUD_LimiterReader.h @@ -37,12 +37,16 @@ private: /** * The start sample: inclusive. */ - int m_start; + const int m_start; /** * The end sample: exlusive. */ - int m_end; + const int m_end; + + // hide copy constructor and operator= + AUD_LimiterReader(const AUD_LimiterReader&); + AUD_LimiterReader& operator=(const AUD_LimiterReader&); public: /** @@ -51,13 +55,12 @@ public: * \param start The desired start sample (inclusive). * \param end The desired end sample (exklusive), a negative value signals * that it should play to the end. - * \exception AUD_Exception Thrown if the reader specified is NULL. */ AUD_LimiterReader(AUD_IReader* reader, float start = 0, float end = -1); virtual void seek(int position); - virtual int getLength(); - virtual int getPosition(); + virtual int getLength() const; + virtual int getPosition() const; virtual void read(int & length, sample_t* & buffer); }; diff --git a/intern/audaspace/FX/AUD_LoopFactory.cpp b/intern/audaspace/FX/AUD_LoopFactory.cpp index 90186f623ff..6805a8e4b42 100644 --- a/intern/audaspace/FX/AUD_LoopFactory.cpp +++ b/intern/audaspace/FX/AUD_LoopFactory.cpp @@ -28,30 +28,16 @@ AUD_LoopFactory::AUD_LoopFactory(AUD_IFactory* factory, int loop) : AUD_EffectFactory(factory), - m_loop(loop) {} + m_loop(loop) +{ +} -AUD_LoopFactory::AUD_LoopFactory(int loop) : - AUD_EffectFactory(0), - m_loop(loop) {} - -int AUD_LoopFactory::getLoop() +int AUD_LoopFactory::getLoop() const { return m_loop; } -void AUD_LoopFactory::setLoop(int loop) +AUD_IReader* AUD_LoopFactory::createReader() const { - m_loop = loop; -} - -AUD_IReader* AUD_LoopFactory::createReader() -{ - AUD_IReader* reader = getReader(); - - if(reader != 0) - { - reader = new AUD_LoopReader(reader, m_loop); AUD_NEW("reader") - } - - return reader; + return new AUD_LoopReader(getReader(), m_loop); } diff --git a/intern/audaspace/FX/AUD_LoopFactory.h b/intern/audaspace/FX/AUD_LoopFactory.h index c81d906b82e..f9e358af52d 100644 --- a/intern/audaspace/FX/AUD_LoopFactory.h +++ b/intern/audaspace/FX/AUD_LoopFactory.h @@ -38,7 +38,11 @@ private: /** * The loop count. */ - int m_loop; + const int m_loop; + + // hide copy constructor and operator= + AUD_LoopFactory(const AUD_LoopFactory&); + AUD_LoopFactory& operator=(const AUD_LoopFactory&); public: /** @@ -47,28 +51,14 @@ public: * \param loop The desired loop count, negative values result in endless * looping. */ - AUD_LoopFactory(AUD_IFactory* factory = 0, int loop = -1); - - /** - * Creates a new loop factory. - * \param loop The desired loop count, negative values result in endless - * looping. - */ - AUD_LoopFactory(int loop); + AUD_LoopFactory(AUD_IFactory* factory, int loop = -1); /** * Returns the loop count. */ - int getLoop(); + int getLoop() const; - /** - * Sets the loop count. - * \param loop The desired loop count, negative values result in endless - * looping. - */ - void setLoop(int loop); - - virtual AUD_IReader* createReader(); + virtual AUD_IReader* createReader() const; }; #endif //AUD_LOOPFACTORY diff --git a/intern/audaspace/FX/AUD_LoopReader.cpp b/intern/audaspace/FX/AUD_LoopReader.cpp index 3bcd8c2f9d3..7521f914a5c 100644 --- a/intern/audaspace/FX/AUD_LoopReader.cpp +++ b/intern/audaspace/FX/AUD_LoopReader.cpp @@ -29,36 +29,37 @@ #include AUD_LoopReader::AUD_LoopReader(AUD_IReader* reader, int loop) : - AUD_EffectReader(reader), m_loop(loop) + AUD_EffectReader(reader), m_count(loop), m_left(loop) { - m_samples = -1; - m_buffer = new AUD_Buffer(); AUD_NEW("buffer") } -AUD_LoopReader::~AUD_LoopReader() +void AUD_LoopReader::seek(int position) { - delete m_buffer; AUD_DELETE("buffer") -} - -AUD_ReaderType AUD_LoopReader::getType() -{ - if(m_loop < 0) - return AUD_TYPE_STREAM; - return m_reader->getType(); -} - -bool AUD_LoopReader::notify(AUD_Message &message) -{ - if(message.type == AUD_MSG_LOOP) + int len = m_reader->getLength(); + if(len < 0) + m_reader->seek(position); + else { - m_loop = message.loopcount; - m_samples = message.time * m_reader->getSpecs().rate; - - m_reader->notify(message); - - return true; + if(m_count >= 0) + { + m_left = m_count - (position / len); + if(m_left < 0) + m_left = 0; + } + m_reader->seek(position % len); } - return m_reader->notify(message); +} + +int AUD_LoopReader::getLength() const +{ + if(m_count < 0) + return -1; + return m_reader->getLength() * m_count; +} + +int AUD_LoopReader::getPosition() const +{ + return m_reader->getPosition() * (m_count < 0 ? 1 : m_count); } void AUD_LoopReader::read(int & length, sample_t* & buffer) @@ -66,50 +67,44 @@ void AUD_LoopReader::read(int & length, sample_t* & buffer) AUD_Specs specs = m_reader->getSpecs(); int samplesize = AUD_SAMPLE_SIZE(specs); - if(m_samples >= 0) - { - if(length > m_samples) - length = m_samples; - m_samples -= length; - } - int len = length; m_reader->read(len, buffer); - if(len < length && m_loop != 0) + if(len < length && m_left) { int pos = 0; - if(m_buffer->getSize() < length * samplesize) - m_buffer->resize(length * samplesize); + if(m_buffer.getSize() < length * samplesize) + m_buffer.resize(length * samplesize); - memcpy(m_buffer->getBuffer() + pos * specs.channels, - buffer, len * samplesize); + sample_t* buf = m_buffer.getBuffer(); + + memcpy(buf + pos * specs.channels, buffer, len * samplesize); pos += len; - while(pos < length && m_loop != 0) + while(pos < length && m_left) { - if(m_loop > 0) - m_loop--; + if(m_left > 0) + m_left--; m_reader->seek(0); len = length - pos; m_reader->read(len, buffer); + // prevent endless loop if(!len) break; - memcpy(m_buffer->getBuffer() + pos * specs.channels, - buffer, len * samplesize); + memcpy(buf + pos * specs.channels, buffer, len * samplesize); pos += len; } length = pos; - buffer = m_buffer->getBuffer(); + buffer = buf; } else length = len; diff --git a/intern/audaspace/FX/AUD_LoopReader.h b/intern/audaspace/FX/AUD_LoopReader.h index e61a49cb0db..e0ed4cb6bf3 100644 --- a/intern/audaspace/FX/AUD_LoopReader.h +++ b/intern/audaspace/FX/AUD_LoopReader.h @@ -27,7 +27,7 @@ #define AUD_LOOPREADER #include "AUD_EffectReader.h" -class AUD_Buffer; +#include "AUD_Buffer.h" /** * This class reads another reader and loops it. @@ -39,17 +39,21 @@ private: /** * The playback buffer. */ - AUD_Buffer *m_buffer; + AUD_Buffer m_buffer; + + /** + * The loop count. + */ + const int m_count; /** * The left loop count. */ - int m_loop; + int m_left; - /** - * The left samples. - */ - int m_samples; + // hide copy constructor and operator= + AUD_LoopReader(const AUD_LoopReader&); + AUD_LoopReader& operator=(const AUD_LoopReader&); public: /** @@ -57,17 +61,12 @@ public: * \param reader The reader to read from. * \param loop The desired loop count, negative values result in endless * looping. - * \exception AUD_Exception Thrown if the reader specified is NULL. */ AUD_LoopReader(AUD_IReader* reader, int loop); - /** - * Destroys the reader. - */ - virtual ~AUD_LoopReader(); - - virtual AUD_ReaderType getType(); - virtual bool notify(AUD_Message &message); + virtual void seek(int position); + virtual int getLength() const; + virtual int getPosition() const; virtual void read(int & length, sample_t* & buffer); }; diff --git a/intern/audaspace/FX/AUD_LowpassFactory.cpp b/intern/audaspace/FX/AUD_LowpassFactory.cpp index 05dc5ff3994..dfef0f6f7c3 100644 --- a/intern/audaspace/FX/AUD_LowpassFactory.cpp +++ b/intern/audaspace/FX/AUD_LowpassFactory.cpp @@ -30,22 +30,11 @@ AUD_LowpassFactory::AUD_LowpassFactory(AUD_IFactory* factory, float frequency, float Q) : AUD_EffectFactory(factory), m_frequency(frequency), - m_Q(Q) {} - -AUD_LowpassFactory::AUD_LowpassFactory(float frequency, float Q) : - AUD_EffectFactory(0), - m_frequency(frequency), - m_Q(Q) {} - -AUD_IReader* AUD_LowpassFactory::createReader() + m_Q(Q) { - AUD_IReader* reader = getReader(); - - if(reader != 0) - { - reader = new AUD_LowpassReader(reader, m_frequency, m_Q); - AUD_NEW("reader") - } - - return reader; +} + +AUD_IReader* AUD_LowpassFactory::createReader() const +{ + return new AUD_LowpassReader(getReader(), m_frequency, m_Q); } diff --git a/intern/audaspace/FX/AUD_LowpassFactory.h b/intern/audaspace/FX/AUD_LowpassFactory.h index 8a419823de0..61b76510a9e 100644 --- a/intern/audaspace/FX/AUD_LowpassFactory.h +++ b/intern/audaspace/FX/AUD_LowpassFactory.h @@ -37,12 +37,16 @@ private: /** * The attack value in seconds. */ - float m_frequency; + const float m_frequency; /** * The Q factor. */ - float m_Q; + const float m_Q; + + // hide copy constructor and operator= + AUD_LowpassFactory(const AUD_LowpassFactory&); + AUD_LowpassFactory& operator=(const AUD_LowpassFactory&); public: /** @@ -53,14 +57,7 @@ public: */ AUD_LowpassFactory(AUD_IFactory* factory, float frequency, float Q = 1.0f); - /** - * Creates a new lowpass factory. - * \param frequency The cutoff frequency. - * \param Q The Q factor. - */ - AUD_LowpassFactory(float frequency, float Q = 1.0f); - - virtual AUD_IReader* createReader(); + virtual AUD_IReader* createReader() const; }; #endif //AUD_LOWPASSFACTORY diff --git a/intern/audaspace/FX/AUD_LowpassReader.cpp b/intern/audaspace/FX/AUD_LowpassReader.cpp index 6dc0bf66a96..71b5de1234d 100644 --- a/intern/audaspace/FX/AUD_LowpassReader.cpp +++ b/intern/audaspace/FX/AUD_LowpassReader.cpp @@ -24,7 +24,6 @@ */ #include "AUD_LowpassReader.h" -#include "AUD_Buffer.h" #include #include @@ -37,22 +36,15 @@ AUD_LowpassReader::AUD_LowpassReader(AUD_IReader* reader, float frequency, float Q) : - AUD_EffectReader(reader) + AUD_EffectReader(reader), + m_outvalues(AUD_SAMPLE_SIZE(reader->getSpecs()) * AUD_LOWPASS_ORDER), + m_invalues(AUD_SAMPLE_SIZE(reader->getSpecs()) * AUD_LOWPASS_ORDER), + m_position(0) { + memset(m_outvalues.getBuffer(), 0, m_outvalues.getSize()); + memset(m_invalues.getBuffer(), 0, m_invalues.getSize()); + AUD_Specs specs = reader->getSpecs(); - int samplesize = AUD_SAMPLE_SIZE(specs); - - m_buffer = new AUD_Buffer(); AUD_NEW("buffer") - - m_outvalues = new AUD_Buffer(samplesize * AUD_LOWPASS_ORDER); - AUD_NEW("buffer") - memset(m_outvalues->getBuffer(), 0, samplesize * AUD_LOWPASS_ORDER); - - m_invalues = new AUD_Buffer(samplesize * AUD_LOWPASS_ORDER); - AUD_NEW("buffer") - memset(m_invalues->getBuffer(), 0, samplesize * AUD_LOWPASS_ORDER); - - m_position = 0; // calculate coefficients float w0 = 2 * M_PI * frequency / specs.rate; @@ -65,31 +57,23 @@ AUD_LowpassReader::AUD_LowpassReader(AUD_IReader* reader, float frequency, m_coeff[1][1] = (1 - cos(w0)) / norm; } -AUD_LowpassReader::~AUD_LowpassReader() -{ - delete m_buffer; AUD_DELETE("buffer") - - delete m_outvalues; AUD_DELETE("buffer") - delete m_invalues; AUD_DELETE("buffer"); -} - void AUD_LowpassReader::read(int & length, sample_t* & buffer) { sample_t* buf; sample_t* outvalues; sample_t* invalues; - outvalues = m_outvalues->getBuffer(); - invalues = m_invalues->getBuffer(); + outvalues = m_outvalues.getBuffer(); + invalues = m_invalues.getBuffer(); AUD_Specs specs = m_reader->getSpecs(); m_reader->read(length, buf); - if(m_buffer->getSize() < length * AUD_SAMPLE_SIZE(specs)) - m_buffer->resize(length * AUD_SAMPLE_SIZE(specs)); + if(m_buffer.getSize() < length * AUD_SAMPLE_SIZE(specs)) + m_buffer.resize(length * AUD_SAMPLE_SIZE(specs)); - buffer = m_buffer->getBuffer(); + buffer = m_buffer.getBuffer(); int channels = specs.channels; for(int channel = 0; channel < channels; channel++) diff --git a/intern/audaspace/FX/AUD_LowpassReader.h b/intern/audaspace/FX/AUD_LowpassReader.h index a490ba52c1c..66e4b91b783 100644 --- a/intern/audaspace/FX/AUD_LowpassReader.h +++ b/intern/audaspace/FX/AUD_LowpassReader.h @@ -27,7 +27,7 @@ #define AUD_LOWPASSREADER #include "AUD_EffectReader.h" -class AUD_Buffer; +#include "AUD_Buffer.h" #define AUD_LOWPASS_ORDER 3 @@ -40,17 +40,17 @@ private: /** * The playback buffer. */ - AUD_Buffer *m_buffer; + AUD_Buffer m_buffer; /** * The last out values buffer. */ - AUD_Buffer *m_outvalues; + AUD_Buffer m_outvalues; /** * The last in values buffer. */ - AUD_Buffer *m_invalues; + AUD_Buffer m_invalues; /** * The position for buffer cycling. @@ -62,21 +62,19 @@ private: */ float m_coeff[2][AUD_LOWPASS_ORDER]; + // hide copy constructor and operator= + AUD_LowpassReader(const AUD_LowpassReader&); + AUD_LowpassReader& operator=(const AUD_LowpassReader&); + public: /** * Creates a new lowpass reader. * \param reader The reader to read from. * \param frequency The cutoff frequency. * \param Q The Q factor. - * \exception AUD_Exception Thrown if the reader specified is NULL. */ AUD_LowpassReader(AUD_IReader* reader, float frequency, float Q); - /** - * Destroys the reader. - */ - virtual ~AUD_LowpassReader(); - virtual void read(int & length, sample_t* & buffer); }; diff --git a/intern/audaspace/FX/AUD_PingPongFactory.cpp b/intern/audaspace/FX/AUD_PingPongFactory.cpp index 8b72afe05e7..b3aaa9e80a4 100644 --- a/intern/audaspace/FX/AUD_PingPongFactory.cpp +++ b/intern/audaspace/FX/AUD_PingPongFactory.cpp @@ -28,40 +28,25 @@ #include "AUD_ReverseFactory.h" AUD_PingPongFactory::AUD_PingPongFactory(AUD_IFactory* factory) : - AUD_EffectFactory(factory) {} - -AUD_IReader* AUD_PingPongFactory::createReader() + AUD_EffectFactory(factory) { - if(m_factory == 0) - return 0; +} - AUD_IReader* reader = m_factory->createReader(); +AUD_IReader* AUD_PingPongFactory::createReader() const +{ + AUD_IReader* reader = getReader(); + AUD_IReader* reader2; + AUD_ReverseFactory factory(m_factory); - if(reader != 0) + try { - AUD_IReader* reader2; - AUD_ReverseFactory factory(m_factory); - - try - { - reader2 = factory.createReader(); - } - catch(AUD_Exception) - { - reader2 = 0; - } - - if(reader2 != 0) - { - reader = new AUD_DoubleReader(reader, reader2); - AUD_NEW("reader") - } - else - { - delete reader; AUD_DELETE("reader") - reader = 0; - } + reader2 = factory.createReader(); + } + catch(AUD_Exception&) + { + delete reader; + throw; } - return reader; + return new AUD_DoubleReader(reader, reader2); } diff --git a/intern/audaspace/FX/AUD_PingPongFactory.h b/intern/audaspace/FX/AUD_PingPongFactory.h index 1bf5d5e2508..82aedca8f7f 100644 --- a/intern/audaspace/FX/AUD_PingPongFactory.h +++ b/intern/audaspace/FX/AUD_PingPongFactory.h @@ -34,14 +34,19 @@ */ class AUD_PingPongFactory : public AUD_EffectFactory { +private: + // hide copy constructor and operator= + AUD_PingPongFactory(const AUD_PingPongFactory&); + AUD_PingPongFactory& operator=(const AUD_PingPongFactory&); + public: /** * Creates a new ping pong factory. * \param factory The input factory. */ - AUD_PingPongFactory(AUD_IFactory* factory = 0); + AUD_PingPongFactory(AUD_IFactory* factory); - virtual AUD_IReader* createReader(); + virtual AUD_IReader* createReader() const; }; #endif //AUD_PINGPONGFACTORY diff --git a/intern/audaspace/FX/AUD_PitchFactory.cpp b/intern/audaspace/FX/AUD_PitchFactory.cpp index 5f814283c12..be285562db3 100644 --- a/intern/audaspace/FX/AUD_PitchFactory.cpp +++ b/intern/audaspace/FX/AUD_PitchFactory.cpp @@ -29,20 +29,11 @@ AUD_PitchFactory::AUD_PitchFactory(AUD_IFactory* factory, float pitch) : AUD_EffectFactory(factory), - m_pitch(pitch) {} - -AUD_PitchFactory::AUD_PitchFactory(float pitch) : - AUD_EffectFactory(0), - m_pitch(pitch) {} - -AUD_IReader* AUD_PitchFactory::createReader() + m_pitch(pitch) { - AUD_IReader* reader = getReader(); - - if(reader != 0) - { - reader = new AUD_PitchReader(reader, m_pitch); AUD_NEW("reader") - } - - return reader; +} + +AUD_IReader* AUD_PitchFactory::createReader() const +{ + return new AUD_PitchReader(getReader(), m_pitch); } diff --git a/intern/audaspace/FX/AUD_PitchFactory.h b/intern/audaspace/FX/AUD_PitchFactory.h index 96c4d0d7e92..52b9b7d99e5 100644 --- a/intern/audaspace/FX/AUD_PitchFactory.h +++ b/intern/audaspace/FX/AUD_PitchFactory.h @@ -37,7 +37,11 @@ private: /** * The pitch. */ - float m_pitch; + const float m_pitch; + + // hide copy constructor and operator= + AUD_PitchFactory(const AUD_PitchFactory&); + AUD_PitchFactory& operator=(const AUD_PitchFactory&); public: /** @@ -45,26 +49,9 @@ public: * \param factory The input factory. * \param pitch The desired pitch. */ - AUD_PitchFactory(AUD_IFactory* factory = 0, float pitch = 1.0f); + AUD_PitchFactory(AUD_IFactory* factory, float pitch); - /** - * Creates a new pitch factory. - * \param pitch The desired pitch. - */ - AUD_PitchFactory(float pitch); - - /** - * Returns the pitch. - */ - float getPitch(); - - /** - * Sets the pitch. - * \param pitch The new pitch value. Should be between 0.0 and 1.0. - */ - void setPitch(float pitch); - - virtual AUD_IReader* createReader(); + virtual AUD_IReader* createReader() const; }; #endif //AUD_PITCHFACTORY diff --git a/intern/audaspace/FX/AUD_PitchReader.cpp b/intern/audaspace/FX/AUD_PitchReader.cpp index c53264e1350..19c3be31968 100644 --- a/intern/audaspace/FX/AUD_PitchReader.cpp +++ b/intern/audaspace/FX/AUD_PitchReader.cpp @@ -26,12 +26,11 @@ #include "AUD_PitchReader.h" AUD_PitchReader::AUD_PitchReader(AUD_IReader* reader, float pitch) : - AUD_EffectReader(reader) + AUD_EffectReader(reader), m_pitch(pitch) { - m_pitch = pitch; } -AUD_Specs AUD_PitchReader::getSpecs() +AUD_Specs AUD_PitchReader::getSpecs() const { AUD_Specs specs = m_reader->getSpecs(); specs.rate = (AUD_SampleRate)((int)(specs.rate * m_pitch)); diff --git a/intern/audaspace/FX/AUD_PitchReader.h b/intern/audaspace/FX/AUD_PitchReader.h index 440e9cc843c..cc188cf0ee4 100644 --- a/intern/audaspace/FX/AUD_PitchReader.h +++ b/intern/audaspace/FX/AUD_PitchReader.h @@ -37,18 +37,21 @@ private: /** * The pitch level. */ - float m_pitch; + const float m_pitch; + + // hide copy constructor and operator= + AUD_PitchReader(const AUD_PitchReader&); + AUD_PitchReader& operator=(const AUD_PitchReader&); public: /** * Creates a new pitch reader. * \param reader The reader to read from. * \param pitch The size of the buffer. - * \exception AUD_Exception Thrown if the reader specified is NULL. */ AUD_PitchReader(AUD_IReader* reader, float pitch); - virtual AUD_Specs getSpecs(); + virtual AUD_Specs getSpecs() const; }; #endif //AUD_PITCHREADER diff --git a/intern/audaspace/FX/AUD_RectifyFactory.cpp b/intern/audaspace/FX/AUD_RectifyFactory.cpp index f97defd793b..52608c3177b 100644 --- a/intern/audaspace/FX/AUD_RectifyFactory.cpp +++ b/intern/audaspace/FX/AUD_RectifyFactory.cpp @@ -27,19 +27,11 @@ #include "AUD_RectifyReader.h" AUD_RectifyFactory::AUD_RectifyFactory(AUD_IFactory* factory) : - AUD_EffectFactory(factory) {} - -AUD_RectifyFactory::AUD_RectifyFactory() : - AUD_EffectFactory(0) {} - -AUD_IReader* AUD_RectifyFactory::createReader() + AUD_EffectFactory(factory) { - AUD_IReader* reader = getReader(); - - if(reader != 0) - { - reader = new AUD_RectifyReader(reader); AUD_NEW("reader") - } - - return reader; +} + +AUD_IReader* AUD_RectifyFactory::createReader() const +{ + return new AUD_RectifyReader(getReader()); } diff --git a/intern/audaspace/FX/AUD_RectifyFactory.h b/intern/audaspace/FX/AUD_RectifyFactory.h index ed00620d318..d8b39e83fdf 100644 --- a/intern/audaspace/FX/AUD_RectifyFactory.h +++ b/intern/audaspace/FX/AUD_RectifyFactory.h @@ -33,19 +33,19 @@ */ class AUD_RectifyFactory : public AUD_EffectFactory { +private: + // hide copy constructor and operator= + AUD_RectifyFactory(const AUD_RectifyFactory&); + AUD_RectifyFactory& operator=(const AUD_RectifyFactory&); + public: /** * Creates a new rectify factory. * \param factory The input factory. */ - AUD_RectifyFactory(AUD_IFactory* factory = 0); + AUD_RectifyFactory(AUD_IFactory* factory); - /** - * Creates a new rectify factory. - */ - AUD_RectifyFactory(); - - virtual AUD_IReader* createReader(); + virtual AUD_IReader* createReader() const; }; #endif //AUD_RECTIFYFACTORY diff --git a/intern/audaspace/FX/AUD_RectifyReader.cpp b/intern/audaspace/FX/AUD_RectifyReader.cpp index 5d3ce80e811..c5bf73fac03 100644 --- a/intern/audaspace/FX/AUD_RectifyReader.cpp +++ b/intern/audaspace/FX/AUD_RectifyReader.cpp @@ -24,19 +24,12 @@ */ #include "AUD_RectifyReader.h" -#include "AUD_Buffer.h" #include AUD_RectifyReader::AUD_RectifyReader(AUD_IReader* reader) : AUD_EffectReader(reader) { - m_buffer = new AUD_Buffer(); AUD_NEW("buffer") -} - -AUD_RectifyReader::~AUD_RectifyReader() -{ - delete m_buffer; AUD_DELETE("buffer") } void AUD_RectifyReader::read(int & length, sample_t* & buffer) @@ -45,10 +38,10 @@ void AUD_RectifyReader::read(int & length, sample_t* & buffer) AUD_Specs specs = m_reader->getSpecs(); m_reader->read(length, buf); - if(m_buffer->getSize() < length * AUD_SAMPLE_SIZE(specs)) - m_buffer->resize(length * AUD_SAMPLE_SIZE(specs)); + if(m_buffer.getSize() < length * AUD_SAMPLE_SIZE(specs)) + m_buffer.resize(length * AUD_SAMPLE_SIZE(specs)); - buffer = m_buffer->getBuffer(); + buffer = m_buffer.getBuffer(); for(int i = 0; i < length * specs.channels; i++) buffer[i] = fabs(buf[i]); diff --git a/intern/audaspace/FX/AUD_RectifyReader.h b/intern/audaspace/FX/AUD_RectifyReader.h index afbe2e59cab..498f18e5041 100644 --- a/intern/audaspace/FX/AUD_RectifyReader.h +++ b/intern/audaspace/FX/AUD_RectifyReader.h @@ -27,7 +27,7 @@ #define AUD_RECTIFYREADER #include "AUD_EffectReader.h" -class AUD_Buffer; +#include "AUD_Buffer.h" /** * This class reads another reader and rectifies it. @@ -38,21 +38,19 @@ private: /** * The playback buffer. */ - AUD_Buffer *m_buffer; + AUD_Buffer m_buffer; + + // hide copy constructor and operator= + AUD_RectifyReader(const AUD_RectifyReader&); + AUD_RectifyReader& operator=(const AUD_RectifyReader&); public: /** * Creates a new rectify reader. * \param reader The reader to read from. - * \exception AUD_Exception Thrown if the reader specified is NULL. */ AUD_RectifyReader(AUD_IReader* reader); - /** - * Destroys the reader. - */ - virtual ~AUD_RectifyReader(); - virtual void read(int & length, sample_t* & buffer); }; diff --git a/intern/audaspace/FX/AUD_ReverseFactory.cpp b/intern/audaspace/FX/AUD_ReverseFactory.cpp index 1242641c350..1002e2de87e 100644 --- a/intern/audaspace/FX/AUD_ReverseFactory.cpp +++ b/intern/audaspace/FX/AUD_ReverseFactory.cpp @@ -28,16 +28,11 @@ #include "AUD_Space.h" AUD_ReverseFactory::AUD_ReverseFactory(AUD_IFactory* factory) : - AUD_EffectFactory(factory) {} - -AUD_IReader* AUD_ReverseFactory::createReader() + AUD_EffectFactory(factory) { - AUD_IReader* reader = getReader(); - - if(reader != 0) - { - reader = new AUD_ReverseReader(reader); AUD_NEW("reader") - } - - return reader; +} + +AUD_IReader* AUD_ReverseFactory::createReader() const +{ + return new AUD_ReverseReader(getReader()); } diff --git a/intern/audaspace/FX/AUD_ReverseFactory.h b/intern/audaspace/FX/AUD_ReverseFactory.h index 4b664c47281..a1995ee68f9 100644 --- a/intern/audaspace/FX/AUD_ReverseFactory.h +++ b/intern/audaspace/FX/AUD_ReverseFactory.h @@ -34,17 +34,19 @@ */ class AUD_ReverseFactory : public AUD_EffectFactory { +private: + // hide copy constructor and operator= + AUD_ReverseFactory(const AUD_ReverseFactory&); + AUD_ReverseFactory& operator=(const AUD_ReverseFactory&); + public: /** * Creates a new reverse factory. * \param factory The input factory. */ - AUD_ReverseFactory(AUD_IFactory* factory = 0); + AUD_ReverseFactory(AUD_IFactory* factory); - /** - * Destroys the factory. - */ - virtual AUD_IReader* createReader(); + virtual AUD_IReader* createReader() const; }; #endif //AUD_REVERSEFACTORY diff --git a/intern/audaspace/FX/AUD_ReverseReader.cpp b/intern/audaspace/FX/AUD_ReverseReader.cpp index 82d6c70ce53..a17a4a64a18 100644 --- a/intern/audaspace/FX/AUD_ReverseReader.cpp +++ b/intern/audaspace/FX/AUD_ReverseReader.cpp @@ -24,27 +24,16 @@ */ #include "AUD_ReverseReader.h" -#include "AUD_Buffer.h" #include AUD_ReverseReader::AUD_ReverseReader(AUD_IReader* reader) : - AUD_EffectReader(reader) + AUD_EffectReader(reader), + m_length(reader->getLength()), + m_position(0) { - if(reader->getType() != AUD_TYPE_BUFFER) + if(m_length < 0 || !reader->isSeekable()) AUD_THROW(AUD_ERROR_READER); - - m_length = reader->getLength(); - if(m_length < 0) - AUD_THROW(AUD_ERROR_READER); - - m_position = 0; - m_buffer = new AUD_Buffer(); AUD_NEW("buffer") -} - -AUD_ReverseReader::~AUD_ReverseReader() -{ - delete m_buffer; AUD_DELETE("buffer") } void AUD_ReverseReader::seek(int position) @@ -52,12 +41,12 @@ void AUD_ReverseReader::seek(int position) m_position = position; } -int AUD_ReverseReader::getLength() +int AUD_ReverseReader::getLength() const { return m_length; } -int AUD_ReverseReader::getPosition() +int AUD_ReverseReader::getPosition() const { return m_position; } @@ -66,7 +55,7 @@ void AUD_ReverseReader::read(int & length, sample_t* & buffer) { // first correct the length if(m_position + length > m_length) - length = m_length-m_position; + length = m_length - m_position; if(length <= 0) { @@ -78,10 +67,10 @@ void AUD_ReverseReader::read(int & length, sample_t* & buffer) int samplesize = AUD_SAMPLE_SIZE(specs); // resize buffer if needed - if(m_buffer->getSize() < length * samplesize) - m_buffer->resize(length * samplesize); + if(m_buffer.getSize() < length * samplesize) + m_buffer.resize(length * samplesize); - buffer = m_buffer->getBuffer(); + buffer = m_buffer.getBuffer(); sample_t* buf; int len = length; @@ -105,5 +94,5 @@ void AUD_ReverseReader::read(int & length, sample_t* & buffer) m_position += length; - buffer = m_buffer->getBuffer(); + buffer = m_buffer.getBuffer(); } diff --git a/intern/audaspace/FX/AUD_ReverseReader.h b/intern/audaspace/FX/AUD_ReverseReader.h index 045d2ac5a8e..8eb960a5dee 100644 --- a/intern/audaspace/FX/AUD_ReverseReader.h +++ b/intern/audaspace/FX/AUD_ReverseReader.h @@ -27,7 +27,7 @@ #define AUD_REVERSEREADER #include "AUD_EffectReader.h" -class AUD_Buffer; +#include "AUD_Buffer.h" /** * This class reads another reader from back to front. @@ -36,38 +36,37 @@ class AUD_Buffer; class AUD_ReverseReader : public AUD_EffectReader { private: + /** + * The sample count. + */ + const int m_length; + /** * The current position. */ int m_position; - /** - * The sample count. - */ - int m_length; - /** * The playback buffer. */ - AUD_Buffer* m_buffer; + AUD_Buffer m_buffer; + + // hide copy constructor and operator= + AUD_ReverseReader(const AUD_ReverseReader&); + AUD_ReverseReader& operator=(const AUD_ReverseReader&); public: /** * Creates a new reverse reader. * \param reader The reader to read from. - * \exception AUD_Exception Thrown if the reader specified is NULL or not - * a buffer. + * \exception AUD_Exception Thrown if the reader specified has an + * undeterminable/infinite length or is not seekable. */ AUD_ReverseReader(AUD_IReader* reader); - /** - * Destroys the reader. - */ - virtual ~AUD_ReverseReader(); - virtual void seek(int position); - virtual int getLength(); - virtual int getPosition(); + virtual int getLength() const; + virtual int getPosition() const; virtual void read(int & length, sample_t* & buffer); }; diff --git a/intern/audaspace/FX/AUD_SquareFactory.cpp b/intern/audaspace/FX/AUD_SquareFactory.cpp index 638acaa9a32..b95c9d9bb0f 100644 --- a/intern/audaspace/FX/AUD_SquareFactory.cpp +++ b/intern/audaspace/FX/AUD_SquareFactory.cpp @@ -28,30 +28,16 @@ AUD_SquareFactory::AUD_SquareFactory(AUD_IFactory* factory, float threshold) : AUD_EffectFactory(factory), - m_threshold(threshold) {} + m_threshold(threshold) +{ +} -AUD_SquareFactory::AUD_SquareFactory(float threshold) : - AUD_EffectFactory(0), - m_threshold(threshold) {} - -float AUD_SquareFactory::getThreshold() +float AUD_SquareFactory::getThreshold() const { return m_threshold; } -void AUD_SquareFactory::setThreshold(float threshold) +AUD_IReader* AUD_SquareFactory::createReader() const { - m_threshold = threshold; -} - -AUD_IReader* AUD_SquareFactory::createReader() -{ - AUD_IReader* reader = getReader(); - - if(reader != 0) - { - reader = new AUD_SquareReader(reader, m_threshold); AUD_NEW("reader") - } - - return reader; + return new AUD_SquareReader(getReader(), m_threshold); } diff --git a/intern/audaspace/FX/AUD_SquareFactory.h b/intern/audaspace/FX/AUD_SquareFactory.h index dfbe5ae2887..da87dc6f888 100644 --- a/intern/audaspace/FX/AUD_SquareFactory.h +++ b/intern/audaspace/FX/AUD_SquareFactory.h @@ -37,7 +37,11 @@ private: /** * The threshold. */ - float m_threshold; + const float m_threshold; + + // hide copy constructor and operator= + AUD_SquareFactory(const AUD_SquareFactory&); + AUD_SquareFactory& operator=(const AUD_SquareFactory&); public: /** @@ -45,26 +49,14 @@ public: * \param factory The input factory. * \param threshold The threshold. */ - AUD_SquareFactory(AUD_IFactory* factory = 0, float threshold = 0.0f); - - /** - * Creates a new square factory. - * \param threshold The threshold. - */ - AUD_SquareFactory(float threshold); + AUD_SquareFactory(AUD_IFactory* factory, float threshold = 0.0f); /** * Returns the threshold. */ - float getThreshold(); + float getThreshold() const; - /** - * Sets the threshold. - * \param threshold The new threshold value. Should be between 0.0 and 1.0. - */ - void setThreshold(float threshold); - - virtual AUD_IReader* createReader(); + virtual AUD_IReader* createReader() const; }; #endif //AUD_SQUAREFACTORY diff --git a/intern/audaspace/FX/AUD_SquareReader.cpp b/intern/audaspace/FX/AUD_SquareReader.cpp index 2d4dc52fe27..4bf0d87f99b 100644 --- a/intern/audaspace/FX/AUD_SquareReader.cpp +++ b/intern/audaspace/FX/AUD_SquareReader.cpp @@ -24,7 +24,6 @@ */ #include "AUD_SquareReader.h" -#include "AUD_Buffer.h" #include @@ -32,12 +31,6 @@ AUD_SquareReader::AUD_SquareReader(AUD_IReader* reader, float threshold) : AUD_EffectReader(reader), m_threshold(threshold) { - m_buffer = new AUD_Buffer(); AUD_NEW("buffer") -} - -AUD_SquareReader::~AUD_SquareReader() -{ - delete m_buffer; AUD_DELETE("buffer") } void AUD_SquareReader::read(int & length, sample_t* & buffer) @@ -46,10 +39,11 @@ void AUD_SquareReader::read(int & length, sample_t* & buffer) AUD_Specs specs = m_reader->getSpecs(); m_reader->read(length, buf); - if(m_buffer->getSize() < length * AUD_SAMPLE_SIZE(specs)) - m_buffer->resize(length * AUD_SAMPLE_SIZE(specs)); - buffer = m_buffer->getBuffer(); + if(m_buffer.getSize() < length * AUD_SAMPLE_SIZE(specs)) + m_buffer.resize(length * AUD_SAMPLE_SIZE(specs)); + + buffer = m_buffer.getBuffer(); for(int i = 0; i < length * specs.channels; i++) { diff --git a/intern/audaspace/FX/AUD_SquareReader.h b/intern/audaspace/FX/AUD_SquareReader.h index 63dda351445..d3a5331b0e8 100644 --- a/intern/audaspace/FX/AUD_SquareReader.h +++ b/intern/audaspace/FX/AUD_SquareReader.h @@ -27,7 +27,7 @@ #define AUD_SQUAREREADER #include "AUD_EffectReader.h" -class AUD_Buffer; +#include "AUD_Buffer.h" /** * This class changes another signal into a square signal. @@ -38,27 +38,25 @@ private: /** * The playback buffer. */ - AUD_Buffer *m_buffer; + AUD_Buffer m_buffer; /** * The threshold level. */ - float m_threshold; + const float m_threshold; + + // hide copy constructor and operator= + AUD_SquareReader(const AUD_SquareReader&); + AUD_SquareReader& operator=(const AUD_SquareReader&); public: /** * Creates a new square reader. * \param reader The reader to read from. * \param threshold The size of the buffer. - * \exception AUD_Exception Thrown if the reader specified is NULL. */ AUD_SquareReader(AUD_IReader* reader, float threshold); - /** - * Destroys the reader. - */ - virtual ~AUD_SquareReader(); - virtual void read(int & length, sample_t* & buffer); }; diff --git a/intern/audaspace/FX/AUD_SumFactory.cpp b/intern/audaspace/FX/AUD_SumFactory.cpp index f7990aab8a1..96ad286bf5c 100644 --- a/intern/audaspace/FX/AUD_SumFactory.cpp +++ b/intern/audaspace/FX/AUD_SumFactory.cpp @@ -27,17 +27,11 @@ #include "AUD_SumReader.h" AUD_SumFactory::AUD_SumFactory(AUD_IFactory* factory) : - AUD_EffectFactory(factory) {} - -AUD_IReader* AUD_SumFactory::createReader() + AUD_EffectFactory(factory) { - AUD_IReader* reader = getReader(); - - if(reader != 0) - { - reader = new AUD_SumReader(reader); - AUD_NEW("reader") - } - - return reader; +} + +AUD_IReader* AUD_SumFactory::createReader() const +{ + return new AUD_SumReader(getReader()); } diff --git a/intern/audaspace/FX/AUD_SumFactory.h b/intern/audaspace/FX/AUD_SumFactory.h index 5cb48e26b10..045a0a3a625 100644 --- a/intern/audaspace/FX/AUD_SumFactory.h +++ b/intern/audaspace/FX/AUD_SumFactory.h @@ -33,14 +33,19 @@ */ class AUD_SumFactory : public AUD_EffectFactory { +private: + // hide copy constructor and operator= + AUD_SumFactory(const AUD_SumFactory&); + AUD_SumFactory& operator=(const AUD_SumFactory&); + public: /** * Creates a new sum factory. * \param factory The input factory. */ - AUD_SumFactory(AUD_IFactory* factory = 0); + AUD_SumFactory(AUD_IFactory* factory); - virtual AUD_IReader* createReader(); + virtual AUD_IReader* createReader() const; }; #endif //AUD_SUMFACTORY diff --git a/intern/audaspace/FX/AUD_SumReader.cpp b/intern/audaspace/FX/AUD_SumReader.cpp index 08747790fc9..13f0e2271a6 100644 --- a/intern/audaspace/FX/AUD_SumReader.cpp +++ b/intern/audaspace/FX/AUD_SumReader.cpp @@ -24,43 +24,32 @@ */ #include "AUD_SumReader.h" -#include "AUD_Buffer.h" #include #define CC specs.channels + channel AUD_SumReader::AUD_SumReader(AUD_IReader* reader) : - AUD_EffectReader(reader) + AUD_EffectReader(reader), + m_sums(AUD_SAMPLE_SIZE(reader->getSpecs())) { - AUD_Specs specs = reader->getSpecs(); - int samplesize = AUD_SAMPLE_SIZE(specs); - - m_buffer = new AUD_Buffer(); AUD_NEW("buffer") - - m_sums = new AUD_Buffer(samplesize); AUD_NEW("buffer") - memset(m_sums->getBuffer(), 0, samplesize); -} - -AUD_SumReader::~AUD_SumReader() -{ - delete m_buffer; AUD_DELETE("buffer") - delete m_sums; AUD_DELETE("buffer") + memset(m_sums.getBuffer(), 0, m_sums.getSize()); } void AUD_SumReader::read(int & length, sample_t* & buffer) { sample_t* buf; sample_t* sums; - sums = m_sums->getBuffer(); + sums = m_sums.getBuffer(); AUD_Specs specs = m_reader->getSpecs(); m_reader->read(length, buf); - if(m_buffer->getSize() < length * AUD_SAMPLE_SIZE(specs)) - m_buffer->resize(length * AUD_SAMPLE_SIZE(specs)); - buffer = m_buffer->getBuffer(); + if(m_buffer.getSize() < length * AUD_SAMPLE_SIZE(specs)) + m_buffer.resize(length * AUD_SAMPLE_SIZE(specs)); + + buffer = m_buffer.getBuffer(); for(int channel = 0; channel < specs.channels; channel++) for(int i = 0; i < length * specs.channels; i++) diff --git a/intern/audaspace/FX/AUD_SumReader.h b/intern/audaspace/FX/AUD_SumReader.h index 76ccf2f863a..0bb470bac97 100644 --- a/intern/audaspace/FX/AUD_SumReader.h +++ b/intern/audaspace/FX/AUD_SumReader.h @@ -27,7 +27,7 @@ #define AUD_SUMREADER #include "AUD_EffectReader.h" -class AUD_Buffer; +#include "AUD_Buffer.h" /** * This class represents an summer. @@ -38,26 +38,24 @@ private: /** * The playback buffer. */ - AUD_Buffer *m_buffer; + AUD_Buffer m_buffer; /** * The sums of the specific channels. */ - AUD_Buffer *m_sums; + AUD_Buffer m_sums; + + // hide copy constructor and operator= + AUD_SumReader(const AUD_SumReader&); + AUD_SumReader& operator=(const AUD_SumReader&); public: /** * Creates a new sum reader. * \param reader The reader to read from. - * \exception AUD_Exception Thrown if the reader specified is NULL. */ AUD_SumReader(AUD_IReader* reader); - /** - * Destroys the reader. - */ - virtual ~AUD_SumReader(); - virtual void read(int & length, sample_t* & buffer); }; diff --git a/intern/audaspace/FX/AUD_SuperposeFactory.cpp b/intern/audaspace/FX/AUD_SuperposeFactory.cpp index afd1ec18efb..6bfc1125ca6 100644 --- a/intern/audaspace/FX/AUD_SuperposeFactory.cpp +++ b/intern/audaspace/FX/AUD_SuperposeFactory.cpp @@ -27,29 +27,23 @@ #include "AUD_SuperposeReader.h" AUD_SuperposeFactory::AUD_SuperposeFactory(AUD_IFactory* factory1, AUD_IFactory* factory2) : - m_factory1(factory1), m_factory2(factory2) {} + m_factory1(factory1), m_factory2(factory2) +{ +} -AUD_IReader* AUD_SuperposeFactory::createReader() +AUD_IReader* AUD_SuperposeFactory::createReader() const { AUD_IReader* reader1 = m_factory1->createReader(); - if(!reader1) - return 0; AUD_IReader* reader2; try { reader2 = m_factory2->createReader(); - if(!reader2) - { - delete reader1; AUD_DELETE("reader") - return 0; - } } catch(AUD_Exception&) { - delete reader1; AUD_DELETE("reader") + delete reader1; throw; } - AUD_IReader* reader = new AUD_SuperposeReader(reader1, reader2); - return reader; + return new AUD_SuperposeReader(reader1, reader2); } diff --git a/intern/audaspace/FX/AUD_SuperposeFactory.h b/intern/audaspace/FX/AUD_SuperposeFactory.h index 44e79d76887..a7fde2c182f 100644 --- a/intern/audaspace/FX/AUD_SuperposeFactory.h +++ b/intern/audaspace/FX/AUD_SuperposeFactory.h @@ -45,6 +45,10 @@ private: */ AUD_IFactory* m_factory2; + // hide copy constructor and operator= + AUD_SuperposeFactory(const AUD_SuperposeFactory&); + AUD_SuperposeFactory& operator=(const AUD_SuperposeFactory&); + public: /** * Creates a new superpose factory. @@ -53,7 +57,7 @@ public: */ AUD_SuperposeFactory(AUD_IFactory* factory1, AUD_IFactory* factory2); - virtual AUD_IReader* createReader(); + virtual AUD_IReader* createReader() const; }; #endif //AUD_SUPERPOSEFACTORY diff --git a/intern/audaspace/FX/AUD_SuperposeReader.cpp b/intern/audaspace/FX/AUD_SuperposeReader.cpp index 6519f272110..c24b01b35b3 100644 --- a/intern/audaspace/FX/AUD_SuperposeReader.cpp +++ b/intern/audaspace/FX/AUD_SuperposeReader.cpp @@ -24,7 +24,6 @@ */ #include "AUD_SuperposeReader.h" -#include "AUD_Buffer.h" #include @@ -33,44 +32,28 @@ AUD_SuperposeReader::AUD_SuperposeReader(AUD_IReader* reader1, AUD_IReader* read { try { - if(!reader1) - AUD_THROW(AUD_ERROR_READER); - - if(!reader2) - AUD_THROW(AUD_ERROR_READER); - AUD_Specs s1, s2; s1 = reader1->getSpecs(); s2 = reader2->getSpecs(); - if(memcmp(&s1, &s2, sizeof(AUD_Specs)) != 0) + if(memcmp(&s1, &s2, sizeof(AUD_Specs))) AUD_THROW(AUD_ERROR_READER); } - - catch(AUD_Exception) + catch(AUD_Exception&) { - if(reader1) - { - delete reader1; AUD_DELETE("reader") - } - if(reader2) - { - delete reader2; AUD_DELETE("reader") - } + delete reader1; + delete reader2; throw; } - - m_buffer = new AUD_Buffer(); AUD_NEW("buffer") } AUD_SuperposeReader::~AUD_SuperposeReader() { - delete m_reader1; AUD_DELETE("reader") - delete m_reader2; AUD_DELETE("reader") - delete m_buffer; AUD_DELETE("buffer") + delete m_reader1; + delete m_reader2; } -bool AUD_SuperposeReader::isSeekable() +bool AUD_SuperposeReader::isSeekable() const { return m_reader1->isSeekable() && m_reader2->isSeekable(); } @@ -81,50 +64,35 @@ void AUD_SuperposeReader::seek(int position) m_reader2->seek(position); } -int AUD_SuperposeReader::getLength() +int AUD_SuperposeReader::getLength() const { int len1 = m_reader1->getLength(); int len2 = m_reader2->getLength(); if((len1 < 0) || (len2 < 0)) return -1; - if(len1 < len2) - return len2; - return len1; + return AUD_MIN(len1, len2); } -int AUD_SuperposeReader::getPosition() +int AUD_SuperposeReader::getPosition() const { int pos1 = m_reader1->getPosition(); int pos2 = m_reader2->getPosition(); return AUD_MAX(pos1, pos2); } -AUD_Specs AUD_SuperposeReader::getSpecs() +AUD_Specs AUD_SuperposeReader::getSpecs() const { return m_reader1->getSpecs(); } -AUD_ReaderType AUD_SuperposeReader::getType() -{ - if(m_reader1->getType() == AUD_TYPE_BUFFER && - m_reader2->getType() == AUD_TYPE_BUFFER) - return AUD_TYPE_BUFFER; - return AUD_TYPE_STREAM; -} - -bool AUD_SuperposeReader::notify(AUD_Message &message) -{ - return m_reader1->notify(message) | m_reader2->notify(message); -} - void AUD_SuperposeReader::read(int & length, sample_t* & buffer) { AUD_Specs specs = m_reader1->getSpecs(); int samplesize = AUD_SAMPLE_SIZE(specs); - if(m_buffer->getSize() < length * samplesize) - m_buffer->resize(length * samplesize); - buffer = m_buffer->getBuffer(); + if(m_buffer.getSize() < length * samplesize) + m_buffer.resize(length * samplesize); + buffer = m_buffer.getBuffer(); int len1 = length; sample_t* buf; diff --git a/intern/audaspace/FX/AUD_SuperposeReader.h b/intern/audaspace/FX/AUD_SuperposeReader.h index 71392b1133b..eeceb9adfeb 100644 --- a/intern/audaspace/FX/AUD_SuperposeReader.h +++ b/intern/audaspace/FX/AUD_SuperposeReader.h @@ -27,7 +27,7 @@ #define AUD_SUPERPOSEREADER #include "AUD_IReader.h" -class AUD_Buffer; +#include "AUD_Buffer.h" /** * This reader plays two readers with the same specs sequently. @@ -48,15 +48,18 @@ private: /** * The playback buffer for the intersecting part. */ - AUD_Buffer* m_buffer; + AUD_Buffer m_buffer; + + // hide copy constructor and operator= + AUD_SuperposeReader(const AUD_SuperposeReader&); + AUD_SuperposeReader& operator=(const AUD_SuperposeReader&); public: /** * Creates a new superpose reader. * \param reader1 The first reader to read from. * \param reader2 The second reader to read from. - * \exception AUD_Exception Thrown if one of the reader specified is NULL - * or the specs from the readers differ. + * \exception AUD_Exception Thrown if the specs from the readers differ. */ AUD_SuperposeReader(AUD_IReader* reader1, AUD_IReader* reader2); @@ -65,13 +68,11 @@ public: */ virtual ~AUD_SuperposeReader(); - virtual bool isSeekable(); + virtual bool isSeekable() const; virtual void seek(int position); - virtual int getLength(); - virtual int getPosition(); - virtual AUD_Specs getSpecs(); - virtual AUD_ReaderType getType(); - virtual bool notify(AUD_Message &message); + virtual int getLength() const; + virtual int getPosition() const; + virtual AUD_Specs getSpecs() const; virtual void read(int & length, sample_t* & buffer); }; diff --git a/intern/audaspace/FX/AUD_VolumeFactory.cpp b/intern/audaspace/FX/AUD_VolumeFactory.cpp index fbde608aa12..9f0fd5821fd 100644 --- a/intern/audaspace/FX/AUD_VolumeFactory.cpp +++ b/intern/audaspace/FX/AUD_VolumeFactory.cpp @@ -28,30 +28,16 @@ AUD_VolumeFactory::AUD_VolumeFactory(AUD_IFactory* factory, float volume) : AUD_EffectFactory(factory), - m_volume(volume) {} + m_volume(volume) +{ +} -AUD_VolumeFactory::AUD_VolumeFactory(float volume) : - AUD_EffectFactory(0), - m_volume(volume) {} - -float AUD_VolumeFactory::getVolume() +float AUD_VolumeFactory::getVolume() const { return m_volume; } -void AUD_VolumeFactory::setVolume(float volume) +AUD_IReader* AUD_VolumeFactory::createReader() const { - m_volume = volume; -} - -AUD_IReader* AUD_VolumeFactory::createReader() -{ - AUD_IReader* reader = getReader(); - - if(reader != 0) - { - reader = new AUD_VolumeReader(reader, m_volume); AUD_NEW("reader") - } - - return reader; + return new AUD_VolumeReader(getReader(), m_volume); } diff --git a/intern/audaspace/FX/AUD_VolumeFactory.h b/intern/audaspace/FX/AUD_VolumeFactory.h index 09f91241b47..a086aab4640 100644 --- a/intern/audaspace/FX/AUD_VolumeFactory.h +++ b/intern/audaspace/FX/AUD_VolumeFactory.h @@ -39,7 +39,11 @@ private: /** * The volume. */ - float m_volume; + const float m_volume; + + // hide copy constructor and operator= + AUD_VolumeFactory(const AUD_VolumeFactory&); + AUD_VolumeFactory& operator=(const AUD_VolumeFactory&); public: /** @@ -47,26 +51,14 @@ public: * \param factory The input factory. * \param volume The desired volume. */ - AUD_VolumeFactory(AUD_IFactory* factory = 0, float volume = 1.0f); - - /** - * Creates a new volume factory. - * \param volume The desired volume. - */ - AUD_VolumeFactory(float volume); + AUD_VolumeFactory(AUD_IFactory* factory, float volume); /** * Returns the volume. */ - float getVolume(); + float getVolume() const; - /** - * Sets the volume. - * \param volume The new volume value. Should be between 0.0 and 1.0. - */ - void setVolume(float volume); - - virtual AUD_IReader* createReader(); + virtual AUD_IReader* createReader() const; }; #endif //AUD_VOLUMEFACTORY diff --git a/intern/audaspace/FX/AUD_VolumeReader.cpp b/intern/audaspace/FX/AUD_VolumeReader.cpp index f094c1e4ea3..7401b508b28 100644 --- a/intern/audaspace/FX/AUD_VolumeReader.cpp +++ b/intern/audaspace/FX/AUD_VolumeReader.cpp @@ -24,7 +24,6 @@ */ #include "AUD_VolumeReader.h" -#include "AUD_Buffer.h" #include @@ -32,25 +31,6 @@ AUD_VolumeReader::AUD_VolumeReader(AUD_IReader* reader, float volume) : AUD_EffectReader(reader), m_volume(volume) { - m_buffer = new AUD_Buffer(); AUD_NEW("buffer") -} - -AUD_VolumeReader::~AUD_VolumeReader() -{ - delete m_buffer; AUD_DELETE("buffer") -} - -bool AUD_VolumeReader::notify(AUD_Message &message) -{ - if(message.type == AUD_MSG_VOLUME) - { - m_volume = message.volume; - - m_reader->notify(message); - - return true; - } - return m_reader->notify(message); } void AUD_VolumeReader::read(int & length, sample_t* & buffer) @@ -59,10 +39,10 @@ void AUD_VolumeReader::read(int & length, sample_t* & buffer) AUD_Specs specs = m_reader->getSpecs(); m_reader->read(length, buf); - if(m_buffer->getSize() < length*AUD_SAMPLE_SIZE(specs)) - m_buffer->resize(length*AUD_SAMPLE_SIZE(specs)); + if(m_buffer.getSize() < length * AUD_SAMPLE_SIZE(specs)) + m_buffer.resize(length * AUD_SAMPLE_SIZE(specs)); - buffer = m_buffer->getBuffer(); + buffer = m_buffer.getBuffer(); for(int i = 0; i < length * specs.channels; i++) buffer[i] = buf[i] * m_volume; diff --git a/intern/audaspace/FX/AUD_VolumeReader.h b/intern/audaspace/FX/AUD_VolumeReader.h index 489f85b10f2..0e96a27e287 100644 --- a/intern/audaspace/FX/AUD_VolumeReader.h +++ b/intern/audaspace/FX/AUD_VolumeReader.h @@ -27,7 +27,7 @@ #define AUD_VOLUMEREADER #include "AUD_EffectReader.h" -class AUD_Buffer; +#include "AUD_Buffer.h" /** * This class reads another reader and changes it's volume. @@ -38,28 +38,25 @@ private: /** * The playback buffer. */ - AUD_Buffer *m_buffer; + AUD_Buffer m_buffer; /** * The volume level. */ - float m_volume; + const float m_volume; + + // hide copy constructor and operator= + AUD_VolumeReader(const AUD_VolumeReader&); + AUD_VolumeReader& operator=(const AUD_VolumeReader&); public: /** * Creates a new volume reader. * \param reader The reader to read from. * \param volume The size of the buffer. - * \exception AUD_Exception Thrown if the reader specified is NULL. */ AUD_VolumeReader(AUD_IReader* reader, float volume); - /** - * Destroys the reader. - */ - virtual ~AUD_VolumeReader(); - - virtual bool notify(AUD_Message &message); virtual void read(int & length, sample_t* & buffer); }; diff --git a/intern/audaspace/OpenAL/AUD_OpenALDevice.cpp b/intern/audaspace/OpenAL/AUD_OpenALDevice.cpp index 796764989ba..729d4acc077 100644 --- a/intern/audaspace/OpenAL/AUD_OpenALDevice.cpp +++ b/intern/audaspace/OpenAL/AUD_OpenALDevice.cpp @@ -24,8 +24,9 @@ */ #include "AUD_OpenALDevice.h" +#include "AUD_IFactory.h" #include "AUD_IReader.h" -#include "AUD_ConverterFactory.h" +#include "AUD_ConverterReader.h" #include "AUD_SourceCaps.h" #include @@ -302,12 +303,7 @@ AUD_OpenALDevice::AUD_OpenALDevice(AUD_DeviceSpecs specs, int buffersize) // check for specific formats and channel counts to be played back if(alIsExtensionPresent("AL_EXT_FLOAT32") == AL_TRUE) - { specs.format = AUD_FORMAT_FLOAT32; - m_converter = NULL; - } - else - m_converter = new AUD_ConverterFactory(specs); AUD_NEW("factory") m_useMC = alIsExtensionPresent("AL_EXT_MCFORMATS") == AL_TRUE; @@ -317,10 +313,9 @@ AUD_OpenALDevice::AUD_OpenALDevice(AUD_DeviceSpecs specs, int buffersize) m_buffersize = buffersize; m_playing = false; - m_playingSounds = new std::list(); AUD_NEW("list") - m_pausedSounds = new std::list(); AUD_NEW("list") + m_playingSounds = new std::list(); + m_pausedSounds = new std::list(); m_bufferedFactories = new std::list(); - AUD_NEW("list") pthread_mutexattr_t attr; pthread_mutexattr_init(&attr); @@ -345,10 +340,10 @@ AUD_OpenALDevice::~AUD_OpenALDevice() alDeleteSources(1, &sound->source); if(!sound->isBuffered) { - delete sound->reader; AUD_DELETE("reader") + delete sound->reader; alDeleteBuffers(AUD_OPENAL_CYCLE_BUFFERS, sound->buffers); } - delete sound; AUD_DELETE("handle") + delete sound; m_playingSounds->erase(m_playingSounds->begin()); } @@ -359,10 +354,10 @@ AUD_OpenALDevice::~AUD_OpenALDevice() alDeleteSources(1, &sound->source); if(!sound->isBuffered) { - delete sound->reader; AUD_DELETE("reader") + delete sound->reader; alDeleteBuffers(AUD_OPENAL_CYCLE_BUFFERS, sound->buffers); } - delete sound; AUD_DELETE("handle") + delete sound; m_pausedSounds->erase(m_pausedSounds->begin()); } @@ -370,7 +365,7 @@ AUD_OpenALDevice::~AUD_OpenALDevice() while(!m_bufferedFactories->empty()) { alDeleteBuffers(1, &(*(m_bufferedFactories->begin()))->buffer); - delete *m_bufferedFactories->begin(); AUD_DELETE("bufferedfactory"); + delete *m_bufferedFactories->begin(); m_bufferedFactories->erase(m_bufferedFactories->begin()); } @@ -385,22 +380,19 @@ AUD_OpenALDevice::~AUD_OpenALDevice() else unlock(); - delete m_playingSounds; AUD_DELETE("list") - delete m_pausedSounds; AUD_DELETE("list") - delete m_bufferedFactories; AUD_DELETE("list") + delete m_playingSounds; + delete m_pausedSounds; + delete m_bufferedFactories; // quit OpenAL alcMakeContextCurrent(NULL); alcDestroyContext(m_context); alcCloseDevice(m_device); - if(m_converter) - delete m_converter; AUD_DELETE("factory") - pthread_mutex_destroy(&m_mutex); } -AUD_DeviceSpecs AUD_OpenALDevice::getSpecs() +AUD_DeviceSpecs AUD_OpenALDevice::getSpecs() const { return m_specs; } @@ -511,7 +503,7 @@ AUD_Handle* AUD_OpenALDevice::play(AUD_IFactory* factory, bool keep) if((*i)->factory == factory) { // create the handle - sound = new AUD_OpenALHandle; AUD_NEW("handle") + sound = new AUD_OpenALHandle; sound->keep = keep; sound->current = -1; sound->isBuffered = true; @@ -532,15 +524,15 @@ AUD_Handle* AUD_OpenALDevice::play(AUD_IFactory* factory, bool keep) if(alGetError() != AL_NO_ERROR) AUD_THROW(AUD_ERROR_OPENAL); } - catch(AUD_Exception) + catch(AUD_Exception&) { alDeleteSources(1, &sound->source); throw; } } - catch(AUD_Exception) + catch(AUD_Exception&) { - delete sound; AUD_DELETE("handle") + delete sound; alcProcessContext(m_context); throw; } @@ -555,7 +547,7 @@ AUD_Handle* AUD_OpenALDevice::play(AUD_IFactory* factory, bool keep) } } } - catch(AUD_Exception) + catch(AUD_Exception&) { unlock(); throw; @@ -577,14 +569,11 @@ AUD_Handle* AUD_OpenALDevice::play(AUD_IFactory* factory, bool keep) // check format bool valid = specs.channels != AUD_CHANNELS_INVALID; - if(m_converter) - { - m_converter->setReader(reader); - reader = m_converter->createReader(); - } + if(m_specs.format != AUD_FORMAT_FLOAT32) + reader = new AUD_ConverterReader(reader, m_specs); // create the handle - sound = new AUD_OpenALHandle; AUD_NEW("handle") + sound = new AUD_OpenALHandle; sound->keep = keep; sound->reader = reader; sound->current = 0; @@ -595,8 +584,8 @@ AUD_Handle* AUD_OpenALDevice::play(AUD_IFactory* factory, bool keep) if(!valid) { - delete sound; AUD_DELETE("handle") - delete reader; AUD_DELETE("reader") + delete sound; + delete reader; return NULL; } @@ -637,22 +626,22 @@ AUD_Handle* AUD_OpenALDevice::play(AUD_IFactory* factory, bool keep) if(alGetError() != AL_NO_ERROR) AUD_THROW(AUD_ERROR_OPENAL); } - catch(AUD_Exception) + catch(AUD_Exception&) { alDeleteSources(1, &sound->source); throw; } } - catch(AUD_Exception) + catch(AUD_Exception&) { alDeleteBuffers(AUD_OPENAL_CYCLE_BUFFERS, sound->buffers); throw; } } - catch(AUD_Exception) + catch(AUD_Exception&) { - delete sound; AUD_DELETE("handle") - delete reader; AUD_DELETE("reader") + delete sound; + delete reader; alcProcessContext(m_context); unlock(); throw; @@ -737,10 +726,10 @@ bool AUD_OpenALDevice::stop(AUD_Handle* handle) alDeleteSources(1, &sound->source); if(!sound->isBuffered) { - delete sound->reader; AUD_DELETE("reader") + delete sound->reader; alDeleteBuffers(AUD_OPENAL_CYCLE_BUFFERS, sound->buffers); } - delete *i; AUD_DELETE("handle") + delete *i; m_playingSounds->erase(i); result = true; break; @@ -757,10 +746,10 @@ bool AUD_OpenALDevice::stop(AUD_Handle* handle) alDeleteSources(1, &sound->source); if(!sound->isBuffered) { - delete sound->reader; AUD_DELETE("reader") + delete sound->reader; alDeleteBuffers(AUD_OPENAL_CYCLE_BUFFERS, sound->buffers); } - delete *i; AUD_DELETE("handle") + delete *i; m_pausedSounds->erase(i); result = true; break; @@ -790,32 +779,6 @@ bool AUD_OpenALDevice::setKeep(AUD_Handle* handle, bool keep) return result; } -bool AUD_OpenALDevice::sendMessage(AUD_Handle* handle, AUD_Message &message) -{ - bool result = false; - - lock(); - - if(handle == 0) - { - for(AUD_HandleIterator i = m_playingSounds->begin(); - i != m_playingSounds->end(); i++) - if(!(*i)->isBuffered) - result |= (*i)->reader->notify(message); - for(AUD_HandleIterator i = m_pausedSounds->begin(); - i != m_pausedSounds->end(); i++) - if(!(*i)->isBuffered) - result |= (*i)->reader->notify(message); - } - else if(isValid(handle)) - if(!((AUD_OpenALHandle*)handle)->isBuffered) - result = ((AUD_OpenALHandle*)handle)->reader->notify(message); - - unlock(); - - return result; -} - bool AUD_OpenALDevice::seek(AUD_Handle* handle, float position) { bool result = false; @@ -1024,26 +987,14 @@ bool AUD_OpenALDevice::setCapability(int capability, void *value) AUD_DeviceSpecs specs = m_specs; specs.specs = reader->getSpecs(); - // determine format - bool valid = reader->getType() == AUD_TYPE_BUFFER; - - if(valid) - { - if(m_converter) - { - m_converter->setReader(reader); - reader = m_converter->createReader(); - } - } + if(m_specs.format != AUD_FORMAT_FLOAT32) + reader = new AUD_ConverterReader(reader, m_specs); ALenum format; - if(valid) - valid = getFormat(format, specs.specs); - - if(!valid) + if(!getFormat(format, specs.specs)) { - delete reader; AUD_DELETE("reader") + delete reader; return false; } @@ -1052,7 +1003,6 @@ bool AUD_OpenALDevice::setCapability(int capability, void *value) alcSuspendContext(m_context); AUD_OpenALBufferedFactory* bf = new AUD_OpenALBufferedFactory; - AUD_NEW("bufferedfactory"); bf->factory = factory; try @@ -1073,16 +1023,16 @@ bool AUD_OpenALDevice::setCapability(int capability, void *value) if(alGetError() != AL_NO_ERROR) AUD_THROW(AUD_ERROR_OPENAL); } - catch(AUD_Exception) + catch(AUD_Exception&) { alDeleteBuffers(1, &bf->buffer); throw; } } - catch(AUD_Exception) + catch(AUD_Exception&) { - delete bf; AUD_DELETE("bufferedfactory") - delete reader; AUD_DELETE("reader") + delete bf; + delete reader; alcProcessContext(m_context); unlock(); return false; @@ -1116,7 +1066,6 @@ bool AUD_OpenALDevice::setCapability(int capability, void *value) alDeleteBuffers(1, &(*(m_bufferedFactories->begin()))->buffer); delete *m_bufferedFactories->begin(); - AUD_DELETE("bufferedfactory"); m_bufferedFactories->erase(m_bufferedFactories->begin()); } unlock(); diff --git a/intern/audaspace/OpenAL/AUD_OpenALDevice.h b/intern/audaspace/OpenAL/AUD_OpenALDevice.h index cb8c83ab810..c36f89209d3 100644 --- a/intern/audaspace/OpenAL/AUD_OpenALDevice.h +++ b/intern/audaspace/OpenAL/AUD_OpenALDevice.h @@ -30,7 +30,6 @@ #include "AUD_I3DDevice.h" struct AUD_OpenALHandle; struct AUD_OpenALBufferedFactory; -class AUD_ConverterFactory; #include #include @@ -63,11 +62,6 @@ private: */ bool m_useMC; - /** - * The converter factory for readers with wrong input format. - */ - AUD_ConverterFactory* m_converter; - /** * The list of sounds that are currently playing. */ @@ -123,6 +117,10 @@ private: */ bool getFormat(ALenum &format, AUD_Specs specs); + // hide copy constructor and operator= + AUD_OpenALDevice(const AUD_OpenALDevice&); + AUD_OpenALDevice& operator=(const AUD_OpenALDevice&); + public: /** * Opens the OpenAL audio device for playback. @@ -142,13 +140,12 @@ public: virtual ~AUD_OpenALDevice(); - virtual AUD_DeviceSpecs getSpecs(); + virtual AUD_DeviceSpecs getSpecs() const; virtual AUD_Handle* play(AUD_IFactory* factory, bool keep = false); virtual bool pause(AUD_Handle* handle); virtual bool resume(AUD_Handle* handle); virtual bool stop(AUD_Handle* handle); virtual bool setKeep(AUD_Handle* handle, bool keep); - virtual bool sendMessage(AUD_Handle* handle, AUD_Message &message); virtual bool seek(AUD_Handle* handle, float position); virtual float getPosition(AUD_Handle* handle); virtual AUD_Status getStatus(AUD_Handle* handle); diff --git a/intern/audaspace/Python/AUD_PyAPI.cpp b/intern/audaspace/Python/AUD_PyAPI.cpp index f1c41bf2009..30e4bf5b9fd 100644 --- a/intern/audaspace/Python/AUD_PyAPI.cpp +++ b/intern/audaspace/Python/AUD_PyAPI.cpp @@ -425,10 +425,10 @@ static PyTypeObject SoundType = { static PyObject * Sound_sine(PyObject* nothing, PyObject* args) { - double frequency; + float frequency; int rate = 44100; - if(!PyArg_ParseTuple(args, "d|i", &frequency, &rate)) + if(!PyArg_ParseTuple(args, "f|i", &frequency, &rate)) return NULL; Sound *self; @@ -1266,13 +1266,14 @@ Handle_set_loop_count(Handle *self, PyObject* args, void* nothing) try { + /* AUD_XXX Doesn't work atm, will come back AUD_Message message; message.loopcount = loops; message.type = AUD_MSG_LOOP; if(device->device->sendMessage(self->handle, message)) { return 0; - } + }*/ } catch(AUD_Exception&) { diff --git a/intern/audaspace/SDL/AUD_SDLDevice.h b/intern/audaspace/SDL/AUD_SDLDevice.h index 4b7de1996e8..af713b27480 100644 --- a/intern/audaspace/SDL/AUD_SDLDevice.h +++ b/intern/audaspace/SDL/AUD_SDLDevice.h @@ -44,6 +44,10 @@ private: */ static void SDL_mix(void *data, Uint8* buffer, int length); + // hide copy constructor and operator= + AUD_SDLDevice(const AUD_SDLDevice&); + AUD_SDLDevice& operator=(const AUD_SDLDevice&); + protected: virtual void playing(bool playing); 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_ResampleFactory(factory, specs) +{ +} -AUD_SRCResampleFactory::AUD_SRCResampleFactory(AUD_DeviceSpecs specs) : - AUD_ResampleFactory(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 { -public: - AUD_SRCResampleFactory(AUD_IReader* reader, AUD_DeviceSpecs specs); - AUD_SRCResampleFactory(AUD_IFactory* factory, AUD_DeviceSpecs specs); - AUD_SRCResampleFactory(AUD_DeviceSpecs specs); +private: + // hide copy constructor and operator= + AUD_SRCResampleFactory(const AUD_SRCResampleFactory&); + AUD_SRCResampleFactory& operator=(const AUD_SRCResampleFactory&); - virtual AUD_IReader* createReader(); +public: + AUD_SRCResampleFactory(AUD_IFactory* factory, AUD_DeviceSpecs specs); + + 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..553a020e76d 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 #include @@ -37,14 +36,13 @@ static long src_callback(void *cb_data, float **data) 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 +54,19 @@ AUD_SRCResampleReader::AUD_SRCResampleReader(AUD_IReader* reader, if(!m_src) { // XXX printf("%s\n", src_strerror(error)); - delete m_reader; AUD_DELETE("reader") + delete m_reader; AUD_THROW(AUD_ERROR_READER); } - - 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 +82,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 +101,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 @@ -37,26 +37,26 @@ class AUD_Buffer; 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. */ AUD_Specs m_tspecs; - /** - * The sample specification of the source. - */ - AUD_Specs m_sspecs; - /** * The src state structure. */ @@ -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); }; diff --git a/intern/audaspace/ffmpeg/AUD_FFMPEGFactory.cpp b/intern/audaspace/ffmpeg/AUD_FFMPEGFactory.cpp index 8e71c97baec..cad64d70790 100644 --- a/intern/audaspace/ffmpeg/AUD_FFMPEGFactory.cpp +++ b/intern/audaspace/ffmpeg/AUD_FFMPEGFactory.cpp @@ -24,45 +24,29 @@ */ // needed for INT64_C +#ifndef __STDC_CONSTANT_MACROS #define __STDC_CONSTANT_MACROS +#endif #include "AUD_FFMPEGFactory.h" #include "AUD_FFMPEGReader.h" #include "AUD_Buffer.h" -AUD_FFMPEGFactory::AUD_FFMPEGFactory(const char* filename) +AUD_FFMPEGFactory::AUD_FFMPEGFactory(std::string filename) : + m_filename(filename) { - if(filename != NULL) - { - m_filename = new char[strlen(filename)+1]; AUD_NEW("string") - strcpy(m_filename, filename); - } - else - m_filename = NULL; } -AUD_FFMPEGFactory::AUD_FFMPEGFactory(unsigned char* buffer, int size) +AUD_FFMPEGFactory::AUD_FFMPEGFactory(const data_t* buffer, int size) : + m_buffer(new AUD_Buffer(size)) { - m_filename = NULL; - m_buffer = AUD_Reference(new AUD_Buffer(size)); memcpy(m_buffer.get()->getBuffer(), buffer, size); } -AUD_FFMPEGFactory::~AUD_FFMPEGFactory() +AUD_IReader* AUD_FFMPEGFactory::createReader() const { - if(m_filename) - { - delete[] m_filename; AUD_DELETE("string") - } -} - -AUD_IReader* AUD_FFMPEGFactory::createReader() -{ - AUD_IReader* reader; - if(m_filename) - reader = new AUD_FFMPEGReader(m_filename); + if(m_buffer.get()) + return new AUD_FFMPEGReader(m_buffer); else - reader = new AUD_FFMPEGReader(m_buffer); - AUD_NEW("reader") - return reader; + return new AUD_FFMPEGReader(m_filename); } diff --git a/intern/audaspace/ffmpeg/AUD_FFMPEGFactory.h b/intern/audaspace/ffmpeg/AUD_FFMPEGFactory.h index 22560303a73..43a6ce68ca7 100644 --- a/intern/audaspace/ffmpeg/AUD_FFMPEGFactory.h +++ b/intern/audaspace/ffmpeg/AUD_FFMPEGFactory.h @@ -30,6 +30,8 @@ #include "AUD_Reference.h" class AUD_Buffer; +#include + /** * This factory reads a sound file via ffmpeg. * \warning Notice that the needed formats and codecs have to be registered @@ -41,33 +43,32 @@ private: /** * The filename of the sound source file. */ - char* m_filename; + const std::string m_filename; /** * The buffer to read from. */ AUD_Reference m_buffer; + // hide copy constructor and operator= + AUD_FFMPEGFactory(const AUD_FFMPEGFactory&); + AUD_FFMPEGFactory& operator=(const AUD_FFMPEGFactory&); + public: /** * Creates a new factory. * \param filename The sound file path. */ - AUD_FFMPEGFactory(const char* filename); + AUD_FFMPEGFactory(std::string filename); /** * Creates a new factory. * \param buffer The buffer to read from. * \param size The size of the buffer. */ - AUD_FFMPEGFactory(unsigned char* buffer, int size); + AUD_FFMPEGFactory(const data_t* buffer, int size); - /** - * Destroys the factory. - */ - ~AUD_FFMPEGFactory(); - - virtual AUD_IReader* createReader(); + virtual AUD_IReader* createReader() const; }; #endif //AUD_FFMPEGFACTORY diff --git a/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp b/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp index 313ea52e892..717838bc982 100644 --- a/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp +++ b/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp @@ -24,23 +24,24 @@ */ // needed for INT64_C +#ifndef __STDC_CONSTANT_MACROS #define __STDC_CONSTANT_MACROS +#endif #include "AUD_FFMPEGReader.h" -#include "AUD_Buffer.h" extern "C" { #include #include } -int AUD_FFMPEGReader::decode(AVPacket* packet, AUD_Buffer* buffer) +int AUD_FFMPEGReader::decode(AVPacket* packet, AUD_Buffer& buffer) { // save packet parameters uint8_t *audio_pkg_data = packet->data; int audio_pkg_size = packet->size; - int buf_size = buffer->getSize(); + int buf_size = buffer.getSize(); int buf_pos = 0; int read_length, data_size; @@ -51,21 +52,16 @@ int AUD_FFMPEGReader::decode(AVPacket* packet, AUD_Buffer* buffer) // resize buffer if needed if(buf_size - buf_pos < AVCODEC_MAX_AUDIO_FRAME_SIZE) { - buffer->resize(buf_size + AVCODEC_MAX_AUDIO_FRAME_SIZE, true); + buffer.resize(buf_size + AVCODEC_MAX_AUDIO_FRAME_SIZE, true); buf_size += AVCODEC_MAX_AUDIO_FRAME_SIZE; } // read samples from the packet data_size = buf_size - buf_pos; - /*read_length = avcodec_decode_audio3(m_codecCtx, - (int16_t*)(((data_t*)buffer->getBuffer())+buf_pos), + read_length = avcodec_decode_audio3(m_codecCtx, + (int16_t*)(((data_t*)buffer.getBuffer())+buf_pos), &data_size, - packet);*/ - read_length = avcodec_decode_audio2(m_codecCtx, - (int16_t*)(((data_t*)buffer->getBuffer())+buf_pos), - &data_size, - audio_pkg_data, - audio_pkg_size); + packet); // read error, next packet! if(read_length < 0) @@ -93,12 +89,15 @@ void AUD_FFMPEGReader::init() m_stream = -1; for(unsigned int i = 0; i < m_formatCtx->nb_streams; i++) + { if((m_formatCtx->streams[i]->codec->codec_type == CODEC_TYPE_AUDIO) && (m_stream < 0)) { m_stream=i; break; } + } + if(m_stream == -1) AUD_THROW(AUD_ERROR_FFMPEG); @@ -144,41 +143,39 @@ void AUD_FFMPEGReader::init() } m_specs.rate = (AUD_SampleRate) m_codecCtx->sample_rate; - - // last but not least if there hasn't been any error, create the buffers - m_buffer = new AUD_Buffer(); AUD_NEW("buffer") - m_pkgbuf = new AUD_Buffer(AVCODEC_MAX_AUDIO_FRAME_SIZE<<1); - AUD_NEW("buffer") } -AUD_FFMPEGReader::AUD_FFMPEGReader(const char* filename) +AUD_FFMPEGReader::AUD_FFMPEGReader(std::string filename) : + m_pkgbuf(AVCODEC_MAX_AUDIO_FRAME_SIZE<<1), + m_byteiocontext(NULL) { - m_byteiocontext = NULL; - // open file - if(av_open_input_file(&m_formatCtx, filename, NULL, 0, NULL)!=0) + if(av_open_input_file(&m_formatCtx, filename.c_str(), NULL, 0, NULL)!=0) AUD_THROW(AUD_ERROR_FILE); try { init(); } - catch(AUD_Exception) + catch(AUD_Exception&) { av_close_input_file(m_formatCtx); throw; } } -AUD_FFMPEGReader::AUD_FFMPEGReader(AUD_Reference buffer) +AUD_FFMPEGReader::AUD_FFMPEGReader(AUD_Reference buffer) : + m_pkgbuf(AVCODEC_MAX_AUDIO_FRAME_SIZE<<1), + m_membuffer(buffer) { m_byteiocontext = (ByteIOContext*)av_mallocz(sizeof(ByteIOContext)); - AUD_NEW("byteiocontext") - m_membuffer = buffer; if(init_put_byte(m_byteiocontext, (data_t*)buffer.get()->getBuffer(), buffer.get()->getSize(), 0, NULL, NULL, NULL, NULL) != 0) + { + av_free(m_byteiocontext); AUD_THROW(AUD_ERROR_FILE); + } AVProbeData probe_data; probe_data.filename = ""; @@ -188,16 +185,19 @@ AUD_FFMPEGReader::AUD_FFMPEGReader(AUD_Reference buffer) // open stream if(av_open_input_stream(&m_formatCtx, m_byteiocontext, "", fmt, NULL)!=0) + { + av_free(m_byteiocontext); AUD_THROW(AUD_ERROR_FILE); + } try { init(); } - catch(AUD_Exception) + catch(AUD_Exception&) { av_close_input_stream(m_formatCtx); - av_free(m_byteiocontext); AUD_DELETE("byteiocontext") + av_free(m_byteiocontext); throw; } } @@ -209,16 +209,13 @@ AUD_FFMPEGReader::~AUD_FFMPEGReader() if(m_byteiocontext) { av_close_input_stream(m_formatCtx); - av_free(m_byteiocontext); AUD_DELETE("byteiocontext") + av_free(m_byteiocontext); } else av_close_input_file(m_formatCtx); - - delete m_buffer; AUD_DELETE("buffer") - delete m_pkgbuf; AUD_DELETE("buffer") } -bool AUD_FFMPEGReader::isSeekable() +bool AUD_FFMPEGReader::isSeekable() const { return true; } @@ -260,9 +257,17 @@ void AUD_FFMPEGReader::seek(int position) if(m_position < position) { - sample_t* buf; - int length = position - m_position; - read(length, buf); + // read until we're at the right position + int length = AUD_DEFAULT_BUFFER_SIZE; + sample_t* buffer; + for(int len = position - m_position; + length == AUD_DEFAULT_BUFFER_SIZE; + len -= AUD_DEFAULT_BUFFER_SIZE) + { + if(len < AUD_DEFAULT_BUFFER_SIZE) + length = len; + read(length, buffer); + } } } } @@ -276,33 +281,23 @@ void AUD_FFMPEGReader::seek(int position) } } -int AUD_FFMPEGReader::getLength() +int AUD_FFMPEGReader::getLength() const { // return approximated remaning size return (int)((m_formatCtx->duration * m_codecCtx->sample_rate) / AV_TIME_BASE)-m_position; } -int AUD_FFMPEGReader::getPosition() +int AUD_FFMPEGReader::getPosition() const { return m_position; } -AUD_Specs AUD_FFMPEGReader::getSpecs() +AUD_Specs AUD_FFMPEGReader::getSpecs() const { return m_specs.specs; } -AUD_ReaderType AUD_FFMPEGReader::getType() -{ - return AUD_TYPE_STREAM; -} - -bool AUD_FFMPEGReader::notify(AUD_Message &message) -{ - return false; -} - void AUD_FFMPEGReader::read(int & length, sample_t* & buffer) { // read packages and decode them @@ -313,10 +308,10 @@ void AUD_FFMPEGReader::read(int & length, sample_t* & buffer) int sample_size = AUD_DEVICE_SAMPLE_SIZE(m_specs); // resize output buffer if necessary - if(m_buffer->getSize() < length * AUD_SAMPLE_SIZE(m_specs)) - m_buffer->resize(length * AUD_SAMPLE_SIZE(m_specs)); + if(m_buffer.getSize() < length * AUD_SAMPLE_SIZE(m_specs)) + m_buffer.resize(length * AUD_SAMPLE_SIZE(m_specs)); - buffer = m_buffer->getBuffer(); + buffer = m_buffer.getBuffer(); pkgbuf_pos = m_pkgbuf_left; m_pkgbuf_left = 0; @@ -324,7 +319,7 @@ void AUD_FFMPEGReader::read(int & length, sample_t* & buffer) if(pkgbuf_pos > 0) { data_size = AUD_MIN(pkgbuf_pos, left * sample_size); - m_convert((data_t*) buffer, (data_t*) m_pkgbuf->getBuffer(), + m_convert((data_t*) buffer, (data_t*) m_pkgbuf.getBuffer(), data_size / AUD_FORMAT_SIZE(m_specs.format)); buffer += data_size / AUD_FORMAT_SIZE(m_specs.format); left -= data_size/sample_size; @@ -341,7 +336,7 @@ void AUD_FFMPEGReader::read(int & length, sample_t* & buffer) // copy to output buffer data_size = AUD_MIN(pkgbuf_pos, left * sample_size); - m_convert((data_t*) buffer, (data_t*) m_pkgbuf->getBuffer(), + m_convert((data_t*) buffer, (data_t*) m_pkgbuf.getBuffer(), data_size / AUD_FORMAT_SIZE(m_specs.format)); buffer += data_size / AUD_FORMAT_SIZE(m_specs.format); left -= data_size/sample_size; @@ -352,12 +347,12 @@ void AUD_FFMPEGReader::read(int & length, sample_t* & buffer) if(pkgbuf_pos > data_size) { m_pkgbuf_left = pkgbuf_pos-data_size; - memmove(m_pkgbuf->getBuffer(), - ((data_t*)m_pkgbuf->getBuffer())+data_size, + memmove(m_pkgbuf.getBuffer(), + ((data_t*)m_pkgbuf.getBuffer())+data_size, pkgbuf_pos-data_size); } - buffer = m_buffer->getBuffer(); + buffer = m_buffer.getBuffer(); if(left > 0) length -= left; diff --git a/intern/audaspace/ffmpeg/AUD_FFMPEGReader.h b/intern/audaspace/ffmpeg/AUD_FFMPEGReader.h index f992fdf7a34..8ebf5b45cdc 100644 --- a/intern/audaspace/ffmpeg/AUD_FFMPEGReader.h +++ b/intern/audaspace/ffmpeg/AUD_FFMPEGReader.h @@ -29,7 +29,9 @@ #include "AUD_ConverterFunctions.h" #include "AUD_IReader.h" #include "AUD_Reference.h" -class AUD_Buffer; +#include "AUD_Buffer.h" + +#include struct AVCodecContext; extern "C" { @@ -55,7 +57,7 @@ private: /** * The playback buffer. */ - AUD_Buffer *m_buffer; + AUD_Buffer m_buffer; /** * The specification of the audio data. @@ -65,7 +67,7 @@ private: /** * The buffer for package reading. */ - AUD_Buffer *m_pkgbuf; + AUD_Buffer m_pkgbuf; /** * The count of samples still available from the last read package. @@ -108,13 +110,17 @@ private: * \param buffer The target buffer. * \return The count of read bytes. */ - int decode(AVPacket* packet, AUD_Buffer* buffer); + int decode(AVPacket* packet, AUD_Buffer& buffer); /** * Initializes the object. */ void init(); + // hide copy constructor and operator= + AUD_FFMPEGReader(const AUD_FFMPEGReader&); + AUD_FFMPEGReader& operator=(const AUD_FFMPEGReader&); + public: /** * Creates a new reader. @@ -122,7 +128,7 @@ public: * \exception AUD_Exception Thrown if the file specified does not exist or * cannot be read with ffmpeg. */ - AUD_FFMPEGReader(const char* filename); + AUD_FFMPEGReader(std::string filename); /** * Creates a new reader. @@ -137,13 +143,11 @@ public: */ virtual ~AUD_FFMPEGReader(); - virtual bool isSeekable(); + virtual bool isSeekable() const; virtual void seek(int position); - virtual int getLength(); - virtual int getPosition(); - virtual AUD_Specs getSpecs(); - virtual AUD_ReaderType getType(); - virtual bool notify(AUD_Message &message); + virtual int getLength() const; + virtual int getPosition() const; + virtual AUD_Specs getSpecs() const; virtual void read(int & length, sample_t* & buffer); }; diff --git a/intern/audaspace/fftw/AUD_BandPassReader.h b/intern/audaspace/fftw/AUD_BandPassReader.h index 7a8fd3b94d5..bb63a3ec818 100644 --- a/intern/audaspace/fftw/AUD_BandPassReader.h +++ b/intern/audaspace/fftw/AUD_BandPassReader.h @@ -83,7 +83,6 @@ public: * \param reader The reader to read from. * \param low The lowest passed frequency. * \param high The highest passed frequency. - * \exception AUD_Exception Thrown if the reader specified is NULL. */ AUD_BandPassReader(AUD_IReader* reader, float low, float high); diff --git a/intern/audaspace/intern/AUD_Buffer.cpp b/intern/audaspace/intern/AUD_Buffer.cpp index a8e74a023bf..11eed399ca5 100644 --- a/intern/audaspace/intern/AUD_Buffer.cpp +++ b/intern/audaspace/intern/AUD_Buffer.cpp @@ -34,34 +34,37 @@ AUD_Buffer::AUD_Buffer(int size) { m_size = size; - m_buffer = (data_t*) malloc(size+16); AUD_NEW("buffer") + m_buffer = (data_t*) malloc(size+16); } AUD_Buffer::~AUD_Buffer() { - free(m_buffer); AUD_DELETE("buffer") + free(m_buffer); } -sample_t* AUD_Buffer::getBuffer() +sample_t* AUD_Buffer::getBuffer() const { return (sample_t*) AUD_ALIGN(m_buffer); } -int AUD_Buffer::getSize() +int AUD_Buffer::getSize() const { return m_size; } void AUD_Buffer::resize(int size, bool keep) { - data_t* buffer = (data_t*) malloc(size+16); AUD_NEW("buffer") - - // copy old data over if wanted if(keep) + { + data_t* buffer = (data_t*) malloc(size + 16); + memcpy(AUD_ALIGN(buffer), AUD_ALIGN(m_buffer), AUD_MIN(size, m_size)); - free(m_buffer); AUD_DELETE("buffer") + free(m_buffer); + m_buffer = buffer; + } + else + m_buffer = (data_t*) realloc(m_buffer, size + 16); - m_buffer = buffer; m_size = size; } diff --git a/intern/audaspace/intern/AUD_Buffer.h b/intern/audaspace/intern/AUD_Buffer.h index f745ee6154b..b3889b35ffe 100644 --- a/intern/audaspace/intern/AUD_Buffer.h +++ b/intern/audaspace/intern/AUD_Buffer.h @@ -41,6 +41,10 @@ private: /// The pointer to the buffer memory. data_t* m_buffer; + // hide copy constructor and operator= + AUD_Buffer(const AUD_Buffer&); + AUD_Buffer& operator=(const AUD_Buffer&); + public: /** * Creates a new buffer. @@ -56,12 +60,12 @@ public: /** * Returns the pointer to the buffer in memory. */ - sample_t* getBuffer(); + sample_t* getBuffer() const; /** * Returns the size of the buffer in bytes. */ - int getSize(); + int getSize() const; /** * Resizes the buffer. diff --git a/intern/audaspace/intern/AUD_BufferReader.cpp b/intern/audaspace/intern/AUD_BufferReader.cpp index 0101de338bd..d3af549a868 100644 --- a/intern/audaspace/intern/AUD_BufferReader.cpp +++ b/intern/audaspace/intern/AUD_BufferReader.cpp @@ -28,53 +28,36 @@ #include "AUD_Space.h" AUD_BufferReader::AUD_BufferReader(AUD_Reference buffer, - AUD_Specs specs) + AUD_Specs specs) : + m_position(0), m_buffer(buffer), m_specs(specs) { - m_position = 0; - m_buffer = buffer; - m_specs = specs; } -bool AUD_BufferReader::isSeekable() +bool AUD_BufferReader::isSeekable() const { return true; } void AUD_BufferReader::seek(int position) { - if(position < 0) - m_position = 0; - else if(position > m_buffer.get()->getSize() / AUD_SAMPLE_SIZE(m_specs)) - m_position = m_buffer.get()->getSize() / AUD_SAMPLE_SIZE(m_specs); - else - m_position = position; + m_position = position; } -int AUD_BufferReader::getLength() +int AUD_BufferReader::getLength() const { - return m_buffer.get()->getSize()/AUD_SAMPLE_SIZE(m_specs); + return m_buffer.get()->getSize() / AUD_SAMPLE_SIZE(m_specs); } -int AUD_BufferReader::getPosition() +int AUD_BufferReader::getPosition() const { return m_position; } -AUD_Specs AUD_BufferReader::getSpecs() +AUD_Specs AUD_BufferReader::getSpecs() const { return m_specs; } -AUD_ReaderType AUD_BufferReader::getType() -{ - return AUD_TYPE_BUFFER; -} - -bool AUD_BufferReader::notify(AUD_Message &message) -{ - return false; -} - void AUD_BufferReader::read(int & length, sample_t* & buffer) { int sample_size = AUD_SAMPLE_SIZE(m_specs); diff --git a/intern/audaspace/intern/AUD_BufferReader.h b/intern/audaspace/intern/AUD_BufferReader.h index f2d8ff6b57d..a8bd89060b0 100644 --- a/intern/audaspace/intern/AUD_BufferReader.h +++ b/intern/audaspace/intern/AUD_BufferReader.h @@ -53,6 +53,10 @@ private: */ AUD_Specs m_specs; + // hide copy constructor and operator= + AUD_BufferReader(const AUD_BufferReader&); + AUD_BufferReader& operator=(const AUD_BufferReader&); + public: /** * Creates a new buffer reader. @@ -61,13 +65,11 @@ public: */ AUD_BufferReader(AUD_Reference buffer, AUD_Specs specs); - virtual bool isSeekable(); + virtual bool isSeekable() const; virtual void seek(int position); - virtual int getLength(); - virtual int getPosition(); - virtual AUD_Specs getSpecs(); - virtual AUD_ReaderType getType(); - virtual bool notify(AUD_Message &message); + virtual int getLength() const; + virtual int getPosition() const; + virtual AUD_Specs getSpecs() const; virtual void read(int & length, sample_t* & buffer); }; diff --git a/intern/audaspace/intern/AUD_C-API.cpp b/intern/audaspace/intern/AUD_C-API.cpp index eb0e4fba8e9..905212531d1 100644 --- a/intern/audaspace/intern/AUD_C-API.cpp +++ b/intern/audaspace/intern/AUD_C-API.cpp @@ -155,7 +155,7 @@ int AUD_init(AUD_DeviceType device, AUD_DeviceSpecs specs, int buffersize) return true; } - catch(AUD_Exception) + catch(AUD_Exception&) { return false; } @@ -284,7 +284,7 @@ AUD_Sound* AUD_bufferSound(AUD_Sound* sound) { return new AUD_StreamBufferFactory(sound); } - catch(AUD_Exception) + catch(AUD_Exception&) { return NULL; } @@ -298,7 +298,7 @@ AUD_Sound* AUD_delaySound(AUD_Sound* sound, float delay) { return new AUD_DelayFactory(sound, delay); } - catch(AUD_Exception) + catch(AUD_Exception&) { return NULL; } @@ -312,7 +312,7 @@ AUD_Sound* AUD_limitSound(AUD_Sound* sound, float start, float end) { return new AUD_LimiterFactory(sound, start, end); } - catch(AUD_Exception) + catch(AUD_Exception&) { return NULL; } @@ -326,7 +326,7 @@ AUD_Sound* AUD_pingpongSound(AUD_Sound* sound) { return new AUD_PingPongFactory(sound); } - catch(AUD_Exception) + catch(AUD_Exception&) { return NULL; } @@ -340,7 +340,7 @@ AUD_Sound* AUD_loopSound(AUD_Sound* sound) { return new AUD_LoopFactory(sound); } - catch(AUD_Exception) + catch(AUD_Exception&) { return NULL; } @@ -350,6 +350,8 @@ int AUD_setLoop(AUD_Channel* handle, int loops, float time) { if(handle) { + /* AUD_XXX Doesn't work atm, will come back + AUD_Message message; message.type = AUD_MSG_LOOP; message.loopcount = loops; @@ -359,9 +361,9 @@ int AUD_setLoop(AUD_Channel* handle, int loops, float time) { return AUD_device->sendMessage(handle, message); } - catch(AUD_Exception) + catch(AUD_Exception&) { - } + }*/ } return false; } @@ -374,7 +376,7 @@ AUD_Sound* AUD_rectifySound(AUD_Sound* sound) { return new AUD_RectifyFactory(sound); } - catch(AUD_Exception) + catch(AUD_Exception&) { return NULL; } @@ -394,7 +396,7 @@ AUD_Channel* AUD_play(AUD_Sound* sound, int keep) { return AUD_device->play(sound, keep); } - catch(AUD_Exception) + catch(AUD_Exception&) { return NULL; } @@ -455,7 +457,7 @@ AUD_Channel* AUD_play3D(AUD_Sound* sound, int keep) else return AUD_device->play(sound, keep); } - catch(AUD_Exception) + catch(AUD_Exception&) { return NULL; } @@ -471,7 +473,7 @@ int AUD_updateListener(AUD_3DData* data) if(AUD_3ddevice) return AUD_3ddevice->updateListener(*data); } - catch(AUD_Exception) + catch(AUD_Exception&) { } return false; @@ -486,7 +488,7 @@ int AUD_set3DSetting(AUD_3DSetting setting, float value) if(AUD_3ddevice) return AUD_3ddevice->setSetting(setting, value); } - catch(AUD_Exception) + catch(AUD_Exception&) { } return false; @@ -501,7 +503,7 @@ float AUD_get3DSetting(AUD_3DSetting setting) if(AUD_3ddevice) return AUD_3ddevice->getSetting(setting); } - catch(AUD_Exception) + catch(AUD_Exception&) { } return 0.0f; @@ -519,7 +521,7 @@ int AUD_update3DSource(AUD_Channel* handle, AUD_3DData* data) if(AUD_3ddevice) return AUD_3ddevice->updateSource(handle, *data); } - catch(AUD_Exception) + catch(AUD_Exception&) { } } @@ -538,7 +540,7 @@ int AUD_set3DSourceSetting(AUD_Channel* handle, if(AUD_3ddevice) return AUD_3ddevice->setSourceSetting(handle, setting, value); } - catch(AUD_Exception) + catch(AUD_Exception&) { } } @@ -556,7 +558,7 @@ float AUD_get3DSourceSetting(AUD_Channel* handle, AUD_3DSourceSetting setting) if(AUD_3ddevice) return AUD_3ddevice->getSourceSetting(handle, setting); } - catch(AUD_Exception) + catch(AUD_Exception&) { } } @@ -576,7 +578,7 @@ int AUD_setSoundVolume(AUD_Channel* handle, float volume) { return AUD_device->setCapability(AUD_CAPS_SOURCE_VOLUME, &caps); } - catch(AUD_Exception) {} + catch(AUD_Exception&) {} } return false; } @@ -594,7 +596,7 @@ int AUD_setSoundPitch(AUD_Channel* handle, float pitch) { return AUD_device->setCapability(AUD_CAPS_SOURCE_PITCH, &caps); } - catch(AUD_Exception) {} + catch(AUD_Exception&) {} } return false; } @@ -605,7 +607,7 @@ AUD_Device* AUD_openReadDevice(AUD_DeviceSpecs specs) { return new AUD_ReadDevice(specs); } - catch(AUD_Exception) + catch(AUD_Exception&) { return NULL; } @@ -622,7 +624,7 @@ AUD_Channel* AUD_playDevice(AUD_Device* device, AUD_Sound* sound, float seek) device->seek(handle, seek); return handle; } - catch(AUD_Exception) + catch(AUD_Exception&) { return NULL; } @@ -636,7 +638,7 @@ int AUD_setDeviceVolume(AUD_Device* device, float volume) { return device->setCapability(AUD_CAPS_VOLUME, &volume); } - catch(AUD_Exception) {} + catch(AUD_Exception&) {} return false; } @@ -655,7 +657,7 @@ int AUD_setDeviceSoundVolume(AUD_Device* device, AUD_Channel* handle, { return device->setCapability(AUD_CAPS_SOURCE_VOLUME, &caps); } - catch(AUD_Exception) {} + catch(AUD_Exception&) {} } return false; } @@ -669,7 +671,7 @@ int AUD_readDevice(AUD_Device* device, data_t* buffer, int length) { return device->read(buffer, length); } - catch(AUD_Exception) + catch(AUD_Exception&) { return false; } @@ -683,7 +685,7 @@ void AUD_closeReadDevice(AUD_Device* device) { delete device; } - catch(AUD_Exception) + catch(AUD_Exception&) { } } @@ -782,23 +784,16 @@ void AUD_muteSequencer(AUD_Sound* sequencer, AUD_SequencerEntry* entry, char mut int AUD_readSound(AUD_Sound* sound, sample_t* buffer, int length) { - AUD_IReader* reader = sound->createReader(); AUD_DeviceSpecs specs; sample_t* buf; - specs.specs = reader->getSpecs(); + specs.rate = AUD_RATE_INVALID; specs.channels = AUD_CHANNELS_MONO; - specs.format = AUD_FORMAT_FLOAT32; + specs.format = AUD_FORMAT_INVALID; - AUD_ChannelMapperFactory mapper(reader, specs); + AUD_ChannelMapperFactory mapper(sound, specs); - if(!reader || reader->getType() != AUD_TYPE_BUFFER) - return -1; - - reader = mapper.createReader(); - - if(!reader) - return -1; + AUD_IReader* reader = mapper.createReader(); int len = reader->getLength(); float samplejump = (float)len / (float)length; @@ -827,7 +822,7 @@ int AUD_readSound(AUD_Sound* sound, sample_t* buffer, int length) } } - delete reader; AUD_DELETE("reader") + delete reader; return length; } @@ -894,16 +889,3 @@ int AUD_doesPlayback() #endif return -1; } - -#ifdef AUD_DEBUG_MEMORY -int AUD_References(int count, const char* text) -{ - static int m_count = 0; - m_count += count; - if(count > 0) - printf("+%s\n", text); - if(count < 0) - printf("-%s\n", text); - return m_count; -} -#endif diff --git a/intern/audaspace/intern/AUD_ChannelMapperFactory.cpp b/intern/audaspace/intern/AUD_ChannelMapperFactory.cpp index 3420ed16649..b3d5434b1e3 100644 --- a/intern/audaspace/intern/AUD_ChannelMapperFactory.cpp +++ b/intern/audaspace/intern/AUD_ChannelMapperFactory.cpp @@ -28,13 +28,6 @@ #include -AUD_ChannelMapperFactory::AUD_ChannelMapperFactory(AUD_IReader* reader, - AUD_DeviceSpecs specs) : - AUD_MixerFactory(reader, specs) -{ - memset(m_mapping, 0, sizeof(m_mapping)); -} - AUD_ChannelMapperFactory::AUD_ChannelMapperFactory(AUD_IFactory* factory, AUD_DeviceSpecs specs) : AUD_MixerFactory(factory, specs) @@ -42,12 +35,6 @@ AUD_ChannelMapperFactory::AUD_ChannelMapperFactory(AUD_IFactory* factory, memset(m_mapping, 0, sizeof(m_mapping)); } -AUD_ChannelMapperFactory::AUD_ChannelMapperFactory(AUD_DeviceSpecs specs) : - AUD_MixerFactory(specs) -{ - memset(m_mapping, 0, sizeof(m_mapping)); -} - AUD_ChannelMapperFactory::~AUD_ChannelMapperFactory() { for(int i = 1; i < 10; i++) @@ -72,12 +59,12 @@ float** AUD_ChannelMapperFactory::getMapping(int ic) { int channels = m_specs.channels; - m_mapping[ic] = new float*[channels+1]; AUD_NEW("mapping") + m_mapping[ic] = new float*[channels+1]; m_mapping[ic][channels] = 0; for(int i = 0; i < channels; i++) { - m_mapping[ic][i] = new float[ic+1]; AUD_NEW("mapping") + m_mapping[ic][i] = new float[ic+1]; for(int j = 0; j <= ic; j++) m_mapping[ic][i][j] = ((i == j) || (channels == 1) || (ic == 0)) ? 1.0f : 0.0f; @@ -99,27 +86,21 @@ void AUD_ChannelMapperFactory::deleteMapping(int ic) { if(m_mapping[ic][i] != 0) { - delete[] m_mapping[ic][i]; AUD_DELETE("mapping") + delete[] m_mapping[ic][i]; } else break; } - delete[] m_mapping[ic]; AUD_DELETE("mapping") + delete[] m_mapping[ic]; m_mapping[ic] = 0; } } -AUD_IReader* AUD_ChannelMapperFactory::createReader() +AUD_IReader* AUD_ChannelMapperFactory::createReader() const { AUD_IReader* reader = getReader(); + int ic = reader->getSpecs().channels; - if(reader != 0) - { - int ic = reader->getSpecs().channels; - - reader = new AUD_ChannelMapperReader(reader, getMapping(ic)); - AUD_NEW("reader") - } - - return reader; + return new AUD_ChannelMapperReader(reader, + const_cast(this)->getMapping(ic)); } diff --git a/intern/audaspace/intern/AUD_ChannelMapperFactory.h b/intern/audaspace/intern/AUD_ChannelMapperFactory.h index a67bfa12123..2f315874421 100644 --- a/intern/audaspace/intern/AUD_ChannelMapperFactory.h +++ b/intern/audaspace/intern/AUD_ChannelMapperFactory.h @@ -40,10 +40,12 @@ private: */ float **m_mapping[9]; + // hide copy constructor and operator= + AUD_ChannelMapperFactory(const AUD_ChannelMapperFactory&); + AUD_ChannelMapperFactory& operator=(const AUD_ChannelMapperFactory&); + public: - AUD_ChannelMapperFactory(AUD_IReader* reader, AUD_DeviceSpecs specs); AUD_ChannelMapperFactory(AUD_IFactory* factory, AUD_DeviceSpecs specs); - AUD_ChannelMapperFactory(AUD_DeviceSpecs specs); virtual ~AUD_ChannelMapperFactory(); @@ -59,7 +61,7 @@ public: */ void deleteMapping(int ic); - virtual AUD_IReader* createReader(); + virtual AUD_IReader* createReader() const; }; #endif //AUD_CHANNELMAPPERFACTORY diff --git a/intern/audaspace/intern/AUD_ChannelMapperReader.cpp b/intern/audaspace/intern/AUD_ChannelMapperReader.cpp index d78278219e8..71b9f35b3a4 100644 --- a/intern/audaspace/intern/AUD_ChannelMapperReader.cpp +++ b/intern/audaspace/intern/AUD_ChannelMapperReader.cpp @@ -24,7 +24,6 @@ */ #include "AUD_ChannelMapperReader.h" -#include "AUD_Buffer.h" AUD_ChannelMapperReader::AUD_ChannelMapperReader(AUD_IReader* reader, float **mapping) : @@ -36,7 +35,7 @@ AUD_ChannelMapperReader::AUD_ChannelMapperReader(AUD_IReader* reader, m_rch = m_specs.channels; while(mapping[++channels] != 0); - m_mapping = new float*[channels]; AUD_NEW("mapping") + m_mapping = new float*[channels]; m_specs.channels = (AUD_Channels)channels; float sum; @@ -44,7 +43,7 @@ AUD_ChannelMapperReader::AUD_ChannelMapperReader(AUD_IReader* reader, while(channels--) { - m_mapping[channels] = new float[m_rch]; AUD_NEW("mapping") + m_mapping[channels] = new float[m_rch]; sum = 0.0f; for(i=0; i < m_rch; i++) sum += mapping[channels][i]; @@ -52,8 +51,6 @@ AUD_ChannelMapperReader::AUD_ChannelMapperReader(AUD_IReader* reader, m_mapping[channels][i] = sum > 0.0f ? mapping[channels][i]/sum : 0.0f; } - - m_buffer = new AUD_Buffer(); AUD_NEW("buffer") } AUD_ChannelMapperReader::~AUD_ChannelMapperReader() @@ -62,42 +59,37 @@ AUD_ChannelMapperReader::~AUD_ChannelMapperReader() while(channels--) { - delete[] m_mapping[channels]; AUD_DELETE("mapping") + delete[] m_mapping[channels]; } - delete[] m_mapping; AUD_DELETE("mapping") - - delete m_buffer; AUD_DELETE("buffer") + delete[] m_mapping; } -AUD_Specs AUD_ChannelMapperReader::getSpecs() +AUD_Specs AUD_ChannelMapperReader::getSpecs() const { return m_specs; } void AUD_ChannelMapperReader::read(int & length, sample_t* & buffer) { - m_reader->read(length, buffer); - - int channels = m_specs.channels; - - if(m_buffer->getSize() < length * 4 * channels) - m_buffer->resize(length * 4 * channels); - sample_t* in = buffer; - sample_t* out = m_buffer->getBuffer(); + + m_reader->read(length, in); + + if(m_buffer.getSize() < length * AUD_SAMPLE_SIZE(m_specs)) + m_buffer.resize(length * AUD_SAMPLE_SIZE(m_specs)); + + buffer = m_buffer.getBuffer(); sample_t sum; for(int i = 0; i < length; i++) { - for(int j = 0; j < channels; j++) + for(int j = 0; j < m_specs.channels; j++) { sum = 0; for(int k = 0; k < m_rch; k++) sum += m_mapping[j][k] * in[i * m_rch + k]; - out[i * channels + j] = sum; + buffer[i * m_specs.channels + j] = sum; } } - - buffer = m_buffer->getBuffer(); } diff --git a/intern/audaspace/intern/AUD_ChannelMapperReader.h b/intern/audaspace/intern/AUD_ChannelMapperReader.h index fe79ab6edd6..398e14da55d 100644 --- a/intern/audaspace/intern/AUD_ChannelMapperReader.h +++ b/intern/audaspace/intern/AUD_ChannelMapperReader.h @@ -27,7 +27,7 @@ #define AUD_CHANNELMAPPERREADER #include "AUD_EffectReader.h" -class AUD_Buffer; +#include "AUD_Buffer.h" /** * This class maps a sound source's channels to a specific output channel count. @@ -39,7 +39,7 @@ private: /** * The sound output buffer. */ - AUD_Buffer *m_buffer; + AUD_Buffer m_buffer; /** * The output specification. @@ -56,20 +56,24 @@ private: */ float **m_mapping; + // hide copy constructor and operator= + AUD_ChannelMapperReader(const AUD_ChannelMapperReader&); + AUD_ChannelMapperReader& operator=(const AUD_ChannelMapperReader&); + public: /** * Creates a channel mapper reader. * \param reader The reader to map. * \param mapping The mapping specification as two dimensional float array. - * \exception AUD_Exception Thrown if the reader is NULL. */ AUD_ChannelMapperReader(AUD_IReader* reader, float **mapping); + /** * Destroys the reader. */ ~AUD_ChannelMapperReader(); - virtual AUD_Specs getSpecs(); + virtual AUD_Specs getSpecs() const; virtual void read(int & length, sample_t* & buffer); }; diff --git a/intern/audaspace/intern/AUD_ConverterFactory.cpp b/intern/audaspace/intern/AUD_ConverterFactory.cpp index 1c6d5468251..057d97fe794 100644 --- a/intern/audaspace/intern/AUD_ConverterFactory.cpp +++ b/intern/audaspace/intern/AUD_ConverterFactory.cpp @@ -26,29 +26,18 @@ #include "AUD_ConverterFactory.h" #include "AUD_ConverterReader.h" -AUD_ConverterFactory::AUD_ConverterFactory(AUD_IReader* reader, - AUD_DeviceSpecs specs) : - AUD_MixerFactory(reader, specs) {} - AUD_ConverterFactory::AUD_ConverterFactory(AUD_IFactory* factory, AUD_DeviceSpecs specs) : - AUD_MixerFactory(factory, specs) {} + AUD_MixerFactory(factory, specs) +{ +} -AUD_ConverterFactory::AUD_ConverterFactory(AUD_DeviceSpecs specs) : - AUD_MixerFactory(specs) {} - -AUD_IReader* AUD_ConverterFactory::createReader() +AUD_IReader* AUD_ConverterFactory::createReader() const { AUD_IReader* reader = getReader(); - if(reader != 0) - { - if(m_specs.format != AUD_FORMAT_FLOAT32) - { - reader = new AUD_ConverterReader(reader, m_specs); - AUD_NEW("reader") - } - } + if(m_specs.format != AUD_FORMAT_FLOAT32) + reader = new AUD_ConverterReader(reader, m_specs); return reader; } diff --git a/intern/audaspace/intern/AUD_ConverterFactory.h b/intern/audaspace/intern/AUD_ConverterFactory.h index 11ca6c9f0a8..3535616a4a6 100644 --- a/intern/audaspace/intern/AUD_ConverterFactory.h +++ b/intern/audaspace/intern/AUD_ConverterFactory.h @@ -34,12 +34,15 @@ */ class AUD_ConverterFactory : public AUD_MixerFactory { -public: - AUD_ConverterFactory(AUD_IReader* reader, AUD_DeviceSpecs specs); - AUD_ConverterFactory(AUD_IFactory* factory, AUD_DeviceSpecs specs); - AUD_ConverterFactory(AUD_DeviceSpecs specs); +private: + // hide copy constructor and operator= + AUD_ConverterFactory(const AUD_ConverterFactory&); + AUD_ConverterFactory& operator=(const AUD_ConverterFactory&); - virtual AUD_IReader* createReader(); +public: + AUD_ConverterFactory(AUD_IFactory* factory, AUD_DeviceSpecs specs); + + virtual AUD_IReader* createReader() const; }; #endif //AUD_CONVERTERFACTORY diff --git a/intern/audaspace/intern/AUD_ConverterReader.cpp b/intern/audaspace/intern/AUD_ConverterReader.cpp index 808144085bb..379a7c85851 100644 --- a/intern/audaspace/intern/AUD_ConverterReader.cpp +++ b/intern/audaspace/intern/AUD_ConverterReader.cpp @@ -24,7 +24,6 @@ */ #include "AUD_ConverterReader.h" -#include "AUD_Buffer.h" AUD_ConverterReader::AUD_ConverterReader(AUD_IReader* reader, AUD_DeviceSpecs specs) : @@ -63,16 +62,9 @@ AUD_ConverterReader::AUD_ConverterReader(AUD_IReader* reader, } m_specs.format = specs.format; - - m_buffer = new AUD_Buffer(); AUD_NEW("buffer") } -AUD_ConverterReader::~AUD_ConverterReader() -{ - delete m_buffer; AUD_DELETE("buffer") -} - -AUD_Specs AUD_ConverterReader::getSpecs() +AUD_Specs AUD_ConverterReader::getSpecs() const { return m_specs.specs; } @@ -83,11 +75,11 @@ void AUD_ConverterReader::read(int & length, sample_t* & buffer) int samplesize = AUD_SAMPLE_SIZE(m_specs); - if(m_buffer->getSize() < length*samplesize) - m_buffer->resize(length*samplesize); + if(m_buffer.getSize() < length * samplesize) + m_buffer.resize(length * samplesize); - m_convert((data_t*)m_buffer->getBuffer(), (data_t*)buffer, + m_convert((data_t*)m_buffer.getBuffer(), (data_t*)buffer, length * m_specs.channels); - buffer = m_buffer->getBuffer(); + buffer = m_buffer.getBuffer(); } diff --git a/intern/audaspace/intern/AUD_ConverterReader.h b/intern/audaspace/intern/AUD_ConverterReader.h index ba49bbfd9ba..64a46fd63e6 100644 --- a/intern/audaspace/intern/AUD_ConverterReader.h +++ b/intern/audaspace/intern/AUD_ConverterReader.h @@ -28,7 +28,7 @@ #include "AUD_EffectReader.h" #include "AUD_ConverterFunctions.h" -class AUD_Buffer; +#include "AUD_Buffer.h" /** * This class converts a sound source from one to another format. @@ -39,7 +39,7 @@ private: /** * The sound output buffer. */ - AUD_Buffer *m_buffer; + AUD_Buffer m_buffer; /** * The target specification. @@ -51,20 +51,19 @@ private: */ AUD_convert_f m_convert; + // hide copy constructor and operator= + AUD_ConverterReader(const AUD_ConverterReader&); + AUD_ConverterReader& operator=(const AUD_ConverterReader&); + public: /** * Creates a converter reader. * \param reader The reader to convert. * \param specs The target specification. - * \exception AUD_Exception Thrown if the reader is NULL. */ AUD_ConverterReader(AUD_IReader* reader, AUD_DeviceSpecs specs); - /** - * Destroys the reader. - */ - ~AUD_ConverterReader(); - virtual AUD_Specs getSpecs(); + virtual AUD_Specs getSpecs() const; virtual void read(int & length, sample_t* & buffer); }; diff --git a/intern/audaspace/intern/AUD_DefaultMixer.cpp b/intern/audaspace/intern/AUD_DefaultMixer.cpp new file mode 100644 index 00000000000..12faa10d866 --- /dev/null +++ b/intern/audaspace/intern/AUD_DefaultMixer.cpp @@ -0,0 +1,63 @@ +/* + * $Id$ + * + * ***** BEGIN LGPL LICENSE BLOCK ***** + * + * Copyright 2009 Jörg Hermann Müller + * + * This file is part of AudaSpace. + * + * AudaSpace is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * AudaSpace is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with AudaSpace. If not, see . + * + * ***** END LGPL LICENSE BLOCK ***** + */ + +#include "AUD_DefaultMixer.h" +#include "AUD_SRCResampleReader.h" +#include "AUD_ChannelMapperReader.h" +#include "AUD_ChannelMapperFactory.h" + +#include + +AUD_DefaultMixer::AUD_DefaultMixer(AUD_DeviceSpecs specs) : + AUD_Mixer(specs) +{ +} + +AUD_IReader* AUD_DefaultMixer::prepare(AUD_IReader* reader) +{ + // hacky for now, until a better channel mapper reader is available + AUD_ChannelMapperFactory cmf(NULL, m_specs); + + AUD_Specs specs = reader->getSpecs(); + + // if channel count is lower in output, rechannel before resampling + if(specs.channels < m_specs.channels) + { + reader = new AUD_ChannelMapperReader(reader, + cmf.getMapping(specs.channels)); + specs.channels = m_specs.channels; + } + + // resample + if(specs.rate != m_specs.rate) + reader = new AUD_SRCResampleReader(reader, m_specs.specs); + + // rechannel + if(specs.channels != m_specs.channels) + reader = new AUD_ChannelMapperReader(reader, + cmf.getMapping(specs.channels)); + + return reader; +} diff --git a/intern/audaspace/intern/AUD_DefaultMixer.h b/intern/audaspace/intern/AUD_DefaultMixer.h new file mode 100644 index 00000000000..c2f69629c88 --- /dev/null +++ b/intern/audaspace/intern/AUD_DefaultMixer.h @@ -0,0 +1,53 @@ +/* + * $Id$ + * + * ***** BEGIN LGPL LICENSE BLOCK ***** + * + * Copyright 2009 Jörg Hermann Müller + * + * This file is part of AudaSpace. + * + * AudaSpace is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * AudaSpace is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with AudaSpace. If not, see . + * + * ***** END LGPL LICENSE BLOCK ***** + */ + +#ifndef AUD_DEFAULTMIXER +#define AUD_DEFAULTMIXER + +#include "AUD_Mixer.h" + +/** + * This class is able to mix audiosignals of different channel count and sample + * rate and convert it to a specific output format. + * It uses a default ChannelMapperFactory and a SRCResampleFactory for + * the perparation. + */ +class AUD_DefaultMixer : public AUD_Mixer +{ +public: + /** + * Creates the mixer. + */ + AUD_DefaultMixer(AUD_DeviceSpecs specs); + + /** + * This funuction prepares a reader for playback. + * \param reader The reader to prepare. + * \return The reader that should be used for playback. + */ + virtual AUD_IReader* prepare(AUD_IReader* reader); +}; + +#endif //AUD_DEFAULTMIXER diff --git a/intern/audaspace/intern/AUD_FileFactory.cpp b/intern/audaspace/intern/AUD_FileFactory.cpp index 5888479a0ba..616b5ac2c18 100644 --- a/intern/audaspace/intern/AUD_FileFactory.cpp +++ b/intern/audaspace/intern/AUD_FileFactory.cpp @@ -30,7 +30,9 @@ #ifdef WITH_FFMPEG // needed for INT64_C +#ifndef __STDC_CONSTANT_MACROS #define __STDC_CONSTANT_MACROS +#endif #include "AUD_FFMPEGReader.h" #endif @@ -38,61 +40,40 @@ #include "AUD_SndFileReader.h" #endif -AUD_FileFactory::AUD_FileFactory(const char* filename) +AUD_FileFactory::AUD_FileFactory(std::string filename) : + m_filename(filename) { - if(filename != NULL) - { - m_filename = new char[strlen(filename)+1]; AUD_NEW("string") - strcpy(m_filename, filename); - } - else - m_filename = NULL; } -AUD_FileFactory::AUD_FileFactory(unsigned char* buffer, int size) +AUD_FileFactory::AUD_FileFactory(const data_t* buffer, int size) : + m_buffer(new AUD_Buffer(size)) { - m_filename = NULL; - m_buffer = AUD_Reference(new AUD_Buffer(size)); memcpy(m_buffer.get()->getBuffer(), buffer, size); } -AUD_FileFactory::~AUD_FileFactory() +AUD_IReader* AUD_FileFactory::createReader() const { - if(m_filename) - { - delete[] m_filename; AUD_DELETE("string") - } -} - -AUD_IReader* AUD_FileFactory::createReader() -{ - AUD_IReader* reader = 0; - #ifdef WITH_SNDFILE try { - if(m_filename) - reader = new AUD_SndFileReader(m_filename); + if(m_buffer.get()) + return new AUD_SndFileReader(m_buffer); else - reader = new AUD_SndFileReader(m_buffer); - AUD_NEW("reader") - return reader; + return new AUD_SndFileReader(m_filename); } - catch(AUD_Exception e) {} + catch(AUD_Exception&) {} #endif #ifdef WITH_FFMPEG try { - if(m_filename) - reader = new AUD_FFMPEGReader(m_filename); + if(m_buffer.get()) + return new AUD_FFMPEGReader(m_buffer); else - reader = new AUD_FFMPEGReader(m_buffer); - AUD_NEW("reader") - return reader; + return new AUD_FFMPEGReader(m_filename); } - catch(AUD_Exception e) {} + catch(AUD_Exception&) {} #endif - return reader; + AUD_THROW(AUD_ERROR_FILE) } diff --git a/intern/audaspace/intern/AUD_FileFactory.h b/intern/audaspace/intern/AUD_FileFactory.h index 6ab8f280534..9182667d72e 100644 --- a/intern/audaspace/intern/AUD_FileFactory.h +++ b/intern/audaspace/intern/AUD_FileFactory.h @@ -30,6 +30,8 @@ #include "AUD_Reference.h" class AUD_Buffer; +#include + /** * This factory tries to read a sound file via all available file readers. */ @@ -39,33 +41,32 @@ private: /** * The filename of the sound source file. */ - char* m_filename; + std::string m_filename; /** * The buffer to read from. */ AUD_Reference m_buffer; + // hide copy constructor and operator= + AUD_FileFactory(const AUD_FileFactory&); + AUD_FileFactory& operator=(const AUD_FileFactory&); + public: /** * Creates a new factory. * \param filename The sound file path. */ - AUD_FileFactory(const char* filename); + AUD_FileFactory(std::string filename); /** * Creates a new factory. * \param buffer The buffer to read from. * \param size The size of the buffer. */ - AUD_FileFactory(unsigned char* buffer, int size); + AUD_FileFactory(const data_t* buffer, int size); - /** - * Destroys the factory. - */ - ~AUD_FileFactory(); - - virtual AUD_IReader* createReader(); + virtual AUD_IReader* createReader() const; }; #endif //AUD_FILEFACTORY diff --git a/intern/audaspace/intern/AUD_IDevice.h b/intern/audaspace/intern/AUD_IDevice.h index e924f57cefc..663d02e23be 100644 --- a/intern/audaspace/intern/AUD_IDevice.h +++ b/intern/audaspace/intern/AUD_IDevice.h @@ -53,7 +53,7 @@ public: /** * Returns the specification of the device. */ - virtual AUD_DeviceSpecs getSpecs()=0; + virtual AUD_DeviceSpecs getSpecs() const=0; /** * Plays a sound source. @@ -106,16 +106,6 @@ public: */ virtual bool setKeep(AUD_Handle* handle, bool keep)=0; - /** - * Sends a message to a sound or all sounds that are currently played or - * paused. - * \param handle The sound that should receive the message or NULL if all - * sounds should receive it. - * \param message The message. - * \return True if the message has been read by at least one sound. - */ - virtual bool sendMessage(AUD_Handle* handle, AUD_Message &message)=0; - /** * Seeks in a played back sound. * \param handle The handle returned by the play function. diff --git a/intern/audaspace/intern/AUD_IFactory.h b/intern/audaspace/intern/AUD_IFactory.h index f7f29c9e842..aed53cef749 100644 --- a/intern/audaspace/intern/AUD_IFactory.h +++ b/intern/audaspace/intern/AUD_IFactory.h @@ -49,7 +49,7 @@ public: * \exception AUD_Exception An exception may be thrown if there has been * a more unexpected error during reader creation. */ - virtual AUD_IReader* createReader()=0; + virtual AUD_IReader* createReader() const=0; }; #endif //AUD_IFACTORY diff --git a/intern/audaspace/intern/AUD_IReader.h b/intern/audaspace/intern/AUD_IReader.h index 4b563100659..baba587ea03 100644 --- a/intern/audaspace/intern/AUD_IReader.h +++ b/intern/audaspace/intern/AUD_IReader.h @@ -46,7 +46,7 @@ public: * \return Always returns true for readers of the buffer type. * \see getType */ - virtual bool isSeekable()=0; + virtual bool isSeekable() const=0; /** * Seeks to a specific position in the source. @@ -65,7 +65,7 @@ public: * \return The length as sample count. May be negative if unknown. * \see getType */ - virtual int getLength()=0; + virtual int getLength() const=0; /** * Returns the position of the source as a sample count value. @@ -76,30 +76,13 @@ public: * the buffer ones. * \see getType */ - virtual int getPosition()=0; + virtual int getPosition() const=0; /** * Returns the specification of the reader. * \return The AUD_Specs structure. */ - virtual AUD_Specs getSpecs()=0; - - /** - * Returns the type of the reader. There are special conditions for the - * readers of the buffer type. Those have to return correct position and - * length values as well as they must be seekable. - * \return AUD_TYPE_BUFFER or AUD_TYPE_STREAM. - */ - virtual AUD_ReaderType getType()=0; - - /** - * Sends a message to this reader and if it has subreaders it broadcasts - * the message to them. - * \param message The message. - * \return Whether the message has been read by the reader or one of his - * subreaders. - */ - virtual bool notify(AUD_Message &message)=0; + virtual AUD_Specs getSpecs() const=0; /** * Request to read the next length samples out of the source. diff --git a/intern/audaspace/intern/AUD_LinearResampleFactory.cpp b/intern/audaspace/intern/AUD_LinearResampleFactory.cpp index e738fc17693..91414c6a392 100644 --- a/intern/audaspace/intern/AUD_LinearResampleFactory.cpp +++ b/intern/audaspace/intern/AUD_LinearResampleFactory.cpp @@ -26,28 +26,18 @@ #include "AUD_LinearResampleFactory.h" #include "AUD_LinearResampleReader.h" -AUD_LinearResampleFactory::AUD_LinearResampleFactory(AUD_IReader* reader, - AUD_DeviceSpecs specs) : - AUD_ResampleFactory(reader, specs) {} - AUD_LinearResampleFactory::AUD_LinearResampleFactory(AUD_IFactory* factory, AUD_DeviceSpecs specs) : - AUD_ResampleFactory(factory, specs) {} + AUD_ResampleFactory(factory, specs) +{ +} -AUD_LinearResampleFactory::AUD_LinearResampleFactory(AUD_DeviceSpecs specs) : - AUD_ResampleFactory(specs) {} - -AUD_IReader* AUD_LinearResampleFactory::createReader() +AUD_IReader* AUD_LinearResampleFactory::createReader() const { AUD_IReader* reader = getReader(); - if(reader != 0) - { - if(reader->getSpecs().rate != m_specs.rate) - { - reader = new AUD_LinearResampleReader(reader, m_specs.specs); - AUD_NEW("reader") - } - } + if(reader->getSpecs().rate != m_specs.rate) + reader = new AUD_LinearResampleReader(reader, m_specs.specs); + return reader; } diff --git a/intern/audaspace/intern/AUD_LinearResampleFactory.h b/intern/audaspace/intern/AUD_LinearResampleFactory.h index 81a9d623815..426641f6099 100644 --- a/intern/audaspace/intern/AUD_LinearResampleFactory.h +++ b/intern/audaspace/intern/AUD_LinearResampleFactory.h @@ -33,12 +33,15 @@ */ class AUD_LinearResampleFactory : public AUD_ResampleFactory { -public: - AUD_LinearResampleFactory(AUD_IReader* reader, AUD_DeviceSpecs specs); - AUD_LinearResampleFactory(AUD_IFactory* factory, AUD_DeviceSpecs specs); - AUD_LinearResampleFactory(AUD_DeviceSpecs specs); +private: + // hide copy constructor and operator= + AUD_LinearResampleFactory(const AUD_LinearResampleFactory&); + AUD_LinearResampleFactory& operator=(const AUD_LinearResampleFactory&); - virtual AUD_IReader* createReader(); +public: + AUD_LinearResampleFactory(AUD_IFactory* factory, AUD_DeviceSpecs specs); + + virtual AUD_IReader* createReader() const; }; #endif //AUD_LINEARRESAMPLEFACTORY diff --git a/intern/audaspace/intern/AUD_LinearResampleReader.cpp b/intern/audaspace/intern/AUD_LinearResampleReader.cpp index dcd5310575d..cfe7561d336 100644 --- a/intern/audaspace/intern/AUD_LinearResampleReader.cpp +++ b/intern/audaspace/intern/AUD_LinearResampleReader.cpp @@ -24,7 +24,6 @@ */ #include "AUD_LinearResampleReader.h" -#include "AUD_Buffer.h" #include #include @@ -33,25 +32,15 @@ AUD_LinearResampleReader::AUD_LinearResampleReader(AUD_IReader* reader, AUD_Specs specs) : - AUD_EffectReader(reader) + AUD_EffectReader(reader), + m_sspecs(reader->getSpecs()), + m_factor(float(specs.rate) / float(m_sspecs.rate)), + m_tspecs(specs), + m_position(0), + m_sposition(0) { - m_sspecs = reader->getSpecs(); - - m_tspecs = specs; m_tspecs.channels = m_sspecs.channels; - m_factor = (float)m_tspecs.rate / (float)m_sspecs.rate; - - m_position = 0; - m_sposition = 0; - - m_buffer = new AUD_Buffer(); AUD_NEW("buffer") - m_cache = new AUD_Buffer(2 * AUD_SAMPLE_SIZE(specs)); AUD_NEW("buffer") -} - -AUD_LinearResampleReader::~AUD_LinearResampleReader() -{ - delete m_buffer; AUD_DELETE("buffer") - delete m_cache; AUD_DELETE("buffer") + m_cache.resize(2 * AUD_SAMPLE_SIZE(m_tspecs)); } void AUD_LinearResampleReader::seek(int position) @@ -61,17 +50,17 @@ void AUD_LinearResampleReader::seek(int position) m_reader->seek(m_sposition); } -int AUD_LinearResampleReader::getLength() +int AUD_LinearResampleReader::getLength() const { return m_reader->getLength() * m_factor; } -int AUD_LinearResampleReader::getPosition() +int AUD_LinearResampleReader::getPosition() const { return m_position; } -AUD_Specs AUD_LinearResampleReader::getSpecs() +AUD_Specs AUD_LinearResampleReader::getSpecs() const { return m_tspecs; } @@ -81,13 +70,13 @@ void AUD_LinearResampleReader::read(int & length, sample_t* & buffer) int samplesize = AUD_SAMPLE_SIZE(m_tspecs); int size = length * samplesize; - if(m_buffer->getSize() < size) - m_buffer->resize(size); + if(m_buffer.getSize() < size) + m_buffer.resize(size); int need = ceil((m_position + length) / m_factor) + 1 - m_sposition; int len = need; sample_t* buf; - buffer = m_buffer->getBuffer(); + buffer = m_buffer.getBuffer(); m_reader->read(len, buf); @@ -106,9 +95,9 @@ void AUD_LinearResampleReader::read(int & length, sample_t* & buffer) if(floor(spos) < 0) { - low = m_cache->getBuffer()[(int)(floor(spos) + 2) * CC]; + low = m_cache.getBuffer()[(int)(floor(spos) + 2) * CC]; if(ceil(spos) < 0) - high = m_cache->getBuffer()[(int)(ceil(spos) + 2) * CC]; + high = m_cache.getBuffer()[(int)(ceil(spos) + 2) * CC]; else high = buf[(int)ceil(spos) * CC]; } @@ -122,11 +111,11 @@ void AUD_LinearResampleReader::read(int & length, sample_t* & buffer) } if(len > 1) - memcpy(m_cache->getBuffer(), + memcpy(m_cache.getBuffer(), buf + (len - 2) * channels, 2 * samplesize); else if(len == 1) - memcpy(m_cache->getBuffer() + 1 * channels, buf, samplesize); + memcpy(m_cache.getBuffer() + 1 * channels, buf, samplesize); m_sposition += len; m_position += length; diff --git a/intern/audaspace/intern/AUD_LinearResampleReader.h b/intern/audaspace/intern/AUD_LinearResampleReader.h index c86b8b76c59..fbf56286857 100644 --- a/intern/audaspace/intern/AUD_LinearResampleReader.h +++ b/intern/audaspace/intern/AUD_LinearResampleReader.h @@ -27,7 +27,7 @@ #define AUD_LINEARRESAMPLEREADER #include "AUD_EffectReader.h" -class AUD_Buffer; +#include "AUD_Buffer.h" /** * This resampling reader uses libsamplerate for resampling. @@ -35,10 +35,20 @@ class AUD_Buffer; class AUD_LinearResampleReader : public AUD_EffectReader { private: + /** + * The sample specification of the source. + */ + const AUD_Specs m_sspecs; + /** * The resampling factor. */ - float m_factor; + const float m_factor; + + /** + * The target specification. + */ + AUD_Specs m_tspecs; /** * The current position. @@ -53,41 +63,29 @@ private: /** * The sound output buffer. */ - AUD_Buffer *m_buffer; + AUD_Buffer m_buffer; /** * The input caching buffer. */ - AUD_Buffer *m_cache; + AUD_Buffer m_cache; - /** - * The target specification. - */ - AUD_Specs m_tspecs; - - /** - * The sample specification of the source. - */ - AUD_Specs m_sspecs; + // hide copy constructor and operator= + AUD_LinearResampleReader(const AUD_LinearResampleReader&); + AUD_LinearResampleReader& operator=(const AUD_LinearResampleReader&); public: /** * Creates a resampling reader. * \param reader The reader to mix. * \param specs The target specification. - * \exception AUD_Exception Thrown if the reader is NULL. */ AUD_LinearResampleReader(AUD_IReader* reader, AUD_Specs specs); - /** - * Destroys the reader. - */ - ~AUD_LinearResampleReader(); - 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); }; diff --git a/intern/audaspace/intern/AUD_Mixer.cpp b/intern/audaspace/intern/AUD_Mixer.cpp index e77d40fdbca..419ac3af6ac 100644 --- a/intern/audaspace/intern/AUD_Mixer.cpp +++ b/intern/audaspace/intern/AUD_Mixer.cpp @@ -24,72 +24,13 @@ */ #include "AUD_Mixer.h" -#include "AUD_SRCResampleFactory.h" -#include "AUD_LinearResampleFactory.h" -#include "AUD_ChannelMapperFactory.h" #include "AUD_IReader.h" -#include "AUD_Buffer.h" #include -AUD_Mixer::AUD_Mixer() +AUD_Mixer::AUD_Mixer(AUD_DeviceSpecs specs) : + m_specs(specs) { - m_buffer = new AUD_Buffer(); AUD_NEW("buffer") - - m_resampler = NULL; - m_mapper = NULL; -} - -AUD_Mixer::~AUD_Mixer() -{ - delete m_buffer; AUD_DELETE("buffer") - - - if(m_resampler) - { - delete m_resampler; AUD_DELETE("factory") - } - if(m_mapper) - { - delete m_mapper; AUD_DELETE("factory") - } -} - -AUD_IReader* AUD_Mixer::prepare(AUD_IReader* reader) -{ - m_resampler->setReader(reader); - reader = m_resampler->createReader(); - - if(reader != NULL && reader->getSpecs().channels != m_specs.channels) - { - m_mapper->setReader(reader); - reader = m_mapper->createReader(); - } - - return reader; -} - -AUD_DeviceSpecs AUD_Mixer::getSpecs() -{ - return m_specs; -} - -void AUD_Mixer::setSpecs(AUD_DeviceSpecs specs) -{ - m_specs = specs; - - if(m_resampler) - { - delete m_resampler; AUD_DELETE("factory") - } - if(m_mapper) - { - delete m_mapper; AUD_DELETE("factory") - } - - m_resampler = new AUD_MIXER_RESAMPLER(specs); AUD_NEW("factory") - m_mapper = new AUD_ChannelMapperFactory(specs); AUD_NEW("factory") - int bigendian = 1; bigendian = (((char*)&bigendian)[0]) ? 0: 1; // 1 if Big Endian @@ -121,6 +62,11 @@ void AUD_Mixer::setSpecs(AUD_DeviceSpecs specs) } } +AUD_DeviceSpecs AUD_Mixer::getSpecs() const +{ + return m_specs; +} + void AUD_Mixer::add(sample_t* buffer, int start, int length, float volume) { AUD_MixerBuffer buf; @@ -137,10 +83,10 @@ void AUD_Mixer::superpose(data_t* buffer, int length, float volume) int channels = m_specs.channels; - if(m_buffer->getSize() < length * channels * 4) - m_buffer->resize(length * channels * 4); + if(m_buffer.getSize() < length * channels * 4) + m_buffer.resize(length * channels * 4); - sample_t* out = m_buffer->getBuffer(); + sample_t* out = m_buffer.getBuffer(); sample_t* in; memset(out, 0, length * channels * 4); diff --git a/intern/audaspace/intern/AUD_Mixer.h b/intern/audaspace/intern/AUD_Mixer.h index 2e7ba743541..a7f5fb274f0 100644 --- a/intern/audaspace/intern/AUD_Mixer.h +++ b/intern/audaspace/intern/AUD_Mixer.h @@ -26,13 +26,8 @@ #ifndef AUD_MIXER #define AUD_MIXER -#define AUD_MIXER_RESAMPLER AUD_SRCResampleFactory - #include "AUD_ConverterFunctions.h" -class AUD_ConverterFactory; -class AUD_MIXER_RESAMPLER; -class AUD_ChannelMapperFactory; -class AUD_Buffer; +#include "AUD_Buffer.h" class AUD_IReader; #include @@ -45,24 +40,12 @@ struct AUD_MixerBuffer }; /** - * This class is able to mix audiosignals of different channel count and sample - * rate and convert it to a specific output format. - * It uses a default ChannelMapperFactory and a SRCResampleFactory for - * the perparation. + * This abstract class is able to mix audiosignals of different channel count + * and sample rate and convert it to a specific output format. */ class AUD_Mixer { -private: - /** - * The resampling factory that resamples all readers for superposition. - */ - AUD_MIXER_RESAMPLER* m_resampler; - - /** - * The channel mapper factory that maps all readers for superposition. - */ - AUD_ChannelMapperFactory* m_mapper; - +protected: /** * The list of buffers to superpose. */ @@ -71,12 +54,12 @@ private: /** * The output specification. */ - AUD_DeviceSpecs m_specs; + const AUD_DeviceSpecs m_specs; /** * The temporary mixing buffer. */ - AUD_Buffer* m_buffer; + AUD_Buffer m_buffer; /** * Converter function. @@ -87,31 +70,25 @@ public: /** * Creates the mixer. */ - AUD_Mixer(); + AUD_Mixer(AUD_DeviceSpecs specs); /** * Destroys the mixer. */ - ~AUD_Mixer(); + virtual ~AUD_Mixer() {} + + /** + * Returns the target specification for superposing. + * \return The target specification. + */ + AUD_DeviceSpecs getSpecs() const; /** * This funuction prepares a reader for playback. * \param reader The reader to prepare. * \return The reader that should be used for playback. */ - AUD_IReader* prepare(AUD_IReader* reader); - - /** - * Returns the target specification for superposing. - * \return The target specification. - */ - AUD_DeviceSpecs getSpecs(); - - /** - * Sets the target specification for superposing. - * \param specs The target specification. - */ - void setSpecs(AUD_DeviceSpecs specs); + virtual AUD_IReader* prepare(AUD_IReader* reader)=0; /** * Adds a buffer for superposition. @@ -120,7 +97,7 @@ public: * \param length The length of the buffer in samples. * \param volume The mixing volume. Must be a value between 0.0 and 1.0. */ - void add(sample_t* buffer, int start, int length, float volume); + virtual void add(sample_t* buffer, int start, int length, float volume); /** * Superposes all added buffers into an output buffer. @@ -128,7 +105,7 @@ public: * \param length The length of the buffer in samples. * \param volume The mixing volume. Must be a value between 0.0 and 1.0. */ - void superpose(data_t* buffer, int length, float volume); + virtual void superpose(data_t* buffer, int length, float volume); }; #endif //AUD_MIXER diff --git a/intern/audaspace/intern/AUD_MixerFactory.cpp b/intern/audaspace/intern/AUD_MixerFactory.cpp index e78818301fa..4370bed6ca6 100644 --- a/intern/audaspace/intern/AUD_MixerFactory.cpp +++ b/intern/audaspace/intern/AUD_MixerFactory.cpp @@ -26,84 +26,23 @@ #include "AUD_MixerFactory.h" #include "AUD_IReader.h" -AUD_IReader* AUD_MixerFactory::getReader() +AUD_IReader* AUD_MixerFactory::getReader() const { - AUD_IReader* reader; - - // first check for an existing reader - if(m_reader != 0) - { - reader = m_reader; - m_reader = 0; - return reader; - } - - // otherwise create a reader if there is a factory - if(m_factory != 0) - { - reader = m_factory->createReader(); - return reader; - } - - return 0; -} - -AUD_MixerFactory::AUD_MixerFactory(AUD_IReader* reader, - AUD_DeviceSpecs specs) -{ - m_specs = specs; - m_reader = reader; - m_factory = 0; + return m_factory->createReader(); } AUD_MixerFactory::AUD_MixerFactory(AUD_IFactory* factory, - AUD_DeviceSpecs specs) + AUD_DeviceSpecs specs) : + m_specs(specs), m_factory(factory) { - m_specs = specs; - m_reader = 0; - m_factory = factory; } -AUD_MixerFactory::AUD_MixerFactory(AUD_DeviceSpecs specs) -{ - m_specs = specs; - m_reader = 0; - m_factory = 0; -} - -AUD_MixerFactory::~AUD_MixerFactory() -{ - if(m_reader != 0) - { - delete m_reader; AUD_DELETE("reader") - } -} - -AUD_DeviceSpecs AUD_MixerFactory::getSpecs() +AUD_DeviceSpecs AUD_MixerFactory::getSpecs() const { return m_specs; } -void AUD_MixerFactory::setSpecs(AUD_DeviceSpecs specs) -{ - m_specs = specs; -} - -void AUD_MixerFactory::setReader(AUD_IReader* reader) -{ - if(m_reader != 0) - { - delete m_reader; AUD_DELETE("reader") - } - m_reader = reader; -} - -void AUD_MixerFactory::setFactory(AUD_IFactory* factory) -{ - m_factory = factory; -} - -AUD_IFactory* AUD_MixerFactory::getFactory() +AUD_IFactory* AUD_MixerFactory::getFactory() const { return m_factory; } diff --git a/intern/audaspace/intern/AUD_MixerFactory.h b/intern/audaspace/intern/AUD_MixerFactory.h index a2f4aa78d76..909eca8c148 100644 --- a/intern/audaspace/intern/AUD_MixerFactory.h +++ b/intern/audaspace/intern/AUD_MixerFactory.h @@ -35,9 +35,9 @@ class AUD_MixerFactory : public AUD_IFactory { protected: /** - * The reader that should be mixed later. + * The target specification for resampling. */ - AUD_IReader* m_reader; + const AUD_DeviceSpecs m_specs; /** * If there is no reader it is created out of this factory. @@ -45,26 +45,14 @@ protected: AUD_IFactory* m_factory; /** - * The target specification for resampling. - */ - AUD_DeviceSpecs m_specs; - - /** - * Returns the reader created out of the factory or taken from m_reader. + * Returns the reader created out of the factory. * This method can be used for the createReader function of the implementing * classes. - * \return The reader to mix, or NULL if there is no reader or factory. + * \return The reader to mix. */ - AUD_IReader* getReader(); + AUD_IReader* getReader() const; public: - /** - * Creates a new factory. - * \param reader The reader to mix. - * \param specs The target specification. - */ - AUD_MixerFactory(AUD_IReader* reader, AUD_DeviceSpecs specs); - /** * Creates a new factory. * \param factory The factory to create the readers to mix out of. @@ -72,46 +60,16 @@ public: */ AUD_MixerFactory(AUD_IFactory* factory, AUD_DeviceSpecs specs); - /** - * Creates a new factory. - * \param specs The target specification. - */ - AUD_MixerFactory(AUD_DeviceSpecs specs); - - /** - * Destroys the resampling factory. - */ - virtual ~AUD_MixerFactory(); - /** * Returns the target specification for resampling. */ - AUD_DeviceSpecs getSpecs(); - - /** - * Sets the target specification for resampling. - * \param specs The specification. - */ - void setSpecs(AUD_DeviceSpecs specs); - - /** - * Sets the reader for resampling. - * If there has already been a reader, it will be deleted. - * \param reader The reader that should be used as source for resampling. - */ - void setReader(AUD_IReader* reader); - - /** - * Sets the factory for resampling. - * \param factory The factory that should be used as source for resampling. - */ - void setFactory(AUD_IFactory* factory); + AUD_DeviceSpecs getSpecs() const; /** * Returns the saved factory. - * \return The factory or NULL if there has no factory been saved. + * \return The factory. */ - AUD_IFactory* getFactory(); + AUD_IFactory* getFactory() const; }; #endif //AUD_MIXERFACTORY diff --git a/intern/audaspace/intern/AUD_NULLDevice.cpp b/intern/audaspace/intern/AUD_NULLDevice.cpp index c9dfadd1839..9af40009335 100644 --- a/intern/audaspace/intern/AUD_NULLDevice.cpp +++ b/intern/audaspace/intern/AUD_NULLDevice.cpp @@ -31,14 +31,15 @@ AUD_NULLDevice::AUD_NULLDevice() { - m_specs.channels = AUD_CHANNELS_INVALID; - m_specs.format = AUD_FORMAT_INVALID; - m_specs.rate = AUD_RATE_INVALID; } -AUD_DeviceSpecs AUD_NULLDevice::getSpecs() +AUD_DeviceSpecs AUD_NULLDevice::getSpecs() const { - return m_specs; + AUD_DeviceSpecs specs; + specs.channels = AUD_CHANNELS_INVALID; + specs.format = AUD_FORMAT_INVALID; + specs.rate = AUD_RATE_INVALID; + return specs; } AUD_Handle* AUD_NULLDevice::play(AUD_IFactory* factory, bool keep) @@ -66,11 +67,6 @@ bool AUD_NULLDevice::setKeep(AUD_Handle* handle, bool keep) return false; } -bool AUD_NULLDevice::sendMessage(AUD_Handle* handle, AUD_Message &message) -{ - return false; -} - bool AUD_NULLDevice::seek(AUD_Handle* handle, float position) { return false; diff --git a/intern/audaspace/intern/AUD_NULLDevice.h b/intern/audaspace/intern/AUD_NULLDevice.h index 91ddd23cf71..c3fffd7cb87 100644 --- a/intern/audaspace/intern/AUD_NULLDevice.h +++ b/intern/audaspace/intern/AUD_NULLDevice.h @@ -33,25 +33,18 @@ */ class AUD_NULLDevice : public AUD_IDevice { -private: - /** - * The specs of the device. - */ - AUD_DeviceSpecs m_specs; - public: /** * Creates a new NULL device. */ AUD_NULLDevice(); - virtual AUD_DeviceSpecs getSpecs(); + virtual AUD_DeviceSpecs getSpecs() const; virtual AUD_Handle* play(AUD_IFactory* factory, bool keep = false); virtual bool pause(AUD_Handle* handle); virtual bool resume(AUD_Handle* handle); virtual bool stop(AUD_Handle* handle); virtual bool setKeep(AUD_Handle* handle, bool keep); - virtual bool sendMessage(AUD_Handle* handle, AUD_Message &message); virtual bool seek(AUD_Handle* handle, float position); virtual float getPosition(AUD_Handle* handle); virtual AUD_Status getStatus(AUD_Handle* handle); diff --git a/intern/audaspace/intern/AUD_ReadDevice.cpp b/intern/audaspace/intern/AUD_ReadDevice.cpp index 37a7d1ae295..cde5694354e 100644 --- a/intern/audaspace/intern/AUD_ReadDevice.cpp +++ b/intern/audaspace/intern/AUD_ReadDevice.cpp @@ -23,21 +23,17 @@ * ***** END LGPL LICENSE BLOCK ***** */ -#include "AUD_Mixer.h" +#include "AUD_DefaultMixer.h" #include "AUD_ReadDevice.h" #include "AUD_IReader.h" #include -AUD_ReadDevice::AUD_ReadDevice(AUD_DeviceSpecs specs) +AUD_ReadDevice::AUD_ReadDevice(AUD_DeviceSpecs specs) : + m_playing(false) { m_specs = specs; - m_mixer = new AUD_Mixer(); AUD_NEW("mixer") - m_mixer->setSpecs(m_specs); - - m_playing = false; - create(); } diff --git a/intern/audaspace/intern/AUD_ReadDevice.h b/intern/audaspace/intern/AUD_ReadDevice.h index 3fd90df7755..121bcb8612b 100644 --- a/intern/audaspace/intern/AUD_ReadDevice.h +++ b/intern/audaspace/intern/AUD_ReadDevice.h @@ -33,15 +33,19 @@ */ class AUD_ReadDevice : public AUD_SoftwareDevice { -protected: - virtual void playing(bool playing); - private: /** * Whether the device currently. */ bool m_playing; + // hide copy constructor and operator= + AUD_ReadDevice(const AUD_ReadDevice&); + AUD_ReadDevice& operator=(const AUD_ReadDevice&); + +protected: + virtual void playing(bool playing); + public: /** * Creates a new read device. diff --git a/intern/audaspace/intern/AUD_Reference.h b/intern/audaspace/intern/AUD_Reference.h index 9bb9d7440b3..6b1001e2b01 100644 --- a/intern/audaspace/intern/AUD_Reference.h +++ b/intern/audaspace/intern/AUD_Reference.h @@ -45,12 +45,12 @@ public: AUD_Reference(T* reference = 0) { m_reference = reference; - m_refcount = new int; AUD_NEW("int") + m_refcount = new int; *m_refcount = 1; } /** - * Copies a AUD_Reference object. + * Copies an AUD_Reference object. * \param ref The AUD_Reference object to copy. */ AUD_Reference(const AUD_Reference& ref) @@ -69,17 +69,17 @@ public: (*m_refcount)--; if(*m_refcount == 0) { - if(m_reference != 0) + if(m_reference) { - delete m_reference; AUD_DELETE("buffer") + delete m_reference; } - delete m_refcount; AUD_DELETE("int") + delete m_refcount; } } /** - * Copies a AUD_Reference object. - * \param ref The AUD_Reference object to copy. + * Assigns an AUD_Reference to this object. + * \param ref The AUD_Reference object to assign. */ AUD_Reference& operator=(const AUD_Reference& ref) { @@ -89,11 +89,11 @@ public: (*m_refcount)--; if(*m_refcount == 0) { - if(m_reference != 0) + if(m_reference) { - delete m_reference; AUD_DELETE("buffer") + delete m_reference; } - delete m_refcount; AUD_DELETE("int") + delete m_refcount; } m_reference = ref.m_reference; @@ -106,7 +106,7 @@ public: /** * Returns the reference. */ - T* get() + T* get() const { return m_reference; } diff --git a/intern/audaspace/intern/AUD_SequencerFactory.cpp b/intern/audaspace/intern/AUD_SequencerFactory.cpp index bb5cf27fb5f..05c7fefea4a 100644 --- a/intern/audaspace/intern/AUD_SequencerFactory.cpp +++ b/intern/audaspace/intern/AUD_SequencerFactory.cpp @@ -28,11 +28,12 @@ typedef std::list::iterator AUD_ReaderIterator; -AUD_SequencerFactory::AUD_SequencerFactory(AUD_Specs specs, void* data, AUD_volumeFunction volume) +AUD_SequencerFactory::AUD_SequencerFactory(AUD_Specs specs, void* data, + AUD_volumeFunction volume) : + m_specs(specs), + m_data(data), + m_volume(volume) { - m_specs = specs; - m_data = data; - m_volume = volume; } AUD_SequencerFactory::~AUD_SequencerFactory() @@ -51,13 +52,23 @@ AUD_SequencerFactory::~AUD_SequencerFactory() { entry = m_entries.front(); m_entries.pop_front(); - delete entry; AUD_DELETE("seqentry") + delete entry; } } +AUD_IReader* AUD_SequencerFactory::newReader() +{ + AUD_SequencerReader* reader = new AUD_SequencerReader(this, m_entries, + m_specs, m_data, + m_volume); + m_readers.push_front(reader); + + return reader; +} + AUD_SequencerEntry* AUD_SequencerFactory::add(AUD_IFactory** sound, float begin, float end, float skip, void* data) { - AUD_SequencerEntry* entry = new AUD_SequencerEntry; AUD_NEW("seqentry") + AUD_SequencerEntry* entry = new AUD_SequencerEntry; entry->sound = sound; entry->begin = begin; entry->skip = skip; @@ -80,7 +91,7 @@ void AUD_SequencerFactory::remove(AUD_SequencerEntry* entry) m_entries.remove(entry); - delete entry; AUD_DELETE("seqentry") + delete entry; } void AUD_SequencerFactory::move(AUD_SequencerEntry* entry, float begin, float end, float skip) @@ -95,12 +106,9 @@ void AUD_SequencerFactory::mute(AUD_SequencerEntry* entry, bool mute) entry->muted = mute; } -AUD_IReader* AUD_SequencerFactory::createReader() +AUD_IReader* AUD_SequencerFactory::createReader() const { - AUD_SequencerReader* reader = new AUD_SequencerReader(this, m_entries, m_specs, m_data, m_volume); AUD_NEW("reader") - m_readers.push_front(reader); - - return reader; + return const_cast(this)->newReader(); } void AUD_SequencerFactory::removeReader(AUD_SequencerReader* reader) diff --git a/intern/audaspace/intern/AUD_SequencerFactory.h b/intern/audaspace/intern/AUD_SequencerFactory.h index b564c888fc6..a2c8f48fa54 100644 --- a/intern/audaspace/intern/AUD_SequencerFactory.h +++ b/intern/audaspace/intern/AUD_SequencerFactory.h @@ -60,6 +60,12 @@ private: void* m_data; AUD_volumeFunction m_volume; + AUD_IReader* newReader(); + + // hide copy constructor and operator= + AUD_SequencerFactory(const AUD_SequencerFactory&); + AUD_SequencerFactory& operator=(const AUD_SequencerFactory&); + public: AUD_SequencerFactory(AUD_Specs specs, void* data, AUD_volumeFunction volume); ~AUD_SequencerFactory(); @@ -69,7 +75,7 @@ public: void move(AUD_SequencerEntry* entry, float begin, float end, float skip); void mute(AUD_SequencerEntry* entry, bool mute); - virtual AUD_IReader* createReader(); + virtual AUD_IReader* createReader() const; void removeReader(AUD_SequencerReader* reader); }; diff --git a/intern/audaspace/intern/AUD_SequencerReader.cpp b/intern/audaspace/intern/AUD_SequencerReader.cpp index 8869d8d54ca..69293205498 100644 --- a/intern/audaspace/intern/AUD_SequencerReader.cpp +++ b/intern/audaspace/intern/AUD_SequencerReader.cpp @@ -24,20 +24,22 @@ */ #include "AUD_SequencerReader.h" -#include "AUD_Buffer.h" +#include "AUD_DefaultMixer.h" #include typedef std::list::iterator AUD_StripIterator; typedef std::list::iterator AUD_EntryIterator; -AUD_SequencerReader::AUD_SequencerReader(AUD_SequencerFactory* factory, std::list &entries, AUD_Specs specs, void* data, AUD_volumeFunction volume) +AUD_SequencerReader::AUD_SequencerReader(AUD_SequencerFactory* factory, + std::list &entries, AUD_Specs specs, + void* data, AUD_volumeFunction volume) { AUD_DeviceSpecs dspecs; dspecs.specs = specs; dspecs.format = AUD_FORMAT_FLOAT32; - m_mixer.setSpecs(dspecs); + m_mixer = new AUD_DefaultMixer(dspecs); m_factory = factory; m_data = data; m_volume = volume; @@ -46,12 +48,12 @@ AUD_SequencerReader::AUD_SequencerReader(AUD_SequencerFactory* factory, std::lis for(AUD_EntryIterator i = entries.begin(); i != entries.end(); i++) { - strip = new AUD_SequencerStrip; AUD_NEW("seqstrip") + strip = new AUD_SequencerStrip; strip->entry = *i; strip->old_sound = NULL; if(strip->old_sound) - strip->reader = m_mixer.prepare(strip->old_sound->createReader()); + strip->reader = m_mixer->prepare(strip->old_sound->createReader()); else strip->reader = NULL; @@ -59,7 +61,6 @@ AUD_SequencerReader::AUD_SequencerReader(AUD_SequencerFactory* factory, std::lis } m_position = 0; - m_buffer = new AUD_Buffer(); AUD_NEW("buffer") } AUD_SequencerReader::~AUD_SequencerReader() @@ -75,12 +76,12 @@ AUD_SequencerReader::~AUD_SequencerReader() m_strips.pop_front(); if(strip->reader) { - delete strip->reader; AUD_DELETE("reader") + delete strip->reader; } - delete strip; AUD_DELETE("seqstrip") + delete strip; } - delete m_buffer; AUD_DELETE("buffer") + delete m_mixer; } void AUD_SequencerReader::destroy() @@ -92,19 +93,19 @@ void AUD_SequencerReader::destroy() { strip = m_strips.front(); m_strips.pop_front(); - delete strip; AUD_DELETE("seqstrip") + delete strip; } } void AUD_SequencerReader::add(AUD_SequencerEntry* entry) { - AUD_SequencerStrip* strip = new AUD_SequencerStrip; AUD_NEW("seqstrip") + AUD_SequencerStrip* strip = new AUD_SequencerStrip; strip->entry = entry; if(*strip->entry->sound) { strip->old_sound = *strip->entry->sound; - strip->reader = m_mixer.prepare(strip->old_sound->createReader()); + strip->reader = m_mixer->prepare(strip->old_sound->createReader()); } else { @@ -125,16 +126,16 @@ void AUD_SequencerReader::remove(AUD_SequencerEntry* entry) i++; if(strip->reader) { - delete strip->reader; AUD_DELETE("reader") + delete strip->reader; } m_strips.remove(strip); - delete strip; AUD_DELETE("seqstrip") + delete strip; return; } } } -bool AUD_SequencerReader::isSeekable() +bool AUD_SequencerReader::isSeekable() const { return true; } @@ -144,44 +145,24 @@ void AUD_SequencerReader::seek(int position) m_position = position; } -int AUD_SequencerReader::getLength() +int AUD_SequencerReader::getLength() const { return -1; } -int AUD_SequencerReader::getPosition() +int AUD_SequencerReader::getPosition() const { return m_position; } -AUD_Specs AUD_SequencerReader::getSpecs() +AUD_Specs AUD_SequencerReader::getSpecs() const { - return m_mixer.getSpecs().specs; -} - -AUD_ReaderType AUD_SequencerReader::getType() -{ - return AUD_TYPE_STREAM; -} - -bool AUD_SequencerReader::notify(AUD_Message &message) -{ - bool result = false; - AUD_SequencerStrip* strip; - - for(AUD_StripIterator i = m_strips.begin(); i != m_strips.end(); i++) - { - strip = *i; - if(strip->reader) - result |= (*i)->reader->notify(message); - } - - return result; + return m_mixer->getSpecs().specs; } void AUD_SequencerReader::read(int & length, sample_t* & buffer) { - AUD_DeviceSpecs specs = m_mixer.getSpecs(); + AUD_DeviceSpecs specs = m_mixer->getSpecs(); int samplesize = AUD_SAMPLE_SIZE(specs); int rate = specs.rate; @@ -191,9 +172,9 @@ void AUD_SequencerReader::read(int & length, sample_t* & buffer) AUD_SequencerStrip* strip; sample_t* buf; - if(m_buffer->getSize() < size) - m_buffer->resize(size); - buffer = m_buffer->getBuffer(); + if(m_buffer.getSize() < size) + m_buffer.resize(size); + buffer = m_buffer.getBuffer(); for(AUD_StripIterator i = m_strips.begin(); i != m_strips.end(); i++) { @@ -204,12 +185,10 @@ void AUD_SequencerReader::read(int & length, sample_t* & buffer) { strip->old_sound = *strip->entry->sound; if(strip->reader) - { - delete strip->reader; AUD_DELETE("reader") - } + delete strip->reader; if(strip->old_sound) - strip->reader = m_mixer.prepare(strip->old_sound->createReader()); + strip->reader = m_mixer->prepare(strip->old_sound->createReader()); else strip->reader = NULL; } @@ -236,14 +215,14 @@ void AUD_SequencerReader::read(int & length, sample_t* & buffer) if(strip->reader->getPosition() != current) strip->reader->seek(current); strip->reader->read(len, buf); - m_mixer.add(buf, skip, len, m_volume(m_data, strip->entry->data, (float)m_position / (float)rate)); + m_mixer->add(buf, skip, len, m_volume(m_data, strip->entry->data, (float)m_position / (float)rate)); } } } } } - m_mixer.superpose((data_t*)buffer, length, 1.0f); + m_mixer->superpose((data_t*)buffer, length, 1.0f); m_position += length; } diff --git a/intern/audaspace/intern/AUD_SequencerReader.h b/intern/audaspace/intern/AUD_SequencerReader.h index a50e1642260..fd7d94c7578 100644 --- a/intern/audaspace/intern/AUD_SequencerReader.h +++ b/intern/audaspace/intern/AUD_SequencerReader.h @@ -28,9 +28,8 @@ #include "AUD_IReader.h" #include "AUD_SequencerFactory.h" -#include "AUD_Mixer.h" - -class AUD_Buffer; +#include "AUD_Buffer.h" +class AUD_Mixer; struct AUD_SequencerStrip { @@ -53,12 +52,12 @@ private: /** * The sound output buffer. */ - AUD_Buffer *m_buffer; + AUD_Buffer m_buffer; /** * The target specification. */ - AUD_Mixer m_mixer; + AUD_Mixer* m_mixer; /** * Saves the SequencerFactory the reader belongs to. @@ -70,14 +69,17 @@ private: void* m_data; AUD_volumeFunction m_volume; + // hide copy constructor and operator= + AUD_SequencerReader(const AUD_SequencerReader&); + AUD_SequencerReader& operator=(const AUD_SequencerReader&); + public: /** * Creates a resampling reader. * \param reader The reader to mix. * \param specs The target specification. - * \exception AUD_Exception Thrown if the reader is NULL. */ - AUD_SequencerReader(AUD_SequencerFactory* factory, std::list &entries, AUD_Specs specs, void* data, AUD_volumeFunction volume); + AUD_SequencerReader(AUD_SequencerFactory* factory, std::list &entries, const AUD_Specs specs, void* data, AUD_volumeFunction volume); /** * Destroys the reader. @@ -89,13 +91,11 @@ public: void add(AUD_SequencerEntry* entry); void remove(AUD_SequencerEntry* entry); - virtual bool isSeekable(); + virtual bool isSeekable() const; virtual void seek(int position); - virtual int getLength(); - virtual int getPosition(); - virtual AUD_Specs getSpecs(); - virtual AUD_ReaderType getType(); - virtual bool notify(AUD_Message &message); + virtual int getLength() const; + virtual int getPosition() const; + virtual AUD_Specs getSpecs() const; virtual void read(int & length, sample_t* & buffer); }; diff --git a/intern/audaspace/intern/AUD_SinusFactory.cpp b/intern/audaspace/intern/AUD_SinusFactory.cpp index ae878b9df60..3c8e5ccc567 100644 --- a/intern/audaspace/intern/AUD_SinusFactory.cpp +++ b/intern/audaspace/intern/AUD_SinusFactory.cpp @@ -27,25 +27,18 @@ #include "AUD_SinusReader.h" #include "AUD_Space.h" -AUD_SinusFactory::AUD_SinusFactory(double frequency, AUD_SampleRate sampleRate) +AUD_SinusFactory::AUD_SinusFactory(float frequency, AUD_SampleRate sampleRate) : + m_frequency(frequency), + m_sampleRate(sampleRate) { - m_frequency = frequency; - m_sampleRate = sampleRate; } -AUD_IReader* AUD_SinusFactory::createReader() -{ - AUD_IReader* reader = new AUD_SinusReader(m_frequency, m_sampleRate); - AUD_NEW("reader") - return reader; -} - -double AUD_SinusFactory::getFrequency() +float AUD_SinusFactory::getFrequency() const { return m_frequency; } -void AUD_SinusFactory::setFrequency(double frequency) +AUD_IReader* AUD_SinusFactory::createReader() const { - m_frequency = frequency; + return new AUD_SinusReader(m_frequency, m_sampleRate); } diff --git a/intern/audaspace/intern/AUD_SinusFactory.h b/intern/audaspace/intern/AUD_SinusFactory.h index ffb36e741b9..2c5965e11f0 100644 --- a/intern/audaspace/intern/AUD_SinusFactory.h +++ b/intern/audaspace/intern/AUD_SinusFactory.h @@ -37,12 +37,16 @@ private: /** * The frequence of the sine wave. */ - double m_frequency; + const float m_frequency; /** * The target sample rate for output. */ - AUD_SampleRate m_sampleRate; + const AUD_SampleRate m_sampleRate; + + // hide copy constructor and operator= + AUD_SinusFactory(const AUD_SinusFactory&); + AUD_SinusFactory& operator=(const AUD_SinusFactory&); public: /** @@ -50,21 +54,15 @@ public: * \param frequency The desired frequency. * \param sampleRate The target sample rate for playback. */ - AUD_SinusFactory(double frequency, + AUD_SinusFactory(float frequency, AUD_SampleRate sampleRate = AUD_RATE_44100); /** * Returns the frequency of the sine wave. */ - double getFrequency(); + float getFrequency() const; - /** - * Sets the frequency. - * \param frequency The new frequency. - */ - void setFrequency(double frequency); - - virtual AUD_IReader* createReader(); + virtual AUD_IReader* createReader() const; }; #endif //AUD_SINUSFACTORY diff --git a/intern/audaspace/intern/AUD_SinusReader.cpp b/intern/audaspace/intern/AUD_SinusReader.cpp index c52513d5d2e..e810c576a5c 100644 --- a/intern/audaspace/intern/AUD_SinusReader.cpp +++ b/intern/audaspace/intern/AUD_SinusReader.cpp @@ -24,7 +24,6 @@ */ #include "AUD_SinusReader.h" -#include "AUD_Buffer.h" #include @@ -32,20 +31,14 @@ #define M_PI 3.14159265358979323846 #endif -AUD_SinusReader::AUD_SinusReader(double frequency, AUD_SampleRate sampleRate) +AUD_SinusReader::AUD_SinusReader(float frequency, AUD_SampleRate sampleRate) : + m_frequency(frequency), + m_position(0), + m_sampleRate(sampleRate) { - m_frequency = frequency; - m_position = 0; - m_buffer = new AUD_Buffer(); AUD_NEW("buffer") - m_sampleRate = sampleRate; } -AUD_SinusReader::~AUD_SinusReader() -{ - delete m_buffer; AUD_DELETE("buffer") -} - -bool AUD_SinusReader::isSeekable() +bool AUD_SinusReader::isSeekable() const { return true; } @@ -55,17 +48,17 @@ void AUD_SinusReader::seek(int position) m_position = position; } -int AUD_SinusReader::getLength() +int AUD_SinusReader::getLength() const { return -1; } -int AUD_SinusReader::getPosition() +int AUD_SinusReader::getPosition() const { return m_position; } -AUD_Specs AUD_SinusReader::getSpecs() +AUD_Specs AUD_SinusReader::getSpecs() const { AUD_Specs specs; specs.rate = m_sampleRate; @@ -73,27 +66,17 @@ AUD_Specs AUD_SinusReader::getSpecs() return specs; } -AUD_ReaderType AUD_SinusReader::getType() -{ - return AUD_TYPE_STREAM; -} - -bool AUD_SinusReader::notify(AUD_Message &message) -{ - return false; -} - void AUD_SinusReader::read(int & length, sample_t* & buffer) { // resize if necessary - if(m_buffer->getSize() < length * sizeof(sample_t)) - m_buffer->resize(length * sizeof(sample_t)); + if(m_buffer.getSize() < length * sizeof(sample_t)) + m_buffer.resize(length * sizeof(sample_t)); // fill with sine data - buffer = m_buffer->getBuffer(); + buffer = m_buffer.getBuffer(); for(int i = 0; i < length; i++) { - buffer[i] = sin((m_position + i) * 2.0f * M_PI * m_frequency / + buffer[i] = sin((m_position + i) * 2 * M_PI * m_frequency / (float)m_sampleRate); } diff --git a/intern/audaspace/intern/AUD_SinusReader.h b/intern/audaspace/intern/AUD_SinusReader.h index cb060dd8a43..4b88ed15db1 100644 --- a/intern/audaspace/intern/AUD_SinusReader.h +++ b/intern/audaspace/intern/AUD_SinusReader.h @@ -27,7 +27,7 @@ #define AUD_SINUSREADER #include "AUD_IReader.h" -class AUD_Buffer; +#include "AUD_Buffer.h" /** * This class is used for sine tone playback. @@ -43,7 +43,7 @@ private: /** * The frequency of the sine wave. */ - double m_frequency; + const float m_frequency; /** * The current position in samples. @@ -53,12 +53,16 @@ private: /** * The playback buffer. */ - AUD_Buffer* m_buffer; + AUD_Buffer m_buffer; /** * The sample rate for the output. */ - AUD_SampleRate m_sampleRate; + const AUD_SampleRate m_sampleRate; + + // hide copy constructor and operator= + AUD_SinusReader(const AUD_SinusReader&); + AUD_SinusReader& operator=(const AUD_SinusReader&); public: /** @@ -66,20 +70,13 @@ public: * \param frequency The frequency of the sine wave. * \param sampleRate The output sample rate. */ - AUD_SinusReader(double frequency, AUD_SampleRate sampleRate); + AUD_SinusReader(float frequency, AUD_SampleRate sampleRate); - /** - * Destroys the reader. - */ - virtual ~AUD_SinusReader(); - - virtual bool isSeekable(); + virtual bool isSeekable() const; virtual void seek(int position); - virtual int getLength(); - virtual int getPosition(); - virtual AUD_Specs getSpecs(); - virtual AUD_ReaderType getType(); - virtual bool notify(AUD_Message &message); + virtual int getLength() const; + virtual int getPosition() const; + virtual AUD_Specs getSpecs() const; virtual void read(int & length, sample_t* & buffer); }; diff --git a/intern/audaspace/intern/AUD_SoftwareDevice.cpp b/intern/audaspace/intern/AUD_SoftwareDevice.cpp index 5a3f25fba07..261cae23294 100644 --- a/intern/audaspace/intern/AUD_SoftwareDevice.cpp +++ b/intern/audaspace/intern/AUD_SoftwareDevice.cpp @@ -25,7 +25,7 @@ #include "AUD_SoftwareDevice.h" #include "AUD_IReader.h" -#include "AUD_Mixer.h" +#include "AUD_DefaultMixer.h" #include "AUD_IFactory.h" #include "AUD_SourceCaps.h" @@ -48,12 +48,11 @@ typedef std::list::iterator AUD_HandleIterator; void AUD_SoftwareDevice::create() { - m_playingSounds = new std::list(); AUD_NEW("list") - m_pausedSounds = new std::list(); AUD_NEW("list") + m_playingSounds = new std::list(); + m_pausedSounds = new std::list(); m_playback = false; m_volume = 1.0f; - m_mixer = new AUD_Mixer(); AUD_NEW("mixer") - m_mixer->setSpecs(m_specs); + m_mixer = new AUD_DefaultMixer(m_specs); pthread_mutexattr_t attr; pthread_mutexattr_init(&attr); @@ -69,25 +68,25 @@ void AUD_SoftwareDevice::destroy() if(m_playback) playing(m_playback = false); - delete m_mixer; AUD_DELETE("mixer") + delete m_mixer; // delete all playing sounds while(m_playingSounds->begin() != m_playingSounds->end()) { - delete (*(m_playingSounds->begin()))->reader; AUD_DELETE("reader") - delete *(m_playingSounds->begin()); AUD_DELETE("handle") + delete (*(m_playingSounds->begin()))->reader; + delete *(m_playingSounds->begin()); m_playingSounds->erase(m_playingSounds->begin()); } - delete m_playingSounds; AUD_DELETE("list") + delete m_playingSounds; // delete all paused sounds while(m_pausedSounds->begin() != m_pausedSounds->end()) { - delete (*(m_pausedSounds->begin()))->reader; AUD_DELETE("reader") - delete *(m_pausedSounds->begin()); AUD_DELETE("handle") + delete (*(m_pausedSounds->begin()))->reader; + delete *(m_pausedSounds->begin()); m_pausedSounds->erase(m_pausedSounds->begin()); } - delete m_pausedSounds; AUD_DELETE("list") + delete m_pausedSounds; pthread_mutex_destroy(&m_mutex); } @@ -154,7 +153,7 @@ bool AUD_SoftwareDevice::isValid(AUD_Handle* handle) return false; } -AUD_DeviceSpecs AUD_SoftwareDevice::getSpecs() +AUD_DeviceSpecs AUD_SoftwareDevice::getSpecs() const { return m_specs; } @@ -174,7 +173,7 @@ AUD_Handle* AUD_SoftwareDevice::play(AUD_IFactory* factory, bool keep) AUD_Specs rs = reader->getSpecs(); // play sound - AUD_SoftwareHandle* sound = new AUD_SoftwareHandle; AUD_NEW("handle") + AUD_SoftwareHandle* sound = new AUD_SoftwareHandle; sound->keep = keep; sound->reader = reader; sound->volume = 1.0f; @@ -252,8 +251,8 @@ bool AUD_SoftwareDevice::stop(AUD_Handle* handle) { if(*i == handle) { - delete (*i)->reader; AUD_DELETE("reader") - delete *i; AUD_DELETE("handle") + delete (*i)->reader; + delete *i; m_playingSounds->erase(i); if(m_playingSounds->empty()) playing(m_playback = false); @@ -268,8 +267,8 @@ bool AUD_SoftwareDevice::stop(AUD_Handle* handle) { if(*i == handle) { - delete (*i)->reader; AUD_DELETE("reader") - delete *i; AUD_DELETE("handle") + delete (*i)->reader; + delete *i; m_pausedSounds->erase(i); result = true; break; @@ -299,27 +298,6 @@ bool AUD_SoftwareDevice::setKeep(AUD_Handle* handle, bool keep) return result; } -bool AUD_SoftwareDevice::sendMessage(AUD_Handle* handle, AUD_Message &message) -{ - lock(); - - bool result = false; - - if(handle == 0) - { - for(AUD_HandleIterator i = m_playingSounds->begin(); - i != m_playingSounds->end(); i++) - result |= (*i)->reader->notify(message); - for(AUD_HandleIterator i = m_pausedSounds->begin(); - i != m_pausedSounds->end(); i++) - result |= (*i)->reader->notify(message); - } - else if(isValid(handle)) - result = ((AUD_SoftwareHandle*)handle)->reader->notify(message); - unlock(); - return result; -} - bool AUD_SoftwareDevice::seek(AUD_Handle* handle, float position) { lock(); diff --git a/intern/audaspace/intern/AUD_SoftwareDevice.h b/intern/audaspace/intern/AUD_SoftwareDevice.h index a12fddb1e00..e59f9887a0c 100644 --- a/intern/audaspace/intern/AUD_SoftwareDevice.h +++ b/intern/audaspace/intern/AUD_SoftwareDevice.h @@ -111,13 +111,12 @@ private: bool isValid(AUD_Handle* handle); public: - virtual AUD_DeviceSpecs getSpecs(); + virtual AUD_DeviceSpecs getSpecs() const; virtual AUD_Handle* play(AUD_IFactory* factory, bool keep = false); virtual bool pause(AUD_Handle* handle); virtual bool resume(AUD_Handle* handle); virtual bool stop(AUD_Handle* handle); virtual bool setKeep(AUD_Handle* handle, bool keep); - virtual bool sendMessage(AUD_Handle* handle, AUD_Message &message); virtual bool seek(AUD_Handle* handle, float position); virtual float getPosition(AUD_Handle* handle); virtual AUD_Status getStatus(AUD_Handle* handle); diff --git a/intern/audaspace/intern/AUD_Space.h b/intern/audaspace/intern/AUD_Space.h index 9e857ce73b0..d03986defe7 100644 --- a/intern/audaspace/intern/AUD_Space.h +++ b/intern/audaspace/intern/AUD_Space.h @@ -93,18 +93,6 @@ */ #define AUD_CAPS_BUFFERED_FACTORY 0x2001 -// Used for debugging memory leaks. -//#define AUD_DEBUG_MEMORY - -#ifdef AUD_DEBUG_MEMORY -extern int AUD_References(int count, const char* text); -#define AUD_NEW(text) AUD_References(1, text); -#define AUD_DELETE(text) AUD_References(-1, text); -#else -#define AUD_NEW(text) -#define AUD_DELETE(text) -#endif - /** * The format of a sample. * The last 4 bit save the byte count of the format. @@ -154,17 +142,6 @@ typedef enum AUD_RATE_192000 = 192000 /// 192000 Hz. } AUD_SampleRate; -/** - * Type of a reader. - * @see AUD_IReader for details. - */ -typedef enum -{ - AUD_TYPE_INVALID = 0, /// Invalid reader type. - AUD_TYPE_BUFFER, /// Reader reads from a buffer. - AUD_TYPE_STREAM /// Reader reads from a stream. -} AUD_ReaderType; - /// Status of a playback handle. typedef enum { @@ -186,14 +163,6 @@ typedef enum AUD_ERROR_JACK } AUD_Error; -/// Message codes. -typedef enum -{ - AUD_MSG_INVALID = 0, /// Invalid message. - AUD_MSG_LOOP, /// Loop reader message. - AUD_MSG_VOLUME /// Volume reader message. -} AUD_MessageType; - /// Fading types. typedef enum { @@ -283,28 +252,6 @@ typedef struct // void* userData; - for the case it is needed someday } AUD_Exception; -/// Message structure. -typedef struct -{ - /** - * The message type. - */ - AUD_MessageType type; - - union - { - // loop reader - struct - { - int loopcount; - float time; - }; - - // volume reader - float volume; - }; -} AUD_Message; - /// Handle structure, for inherition. typedef struct { diff --git a/intern/audaspace/intern/AUD_StreamBufferFactory.cpp b/intern/audaspace/intern/AUD_StreamBufferFactory.cpp index 4d2cd9e2505..4079079cb33 100644 --- a/intern/audaspace/intern/AUD_StreamBufferFactory.cpp +++ b/intern/audaspace/intern/AUD_StreamBufferFactory.cpp @@ -29,15 +29,12 @@ #include -AUD_StreamBufferFactory::AUD_StreamBufferFactory(AUD_IFactory* factory) +AUD_StreamBufferFactory::AUD_StreamBufferFactory(AUD_IFactory* factory) : + m_buffer(new AUD_Buffer()) { AUD_IReader* reader = factory->createReader(); - if(reader == NULL) - AUD_THROW(AUD_ERROR_READER); - m_specs = reader->getSpecs(); - m_buffer = AUD_Reference(new AUD_Buffer()); AUD_NEW("buffer") int sample_size = AUD_SAMPLE_SIZE(m_specs); int length; @@ -68,13 +65,11 @@ AUD_StreamBufferFactory::AUD_StreamBufferFactory(AUD_IFactory* factory) index += length; } - m_buffer.get()->resize(index*sample_size, true); - delete reader; AUD_DELETE("reader") + m_buffer.get()->resize(index * sample_size, true); + delete reader; } -AUD_IReader* AUD_StreamBufferFactory::createReader() +AUD_IReader* AUD_StreamBufferFactory::createReader() const { - AUD_IReader* reader = new AUD_BufferReader(m_buffer, m_specs); - AUD_NEW("reader") - return reader; + return new AUD_BufferReader(m_buffer, m_specs); } diff --git a/intern/audaspace/intern/AUD_StreamBufferFactory.h b/intern/audaspace/intern/AUD_StreamBufferFactory.h index eda06f6c10c..d0cf1001e5c 100644 --- a/intern/audaspace/intern/AUD_StreamBufferFactory.h +++ b/intern/audaspace/intern/AUD_StreamBufferFactory.h @@ -47,6 +47,10 @@ private: */ AUD_Specs m_specs; + // hide copy constructor and operator= + AUD_StreamBufferFactory(const AUD_StreamBufferFactory&); + AUD_StreamBufferFactory& operator=(const AUD_StreamBufferFactory&); + public: /** * Creates the factory and reads the reader created by the factory supplied @@ -56,7 +60,7 @@ public: */ AUD_StreamBufferFactory(AUD_IFactory* factory); - virtual AUD_IReader* createReader(); + virtual AUD_IReader* createReader() const; }; #endif //AUD_STREAMBUFFERFACTORY diff --git a/intern/audaspace/jack/AUD_JackDevice.cpp b/intern/audaspace/jack/AUD_JackDevice.cpp index ae7725be81c..08a1d5920e5 100644 --- a/intern/audaspace/jack/AUD_JackDevice.cpp +++ b/intern/audaspace/jack/AUD_JackDevice.cpp @@ -26,7 +26,6 @@ #include "AUD_Mixer.h" #include "AUD_JackDevice.h" #include "AUD_IReader.h" -#include "AUD_Buffer.h" #include #include @@ -43,8 +42,8 @@ void AUD_JackDevice::updateRingBuffers() unsigned int samplesize = AUD_SAMPLE_SIZE(m_specs); unsigned int i, j; unsigned int channels = m_specs.channels; - sample_t* buffer = m_buffer->getBuffer(); - float* deinterleave = m_deinterleavebuf->getBuffer(); + sample_t* buffer = m_buffer.getBuffer(); + float* deinterleave = m_deinterleavebuf.getBuffer(); jack_transport_state_t state; jack_position_t position; @@ -196,7 +195,7 @@ AUD_JackDevice::AUD_JackDevice(AUD_DeviceSpecs specs, int buffersize) jack_set_sync_callback(m_client, AUD_JackDevice::jack_sync, this); // register our output channels which are called ports in jack - m_ports = new jack_port_t*[m_specs.channels]; AUD_NEW("jack_port") + m_ports = new jack_port_t*[m_specs.channels]; try { @@ -211,22 +210,22 @@ AUD_JackDevice::AUD_JackDevice(AUD_DeviceSpecs specs, int buffersize) AUD_THROW(AUD_ERROR_JACK); } } - catch(AUD_Exception) + catch(AUD_Exception&) { jack_client_close(m_client); - delete[] m_ports; AUD_DELETE("jack_port") + delete[] m_ports; throw; } m_specs.rate = (AUD_SampleRate)jack_get_sample_rate(m_client); buffersize *= sizeof(sample_t); - m_ringbuffers = new jack_ringbuffer_t*[specs.channels]; AUD_NEW("jack_buffers") + m_ringbuffers = new jack_ringbuffer_t*[specs.channels]; for(unsigned int i = 0; i < specs.channels; i++) m_ringbuffers[i] = jack_ringbuffer_create(buffersize); buffersize *= specs.channels; - m_buffer = new AUD_Buffer(buffersize); AUD_NEW("buffer"); - m_deinterleavebuf = new AUD_Buffer(buffersize); AUD_NEW("buffer"); + m_deinterleavebuf.resize(buffersize); + m_buffer.resize(buffersize); create(); @@ -238,25 +237,19 @@ AUD_JackDevice::AUD_JackDevice(AUD_DeviceSpecs specs, int buffersize) pthread_mutex_init(&m_mixingLock, NULL); pthread_cond_init(&m_mixingCondition, NULL); - try - { - // activate the client - if(jack_activate(m_client)) - AUD_THROW(AUD_ERROR_JACK); - } - catch(AUD_Exception) + // activate the client + if(jack_activate(m_client)) { jack_client_close(m_client); - delete[] m_ports; AUD_DELETE("jack_port") - delete m_buffer; AUD_DELETE("buffer"); - delete m_deinterleavebuf; AUD_DELETE("buffer"); + delete[] m_ports; for(unsigned int i = 0; i < specs.channels; i++) jack_ringbuffer_free(m_ringbuffers[i]); - delete[] m_ringbuffers; AUD_DELETE("jack_buffers") + delete[] m_ringbuffers; pthread_mutex_destroy(&m_mixingLock); pthread_cond_destroy(&m_mixingCondition); destroy(); - throw; + + AUD_THROW(AUD_ERROR_JACK); } const char** ports = jack_get_ports(m_client, NULL, NULL, @@ -284,7 +277,7 @@ AUD_JackDevice::~AUD_JackDevice() jack_client_close(m_client); m_valid = false; - delete[] m_ports; AUD_DELETE("jack_port") + delete[] m_ports; pthread_mutex_lock(&m_mixingLock); pthread_cond_signal(&m_mixingCondition); @@ -293,11 +286,9 @@ AUD_JackDevice::~AUD_JackDevice() pthread_cond_destroy(&m_mixingCondition); pthread_mutex_destroy(&m_mixingLock); - delete m_buffer; AUD_DELETE("buffer"); - delete m_deinterleavebuf; AUD_DELETE("buffer"); for(unsigned int i = 0; i < m_specs.channels; i++) jack_ringbuffer_free(m_ringbuffers[i]); - delete[] m_ringbuffers; AUD_DELETE("jack_buffers") + delete[] m_ringbuffers; destroy(); } diff --git a/intern/audaspace/jack/AUD_JackDevice.h b/intern/audaspace/jack/AUD_JackDevice.h index 58e34978c1f..abd32147246 100644 --- a/intern/audaspace/jack/AUD_JackDevice.h +++ b/intern/audaspace/jack/AUD_JackDevice.h @@ -28,7 +28,7 @@ #include "AUD_SoftwareDevice.h" -class AUD_Buffer; +#include "AUD_Buffer.h" #include #include @@ -54,9 +54,12 @@ private: /** * The output buffer. */ - AUD_Buffer* m_buffer; + AUD_Buffer m_buffer; - AUD_Buffer* m_deinterleavebuf; + /** + * The deinterleaving buffer. + */ + AUD_Buffer m_deinterleavebuf; jack_ringbuffer_t** m_ringbuffers; @@ -114,13 +117,18 @@ private: void updateRingBuffers(); + // hide copy constructor and operator= + AUD_JackDevice(const AUD_JackDevice&); + AUD_JackDevice& operator=(const AUD_JackDevice&); + protected: virtual void playing(bool playing); public: /** * Creates a Jack client for audio output. - * \param specs The wanted audio specification, where only the channel count is important. + * \param specs The wanted audio specification, where only the channel count + * is important. * \exception AUD_Exception Thrown if the audio device cannot be opened. */ AUD_JackDevice(AUD_DeviceSpecs specs, int buffersize = AUD_DEFAULT_BUFFER_SIZE); diff --git a/intern/audaspace/sndfile/AUD_SndFileFactory.cpp b/intern/audaspace/sndfile/AUD_SndFileFactory.cpp index bac6dc321f4..d8ea7006073 100644 --- a/intern/audaspace/sndfile/AUD_SndFileFactory.cpp +++ b/intern/audaspace/sndfile/AUD_SndFileFactory.cpp @@ -29,39 +29,21 @@ #include -AUD_SndFileFactory::AUD_SndFileFactory(const char* filename) +AUD_SndFileFactory::AUD_SndFileFactory(std::string filename) : + m_filename(filename) { - if(filename != NULL) - { - m_filename = new char[strlen(filename)+1]; AUD_NEW("string") - strcpy(m_filename, filename); - } - else - m_filename = NULL; } -AUD_SndFileFactory::AUD_SndFileFactory(unsigned char* buffer, int size) +AUD_SndFileFactory::AUD_SndFileFactory(const data_t* buffer, int size) : + m_buffer(new AUD_Buffer(size)) { - m_filename = NULL; - m_buffer = AUD_Reference(new AUD_Buffer(size)); memcpy(m_buffer.get()->getBuffer(), buffer, size); } -AUD_SndFileFactory::~AUD_SndFileFactory() +AUD_IReader* AUD_SndFileFactory::createReader() const { - if(m_filename) - { - delete[] m_filename; AUD_DELETE("string") - } -} - -AUD_IReader* AUD_SndFileFactory::createReader() -{ - AUD_IReader* reader; - if(m_filename) - reader = new AUD_SndFileReader(m_filename); + if(m_buffer.get()) + return new AUD_SndFileReader(m_buffer); else - reader = new AUD_SndFileReader(m_buffer); - AUD_NEW("reader") - return reader; + return new AUD_SndFileReader(m_filename); } diff --git a/intern/audaspace/sndfile/AUD_SndFileFactory.h b/intern/audaspace/sndfile/AUD_SndFileFactory.h index 98187ff1590..350e48abef8 100644 --- a/intern/audaspace/sndfile/AUD_SndFileFactory.h +++ b/intern/audaspace/sndfile/AUD_SndFileFactory.h @@ -30,6 +30,8 @@ #include "AUD_Reference.h" class AUD_Buffer; +#include + /** * This factory reads a sound file via libsndfile. */ @@ -39,33 +41,32 @@ private: /** * The filename of the sound source file. */ - char* m_filename; + std::string m_filename; /** * The buffer to read from. */ AUD_Reference m_buffer; + // hide copy constructor and operator= + AUD_SndFileFactory(const AUD_SndFileFactory&); + AUD_SndFileFactory& operator=(const AUD_SndFileFactory&); + public: /** * Creates a new factory. * \param filename The sound file path. */ - AUD_SndFileFactory(const char* filename); + AUD_SndFileFactory(std::string filename); /** * Creates a new factory. * \param buffer The buffer to read from. * \param size The size of the buffer. */ - AUD_SndFileFactory(unsigned char* buffer, int size); + AUD_SndFileFactory(const data_t* buffer, int size); - /** - * Destroys the factory. - */ - ~AUD_SndFileFactory(); - - virtual AUD_IReader* createReader(); + virtual AUD_IReader* createReader() const; }; #endif //AUD_SNDFILEFACTORY diff --git a/intern/audaspace/sndfile/AUD_SndFileReader.cpp b/intern/audaspace/sndfile/AUD_SndFileReader.cpp index f9ed8d6388e..339139e9abb 100644 --- a/intern/audaspace/sndfile/AUD_SndFileReader.cpp +++ b/intern/audaspace/sndfile/AUD_SndFileReader.cpp @@ -24,7 +24,6 @@ */ #include "AUD_SndFileReader.h" -#include "AUD_Buffer.h" #include @@ -77,12 +76,13 @@ sf_count_t AUD_SndFileReader::vio_tell(void *user_data) return reader->m_memoffset; } -AUD_SndFileReader::AUD_SndFileReader(const char* filename) +AUD_SndFileReader::AUD_SndFileReader(std::string filename) : + m_position(0) { SF_INFO sfinfo; sfinfo.format = 0; - m_sndfile = sf_open(filename, SFM_READ, &sfinfo); + m_sndfile = sf_open(filename.c_str(), SFM_READ, &sfinfo); if(!m_sndfile) AUD_THROW(AUD_ERROR_FILE); @@ -91,16 +91,13 @@ AUD_SndFileReader::AUD_SndFileReader(const char* filename) m_specs.rate = (AUD_SampleRate) sfinfo.samplerate; m_length = sfinfo.frames; m_seekable = sfinfo.seekable; - m_position = 0; - - m_buffer = new AUD_Buffer(); AUD_NEW("buffer") } -AUD_SndFileReader::AUD_SndFileReader(AUD_Reference buffer) +AUD_SndFileReader::AUD_SndFileReader(AUD_Reference buffer) : + m_position(0), + m_membuffer(buffer), + m_memoffset(0) { - m_membuffer = buffer; - m_memoffset = 0; - m_vio.get_filelen = vio_get_filelen; m_vio.read = vio_read; m_vio.seek = vio_seek; @@ -119,19 +116,14 @@ AUD_SndFileReader::AUD_SndFileReader(AUD_Reference buffer) m_specs.rate = (AUD_SampleRate) sfinfo.samplerate; m_length = sfinfo.frames; m_seekable = sfinfo.seekable; - m_position = 0; - - m_buffer = new AUD_Buffer(); AUD_NEW("buffer") } AUD_SndFileReader::~AUD_SndFileReader() { sf_close(m_sndfile); - - delete m_buffer; AUD_DELETE("buffer") } -bool AUD_SndFileReader::isSeekable() +bool AUD_SndFileReader::isSeekable() const { return m_seekable; } @@ -145,40 +137,30 @@ void AUD_SndFileReader::seek(int position) } } -int AUD_SndFileReader::getLength() +int AUD_SndFileReader::getLength() const { return m_length; } -int AUD_SndFileReader::getPosition() +int AUD_SndFileReader::getPosition() const { return m_position; } -AUD_Specs AUD_SndFileReader::getSpecs() +AUD_Specs AUD_SndFileReader::getSpecs() const { return m_specs; } -AUD_ReaderType AUD_SndFileReader::getType() -{ - return AUD_TYPE_STREAM; -} - -bool AUD_SndFileReader::notify(AUD_Message &message) -{ - return false; -} - void AUD_SndFileReader::read(int & length, sample_t* & buffer) { int sample_size = AUD_SAMPLE_SIZE(m_specs); // resize output buffer if necessary - if(m_buffer->getSize() < length*sample_size) - m_buffer->resize(length*sample_size); + if(m_buffer.getSize() < length*sample_size) + m_buffer.resize(length*sample_size); - buffer = m_buffer->getBuffer(); + buffer = m_buffer.getBuffer(); length = sf_readf_float(m_sndfile, buffer, length); diff --git a/intern/audaspace/sndfile/AUD_SndFileReader.h b/intern/audaspace/sndfile/AUD_SndFileReader.h index 8886b6e9efc..a53189fdecd 100644 --- a/intern/audaspace/sndfile/AUD_SndFileReader.h +++ b/intern/audaspace/sndfile/AUD_SndFileReader.h @@ -28,8 +28,9 @@ #include "AUD_IReader.h" #include "AUD_Reference.h" -class AUD_Buffer; +#include "AUD_Buffer.h" +#include #include typedef sf_count_t (*sf_read_f)(SNDFILE *sndfile, void *ptr, sf_count_t frames); @@ -63,7 +64,7 @@ private: /** * The playback buffer. */ - AUD_Buffer* m_buffer; + AUD_Buffer m_buffer; /** * The sndfile. @@ -91,6 +92,10 @@ private: static sf_count_t vio_read(void *ptr, sf_count_t count, void *user_data); static sf_count_t vio_tell(void *user_data); + // hide copy constructor and operator= + AUD_SndFileReader(const AUD_SndFileReader&); + AUD_SndFileReader& operator=(const AUD_SndFileReader&); + public: /** * Creates a new reader. @@ -98,7 +103,7 @@ public: * \exception AUD_Exception Thrown if the file specified does not exist or * cannot be read with libsndfile. */ - AUD_SndFileReader(const char* filename); + AUD_SndFileReader(std::string filename); /** * Creates a new reader. @@ -113,13 +118,11 @@ public: */ virtual ~AUD_SndFileReader(); - virtual bool isSeekable(); + virtual bool isSeekable() const; virtual void seek(int position); - virtual int getLength(); - virtual int getPosition(); - virtual AUD_Specs getSpecs(); - virtual AUD_ReaderType getType(); - virtual bool notify(AUD_Message &message); + virtual int getLength() const; + virtual int getPosition() const; + virtual AUD_Specs getSpecs() const; virtual void read(int & length, sample_t* & buffer); };