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:
Diffstat (limited to 'intern/audaspace/FX/AUD_DoubleReader.cpp')
-rw-r--r--intern/audaspace/FX/AUD_DoubleReader.cpp58
1 files changed, 20 insertions, 38 deletions
diff --git a/intern/audaspace/FX/AUD_DoubleReader.cpp b/intern/audaspace/FX/AUD_DoubleReader.cpp
index 113bed14ce3..3b1d105954c 100644
--- a/intern/audaspace/FX/AUD_DoubleReader.cpp
+++ b/intern/audaspace/FX/AUD_DoubleReader.cpp
@@ -33,28 +33,17 @@
#include <cstring>
-static const char* specs_error = "AUD_DoubleReader: Both readers have to have "
- "the same specs.";
-
-AUD_DoubleReader::AUD_DoubleReader(AUD_IReader* reader1,
- AUD_IReader* reader2) :
+AUD_DoubleReader::AUD_DoubleReader(AUD_Reference<AUD_IReader> reader1,
+ AUD_Reference<AUD_IReader> reader2) :
m_reader1(reader1), m_reader2(reader2), m_finished1(false)
{
AUD_Specs s1, s2;
s1 = reader1->getSpecs();
s2 = reader2->getSpecs();
- if(memcmp(&s1, &s2, sizeof(AUD_Specs)) != 0)
- {
- delete reader1;
- delete reader2;
- AUD_THROW(AUD_ERROR_SPECS, specs_error);
- }
}
AUD_DoubleReader::~AUD_DoubleReader()
{
- delete m_reader1;
- delete m_reader2;
}
bool AUD_DoubleReader::isSeekable() const
@@ -90,43 +79,36 @@ int AUD_DoubleReader::getPosition() const
AUD_Specs AUD_DoubleReader::getSpecs() const
{
- return m_reader1->getSpecs();
+ return m_finished1 ? m_reader1->getSpecs() : m_reader2->getSpecs();
}
-void AUD_DoubleReader::read(int & length, sample_t* & buffer)
+void AUD_DoubleReader::read(int& length, bool& eos, sample_t* buffer)
{
+ eos = false;
+
if(!m_finished1)
{
int len = length;
- m_reader1->read(len, buffer);
+
+ m_reader1->read(len, m_finished1, 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);
-
- len = length - len;
- length -= len;
- m_reader2->read(len, buf);
-
- memcpy(buffer + length * specs.channels, buf,
- len * samplesize);
-
- length += len;
-
- m_finished1 = true;
+ AUD_Specs specs1, specs2;
+ specs1 = m_reader1->getSpecs();
+ specs2 = m_reader2->getSpecs();
+ if(AUD_COMPARE_SPECS(specs1, specs2))
+ {
+ int len2 = length - len;
+ m_reader2->read(len2, eos, buffer + specs1.channels * len);
+ length = len + len2;
+ }
+ else
+ length = len;
}
}
else
{
- m_reader2->read(length, buffer);
+ m_reader2->read(length, eos, buffer);
}
}