From 1385643131a2b2231bbbc0c584c76883fcfb580a Mon Sep 17 00:00:00 2001 From: David Robillard Date: Wed, 26 Jan 2011 19:58:16 +0000 Subject: Implement non-SPARQL LV2Plugin::find_presets using more basic SLV2 API. Also add a (for now) commented out implementation for LV2Plugin::load_preset, but this requires SLV2 to have blank node SLV2Values, which the current version does not... git-svn-id: svn://localhost/ardour2/branches/3.0@8578 d708f5d6-7413-0410-9779-e7cbd77b26cf --- libs/ardour/lv2_plugin.cc | 68 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 57 insertions(+), 11 deletions(-) diff --git a/libs/ardour/lv2_plugin.cc b/libs/ardour/lv2_plugin.cc index dd36d134f5..be44dab105 100644 --- a/libs/ardour/lv2_plugin.cc +++ b/libs/ardour/lv2_plugin.cc @@ -358,28 +358,74 @@ LV2Plugin::add_state (XMLNode* root) const } } +#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#" + +static inline SLV2Value +get_value(SLV2Plugin p, SLV2Value subject, SLV2Value predicate) +{ + SLV2Values vs = slv2_plugin_get_value_for_subject(p, subject, predicate); + return vs ? slv2_values_get_at(vs, 0) : NULL; +} + void LV2Plugin::find_presets () { - SLV2Results presets = slv2_plugin_query_sparql(_plugin, - "PREFIX lv2p: \n" - "PREFIX dc: \n" - "SELECT ?p ?name WHERE { <> lv2p:hasPreset ?p . ?p dc:title ?name }\n"); - - for (; !slv2_results_finished(presets); slv2_results_next(presets)) { - SLV2Value uri = slv2_results_get_binding_value(presets, 0); - SLV2Value name = slv2_results_get_binding_value(presets, 1); - PresetRecord rec(slv2_value_as_string(uri), slv2_value_as_string(name)); - _presets.insert(std::make_pair(slv2_value_as_string(uri), rec)); + SLV2Value dc_title = slv2_value_new_uri(_world.world, NS_DC "title"); + SLV2Value pset_hasPreset = slv2_value_new_uri(_world.world, NS_PSET "hasPreset"); + + SLV2Values presets = slv2_plugin_get_value(_plugin, pset_hasPreset); + for (unsigned i = 0; i < slv2_values_size(presets); ++i) { + // TODO: Choose which name to use based on locale? + SLV2Value preset = slv2_values_get_at(presets, i); + SLV2Value name = get_value(_plugin, preset, dc_title); + if (name) { + _presets.insert(std::make_pair(slv2_value_as_string(preset), + PresetRecord( + slv2_value_as_string(preset), + slv2_value_as_string(name)))); + } else { + warning << string_compose( + _("Plugin \"%1\% preset \"%2%\" is missing a dc:title\n"), + unique_id(), slv2_value_as_string(preset)); + } } + slv2_values_free(presets); - slv2_results_free(presets); + slv2_value_free(pset_hasPreset); + slv2_value_free(dc_title); } bool LV2Plugin::load_preset (PresetRecord r) { Plugin::load_preset (r); + +#if 0 + // TODO: SLV2 needs blank nodes in the API for this to be possible... + SLV2Value lv2_port = slv2_value_new_uri(_world.world, NS_LV2 "port"); + SLV2Value lv2_symbol = slv2_value_new_uri(_world.world, NS_LV2 "symbol"); + SLV2Value pset_value = slv2_value_new_uri(_world.world, NS_PSET "value"); + SLV2Value preset = slv2_value_new_uri(_world.world, r.uri.c_str()); + + SLV2Values ports = slv2_plugin_get_value_for_subject(_plugin, preset, lv2_port); + for (unsigned i = 0; i < slv2_values_size(ports); ++i) { + SLV2Value port = slv2_values_get_at(ports, i); // ... because of this + SLV2Value symbol = get_value(_plugin, port, lv2_symbol); + SLV2Value value = get_value(_plugin, port, pset_value); + if (value && slv2_value_is_float(value)) { + set_parameter(_port_indices[slv2_value_as_string(symbol)], + slv2_value_as_float(value)); + } + } + slv2_values_free(ports); + + slv2_value_free(preset); + slv2_value_free(pset_value); + slv2_value_free(lv2_symbol); + slv2_value_free(lv2_port); +#endif const string query = string( "PREFIX lv2p: \n" -- cgit v1.2.3