Reduce overhead by making parameter updates conditional for RT model objects, using pointers for constraint results

nix
Owen Green 5 years ago
parent 5aaeced5e4
commit 5af45397c7

@ -306,13 +306,19 @@ public:
auto& client = mWrapper->client(); auto& client = mWrapper->client();
auto& params = mWrapper->params(); auto& params = mWrapper->params();
const Unit* unit = this;
bool trig = IsModel_t<Client>::value ? mPrevTrig && in0(0) > 0 : false;
bool shouldProcess = IsModel_t<Client>::value ? trig : true;
mPrevTrig = trig;
if(shouldProcess)
{
mWrapper->mControlsIterator.reset(mInBuf + mSpecialIndex + mWrapper->mControlsIterator.reset(mInBuf + mSpecialIndex +
1); // mClient.audioChannelsIn()); 1); // mClient.audioChannelsIn());
Wrapper::setParams(mWrapper, Wrapper::setParams(mWrapper,
params, mWrapper->mControlsIterator); // forward on inputs N + audio inputs as params params, mWrapper->mControlsIterator); // forward on inputs N + audio inputs as params
params.constrainParameterValues(); params.constrainParameterValues();
const Unit* unit = this;
for (index i = 0; i < client.audioChannelsIn(); ++i) for (index i = 0; i < client.audioChannelsIn(); ++i)
{ {
if (mInputConnections[asUnsigned(i)]) if (mInputConnections[asUnsigned(i)])
@ -332,6 +338,7 @@ public:
} }
client.process(mAudioInputs, mOutputs, mContext); client.process(mAudioInputs, mOutputs, mContext);
} }
}
private: private:
std::vector<bool> mInputConnections; std::vector<bool> mInputConnections;
std::vector<bool> mOutputConnections; std::vector<bool> mOutputConnections;
@ -339,6 +346,7 @@ private:
std::vector<HostVector> mOutputs; std::vector<HostVector> mOutputs;
FluidContext mContext; FluidContext mContext;
Wrapper* mWrapper{static_cast<Wrapper*>(this)}; Wrapper* mWrapper{static_cast<Wrapper*>(this)};
bool mPrevTrig;
}; };
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@ -1555,8 +1563,19 @@ public:
// We won't even try and set params if the arguments don't match // We won't even try and set params if the arguments don't match
// if (inputs.size() == C::getParameterDescriptors().count()) // if (inputs.size() == C::getParameterDescriptors().count())
// { // {
p.template setParameterValues<ControlSetter>(x->mWorld->mVerbosity > 0, x, inputs); FluidSCWrapper* w = static_cast<FluidSCWrapper*>(x);
if (constrain) p.constrainParameterValues(); bool verbose = w->mWorld->mVerbosity > 0;
p.template setParameterValuesRT<ControlSetter>(verbose ? &w->mReportage : nullptr , x, inputs);
if (constrain) p.constrainParameterValuesRT(verbose ? &w->mReportage : nullptr);
if(verbose)
{
for(auto& r:w->mReportage) if(!r.ok())
{
printResult(w->state(), r);
}
}
// p.template forEachParam<SetWithResult>(x,inputs,
// } // }
// else // else
// { // {
@ -1603,7 +1622,7 @@ private:
UnitDtorFunc dtor = impl::FluidSCWrapperBase<Client>::destroyClass; UnitDtorFunc dtor = impl::FluidSCWrapperBase<Client>::destroyClass;
(*ft->fDefineUnit)(name, sizeof(FluidSCWrapper), ctor, dtor, 0); (*ft->fDefineUnit)(name, sizeof(FluidSCWrapper), ctor, dtor, 0);
} }
std::array<Result, Client::getParameterDescriptors().size()> mReportage;
FloatControlsIter mControlsIterator; FloatControlsIter mControlsIterator;
std::shared_ptr<WrapperState<Client>> mState; std::shared_ptr<WrapperState<Client>> mState;
}; };

Loading…
Cancel
Save