diff --git a/distrho/src/DistrhoPluginInternal.hpp b/distrho/src/DistrhoPluginInternal.hpp index 2781dfa0..bbb10791 100644 --- a/distrho/src/DistrhoPluginInternal.hpp +++ b/distrho/src/DistrhoPluginInternal.hpp @@ -290,6 +290,13 @@ public: return fData->parameters[index].hints; } + ParameterDesignation getParameterDesignation(const uint32_t index) const noexcept + { + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr && index < fData->parameterCount, kParameterDesignationNull); + + return fData->parameters[index].designation; + } + bool isParameterOutput(const uint32_t index) const noexcept { return (getParameterHints(index) & kParameterIsOutput); diff --git a/distrho/src/DistrhoPluginLV2.cpp b/distrho/src/DistrhoPluginLV2.cpp index 99cab0c3..387e1acb 100644 --- a/distrho/src/DistrhoPluginLV2.cpp +++ b/distrho/src/DistrhoPluginLV2.cpp @@ -512,6 +512,12 @@ public: if (fLastControlValues[i] != curValue && ! fPlugin.isParameterOutput(i)) { fLastControlValues[i] = curValue; + + if (fPlugin.getParameterDesignation(i) == kParameterDesignationBypass) + { + curValue = 1.0f - curValue; + } + fPlugin.setParameterValue(i, curValue); } } diff --git a/distrho/src/DistrhoPluginLV2export.cpp b/distrho/src/DistrhoPluginLV2export.cpp index 8264d9d8..1ba68484 100644 --- a/distrho/src/DistrhoPluginLV2export.cpp +++ b/distrho/src/DistrhoPluginLV2export.cpp @@ -377,10 +377,34 @@ void lv2_generate_ttl(const char* const basename) pluginString += " a lv2:InputPort, lv2:ControlPort ;\n"; pluginString += " lv2:index " + String(portIndex) + " ;\n"; - pluginString += " lv2:name \"" + plugin.getParameterName(i) + "\" ;\n"; - // symbol + bool designated = false; + + // designation + if (! plugin.isParameterOutput(i)) { + switch (plugin.getParameterDesignation(i)) + { + case kParameterDesignationNull: + break; + case kParameterDesignationBypass: + designated = true; + pluginString += " lv2:name \"Enabled\" ;\n"; + pluginString += " lv2:symbol \"lv2_enabled\" ;\n"; + pluginString += " lv2:default 1 ;\n"; + pluginString += " lv2:minimum 0 ;\n"; + pluginString += " lv2:maximum 1 ;\n"; + pluginString += " lv2:portProperty lv2:toggled , lv2:integer ;\n"; + pluginString += " lv2:designation lv2:enabled ;\n"; + break; + } + } + + // name and symbol + if (! designated) + { + pluginString += " lv2:name \"" + plugin.getParameterName(i) + "\" ;\n"; + String symbol(plugin.getParameterSymbol(i)); if (symbol.isEmpty()) @@ -390,6 +414,7 @@ void lv2_generate_ttl(const char* const basename) } // ranges + if (! designated) { const ParameterRanges& ranges(plugin.getParameterRanges(i)); @@ -410,6 +435,7 @@ void lv2_generate_ttl(const char* const basename) } // unit + if (! designated) { const String& unit(plugin.getParameterUnit(i)); @@ -455,6 +481,7 @@ void lv2_generate_ttl(const char* const basename) } // hints + if (! designated) { const uint32_t hints(plugin.getParameterHints(i));