From f9ff394a950bafcdb5541d90ff965c48059af06a Mon Sep 17 00:00:00 2001 From: falkTX Date: Mon, 24 May 2021 12:54:37 +0100 Subject: [PATCH] Fix calling canRequestParameterValueChanges() during constructor Signed-off-by: falkTX --- distrho/src/DistrhoPlugin.cpp | 3 ++- distrho/src/DistrhoPluginInternal.hpp | 5 ++++- distrho/src/DistrhoPluginLV2.cpp | 1 + distrho/src/DistrhoPluginVST.cpp | 3 +++ 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/distrho/src/DistrhoPlugin.cpp b/distrho/src/DistrhoPlugin.cpp index e80b9a8e..f9ee051e 100644 --- a/distrho/src/DistrhoPlugin.cpp +++ b/distrho/src/DistrhoPlugin.cpp @@ -23,6 +23,7 @@ START_NAMESPACE_DISTRHO uint32_t d_lastBufferSize = 0; double d_lastSampleRate = 0.0; +bool d_lastCanRequestParameterValueChanges = false; /* ------------------------------------------------------------------------------------------------------------ * Static fallback data, see DistrhoPluginInternal.hpp */ @@ -112,7 +113,7 @@ bool Plugin::writeMidiEvent(const MidiEvent& midiEvent) noexcept #if DISTRHO_PLUGIN_WANT_PARAMETER_VALUE_CHANGE_REQUEST bool Plugin::canRequestParameterValueChanges() const noexcept { - return pData->requestParameterValueChangeCallbackFunc != nullptr; + return pData->canRequestParameterValueChanges; } bool Plugin::requestParameterValueChange(const uint32_t index, const float value) noexcept diff --git a/distrho/src/DistrhoPluginInternal.hpp b/distrho/src/DistrhoPluginInternal.hpp index bf0cd9e5..f1be5706 100644 --- a/distrho/src/DistrhoPluginInternal.hpp +++ b/distrho/src/DistrhoPluginInternal.hpp @@ -31,6 +31,7 @@ static const uint32_t kMaxMidiEvents = 512; extern uint32_t d_lastBufferSize; extern double d_lastSampleRate; +extern bool d_lastCanRequestParameterValueChanges; // ----------------------------------------------------------------------- // DSP callbacks @@ -78,6 +79,7 @@ struct Plugin::PrivateData { uint32_t bufferSize; double sampleRate; + bool canRequestParameterValueChanges; PrivateData() noexcept : isProcessing(false), @@ -103,7 +105,8 @@ struct Plugin::PrivateData { writeMidiCallbackFunc(nullptr), requestParameterValueChangeCallbackFunc(nullptr), bufferSize(d_lastBufferSize), - sampleRate(d_lastSampleRate) + sampleRate(d_lastSampleRate), + canRequestParameterValueChanges(d_lastCanRequestParameterValueChanges) { DISTRHO_SAFE_ASSERT(bufferSize != 0); DISTRHO_SAFE_ASSERT(d_isNotZero(sampleRate)); diff --git a/distrho/src/DistrhoPluginLV2.cpp b/distrho/src/DistrhoPluginLV2.cpp index 28aa66fb..cc7dc563 100644 --- a/distrho/src/DistrhoPluginLV2.cpp +++ b/distrho/src/DistrhoPluginLV2.cpp @@ -1367,6 +1367,7 @@ static LV2_Handle lv2_instantiate(const LV2_Descriptor*, double sampleRate, cons } d_lastSampleRate = sampleRate; + d_lastCanRequestParameterValueChanges = ctrlInPortChangeReq != nullptr; return new PluginLv2(sampleRate, uridMap, worker, ctrlInPortChangeReq, usingNominal); } diff --git a/distrho/src/DistrhoPluginVST.cpp b/distrho/src/DistrhoPluginVST.cpp index 33893852..10fda021 100644 --- a/distrho/src/DistrhoPluginVST.cpp +++ b/distrho/src/DistrhoPluginVST.cpp @@ -1286,6 +1286,7 @@ static intptr_t vst_dispatcherCallback(AEffect* effect, int32_t opcode, int32_t // set valid but dummy values d_lastBufferSize = 512; d_lastSampleRate = 44100.0; + d_lastCanRequestParameterValueChanges = true; } // Create dummy plugin to get data from @@ -1296,6 +1297,7 @@ static intptr_t vst_dispatcherCallback(AEffect* effect, int32_t opcode, int32_t // unset d_lastBufferSize = 0; d_lastSampleRate = 0.0; + d_lastCanRequestParameterValueChanges = false; *(PluginExporter**)ptr = &plugin; return 0; @@ -1317,6 +1319,7 @@ static intptr_t vst_dispatcherCallback(AEffect* effect, int32_t opcode, int32_t d_lastBufferSize = audioMaster(effect, audioMasterGetBlockSize, 0, 0, nullptr, 0.0f); d_lastSampleRate = audioMaster(effect, audioMasterGetSampleRate, 0, 0, nullptr, 0.0f); + d_lastCanRequestParameterValueChanges = true; // some hosts are not ready at this point or return 0 buffersize/samplerate if (d_lastBufferSize == 0)