From d805302f060ea1ceb51281ad82e8fd0572ff41c5 Mon Sep 17 00:00:00 2001 From: Colin Wallace Date: Fri, 3 Jul 2015 02:20:12 +0000 Subject: [PATCH] Fix deadlock & use QWrite/ReadLockers instead of manually managing locks --- include/SampleBuffer.h | 16 ++++++---------- src/core/SampleBuffer.cpp | 29 ++++++++--------------------- 2 files changed, 14 insertions(+), 31 deletions(-) diff --git a/include/SampleBuffer.h b/include/SampleBuffer.h index ef97f84ee..d34a99aed 100644 --- a/include/SampleBuffer.h +++ b/include/SampleBuffer.h @@ -29,6 +29,7 @@ #include #include #include +#include #include @@ -151,26 +152,23 @@ public: void setLoopStartFrame( f_cnt_t _start ) { - m_varLock.lockForWrite(); + QWriteLocker writeLocker(&m_varLock); m_loopStartFrame = _start; - m_varLock.unlock(); } void setLoopEndFrame( f_cnt_t _end ) { - m_varLock.lockForWrite(); + QWriteLocker writeLocker(&m_varLock); m_loopEndFrame = _end; - m_varLock.unlock(); } void setAllPointFrames( f_cnt_t _start, f_cnt_t _end, f_cnt_t _loopstart, f_cnt_t _loopend ) { - m_varLock.lockForWrite(); + QWriteLocker writeLocker(&m_varLock); m_startFrame = _start; m_endFrame = _end; m_loopStartFrame = _loopstart; m_loopEndFrame = _loopend; - m_varLock.unlock(); } inline f_cnt_t frames() const @@ -205,16 +203,14 @@ public: inline void setFrequency( float _freq ) { - m_varLock.lockForWrite(); + QWriteLocker writeLocker(&m_varLock); m_frequency = _freq; - m_varLock.unlock(); } inline void setSampleRate( sample_rate_t _rate ) { - m_varLock.lockForWrite(); + QWriteLocker writeLocker(&m_varLock); m_sampleRate = _rate; - m_varLock.unlock(); } inline const sampleFrame * data() const diff --git a/src/core/SampleBuffer.cpp b/src/core/SampleBuffer.cpp index 01778653f..d59a4225e 100644 --- a/src/core/SampleBuffer.cpp +++ b/src/core/SampleBuffer.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include @@ -606,7 +607,7 @@ bool SampleBuffer::play( sampleFrame * _ab, handleState * _state, const float _freq, const LoopMode _loopmode ) { - m_varLock.lockForRead(); + QReadLocker readLocker(&m_varLock); f_cnt_t startFrame = m_startFrame; f_cnt_t endFrame = m_endFrame; @@ -615,7 +616,6 @@ bool SampleBuffer::play( sampleFrame * _ab, handleState * _state, if( endFrame == 0 || _frames == 0 ) { - m_varLock.unlock(); return false; } @@ -632,35 +632,25 @@ bool SampleBuffer::play( sampleFrame * _ab, handleState * _state, if( total_frames_for_current_pitch == 0 ) { - m_varLock.unlock(); return false; } - // this holds the number of the first frame to play - f_cnt_t play_frame = _state->m_frameIndex; - - if( play_frame < startFrame ) - { - play_frame = startFrame; - } + // this holds the index of the first frame to play + f_cnt_t play_frame = qMax(_state->m_frameIndex, startFrame); if( _loopmode == LoopOff ) { - if( play_frame >= endFrame ) + if( play_frame >= endFrame || ( endFrame - play_frame ) / freq_factor == 0 ) { - m_varLock.unlock(); + // the sample is done being played return false; } - - if( ( endFrame - play_frame ) / freq_factor == 0 ) return false; } - else if( _loopmode == LoopOn ) { play_frame = getLoopedIndex( play_frame, loopStartFrame, loopEndFrame ); } - else { play_frame = getPingPongIndex( play_frame, loopStartFrame, loopEndFrame ); @@ -778,7 +768,6 @@ bool SampleBuffer::play( sampleFrame * _ab, handleState * _state, _ab[i][1] *= m_amplification; } - m_varLock.unlock(); return true; } @@ -1376,9 +1365,8 @@ void SampleBuffer::loadFromBase64( const QString & _data ) void SampleBuffer::setStartFrame( const f_cnt_t _s ) { - m_varLock.lockForWrite(); + QWriteLocker writeLocker(&m_varLock); m_startFrame = _s; - m_varLock.unlock(); } @@ -1386,9 +1374,8 @@ void SampleBuffer::setStartFrame( const f_cnt_t _s ) void SampleBuffer::setEndFrame( const f_cnt_t _e ) { - m_varLock.lockForWrite(); + QWriteLocker writeLocker(&m_varLock); m_endFrame = _e; - m_varLock.unlock(); }