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,31 +306,38 @@ public:
auto& client = mWrapper->client(); auto& client = mWrapper->client();
auto& params = mWrapper->params(); auto& params = mWrapper->params();
mWrapper->mControlsIterator.reset(mInBuf + mSpecialIndex +
1); // mClient.audioChannelsIn());
Wrapper::setParams(mWrapper,
params, mWrapper->mControlsIterator); // forward on inputs N + audio inputs as params
params.constrainParameterValues();
const Unit* unit = this; const Unit* unit = this;
for (index i = 0; i < client.audioChannelsIn(); ++i) bool trig = IsModel_t<Client>::value ? mPrevTrig && in0(0) > 0 : false;
{ bool shouldProcess = IsModel_t<Client>::value ? trig : true;
if (mInputConnections[asUnsigned(i)]) mPrevTrig = trig;
{ mAudioInputs[asUnsigned(i)].reset(IN(i), 0, fullBufferSize()); }
} if(shouldProcess)
for (index i = 0; i < client.audioChannelsOut(); ++i)
{
assert(i <= std::numeric_limits<int>::max());
if (mOutputConnections[asUnsigned(i)])
mOutputs[asUnsigned(i)].reset(out(static_cast<int>(i)), 0,
fullBufferSize());
}
for (index i = 0; i < client.controlChannelsOut(); ++i)
{ {
assert(i <= std::numeric_limits<int>::max()); mWrapper->mControlsIterator.reset(mInBuf + mSpecialIndex +
mOutputs[asUnsigned(i)].reset(out(static_cast<int>(i)), 0, 1); 1); // mClient.audioChannelsIn());
Wrapper::setParams(mWrapper,
params, mWrapper->mControlsIterator); // forward on inputs N + audio inputs as params
params.constrainParameterValues();
for (index i = 0; i < client.audioChannelsIn(); ++i)
{
if (mInputConnections[asUnsigned(i)])
{ mAudioInputs[asUnsigned(i)].reset(IN(i), 0, fullBufferSize()); }
}
for (index i = 0; i < client.audioChannelsOut(); ++i)
{
assert(i <= std::numeric_limits<int>::max());
if (mOutputConnections[asUnsigned(i)])
mOutputs[asUnsigned(i)].reset(out(static_cast<int>(i)), 0,
fullBufferSize());
}
for (index i = 0; i < client.controlChannelsOut(); ++i)
{
assert(i <= std::numeric_limits<int>::max());
mOutputs[asUnsigned(i)].reset(out(static_cast<int>(i)), 0, 1);
}
client.process(mAudioInputs, mOutputs, mContext);
} }
client.process(mAudioInputs, mOutputs, mContext);
} }
private: private:
std::vector<bool> mInputConnections; std::vector<bool> mInputConnections;
@ -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