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) {