diff --git a/include/fifo_buffer.h b/include/fifo_buffer.h index 4bf908611..22dbcca80 100644 --- a/include/fifo_buffer.h +++ b/include/fifo_buffer.h @@ -41,6 +41,10 @@ public: m_size( _size ) { m_buffer = new T[_size]; + for( int i = 0; i < m_size; ++i ) + { + m_buffer[i] = NULL; + } m_readerSem.acquire( _size ); } @@ -50,9 +54,15 @@ public: m_readerSem.release( m_size ); } - void write( T _element ) + T nextWriteBuffer() { m_writerSem.acquire(); + T buf = m_buffer[m_writerIndex]; + return buf; + } + + void write( T _element ) + { m_buffer[m_writerIndex++] = _element; m_writerIndex %= m_size; m_readerSem.release(); diff --git a/src/core/audio/AudioDevice.cpp b/src/core/audio/AudioDevice.cpp index ba38a227f..18ad1a668 100644 --- a/src/core/audio/AudioDevice.cpp +++ b/src/core/audio/AudioDevice.cpp @@ -104,11 +104,6 @@ fpp_t AudioDevice::getNextBuffer( sampleFrameA * _ab ) // release lock unlock(); - if( getMixer()->hasFifoWriter() ) - { - CPU::freeFrames( b ); - } - return frames; } diff --git a/src/core/mixer.cpp b/src/core/mixer.cpp index b82d6886f..310ec289a 100644 --- a/src/core/mixer.cpp +++ b/src/core/mixer.cpp @@ -1151,8 +1151,12 @@ void mixer::fifoWriter::run() const fpp_t frames = m_mixer->framesPerPeriod(); while( m_writing ) { - sampleFrameA * buffer = CPU::allocFrames( frames ); const sampleFrameA * b = m_mixer->renderNextBuffer(); + sampleFrameA * buffer = m_fifo->nextWriteBuffer(); + if( buffer == NULL ) + { + buffer = CPU::allocFrames( frames ); + } CPU::memCpy( buffer, b, frames * sizeof( sampleFrameA ) ); m_fifo->write( buffer ); }