Guard against parameter updates from audio thread in Model Objects whilst processing

nix
Owen Green 5 years ago
parent abef788a39
commit 5956e97925

@ -950,17 +950,22 @@ namespace impl {
void next(int) void next(int)
{ {
Wrapper::getInterfaceTable()->fClearUnitOutputs(this, mNumOutputs);
index id = static_cast<index>(in0(1)); index id = static_cast<index>(in0(1));
if(mID != id) init(); if(mID != id) init();
if(!mInit) return; if(!mInit) return;
if(auto ptr = mInst.lock()) if(mSpinlock.tryLock())
{ {
auto& client = ptr->mClient; if(auto ptr = mInst.lock())
auto& params = ptr->mParams; {
mControls.reset(mInBuf + ControlOffset()); auto& client = ptr->mClient;
mDelegate.next(*this,client,params,mControls); auto& params = ptr->mParams;
}else printNotFound(id); mControls.reset(mInBuf + ControlOffset());
mDelegate.next(*this,client,params,mControls, ptr.use_count() == 2);
}else printNotFound(id);
mSpinlock.unlock();
}
} }
private: private:

@ -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<Client>::value ? !mPrevTrig && unit.in0(0) > 0 : false; bool trig = IsModel_t<Client>::value ? !mPrevTrig && unit.in0(0) > 0 : false;
mPrevTrig = trig; mPrevTrig = trig;
Wrapper::setParams(&unit, params, controls); if(updateParams)
params.constrainParameterValuesRT(nullptr); {
Wrapper::setParams(&unit, params, controls);
params.constrainParameterValuesRT(nullptr);
}
for (index i = 0; i < client.audioChannelsIn(); ++i) for (index i = 0; i < client.audioChannelsIn(); ++i)
{ {

Loading…
Cancel
Save