DPF

DISTRHO Plugin Framework
Log | Files | Refs | Submodules | README | LICENSE

commit a7c2278668a9fe825c1a9011137c1fe1648531d3
parent 4e4d49ff70d9b317c23f0997a10519aee9666ec0
Author: falkTX <falktx@falktx.com>
Date:   Sat,  2 Oct 2021 20:51:30 +0100

VST3: Fix UI related issues

Signed-off-by: falkTX <falktx@falktx.com>

Diffstat:
Mdistrho/DistrhoPlugin.hpp | 2+-
Mdistrho/src/DistrhoPluginVST3.cpp | 11++---------
Mdistrho/src/DistrhoUIInternal.hpp | 4+---
Mdistrho/src/DistrhoUIPrivateData.hpp | 12------------
Mdistrho/src/DistrhoUIVST3.cpp | 45++++++++++++++++++++++-----------------------
Mutils/valgrind-dpf.supp | 7+++++++
6 files changed, 33 insertions(+), 48 deletions(-)

diff --git a/distrho/DistrhoPlugin.hpp b/distrho/DistrhoPlugin.hpp @@ -636,7 +636,7 @@ struct MidiEvent { If size > kDataSize, dataExt is used (otherwise null). When dataExt is used, the event holder is responsible for - keeping the pointer valid during the entirity of the run function. + keeping the pointer valid during the entirety of the run function. */ uint8_t data[kDataSize]; const uint8_t* dataExt; diff --git a/distrho/src/DistrhoPluginVST3.cpp b/distrho/src/DistrhoPluginVST3.cpp @@ -2022,7 +2022,6 @@ private: v3_cpp_obj(attrlist)->set_float(attrlist, "value", sampleRate); v3_cpp_obj(fConnection)->notify(fConnection, message); - v3_cpp_obj_unref(attrlist); v3_cpp_obj_unref(message); } @@ -2039,7 +2038,6 @@ private: v3_cpp_obj(attrlist)->set_float(attrlist, "value", value); v3_cpp_obj(fConnection)->notify(fConnection, message); - v3_cpp_obj_unref(attrlist); v3_cpp_obj_unref(message); } @@ -2056,7 +2054,6 @@ private: v3_cpp_obj(attrlist)->set_string(attrlist, "value", ScopedUTF16String(value)); v3_cpp_obj(fConnection)->notify(fConnection, message); - v3_cpp_obj_unref(attrlist); v3_cpp_obj_unref(message); } @@ -2071,7 +2068,6 @@ private: v3_cpp_obj(attrlist)->set_int(attrlist, "__dpf_msg_target__", 2); v3_cpp_obj(fConnection)->notify(fConnection, message); - v3_cpp_obj_unref(attrlist); v3_cpp_obj_unref(message); } #endif @@ -2745,8 +2741,6 @@ struct dpf_edit_controller : v3_edit_controller_cpp { static V3_API double get_parameter_normalised(void* self, v3_param_id index) { - // NOTE very noisy, called many times - // d_stdout("dpf_edit_controller::get_parameter_normalised => %p %u", self, index); dpf_edit_controller* const controller = *(dpf_edit_controller**)self; DISTRHO_SAFE_ASSERT_RETURN(controller != nullptr, 0.0); @@ -2758,7 +2752,6 @@ struct dpf_edit_controller : v3_edit_controller_cpp { static V3_API v3_result set_parameter_normalised(void* self, v3_param_id index, double normalised) { - d_stdout("dpf_edit_controller::set_parameter_normalised => %p %u %f", self, index, normalised); dpf_edit_controller* const controller = *(dpf_edit_controller**)self; DISTRHO_SAFE_ASSERT_RETURN(controller != nullptr, V3_NOT_INITIALIZED); @@ -2813,8 +2806,8 @@ struct dpf_edit_controller : v3_edit_controller_cpp { } v3_plugin_view** const view = dpf_plugin_view_create(host, - vst3->getInstancePointer(), - vst3->getSampleRate()); + vst3->getInstancePointer(), + vst3->getSampleRate()); DISTRHO_SAFE_ASSERT_RETURN(view != nullptr, nullptr); v3_connection_point** uiconn = nullptr; diff --git a/distrho/src/DistrhoUIInternal.hpp b/distrho/src/DistrhoUIInternal.hpp @@ -91,7 +91,7 @@ public: g_nextScaleFactor = 0.0; g_nextBundlePath = nullptr; #else - // Leave context called in the PluginWindow constructor, see DistrhoUIPrivateData.hpp + // enter context called in the PluginWindow constructor, see DistrhoUIPrivateData.hpp uiData->window->leaveContext(); #endif UI::PrivateData::s_nextPrivateData = nullptr; @@ -99,8 +99,6 @@ public: DISTRHO_SAFE_ASSERT_RETURN(uiPtr != nullptr,); ui = uiPtr; - uiData->initializing = false; - #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI // unused (void)bundlePath; diff --git a/distrho/src/DistrhoUIPrivateData.hpp b/distrho/src/DistrhoUIPrivateData.hpp @@ -285,7 +285,6 @@ struct UI::PrivateData { void* dspPtr; // UI - bool initializing; uint bgColor; uint fgColor; double scaleFactor; @@ -309,7 +308,6 @@ struct UI::PrivateData { sampleRate(0), parameterOffset(0), dspPtr(nullptr), - initializing(true), bgColor(0), fgColor(0xffffffff), scaleFactor(1.0), @@ -360,40 +358,30 @@ struct UI::PrivateData { void editParamCallback(const uint32_t rindex, const bool started) { - DISTRHO_SAFE_ASSERT_RETURN(!initializing,); - if (editParamCallbackFunc != nullptr) editParamCallbackFunc(callbacksPtr, rindex, started); } void setParamCallback(const uint32_t rindex, const float value) { - DISTRHO_SAFE_ASSERT_RETURN(!initializing,); - if (setParamCallbackFunc != nullptr) setParamCallbackFunc(callbacksPtr, rindex, value); } void setStateCallback(const char* const key, const char* const value) { - DISTRHO_SAFE_ASSERT_RETURN(!initializing,); - if (setStateCallbackFunc != nullptr) setStateCallbackFunc(callbacksPtr, key, value); } void sendNoteCallback(const uint8_t channel, const uint8_t note, const uint8_t velocity) { - DISTRHO_SAFE_ASSERT_RETURN(!initializing,); - if (sendNoteCallbackFunc != nullptr) sendNoteCallbackFunc(callbacksPtr, channel, note, velocity); } void setSizeCallback(const uint width, const uint height) { - DISTRHO_SAFE_ASSERT_RETURN(!initializing,); - if (setSizeCallbackFunc != nullptr) setSizeCallbackFunc(callbacksPtr, width, height); } diff --git a/distrho/src/DistrhoUIVST3.cpp b/distrho/src/DistrhoUIVST3.cpp @@ -97,11 +97,19 @@ class UIVst3 public: UIVst3(v3_plugin_view** const view, v3_host_application** const host, + v3_connection_point** const connection, + v3_plugin_frame** const frame, const intptr_t winId, const float scaleFactor, const double sampleRate, void* const instancePointer) - : fUI(this, winId, sampleRate, + : fView(view), + fHostContext(host), + fConnection(connection), + fFrame(frame), + fReadyForPluginData(false), + fScaleFactor(scaleFactor), + fUI(this, winId, sampleRate, editParameterCallback, setParameterCallback, setStateCallback, @@ -110,13 +118,7 @@ public: nullptr, // TODO file request nullptr, // bundlePath instancePointer, - scaleFactor), - fView(view), - fHostContext(host), - fConnection(nullptr), - fFrame(nullptr), - fReadyForPluginData(false), - fScaleFactor(scaleFactor) + scaleFactor) { #if defined(DISTRHO_OS_MAC) || defined(DISTRHO_OS_WINDOWS) fUI.addIdleCallbackForVST3(this, DPF_VST3_TIMER_INTERVAL); @@ -132,6 +134,12 @@ public: disconnect(); } + void reconnectIfNeeded() + { + if (fConnection != nullptr) + connect(fConnection); + } + // ---------------------------------------------------------------------------------------------------------------- // v3_plugin_view interface calls @@ -218,7 +226,6 @@ public: v3_cpp_obj(attrlist)->set_int(attrlist, "__dpf_msg_target__", 1); v3_cpp_obj(fConnection)->notify(fConnection, message); - v3_cpp_obj_unref(attrlist); v3_cpp_obj_unref(message); } @@ -238,7 +245,6 @@ public: v3_cpp_obj(attrlist)->set_int(attrlist, "__dpf_msg_target__", 1); v3_cpp_obj(fConnection)->notify(fConnection, message); - v3_cpp_obj_unref(attrlist); v3_cpp_obj_unref(message); fConnection = nullptr; @@ -382,9 +388,6 @@ public: // ---------------------------------------------------------------------------------------------------------------- private: - // Plugin UI - UIExporter fUI; - // VST3 stuff v3_plugin_view** const fView; v3_host_application** const fHostContext; @@ -395,6 +398,9 @@ private: bool fReadyForPluginData; float fScaleFactor; + // Plugin UI (after VST3 stuff so the UI can call into us during its constructor) + UIExporter fUI; + // ---------------------------------------------------------------------------------------------------------------- // helper functions called during message passing @@ -426,7 +432,6 @@ private: v3_cpp_obj(attrlist)->set_int(attrlist, "__dpf_msg_target__", 1); v3_cpp_obj(fConnection)->notify(fConnection, message); - v3_cpp_obj_unref(attrlist); v3_cpp_obj_unref(message); } @@ -448,7 +453,6 @@ private: v3_cpp_obj(attrlist)->set_int(attrlist, "started", started ? 1 : 0); v3_cpp_obj(fConnection)->notify(fConnection, message); - v3_cpp_obj_unref(attrlist); v3_cpp_obj_unref(message); } @@ -472,7 +476,6 @@ private: v3_cpp_obj(attrlist)->set_float(attrlist, "value", realValue); v3_cpp_obj(fConnection)->notify(fConnection, message); - v3_cpp_obj_unref(attrlist); v3_cpp_obj_unref(message); } @@ -525,7 +528,6 @@ private: v3_cpp_obj(attrlist)->set_binary(attrlist, "data", midiData, sizeof(midiData)); v3_cpp_obj(fConnection)->notify(fConnection, message); - v3_cpp_obj_unref(attrlist); v3_cpp_obj_unref(message); } @@ -551,7 +553,6 @@ private: v3_cpp_obj(attrlist)->set_string(attrlist, "value", ScopedUTF16String(value)); v3_cpp_obj(fConnection)->notify(fConnection, message); - v3_cpp_obj_unref(attrlist); v3_cpp_obj_unref(message); } @@ -982,16 +983,14 @@ struct dpf_plugin_view : v3_plugin_view_cpp { const float scaleFactor = view->scale != nullptr ? view->scale->scaleFactor : 0.0f; view->uivst3 = new UIVst3((v3_plugin_view**)self, view->host, + view->connection != nullptr ? view->connection->other : nullptr, + view->frame, (uintptr_t)parent, scaleFactor, view->sampleRate, view->instancePointer); - if (dpf_ui_connection_point* const point = view->connection) - if (point->other != nullptr) - view->uivst3->connect(point->other); - - view->uivst3->setFrame(view->frame); + view->uivst3->reconnectIfNeeded(); #ifdef DPF_VST3_USING_HOST_RUN_LOOP // register a timer host run loop stuff diff --git a/utils/valgrind-dpf.supp b/utils/valgrind-dpf.supp @@ -39,3 +39,10 @@ fun:XInitThreads ... } +{ + ignore XrmGetStringDatabase + Memcheck:Leak + ... + fun:XrmGetStringDatabase + ... +}