From 759066b574f18d48ebd3d710e695c66057c7f61b Mon Sep 17 00:00:00 2001 From: weefuzzy Date: Tue, 17 May 2022 23:47:14 +0100 Subject: [PATCH] Wrapper: workaround scsynth 32 char cmd length limit with extra dispatch layer also avoids need for formerly truncated plugin names in some cases --- include/wrapper/Messaging.hpp | 11 +----- include/wrapper/NonRealtime.hpp | 38 ++++++++++++++++++- .../Classes/FluidBufAudioTransport.sc | 4 -- .../Classes/FluidBufNoveltyFeature.sc | 4 -- .../Classes/FluidBufSpectralShape.sc | 4 -- .../Classes/FluidBufTransientSlice.sc | 2 - .../Classes/FluidServerObject.sc | 15 +++----- .../FluidBufAudioTransport.cpp | 2 +- .../FluidBufNoveltyFeature.cpp | 2 +- .../FluidBufSpectralShape.cpp | 2 +- .../FluidBufTransientSlice.cpp | 2 +- 11 files changed, 48 insertions(+), 38 deletions(-) diff --git a/include/wrapper/Messaging.hpp b/include/wrapper/Messaging.hpp index 7e8f173..9237525 100644 --- a/include/wrapper/Messaging.hpp +++ b/include/wrapper/Messaging.hpp @@ -54,17 +54,10 @@ public: template struct SetupMessageCmd { - void operator()(const T& message) { - static std::string messageName = std::string{getName()} + '/' + message.name; - - if(messageName.size() >= 32u) - messageName = remove_vowel(messageName); - - auto ft = getInterfaceTable(); - if(!ft->fDefinePlugInCmd(messageName.c_str(), doMessage,(void*)messageName.c_str())) - std::cout << "ERROR: failed to register command \"" << messageName << "\"\n"; + static std::string messageName = std::string{getName()} + '/' + message.name; + FluidSCWrapper::registerMessage(messageName.c_str(),doMessage); } }; diff --git a/include/wrapper/NonRealtime.hpp b/include/wrapper/NonRealtime.hpp index 32ca380..1782fe2 100644 --- a/include/wrapper/NonRealtime.hpp +++ b/include/wrapper/NonRealtime.hpp @@ -20,6 +20,12 @@ namespace impl { /// Non Real Time Processor + using ServerCommandFn = void(*)(World* world, void*, struct sc_msg_iter* args, + void* replyAddr); + + using CommandMap = std::unordered_map; + + template class NonRealTime : public SCUnit { @@ -829,8 +835,8 @@ private: completionMsgData); if (completionMsgSize) ft->fRTFree(world, completionMsgData); - }; - ft->fDefinePlugInCmd(Command::name(), commandRunner, nullptr); + }; + mCommandDispatchTable[Command::name()] = commandRunner; } @@ -1106,6 +1112,12 @@ private: static constexpr bool IsModel = Client::isModelObject::value; public: + + static void registerMessage(const char* name, ServerCommandFn f) + { + mCommandDispatchTable[name] = f; + } + static void setup(InterfaceTable* ft, const char*) { defineNRTCommand(); @@ -1125,6 +1137,21 @@ public: static std::string flushCmd = std::string(Wrapper::getName()) + "/flush"; + ft->fDefinePlugInCmd( + Wrapper::getName(), + [](World* w, void* inUserData, struct sc_msg_iter* msg, void* replyAddr) + { + const char* name = msg->gets(); + + auto cmd = mCommandDispatchTable.find(name); + + if (cmd != mCommandDispatchTable.end()) + cmd->second(w, inUserData ? inUserData : (void*)name, msg, replyAddr); + else + std::cout << "ERROR: message " << name << " not registered."; + + }, nullptr); + ft->fDefinePlugInCmd( flushCmd.c_str(), [](World*, void*, struct sc_msg_iter*, void*) { mCache.clear(); }, @@ -1176,14 +1203,21 @@ private: index mPreviousTrigger{0}; bool mSynchronous{true}; Result mResult; + + static CommandMap mCommandDispatchTable; }; + template World* NonRealTime::mWorld{nullptr}; template typename NonRealTime::Cache NonRealTime::mCache{}; + +template +CommandMap NonRealTime::mCommandDispatchTable{}; + } // namespace impl } // namespace client diff --git a/release-packaging/Classes/FluidBufAudioTransport.sc b/release-packaging/Classes/FluidBufAudioTransport.sc index 973afa6..33a4477 100644 --- a/release-packaging/Classes/FluidBufAudioTransport.sc +++ b/release-packaging/Classes/FluidBufAudioTransport.sc @@ -1,9 +1,5 @@ FluidBufAudioTransport : FluidBufProcessor { - *objectClassName{ - ^\FluidBufAudioTransp - } - *kr { |sourceA, startFrameA = 0, numFramesA = -1, startChanA = 0, numChansA = -1, sourceB, startFrameB = 0, numFramesB = -1, startChanB = 0, numChansB = -1, destination, interpolation = 0.0, windowSize = 1024, hopSize = -1, fftSize = -1, trig = 1, blocking = 0| var maxFFTSize = if (fftSize == -1) {windowSize.nextPowerOfTwo} {fftSize}; diff --git a/release-packaging/Classes/FluidBufNoveltyFeature.sc b/release-packaging/Classes/FluidBufNoveltyFeature.sc index 19fbe8d..868c37a 100644 --- a/release-packaging/Classes/FluidBufNoveltyFeature.sc +++ b/release-packaging/Classes/FluidBufNoveltyFeature.sc @@ -1,9 +1,5 @@ FluidBufNoveltyFeature : FluidBufProcessor { - *objectClassName{ - ^\FluidBufNoveltyF - } - *kr { |source, startFrame = 0, numFrames = -1, startChan = 0, numChans = -1, features, algorithm = 0, kernelSize = 3, filterSize = 1, windowSize = 1024, hopSize = -1, fftSize = -1, padding = 1, trig = 1, blocking = 0| var maxFFTSize = if (fftSize == -1) {windowSize.nextPowerOfTwo} {fftSize}; diff --git a/release-packaging/Classes/FluidBufSpectralShape.sc b/release-packaging/Classes/FluidBufSpectralShape.sc index 9a47eda..6ef0b68 100644 --- a/release-packaging/Classes/FluidBufSpectralShape.sc +++ b/release-packaging/Classes/FluidBufSpectralShape.sc @@ -1,9 +1,5 @@ FluidBufSpectralShape : FluidBufProcessor { - *objectClassName{ - ^\FluidBufSpecShp - } - *kr { |source, startFrame = 0, numFrames = -1, startChan = 0, numChans = -1, features, select, minFreq = 0, maxFreq = -1, rolloffPercent = 95, unit = 0, power = 0, windowSize = 1024, hopSize = -1, fftSize = -1, padding = 1, trig = 1, blocking = 0| var maxFFTSize = if (fftSize == -1) {windowSize.nextPowerOfTwo} {fftSize}; diff --git a/release-packaging/Classes/FluidBufTransientSlice.sc b/release-packaging/Classes/FluidBufTransientSlice.sc index 38ff7a7..81bff0c 100644 --- a/release-packaging/Classes/FluidBufTransientSlice.sc +++ b/release-packaging/Classes/FluidBufTransientSlice.sc @@ -1,7 +1,5 @@ FluidBufTransientSlice : FluidBufProcessor { - *objectClassName{^\FluidBufTrSlice} - *kr { |source, startFrame = 0, numFrames = -1, startChan = 0, numChans = -1, indices, order = 20, blockSize = 256, padSize = 128, skew = 0, threshFwd = 2, threshBack = 1.1, windowSize = 14, clumpLength = 25, minSliceLength = 1000, trig = 1, blocking = 0| source = source.asUGenInput; diff --git a/release-packaging/Classes/FluidServerObject.sc b/release-packaging/Classes/FluidServerObject.sc index 0bf1479..2fa5970 100644 --- a/release-packaging/Classes/FluidServerObject.sc +++ b/release-packaging/Classes/FluidServerObject.sc @@ -30,8 +30,7 @@ FluidServerObject *newMsg{|id, params| params = params !? {params.collect(_.asUGenInput)}; - // ("Newms"++params).postln; - ^['/cmd',this.objectClassName ++ '/new',id] ++ params + ^this.prMakeMsg(\new,id,*params); } *new{ |server, id, params, action, callNew = true| @@ -55,15 +54,13 @@ FluidServerObject serverCaches[this.class].remove(server,id); } - prMakeMsg{|msg,id...args| - - var commandName = "%/%".format(this.class.objectClassName,msg); - - if(commandName.size >= 32) { commandName = commandName.select{|c|c.isVowel.not}}; - - ^['/cmd',commandName,id].addAll(args); + *prMakeMsg{|msg,id...args| + var commandName = "%/%".format(this.objectClassName,msg); + ^['/cmd', this.objectClassName,commandName,id].addAll(args); } + prMakeMsg{|msg,id...args| ^this.class.prMakeMsg(msg,id,*args) } + freeMsg { var msg; id ?? {" % already freed".format(this.class.name).warn; ^nil}; diff --git a/src/FluidBufAudioTransport/FluidBufAudioTransport.cpp b/src/FluidBufAudioTransport/FluidBufAudioTransport.cpp index 2d1476e..2e84204 100644 --- a/src/FluidBufAudioTransport/FluidBufAudioTransport.cpp +++ b/src/FluidBufAudioTransport/FluidBufAudioTransport.cpp @@ -17,5 +17,5 @@ PluginLoad(FluidSTFTUGen) { ft = inTable; using namespace fluid::client; - makeSCWrapper("FluidBufAudioTransp",ft); + makeSCWrapper("FluidBufAudioTransport",ft); } diff --git a/src/FluidBufNoveltyFeature/FluidBufNoveltyFeature.cpp b/src/FluidBufNoveltyFeature/FluidBufNoveltyFeature.cpp index 95314d3..841970f 100644 --- a/src/FluidBufNoveltyFeature/FluidBufNoveltyFeature.cpp +++ b/src/FluidBufNoveltyFeature/FluidBufNoveltyFeature.cpp @@ -17,5 +17,5 @@ static InterfaceTable *ft; PluginLoad(OfflineFluidDecompositionUGens) { ft = inTable; using namespace fluid::client; - makeSCWrapper("FluidBufNoveltyF", ft); + makeSCWrapper("FluidBufNoveltyFeature", ft); } diff --git a/src/FluidBufSpectralShape/FluidBufSpectralShape.cpp b/src/FluidBufSpectralShape/FluidBufSpectralShape.cpp index 09685d8..adda5b1 100644 --- a/src/FluidBufSpectralShape/FluidBufSpectralShape.cpp +++ b/src/FluidBufSpectralShape/FluidBufSpectralShape.cpp @@ -17,5 +17,5 @@ static InterfaceTable *ft; PluginLoad(OfflineFluidDecompositionUGens) { ft = inTable; using namespace fluid::client; - makeSCWrapper("FluidBufSpecShp", ft); + makeSCWrapper("FluidBufSpectralShape", ft); } diff --git a/src/FluidBufTransientSlice/FluidBufTransientSlice.cpp b/src/FluidBufTransientSlice/FluidBufTransientSlice.cpp index 7354e08..520b066 100644 --- a/src/FluidBufTransientSlice/FluidBufTransientSlice.cpp +++ b/src/FluidBufTransientSlice/FluidBufTransientSlice.cpp @@ -17,5 +17,5 @@ static InterfaceTable* ft; PluginLoad(OfflineFluidDecompositionUGens) { ft = inTable; using namespace fluid::client; - makeSCWrapper("FluidBufTrSlice", ft); + makeSCWrapper("FluidBufTransientSlice", ft); }