DPF

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

commit 2f3950d633cbce20f0fd588c8c745c90d9b82b8c
parent e14e5a64ee0e79f6942713cb2282f4983e6dc166
Author: falkTX <falktx@gmail.com>
Date:   Sat, 13 Jun 2015 16:44:22 +0200

Implement export of LV2 presets; Put UI in a separate ttl

Diffstat:
Mdistrho/src/DistrhoPluginLV2export.cpp | 208++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------
1 file changed, 184 insertions(+), 24 deletions(-)

diff --git a/distrho/src/DistrhoPluginLV2export.cpp b/distrho/src/DistrhoPluginLV2export.cpp @@ -23,6 +23,7 @@ #include "lv2/midi.h" #include "lv2/options.h" #include "lv2/port-props.h" +#include "lv2/presets.h" #include "lv2/resize-port.h" #include "lv2/state.h" #include "lv2/time.h" @@ -49,6 +50,18 @@ # define DISTRHO_PLUGIN_HAS_UI 0 #endif +#if DISTRHO_PLUGIN_HAS_UI +# if DISTRHO_OS_HAIKU +# define DISTRHO_LV2_UI_TYPE "BeUI" +# elif DISTRHO_OS_MAC +# define DISTRHO_LV2_UI_TYPE "CocoaUI" +# elif DISTRHO_OS_WINDOWS +# define DISTRHO_LV2_UI_TYPE "WindowsUI" +# else +# define DISTRHO_LV2_UI_TYPE "X11UI" +# endif +#endif + #define DISTRHO_LV2_USE_EVENTS_IN (DISTRHO_PLUGIN_WANT_MIDI_INPUT || DISTRHO_PLUGIN_WANT_TIMEPOS || (DISTRHO_PLUGIN_WANT_STATE && DISTRHO_PLUGIN_HAS_UI)) #define DISTRHO_LV2_USE_EVENTS_OUT (DISTRHO_PLUGIN_WANT_MIDI_OUTPUT || (DISTRHO_PLUGIN_WANT_STATE && DISTRHO_PLUGIN_HAS_UI)) @@ -69,6 +82,15 @@ void lv2_generate_ttl(const char* const basename) String pluginDLL(basename); String pluginTTL(pluginDLL + ".ttl"); +#if DISTRHO_PLUGIN_HAS_UI + String pluginUI(pluginDLL); +# if ! DISTRHO_PLUGIN_WANT_DIRECT_ACCESS + pluginUI.truncate(pluginDLL.rfind("_dsp")); + pluginUI += "_ui"; + const String uiTTL(pluginUI + ".ttl"); +# endif +#endif + // --------------------------------------------- { @@ -78,6 +100,9 @@ void lv2_generate_ttl(const char* const basename) String manifestString; manifestString += "@prefix lv2: <" LV2_CORE_PREFIX "> .\n"; manifestString += "@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .\n"; +#if DISTRHO_PLUGIN_WANT_PROGRAMS + manifestString += "@prefix pset: <" LV2_PRESETS_PREFIX "> .\n"; +#endif #if DISTRHO_PLUGIN_HAS_UI manifestString += "@prefix ui: <" LV2_UI_PREFIX "> .\n"; #endif @@ -91,45 +116,49 @@ void lv2_generate_ttl(const char* const basename) #if DISTRHO_PLUGIN_HAS_UI manifestString += "<" DISTRHO_UI_URI ">\n"; -# if DISTRHO_OS_HAIKU - manifestString += " a ui:BeUI ;\n"; -# elif DISTRHO_OS_MAC - manifestString += " a ui:CocoaUI ;\n"; -# elif DISTRHO_OS_WINDOWS - manifestString += " a ui:WindowsUI ;\n"; -# else - manifestString += " a ui:X11UI ;\n"; -# endif -# if ! DISTRHO_PLUGIN_WANT_DIRECT_ACCESS - String pluginUI(pluginDLL); - pluginUI.truncate(pluginDLL.rfind("_dsp")); - pluginUI += "_ui"; - + manifestString += " a ui:" DISTRHO_LV2_UI_TYPE " ;\n"; manifestString += " ui:binary <" + pluginUI + "." DISTRHO_DLL_EXTENSION "> ;\n"; -# else - manifestString += " ui:binary <" + pluginDLL + "." DISTRHO_DLL_EXTENSION "> ;\n"; -#endif +# if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS manifestString += "\n"; manifestString += " lv2:extensionData ui:idleInterface ,\n"; -# if DISTRHO_PLUGIN_WANT_PROGRAMS +# if DISTRHO_PLUGIN_WANT_PROGRAMS manifestString += " ui:showInterface ,\n"; manifestString += " <" LV2_PROGRAMS__Interface "> ;\n"; -# else +# else manifestString += " ui:showInterface ;\n"; -# endif +# endif manifestString += "\n"; manifestString += " lv2:optionalFeature ui:noUserResize ,\n"; manifestString += " ui:resize ,\n"; manifestString += " ui:touch ;\n"; manifestString += "\n"; -# if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS manifestString += " lv2:requiredFeature <" LV2_DATA_ACCESS_URI "> ,\n"; manifestString += " <" LV2_INSTANCE_ACCESS_URI "> ,\n"; manifestString += " <" LV2_OPTIONS__options "> ,\n"; + manifestString += " <" LV2_URID__map "> .\n"; # else - manifestString += " lv2:requiredFeature <" LV2_OPTIONS__options "> ,\n"; + manifestString += " rdfs:seeAlso <" + uiTTL + "> .\n"; # endif - manifestString += " <" LV2_URID__map "> .\n"; + manifestString += "\n"; +#endif + +#if DISTRHO_PLUGIN_WANT_PROGRAMS + const String presetSeparator(std::strstr(DISTRHO_PLUGIN_URI, "#") != nullptr ? ":" : "#"); + + char strBuf[0xff+1]; + strBuf[0xff] = '\0'; + + // Presets + for (uint32_t i = 0; i < plugin.getProgramCount(); ++i) + { + std::snprintf(strBuf, 0xff, "%03i", i+1); + + manifestString += "<" DISTRHO_PLUGIN_URI + presetSeparator + "preset" + strBuf + ">\n"; + manifestString += " a pset:Preset ;\n"; + manifestString += " lv2:appliesTo <" DISTRHO_PLUGIN_URI "> ;\n"; + manifestString += " rdfs:seeAlso <presets.ttl> .\n"; + manifestString += "\n"; + } #endif manifestFile << manifestString << std::endl; @@ -161,7 +190,9 @@ void lv2_generate_ttl(const char* const basename) // plugin pluginString += "<" DISTRHO_PLUGIN_URI ">\n"; -#if DISTRHO_PLUGIN_IS_SYNTH +#ifdef DISTRHO_PLUGIN_LV2_CATEGORY + pluginString += " a " DISTRHO_PLUGIN_LV2_CATEGORY ", lv2:Plugin ;\n"; +#elif DISTRHO_PLUGIN_IS_SYNTH pluginString += " a lv2:InstrumentPlugin, lv2:Plugin ;\n"; #else pluginString += " a lv2:Plugin ;\n"; @@ -428,4 +459,133 @@ void lv2_generate_ttl(const char* const basename) pluginFile.close(); std::cout << " done!" << std::endl; } + + // --------------------------------------------- + +#if DISTRHO_PLUGIN_HAS_UI && ! DISTRHO_PLUGIN_WANT_DIRECT_ACCESS + { + std::cout << "Writing " << uiTTL << "..."; std::cout.flush(); + std::fstream uiFile(uiTTL, std::ios::out); + + String uiString; + uiString += "@prefix lv2: <" LV2_CORE_PREFIX "> .\n"; + uiString += "@prefix ui: <" LV2_UI_PREFIX "> .\n"; + uiString += "\n"; + + uiString += "<" DISTRHO_UI_URI ">\n"; + uiString += " lv2:extensionData ui:idleInterface ,\n"; +# if DISTRHO_PLUGIN_WANT_PROGRAMS + uiString += " ui:showInterface ,\n"; + uiString += " <" LV2_PROGRAMS__Interface "> ;\n"; +# else + uiString += " ui:showInterface ;\n"; +# endif + uiString += "\n"; + uiString += " lv2:optionalFeature ui:noUserResize ,\n"; + uiString += " ui:resize ,\n"; + uiString += " ui:touch ;\n"; + uiString += "\n"; + uiString += " lv2:requiredFeature <" LV2_OPTIONS__options "> ,\n"; + uiString += " <" LV2_URID__map "> .\n"; + + uiFile << uiString << std::endl; + uiFile.close(); + std::cout << " done!" << std::endl; + } +#endif + + // --------------------------------------------- + +#if DISTRHO_PLUGIN_WANT_PROGRAMS + { + std::cout << "Writing presets.ttl..."; std::cout.flush(); + std::fstream presetsFile("presets.ttl", std::ios::out); + + String presetsString; + presetsString += "@prefix lv2: <" LV2_CORE_PREFIX "> .\n"; + presetsString += "@prefix pset: <" LV2_PRESETS_PREFIX "> .\n"; + presetsString += "@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .\n"; +# if DISTRHO_PLUGIN_WANT_STATE + presetsString += "@prefix state: <" LV2_STATE_PREFIX "> .\n"; +# endif + presetsString += "\n"; + + const uint32_t numParameters = plugin.getParameterCount(); + const uint32_t numPrograms = plugin.getProgramCount(); +# if DISTRHO_PLUGIN_WANT_STATE + const uint32_t numStates = plugin.getStateCount(); +# endif + + const String presetSeparator(std::strstr(DISTRHO_PLUGIN_URI, "#") != nullptr ? ":" : "#"); + + char strBuf[0xff+1]; + strBuf[0xff] = '\0'; + + String presetString; + + for (uint32_t i=0; i<numPrograms; ++i) + { + std::snprintf(strBuf, 0xff, "%03i", i+1); + + plugin.loadProgram(i); + + presetString = "<" DISTRHO_PLUGIN_URI + presetSeparator + "preset" + strBuf + ">\n"; + presetString += " rdfs:label \"" + plugin.getProgramName(i) + "\" ;\n\n"; + + // TODO +# if 0 // DISTRHO_PLUGIN_WANT_STATE + for (uint32_t j=0; j<numStates; ++j) + { + if (j == 0) + presetString += " state:state [\n"; + else + presetString += " [\n"; + + presetString += " <urn:distrho:" + plugin.getStateKey(j) + ">\n"; + presetString += "\"\"\"\n"; + presetString += plugin.getState(j); + presetString += "\"\"\"\n"; + + if (j+1 == numStates) + { + if (numParameters > 0) + presetString += " ] ;\n\n"; + else + presetString += " ] .\n\n"; + } + else + { + presetString += " ] ,\n"; + } + } +# endif + + for (uint32_t j=0; j <numParameters; ++j) + { + if (j == 0) + presetString += " lv2:port [\n"; + else + presetString += " [\n"; + + presetString += " lv2:symbol \"" + plugin.getParameterSymbol(j) + "\" ;\n"; + + if (plugin.getParameterHints(j) & kParameterIsInteger) + presetString += " pset:value " + String(int(plugin.getParameterValue(j))) + " ;\n"; + else + presetString += " pset:value " + String(plugin.getParameterValue(j)) + " ;\n"; + + if (j+1 == numParameters) + presetString += " ] .\n\n"; + else + presetString += " ] ,\n"; + } + + presetsString += presetString; + } + + presetsFile << presetsString << std::endl; + presetsFile.close(); + std::cout << " done!" << std::endl; + } +#endif }