diff --git a/include/FluidSCWrapper.hpp b/include/FluidSCWrapper.hpp index 16201eb..371e64b 100644 --- a/include/FluidSCWrapper.hpp +++ b/include/FluidSCWrapper.hpp @@ -1,4 +1,4 @@ - #pragma once +#pragma once #include "SCBufferAdaptor.hpp" #include @@ -16,130 +16,142 @@ namespace fluid { namespace client { -template class FluidSCWrapper; +template +class FluidSCWrapper; namespace impl { -template struct Setter; -template struct ArgumentGetter; -template struct ControlGetter; -template using msg_iter_method = T (sc_msg_iter::*)(T); +template +struct Setter; +template +struct ArgumentGetter; +template +struct ControlGetter; +template +using msg_iter_method = T (sc_msg_iter::*)(T); //////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//Iterate over kr/ir inputs via callbacks from params object +// Iterate over kr/ir inputs via callbacks from params object struct FloatControlsIter { - FloatControlsIter(float** vals, size_t N):mValues(vals), mSize(N) {} - - float next() - { - return mCount >= mSize ? 0 : *mValues[mCount++]; - } + FloatControlsIter(float **vals, size_t N) + : mValues(vals) + , mSize(N) + {} - void reset(float** vals) + float next() { return mCount >= mSize ? 0 : *mValues[mCount++]; } + + void reset(float **vals) { mValues = vals; - mCount = 0; + mCount = 0; } - + size_t size() const noexcept { return mSize; } - - private: - float** mValues; - size_t mSize; - size_t mCount{0}; + +private: + float **mValues; + size_t mSize; + size_t mCount{0}; }; -//General case -template struct GetControl +// General case +template +struct GetControl { - T operator()(World*, FloatControlsIter& controls) { return controls.next(); } + T operator()(World *, FloatControlsIter &controls) { return controls.next(); } }; -template struct ControlGetter : public GetControl +template +struct ControlGetter : public GetControl {}; -//Specializations -template struct ControlGetter +// Specializations +template +struct ControlGetter { - auto operator() (World* w, FloatControlsIter& iter) + auto operator()(World *w, FloatControlsIter &iter) { typename LongT::type bufnum = iter.next(); - return std::unique_ptr(bufnum >= 0 ? new SCBufferAdaptor(bufnum,w): nullptr); + return std::unique_ptr(bufnum >= 0 ? new SCBufferAdaptor(bufnum, w) : nullptr); } }; -template -struct ControlGetter +template +struct ControlGetter { - typename FloatPairsArrayT::type operator()(World*, FloatControlsIter& iter) + typename FloatPairsArrayT::type operator()(World *, FloatControlsIter &iter) { - return {{iter.next(),iter.next()},{iter.next(),iter.next()}}; + return {{iter.next(), iter.next()}, {iter.next(), iter.next()}}; } }; -template -struct ControlGetter +template +struct ControlGetter { - typename FFTParamsT::type operator()(World*, FloatControlsIter& iter) + typename FFTParamsT::type operator()(World *, FloatControlsIter &iter) { - return {static_cast(iter.next()),static_cast(iter.next()),static_cast(iter.next())}; + return {static_cast(iter.next()), static_cast(iter.next()), static_cast(iter.next())}; } }; //////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// Iterate over arguments in sc_msg_iter, via callbacks from params object -template Method> struct GetArgument +template Method> +struct GetArgument { - T operator()(World* w, sc_msg_iter *args) + T operator()(World *w, sc_msg_iter *args) { T r = (args->*Method)(T{0}); return r; } }; -//General cases -template struct ArgumentGetter : public GetArgument +// General cases +template +struct ArgumentGetter : public GetArgument {}; -template struct ArgumentGetter : public GetArgument +template +struct ArgumentGetter : public GetArgument {}; -template struct ArgumentGetter : public GetArgument +template +struct ArgumentGetter : public GetArgument {}; -//Specializations -template struct ArgumentGetter +// Specializations +template +struct ArgumentGetter { - auto operator() (World* w, sc_msg_iter *args) + auto operator()(World *w, sc_msg_iter *args) { typename LongT::type bufnum = args->geti(-1); - return std::unique_ptr(bufnum >= 0 ? new SCBufferAdaptor(bufnum,w) : nullptr); + return std::unique_ptr(bufnum >= 0 ? new SCBufferAdaptor(bufnum, w) : nullptr); } }; -template struct ArgumentGetter +template +struct ArgumentGetter { - typename FloatPairsArrayT::type operator()(World* w, sc_msg_iter *args) + typename FloatPairsArrayT::type operator()(World *w, sc_msg_iter *args) { - return {{args->getf(),args->getf()},{args->getf(),args->getf()}}; + return {{args->getf(), args->getf()}, {args->getf(), args->getf()}}; } }; -template struct ArgumentGetter +template +struct ArgumentGetter { - typename FFTParamsT::type operator()(World* w, sc_msg_iter *args) - { - return {args->geti(),args->geti(),args->geti()}; - } + typename FFTParamsT::type operator()(World *w, sc_msg_iter *args) { return {args->geti(), args->geti(), args->geti()}; } }; - //////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//Real Time Processor +// Real Time Processor -template class RealTime : public SCUnit +template +class RealTime : public SCUnit { using HostVector = FluidTensorView; // using Client = typename Wrapper::ClientType; @@ -148,46 +160,47 @@ public: static void setup(InterfaceTable *ft, const char *name) { registerUnit(ft, name); - ft->fDefineUnitCmd(name,"latency",doLatency); + ft->fDefineUnitCmd(name, "latency", doLatency); } - + static void doLatency(Unit *unit, sc_msg_iter *args) { - float l[] {static_cast(static_cast(unit)->mClient.latency())}; - auto ft = Wrapper::getInterfaceTable(); - + float l[]{static_cast(static_cast(unit)->mClient.latency())}; + auto ft = Wrapper::getInterfaceTable(); + std::stringstream ss; ss << '/' << Wrapper::getName() << "_latency"; std::cout << ss.str() << '\n'; - ft->fSendNodeReply(&unit->mParent->mNode,-1,ss.str().c_str() , 1, l); + ft->fSendNodeReply(&unit->mParent->mNode, -1, ss.str().c_str(), 1, l); } - - RealTime(): - mControlsIterator{mInBuf + mSpecialIndex + 1,mNumInputs - mSpecialIndex - 1}, - mParams{*Wrapper::getParamDescriptors()}, - mClient{Wrapper::setParams(mParams,mWorld->mVerbosity > 0, mWorld, mControlsIterator)} + + RealTime() + : mControlsIterator{mInBuf + mSpecialIndex + 1, mNumInputs - mSpecialIndex - 1} + , mParams{*Wrapper::getParamDescriptors()} + , mClient{Wrapper::setParams(mParams, mWorld->mVerbosity > 0, mWorld, mControlsIterator)} {} void init() { - assert(!(mClient.audioChannelsOut() > 0 && mClient.controlChannelsOut() > 0) && "Client can't have both audio and control outputs"); + assert(!(mClient.audioChannelsOut() > 0 && mClient.controlChannelsOut() > 0) && + "Client can't have both audio and control outputs"); - //If we don't the number of arguments we expect, the language side code is probably the wrong version - //set plugin to no-op, squawk, and bail; - if(mControlsIterator.size() != Wrapper::getParamDescriptors()->count()) + // If we don't the number of arguments we expect, the language side code is probably the wrong version + // set plugin to no-op, squawk, and bail; + if (mControlsIterator.size() != Wrapper::getParamDescriptors()->count()) { mCalcFunc = Wrapper::getInterfaceTable()->fClearUnitOutputs; - std::cout << "ERROR: " << Wrapper::getName() << - " wrong number of arguments. Expected " << Wrapper::getParamDescriptors()->count() << - ", got " << mControlsIterator.size() << ". Your .sc file and binary plugin might be different versions." << std::endl; + std::cout << "ERROR: " << Wrapper::getName() << " wrong number of arguments. Expected " + << Wrapper::getParamDescriptors()->count() << ", got " << mControlsIterator.size() + << ". Your .sc file and binary plugin might be different versions." << std::endl; return; } - + mInputConnections.reserve(mClient.audioChannelsIn()); mOutputConnections.reserve(mClient.audioChannelsOut()); mAudioInputs.reserve(mClient.audioChannelsIn()); - mOutputs.reserve(std::max(mClient.audioChannelsOut(),mClient.controlChannelsOut())); - + mOutputs.reserve(std::max(mClient.audioChannelsOut(), mClient.controlChannelsOut())); + for (int i = 0; i < mClient.audioChannelsIn(); ++i) { mInputConnections.emplace_back(isAudioRateIn(i)); @@ -200,10 +213,7 @@ public: mOutputs.emplace_back(nullptr, 0, 0); } - for (int i = 0; i < mClient.controlChannelsOut(); ++i) - { - mOutputs.emplace_back(nullptr, 0, 0); - } + for (int i = 0; i < mClient.controlChannelsOut(); ++i) { mOutputs.emplace_back(nullptr, 0, 0); } set_calc_function(); Wrapper::getInterfaceTable()->fClearUnitOutputs(this, 1); @@ -211,8 +221,9 @@ public: void next(int n) { - mControlsIterator.reset(mInBuf + 1); //mClient.audioChannelsIn()); - Wrapper::setParams(mParams,mWorld->mVerbosity > 0, mWorld,mControlsIterator); // forward on inputs N + audio inputs as params + mControlsIterator.reset(mInBuf + 1); // mClient.audioChannelsIn()); + Wrapper::setParams(mParams, mWorld->mVerbosity > 0, mWorld, + mControlsIterator); // forward on inputs N + audio inputs as params const Unit *unit = this; for (int i = 0; i < mClient.audioChannelsIn(); ++i) { @@ -222,33 +233,33 @@ public: { if (mOutputConnections[i]) mOutputs[i].reset(out(i), 0, fullBufferSize()); } - for(int i = 0; i < mClient.controlChannelsOut();++i) - { - mOutputs[i].reset(out(i),0,1); - } + for (int i = 0; i < mClient.controlChannelsOut(); ++i) { mOutputs[i].reset(out(i), 0, 1); } mClient.process(mAudioInputs, mOutputs); } + private: std::vector mInputConnections; std::vector mOutputConnections; std::vector mAudioInputs; std::vector mOutputs; FloatControlsIter mControlsIterator; + protected: ParameterSet mParams; - Client mClient; + Client mClient; }; //////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// Non Real Time Processor -template class NonRealTime +template +class NonRealTime { public: static void setup(InterfaceTable *ft, const char *name) { DefinePlugInCmd(name, launch, nullptr); } - NonRealTime(World *world,sc_msg_iter *args): - mParams{*Wrapper::getParamDescriptors()}, - mClient{mParams} + NonRealTime(World *world, sc_msg_iter *args) + : mParams{*Wrapper::getParamDescriptors()} + , mClient{mParams} {} void init(){}; @@ -256,20 +267,20 @@ public: static void launch(World *world, void *inUserData, struct sc_msg_iter *args, void *replyAddr) { - - if(args->tags && ((std::string{args->tags}.size() - 1) != Wrapper::getParamDescriptors()->count())) + if (args->tags && ((std::string{args->tags}.size() - 1) != Wrapper::getParamDescriptors()->count())) { - std::cout << "ERROR: " << Wrapper::getName() << - " wrong number of arguments. Expected " << Wrapper::getParamDescriptors()->count() << - ", got " << (std::string{args->tags}.size() - 1) << ". Your .sc file and binary plugin might be different versions." << std::endl; + std::cout << "ERROR: " << Wrapper::getName() << " wrong number of arguments. Expected " + << Wrapper::getParamDescriptors()->count() << ", got " << (std::string{args->tags}.size() - 1) + << ". Your .sc file and binary plugin might be different versions." << std::endl; return; } - - Wrapper *w = new Wrapper(world,args); //this has to be on the heap, because it doesn't get destoryed until the async command is done - - int argsPosition = args->count; - auto argsRdPos = args->rdpos; - Result result = validateParameters(w, world, args); + + Wrapper *w = new Wrapper( + world, args); // this has to be on the heap, because it doesn't get destoryed until the async command is done + + int argsPosition = args->count; + auto argsRdPos = args->rdpos; + Result result = validateParameters(w, world, args); if (!result.ok()) { std::cout << "ERROR: " << Wrapper::getName() << ": " << result.message().c_str() << std::endl; @@ -278,37 +289,30 @@ public: } args->count = argsPosition; args->rdpos = argsRdPos; - Wrapper::setParams(w->mParams,false, world, args); - - size_t msgSize = args->getbsize(); + Wrapper::setParams(w->mParams, false, world, args); + + size_t msgSize = args->getbsize(); std::vector completionMessage(msgSize); -// char * completionMsgData = 0; - if (msgSize) - { - args->getb(completionMessage.data(), msgSize); - } + // char * completionMsgData = 0; + if (msgSize) { args->getb(completionMessage.data(), msgSize); } - world->ft->fDoAsynchronousCommand(world, replyAddr, Wrapper::getName(), w, process, exchangeBuffers, tidyUp, destroy,msgSize, completionMessage.data()); + world->ft->fDoAsynchronousCommand(world, replyAddr, Wrapper::getName(), w, process, exchangeBuffers, tidyUp, destroy, + msgSize, completionMessage.data()); } static bool process(World *world, void *data) { return static_cast(data)->process(world); } static bool exchangeBuffers(World *world, void *data) { return static_cast(data)->exchangeBuffers(world); } static bool tidyUp(World *world, void *data) { return static_cast(data)->tidyUp(world); } - static void destroy(World *world, void *data) - { - -// void* c = static_cast(data)->mCompletionMessage; -// if(c) world->ft->fRTFree(world,c); - delete static_cast(data); - } + static void destroy(World *world, void *data) { delete static_cast(data); } protected: ParameterSet mParams; - Client mClient; + Client mClient; + private: - static Result validateParameters(NonRealTime *w, World* world, sc_msg_iter *args) + static Result validateParameters(NonRealTime *w, World *world, sc_msg_iter *args) { - auto results = w->mParams.template checkParameterValues(world, args); + auto results = w->mParams.template checkParameterValues(world, args); for (auto &r : results) { if (!r.ok()) return r; @@ -318,118 +322,121 @@ private: bool process(World *world) { - Result r = mClient.process();///mInputs, mOutputs); - - if(!r.ok()) + Result r = mClient.process(); + + if (!r.ok()) { std::cout << "ERROR: " << Wrapper::getName() << ": " << r.message().c_str(); - return false; + return false; } - + return true; } bool exchangeBuffers(World *world) { - mParams.template forEachParamType(world); -// for (auto &b : mBuffersOut) b.assignToRT(world); + mParams.template forEachParamType(world); return true; } bool tidyUp(World *world) { -// for (auto &b : mBuffersIn) b.cleanUp(); -// for (auto &b : mBuffersOut) b.cleanUp() - mParams.template forEachParamType(); + mParams.template forEachParamType(); return true; } - template + template struct AssignBuffer { - void operator()(typename BufferT::type& p, World* w) + void operator()(typename BufferT::type &p, World *w) { - if(auto b = static_cast(p.get())) - b->assignToRT(w); + if (auto b = static_cast(p.get())) b->assignToRT(w); } }; - - template + + template struct CleanUpBuffer { - void operator()(typename BufferT::type& p) + void operator()(typename BufferT::type &p) { - if(auto b = static_cast(p.get())) - b->cleanUp(); + if (auto b = static_cast(p.get())) b->cleanUp(); } }; -// std::vector mBuffersIn; -// std::vector mBuffersOut; -// std::vector mInputs; -// std::vector mOutputs; - char * mCompletionMessage = nullptr; - void * mReplyAddr = nullptr; - const char * mName = nullptr; + char * mCompletionMessage = nullptr; + void * mReplyAddr = nullptr; + const char *mName = nullptr; }; //////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// An impossible monstrosty -template class NonRealTimeAndRealTime : public RealTime, public NonRealTime +template +class NonRealTimeAndRealTime : public RealTime, public NonRealTime { static void setup(InterfaceTable *ft, const char *name) { - RealTime::setup(ft, name); - NonRealTime::setup(ft, name); + RealTime::setup(ft, name); + NonRealTime::setup(ft, name); } }; //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Template Specialisations for NRT/RT -template class FluidSCWrapperImpl; +template +class FluidSCWrapperImpl; -template class FluidSCWrapperImpl : public NonRealTime +template +class FluidSCWrapperImpl + : public NonRealTime { public: - FluidSCWrapperImpl(World* w, sc_msg_iter *args): NonRealTime(w,args){}; + FluidSCWrapperImpl(World *w, sc_msg_iter *args) + : NonRealTime(w, args){}; }; -template class FluidSCWrapperImpl : public RealTime +template +class FluidSCWrapperImpl : public RealTime {}; //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Make base class(es), full of CRTP mixin goodness -template -using FluidSCWrapperBase = FluidSCWrapperImpl,Params, isNonRealTime, isRealTime>; +template +using FluidSCWrapperBase = + FluidSCWrapperImpl, Params, isNonRealTime, isRealTime>; } // namespace impl //////////////////////////////////////////////////////////////////////////////////////////////////////////////// -///The main wrapper -template class FluidSCWrapper : public impl::FluidSCWrapperBase +/// The main wrapper +template +class FluidSCWrapper : public impl::FluidSCWrapperBase { public: using Client = C; using Params = P; - FluidSCWrapper() //mParams{*getParamDescriptors()}, //impl::FluidSCWrapperBase() - { impl::FluidSCWrapperBase::init(); } - - FluidSCWrapper(World* w, sc_msg_iter *args): impl::FluidSCWrapperBase(w,args) - { impl::FluidSCWrapperBase::init(); } + FluidSCWrapper() // mParams{*getParamDescriptors()}, //impl::FluidSCWrapperBase() + { + impl::FluidSCWrapperBase::init(); + } + FluidSCWrapper(World *w, sc_msg_iter *args) + : impl::FluidSCWrapperBase(w, args) + { + impl::FluidSCWrapperBase::init(); + } static const char *getName(const char *setName = nullptr) { static const char *name = nullptr; return (name = setName ? setName : name); } - + static Params *getParamDescriptors(Params *setParams = nullptr) { - static Params* descriptors = nullptr; + static Params *descriptors = nullptr; return (descriptors = setParams ? setParams : descriptors); } @@ -439,7 +446,7 @@ public: return (ft = setTable ? setTable : ft); } - static void setup(Params& p, InterfaceTable *ft, const char *name) + static void setup(Params &p, InterfaceTable *ft, const char *name) { getName(name); getInterfaceTable(ft); @@ -447,35 +454,29 @@ public: impl::FluidSCWrapperBase::setup(ft, name); } - template - static auto& setParams(ParameterSet& p, bool verbose, World* world, impl::FloatControlsIter& inputs) + template + static auto &setParams(ParameterSet &p, bool verbose, World *world, impl::FloatControlsIter &inputs) { - //We won't even try and set params if the arguments don't match - if(inputs.size() == getParamDescriptors()->count()) + // We won't even try and set params if the arguments don't match + if (inputs.size() == getParamDescriptors()->count()) p.template setParameterValues(verbose, world, inputs); return p; } - template - static auto& setParams(ParameterSet& p, bool verbose, World* world, sc_msg_iter *args) + template + static auto &setParams(ParameterSet &p, bool verbose, World *world, sc_msg_iter *args) { - p.template setParameterValues(verbose,world, args); - return p; + p.template setParameterValues(verbose, world, args); + return p; } - -// impl::ParameterSet mParams; - -// Client &client() { return mClient; } -// -//private: -// Client mClient; }; -template