summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfalkTX <falktx@gmail.com>2018-08-04 03:22:57 +0200
committerfalkTX <falktx@gmail.com>2018-08-04 03:22:57 +0200
commitc2b9c40333a7b5e066dcb8d60fa023373b639324 (patch)
treebe7163d13f8396435faf2ede2e98e1018e67255f
parent340b8e0c5956e74022b7aa7669a8f371df2e5c7b (diff)
Implement enums for LV2 and VST; Add triple brackets on some lv2 fields
-rw-r--r--distrho/src/DistrhoPlugin.cpp9
-rw-r--r--distrho/src/DistrhoPluginInternal.hpp14
-rw-r--r--distrho/src/DistrhoPluginLV2export.cpp55
-rw-r--r--distrho/src/DistrhoPluginVST.cpp19
4 files changed, 68 insertions, 29 deletions
diff --git a/distrho/src/DistrhoPlugin.cpp b/distrho/src/DistrhoPlugin.cpp
index f1fbd7bd..34598761 100644
--- a/distrho/src/DistrhoPlugin.cpp
+++ b/distrho/src/DistrhoPlugin.cpp
@@ -1,6 +1,6 @@
/*
* DISTRHO Plugin Framework (DPF)
- * Copyright (C) 2012-2016 Filipe Coelho <falktx@falktx.com>
+ * Copyright (C) 2012-2018 Filipe Coelho <falktx@falktx.com>
*
* Permission to use, copy, modify, and/or distribute this software for any purpose with
* or without fee is hereby granted, provided that the above copyright notice and this
@@ -27,9 +27,10 @@ double d_lastSampleRate = 0.0;
/* ------------------------------------------------------------------------------------------------------------
* Static fallback data, see DistrhoPluginInternal.hpp */
-const String PluginExporter::sFallbackString;
-const AudioPort PluginExporter::sFallbackAudioPort;
-const ParameterRanges PluginExporter::sFallbackRanges;
+const String PluginExporter::sFallbackString;
+const AudioPort PluginExporter::sFallbackAudioPort;
+const ParameterRanges PluginExporter::sFallbackRanges;
+const ParameterEnumerationValues PluginExporter::sFallbackEnumValues;
/* ------------------------------------------------------------------------------------------------------------
* Plugin */
diff --git a/distrho/src/DistrhoPluginInternal.hpp b/distrho/src/DistrhoPluginInternal.hpp
index 3496ac60..6e40a258 100644
--- a/distrho/src/DistrhoPluginInternal.hpp
+++ b/distrho/src/DistrhoPluginInternal.hpp
@@ -372,6 +372,13 @@ public:
return fData->parameters[index].unit;
}
+ const ParameterEnumerationValues& getParameterEnumValues(const uint32_t index) const noexcept
+ {
+ DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr && index < fData->parameterCount, sFallbackEnumValues);
+
+ return fData->parameters[index].enumValues;
+ }
+
const ParameterRanges& getParameterRanges(const uint32_t index) const noexcept
{
DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr && index < fData->parameterCount, sFallbackRanges);
@@ -625,9 +632,10 @@ private:
// -------------------------------------------------------------------
// Static fallback data, see DistrhoPlugin.cpp
- static const String sFallbackString;
- static const AudioPort sFallbackAudioPort;
- static const ParameterRanges sFallbackRanges;
+ static const String sFallbackString;
+ static const AudioPort sFallbackAudioPort;
+ static const ParameterRanges sFallbackRanges;
+ static const ParameterEnumerationValues sFallbackEnumValues;
DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(PluginExporter)
DISTRHO_PREVENT_HEAP_ALLOCATION
diff --git a/distrho/src/DistrhoPluginLV2export.cpp b/distrho/src/DistrhoPluginLV2export.cpp
index d2fa86ae..0511add7 100644
--- a/distrho/src/DistrhoPluginLV2export.cpp
+++ b/distrho/src/DistrhoPluginLV2export.cpp
@@ -202,6 +202,7 @@ void lv2_generate_ttl(const char* const basename)
pluginString += "@prefix mod: <http://moddevices.com/ns/mod#> .\n";
#endif
pluginString += "@prefix opts: <" LV2_OPTIONS_PREFIX "> .\n";
+ pluginString += "@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .\n";
pluginString += "@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .\n";
pluginString += "@prefix rsz: <" LV2_RESIZE_PORT_PREFIX "> .\n";
#if DISTRHO_PLUGIN_HAS_UI
@@ -417,10 +418,10 @@ void lv2_generate_ttl(const char* const basename)
}
}
- // name and symbol
if (! designated)
{
- pluginString += " lv2:name \"" + plugin.getParameterName(i) + "\" ;\n";
+ // name and symbol
+ pluginString += " lv2:name \"\"\"" + plugin.getParameterName(i) + "\"\"\" ;\n";
String symbol(plugin.getParameterSymbol(i));
@@ -428,11 +429,8 @@ void lv2_generate_ttl(const char* const basename)
symbol = "lv2_port_" + String(portIndex-1);
pluginString += " lv2:symbol \"" + symbol + "\" ;\n";
- }
- // ranges
- if (! designated)
- {
+ // ranges
const ParameterRanges& ranges(plugin.getParameterRanges(i));
if (plugin.getParameterHints(i) & kParameterIsInteger)
@@ -449,11 +447,35 @@ void lv2_generate_ttl(const char* const basename)
pluginString += " lv2:minimum " + String(ranges.min) + " ;\n";
pluginString += " lv2:maximum " + String(ranges.max) + " ;\n";
}
- }
- // unit
- if (! designated)
- {
+ // enumeration
+ const ParameterEnumerationValues& enumValues(plugin.getParameterEnumValues(i));
+
+ if (enumValues.count > 0)
+ {
+ if (enumValues.count >= 2 && enumValues.restrictedMode)
+ pluginString += " lv2:portProperty lv2:enumeration ;\n";
+
+ for (uint8_t j=0; j < enumValues.count; ++j)
+ {
+ const ParameterEnumerationValue& enumValue(enumValues.values[j]);
+
+ if (j == 0)
+ pluginString += " lv2:scalePoint [\n";
+ else
+ pluginString += " [\n";
+
+ pluginString += " rdfs:label \"\"\"" + enumValue.label + "\"\"\" ;\n";
+ pluginString += " rdf:value " + String(enumValue.value) + " ;\n";
+
+ if (j+1 == enumValues.count)
+ pluginString += " ] ;\n\n";
+ else
+ pluginString += " ] ,\n";
+ }
+ }
+
+ // unit
const String& unit(plugin.getParameterUnit(i));
if (! unit.isEmpty())
@@ -495,11 +517,8 @@ void lv2_generate_ttl(const char* const basename)
pluginString += " ] ;\n";
}
}
- }
- // hints
- if (! designated)
- {
+ // hints
const uint32_t hints(plugin.getParameterHints(i));
if (hints & kParameterIsBoolean)
@@ -513,7 +532,7 @@ void lv2_generate_ttl(const char* const basename)
pluginString += " lv2:portProperty <" LV2_PORT_PROPS__expensive "> ,\n";
pluginString += " <" LV2_KXSTUDIO_PROPERTIES__NonAutomable "> ;\n";
}
- }
+ } // ! designated
if (i+1 == count)
pluginString += " ] ;\n\n";
@@ -537,7 +556,7 @@ void lv2_generate_ttl(const char* const basename)
#endif
// name
- pluginString += " doap:name \"" + String(plugin.getName()) + "\" ;\n";
+ pluginString += " doap:name \"\"\"" + String(plugin.getName()) + "\"\"\" ;\n";
// license
{
@@ -546,7 +565,7 @@ void lv2_generate_ttl(const char* const basename)
if (license.contains("://"))
pluginString += " doap:license <" + license + "> ;\n\n";
else
- pluginString += " doap:license \"" + license + "\" ;\n\n";
+ pluginString += " doap:license \"\"\"" + license + "\"\"\" ;\n\n";
}
// developer
@@ -554,7 +573,7 @@ void lv2_generate_ttl(const char* const basename)
const String homepage(plugin.getHomePage());
pluginString += " doap:maintainer [\n";
- pluginString += " foaf:name \"" + String(plugin.getMaker()) + "\" ;\n";
+ pluginString += " foaf:name \"\"\"" + String(plugin.getMaker()) + "\"\"\" ;\n";
if (homepage.isNotEmpty())
pluginString += " foaf:homepage <" + homepage + "> ;\n";
diff --git a/distrho/src/DistrhoPluginVST.cpp b/distrho/src/DistrhoPluginVST.cpp
index 00f46b2f..7c6ad521 100644
--- a/distrho/src/DistrhoPluginVST.cpp
+++ b/distrho/src/DistrhoPluginVST.cpp
@@ -468,15 +468,26 @@ public:
value = value > midRange ? ranges.max : ranges.min;
}
+ else if (hints & kParameterIsInteger)
+ {
+ value = std::round(value);
+ }
- if (hints & kParameterIsInteger)
+ const ParameterEnumerationValues& enumValues(fPlugin.getParameterEnumValues(index));
+
+ for (uint8_t i = 0; i < enumValues.count; ++i)
{
- DISTRHO_NAMESPACE::snprintf_iparam((char*)ptr, (int32_t)std::round(value), 24);
+ if (d_isNotEqual(value, enumValues.values[i].value))
+ continue;
+
+ DISTRHO_NAMESPACE::strncpy((char*)ptr, enumValues.values[i].label.buffer(), 24);
+ return 1;
}
+
+ if (hints & kParameterIsInteger)
+ DISTRHO_NAMESPACE::snprintf_iparam((char*)ptr, (int32_t)value, 24);
else
- {
DISTRHO_NAMESPACE::snprintf_param((char*)ptr, value, 24);
- }
return 1;
}