From 0638ec5e55ce94b33eb3d45cbda2bf509d8ab292 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Tue, 10 Jun 2008 22:35:13 +0000 Subject: [PATCH] don't use fifoWriter when rendering as we do not have realtime issues here - fixes lockups on various systems when exporting project git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/trunk/lmms@1122 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 10 +++++++++ include/mixer.h | 15 ++++++++----- src/core/audio/audio_device.cpp | 14 ++++++++---- src/core/mixer.cpp | 38 ++++++++++++++++++++++----------- src/core/project_renderer.cpp | 3 ++- 5 files changed, 58 insertions(+), 22 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6ab9eef7d..aa059b0de 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,15 @@ 2008-06-10 Tobias Doerffel + * src/core/song.cpp: + fixed loading files in no-GUI mode + + * include/mixer.h: + * src/core/audio/audio_device.cpp: + * src/core/mixer.cpp: + * src/core/project_renderer.cpp: + don't use fifoWriter when rendering as we do not have realtime issues + here - fixes lockups on various systems when exporting project + * plugins/sf2_player/sf2_player.cpp: enabled LCD-Spinboxes for easily switching banks/patches - I know that this way you can select banks/patches that do not exist but opening diff --git a/include/mixer.h b/include/mixer.h index cd6da6394..0838247de 100644 --- a/include/mixer.h +++ b/include/mixer.h @@ -201,7 +201,8 @@ public: void setAudioDevice( audioDevice * _dev ); void setAudioDevice( audioDevice * _dev, - const struct qualitySettings & _qs ); + const struct qualitySettings & _qs, + bool _needs_fifo ); void restoreAudioDevice( void ); inline audioDevice * audioDev( void ) { @@ -383,11 +384,15 @@ public: bool criticalXRuns( void ) const; - const surroundSampleFrame * nextBuffer( void ) + inline bool hasFifoWriter( void ) const { - return( m_fifo->read() ); + return( m_fifoWriter != NULL ); } + inline const surroundSampleFrame * nextBuffer( void ) + { + return( hasFifoWriter() ? m_fifo->read() : renderNextBuffer() ); + } void changeQuality( const struct qualitySettings & _qs ); @@ -422,7 +427,7 @@ private: mixer( void ); virtual ~mixer(); - void startProcessing( void ); + void startProcessing( bool _needs_fifo = TRUE ); void stopProcessing( void ); @@ -485,7 +490,7 @@ private: fifo * m_fifo; - fifoWriter * m_fifo_writer; + fifoWriter * m_fifoWriter; friend class engine; diff --git a/src/core/audio/audio_device.cpp b/src/core/audio/audio_device.cpp index 7a0d2cca4..afe1a2c9d 100644 --- a/src/core/audio/audio_device.cpp +++ b/src/core/audio/audio_device.cpp @@ -96,7 +96,7 @@ fpp_t audioDevice::getNextBuffer( surroundSampleFrame * _ab ) // make sure, no other thread is accessing device lock(); - // now were safe to access the device + // resample if neccessary if( getMixer()->processingSampleRate() != m_sampleRate ) { resample( b, frames, _ab, getMixer()->processingSampleRate(), @@ -112,7 +112,10 @@ fpp_t audioDevice::getNextBuffer( surroundSampleFrame * _ab ) // release lock unlock(); - delete[] b; + if( getMixer()->hasFifoWriter() ) + { + delete[] b; + } return( frames ); } @@ -122,9 +125,12 @@ fpp_t audioDevice::getNextBuffer( surroundSampleFrame * _ab ) void audioDevice::stopProcessing( void ) { - while( m_inProcess ) + if( getMixer()->hasFifoWriter() ) { - processNextBuffer(); + while( m_inProcess ) + { + processNextBuffer(); + } } } diff --git a/src/core/mixer.cpp b/src/core/mixer.cpp index cc52dc903..ff53dfcb6 100644 --- a/src/core/mixer.cpp +++ b/src/core/mixer.cpp @@ -344,10 +344,17 @@ void mixer::initDevices( void ) -void mixer::startProcessing( void ) +void mixer::startProcessing( bool _needs_fifo ) { - m_fifo_writer = new fifoWriter( this, m_fifo ); - m_fifo_writer->start(); + if( _needs_fifo ) + { + m_fifoWriter = new fifoWriter( this, m_fifo ); + m_fifoWriter->start(); + } + else + { + m_fifoWriter = NULL; + } m_audioDev->startProcessing(); } @@ -357,13 +364,19 @@ void mixer::startProcessing( void ) void mixer::stopProcessing( void ) { - m_fifo_writer->finish(); - - m_audioDev->stopProcessing(); - - m_fifo_writer->wait( 1000 ); - m_fifo_writer->terminate(); - delete m_fifo_writer; + if( m_fifoWriter != NULL ) + { + m_fifoWriter->finish(); + m_audioDev->stopProcessing(); + m_fifoWriter->wait( 1000 ); + m_fifoWriter->terminate(); + delete m_fifoWriter; + m_fifoWriter = NULL; + } + else + { + m_audioDev->stopProcessing(); + } } @@ -825,7 +838,8 @@ void mixer::setAudioDevice( audioDevice * _dev ) void mixer::setAudioDevice( audioDevice * _dev, - const struct qualitySettings & _qs ) + const struct qualitySettings & _qs, + bool _needs_fifo ) { // don't delete the audio-device stopProcessing(); @@ -847,7 +861,7 @@ void mixer::setAudioDevice( audioDevice * _dev, emit qualitySettingsChanged(); emit sampleRateChanged(); - startProcessing(); + startProcessing( _needs_fifo ); } diff --git a/src/core/project_renderer.cpp b/src/core/project_renderer.cpp index 300de1d27..7f2fe5c33 100644 --- a/src/core/project_renderer.cpp +++ b/src/core/project_renderer.cpp @@ -146,7 +146,8 @@ void projectRenderer::startProcessing( void ) // have to do mixer stuff with GUI-thread-affinity in order to make // slots connected to sampleRateChanged()-signals being called // immediately - engine::getMixer()->setAudioDevice( m_fileDev, m_qualitySettings ); + engine::getMixer()->setAudioDevice( m_fileDev, m_qualitySettings, + FALSE ); start( QThread::HighestPriority ); }