|
Blender
V2.59
|
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 }