From d8974a60f6811faa2872b55eda41b03387614ed1 Mon Sep 17 00:00:00 2001 From: Joerg Mueller Date: Tue, 14 Jun 2011 12:13:19 +0000 Subject: 3D Audio GSoC: Changed Readers to top-down architecture instead of bottom-up. --- intern/audaspace/FX/AUD_BaseIIRFilterReader.cpp | 15 ++------- intern/audaspace/FX/AUD_BaseIIRFilterReader.h | 7 +---- intern/audaspace/FX/AUD_DelayReader.cpp | 29 +++-------------- intern/audaspace/FX/AUD_DelayReader.h | 12 +------ intern/audaspace/FX/AUD_DoubleReader.cpp | 17 ++-------- intern/audaspace/FX/AUD_DoubleReader.h | 2 +- intern/audaspace/FX/AUD_EffectReader.cpp | 2 +- intern/audaspace/FX/AUD_EffectReader.h | 2 +- intern/audaspace/FX/AUD_FaderReader.cpp | 42 +++---------------------- intern/audaspace/FX/AUD_FaderReader.h | 12 +------ intern/audaspace/FX/AUD_LimiterReader.cpp | 6 ++-- intern/audaspace/FX/AUD_LimiterReader.h | 2 +- intern/audaspace/FX/AUD_LoopReader.cpp | 15 ++------- intern/audaspace/FX/AUD_LoopReader.h | 7 +---- intern/audaspace/FX/AUD_ReverseReader.cpp | 32 +++++++++---------- intern/audaspace/FX/AUD_ReverseReader.h | 7 +---- intern/audaspace/FX/AUD_SuperposeReader.cpp | 8 ++--- intern/audaspace/FX/AUD_SuperposeReader.h | 2 +- 18 files changed, 49 insertions(+), 170 deletions(-) (limited to 'intern/audaspace/FX') diff --git a/intern/audaspace/FX/AUD_BaseIIRFilterReader.cpp b/intern/audaspace/FX/AUD_BaseIIRFilterReader.cpp index 5ad5903141b..9ddd8af019b 100644 --- a/intern/audaspace/FX/AUD_BaseIIRFilterReader.cpp +++ b/intern/audaspace/FX/AUD_BaseIIRFilterReader.cpp @@ -55,24 +55,15 @@ AUD_BaseIIRFilterReader::~AUD_BaseIIRFilterReader() delete[] m_y; } -void AUD_BaseIIRFilterReader::read(int & length, sample_t* & buffer) +void AUD_BaseIIRFilterReader::read(int & length, sample_t* buffer) { - sample_t* buf; - - int samplesize = AUD_SAMPLE_SIZE(m_reader->getSpecs()); - - m_reader->read(length, buf); - - if(m_buffer.getSize() < length * samplesize) - m_buffer.resize(length * samplesize); - - buffer = m_buffer.getBuffer(); + m_reader->read(length, buffer); for(m_channel = 0; m_channel < m_channels; m_channel++) { for(int i = 0; i < length; i++) { - m_x[m_xpos * CC] = buf[i * CC]; + m_x[m_xpos * CC] = buffer[i * CC]; m_y[m_ypos * CC] = buffer[i * CC] = filter(); m_xpos = (m_xpos + 1) % m_xlen; diff --git a/intern/audaspace/FX/AUD_BaseIIRFilterReader.h b/intern/audaspace/FX/AUD_BaseIIRFilterReader.h index 9f81e2d8a25..2d1f21446a0 100644 --- a/intern/audaspace/FX/AUD_BaseIIRFilterReader.h +++ b/intern/audaspace/FX/AUD_BaseIIRFilterReader.h @@ -56,11 +56,6 @@ private: */ const int m_ylen; - /** - * The playback buffer. - */ - AUD_Buffer m_buffer; - /** * The last in samples array. */ @@ -112,7 +107,7 @@ public: virtual ~AUD_BaseIIRFilterReader(); - virtual void read(int & length, sample_t* & buffer); + virtual void read(int & length, sample_t* buffer); virtual sample_t filter()=0; }; diff --git a/intern/audaspace/FX/AUD_DelayReader.cpp b/intern/audaspace/FX/AUD_DelayReader.cpp index a2224caf288..2e93184358e 100644 --- a/intern/audaspace/FX/AUD_DelayReader.cpp +++ b/intern/audaspace/FX/AUD_DelayReader.cpp @@ -36,8 +36,7 @@ AUD_DelayReader::AUD_DelayReader(AUD_Reference reader, float delay) : AUD_EffectReader(reader), m_delay(int(delay * reader->getSpecs().rate)), - m_remdelay(int(delay * reader->getSpecs().rate)), - m_empty(true) + m_remdelay(int(delay * reader->getSpecs().rate)) { } @@ -70,46 +69,28 @@ int AUD_DelayReader::getPosition() const return m_reader->getPosition() + m_delay; } -void AUD_DelayReader::read(int & length, sample_t* & buffer) +void AUD_DelayReader::read(int & length, sample_t* buffer) { if(m_remdelay > 0) { AUD_Specs specs = m_reader->getSpecs(); int samplesize = AUD_SAMPLE_SIZE(specs); - if(m_buffer.getSize() < length * samplesize) - { - m_buffer.resize(length * samplesize); - m_empty = false; - } - - buffer = m_buffer.getBuffer(); - if(length > m_remdelay) { - if(!m_empty) - memset(buffer, 0, m_remdelay * samplesize); + memset(buffer, 0, m_remdelay * samplesize); int len = length - m_remdelay; - sample_t* buf; - m_reader->read(len, buf); - - memcpy(buffer + m_remdelay * specs.channels, - buf, len * samplesize); + m_reader->read(len, buffer + m_remdelay * specs.channels); if(len < length-m_remdelay) length = m_remdelay + len; m_remdelay = 0; - m_empty = false; } else { - if(!m_empty) - { - memset(buffer, 0, length * samplesize); - m_empty = true; - } + memset(buffer, 0, length * samplesize); m_remdelay -= length; } } diff --git a/intern/audaspace/FX/AUD_DelayReader.h b/intern/audaspace/FX/AUD_DelayReader.h index 695003a8c43..cb0ec9bcd9d 100644 --- a/intern/audaspace/FX/AUD_DelayReader.h +++ b/intern/audaspace/FX/AUD_DelayReader.h @@ -41,11 +41,6 @@ class AUD_DelayReader : public AUD_EffectReader { private: - /** - * The playback buffer. - */ - AUD_Buffer m_buffer; - /** * The delay level. */ @@ -56,11 +51,6 @@ private: */ 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&); @@ -76,7 +66,7 @@ public: virtual void seek(int position); virtual int getLength() const; virtual int getPosition() const; - virtual void read(int & length, sample_t* & buffer); + virtual void read(int & length, sample_t* buffer); }; #endif //AUD_DELAYREADER diff --git a/intern/audaspace/FX/AUD_DoubleReader.cpp b/intern/audaspace/FX/AUD_DoubleReader.cpp index bf1c770a2ed..605c49066d2 100644 --- a/intern/audaspace/FX/AUD_DoubleReader.cpp +++ b/intern/audaspace/FX/AUD_DoubleReader.cpp @@ -89,7 +89,7 @@ AUD_Specs AUD_DoubleReader::getSpecs() const return m_reader1->getSpecs(); } -void AUD_DoubleReader::read(int & length, sample_t* & buffer) +void AUD_DoubleReader::read(int & length, sample_t* buffer) { if(!m_finished1) { @@ -98,23 +98,12 @@ void AUD_DoubleReader::read(int & length, sample_t* & 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); - - sample_t* buf = buffer; - buffer = m_buffer.getBuffer(); - - memcpy(buffer, buf, len * samplesize); + const AUD_Specs specs = m_reader1->getSpecs(); len = length - len; length -= len; - m_reader2->read(len, buf); - memcpy(buffer + length * specs.channels, buf, - len * samplesize); + m_reader2->read(len, buffer + length * specs.channels); length += len; diff --git a/intern/audaspace/FX/AUD_DoubleReader.h b/intern/audaspace/FX/AUD_DoubleReader.h index 4f01c47d052..d68000fe81a 100644 --- a/intern/audaspace/FX/AUD_DoubleReader.h +++ b/intern/audaspace/FX/AUD_DoubleReader.h @@ -85,7 +85,7 @@ public: virtual int getLength() const; virtual int getPosition() const; virtual AUD_Specs getSpecs() const; - virtual void read(int & length, sample_t* & buffer); + virtual void read(int & length, sample_t* buffer); }; #endif //AUD_DOUBLEREADER diff --git a/intern/audaspace/FX/AUD_EffectReader.cpp b/intern/audaspace/FX/AUD_EffectReader.cpp index d7c4eeb2ee1..aa8fe7a7f35 100644 --- a/intern/audaspace/FX/AUD_EffectReader.cpp +++ b/intern/audaspace/FX/AUD_EffectReader.cpp @@ -65,7 +65,7 @@ AUD_Specs AUD_EffectReader::getSpecs() const return m_reader->getSpecs(); } -void AUD_EffectReader::read(int & length, sample_t* & buffer) +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 6aa185edcd0..cfb8e5b6e77 100644 --- a/intern/audaspace/FX/AUD_EffectReader.h +++ b/intern/audaspace/FX/AUD_EffectReader.h @@ -69,7 +69,7 @@ public: virtual int getLength() const; virtual int getPosition() const; virtual AUD_Specs getSpecs() const; - virtual void read(int & length, sample_t* & buffer); + virtual void read(int & length, sample_t* buffer); }; #endif //AUD_EFFECTREADER diff --git a/intern/audaspace/FX/AUD_FaderReader.cpp b/intern/audaspace/FX/AUD_FaderReader.cpp index e319e205e5f..7fe5c503c23 100644 --- a/intern/audaspace/FX/AUD_FaderReader.cpp +++ b/intern/audaspace/FX/AUD_FaderReader.cpp @@ -38,12 +38,11 @@ AUD_FaderReader::AUD_FaderReader(AUD_Reference reader, AUD_FadeType AUD_EffectReader(reader), m_type(type), m_start(start), - m_length(length), - m_empty(true) + m_length(length) { } -void AUD_FaderReader::read(int & length, sample_t* & buffer) +void AUD_FaderReader::read(int & length, sample_t* buffer) { int position = m_reader->getPosition(); AUD_Specs specs = m_reader->getSpecs(); @@ -55,46 +54,18 @@ void AUD_FaderReader::read(int & length, sample_t* & buffer) { if(m_type != AUD_FADE_OUT) { - 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; - } + memset(buffer, 0, length * samplesize); } } else if(position / (float)specs.rate >= m_start+m_length) { if(m_type == AUD_FADE_OUT) { - 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; - } + memset(buffer, 0, length * samplesize); } } else { - 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++) @@ -111,10 +82,7 @@ void AUD_FaderReader::read(int & length, sample_t* & buffer) volume = 1.0f - volume; } - buf[i] = buffer[i] * volume; + buffer[i] = buffer[i] * volume; } - - buffer = buf; - m_empty = false; } } diff --git a/intern/audaspace/FX/AUD_FaderReader.h b/intern/audaspace/FX/AUD_FaderReader.h index b088477bce0..c0eb3d27d36 100644 --- a/intern/audaspace/FX/AUD_FaderReader.h +++ b/intern/audaspace/FX/AUD_FaderReader.h @@ -58,16 +58,6 @@ private: */ 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&); @@ -82,7 +72,7 @@ public: AUD_FaderReader(AUD_Reference reader, AUD_FadeType type, float start,float length); - virtual void read(int & length, sample_t* & buffer); + virtual void read(int & length, sample_t* buffer); }; #endif //AUD_FADERREADER diff --git a/intern/audaspace/FX/AUD_LimiterReader.cpp b/intern/audaspace/FX/AUD_LimiterReader.cpp index d5a46568b3e..0f87679410e 100644 --- a/intern/audaspace/FX/AUD_LimiterReader.cpp +++ b/intern/audaspace/FX/AUD_LimiterReader.cpp @@ -48,14 +48,14 @@ AUD_LimiterReader::AUD_LimiterReader(AUD_Reference reader, { // skip first m_start samples by reading them int length = AUD_DEFAULT_BUFFER_SIZE; - sample_t* buffer; + AUD_Buffer buffer(AUD_DEFAULT_BUFFER_SIZE * AUD_SAMPLE_SIZE(m_reader->getSpecs())); for(int len = m_start; length == AUD_DEFAULT_BUFFER_SIZE; len -= AUD_DEFAULT_BUFFER_SIZE) { if(len < AUD_DEFAULT_BUFFER_SIZE) length = len; - m_reader->read(length, buffer); + m_reader->read(length, buffer.getBuffer()); } } } @@ -80,7 +80,7 @@ int AUD_LimiterReader::getPosition() const return AUD_MIN(pos, m_end) - m_start; } -void AUD_LimiterReader::read(int & length, sample_t* & buffer) +void AUD_LimiterReader::read(int & length, sample_t* buffer) { if(m_end >= 0) { diff --git a/intern/audaspace/FX/AUD_LimiterReader.h b/intern/audaspace/FX/AUD_LimiterReader.h index f4502c33ae0..660dc26b7a3 100644 --- a/intern/audaspace/FX/AUD_LimiterReader.h +++ b/intern/audaspace/FX/AUD_LimiterReader.h @@ -67,7 +67,7 @@ public: virtual void seek(int position); virtual int getLength() const; virtual int getPosition() const; - virtual void read(int & length, sample_t* & buffer); + virtual void read(int & length, sample_t* buffer); }; #endif //AUD_LIMITERREADER diff --git a/intern/audaspace/FX/AUD_LoopReader.cpp b/intern/audaspace/FX/AUD_LoopReader.cpp index b7b8937abb8..0efee5b55c0 100644 --- a/intern/audaspace/FX/AUD_LoopReader.cpp +++ b/intern/audaspace/FX/AUD_LoopReader.cpp @@ -68,10 +68,9 @@ int AUD_LoopReader::getPosition() const return m_reader->getPosition() * (m_count < 0 ? 1 : m_count); } -void AUD_LoopReader::read(int & length, sample_t* & buffer) +void AUD_LoopReader::read(int & length, sample_t* buffer) { AUD_Specs specs = m_reader->getSpecs(); - int samplesize = AUD_SAMPLE_SIZE(specs); int len = length; @@ -81,13 +80,6 @@ void AUD_LoopReader::read(int & length, sample_t* & buffer) { int pos = 0; - if(m_buffer.getSize() < length * samplesize) - m_buffer.resize(length * samplesize); - - sample_t* buf = m_buffer.getBuffer(); - - memcpy(buf + pos * specs.channels, buffer, len * samplesize); - pos += len; while(pos < length && m_left) @@ -98,19 +90,16 @@ void AUD_LoopReader::read(int & length, sample_t* & buffer) m_reader->seek(0); len = length - pos; - m_reader->read(len, buffer); + m_reader->read(len, buffer + pos * specs.channels); // prevent endless loop if(!len) break; - memcpy(buf + pos * specs.channels, buffer, len * samplesize); - pos += len; } length = pos; - buffer = buf; } else length = len; diff --git a/intern/audaspace/FX/AUD_LoopReader.h b/intern/audaspace/FX/AUD_LoopReader.h index 866d6f7885f..d1338245df4 100644 --- a/intern/audaspace/FX/AUD_LoopReader.h +++ b/intern/audaspace/FX/AUD_LoopReader.h @@ -42,11 +42,6 @@ class AUD_LoopReader : public AUD_EffectReader { private: - /** - * The playback buffer. - */ - AUD_Buffer m_buffer; - /** * The loop count. */ @@ -73,7 +68,7 @@ public: virtual void seek(int position); virtual int getLength() const; virtual int getPosition() const; - virtual void read(int & length, sample_t* & buffer); + virtual void read(int & length, sample_t* buffer); }; #endif //AUD_LOOPREADER diff --git a/intern/audaspace/FX/AUD_ReverseReader.cpp b/intern/audaspace/FX/AUD_ReverseReader.cpp index 8ca9f8609bb..030896d2eae 100644 --- a/intern/audaspace/FX/AUD_ReverseReader.cpp +++ b/intern/audaspace/FX/AUD_ReverseReader.cpp @@ -60,7 +60,7 @@ int AUD_ReverseReader::getPosition() const return m_position; } -void AUD_ReverseReader::read(int & length, sample_t* & buffer) +void AUD_ReverseReader::read(int & length, sample_t* buffer) { // first correct the length if(m_position + length > m_length) @@ -72,36 +72,34 @@ void AUD_ReverseReader::read(int & length, sample_t* & buffer) return; } - AUD_Specs specs = getSpecs(); - int samplesize = AUD_SAMPLE_SIZE(specs); + const AUD_Specs specs = getSpecs(); + const int samplesize = AUD_SAMPLE_SIZE(specs); - // resize buffer if needed - if(m_buffer.getSize() < length * samplesize) - m_buffer.resize(length * samplesize); + sample_t temp[specs.channels]; - buffer = m_buffer.getBuffer(); - - sample_t* buf; int len = length; // read from reader m_reader->seek(m_length - m_position - len); - m_reader->read(len, buf); + m_reader->read(len, buffer); // set null if reader didn't give enough data if(len < length) - { memset(buffer, 0, (length - len) * samplesize); - buffer += (length - len) * specs.channels; - } // copy the samples reverted - for(int i = 0; i < len; i++) + for(int i = 0; i < length / 2; i++) + { + memcpy(temp, + buffer + (len - 1 - i) * specs.channels, + samplesize); + memcpy(buffer + (len - 1 - i) * specs.channels, + buffer + i * specs.channels, + samplesize); memcpy(buffer + i * specs.channels, - buf + (len - 1 - i) * specs.channels, + temp, samplesize); + } m_position += length; - - buffer = m_buffer.getBuffer(); } diff --git a/intern/audaspace/FX/AUD_ReverseReader.h b/intern/audaspace/FX/AUD_ReverseReader.h index d8086e08534..8525acaab36 100644 --- a/intern/audaspace/FX/AUD_ReverseReader.h +++ b/intern/audaspace/FX/AUD_ReverseReader.h @@ -52,11 +52,6 @@ private: */ int m_position; - /** - * The playback buffer. - */ - AUD_Buffer m_buffer; - // hide copy constructor and operator= AUD_ReverseReader(const AUD_ReverseReader&); AUD_ReverseReader& operator=(const AUD_ReverseReader&); @@ -73,7 +68,7 @@ public: virtual void seek(int position); virtual int getLength() const; virtual int getPosition() const; - virtual void read(int & length, sample_t* & buffer); + virtual void read(int & length, sample_t* buffer); }; #endif //AUD_REVERSEREADER diff --git a/intern/audaspace/FX/AUD_SuperposeReader.cpp b/intern/audaspace/FX/AUD_SuperposeReader.cpp index 6f39dcadf40..3ad2420fc91 100644 --- a/intern/audaspace/FX/AUD_SuperposeReader.cpp +++ b/intern/audaspace/FX/AUD_SuperposeReader.cpp @@ -82,24 +82,22 @@ AUD_Specs AUD_SuperposeReader::getSpecs() const return m_reader1->getSpecs(); } -void AUD_SuperposeReader::read(int & length, sample_t* & buffer) +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(); int len1 = length; - sample_t* buf; - m_reader1->read(len1, buf); - memcpy(buffer, buf, len1 * samplesize); + m_reader1->read(len1, buffer); if(len1 < length) memset(buffer + len1 * specs.channels, 0, (length - len1) * samplesize); int len2 = length; + sample_t* buf = m_buffer.getBuffer(); m_reader2->read(len2, buf); for(int i = 0; i < len2 * specs.channels; i++) diff --git a/intern/audaspace/FX/AUD_SuperposeReader.h b/intern/audaspace/FX/AUD_SuperposeReader.h index 26e4b138dfa..5a2a2a1d8d1 100644 --- a/intern/audaspace/FX/AUD_SuperposeReader.h +++ b/intern/audaspace/FX/AUD_SuperposeReader.h @@ -80,7 +80,7 @@ public: virtual int getLength() const; virtual int getPosition() const; virtual AUD_Specs getSpecs() const; - virtual void read(int & length, sample_t* & buffer); + virtual void read(int & length, sample_t* buffer); }; #endif //AUD_SUPERPOSEREADER -- cgit v1.2.3