diff options
Diffstat (limited to 'intern/audaspace/FX/AUD_DoubleReader.cpp')
-rw-r--r-- | intern/audaspace/FX/AUD_DoubleReader.cpp | 51 |
1 files changed, 8 insertions, 43 deletions
diff --git a/intern/audaspace/FX/AUD_DoubleReader.cpp b/intern/audaspace/FX/AUD_DoubleReader.cpp index 113bed14ce3..96352b0963c 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,19 @@ 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); - - 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; - } + m_reader1->read(length, m_finished1, buffer); } else { - m_reader2->read(length, buffer); + m_reader2->read(length, eos, buffer); } } |