Fix deadlock & use QWrite/ReadLockers instead of manually managing locks
This commit is contained in:
@@ -29,6 +29,7 @@
|
||||
#include <QtCore/QReadWriteLock>
|
||||
#include <QtCore/QObject>
|
||||
#include <QtCore/QRect>
|
||||
#include <QtCore/QWriteLocker>
|
||||
|
||||
#include <samplerate.h>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
#include <QFileInfo>
|
||||
#include <QMessageBox>
|
||||
#include <QPainter>
|
||||
#include <QReadLocker>
|
||||
|
||||
|
||||
#include <cstring>
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user