From 68b5a21d14352188175b4f95f9041cbaa45b837e Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Tue, 2 Sep 2014 23:25:05 +0200 Subject: [PATCH] Initialize BufferManager from within Mixer Avoid crashes caused by worker threads accessing the buffer manager before it is initialized. Therefore initialize it from within the Mixer constructor which has the side effect that it gets initialized in console-only rendering mode as well. --- include/BufferManager.h | 2 +- src/core/BufferManager.cpp | 6 +++--- src/core/Mixer.cpp | 3 +++ src/core/main.cpp | 5 +---- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/include/BufferManager.h b/include/BufferManager.h index b9964bbfc..b437ae05e 100644 --- a/include/BufferManager.h +++ b/include/BufferManager.h @@ -40,7 +40,7 @@ const int BM_INITIAL_BUFFERS = 512; class EXPORT BufferManager { public: - static void init(); + static void init( fpp_t framesPerPeriod ); static sampleFrame * acquire(); static void release( sampleFrame * buf ); static void refresh(); diff --git a/src/core/BufferManager.cpp b/src/core/BufferManager.cpp index f5925acfc..b82b94e8f 100644 --- a/src/core/BufferManager.cpp +++ b/src/core/BufferManager.cpp @@ -34,18 +34,18 @@ QAtomicInt BufferManager::s_releasedIndex = 0; int BufferManager::s_size; -void BufferManager::init() +void BufferManager::init( fpp_t framesPerPeriod ) { s_available = MM_ALLOC( sampleFrame*, BM_INITIAL_BUFFERS ); s_released = MM_ALLOC( sampleFrame*, BM_INITIAL_BUFFERS ); - int c = engine::mixer()->framesPerPeriod() * BM_INITIAL_BUFFERS; + int c = framesPerPeriod * BM_INITIAL_BUFFERS; sampleFrame * b = MM_ALLOC( sampleFrame, c ); for( int i = 0; i < BM_INITIAL_BUFFERS; ++i ) { s_available[ i ] = b; - b += engine::mixer()->framesPerPeriod(); + b += framesPerPeriod; } s_availableIndex = BM_INITIAL_BUFFERS - 1; s_size = BM_INITIAL_BUFFERS; diff --git a/src/core/Mixer.cpp b/src/core/Mixer.cpp index 74abde8c7..3bc852260 100644 --- a/src/core/Mixer.cpp +++ b/src/core/Mixer.cpp @@ -118,6 +118,9 @@ Mixer::Mixer() : m_fifo = new fifo( 1 ); } + // now that framesPerPeriod is fixed initialize global BufferManager + BufferManager::init( m_framesPerPeriod ); + m_workingBuf = (sampleFrame*) MemoryHelper::alignedMalloc( m_framesPerPeriod * sizeof( sampleFrame ) ); for( int i = 0; i < 3; i++ ) diff --git a/src/core/main.cpp b/src/core/main.cpp index 9d3670966..dd95eaf64 100644 --- a/src/core/main.cpp +++ b/src/core/main.cpp @@ -76,7 +76,6 @@ #include "DataFile.h" #include "song.h" #include "LmmsPalette.h" -#include "BufferManager.h" static inline QString baseName( const QString & _file ) { @@ -440,9 +439,6 @@ int main( int argc, char * * argv ) // init central engine which handles all components of LMMS engine::init(); - // init buffer manager - has to be done after fpp is known - BufferManager::init(); - splashScreen.hide(); // re-intialize RNG - shared libraries might have srand() or @@ -509,6 +505,7 @@ int main( int argc, char * * argv ) { // we're going to render our song engine::init( false ); + printf( "loading project...\n" ); engine::getSong()->loadProject( file_to_load ); printf( "done\n" );