Blender V2.61 - r43446
|
00001 /* 00002 * ***** BEGIN GPL LICENSE BLOCK ***** 00003 * 00004 * Copyright 2009-2011 Jörg Hermann Müller 00005 * 00006 * This file is part of AudaSpace. 00007 * 00008 * Audaspace is free software; you can redistribute it and/or modify 00009 * it under the terms of the GNU General Public License as published by 00010 * the Free Software Foundation; either version 2 of the License, or 00011 * (at your option) any later version. 00012 * 00013 * AudaSpace is distributed in the hope that it will be useful, 00014 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00015 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00016 * GNU General Public License for more details. 00017 * 00018 * You should have received a copy of the GNU General Public License 00019 * along with Audaspace; if not, write to the Free Software Foundation, 00020 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 00021 * 00022 * ***** END GPL LICENSE BLOCK ***** 00023 */ 00024 00030 #include "AUD_StreamBufferFactory.h" 00031 #include "AUD_BufferReader.h" 00032 #include "AUD_Buffer.h" 00033 00034 #include <cstring> 00035 00036 AUD_StreamBufferFactory::AUD_StreamBufferFactory(AUD_Reference<AUD_IFactory> factory) : 00037 m_buffer(new AUD_Buffer()) 00038 { 00039 AUD_Reference<AUD_IReader> reader = factory->createReader(); 00040 00041 m_specs = reader->getSpecs(); 00042 00043 int sample_size = AUD_SAMPLE_SIZE(m_specs); 00044 int length; 00045 int index = 0; 00046 bool eos = false; 00047 00048 // get an approximated size if possible 00049 int size = reader->getLength(); 00050 00051 if(size <= 0) 00052 size = AUD_BUFFER_RESIZE_BYTES / sample_size; 00053 else 00054 size += m_specs.rate; 00055 00056 // as long as the end of the stream is not reached 00057 while(!eos) 00058 { 00059 // increase 00060 m_buffer->resize(size*sample_size, true); 00061 00062 // read more 00063 length = size-index; 00064 reader->read(length, eos, m_buffer->getBuffer() + index * m_specs.channels); 00065 if(index == m_buffer->getSize() / sample_size) 00066 size += AUD_BUFFER_RESIZE_BYTES / sample_size; 00067 index += length; 00068 } 00069 00070 m_buffer->resize(index * sample_size, true); 00071 } 00072 00073 AUD_Reference<AUD_IReader> AUD_StreamBufferFactory::createReader() 00074 { 00075 return new AUD_BufferReader(m_buffer, m_specs); 00076 }