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(mSpinlock.tryLock())
{
if(auto ptr = mInst.lock()) if(auto ptr = mInst.lock())
{ {
auto& client = ptr->mClient; auto& client = ptr->mClient;
auto& params = ptr->mParams; auto& params = ptr->mParams;
mControls.reset(mInBuf + ControlOffset()); mControls.reset(mInBuf + ControlOffset());
mDelegate.next(*this,client,params,mControls); mDelegate.next(*this,client,params,mControls, ptr.use_count() == 2);
}else printNotFound(id); }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;
if(updateParams)
{
Wrapper::setParams(&unit, params, controls); Wrapper::setParams(&unit, params, controls);
params.constrainParameterValuesRT(nullptr); params.constrainParameterValuesRT(nullptr);
}
for (index i = 0; i < client.audioChannelsIn(); ++i) for (index i = 0; i < client.audioChannelsIn(); ++i)
{ {

Loading…
Cancel
Save