diff options
-rw-r--r-- | data/lv2.ttl | 55 | ||||
-rw-r--r-- | slv2/Makefile.am | 2 | ||||
-rw-r--r-- | slv2/categories.h | 80 | ||||
-rw-r--r-- | slv2/category.h | 70 | ||||
-rw-r--r-- | slv2/plugin.h | 6 | ||||
-rw-r--r-- | slv2/slv2.h | 1 | ||||
-rw-r--r-- | slv2/types.h | 4 | ||||
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/categories.c | 90 | ||||
-rw-r--r-- | src/category.c | 57 | ||||
-rw-r--r-- | src/plugin.c | 41 | ||||
-rw-r--r-- | src/pluginlist.c | 6 | ||||
-rw-r--r-- | src/private_types.h | 24 | ||||
-rw-r--r-- | src/query.c | 21 | ||||
-rw-r--r-- | src/world.c | 67 | ||||
-rw-r--r-- | utils/lv2_inspect.c | 3 |
16 files changed, 458 insertions, 71 deletions
diff --git a/data/lv2.ttl b/data/lv2.ttl index d0d9f94..91f6fd2 100644 --- a/data/lv2.ttl +++ b/data/lv2.ttl @@ -1,7 +1,7 @@ # RDF Schema for LV2 plugins # *** PROVISIONAL *** # -# *** PROPOSED Revision 2007-02-19 *** +# *** PROPOSED Revision 2007-04-20 *** # # This document describes the classes and properties that are defined by the # core LV2 specification. See <http://lv2plug.in> for more information. @@ -41,8 +41,8 @@ doap:shortdesc "An audio processing plugin specification" ; doap:programming-language "C" ; doap:release [ - doap:revision "1.0beta1" ; - doap:created "2007-02-03" + doap:revision "1.0beta2" ; + doap:created "2007-04-20" ] ; doap:maintainer [ a foaf:Person ; @@ -52,7 +52,8 @@ ] , [ a foaf:Person ; foaf:name "Dave Robillard" ; - rdfs:seeAlso <http://drobilla.net/drobilla.ttl> + foaf:homepage <http://drobilla.net/> ; + rdfs:seeAlso <http://drobilla.net/drobilla.xrdf> ]. @@ -468,32 +469,32 @@ A plugin MUST operate reasonably even if such a port has a non-integer input. :UtilityPlugin a rdfs:Class ; rdfs:subClassOf :Plugin ; - rdfs:label "Utilities" ; + rdfs:label "Utility" ; rdfs:comment """ Includes things like mathematical functions and non-musical delays. """ . :GeneratorPlugin a rdfs:Class ; rdfs:subClassOf :Plugin ; - rdfs:label "Generators" ; + rdfs:label "Generator" ; rdfs:comment """ Any plugin that generates sound internally, rather than processing its input. """ . :InstrumentPlugin a rdfs:Class ; rdfs:subClassOf :GeneratorPlugin ; - rdfs:label "Instruments" ; + rdfs:label "Instrument" ; rdfs:comment """ Any plugin that is intended to be played as a musical instrument. """ . :OscillatorPlugin a rdfs:Class ; rdfs:subClassOf :GeneratorPlugin ; - rdfs:label "Oscillators" . + rdfs:label "Oscillator" . :SimulatorPlugin a rdfs:Class ; rdfs:subClassOf :Plugin ; - rdfs:label "Simulators" ; + rdfs:label "Simulator" ; rdfs:comment """ Plugins that aim to duplicate the effect of some environmental effect or musical equipment. @@ -501,18 +502,18 @@ musical equipment. :DelayPlugin a rdfs:Class ; rdfs:subClassOf :Plugin ; - rdfs:label "Delays" ; + rdfs:label "Delay" ; rdfs:comment """ Plugins that intentionally delay their input signal as an effect. """ . :PhaserPlugin a rdfs:Class ; rdfs:subClassOf :Plugin ; - rdfs:label "Phasers" . + rdfs:label "Phaser" . :FlangerPlugin a rdfs:Class ; rdfs:subClassOf :Plugin ; - rdfs:label "Flangers" . + rdfs:label "Flanger" . :ChorusPlugin a rdfs:Class ; rdfs:subClassOf :Plugin ; @@ -526,7 +527,7 @@ Plugins that intentionally delay their input signal as an effect. :FilterPlugin a rdfs:Class ; rdfs:subClassOf :Plugin ; - rdfs:label "Filters" . + rdfs:label "Filter" . :LowpassPlugin a rdfs:Class ; rdfs:subClassOf :FilterPlugin ; @@ -542,7 +543,7 @@ Plugins that intentionally delay their input signal as an effect. :CombPlugin a rdfs:Class ; rdfs:subClassOf :FilterPlugin ; - rdfs:label "Combs" . + rdfs:label "Comb" . :AllpassPlugin a rdfs:Class ; rdfs:subClassOf :FilterPlugin ; @@ -550,55 +551,55 @@ Plugins that intentionally delay their input signal as an effect. :EQPlugin a rdfs:Class ; rdfs:subClassOf :FilterPlugin ; - rdfs:label "Equalisers" . + rdfs:label "Equaliser" . :ParaEQPlugin a rdfs:Class ; rdfs:subClassOf :EQPlugin ; - rdfs:label "Parametrics" . + rdfs:label "Parametric" . :MultiEQPlugin a rdfs:Class ; rdfs:subClassOf :EQPlugin ; - rdfs:label "Multibands" . + rdfs:label "Multiband" . :PitchPlugin a rdfs:Class ; rdfs:subClassOf :Plugin ; - rdfs:label "Pitch Shifters" . + rdfs:label "Pitch Shifter" . :AmplifierPlugin a rdfs:Class ; rdfs:subClassOf :Plugin ; - rdfs:label "Amplifiers" . + rdfs:label "Amplifier" . :WaveshaperPlugin a rdfs:Class ; rdfs:subClassOf :Plugin ; - rdfs:label "Waveshapers" . + rdfs:label "Waveshaper" . :ModulatorPlugin a rdfs:Class ; rdfs:subClassOf :Plugin ; - rdfs:label "Modulators" . + rdfs:label "Modulator" . :DistortionPlugin a rdfs:Class ; rdfs:subClassOf :Plugin ; - rdfs:label "Distortions" . + rdfs:label "Distortion" . :DynamicsPlugin a rdfs:Class ; rdfs:subClassOf :Plugin ; - rdfs:label "Dynamics processors" ; + rdfs:label "Dynamics processor" ; rdfs:comment """ Plugins that alter the envelope or dynamic range of the processed audio. """ . :CompressorPlugin a rdfs:Class ; rdfs:subClassOf :DynamicsPlugin ; - rdfs:label "Compressors" . + rdfs:label "Compressor" . :ExpanderPlugin a rdfs:Class ; rdfs:subClassOf :DynamicsPlugin ; - rdfs:label "Expanders" . + rdfs:label "Expander" . :LimiterPlugin a rdfs:Class ; rdfs:subClassOf :DynamicsPlugin ; - rdfs:label "Limiters" . + rdfs:label "Limiter" . :GatePlugin a rdfs:Class ; rdfs:subClassOf :DynamicsPlugin ; - rdfs:label "Gates" . + rdfs:label "Gate" . diff --git a/slv2/Makefile.am b/slv2/Makefile.am index e20cde8..8e1b827 100644 --- a/slv2/Makefile.am +++ b/slv2/Makefile.am @@ -5,6 +5,8 @@ slv2include_HEADERS = \ types.h \ slv2.h \ world.h \ + category.h \ + categories.h \ plugin.h \ port.h \ pluginlist.h \ diff --git a/slv2/categories.h b/slv2/categories.h new file mode 100644 index 0000000..44b9aee --- /dev/null +++ b/slv2/categories.h @@ -0,0 +1,80 @@ +/* SLV2 + * Copyright (C) 2007 Dave Robillard <http://drobilla.net> + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This library is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef __SLV2_CATEGORIES_H__ +#define __SLV2_CATEGORIES_H__ + +#include <slv2/category.h> + +#ifdef __cplusplus +extern "C" { +#endif + + +typedef void* SLV2Categories; + + +/** \defgroup categories Categories + * + * @{ + */ + +/** Get the number of plugins in the list. + */ +unsigned +slv2_categories_size(SLV2Categories list); + + +/** Get a category from the list by URI. + * + * Return value is shared (stored in \a list) and must not be freed or + * modified by the caller in any way. + * + * Time = O(log2(n)) + * + * \return NULL if plugin with \a url not found in \a list. + */ +SLV2Category +slv2_categories_get_by_uri(SLV2Categories list, + const char* uri); + + +/** Get a plugin from the list by index. + * + * \a index has no significance other than as an index into this list. + * Any \a index not less than slv2_categories_get_length(list) will return NULL, + * so all categories in a list can be enumerated by repeated calls + * to this function starting with \a index = 0. + * + * Time = O(1) + * + * \return NULL if \a index out of range. + */ +SLV2Category +slv2_categories_get_at(SLV2Categories list, + unsigned index); + + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* __SLV2_CATEGORIES_H__ */ + diff --git a/slv2/category.h b/slv2/category.h new file mode 100644 index 0000000..1d0159f --- /dev/null +++ b/slv2/category.h @@ -0,0 +1,70 @@ +/* SLV2 + * Copyright (C) 2007 Dave Robillard <http://drobilla.net> + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This library is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef __SLV2_CATEGORY_H__ +#define __SLV2_CATEGORY_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include <slv2/types.h> + +/** \addtogroup data + * @{ + */ + + +/** Get the URI of this category. + * + * Returned value is owned by \a category and must not be freed by caller. + * + * Time = O(1) + */ +const char* slv2_category_get_uri(SLV2Category category); + + +/** Get the label of this category, ie "Oscillators". + * + * Returned value is owned by \a category and must not be freed by caller. + * + * Time = O(1) + */ +const char* slv2_category_get_label(SLV2Category category); + +#if 0 +/** Get the path of this category, ie "Plugins/Generators/Oscillators". + * + * SLV2 automatically generates an ideal category heirarchy given the plugins + * present. The last fragment of the path is the category's label, + * as returned by slv2_category_get_label. + * + * Returned value is owned by \a category and must not be freed by caller. + * + * Time = O(1) + */ +const char* slv2_category_get_path(SLV2Category category); +#endif + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* __SLV2_CATEGORY_H__ */ diff --git a/slv2/plugin.h b/slv2/plugin.h index 30394d3..4db5130 100644 --- a/slv2/plugin.h +++ b/slv2/plugin.h @@ -134,6 +134,12 @@ char* slv2_plugin_get_name(SLV2Plugin plugin); +/** Get the category this plugin belongs to. + */ +SLV2Category +slv2_plugin_get_category(SLV2Plugin plugin); + + /** Get a value associated with the plugin in a plugin's data files. * * Returns the ?object of all triples found of the form: diff --git a/slv2/slv2.h b/slv2/slv2.h index 431bd17..a052e56 100644 --- a/slv2/slv2.h +++ b/slv2/slv2.h @@ -25,6 +25,7 @@ extern "C" { #include <slv2/types.h> #include <slv2/world.h> +#include <slv2/category.h> #include <slv2/plugin.h> #include <slv2/port.h> #include <slv2/pluginlist.h> diff --git a/slv2/types.h b/slv2/types.h index c22b2be..f595dd1 100644 --- a/slv2/types.h +++ b/slv2/types.h @@ -56,6 +56,10 @@ typedef struct _Plugin* SLV2Plugin; typedef struct _World* SLV2World; +/** A plugin category. Opaque, but valid to compare to NULL. */ +typedef struct _Category* SLV2Category; + + #ifdef __cplusplus } #endif diff --git a/src/Makefile.am b/src/Makefile.am index 8009ff8..cc5a774 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -7,6 +7,8 @@ libslv2_la_LIBADD = @REDLAND_LIBS@ libslv2_la_SOURCES = \ private_types.h \ world.c \ + category.c \ + categories.c \ plugin.c \ query.c \ port.c \ diff --git a/src/categories.c b/src/categories.c new file mode 100644 index 0000000..133e7ee --- /dev/null +++ b/src/categories.c @@ -0,0 +1,90 @@ +/* SLV2 + * Copyright (C) 2007 Dave Robillard <http://drobilla.net> + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This library is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#define _XOPEN_SOURCE 500 + +#include <string.h> +#include <limits.h> +#include <librdf.h> +#include <slv2/category.h> +#include <slv2/categories.h> +#include "private_types.h" + + +SLV2Categories +slv2_categories_new() +{ + return raptor_new_sequence((void (*)(void*))&slv2_category_free, NULL); +} + + +void +slv2_categories_free(SLV2Categories list) +{ + //if (list != world->categories) + raptor_free_sequence(list); +} + + +unsigned +slv2_categories_size(SLV2Categories list) +{ + return raptor_sequence_size(list); +} + + +SLV2Category +slv2_categories_get_by_uri(SLV2Categories list, const char* uri) +{ + // good old fashioned binary search + + int lower = 0; + int upper = raptor_sequence_size(list) - 1; + int i; + + if (upper == 0) + return NULL; + + while (upper >= lower) { + i = lower + ((upper - lower) / 2); + + SLV2Category p = raptor_sequence_get_at(list, i); + + int cmp = strcmp(slv2_category_get_uri(p), uri); + + if (cmp == 0) + return p; + else if (cmp > 0) + upper = i - 1; + else + lower = i + 1; + } + + return NULL; +} + + +SLV2Category +slv2_categories_get_at(SLV2Categories list, unsigned index) +{ + if (index > INT_MAX) + return NULL; + else + return (SLV2Category)raptor_sequence_get_at(list, (int)index); +} + diff --git a/src/category.c b/src/category.c new file mode 100644 index 0000000..5eae2af --- /dev/null +++ b/src/category.c @@ -0,0 +1,57 @@ +/* SLV2 + * Copyright (C) 2007 Dave Robillard <http://drobilla.net> + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This library is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#define _XOPEN_SOURCE 500 + +#include <stdlib.h> +#include <string.h> +#include <slv2/category.h> +#include "private_types.h" + + +SLV2Category +slv2_category_new(const char* uri, const char* label) +{ + SLV2Category category = (SLV2Category)malloc(sizeof(struct _Category)); + category->uri = strdup(uri); + category->label = strdup(label); + return category; +} + + +void +slv2_category_free(SLV2Category category) +{ + free(category->uri); + free(category->label); + free(category); +} + + +const char* +slv2_category_get_uri(SLV2Category category) +{ + return category->uri; +} + + +const char* +slv2_category_get_label(SLV2Category category) +{ + return category->label; +} diff --git a/src/plugin.c b/src/plugin.c index 722caa1..7fe8e1d 100644 --- a/src/plugin.c +++ b/src/plugin.c @@ -37,6 +37,7 @@ slv2_plugin_new(SLV2World world, librdf_uri* uri, const char* binary_uri) plugin->world = world; plugin->plugin_uri = librdf_new_uri_from_uri(uri); plugin->binary_uri = strdup(binary_uri); + plugin->category = NULL; plugin->data_uris = slv2_strings_new(); plugin->ports = raptor_new_sequence((void (*)(void*))&slv2_port_free, NULL); plugin->storage = NULL; @@ -145,8 +146,32 @@ slv2_plugin_load(SLV2Plugin p) librdf_free_uri(data_uri); } - // Load ports + // Load category const unsigned char* query = (const unsigned char*) + "SELECT DISTINCT ?class WHERE { <> a ?class }"; + + librdf_query* q = librdf_new_query(p->world->world, "sparql", + NULL, query, p->plugin_uri); + + librdf_query_results* results = librdf_query_execute(q, p->rdf); + + while (!librdf_query_results_finished(results)) { + librdf_node* class_node = librdf_query_results_get_binding_value(results, 0); + librdf_uri* class_uri = librdf_node_get_uri(class_node); + const char* class_uri_str = (const char*)librdf_uri_as_string(class_uri); + + SLV2Category category = slv2_categories_get_by_uri(p->world->categories, class_uri_str); + + if (category) { + p->category = category; + break; + } + + librdf_query_results_next(results); + } + + // Load ports + query = (const unsigned char*) "PREFIX : <http://lv2plug.in/ontology#>\n" "SELECT DISTINCT ?port ?symbol ?index WHERE {\n" "<> :port ?port .\n" @@ -154,10 +179,10 @@ slv2_plugin_load(SLV2Plugin p) " :index ?index .\n" "}"; - librdf_query* q = librdf_new_query(p->world->world, "sparql", + q = librdf_new_query(p->world->world, "sparql", NULL, query, p->plugin_uri); - librdf_query_results* results = librdf_query_execute(q, p->rdf); + results = librdf_query_execute(q, p->rdf); while (!librdf_query_results_finished(results)) { @@ -217,6 +242,16 @@ slv2_plugin_get_library_uri(SLV2Plugin p) } +SLV2Category +slv2_plugin_get_category(SLV2Plugin p) +{ + if (!p->category) + slv2_plugin_load(p); + + return p->category; +} + + bool slv2_plugin_verify(SLV2Plugin plugin) { diff --git a/src/pluginlist.c b/src/pluginlist.c index d4cd058..da003a5 100644 --- a/src/pluginlist.c +++ b/src/pluginlist.c @@ -17,13 +17,11 @@ */ #define _XOPEN_SOURCE 500 -#include <limits.h> #include <string.h> +#include <limits.h> #include <stdio.h> #include <stdlib.h> -#include <sys/types.h> #include <assert.h> -#include <dirent.h> #include <librdf.h> #include <slv2/types.h> #include <slv2/plugin.h> @@ -308,8 +306,6 @@ slv2_plugins_get_by_uri(SLV2Plugins list, const char* uri) SLV2Plugin slv2_plugins_get_at(SLV2Plugins list, unsigned index) { - assert(list); - if (index > INT_MAX) return NULL; else diff --git a/src/private_types.h b/src/private_types.h index 48bed0a..ff4580c 100644 --- a/src/private_types.h +++ b/src/private_types.h @@ -27,6 +27,7 @@ extern "C" { #include <stddef.h> #include <librdf.h> #include <slv2/pluginlist.h> +#include <slv2/categories.h> /** Reference to a port on some plugin. @@ -53,6 +54,7 @@ struct _Plugin { librdf_uri* plugin_uri; // char* bundle_url; // Bundle directory plugin was loaded from char* binary_uri; // lv2:binary + SLV2Category category; raptor_sequence* data_uris; // rdfs::seeAlso raptor_sequence* ports; librdf_storage* storage; @@ -78,14 +80,26 @@ struct _InstanceImpl { }; +struct _Category { + char* uri; + char* label; +}; + +SLV2Category slv2_category_new(const char* uri, const char* label); +void slv2_category_free(SLV2Category category); + +SLV2Categories slv2_categories_new(); +void slv2_categories_free(); + /** Model of LV2 (RDF) data loaded from bundles. */ struct _World { - librdf_world* world; - librdf_storage* storage; - librdf_model* model; - librdf_parser* parser; - SLV2Plugins plugins; + librdf_world* world; + librdf_storage* storage; + librdf_model* model; + librdf_parser* parser; + SLV2Categories categories; + SLV2Plugins plugins; }; /** Load all bundles found in \a search_path. diff --git a/src/query.c b/src/query.c index 968834c..56a7412 100644 --- a/src/query.c +++ b/src/query.c @@ -132,19 +132,6 @@ slv2_plugin_query(SLV2Plugin plugin, return NULL; } - // Add LV2 ontology to query sources - //librdf_query_add_data_graph(rq, slv2_ontology_uri, - // NULL, RASQAL_DATA_GRAPH_BACKGROUND); - - // Add all plugin data files to query sources - /*for (unsigned i=0; i < slv2_strings_size(plugin->data_uris); ++i) { - const char* file_uri_str = slv2_strings_get_at(plugin->data_uris, i); - raptor_uri* file_uri = raptor_new_uri((const unsigned char*)file_uri_str); - librdf_query_add_data_graph(rq, file_uri, - NULL, RASQAL_DATA_GRAPH_BACKGROUND); - raptor_free_uri(file_uri); - }*/ - librdf_query_results* results = librdf_query_execute(rq, plugin->rdf); librdf_free_query(rq); @@ -190,7 +177,7 @@ slv2_plugin_query_count(SLV2Plugin plugin, } } - +/* size_t slv2_query_count_results(SLV2Plugin p, const char* query) @@ -205,10 +192,6 @@ slv2_query_count_results(SLV2Plugin p, //printf("Query: \n%s\n\n", query_str); - // Add LV2 ontology to query sources - //librdf_query_add_data_graph(rq, slv2_ontology_uri, - // NULL, RASQAL_DATA_GRAPH_BACKGROUND); - librdf_query_results* results = librdf_query_execute(rq, p->world->model); assert(results); @@ -221,4 +204,4 @@ slv2_query_count_results(SLV2Plugin p, return count; } - +*/ diff --git a/src/world.c b/src/world.c index a682a35..c8735ea 100644 --- a/src/world.c +++ b/src/world.c @@ -44,11 +44,10 @@ slv2_world_new() world->parser = librdf_new_parser(world->world, "turtle", NULL, NULL); + world->categories = slv2_categories_new(); + world->plugins = slv2_plugins_new(); - /*slv2_ontology_uri = raptor_new_uri((const unsigned char*) - "file://" LV2_TTL_PATH);*/ - return world; } @@ -56,14 +55,14 @@ slv2_world_new() void slv2_world_free(SLV2World world) { - /*raptor_free_uri(slv2_ontology_uri); - slv2_ontology_uri = NULL;*/ - for (int i=0; i < raptor_sequence_size(world->plugins); ++i) slv2_plugin_free(raptor_sequence_get_at(world->plugins, i)); raptor_free_sequence(world->plugins); world->plugins = NULL; + slv2_categories_free(world->categories); + world->categories = NULL; + librdf_free_parser(world->parser); world->parser = NULL; @@ -163,29 +162,73 @@ slv2_plugin_compare_by_uri(const void* a, const void* b) } */ + +void +slv2_world_load_categories(SLV2World world) +{ + // FIXME: This will need to be a bit more clever when more data is around + // then the ontology (ie classes which aren't LV2 categories) + + unsigned char* query_string = (unsigned char*) + "PREFIX : <http://lv2plug.in/ontology#>\n" + "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n" + "SELECT DISTINCT ?category ?label\n" + "WHERE { ?category a rdfs:Class; rdfs:label ?label }\n" + "ORDER BY ?category\n"; + + librdf_query* q = librdf_new_query(world->world, "sparql", + NULL, query_string, NULL); + + librdf_query_results* results = librdf_query_execute(q, world->model); + + while (!librdf_query_results_finished(results)) { + librdf_node* category_node = librdf_query_results_get_binding_value(results, 0); + librdf_uri* category_uri = librdf_node_get_uri(category_node); + librdf_node* label_node = librdf_query_results_get_binding_value(results, 1); + const char* label = (const char*)librdf_node_get_literal_value(label_node); + + //printf("CATEGORY: %s (%s)\n", librdf_uri_as_string(category_uri), label); + SLV2Category category = slv2_category_new( + (const char*)librdf_uri_as_string(category_uri), + label); + raptor_sequence_push(world->categories, category); + + librdf_query_results_next(results); + } + +} + + void slv2_world_load_all(SLV2World world) { char* lv2_path = getenv("LV2_PATH"); - /* 1. Read all manifest files into model */ + /* 1. Read LV2 ontology into model */ + librdf_uri* ontology_uri = librdf_new_uri(world->world, + (const unsigned char*)"file://" LV2_TTL_PATH); + librdf_parser_parse_into_model(world->parser, ontology_uri, NULL, world->model); + librdf_free_uri(ontology_uri); + + + /* 2. Read all manifest files into model */ if (lv2_path) { slv2_world_load_path(world, lv2_path); } else { const char* const home = getenv("HOME"); - const char* const suffix = "/.lv2:/usr/local/lib/lv2:usr/lib/lv2"; + const char* const suffix = "/.lv2:/usr/local/lib/lv2:/usr/lib/lv2"; lv2_path = slv2_strjoin(home, suffix, NULL); - //fprintf(stderr, "$LV2_PATH is unset. Using default path %s\n", lv2_path); - slv2_world_load_path(world, lv2_path); free(lv2_path); } - /* 2. Query out things to cache */ + /* 3. Query out things to cache */ + + slv2_world_load_categories(world); // Find all plugins and associated data files unsigned char* query_string = (unsigned char*) @@ -233,7 +276,7 @@ slv2_world_load_all(SLV2World world) librdf_query_results_next(results); } - // ORDER BY should (and appears to actually) guarantee this + // 'ORDER BY ?plugin' guarantees this //raptor_sequence_sort(world->plugins, slv2_plugin_compare_by_uri); if (results) diff --git a/utils/lv2_inspect.c b/utils/lv2_inspect.c index 710b791..75b6fac 100644 --- a/utils/lv2_inspect.c +++ b/utils/lv2_inspect.c @@ -96,6 +96,9 @@ print_plugin(SLV2Plugin p) str = slv2_plugin_get_name(p); printf("\tName: %s\n\n", str); free(str); + + const char* class_label = slv2_category_get_label(slv2_plugin_get_category(p)); + printf("\tClass: %s\n\n", class_label); if (slv2_plugin_has_latency(p)) printf("\tHas latency: yes\n\n"); |