Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoerg Mueller <nexyon@gmail.com>2011-06-22 00:14:53 +0400
committerJoerg Mueller <nexyon@gmail.com>2011-06-22 00:14:53 +0400
commitcc71dcc218d9ee4612bfe955be6f00be521be5b1 (patch)
tree5f868efc11f940b72cdf0e0c5d19f27e7d3067c7 /intern/audaspace/FX/AUD_LimiterReader.cpp
parent7ba4362c72c3ccd4763762414bd928682a51b7ce (diff)
3D Audio GSoC:
Streaming improved.
Diffstat (limited to 'intern/audaspace/FX/AUD_LimiterReader.cpp')
-rw-r--r--intern/audaspace/FX/AUD_LimiterReader.cpp42
1 files changed, 38 insertions, 4 deletions
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);
}