|
Blender
V2.59
|
00001 /* 00002 * $Id: AUD_DelayReader.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_DelayReader.h" 00033 00034 #include <cstring> 00035 00036 AUD_DelayReader::AUD_DelayReader(AUD_IReader* reader, float delay) : 00037 AUD_EffectReader(reader), 00038 m_delay(int(delay * reader->getSpecs().rate)), 00039 m_remdelay(int(delay * reader->getSpecs().rate)), 00040 m_empty(true) 00041 { 00042 } 00043 00044 void AUD_DelayReader::seek(int position) 00045 { 00046 if(position < m_delay) 00047 { 00048 m_remdelay = m_delay - position; 00049 m_reader->seek(0); 00050 } 00051 else 00052 { 00053 m_remdelay = 0; 00054 m_reader->seek(position - m_delay); 00055 } 00056 } 00057 00058 int AUD_DelayReader::getLength() const 00059 { 00060 int len = m_reader->getLength(); 00061 if(len < 0) 00062 return len; 00063 return len + m_delay; 00064 } 00065 00066 int AUD_DelayReader::getPosition() const 00067 { 00068 if(m_remdelay > 0) 00069 return m_delay - m_remdelay; 00070 return m_reader->getPosition() + m_delay; 00071 } 00072 00073 void AUD_DelayReader::read(int & length, sample_t* & buffer) 00074 { 00075 if(m_remdelay > 0) 00076 { 00077 AUD_Specs specs = m_reader->getSpecs(); 00078 int samplesize = AUD_SAMPLE_SIZE(specs); 00079 00080 if(m_buffer.getSize() < length * samplesize) 00081 { 00082 m_buffer.resize(length * samplesize); 00083 m_empty = false; 00084 } 00085 00086 buffer = m_buffer.getBuffer(); 00087 00088 if(length > m_remdelay) 00089 { 00090 if(!m_empty) 00091 memset(buffer, 0, m_remdelay * samplesize); 00092 00093 int len = length - m_remdelay; 00094 sample_t* buf; 00095 m_reader->read(len, buf); 00096 00097 memcpy(buffer + m_remdelay * specs.channels, 00098 buf, len * samplesize); 00099 00100 if(len < length-m_remdelay) 00101 length = m_remdelay + len; 00102 00103 m_remdelay = 0; 00104 m_empty = false; 00105 } 00106 else 00107 { 00108 if(!m_empty) 00109 { 00110 memset(buffer, 0, length * samplesize); 00111 m_empty = true; 00112 } 00113 m_remdelay -= length; 00114 } 00115 } 00116 else 00117 m_reader->read(length, buffer); 00118 }