diff --git a/include/FluidSCWrapper.hpp b/include/FluidSCWrapper.hpp index cd3f420..6a5a58e 100644 --- a/include/FluidSCWrapper.hpp +++ b/include/FluidSCWrapper.hpp @@ -276,6 +276,7 @@ public: // we want to poll thread roughly every 20ms checkThreadInterval = static_cast(0.02 / controlDur()); set_calc_function(); + Wrapper::getInterfaceTable()->fClearUnitOutputs(this, 1); }; /// The calc function. Checks to see if we've cancelled, spits out progress, @@ -313,7 +314,7 @@ public: } w->mClient.setSynchronous(w->mSynchronous); w->mClient.enqueue(w->mParams); - w->mClient.process(); + w->mResult = w->mClient.process(); } /// Check result and report if bad @@ -323,6 +324,8 @@ public: Result r; ProcessState s = w->mClient.checkProgress(r); + if(w->mSynchronous) r = w->mResult; + if ((s == ProcessState::kDone || s == ProcessState::kDoneStillProcessing) || (w->mSynchronous && s == ProcessState::kNoProcess)) // I think this hinges on the fact that @@ -456,6 +459,7 @@ protected: bool mCancelled{false}; private: Wrapper* mWrapper{static_cast(this)}; + Result mResult; }; //////////////////////////////////////////////////////////////////////////////// @@ -829,9 +833,11 @@ class FluidSCWrapper : public impl::FluidSCWrapperBase { // first is string size, then chars index size = static_cast(args.next()); + + auto ft = FluidSCWrapper::getInterfaceTable(); + char* chunk = - static_cast(FluidSCWrapper::getInterfaceTable()->fRTAlloc( - x->mWorld, asUnsigned(size + 1))); + static_cast(ft->fRTAlloc(w, asUnsigned(size + 1))); if (!chunk) { @@ -844,9 +850,9 @@ class FluidSCWrapper : public impl::FluidSCWrapperBase chunk[i] = static_cast(args.next()); chunk[size] = 0; // terminate string - //todo: Did I check that this is getting cleaned up somewhere? It doesn't - //look like it is - return std::string{chunk}; + auto res = std::string{chunk}; + ft->fRTFree(w,chunk); + return res; } template diff --git a/include/SCBufferAdaptor.hpp b/include/SCBufferAdaptor.hpp index b66fe76..2be9d9d 100644 --- a/include/SCBufferAdaptor.hpp +++ b/include/SCBufferAdaptor.hpp @@ -110,6 +110,21 @@ public: bool exists() const override { return mBuffer && mBuffer->data; } + FluidTensorView allFrames() override + { + + FluidTensorView v{mBuffer->data, 0, mBuffer->frames, + mBuffer->channels}; + return v.transpose(); + } + + FluidTensorView allFrames() const override + { + FluidTensorView v{mBuffer->data, 0, mBuffer->frames, + mBuffer->channels}; + return v.transpose(); + } + FluidTensorView samps(index channel) override { FluidTensorView v{mBuffer->data, 0, mBuffer->frames, diff --git a/release-packaging/Classes/FluidBufMFCC.sc b/release-packaging/Classes/FluidBufMFCC.sc index 458e327..5c336a4 100644 --- a/release-packaging/Classes/FluidBufMFCC.sc +++ b/release-packaging/Classes/FluidBufMFCC.sc @@ -16,7 +16,7 @@ FluidBufMFCC : UGen{ } *kr { |source, startFrame = 0, numFrames = -1, startChan = 0, numChans = -1, features, numCoeffs = 13, numBands = 40, minFreq = 20, maxFreq = 20000, windowSize = 1024, hopSize = -1, fftSize = -1, doneAction = 0| - ^this.multiNew(\control, source, startFrame, numFrames, startChan, numChans, features, numCoeffs, numBands, minFreq, maxFreq, numCoeffs, windowSize, hopSize, fftSize, doneAction); + ^this.multiNew(\control, source, startFrame, numFrames, startChan, numChans, features, numCoeffs, numBands, minFreq, maxFreq, windowSize, hopSize, fftSize, doneAction); } *process { |server, source, startFrame = 0, numFrames = -1, startChan = 0, numChans = -1, features, numCoeffs = 13, numBands = 40, minFreq = 20, maxFreq = 20000, windowSize = 1024, hopSize = -1, fftSize = -1, action | diff --git a/release-packaging/Classes/FluidDataSet.sc b/release-packaging/Classes/FluidDataSet.sc index 56cc515..a49ef5d 100644 --- a/release-packaging/Classes/FluidDataSet.sc +++ b/release-packaging/Classes/FluidDataSet.sc @@ -31,16 +31,18 @@ FluidDataSet : FluidManipulationClient { cache { serverCaches.initCache(server); serverCaches.put(server,id,this); - } + } + + *asUGenInput { |input| + var ascii = input.asString.ascii; + ^[ascii.size].addAll(ascii) + } + asString { ^"FluidDataSet(%)".format(id).asString; } - asUGenInput { - ^id.asString; - } - addPoint{|label, buffer, action| this.prSendMsg(\addPoint,[label.asString,buffer.asUGenInput],action); } diff --git a/release-packaging/Classes/FluidLabelSet.sc b/release-packaging/Classes/FluidLabelSet.sc index 3d92852..645e918 100644 --- a/release-packaging/Classes/FluidLabelSet.sc +++ b/release-packaging/Classes/FluidLabelSet.sc @@ -35,9 +35,11 @@ FluidLabelSet : FluidManipulationClient { ^"FluidLabelSet(%)".format(id).asString; } - asUGenInput{ - ^id.asString; - } + + *asUGenInput { |input| + var ascii = input.asString.ascii; + ^[ascii.size].addAll(ascii) + } addLabel{|id, label, action| this.prSendMsg(\addLabel,[id.asString, label.asString],action); diff --git a/release-packaging/Classes/FluidMDS.sc b/release-packaging/Classes/FluidMDS.sc new file mode 100644 index 0000000..9912b61 --- /dev/null +++ b/release-packaging/Classes/FluidMDS.sc @@ -0,0 +1,17 @@ +FluidMDS : FluidManipulationClient { + var id; + + *new {|server| + var uid = UniqueID.next; + ^super.new(server,uid).init(uid); + } + + init {|uid| + id = uid; + } + + fitTransform{|sourceDataset, k, dist, destDataset, action| + this.pr_sendMsg(\fitTransform,[sourceDataset.asString, k, dist, destDataset.asString],action); + } + +} diff --git a/src/FluidManipulation/FluidManipulation.cpp b/src/FluidManipulation/FluidManipulation.cpp index 596afe6..8a5061f 100644 --- a/src/FluidManipulation/FluidManipulation.cpp +++ b/src/FluidManipulation/FluidManipulation.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -26,6 +27,7 @@ PluginLoad(FluidSTFTUGen) makeSCWrapper("FluidNormalize",ft); makeSCWrapper("FluidStandardize",ft); makeSCWrapper("FluidPCA",ft); + makeSCWrapper("FluidMDS",ft); makeSCWrapper("FluidAudioTransport",ft); makeSCWrapper("FluidBufAudioTransport",ft); }