| @@ -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 | |||
| } | |||