From 9dcb13058bcb6e8dba7ec783d153891a4263f21f Mon Sep 17 00:00:00 2001 From: falkTX Date: Tue, 20 Dec 2016 16:05:55 +0000 Subject: [PATCH] Only change zyn fx parameters and preset on audio thread --- source/native-plugins/zynaddsubfx-fx.cpp | 47 +++++++++++++++++++++--- 1 file changed, 41 insertions(+), 6 deletions(-) diff --git a/source/native-plugins/zynaddsubfx-fx.cpp b/source/native-plugins/zynaddsubfx-fx.cpp index 13f1068ee..0973b5707 100644 --- a/source/native-plugins/zynaddsubfx-fx.cpp +++ b/source/native-plugins/zynaddsubfx-fx.cpp @@ -43,6 +43,9 @@ protected: : NativePluginClass(host), fParamCount(paramCount-2), // volume and pan handled by host fProgramCount(programCount), + fParamValues(new uchar[paramCount]), + fParamsChanged(new bool[paramCount]), + fNextProgram(-1), fBufferSize(getBufferSize()), fSampleRate(getSampleRate()), fFilterParams(nullptr), @@ -57,6 +60,8 @@ protected: FloatVectorOperations::clear(efxoutl, ibufferSize); FloatVectorOperations::clear(efxoutr, ibufferSize); + std::memset(fParamsChanged, 0, sizeof(bool)*fParamCount); + doReinit(true); } @@ -109,16 +114,13 @@ protected: { const int ivalue(roundToIntAccurate(carla_fixedValue(0.0f, 127.0f, value))); - fEffect->changepar(static_cast(index+2), static_cast(ivalue)); + fParamValues[index] = static_cast(ivalue); + fParamsChanged[index] = true; } void setMidiProgram(const uint8_t, const uint32_t, const uint32_t program) final { - fEffect->setpreset(static_cast(program)); - - // reset volume and pan - fEffect->changepar(0, 127); - fEffect->changepar(1, 64); + fNextProgram = program; } // ------------------------------------------------------------------- @@ -143,6 +145,32 @@ protected: else FloatVectorOperations::multiply(outBuffer[1], 0.5f, iframes); + const int32_t nextProgram = fNextProgram; + fNextProgram = -1; + + if (nextProgram >= 0) + { + fEffect->setpreset(static_cast(nextProgram)); + + // reset volume and pan + fEffect->changepar(0, 127); + fEffect->changepar(1, 64); + + // ignore next + std::memset(fParamsChanged, 0, sizeof(bool)*fParamCount); + } + else + { + for (int i=0, count=static_cast(fParamCount); ichangepar(i+2, fParamValues[i]); + fParamsChanged[i] = false; + } + } + fEffect->out(Stereo(inBuffer[0], inBuffer[1])); FloatVectorOperations::addWithMultiply(outBuffer[0], efxoutl, 0.5f, iframes); @@ -200,6 +228,9 @@ protected: if (firstInit) { fEffect->setpreset(0); + + for (int i=0, count=static_cast(fParamCount); igetpar(i+2); } else { @@ -217,6 +248,10 @@ protected: const uint32_t fParamCount; const uint32_t fProgramCount; + uchar* const fParamValues; + bool* const fParamsChanged; + int32_t fNextProgram; + uint32_t fBufferSize; double fSampleRate;