Blender  V2.59
AUD_SuperposeReader.cpp
Go to the documentation of this file.
00001 /*
00002  * $Id: AUD_SuperposeReader.cpp 35141 2011-02-25 10:21:56Z jesterking $
00003  *
00004  * ***** BEGIN GPL LICENSE BLOCK *****
00005  *
00006  * Copyright 2009-2011 Jörg Hermann Müller
00007  *
00008  * This file is part of AudaSpace.
00009  *
00010  * Audaspace is free software; you can redistribute it and/or modify
00011  * it under the terms of the GNU General Public License as published by
00012  * the Free Software Foundation; either version 2 of the License, or
00013  * (at your option) any later version.
00014  *
00015  * AudaSpace is distributed in the hope that it will be useful,
00016  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00017  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00018  * GNU General Public License for more details.
00019  *
00020  * You should have received a copy of the GNU General Public License
00021  * along with Audaspace; if not, write to the Free Software Foundation,
00022  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
00023  *
00024  * ***** END GPL LICENSE BLOCK *****
00025  */
00026 
00032 #include "AUD_SuperposeReader.h"
00033 
00034 #include <cstring>
00035 
00036 static const char* specs_error = "AUD_SuperposeReader: Both readers have to "
00037                                                                  "have the same specs.";
00038 
00039 AUD_SuperposeReader::AUD_SuperposeReader(AUD_IReader* reader1, AUD_IReader* reader2) :
00040         m_reader1(reader1), m_reader2(reader2)
00041 {
00042         try
00043         {
00044                 AUD_Specs s1, s2;
00045                 s1 = reader1->getSpecs();
00046                 s2 = reader2->getSpecs();
00047                 if(memcmp(&s1, &s2, sizeof(AUD_Specs)))
00048                         AUD_THROW(AUD_ERROR_SPECS, specs_error);
00049         }
00050         catch(AUD_Exception&)
00051         {
00052                 delete reader1;
00053                 delete reader2;
00054 
00055                 throw;
00056         }
00057 }
00058 
00059 AUD_SuperposeReader::~AUD_SuperposeReader()
00060 {
00061         delete m_reader1;
00062         delete m_reader2;
00063 }
00064 
00065 bool AUD_SuperposeReader::isSeekable() const
00066 {
00067         return m_reader1->isSeekable() && m_reader2->isSeekable();
00068 }
00069 
00070 void AUD_SuperposeReader::seek(int position)
00071 {
00072         m_reader1->seek(position);
00073         m_reader2->seek(position);
00074 }
00075 
00076 int AUD_SuperposeReader::getLength() const
00077 {
00078         int len1 = m_reader1->getLength();
00079         int len2 = m_reader2->getLength();
00080         if((len1 < 0) || (len2 < 0))
00081                 return -1;
00082         return AUD_MIN(len1, len2);
00083 }
00084 
00085 int AUD_SuperposeReader::getPosition() const
00086 {
00087         int pos1 = m_reader1->getPosition();
00088         int pos2 = m_reader2->getPosition();
00089         return AUD_MAX(pos1, pos2);
00090 }
00091 
00092 AUD_Specs AUD_SuperposeReader::getSpecs() const
00093 {
00094         return m_reader1->getSpecs();
00095 }
00096 
00097 void AUD_SuperposeReader::read(int & length, sample_t* & buffer)
00098 {
00099         AUD_Specs specs = m_reader1->getSpecs();
00100         int samplesize = AUD_SAMPLE_SIZE(specs);
00101 
00102         if(m_buffer.getSize() < length * samplesize)
00103                 m_buffer.resize(length * samplesize);
00104         buffer = m_buffer.getBuffer();
00105 
00106         int len1 = length;
00107         sample_t* buf;
00108         m_reader1->read(len1, buf);
00109         memcpy(buffer, buf, len1 * samplesize);
00110 
00111         if(len1 < length)
00112                 memset(buffer + len1 * specs.channels, 0, (length - len1) * samplesize);
00113 
00114         int len2 = length;
00115         m_reader2->read(len2, buf);
00116 
00117         for(int i = 0; i < len2 * specs.channels; i++)
00118                 buffer[i] += buf[i];
00119 
00120         length = AUD_MAX(len1, len2);
00121 }