diff options
author | Joerg Mueller <nexyon@gmail.com> | 2011-06-22 00:14:53 +0400 |
---|---|---|
committer | Joerg Mueller <nexyon@gmail.com> | 2011-06-22 00:14:53 +0400 |
commit | cc71dcc218d9ee4612bfe955be6f00be521be5b1 (patch) | |
tree | 5f868efc11f940b72cdf0e0c5d19f27e7d3067c7 /intern/audaspace/FX | |
parent | 7ba4362c72c3ccd4763762414bd928682a51b7ce (diff) |
3D Audio GSoC:
Streaming improved.
Diffstat (limited to 'intern/audaspace/FX')
-rw-r--r-- | intern/audaspace/FX/AUD_BaseIIRFilterReader.cpp | 4 | ||||
-rw-r--r-- | intern/audaspace/FX/AUD_BaseIIRFilterReader.h | 2 | ||||
-rw-r--r-- | intern/audaspace/FX/AUD_DelayReader.cpp | 9 | ||||
-rw-r--r-- | intern/audaspace/FX/AUD_DelayReader.h | 2 | ||||
-rw-r--r-- | intern/audaspace/FX/AUD_DoubleReader.cpp | 12 | ||||
-rw-r--r-- | intern/audaspace/FX/AUD_DoubleReader.h | 2 | ||||
-rw-r--r-- | intern/audaspace/FX/AUD_EffectReader.cpp | 4 | ||||
-rw-r--r-- | intern/audaspace/FX/AUD_EffectReader.h | 2 | ||||
-rw-r--r-- | intern/audaspace/FX/AUD_FaderReader.cpp | 4 | ||||
-rw-r--r-- | intern/audaspace/FX/AUD_FaderReader.h | 2 | ||||
-rw-r--r-- | intern/audaspace/FX/AUD_LimiterReader.cpp | 42 | ||||
-rw-r--r-- | intern/audaspace/FX/AUD_LimiterReader.h | 2 | ||||
-rw-r--r-- | intern/audaspace/FX/AUD_LoopReader.cpp | 19 | ||||
-rw-r--r-- | intern/audaspace/FX/AUD_LoopReader.h | 2 | ||||
-rw-r--r-- | intern/audaspace/FX/AUD_ReverseReader.cpp | 6 | ||||
-rw-r--r-- | intern/audaspace/FX/AUD_ReverseReader.h | 2 | ||||
-rw-r--r-- | intern/audaspace/FX/AUD_SuperposeReader.cpp | 8 | ||||
-rw-r--r-- | intern/audaspace/FX/AUD_SuperposeReader.h | 2 |
18 files changed, 79 insertions, 47 deletions
diff --git a/intern/audaspace/FX/AUD_BaseIIRFilterReader.cpp b/intern/audaspace/FX/AUD_BaseIIRFilterReader.cpp index 9ddd8af019b..79039ca605b 100644 --- a/intern/audaspace/FX/AUD_BaseIIRFilterReader.cpp +++ b/intern/audaspace/FX/AUD_BaseIIRFilterReader.cpp @@ -55,9 +55,9 @@ AUD_BaseIIRFilterReader::~AUD_BaseIIRFilterReader() delete[] m_y; } -void AUD_BaseIIRFilterReader::read(int & length, sample_t* buffer) +void AUD_BaseIIRFilterReader::read(int& length, bool& eos, sample_t* buffer) { - m_reader->read(length, buffer); + m_reader->read(length, eos, buffer); for(m_channel = 0; m_channel < m_channels; m_channel++) { diff --git a/intern/audaspace/FX/AUD_BaseIIRFilterReader.h b/intern/audaspace/FX/AUD_BaseIIRFilterReader.h index 2d1f21446a0..a300ff9d241 100644 --- a/intern/audaspace/FX/AUD_BaseIIRFilterReader.h +++ b/intern/audaspace/FX/AUD_BaseIIRFilterReader.h @@ -107,7 +107,7 @@ public: virtual ~AUD_BaseIIRFilterReader(); - virtual void read(int & length, sample_t* buffer); + virtual void read(int& length, bool& eos, 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 2e93184358e..7d58b3dae4f 100644 --- a/intern/audaspace/FX/AUD_DelayReader.cpp +++ b/intern/audaspace/FX/AUD_DelayReader.cpp @@ -69,7 +69,7 @@ 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, bool& eos, sample_t* buffer) { if(m_remdelay > 0) { @@ -81,10 +81,9 @@ void AUD_DelayReader::read(int & length, sample_t* buffer) memset(buffer, 0, m_remdelay * samplesize); int len = length - m_remdelay; - m_reader->read(len, buffer + m_remdelay * specs.channels); + m_reader->read(len, eos, buffer + m_remdelay * specs.channels); - if(len < length-m_remdelay) - length = m_remdelay + len; + length = m_remdelay + len; m_remdelay = 0; } @@ -95,5 +94,5 @@ void AUD_DelayReader::read(int & length, sample_t* buffer) } } else - m_reader->read(length, buffer); + m_reader->read(length, eos, buffer); } diff --git a/intern/audaspace/FX/AUD_DelayReader.h b/intern/audaspace/FX/AUD_DelayReader.h index cb0ec9bcd9d..a89afe73b37 100644 --- a/intern/audaspace/FX/AUD_DelayReader.h +++ b/intern/audaspace/FX/AUD_DelayReader.h @@ -66,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, bool& eos, sample_t* buffer); }; #endif //AUD_DELAYREADER diff --git a/intern/audaspace/FX/AUD_DoubleReader.cpp b/intern/audaspace/FX/AUD_DoubleReader.cpp index 605c49066d2..5d9ebbd6187 100644 --- a/intern/audaspace/FX/AUD_DoubleReader.cpp +++ b/intern/audaspace/FX/AUD_DoubleReader.cpp @@ -89,29 +89,27 @@ 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, bool& eos, sample_t* buffer) { if(!m_finished1) { int len = length; - m_reader1->read(len, buffer); + m_reader1->read(len, m_finished1, buffer); - if(len < length) + if(m_finished1) { const AUD_Specs specs = m_reader1->getSpecs(); len = length - len; length -= len; - m_reader2->read(len, buffer + length * specs.channels); + m_reader2->read(len, eos, buffer + length * specs.channels); length += len; - - m_finished1 = true; } } else { - m_reader2->read(length, buffer); + m_reader2->read(length, eos, buffer); } } diff --git a/intern/audaspace/FX/AUD_DoubleReader.h b/intern/audaspace/FX/AUD_DoubleReader.h index d68000fe81a..86f636e2cb2 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, bool& eos, sample_t* buffer); }; #endif //AUD_DOUBLEREADER diff --git a/intern/audaspace/FX/AUD_EffectReader.cpp b/intern/audaspace/FX/AUD_EffectReader.cpp index aa8fe7a7f35..4d14af76438 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, bool& eos, sample_t* buffer) { - m_reader->read(length, buffer); + m_reader->read(length, eos, buffer); } diff --git a/intern/audaspace/FX/AUD_EffectReader.h b/intern/audaspace/FX/AUD_EffectReader.h index cfb8e5b6e77..c03abd11828 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, bool& eos, sample_t* buffer); }; #endif //AUD_EFFECTREADER diff --git a/intern/audaspace/FX/AUD_FaderReader.cpp b/intern/audaspace/FX/AUD_FaderReader.cpp index 7fe5c503c23..4a6050cf0f3 100644 --- a/intern/audaspace/FX/AUD_FaderReader.cpp +++ b/intern/audaspace/FX/AUD_FaderReader.cpp @@ -42,13 +42,13 @@ AUD_FaderReader::AUD_FaderReader(AUD_Reference<AUD_IReader> reader, AUD_FadeType { } -void AUD_FaderReader::read(int & length, sample_t* buffer) +void AUD_FaderReader::read(int& length, bool& eos, sample_t* buffer) { int position = m_reader->getPosition(); AUD_Specs specs = m_reader->getSpecs(); int samplesize = AUD_SAMPLE_SIZE(specs); - m_reader->read(length, buffer); + m_reader->read(length, eos, buffer); if((position + length) / (float)specs.rate <= m_start) { diff --git a/intern/audaspace/FX/AUD_FaderReader.h b/intern/audaspace/FX/AUD_FaderReader.h index c0eb3d27d36..e702ac0ec19 100644 --- a/intern/audaspace/FX/AUD_FaderReader.h +++ b/intern/audaspace/FX/AUD_FaderReader.h @@ -72,7 +72,7 @@ public: AUD_FaderReader(AUD_Reference<AUD_IReader> reader, AUD_FadeType type, float start,float length); - virtual void read(int & length, sample_t* buffer); + virtual void read(int& length, bool& eos, sample_t* buffer); }; #endif //AUD_FADERREADER diff --git a/intern/audaspace/FX/AUD_LimiterReader.cpp b/intern/audaspace/FX/AUD_LimiterReader.cpp index 0f87679410e..52add8635e3 100644 --- a/intern/audaspace/FX/AUD_LimiterReader.cpp +++ b/intern/audaspace/FX/AUD_LimiterReader.cpp @@ -49,13 +49,15 @@ AUD_LimiterReader::AUD_LimiterReader(AUD_Reference<AUD_IReader> reader, // skip first m_start samples by reading them int length = AUD_DEFAULT_BUFFER_SIZE; AUD_Buffer buffer(AUD_DEFAULT_BUFFER_SIZE * AUD_SAMPLE_SIZE(m_reader->getSpecs())); + bool eos = false; for(int len = m_start; - length == AUD_DEFAULT_BUFFER_SIZE; + length == AUD_DEFAULT_BUFFER_SIZE && !eos; len -= AUD_DEFAULT_BUFFER_SIZE) { if(len < AUD_DEFAULT_BUFFER_SIZE) length = len; - m_reader->read(length, buffer.getBuffer()); + + m_reader->read(length, eos, buffer.getBuffer()); } } } @@ -80,18 +82,50 @@ 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, bool& eos, sample_t* buffer) { + eos = false; if(m_end >= 0) { int position = m_reader->getPosition(); if(position + length > m_end) + { length = m_end - position; + eos = true; + } + + if(position < m_start) + { + int len2 = length; + for(int len = m_start - position; + len2 == length && !eos; + len -= length) + { + if(len < length) + len2 = len; + + m_reader->read(len2, eos, buffer); + position += len2; + } + + if(position < m_start) + { + length = 0; + return; + } + } + if(length < 0) { length = 0; return; } } - m_reader->read(length, buffer); + if(eos) + { + m_reader->read(length, eos, buffer); + eos = true; + } + else + m_reader->read(length, eos, buffer); } diff --git a/intern/audaspace/FX/AUD_LimiterReader.h b/intern/audaspace/FX/AUD_LimiterReader.h index 660dc26b7a3..5a12b990eee 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, bool& eos, sample_t* buffer); }; #endif //AUD_LIMITERREADER diff --git a/intern/audaspace/FX/AUD_LoopReader.cpp b/intern/audaspace/FX/AUD_LoopReader.cpp index 0efee5b55c0..de67a445ab2 100644 --- a/intern/audaspace/FX/AUD_LoopReader.cpp +++ b/intern/audaspace/FX/AUD_LoopReader.cpp @@ -68,21 +68,20 @@ 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, bool& eos, sample_t* buffer) { - AUD_Specs specs = m_reader->getSpecs(); + const AUD_Specs specs = m_reader->getSpecs(); int len = length; - m_reader->read(len, buffer); + m_reader->read(length, eos, buffer); - if(len < length && m_left) + if(length < len && eos && m_left) { - int pos = 0; - - pos += len; + int pos = length; + length = len; - while(pos < length && m_left) + while(pos < length && eos && m_left) { if(m_left > 0) m_left--; @@ -90,7 +89,7 @@ void AUD_LoopReader::read(int & length, sample_t* buffer) m_reader->seek(0); len = length - pos; - m_reader->read(len, buffer + pos * specs.channels); + m_reader->read(len, eos, buffer + pos * specs.channels); // prevent endless loop if(!len) @@ -101,6 +100,4 @@ void AUD_LoopReader::read(int & length, sample_t* buffer) length = pos; } - else - length = len; } diff --git a/intern/audaspace/FX/AUD_LoopReader.h b/intern/audaspace/FX/AUD_LoopReader.h index d1338245df4..5ccf7e543a0 100644 --- a/intern/audaspace/FX/AUD_LoopReader.h +++ b/intern/audaspace/FX/AUD_LoopReader.h @@ -68,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, bool& eos, sample_t* buffer); }; #endif //AUD_LOOPREADER diff --git a/intern/audaspace/FX/AUD_ReverseReader.cpp b/intern/audaspace/FX/AUD_ReverseReader.cpp index 3d5828dd129..1a5083d3eb4 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, bool& eos, sample_t* buffer) { // first correct the length if(m_position + length > m_length) @@ -69,6 +69,7 @@ void AUD_ReverseReader::read(int & length, sample_t* buffer) if(length <= 0) { length = 0; + eos = true; return; } @@ -81,7 +82,7 @@ void AUD_ReverseReader::read(int & length, sample_t* buffer) // read from reader m_reader->seek(m_length - m_position - len); - m_reader->read(len, buffer); + m_reader->read(len, eos, buffer); // set null if reader didn't give enough data if(len < length) @@ -102,4 +103,5 @@ void AUD_ReverseReader::read(int & length, sample_t* buffer) } m_position += length; + eos = false; } diff --git a/intern/audaspace/FX/AUD_ReverseReader.h b/intern/audaspace/FX/AUD_ReverseReader.h index 8525acaab36..da0add9464e 100644 --- a/intern/audaspace/FX/AUD_ReverseReader.h +++ b/intern/audaspace/FX/AUD_ReverseReader.h @@ -68,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, bool& eos, sample_t* buffer); }; #endif //AUD_REVERSEREADER diff --git a/intern/audaspace/FX/AUD_SuperposeReader.cpp b/intern/audaspace/FX/AUD_SuperposeReader.cpp index 49e29d2b0f9..fadd064da76 100644 --- a/intern/audaspace/FX/AUD_SuperposeReader.cpp +++ b/intern/audaspace/FX/AUD_SuperposeReader.cpp @@ -82,7 +82,7 @@ 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, bool& eos, sample_t* buffer) { AUD_Specs specs = m_reader1->getSpecs(); int samplesize = AUD_SAMPLE_SIZE(specs); @@ -90,17 +90,19 @@ void AUD_SuperposeReader::read(int & length, sample_t* buffer) m_buffer.assureSize(length * samplesize); int len1 = length; - m_reader1->read(len1, buffer); + m_reader1->read(len1, eos, buffer); if(len1 < length) memset(buffer + len1 * specs.channels, 0, (length - len1) * samplesize); int len2 = length; + bool eos2; sample_t* buf = m_buffer.getBuffer(); - m_reader2->read(len2, buf); + m_reader2->read(len2, eos2, buf); for(int i = 0; i < len2 * specs.channels; i++) buffer[i] += buf[i]; length = AUD_MAX(len1, len2); + eos &= eos2; } diff --git a/intern/audaspace/FX/AUD_SuperposeReader.h b/intern/audaspace/FX/AUD_SuperposeReader.h index 5a2a2a1d8d1..a87f1fdb739 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, bool& eos, sample_t* buffer); }; #endif //AUD_SUPERPOSEREADER |