summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2011-01-26 19:58:16 +0000
committerDavid Robillard <d@drobilla.net>2011-01-26 19:58:16 +0000
commit1385643131a2b2231bbbc0c584c76883fcfb580a (patch)
treefc0e7cb15cad2ca99149b2700e9edc23c3ef8d39 /libs
parent6ceda14cf43dac1aef916460d21d794b8bd1eeea (diff)
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
Diffstat (limited to 'libs')
-rw-r--r--libs/ardour/lv2_plugin.cc68
1 files 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: <http://lv2plug.in/ns/dev/presets#>\n"
- "PREFIX dc: <http://dublincore.org/documents/dcmi-namespace/>\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: <http://lv2plug.in/ns/dev/presets#>\n"