From f9c15b6136b7c55a765ae407f8110b5adc7db932 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Fri, 9 Dec 2011 19:42:32 +0000 Subject: [PATCH] Support new URIs for LV2 presets. Old stuff continues to work for Calf, but it'd sure be nice if it would be updated... git-svn-id: svn://localhost/ardour2/branches/3.0@10952 d708f5d6-7413-0410-9779-e7cbd77b26cf --- libs/ardour/lv2_plugin.cc | 70 +++++++++++++++++++++++++++------------ 1 file changed, 48 insertions(+), 22 deletions(-) diff --git a/libs/ardour/lv2_plugin.cc b/libs/ardour/lv2_plugin.cc index cc03f9b193..46fcc2b4f2 100644 --- a/libs/ardour/lv2_plugin.cc +++ b/libs/ardour/lv2_plugin.cc @@ -58,10 +58,12 @@ #include #endif -#define NS_DC "http://dublincore.org/documents/dcmi-namespace/" -#define NS_LV2 "http://lv2plug.in/ns/lv2core#" -#define NS_PSET "http://lv2plug.in/ns/dev/presets#" -#define NS_UI "http://lv2plug.in/ns/extensions/ui#" +#define NS_DC "http://dublincore.org/documents/dcmi-namespace/" +#define NS_LV2 "http://lv2plug.in/ns/lv2core#" +#define NS_OLDPSET "http://lv2plug.in/ns/dev/presets#" +#define NS_PSET "http://lv2plug.in/ns/ext/presets#" +#define NS_UI "http://lv2plug.in/ns/extensions/ui#" +#define NS_RDFS "http://www.w3.org/2000/01/rdf-schema#" using namespace std; using namespace ARDOUR; @@ -685,30 +687,49 @@ get_value(LilvWorld* world, const LilvNode* subject, const LilvNode* predicate) return vs ? lilv_nodes_get_first(vs) : NULL; } -void -LV2Plugin::find_presets() +static void +find_presets_helper(LilvWorld* world, + LilvPlugin* plugin, + std::map& out, + LilvNode* preset_pred, + LilvNode* title_pred) { - LilvNode* dc_title = lilv_new_uri(_world.world, NS_DC "title"); - LilvNode* pset_hasPreset = lilv_new_uri(_world.world, NS_PSET "hasPreset"); - - LilvNodes* presets = lilv_plugin_get_value(_impl->plugin, pset_hasPreset); + LilvNodes* presets = lilv_plugin_get_value(plugin, preset_pred); LILV_FOREACH(nodes, i, presets) { const LilvNode* preset = lilv_nodes_get(presets, i); - const LilvNode* name = get_value(_world.world, preset, dc_title); + const LilvNode* name = get_value(world, preset, title_pred); if (name) { - _presets.insert(std::make_pair(lilv_node_as_string(preset), - PresetRecord( - lilv_node_as_string(preset), - lilv_node_as_string(name)))); + out.insert(std::make_pair(lilv_node_as_string(preset), + Plugin::PresetRecord( + lilv_node_as_string(preset), + lilv_node_as_string(name)))); } else { warning << string_compose( - _("Plugin \"%1\% preset \"%2%\" is missing a dc:title\n"), - unique_id(), lilv_node_as_string(preset)); + _("Plugin \"%1\% preset \"%2%\" is missing a label\n"), + lilv_node_as_string(lilv_plugin_get_uri(plugin)), + lilv_node_as_string(preset)); } } lilv_nodes_free(presets); +} +void +LV2Plugin::find_presets() +{ + LilvNode* dc_title = lilv_new_uri(_world.world, NS_DC "title"); + LilvNode* oldpset_hasPreset = lilv_new_uri(_world.world, NS_OLDPSET "hasPreset"); + LilvNode* pset_hasPreset = lilv_new_uri(_world.world, NS_PSET "hasPreset"); + LilvNode* rdfs_label = lilv_new_uri(_world.world, NS_RDFS "label"); + + find_presets_helper(_world.world, _impl->plugin, _presets, + oldpset_hasPreset, dc_title); + + find_presets_helper(_world.world, _impl->plugin, _presets, + pset_hasPreset, rdfs_label); + + lilv_node_free(rdfs_label); lilv_node_free(pset_hasPreset); + lilv_node_free(oldpset_hasPreset); lilv_node_free(dc_title); } @@ -717,16 +738,20 @@ LV2Plugin::load_preset(PresetRecord r) { Plugin::load_preset(r); - LilvNode* lv2_port = lilv_new_uri(_world.world, NS_LV2 "port"); - LilvNode* lv2_symbol = lilv_new_uri(_world.world, NS_LV2 "symbol"); - LilvNode* pset_value = lilv_new_uri(_world.world, NS_PSET "value"); - LilvNode* preset = lilv_new_uri(_world.world, r.uri.c_str()); + LilvNode* lv2_port = lilv_new_uri(_world.world, NS_LV2 "port"); + LilvNode* lv2_symbol = lilv_new_uri(_world.world, NS_LV2 "symbol"); + LilvNode* oldpset_value = lilv_new_uri(_world.world, NS_OLDPSET "value"); + LilvNode* preset = lilv_new_uri(_world.world, r.uri.c_str()); + LilvNode* pset_value = lilv_new_uri(_world.world, NS_PSET "value"); LilvNodes* ports = lilv_world_find_nodes(_world.world, preset, lv2_port, NULL); LILV_FOREACH(nodes, i, ports) { const LilvNode* port = lilv_nodes_get(ports, i); const LilvNode* symbol = get_value(_world.world, port, lv2_symbol); const LilvNode* value = get_value(_world.world, port, pset_value); + if (!value) { + value = get_value(_world.world, port, oldpset_value); + } if (value && lilv_node_is_float(value)) { set_parameter(_port_indices[lilv_node_as_string(symbol)], lilv_node_as_float(value)); @@ -734,8 +759,9 @@ LV2Plugin::load_preset(PresetRecord r) } lilv_nodes_free(ports); - lilv_node_free(preset); lilv_node_free(pset_value); + lilv_node_free(preset); + lilv_node_free(oldpset_value); lilv_node_free(lv2_symbol); lilv_node_free(lv2_port);