From 5956e9792561ad08cc27be51d72e2dd08464e110 Mon Sep 17 00:00:00 2001 From: Owen Green Date: Fri, 4 Jun 2021 16:59:52 +0100 Subject: [PATCH] Guard against parameter updates from audio thread in Model Objects whilst processing --- include/wrapper/NonRealtime.hpp | 19 ++++++++++++------- include/wrapper/RealTimeBase.hpp | 9 ++++++--- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/include/wrapper/NonRealtime.hpp b/include/wrapper/NonRealtime.hpp index bdcc8b8..5df5f29 100644 --- a/include/wrapper/NonRealtime.hpp +++ b/include/wrapper/NonRealtime.hpp @@ -950,17 +950,22 @@ namespace impl { void next(int) { - + Wrapper::getInterfaceTable()->fClearUnitOutputs(this, mNumOutputs); index id = static_cast(in0(1)); if(mID != id) init(); if(!mInit) return; - if(auto ptr = mInst.lock()) + if(mSpinlock.tryLock()) { - auto& client = ptr->mClient; - auto& params = ptr->mParams; - mControls.reset(mInBuf + ControlOffset()); - mDelegate.next(*this,client,params,mControls); - }else printNotFound(id); + if(auto ptr = mInst.lock()) + { + auto& client = ptr->mClient; + auto& params = ptr->mParams; + mControls.reset(mInBuf + ControlOffset()); + mDelegate.next(*this,client,params,mControls, ptr.use_count() == 2); + }else printNotFound(id); + mSpinlock.unlock(); + } + } private: diff --git a/include/wrapper/RealTimeBase.hpp b/include/wrapper/RealTimeBase.hpp index ab4e324..0249e61 100644 --- a/include/wrapper/RealTimeBase.hpp +++ b/include/wrapper/RealTimeBase.hpp @@ -122,14 +122,17 @@ namespace impl{ } } - void next(SCUnit& unit, Client& client,Params& params,FloatControlsIter& controls) + void next(SCUnit& unit, Client& client,Params& params,FloatControlsIter& controls,bool updateParams = true) { bool trig = IsModel_t::value ? !mPrevTrig && unit.in0(0) > 0 : false; mPrevTrig = trig; - Wrapper::setParams(&unit, params, controls); - params.constrainParameterValuesRT(nullptr); + if(updateParams) + { + Wrapper::setParams(&unit, params, controls); + params.constrainParameterValuesRT(nullptr); + } for (index i = 0; i < client.audioChannelsIn(); ++i) {