diff --git a/ChangeLog b/ChangeLog index 1fb8fdd5e..1bb5a3e60 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2008-07-05 Tobias Doerffel + * plugins/stk/mallets/mallets.cpp: + protect critical section when creating STK-synths as STK is not + thread-safe (closes #2005888) + * include/instrument_track.h: * src/tracks/instrument_track.cpp: - set hand-cursor for instrument-track-window button diff --git a/plugins/stk/mallets/mallets.cpp b/plugins/stk/mallets/mallets.cpp index 57e3cd07a..b4d548e8c 100644 --- a/plugins/stk/mallets/mallets.cpp +++ b/plugins/stk/mallets/mallets.cpp @@ -204,47 +204,51 @@ void malletsInstrument::playNote( notePlayHandle * _n, bool, const float freq = _n->frequency(); if ( _n->totalFramesPlayed() == 0 || _n->m_pluginData == NULL ) { - float vel = static_cast( _n->getVolume() ) / 100.0f; - + const float vel = _n->getVolume() / 100.0f; + + // critical section as STK is not thread-safe + static QMutex m; + m.lock(); if( p < 9 ) { _n->m_pluginData = new malletsSynth( freq, - vel, - m_vibratoGainModel.value(), - m_hardnessModel.value(), - m_positionModel.value(), - m_stickModel.value(), - m_vibratoFreqModel.value(), - p, - (Uint8) m_spreadModel.value(), - engine::getMixer()->processingSampleRate() ); + vel, + m_vibratoGainModel.value(), + m_hardnessModel.value(), + m_positionModel.value(), + m_stickModel.value(), + m_vibratoFreqModel.value(), + p, + (Uint8) m_spreadModel.value(), + engine::getMixer()->processingSampleRate() ); } else if( p == 9 ) { _n->m_pluginData = new malletsSynth( freq, - vel, - p, - m_lfoDepthModel.value(), - m_modulatorModel.value(), - m_crossfadeModel.value(), - m_lfoSpeedModel.value(), - m_adsrModel.value(), - (Uint8) m_spreadModel.value(), - engine::getMixer()->processingSampleRate() ); + vel, + p, + m_lfoDepthModel.value(), + m_modulatorModel.value(), + m_crossfadeModel.value(), + m_lfoSpeedModel.value(), + m_adsrModel.value(), + (Uint8) m_spreadModel.value(), + engine::getMixer()->processingSampleRate() ); } else { _n->m_pluginData = new malletsSynth( freq, - vel, - m_pressureModel.value(), - m_motionModel.value(), - m_vibratoModel.value(), - p - 10, - m_strikeModel.value() * 128.0, - m_velocityModel.value(), - (Uint8) m_spreadModel.value(), - engine::getMixer()->processingSampleRate() ); + vel, + m_pressureModel.value(), + m_motionModel.value(), + m_vibratoModel.value(), + p - 10, + m_strikeModel.value() * 128.0, + m_velocityModel.value(), + (Uint8) m_spreadModel.value(), + engine::getMixer()->processingSampleRate() ); } + m.unlock(); } const fpp_t frames = _n->framesLeftForCurrentPeriod();