diff options
Diffstat (limited to 'intern/audaspace/intern/AUD_StreamBufferFactory.cpp')
-rw-r--r-- | intern/audaspace/intern/AUD_StreamBufferFactory.cpp | 25 |
1 files changed, 11 insertions, 14 deletions
diff --git a/intern/audaspace/intern/AUD_StreamBufferFactory.cpp b/intern/audaspace/intern/AUD_StreamBufferFactory.cpp index c25442b6f26..ff966c86025 100644 --- a/intern/audaspace/intern/AUD_StreamBufferFactory.cpp +++ b/intern/audaspace/intern/AUD_StreamBufferFactory.cpp @@ -35,17 +35,17 @@ #include <cstring> -AUD_StreamBufferFactory::AUD_StreamBufferFactory(AUD_IFactory* factory) : +AUD_StreamBufferFactory::AUD_StreamBufferFactory(AUD_Reference<AUD_IFactory> factory) : m_buffer(new AUD_Buffer()) { - AUD_IReader* reader = factory->createReader(); + AUD_Reference<AUD_IReader> reader = factory->createReader(); m_specs = reader->getSpecs(); int sample_size = AUD_SAMPLE_SIZE(m_specs); int length; int index = 0; - sample_t* buffer; + bool eos = false; // get an approximated size if possible int size = reader->getLength(); @@ -55,27 +55,24 @@ AUD_StreamBufferFactory::AUD_StreamBufferFactory(AUD_IFactory* factory) : else size += m_specs.rate; - // as long as we fill our buffer to the end - while(index == m_buffer.get()->getSize() / sample_size) + // as long as the end of the stream is not reached + while(!eos) { // increase - m_buffer.get()->resize(size*sample_size, true); + m_buffer->resize(size*sample_size, true); // read more length = size-index; - reader->read(length, buffer); - memcpy(m_buffer.get()->getBuffer() + index * m_specs.channels, - buffer, - length * sample_size); - size += AUD_BUFFER_RESIZE_BYTES / sample_size; + reader->read(length, eos, m_buffer->getBuffer() + index * m_specs.channels); + if(index == m_buffer->getSize() / sample_size) + size += AUD_BUFFER_RESIZE_BYTES / sample_size; index += length; } - m_buffer.get()->resize(index * sample_size, true); - delete reader; + m_buffer->resize(index * sample_size, true); } -AUD_IReader* AUD_StreamBufferFactory::createReader() const +AUD_Reference<AUD_IReader> AUD_StreamBufferFactory::createReader() { return new AUD_BufferReader(m_buffer, m_specs); } |