Merging with trunk up to r38631.
[blender.git] / intern / audaspace / FX / AUD_SuperposeReader.cpp
index 6519f2721102b16f5ffa3942092ef3ebd4b6edff..a0dc12fea96e161b783b0f020199edc5e953a1a4 100644 (file)
@@ -1,76 +1,51 @@
 /*
  * $Id$
  *
- * ***** BEGIN LGPL LICENSE BLOCK *****
+ * ***** BEGIN GPL LICENSE BLOCK *****
  *
- * Copyright 2009 Jörg Hermann Müller
+ * Copyright 2009-2011 Jörg Hermann Müller
  *
  * This file is part of AudaSpace.
  *
- * AudaSpace is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
+ * Audaspace is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.
  *
  * AudaSpace is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
+ * GNU General Public License for more details.
  *
- * You should have received a copy of the GNU Lesser General Public License
- * along with AudaSpace.  If not, see <http://www.gnu.org/licenses/>.
+ * You should have received a copy of the GNU General Public License
+ * along with Audaspace; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  *
- * ***** END LGPL LICENSE BLOCK *****
+ * ***** END GPL LICENSE BLOCK *****
  */
 
+/** \file audaspace/FX/AUD_SuperposeReader.cpp
+ *  \ingroup audfx
+ */
+
+
 #include "AUD_SuperposeReader.h"
-#include "AUD_Buffer.h"
 
 #include <cstring>
 
-AUD_SuperposeReader::AUD_SuperposeReader(AUD_IReader* reader1, AUD_IReader* reader2) :
+static const char* specs_error = "AUD_SuperposeReader: Both readers have to "
+                                                                "have the same specs.";
+
+AUD_SuperposeReader::AUD_SuperposeReader(AUD_Reference<AUD_IReader> reader1, AUD_Reference<AUD_IReader> reader2) :
        m_reader1(reader1), m_reader2(reader2)
 {
-       try
-       {
-               if(!reader1)
-                       AUD_THROW(AUD_ERROR_READER);
-
-               if(!reader2)
-                       AUD_THROW(AUD_ERROR_READER);
-
-               AUD_Specs s1, s2;
-               s1 = reader1->getSpecs();
-               s2 = reader2->getSpecs();
-               if(memcmp(&s1, &s2, sizeof(AUD_Specs)) != 0)
-                       AUD_THROW(AUD_ERROR_READER);
-       }
-
-       catch(AUD_Exception)
-       {
-               if(reader1)
-               {
-                       delete reader1; AUD_DELETE("reader")
-               }
-               if(reader2)
-               {
-                       delete reader2; AUD_DELETE("reader")
-               }
-
-               throw;
-       }
-
-       m_buffer = new AUD_Buffer(); AUD_NEW("buffer")
 }
 
 AUD_SuperposeReader::~AUD_SuperposeReader()
 {
-       delete m_reader1; AUD_DELETE("reader")
-       delete m_reader2; AUD_DELETE("reader")
-       delete m_buffer; AUD_DELETE("buffer")
 }
 
-bool AUD_SuperposeReader::isSeekable()
+bool AUD_SuperposeReader::isSeekable() const
 {
        return m_reader1->isSeekable() && m_reader2->isSeekable();
 }
@@ -81,64 +56,52 @@ void AUD_SuperposeReader::seek(int position)
        m_reader2->seek(position);
 }
 
-int AUD_SuperposeReader::getLength()
+int AUD_SuperposeReader::getLength() const
 {
        int len1 = m_reader1->getLength();
        int len2 = m_reader2->getLength();
        if((len1 < 0) || (len2 < 0))
                return -1;
-       if(len1 < len2)
-               return len2;
-       return len1;
+       return AUD_MIN(len1, len2);
 }
 
-int AUD_SuperposeReader::getPosition()
+int AUD_SuperposeReader::getPosition() const
 {
        int pos1 = m_reader1->getPosition();
        int pos2 = m_reader2->getPosition();
        return AUD_MAX(pos1, pos2);
 }
 
-AUD_Specs AUD_SuperposeReader::getSpecs()
+AUD_Specs AUD_SuperposeReader::getSpecs() const
 {
        return m_reader1->getSpecs();
 }
 
-AUD_ReaderType AUD_SuperposeReader::getType()
-{
-       if(m_reader1->getType() == AUD_TYPE_BUFFER &&
-          m_reader2->getType() == AUD_TYPE_BUFFER)
-               return AUD_TYPE_BUFFER;
-       return AUD_TYPE_STREAM;
-}
-
-bool AUD_SuperposeReader::notify(AUD_Message &message)
-{
-       return m_reader1->notify(message) | m_reader2->notify(message);
-}
-
-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();
+       AUD_Specs s2 = m_reader2->getSpecs();
+       if(memcmp(&specs, &s2, sizeof(AUD_Specs)))
+               AUD_THROW(AUD_ERROR_SPECS, specs_error);
+
        int samplesize = AUD_SAMPLE_SIZE(specs);
 
-       if(m_buffer->getSize() < length * samplesize)
-               m_buffer->resize(length * samplesize);
-       buffer = m_buffer->getBuffer();
+       m_buffer.assureSize(length * samplesize);
 
        int len1 = length;
-       sample_t* buf;
-       m_reader1->read(len1, buf);
-       memcpy(buffer, buf, len1 * samplesize);
+       m_reader1->read(len1, eos, buffer);
 
        if(len1 < length)
                memset(buffer + len1 * specs.channels, 0, (length - len1) * samplesize);
 
        int len2 = length;
-       m_reader2->read(len2, buf);
+       bool eos2;
+       sample_t* buf = m_buffer.getBuffer();
+       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;
 }