From e889c58115b182364b095d60d0018c009163728f Mon Sep 17 00:00:00 2001 From: falkTX Date: Sun, 4 Jul 2021 11:56:16 +0100 Subject: [PATCH] Invert LV2 bypass/enabled parameter on UI events Fixes #150 --- distrho/src/DistrhoUILV2.cpp | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/distrho/src/DistrhoUILV2.cpp b/distrho/src/DistrhoUILV2.cpp index 31a0c3db..34d0ac92 100644 --- a/distrho/src/DistrhoUILV2.cpp +++ b/distrho/src/DistrhoUILV2.cpp @@ -89,11 +89,14 @@ public: bgColor, fgColor), fUridMap(uridMap), + fUiPortMap(getLv2Feature(features, LV2_UI__portMap)), fUiRequestValue(getLv2Feature(features, LV2_UI__requestValue)), fUiTouch(getLv2Feature(features, LV2_UI__touch)), fController(controller), fWriteFunction(writeFunc), fURIDs(uridMap), + fBypassParameterIndex(fUiPortMap != nullptr ? fUiPortMap->port_index(fUiPortMap->handle, "lv2_enabled") + : LV2UI_INVALID_PORT_INDEX), fWinIdWasNull(winId == 0) { if (widget != nullptr) @@ -159,7 +162,11 @@ public: DISTRHO_SAFE_ASSERT_RETURN(bufferSize == sizeof(float),) - const float value = *(const float*)buffer; + float value = *(const float*)buffer; + + if (rindex == fBypassParameterIndex) + value = 1.0f - value; + fUI.parameterChanged(rindex-parameterOffset, value); } #if DISTRHO_PLUGIN_WANT_STATE @@ -253,10 +260,13 @@ protected: fUiTouch->touch(fUiTouch->handle, rindex, started); } - void setParameterValue(const uint32_t rindex, const float value) + void setParameterValue(const uint32_t rindex, float value) { DISTRHO_SAFE_ASSERT_RETURN(fWriteFunction != nullptr,); + if (rindex == fBypassParameterIndex) + value = 1.0f - value; + fWriteFunction(fController, rindex, sizeof(float), 0, &value); } @@ -345,6 +355,7 @@ private: // LV2 features const LV2_URID_Map* const fUridMap; + const LV2UI_Port_Map* const fUiPortMap; const LV2UI_Request_Value* const fUiRequestValue; const LV2UI_Touch* const fUiTouch; @@ -383,8 +394,11 @@ private: } } fURIDs; + // index of bypass parameter, if present + const uint32_t fBypassParameterIndex; + // using ui:showInterface if true - bool fWinIdWasNull; + const bool fWinIdWasNull; // ------------------------------------------------------------------- // Callbacks