diff --git a/include/Mixer.h b/include/Mixer.h index f3c849c3ee1..991839733f2 100644 --- a/include/Mixer.h +++ b/include/Mixer.h @@ -409,7 +409,6 @@ class EXPORT Mixer : public QObject bool m_clearSignal; bool m_changesSignal; - bool m_waitForMixer; unsigned int m_changes; QMutex m_changesMutex; QMutex m_doChangesMutex; @@ -417,6 +416,8 @@ class EXPORT Mixer : public QObject QWaitCondition m_changesMixerCondition; QWaitCondition m_changesRequestCondition; + bool m_waitingForWrite; + friend class LmmsCore; friend class MixerWorkerThread; diff --git a/include/fifo_buffer.h b/include/fifo_buffer.h index fd5da778594..a1983008cf2 100644 --- a/include/fifo_buffer.h +++ b/include/fifo_buffer.h @@ -57,18 +57,6 @@ class fifoBuffer m_reader_sem.release(); } - bool tryWrite( T _element ) - { - if( m_writer_sem.tryAcquire() ) - { - m_buffer[m_writer_index++] = _element; - m_writer_index %= m_size; - m_reader_sem.release(); - return true; - } - return false; - } - T read() { m_reader_sem.acquire(); diff --git a/src/core/Mixer.cpp b/src/core/Mixer.cpp index de89d2bd28d..9a3069819dd 100644 --- a/src/core/Mixer.cpp +++ b/src/core/Mixer.cpp @@ -84,9 +84,9 @@ Mixer::Mixer( bool renderOnly ) : m_metronomeActive(false), m_clearSignal( false ), m_changesSignal( false ), - m_waitForMixer( true ), m_changes( 0 ), - m_doChangesMutex( QMutex::Recursive ) + m_doChangesMutex( QMutex::Recursive ), + m_waitingForWrite( false ) { for( int i = 0; i < 2; ++i ) { @@ -739,14 +739,13 @@ void Mixer::requestChangeInModel() m_changesMutex.unlock(); m_doChangesMutex.lock(); - if ( m_isProcessing && m_waitForMixer ) + m_waitChangesMutex.lock(); + if ( m_isProcessing && !m_waitingForWrite && !m_changesSignal ) { - m_waitForMixer = false; - m_waitChangesMutex.lock(); m_changesSignal = true; m_changesRequestCondition.wait( &m_waitChangesMutex ); - m_waitChangesMutex.unlock(); } + m_waitChangesMutex.unlock(); } @@ -763,7 +762,6 @@ void Mixer::doneChangeInModel() if( !moreChanges ) { - m_waitForMixer = true; m_changesSignal = false; m_changesMixerCondition.wakeOne(); } @@ -1077,15 +1075,16 @@ void Mixer::fifoWriter::run() void Mixer::fifoWriter::write( surroundSampleFrame * buffer ) { - while( !m_fifo->tryWrite( buffer ) ) - { - if( m_mixer->m_changesSignal ) - { - m_mixer->runChangesInModel(); - continue; - } - yieldCurrentThread(); - } + m_mixer->m_waitChangesMutex.lock(); + m_mixer->m_waitingForWrite = true; + m_mixer->m_waitChangesMutex.unlock(); + m_mixer->runChangesInModel(); + + m_fifo->write( buffer ); + + m_mixer->m_doChangesMutex.lock(); + m_mixer->m_waitingForWrite = false; + m_mixer->m_doChangesMutex.unlock(); }