#pragma once #include #include #include #include #include #include namespace fluid { namespace client { namespace impl { template struct SetterDispatchImpl; template struct GetterDispatchImpl; } // namespace impl template class FluidSCWrapper : public SCUnit { public: FluidSCWrapper() { mInputConnections.reserve(mClient.audioChannelsIn()); mOutputConnections.reserve(mClient.audioChannelsOut()); mAudioInputs.reserve(mClient.audioChannelsIn()); mAudioOutputs.reserve(mClient.audioChannelsOut()); for (int i = 0; i < mClient.audioChannelsIn(); ++i) { mInputConnections.emplace_back(isAudioRateIn(i)); mAudioInputs.emplace_back(nullptr, 0, 0); } const Unit *unit = this; for (int i = 0; i < mClient.audioChannelsOut(); ++i) { mOutputConnections.emplace_back(BUFLENGTH != 1); mAudioOutputs.emplace_back(nullptr, 0, 0); } mCalcFunc = [](Unit *u, int n) { FluidSCWrapper *f = static_cast(u); f->next(n); }; } void next(int n) { setParams(mInBuf + 1); //forward on inputs N + 1 as params const Unit *unit = this; for (int i = 0; i < mClient.audioChannelsIn(); ++i) { if (mInputConnections[i]) mAudioInputs[i].reset(IN(i), 0, fullBufferSize()); } for (int i = 0; i < mClient.audioChannelsOut(); ++i) { if (mOutputConnections[i]) mAudioOutputs[i].reset(out(i), 0, fullBufferSize()); } mClient.process(mAudioInputs, mAudioOutputs); } void setParams(float **inputs) { setParams(inputs, std::index_sequence_for()); } private: template void setParams(float **inputs, std::index_sequence) { (void)std::initializer_list{( impl::SetterDispatchImpl::f(mClient, 1, inputs[Is]), 0)...}; } std::vector mInputConnections; std::vector mOutputConnections; std::vector> mAudioInputs; std::vector> mAudioOutputs; Client mClient; }; namespace impl { template struct SetterDispatchImpl { static void f(Client &x, long ac, float *av) { x.template setter()(*av); } }; template struct SetterDispatchImpl { static void f(Client &x, long ac, float *av) { x.template setter()(*av); } }; template struct SetterDispatchImpl { static void f(Client *x, long ac, float *av) { x->template setter()(*av); } }; template struct SetterDispatchImpl { static void f(Client *x, long ac, float *av) { x->template setter()(*av); } }; } // namespace impl template void makeSCWrapper(InterfaceTable *ft, const char *className, const std::tuple ¶ms) { registerUnit>(ft, className); } } // namespace client } // namespace fluid