#pragma once #include #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(true); mAudioOutputs.emplace_back(nullptr, 0, 0); } set_calc_function(); // 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], mInputConnections[Is+1]), 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, bool isAudio) { if (!isAudio) x.template setter()(*av); } }; template struct SetterDispatchImpl { static void f(Client &x, long ac, float *av, bool isAudio) { if (!isAudio) x.template setter()(*av); } }; template struct SetterDispatchImpl { static void f(Client *x, long ac, float *av, bool isAudio) { if (!isAudio) x->template setter()(*av); } }; template struct SetterDispatchImpl { static void f(Client *x, long ac, float *av, bool isAudio) { if (!isAudio) 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