diff options
author | David Robillard <d@drobilla.net> | 2006-07-26 03:25:08 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2006-07-26 03:25:08 +0000 |
commit | 2cd84e4209633e59439c445f821bed8410347bab (patch) | |
tree | ba34505505795cff5cf35c2958ed21933b822e12 | |
parent | deca2cc89850dffc051d0a0aafc9d681af838934 (diff) | |
download | lilv-2cd84e4209633e59439c445f821bed8410347bab.tar.gz lilv-2cd84e4209633e59439c445f821bed8410347bab.tar.bz2 lilv-2cd84e4209633e59439c445f821bed8410347bab.zip |
- Removed all the unsigned char garbage from the API
- Updated types in lv2.h to be non-machine-dependant (removed unsigned long in favour of uint32_t)
- Updated schema
- Updated example plugin to work with the above (partially)
git-svn-id: http://svn.drobilla.net/lad/libslv2@101 a436a847-0d15-0410-975c-d299462d15a1
-rw-r--r-- | AUTHORS | 3 | ||||
-rw-r--r-- | examples/hosts/jack_host.c | 15 | ||||
-rw-r--r-- | examples/hosts/test_host.c | 69 | ||||
-rw-r--r-- | examples/plugins/Amp-slv2.lv2/Makefile (renamed from examples/plugins/Amp-swh.lv2/Makefile) | 0 | ||||
-rw-r--r-- | examples/plugins/Amp-slv2.lv2/amp.c (renamed from examples/plugins/Amp-swh.lv2/amp.c) | 26 | ||||
-rw-r--r-- | examples/plugins/Amp-slv2.lv2/amp.ttl | 57 | ||||
-rw-r--r-- | examples/plugins/Amp-slv2.lv2/manifest.ttl (renamed from examples/plugins/Amp-swh.lv2/manifest.ttl) | 6 | ||||
-rw-r--r-- | examples/plugins/Amp-swh.lv2/amp.ttl | 68 | ||||
-rw-r--r-- | include/lv2.h | 12 | ||||
-rw-r--r-- | include/lv2.ttl | 721 | ||||
-rw-r--r-- | slv2/plugin.h | 17 | ||||
-rw-r--r-- | slv2/plugininstance.h | 6 | ||||
-rw-r--r-- | slv2/pluginlist.h | 8 | ||||
-rw-r--r-- | slv2/port.h | 33 | ||||
-rw-r--r-- | slv2/private_types.h | 15 | ||||
-rw-r--r-- | slv2/query.h | 8 | ||||
-rw-r--r-- | slv2/types.h | 7 | ||||
-rw-r--r-- | src/plugin.c | 42 | ||||
-rw-r--r-- | src/plugininstance.c | 10 | ||||
-rw-r--r-- | src/pluginlist.c | 57 | ||||
-rw-r--r-- | src/port.c | 58 | ||||
-rw-r--r-- | src/query.c | 50 | ||||
-rw-r--r-- | src/util.c | 30 | ||||
-rw-r--r-- | src/util.h | 19 |
24 files changed, 774 insertions, 563 deletions
@@ -2,3 +2,6 @@ Author: Dave Robillard <mailto:drobilla@connect.carleton.ca> +(Note that this library is completely distinct from the LV2 specification +itself, which many more were involved in) + diff --git a/examples/hosts/jack_host.c b/examples/hosts/jack_host.c index 1be62b8..a29fb13 100644 --- a/examples/hosts/jack_host.c +++ b/examples/hosts/jack_host.c @@ -18,6 +18,7 @@ #include <stdio.h> #include <stdlib.h> +#include <string.h> #include <slv2/slv2.h> #include <jack/jack.h> @@ -27,14 +28,14 @@ struct JackHost { jack_client_t* jack_client; /**< Jack client */ SLV2Plugin* plugin; /**< Plugin "class" (actually just a few strings) */ SLV2Instance* instance; /**< Plugin "instance" (loaded shared lib) */ - unsigned long num_ports; /**< Size of the two following arrays: */ + size_t num_ports; /**< Size of the two following arrays: */ jack_port_t** jack_ports; /**< For audio ports, otherwise NULL */ float* controls; /**< For control ports, otherwise 0.0f */ }; void die(const char* msg); -void create_port(struct JackHost* host, unsigned long port_index); +void create_port(struct JackHost* host, uint32_t port_index); int jack_process_cb(jack_nframes_t nframes, void* data); void list_plugins(SLV2List list); @@ -99,7 +100,7 @@ main(int argc, char** argv) host.jack_ports = calloc(host.num_ports, sizeof(jack_port_t*)); host.controls = calloc(host.num_ports, sizeof(float*)); - for (unsigned long i=0; i < host.num_ports; ++i) + for (size_t i=0; i < host.num_ports; ++i) create_port(&host, i); /* Activate plugin and JACK */ @@ -146,10 +147,10 @@ die(const char* msg) */ void create_port(struct JackHost* host, - unsigned long port_index) + uint32_t port_index) { /* Make sure this is a float port */ - uchar* type = slv2_port_get_data_type(host->plugin, port_index); + char* type = slv2_port_get_data_type(host->plugin, port_index); if (strcmp(type, SLV2_DATA_TYPE_FLOAT)) die("Unrecognized data type, aborting."); free(type); @@ -197,7 +198,7 @@ jack_process_cb(jack_nframes_t nframes, void* data) struct JackHost* host = (struct JackHost*)data; /* Connect plugin ports directly to JACK buffers */ - for (unsigned long i=0; i < host->num_ports; ++i) + for (size_t i=0; i < host->num_ports; ++i) if (host->jack_ports[i] != NULL) slv2_instance_connect_port(host->instance, i, jack_port_get_buffer(host->jack_ports[i], nframes)); @@ -212,7 +213,7 @@ jack_process_cb(jack_nframes_t nframes, void* data) void list_plugins(SLV2List list) { - for (int i=0; i < slv2_list_get_length(list); ++i) { + for (size_t i=0; i < slv2_list_get_length(list); ++i) { const SLV2Plugin* const p = slv2_list_get_plugin_by_index(list, i); printf("%s\n", slv2_plugin_get_uri(p)); } diff --git a/examples/hosts/test_host.c b/examples/hosts/test_host.c index 16efa11..97df831 100644 --- a/examples/hosts/test_host.c +++ b/examples/hosts/test_host.c @@ -61,7 +61,7 @@ create_audio_output() void create_port(SLV2Plugin* plugin, SLV2Instance* instance, - unsigned long port_index) + uint32_t port_index) { enum SLV2PortClass class = slv2_port_get_class(plugin, port_index); @@ -102,14 +102,14 @@ main() const SLV2Plugin* p = slv2_list_get_plugin_by_uri(plugins, plugin_uri); if (p) { /* Get the plugin's name */ - unsigned char* name = slv2_plugin_get_name(p); + char* name = slv2_plugin_get_name(p); printf("Name:\t%s\n", name); free(name); - unsigned long num_ports = slv2_plugin_get_num_ports(p); + uint32_t num_ports = slv2_plugin_get_num_ports(p); //printf("Number of ports: %ld\n", num_ports); - for (unsigned long i=0; i < num_ports; ++i) { + for (uint32_t i=0; i < num_ports; ++i) { enum SLV2PortClass class = slv2_port_get_class(p, i); switch (class) { @@ -134,7 +134,7 @@ main() } SLV2Property prop; - for (unsigned long i=0; i < num_ports; ++i) { + for (uint32_t i=0; i < num_ports; ++i) { const char* property = "a"; prop = slv2_port_get_property(p, i, property); if (prop) @@ -167,65 +167,6 @@ main() slv2_list_free(plugins); -#if 0 - /* Display all plugins found in path */ - if (plugins) - printf("Plugins found: %ld\n", slv2_list_get_size(plugins)); - else - printf("No plugins found in %s\n", path); - - for (unsigned long i=0; 1; ++i) { - const SLV2Plugin* p = - slv2_list_get_plugin_by_index(plugins, i); - - if (!p) - break; - else - printf("\t%s\n", slv2_plugin_get_uri(p)); - } -#endif - -#if 0 - const uchar* bundle_url = (const uchar*)"file:/home/dave/code/ladspa2/ladspa2_sdk/examples/plugins/Amp-swh.ladspa2/"; - LV2Bundle* b = slv2_bundle_load(bundle_url); - - if (b != NULL) { - printf("Loaded bundle %s\n", slv2_bundle_get_url(b)); - - for (unsigned long i=0; i < slv2_bundle_get_num_plugins(b); ++i) { - const SLV2Plugin* p = slv2_bundle_get_plugin_by_index(b, i); - //printf("Plugin: %s\n", p->plugin_uri); - //printf("Lib: %s\n", p->lib_url); - //printf("Data: %s\n", p->data_url); - - printf("\n"); - const uchar* property = (uchar*)"doap:name"; - printf("%s\t%s\n", slv2_plugin_get_uri(p), property); - struct SLV2Property* result = slv2_plugin_get_property(p, property); - - if (result) { - for (int i=0; i < result->num_values; ++i) - printf("\t%s\n", result->values[i]); - } else { - printf("No results.\n"); - } - printf("\n"); - - /* Instantiate plugin */ - SLV2PluginInstance* instance = slv2_plugin_instantiate( - p, 48000, NULL); - if (instance != NULL) { - printf("Successfully instantiated %s\n", slv2_plugin_get_uri(p)); - slv2_plugin_instance_free(instance); - } - - } - - } else { - printf("Failed to load bundle %s\n", bundle_url); - } -#endif - return 0; } diff --git a/examples/plugins/Amp-swh.lv2/Makefile b/examples/plugins/Amp-slv2.lv2/Makefile index 55180c2..55180c2 100644 --- a/examples/plugins/Amp-swh.lv2/Makefile +++ b/examples/plugins/Amp-slv2.lv2/Makefile diff --git a/examples/plugins/Amp-swh.lv2/amp.c b/examples/plugins/Amp-slv2.lv2/amp.c index a30c4bd..e6b891e 100644 --- a/examples/plugins/Amp-swh.lv2/amp.c +++ b/examples/plugins/Amp-slv2.lv2/amp.c @@ -11,7 +11,7 @@ #define SYMBOL_EXPORT #endif -#define AMP_URI "http://plugin.org.uk/swh-plugins/amp"; +#define AMP_URI "http://codeson.net/plugins/amp" #define AMP_GAIN 0 #define AMP_INPUT 1 #define AMP_OUTPUT 2 @@ -24,11 +24,15 @@ typedef struct { float *output; } Amp; -static void cleanupAmp(LV2_Handle instance) { + +static void +cleanupAmp(LV2_Handle instance) { free(instance); } -static void connectPortAmp(LV2_Handle instance, unsigned long port, + +static void +connectPortAmp(LV2_Handle instance, unsigned long port, void *data) { Amp *plugin = (Amp *)instance; @@ -45,16 +49,20 @@ static void connectPortAmp(LV2_Handle instance, unsigned long port, } } -static LV2_Handle instantiateAmp(const LV2_Descriptor *descriptor, + +static LV2_Handle +instantiateAmp(const LV2_Descriptor *descriptor, unsigned long s_rate, const char *path , const LV2_Host_Feature **features) { Amp *plugin_data = (Amp *)malloc(sizeof(Amp)); return (LV2_Handle)plugin_data; } + #define DB_CO(g) ((g) > -90.0f ? powf(10.0f, (g) * 0.05f) : 0.0f) -static void runAmp(LV2_Handle instance, unsigned long sample_count) { +static void +runAmp(LV2_Handle instance, unsigned long sample_count) { Amp *plugin_data = (Amp *)instance; const float gain = *(plugin_data->gain); @@ -69,7 +77,9 @@ static void runAmp(LV2_Handle instance, unsigned long sample_count) { } } -static void init() { + +static void +init() { ampDescriptor = (LV2_Descriptor *)malloc(sizeof(LV2_Descriptor)); @@ -82,8 +92,10 @@ static void init() { ampDescriptor->run = runAmp; } + SYMBOL_EXPORT -const LV2_Descriptor *lv2_descriptor(unsigned long index) { +const LV2_Descriptor* +lv2_descriptor(unsigned long index) { if (!ampDescriptor) init(); switch (index) { diff --git a/examples/plugins/Amp-slv2.lv2/amp.ttl b/examples/plugins/Amp-slv2.lv2/amp.ttl new file mode 100644 index 0000000..abc5b33 --- /dev/null +++ b/examples/plugins/Amp-slv2.lv2/amp.ttl @@ -0,0 +1,57 @@ +@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . +@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . +@prefix lv2: <http://lv2plug.in/ontology#> . +@prefix foaf: <http://xmlns.com/foaf/0.1/> . +@prefix doap: <http://usefulinc.com/ns/doap#> . + +<http://codeson.net/plugins/amp> a lv2:Plugin ; + a lv2:AmplifierPlugin ; + doap:maintainer [ + foaf:name "Dave Robillard"; + foaf:homepage <http://codeson.net/> ; + foaf:mbox <mailto:drobilla@connect.carleton.ca> + ] ; + doap:name "Simple Amplifier" ; + doap:name "Einfacher Verstrker"@de ; + doap:licence <http://usefulinc.com/doap/licenses/gpl> ; + + lv2:property lv2:hardRTCapable ; + + lv2:port [ + a lv2:ControlRateInputPort ; + lv2:datatype lv2:float ; + lv2:index 0 ; + lv2:symbol "gain" ; + lv2:name "Gain" ; + lv2:name "Gewinn"@de ; + lv2:default [ rdf:value 0.0 ] ; + lv2:minimum [ rdf:value -90.0 ] ; + lv2:maximum [ rdf:value 24.0 ] ; + lv2:scalePoint [ + rdfs:label "+5" ; + rdf:value 5.0 + ] , [ + rdfs:label "Unity" ; + rdf:value 1.0 + ] , [ + rdfs:label "-5" ; + rdf:value -5.0 + ] , [ + rdfs:label "-10" ; + rdf:value -10.0 + ] + ] , [ + a lv2:AudioRateInputPort ; + lv2:datatype lv2:float ; + lv2:index 1 ; + lv2:symbol "in" ; + lv2:name "Input" + ] , [ + a lv2:AudioRateOutputPort ; + lv2:datatype lv2:float ; + lv2:index 2 ; + lv2:symbol "out" ; + lv2:name "Output" + ] +. + diff --git a/examples/plugins/Amp-swh.lv2/manifest.ttl b/examples/plugins/Amp-slv2.lv2/manifest.ttl index a26f506..94456e6 100644 --- a/examples/plugins/Amp-swh.lv2/manifest.ttl +++ b/examples/plugins/Amp-slv2.lv2/manifest.ttl @@ -4,6 +4,8 @@ @prefix lv2: <http://lv2plug.in/ontology#> . @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . -<http://plugin.org.uk/swh-plugins/amp> lv2:binary <amp.so> ; - rdfs:seeAlso <amp.ttl> . +<http://codeson.net/plugins/amp> + lv2:binary <amp.so> ; + rdfs:seeAlso <amp.ttl> . + diff --git a/examples/plugins/Amp-swh.lv2/amp.ttl b/examples/plugins/Amp-swh.lv2/amp.ttl deleted file mode 100644 index d44c0b9..0000000 --- a/examples/plugins/Amp-swh.lv2/amp.ttl +++ /dev/null @@ -1,68 +0,0 @@ -@prefix lv2: <http://lv2plug.in/ontology#> . -@prefix foaf: <http://xmlns.com/foaf/0.1/> . -@prefix doap: <http://usefulinc.com/ns/doap#> . - -<http://plugin.org.uk/swh-plugins/amp> a lv2:Plugin ; - a lv2:AmplifierPlugin ; - doap:maintainer [ - foaf:name "Steve Harris"; - foaf:homepage <http://plugin.org.uk/> ; - foaf:mbox <mailto:steve@plugin.org.uk> ; - ] ; - doap:name "Simple amplifier" ; - doap:name "简单放大器"@ch ; - doap:name "Einfacher Verstärker"@de ; - doap:name "Simple amp"@en-gb ; - doap:name "Amplificador simple"@es ; - doap:name "Amplificateur de base"@fr ; - doap:name "Amplificatore semplice"@it ; - doap:name "簡単なアンプ"@jp ; - doap:name "Просто усилитель"@ru ; - doap:licence <http://usefulinc.com/doap/licenses/gpl> ; - lv2:property lv2:hardRtCapable ; - - lv2:port [ - a lv2:InputControlRatePort ; - lv2:datatype lv2:float ; - lv2:index 0 ; - lv2:symbol "gain" ; - lv2:name "gain" ; - lv2:name "收益"@ch ; - lv2:name "gewinn"@de ; - lv2:name "gain"@en-gb ; - lv2:name "aumento"@es ; - lv2:name "gain"@fr ; - lv2:name "guadagno"@it ; - lv2:name "利益"@jp ; - lv2:name "увеличение"@ru ; - lv2:default 0.0 ; - lv2:minimum -90.0 ; - lv2:maximum 24.0 ; - lv2:scalePoint [ - lv2:label "+5" ; - lv2:value 5.0 ; - ] , [ - lv2:label "0" ; - lv2:value 0.0 ; - ] , [ - lv2:label "-5" ; - lv2:value -5.0 ; - ] , [ - lv2:label "-10" ; - lv2:value -10.0 ; - ] - ] , [ - a lv2:InputAudioRatePort ; - lv2:datatype lv2:float ; - lv2:index 1 ; - lv2:symbol "in" ; - lv2:name "in" ; - ] , [ - a lv2:OutputAudioRatePort ; - lv2:datatype lv2:float ; - lv2:index 2 ; - lv2:symbol "out" ; - lv2:name "out" ; - ] -. - diff --git a/include/lv2.h b/include/lv2.h index 7c3cec7..8523e80 100644 --- a/include/lv2.h +++ b/include/lv2.h @@ -24,6 +24,8 @@ #ifndef LV2_INCLUDED #define LV2_INCLUDED +#include <stdint.h> + #ifdef __cplusplus extern "C" { #endif @@ -153,7 +155,7 @@ typedef struct _LV2_Descriptor { * activate() rather than here. If a host calls instantiate, it MUST * call cleanup() at some point in the future. */ LV2_Handle (*instantiate)(const struct _LV2_Descriptor * Descriptor, - unsigned long SampleRate, + uint32_t SampleRate, const char * BundlePath, const LV2_Host_Feature** HostFeatures); @@ -184,7 +186,7 @@ typedef struct _LV2_Descriptor { * However, overlapped buffers or use of a single buffer for both * audio and control data may result in unexpected behaviour. */ void (*connect_port)(LV2_Handle Instance, - unsigned long Port, + uint32_t Port, void * DataLocation); /** Function pointer that initialises a plugin instance and activates @@ -226,7 +228,7 @@ typedef struct _LV2_Descriptor { * there are various things that the plugin MUST NOT do within the run() * function (see above). */ void (*run)(LV2_Handle Instance, - unsigned long SampleCount); + uint32_t SampleCount); /** This is the counterpart to activate() (see above). If there is * nothing for deactivate() to do then the plugin writer may provide @@ -287,12 +289,12 @@ typedef struct _LV2_Descriptor { * index that results in NULL being returned. Index has no meaning, * hosts MUST NOT depend on it remaining constant (ie when serialising) * in any way. */ -const LV2_Descriptor * lv2_descriptor(unsigned long Index); +const LV2_Descriptor * lv2_descriptor(uint32_t Index); /** Datatype corresponding to the lv2_descriptor() function. */ typedef const LV2_Descriptor * -(*LV2_Descriptor_Function)(unsigned long Index); +(*LV2_Descriptor_Function)(uint32_t Index); /* ******************************************************************** */ diff --git a/include/lv2.ttl b/include/lv2.ttl index 47b21ae..972fd6b 100644 --- a/include/lv2.ttl +++ b/include/lv2.ttl @@ -1,263 +1,459 @@ -# RDF Schema file for LV2 plugins +# RDF Schema for LV2 plugins # *** PROVISIONAL *** # # This document describes the classes and properties that are defined by the -# core LV2 specification. +# core LV2 specification. See <http://lv2plug.in> for more information. +# +# Copyright (C) 2006 Steve Harris, Dave Robillard +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR +# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +# OTHER DEALINGS IN THE SOFTWARE. @prefix : <http://lv2plug.in/ontology#> . @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . -@prefix dc: <http://purl.org/dc/elements/1.1/> . +@prefix xsd: <http://www.w3.org/2001/XMLSchema> . +@prefix doap: <http://usefulinc.com/ns/doap#> . +@prefix foaf: <http://xmlns.com/foaf/0.1/> . -<> dc:creator "Steve Harris" ; - dc:date "2006-04-26" . +<> doap:license <http://usefulinc.com/doap/licenses/mit> . -# -# Classes -# +<> doap:release [ doap:Version + [ doap:revision "0.9" ; doap:created "2006-07-24" ] ] . + +<> doap:maintainer [ foaf:Person + [ foaf:name "Steve Harris" ; + rdfs:seeAlso "http://inanna.ecs.soton.ac.uk/swh.xrdf" ] ] . + + + +################## +## Plugin Class ## +################## :Plugin a rdfs:Class ; - rdfs:label "Plugin" ; - rdfs:comment """ -This is the class that represents an LV2 plugin. - -In order for it to be used by a host it must have at least one occurance of the -following properties: - rdf:type (with object :Plugin) - doap:name (one without language tag) - doap:licence - lv2:port - -This can be determined by the following SPARQL query: - -PREFIX : <http://lv2plug.in/ontology#> -PREFIX doap: <http://usefulinc.com/ns/doap#> -SELECT DISTINCT ?uri WHERE { - ?uri a :Plugin ; - doap:name ?name ; - doap:licence ?rights ; - :port ?port . - FILTER( LANG(?name) = "" ) -} + rdfs:label "Plugin" ; + rdfs:comment """ +The class that represents an LV2 plugin. + +To be used by a host a Plugin must have at least the following properties: + rdf:type (with object :Plugin) + doap:name (one without language tag) + doap:licence + lv2:port """ . + + +################## +## Port Classes ## +################## + :Port a rdfs:Class ; - rdfs:label "Port" ; - rdfs:comment """ -This is the class that represents an LV2 port - -In order for it to be used by a host it must have at least the following -properties: - rdf:type (where object is exactly one of :InputControlRatePort, - :OutputControlRatePort, :InputAudioRatePort or :OututAudioRatePort) - :datatype - :index - :symbol - :name + rdfs:label "Port" ; + rdfs:comment """ +The class that represents an LV2 port + +In order for it to be used by a host it must have at least +the following properties: + rdf:type (where object is exactly one of + :InputControlRatePort, :OutputControlRatePort, + :InputAudioRatePort, :OututAudioRatePort) + :dataType + :index + :symbol + :name """ . :InputPort a rdfs:Class ; - rdfs:subClassOf :Port . + rdfs:subClassOf :Port . :OutputPort a rdfs:Class ; - rdfs:subClassOf :Port . + rdfs:subClassOf :Port . :ControlRatePort a rdfs:Class ; - rdfs:subClassOf :Port . + rdfs:subClassOf :Port . :AudioRatePort a rdfs:Class ; - rdfs:subClassOf :Port . + rdfs:subClassOf :Port . -:InputControlRatePort a rdfs:Class ; - rdfs:label "Input control port" ; - rdfs:subClassOf :ControlRatePort ; - rdfs:subClassOf :InputPort ; - rdfs:comment """ +:ControlRateInputPort a rdfs:Class ; + rdfs:label "Control-rate input port" ; + rdfs:subClassOf :ControlRatePort ; + rdfs:subClassOf :InputPort ; + rdfs:comment """ Ports of this type will be connected to a pointer to a single value of the type -defined by the :datatype property. +defined by the :dataType property. -Plugins will read values from this pointer during thier run method. +Plugins will read values from this pointer during their run method. """ . -:OutputControlRatePort a rdfs:Class ; - rdfs:label "Output control port" ; - rdfs:subClassOf :ControlRatePort ; - rdfs:subClassOf :OutputPort ; - rdfs:comment """ +:ControlRateOutputPort a rdfs:Class ; + rdfs:label "Control-rate output port" ; + rdfs:subClassOf :ControlRatePort ; + rdfs:subClassOf :OutputPort ; + rdfs:comment """ Ports of this type will be connected to a pointer to a single value of the type -defined by the :datatype property. +defined by the :dataType property. -Plugins will write values to this pointer during thier run method. +Plugins will write values to this pointer during their run method. """ . -:InputAudioRatePort a rdfs:Class ; - rdfs:label "Input audio port" ; - rdfs:subClassOf :AudioRatePort ; - rdfs:subClassOf :InputPort ; - rdfs:comment """ -Ports of this type will be connected to a an array of values of length -SampleCount and of the type defined by the :datatype property. +:AudioRateInputPort a rdfs:Class ; + rdfs:label "Audio-rate input port" ; + rdfs:subClassOf :AudioRatePort ; + rdfs:subClassOf :InputPort ; + rdfs:comment """ +Ports of this type will be connected to an array of values of length +SampleCount and of the type defined by the :dataType property. Plugins will read values from this array during their run method. """ . -:OutputAudioRatePort a rdfs:Class ; - rdfs:label "Output audio port" ; - rdfs:subClassOf :AudioRatePort ; - rdfs:subClassOf :OutputPort ; - rdfs:comment """ -Ports of this type will be connected to a an array of values of length -SampleCount and of the type defined by the :datatype property. +:AudioRateOutputPort a rdfs:Class ; + rdfs:label "Audio-rate output port" ; + rdfs:subClassOf :AudioRatePort ; + rdfs:subClassOf :OutputPort ; + rdfs:comment """ +Ports of this type will be connected to an array of values of length +SampleCount and of the type defined by the :dataType property. Plugins will write values to this array during their run method. """ . -:ScalePoint a rdfs:Class ; - rdfs:label "Scale point" ; - rdfs:comment """ -Used to describe interesting values in a Port's range. -It has two properties neccesary for use, :label and :value. -""" . -:Property a rdfs:Class ; - rdfs:label "Property" ; - rdfs:comment """ -Used to inform the host of the capabilities of the Plugin. -""" . +################################# +# Mandatory Port RDF:Properties # +################################# -:Hint a rdfs:Class ; - rdfs:label "Hint" ; - rdfs:comment """ -Used to hint to the host various things which can make interacting with the -Port more natural. -""" . +:Datatype a rdfs:Class ; + rdfs:comment "A data type that can be stored in an LV2 port." . -:HostFeature a rdfs:Class ; - rdfs:label "Host feature" ; +:dataType a rdf:Property ; + rdfs:domain :Port ; + rdfs:range lv2:DataType ; + rdfs:label "Port Data type" ; rdfs:comment """ -Used to describe a host feature which plugin may use or require. -""" . - - -# -# Properties -# - -:property a rdf:Property ; - rdfs:domain :Plugin ; - rdfs:range :Property ; - rdfs:label "property" ; - rdfs:comment "Relates Plugins to Properties." . - -:requiredHostFeature a rdf:Property ; - rdfs:domain :Plugin ; - rdfs:range :HostFeature ; - rdfs:label "Required host feature" ; - rdfs:comment """ -Signifies that plugin requires a certain host feature to function. -The plugin will fail to instantiate if a required host feature is not present; -hosts SHOULD always check this before attempting to instantiate a plugin. -""" . - -:hint a rdf:Property ; - rdfs:domain :Port ; - rdfs:range :Hint ; - rdfs:label "hint" ; - rdfs:comment "Relates Ports to Hints." . - -:datatype a rdf:Property ; - rdfs:domain :Port ; - rdfs:range :Datatype ; - rdfs:label "datatype" ; - rdfs:comment """ -Relates a Port to the datatype(s) is can accept. Currently the only specified -datatype is :float, which specfies IEEE-754 32bit floating point values. - -Hosts that do not support a specfied datatype MUST NOT instantiate the plugin. +Relates a Port to the data type(s) it can accept. Hosts that do not support +a specfied datatype MUST NOT instantiate the plugin, unless that port has +the connectionOptional hint set (in which case the host can simply "connect" +that port to NULL). If multiple datatypes are specfied the plugin must have some way to distinguish -the values. +the values (any extension that defines a new data-type which wishes to allow +this must deal with this issue somehow). """ . -# FIXME: rdfs:range = xsd:nonNegativeInteger? :index a rdf:Property ; - rdfs:domain :Port ; - rdfs:label "index" ; - rdfs:comment """ + rdfs:domain :Port ; + rdfs:range xsd:nonNegativeInteger ; + rdfs:label "index" ; + rdfs:comment """ Specifies the index of the port, passed as an argument to the connect port function. This number uniqely identifies the port within the plugin. + +The plugin author MUST change the plugin URI if a port index is changed. """ . -# FIXME: rdfs:range = xsd:NCName? Closest thing xsd: has.. :symbol a rdf:Property ; - rdfs:domain :Port ; - rdfs:label "symbol" ; - rdfs:comment """ + rdfs:domain :Port ; + rdfs:label "symbol" ; + rdfs:comment """ A short name used to identify the port in an easily machine and human readable way. The first character must be one of _, a-z or A-Z and subsequenct characters can be from _, a-z, A-Z and 0-9. -No language tag should be used on this property. +A language tag MUST NOT be used on this property. The plugin author MUST change +the plugin URI if a port symbol is changed. """ . +# FIXME: This isn't really fundamental like :index and :symbol :name a rdf:Property ; - rdfs:domain :Port ; - rdfs:label "name" ; - rdfs:comment """ + rdfs:domain :Port ; + rdfs:label "name" ; + rdfs:comment """ A display name for labeling the Port in a user interface. -This property is required for Ports, but should not be used by the host for +This property is required for Ports, but MUST NOT be used by the host for port identification. The plugin author may change the values of this property without changing the Plugin URI. """ . -:default a rdf:Property ; - rdfs:domain :ControlRatePort ; - rdfs:label "default" ; - rdfs:comment """ -The default value that the host SHOULD set this port to when there is not other -information available. Only meaningful for Ports with a :datatype of :float. -""" . -:minimum a rdf:Property ; - rdfs:domain :Port ; - rdfs:label "minimum" ; - rdfs:comment """ -A hint to the host for the minimum useful value that the port will use. The -plugin is required to accept all values in the range of :float. -""" . -:minimum a rdf:Property ; - rdfs:domain :Port ; - rdfs:label "maximum" ; +############################################# +# Port Additional RDF:Properties (Optional) # +############################################# + +:Point a rdfs:Class ; + rdfs:label "Port value point" ; rdfs:comment """ -A hint to the host for the maximum useful value that the port will use. The -plugin is required to accept all values in the range of :float. +Used to describe interesting values in a Port's range. To be valid it requires +two rdf:properties, rdfs:label and rdf:value. + +There are 3 specially defined Points in the LV2 specification (default, +minimum, and maximum), though future extensions may define more. """ . +:ScalePoint a rdfs:Class ; + rdfs:subClassOf :Point ; + rdfs:comment "A single :float Point (for control inputs)" . + :scalePoint a rdf:Property ; rdfs:domain :Port ; rdfs:range :ScalePoint ; - rdfs:label "scale point" ; + rdfs:label "Scale point" ; rdfs:comment "Relates a Port to its ScalePoints." . +:default a rdf:Property ; + rdfs:subPropertyOf :scalePoint ; + rdfs:label "Default value" ; + rdfs:comment """ +The default value that the host SHOULD set this port to when there is no other +information available. +""" . -# -# Instances -# +:minimum a rdf:Property ; + rdfs:subPropertyOf :scalePoint ; + rdfs:label "Minimum value" ; + rdfs:comment """ +A hint to the host for the minimum useful value that the port will use. +This is a "soft" limit - the plugin is required to gracefully accept all +values in the range of :Float. +""" . + +:maximum a rdf:Property ; + rdfs:subPropertyOf :scalePoint ; + rdfs:label "Maximum value" ; + rdfs:comment """ +A hint to the host for the maximum useful value that the port will use. +This is a "soft" limit - the plugin is required to gracefully accept all +values in the range of :Float. +""" . + + + +############# +# Data Type # +############# + +:Float a rdfs:DataType ; + rdfs:label "32-bit Floating Point" ; + rdfs:comment """ +Value conforming to the 32bit IEEE-754 floating point specification.""". + + + +################### +## Host Features ## +################### + +:HostFeature a rdfs:Class ; + rdfs:label "Host feature" ; + rdfs:comment "A host feature which a plugin may use (possibly require).". -:toggled a :Hint ; - rdfs:label "toggled" ; +:supportedHostFeature a rdf:Property ; + rdfs:domain :Plugin ; + rdfs:range :HostFeature ; + rdfs:label "Supported (optional) host feature" ; + rdfs:comment """ +Signifies that a plugin is able to make use of a certain host feature. +The plugin MUST NOT fail to instantiate if a supported (but not required) +host feature is not present.""" . + +:requiredHostFeature a rdf:Property ; + rdfs:domain :Plugin ; + rdfs:range :HostFeature ; + rdfs:label "Required host feature" ; + rdfs:comment """ +Signifies that a plugin requires a certain host feature to function. +The plugin MUST fail to instantiate if a required host feature is not present; +hosts SHOULD always check this before attempting to instantiate a plugin +(eg discovery by attempting to instantiate is strongly discouraged). +""" . + + + +#################### +## LV2 Properties ## +#################### + +:Property a rdfs:Class ; + rdfs:label "Property" ; + rdfs:comment """ +An LV2 Property. A host MUST NOT ignore the presence of a Property +(eg if it does, something catastrophic will happen and the plugin will not +function). If a piece of information can be ignored by the host and the +plugin can still function correctly, it is NOT a Property, it is a Hint. +""" . + +:PluginProperty a rdfs:Class ; + rdfs:label "Plugin property" ; + rdfs:subClassOf :Property ; + rdfs:comment "Property of a Plugin." . + +:PortProperty a rdfs:Class ; + rdfs:label "Port property" ; + rdfs:subClassOf :Property ; + rdfs:comment "Property of a Port." . + +:pluginProperty a rdf:Property ; + rdfs:domain :Plugin ; + rdfs:range :PluginProperty ; + rdfs:label "Plugin property" ; + rdfs:comment "Relates Plugins to PluginProperties." . + +:portProperty a rdf:Property ; + rdfs:domain :Port ; + rdfs:range :PortProperty ; + rdfs:label "hint" ; + rdfs:comment "Relates Ports to PortProperties." . + + +############### +## LV2 Hints ## +############### + +:Hint a rdfs:Class ; + rdfs:label "Hint" ; + rdfs:comment """ +An LV2 Hint - a useful piece of information that allows a host to make more +sensible decisions (eg to provide a better interface). Unlike a Property +a Hint may be ignored without catastrophic effects (though this doesn't mean +a Hint is less "important" than a Property, whether or not it can be safely +ignored and have the plugin still function correctly is the sole distinction). +""" . + +:PluginHint a rdfs:Class ; + rdfs:label "Plugin hint" ; + rdfs:subClassOf :Hint ; + rdfs:comment "Hint for a Plugin." . + +:PortHint a rdfs:Class ; + rdfs:label "Port hint" ; + rdfs:subClassOf :Hint ; + rdfs:comment "Hint for a Port." . + +:pluginHint a rdf:Property ; + rdfs:domain :Plugin ; + rdfs:range :PluginHint ; + rdfs:label "Plugin hint" ; + rdfs:comment "Relates Plugins to PluginHints." . + +:portHint a rdf:Property ; + rdfs:domain :Port ; + rdfs:range :PortHint ; + rdfs:label "Port hint" ; + rdfs:comment "Relates Ports to PortHints." . + + + +############################# +# Standard PluginProperties # +############################# + +:isLive a :PluginProperty ; + rdfs:label "Has a live (realtime) dependency" ; + rdfs:comment """ +Indicates that the plugin has a real-time dependency (e.g. queues data from a +socket) and so its output must not be cached or subject to significant latency, +and calls to the run method should be done in rapid succession. +""" . + +:hardRTCapable a :PluginProperty ; + rdfs:label "Hard realtime capable" ; + rdfs:comment """ +Indicates that the plugin is capable of running not only in a conventional host +but also in a "hard real-time" environment. To qualify for this the plugin must +satisfy all of the following: + + (1) The plugin must not use malloc(), free() or other heap memory + management within its run() or run_adding() functions. All new + memory used in run() must be managed via the stack. These + restrictions only apply to the run() function. + + (2) The plugin will not attempt to make use of any library + functions with the exceptions of functions in the ANSI standard C + and C maths libraries, which the host is expected to provide. + + (3) The plugin will not access files, devices, pipes, sockets, IPC + or any other mechanism that might result in process or thread + blocking. + + (4) The plugin will take an amount of time to execute a run() or + run_adding() call approximately of form (A+B*SampleCount) where A + and B depend on the machine and host in use. This amount of time + may not depend on input signals or plugin state. The host is left + the responsibility to perform timings to estimate upper bounds for + A and B. +""" . + +:inplaceBroken a :PluginProperty ; + rdfs:label "in-place broken" ; + rdfs:comment """ +Indicates that the plugin may cease to work correctly if the host elects to use +the same data location for both input and output. Plugins that will fail to +work correctly if ANY input buffer is set to the same location as ANY output +buffer (with connect_port()) MUST set this property. Doing so should be +avoided as enabling this flag makes it impossible for hosts to use the plugin +to process audio "in-place". +""" . + + + +###################### +# Standard PortHints # +###################### + +:connectionOptional a :PortHint ; + rdfs:label "Optionally connected port" ; + rdfs:comment """ +Indicates that this port does not have to be connected to valid data by the +host. If it is to be disconnected then the port MUST set to NULL with a call +to the connectPort method. +""" . + +:reportsLatency a :PortHint ; + rdfs:label "Latency reporting port" ; + rdfs:comment """ +Indicates that the port is used to express the processing latency incurred by +the plugin, expressed in samples. The latency may be affected by the current +sample rate, plugin settings, or other factors, and may be changed by the +plugin at any time. Where the latency is frequency dependent the plugin may +choose any appropriate value. If a plugin introduces latency it MUST provide +EXACTLY ONE port with this hint set which informs the host of the "correct" +latency. In "fuzzy" cases the value output should be the most reasonable based +on user expectation of input/output alignment (eg. musical delay/echo plugins +should not report their delay as latency, as it is an intentional effect). +""". + +:toggled a :PortHint ; + rdfs:label "Toggled" ; rdfs:comment """ Indicates that the data item should be considered a Boolean toggle. Data less -than or equal to zero should be considered `off' or `false,' and data above -zero should be considered `on' or `true.' +than or equal to zero should be considered "off" or "false", and data above +zero should be considered "on" or "true". """ . -:sampleRate a :Hint ; - rdfs:label "sample rate" ; +:sampleRate a :PortHint ; + rdfs:label "Sample rate" ; rdfs:comment """ Indicates that any bounds specified should be interpreted as multiples of the sample rate. For instance, a frequency range from 0Hz to the Nyquist frequency @@ -266,61 +462,146 @@ sample rate. For instance, a frequency range from 0Hz to the Nyquist frequency this hint to retain meaning. """ . -:integer a :Hint ; - rdfs:label "integer" ; +:integer a :PortHint ; + rdfs:label "Integer" ; rdfs:comment """ -Indicates that a user interface would probably wish to provide a stepped -control taking only integer values. +Indicates that a port's reasonable values are integers (eg. a user interface +would likely wish to provide a stepped control allowing only integer input). +A plugin MUST operate reasonably even if such a port has a non-integer input. """ . -:realtime a :Property ; - rdfs:label "realtime" ; - rdfs:comment """ -Indicates that the plugin has a real-time dependency (e.g. listens to a MIDI -device) and so its output must not be cached or subject to significant latency. -""" . -:inplaceBroken a :Property ; - rdfs:label "in-place broken" ; - rdfs:comment """ -Indicates that the plugin may cease to work correctly if the host elects to use -the same data location for both input and output (see connect_port()). This -should be avoided as enabling this flag makes it impossible for hosts to use -the plugin to process audio `in-place.' + +############################### +# Plugin Categories (Classes) # +############################### + +:UtilityPlugin a rdfs:Class ; + rdfs:subClassOf :Plugin ; + rdfs:label "Utilities" ; + rdfs:comment """ +Includes things like mathematical functions and non-musical delays. """ . -:hardRtCapable a :Property ; - rdfs:label "hard realtime capable" ; - rdfs:comment """ -Indicates that the plugin is capable of running not only in a conventional host -but also in a `hard real-time' environment. To qualify for this the plugin must -satisfy all of the following: +:GeneratorPlugin a rdfs:Class ; + rdfs:subClassOf :Plugin ; + rdfs:label "Generators" ; + rdfs:comment """ +Any plugin that generates sound internally, rather than processing its input. +""" . - (1) The plugin must not use malloc(), free() or other heap memory - management within its run() or run_adding() functions. All new - memory used in run() must be managed via the stack. These - restrictions only apply to the run() function. +:OscillatorPlugin a rdfs:Class ; + rdfs:subClassOf :GeneratorPlugin ; + rdfs:label "Oscillators" . - (2) The plugin will not attempt to make use of any library - functions with the exceptions of functions in the ANSI standard C - and C maths libraries, which the host is expected to provide. +:SimulatorPlugin a rdfs:Class ; + rdfs:subClassOf :Plugin ; + rdfs:label "Simulators" ; + rdfs:comment """ +Plugins that aim to duplicate the effect of some environmental effect or +musical equipment. +""" . - (3) The plugin will not access files, devices, pipes, sockets, IPC - or any other mechanism that might result in process or thread - blocking. - - (4) The plugin will take an amount of time to execute a run() or - run_adding() call approximately of form (A+B*SampleCount) where A - and B depend on the machine and host in use. This amount of time - may not depend on input signals or plugin state. The host is left - the responsibility to perform timings to estimate upper bounds for - A and B. +:DelayPlugin a rdfs:Class ; + rdfs:subClassOf :Plugin ; + rdfs:label "Delays" ; + rdfs:comment """ +Plugins that intentionally delay their input signal as an effect. """ . -# FIXME: = xsd:float? -:float a :Datatype ; - rdfs:label "float" ; - rdfs:comment """ -Represents values conforming to the 32bit IEEE-754 floating point specification. +:PhaserPlugin a rdfs:Class ; + rdfs:subClassOf :Plugin ; + rdfs:label "Phasers" . + +:FlangerPlugin a rdfs:Class ; + rdfs:subClassOf :Plugin ; + rdfs:label "Flangers" . + +:ChorusPlugin a rdfs:Class ; + rdfs:subClassOf :Plugin ; + rdfs:label "Chorus" . + +:ReverbPlugin a rdfs:Class ; + rdfs:subClassOf :Plugin ; + rdfs:subClassOf :SimulatorPlugin ; + rdfs:subClassOf :DelayPlugin ; + rdfs:label "Reverb" . + +:FilterPlugin a rdfs:Class ; + rdfs:subClassOf :Plugin ; + rdfs:label "Filters" . + +:LowpassPlugin a rdfs:Class ; + rdfs:subClassOf :FilterPlugin ; + rdfs:label "Lowpass" . + +:BandpassPlugin a rdfs:Class ; + rdfs:subClassOf :FilterPlugin ; + rdfs:label "Bandpass" . + +:HighpassPlugin a rdfs:Class ; + rdfs:subClassOf :FilterPlugin ; + rdfs:label "Highpass" . + +:CombPlugin a rdfs:Class ; + rdfs:subClassOf :FilterPlugin ; + rdfs:label "Combs" . + +:AllpassPlugin a rdfs:Class ; + rdfs:subClassOf :FilterPlugin ; + rdfs:label "Allpass" . + +:EQPlugin a rdfs:Class ; + rdfs:subClassOf :FilterPlugin ; + rdfs:label "Equalisers" . + +:ParaEQPlugin a rdfs:Class ; + rdfs:subClassOf :EQPlugin ; + rdfs:label "Parametrics" . + +:MultiEQPlugin a rdfs:Class ; + rdfs:subClassOf :EQPlugin ; + rdfs:label "Multibands" . + +:PitchPlugin a rdfs:Class ; + rdfs:subClassOf :Plugin ; + rdfs:label "Pitch Shifters" . + +:AmplifierPlugin a rdfs:Class ; + rdfs:subClassOf :Plugin ; + rdfs:label "Amplifiers" . + +:WaveshaperPlugin a rdfs:Class ; + rdfs:subClassOf :Plugin ; + rdfs:label "Waveshapers" . + +:ModulatorPlugin a rdfs:Class ; + rdfs:subClassOf :Plugin ; + rdfs:label "Modulators" . + +:DistortionPlugin a rdfs:Class ; + rdfs:subClassOf :Plugin ; + rdfs:label "Distortions" . + +:DynamicsPlugin a rdfs:Class ; + rdfs:subClassOf :Plugin ; + rdfs:label "Dynamics processors" ; + rdfs:comment """ +Plugins that alter the envelope or dynamic range of the processed audio. """ . +:CompressorPlugin a rdfs:Class ; + rdfs:subClassOf :DynamicsPlugin ; + rdfs:label "Compressors" . + +:ExpanderPlugin a rdfs:Class ; + rdfs:subClassOf :DynamicsPlugin ; + rdfs:label "Expanders" . + +:LimiterPlugin a rdfs:Class ; + rdfs:subClassOf :DynamicsPlugin ; + rdfs:label "Limiters" . + +:GatePlugin a rdfs:Class ; + rdfs:subClassOf :DynamicsPlugin ; + rdfs:label "Gates" . diff --git a/slv2/plugin.h b/slv2/plugin.h index 6af04bc..01dfc60 100644 --- a/slv2/plugin.h +++ b/slv2/plugin.h @@ -22,7 +22,8 @@ #ifdef __cplusplus extern "C" { #endif - + +#include <stdint.h> #include <stddef.h> #include <stdbool.h> #include "types.h" @@ -82,7 +83,7 @@ slv2_plugin_duplicate(const SLV2Plugin* plugin); * * \return a shared string which must not be modified or free()'d. */ -const unsigned char* +const char* slv2_plugin_get_uri(const SLV2Plugin* plugin); @@ -93,7 +94,7 @@ slv2_plugin_get_uri(const SLV2Plugin* plugin); * \return a complete URL eg. "file:///usr/foo/SomeBundle.lv2/someplug.ttl", * which is shared and must not be modified or free()'d. */ -const unsigned char* +const char* slv2_plugin_get_data_url(const SLV2Plugin* plugin); @@ -103,7 +104,7 @@ slv2_plugin_get_data_url(const SLV2Plugin* plugin); * eg. "/usr/foo/SomeBundle.lv2/someplug.ttl" which is shared and must not * be free()'d; or NULL if URL is not a local filesystem path. */ -const unsigned char* +const char* slv2_plugin_get_data_path(const SLV2Plugin* plugin); @@ -111,7 +112,7 @@ slv2_plugin_get_data_path(const SLV2Plugin* plugin); * * \return a shared string which must not be modified or free()'d. */ -const unsigned char* +const char* slv2_plugin_get_library_url(const SLV2Plugin* plugin); @@ -121,7 +122,7 @@ slv2_plugin_get_library_url(const SLV2Plugin* plugin); * eg. "/usr/foo/SomeBundle.lv2/someplug.so" which is shared and must not * be free()'d; or NULL if URL is not a local filesystem path. */ -const unsigned char* +const char* slv2_plugin_get_library_path(const SLV2Plugin* plugin); @@ -131,7 +132,7 @@ slv2_plugin_get_library_path(const SLV2Plugin* plugin); * data file without a language tag). Returned value must be free()'d by * the caller. */ -unsigned char* +char* slv2_plugin_get_name(const SLV2Plugin* plugin); @@ -154,7 +155,7 @@ slv2_plugin_get_property(const SLV2Plugin* p, /** Get the number of ports on this plugin. */ -unsigned long +uint32_t slv2_plugin_get_num_ports(const SLV2Plugin* p); diff --git a/slv2/plugininstance.h b/slv2/plugininstance.h index 5fd9393..1867c5e 100644 --- a/slv2/plugininstance.h +++ b/slv2/plugininstance.h @@ -58,7 +58,7 @@ typedef const struct _Instance SLV2Instance; */ SLV2Instance* slv2_plugin_instantiate(const SLV2Plugin* plugin, - unsigned long sample_rate, + uint32_t sample_rate, const LV2_Host_Feature** host_features); @@ -94,7 +94,7 @@ slv2_instance_get_uri(SLV2Instance* instance) */ inline void slv2_instance_connect_port(SLV2Instance* instance, - unsigned long port_index, + uint32_t port_index, void* data_location) { assert(instance); @@ -130,7 +130,7 @@ slv2_instance_activate(SLV2Instance* instance) */ inline void slv2_instance_run(SLV2Instance* instance, - unsigned long sample_count) + uint32_t sample_count) { assert(instance); assert(instance->descriptor); diff --git a/slv2/pluginlist.h b/slv2/pluginlist.h index d29a56d..535c214 100644 --- a/slv2/pluginlist.h +++ b/slv2/pluginlist.h @@ -110,8 +110,8 @@ slv2_list_load_path(SLV2List list, * installed plugins. Use \ref slv2_list_load_all. */ void -slv2_list_load_bundle(SLV2List list, - const unsigned char* bundle_base_url); +slv2_list_load_bundle(SLV2List list, + const char* bundle_base_url); /** Get the number of plugins in the list. @@ -128,8 +128,8 @@ slv2_list_get_length(const SLV2List list); * \return NULL if plugin with \a url not found in \a list. */ const SLV2Plugin* -slv2_list_get_plugin_by_uri(const SLV2List list, - const unsigned char* uri); +slv2_list_get_plugin_by_uri(const SLV2List list, + const char* uri); /** Get a plugin from the list by index. diff --git a/slv2/port.h b/slv2/port.h index 601aa49..ee51507 100644 --- a/slv2/port.h +++ b/slv2/port.h @@ -31,27 +31,14 @@ extern "C" { */ -/** A port on a plugin. - * - * The information necessary to use the port is stored here, any extra - * information can be queried with slv2port_get_property. - */ -/*struct LV2Port { - unsigned long index; ///< Index in ports array - char* short_name; ///< Guaranteed unique identifier - char* type; ///< eg. lv2:InputControlPort - char* data_type; ///< eg. lv2:float -};*/ - - /** Get a property of a port, by port index. * * Return value must be freed by caller with slv2_property_free. */ SLV2Property slv2_port_get_property(SLV2Plugin* plugin, - unsigned long index, - const uchar* property); + uint32_t index, + const char* property); /** Get the symbol of a port given the index. @@ -61,16 +48,16 @@ slv2_port_get_property(SLV2Plugin* plugin, * * \return NULL when index is out of range */ -uchar* +char* slv2_port_get_symbol(SLV2Plugin* plugin, - unsigned long index); + uint32_t index); /** Get the class (direction and rate) of a port. */ enum SLV2PortClass slv2_port_get_class(SLV2Plugin* plugin, - unsigned long index); + uint32_t index); /** Get the data type of a port (as a URI). @@ -78,9 +65,9 @@ slv2_port_get_class(SLV2Plugin* plugin, * The only data type included in the core LV2 specification is lv2:float. * Compare this return value with @ref SLV2_DATA_TYPE_FLOAT to check for it. */ -uchar* +char* slv2_port_get_data_type(SLV2Plugin* plugin, - unsigned long index); + uint32_t index); /** Get the default value of a port. @@ -89,7 +76,7 @@ slv2_port_get_data_type(SLV2Plugin* plugin, */ float slv2_port_get_default_value(SLV2Plugin* plugin, - unsigned long index); + uint32_t index); /** Get the minimum value of a port. @@ -98,7 +85,7 @@ slv2_port_get_default_value(SLV2Plugin* plugin, */ float slv2_port_get_minimum_value(SLV2Plugin* plugin, - unsigned long index); + uint32_t index); /** Get the maximum value of a port. @@ -107,7 +94,7 @@ slv2_port_get_minimum_value(SLV2Plugin* plugin, */ float slv2_port_get_maximum_value(SLV2Plugin* plugin, - unsigned long index); + uint32_t index); /** @} */ diff --git a/slv2/private_types.h b/slv2/private_types.h index 849e5a2..a9c60bf 100644 --- a/slv2/private_types.h +++ b/slv2/private_types.h @@ -27,16 +27,23 @@ extern "C" { #include <lv2.h> +/* If you're a user of SLV2, stop reading this file RIGHT NOW. + * Unfortunately it needs to be exposed to allow inlining of some things that + * really need to be inlined, but these are opaque types. Don't even think + * about writing code that depends on any information here.... + */ + + /** Record of an installed/available plugin. * * A simple reference to a plugin somewhere on the system. This just holds * paths of relevant files, the actual data therein isn't loaded into memory. */ struct _Plugin { - unsigned char* plugin_uri; - unsigned char* bundle_url; // Bundle directory plugin was loaded from - unsigned char* data_url; // rdfs::seeAlso - unsigned char* lib_url; // lv2:binary + char* plugin_uri; + char* bundle_url; // Bundle directory plugin was loaded from + char* data_url; // rdfs::seeAlso + char* lib_url; // lv2:binary }; diff --git a/slv2/query.h b/slv2/query.h index 79e7301..57d1b22 100644 --- a/slv2/query.h +++ b/slv2/query.h @@ -56,7 +56,7 @@ extern "C" { * * \return an unsigned (UTF-8) string which must be free()'d. */ -unsigned char* +char* slv2_query_header(const SLV2Plugin* p); @@ -70,8 +70,8 @@ slv2_query_header(const SLV2Plugin* p); * * eg. FILTER( LANG(?value) = "en" || LANG(?value) = "" ) */ -unsigned char* -slv2_query_lang_filter(const uchar* variable); +char* +slv2_query_lang_filter(const char* variable); /** Run a SPARQL query on a plugin's data file. @@ -85,7 +85,7 @@ slv2_query_lang_filter(const uchar* variable); */ rasqal_query_results* slv2_plugin_run_query(const SLV2Plugin* p, - const uchar* query_string, ...); + const char* query_string, ...); SLV2Property slv2_query_get_results(rasqal_query_results* results); diff --git a/slv2/types.h b/slv2/types.h index 79b1e0f..f93eea2 100644 --- a/slv2/types.h +++ b/slv2/types.h @@ -26,16 +26,13 @@ extern "C" { #include <stddef.h> -typedef unsigned char uchar; - - /* A property, resulting from a query. * * Note that properties may have many values. */ struct _Property { - size_t num_values; - unsigned char** values; + size_t num_values; + char** values; }; typedef struct _Property* SLV2Property; diff --git a/src/plugin.c b/src/plugin.c index b44eb56..0ffd760 100644 --- a/src/plugin.c +++ b/src/plugin.c @@ -40,7 +40,7 @@ slv2_plugin_duplicate(const SLV2Plugin* p) } -const unsigned char* +const char* slv2_plugin_get_uri(const SLV2Plugin* p) { assert(p); @@ -48,7 +48,7 @@ slv2_plugin_get_uri(const SLV2Plugin* p) } -const unsigned char* +const char* slv2_plugin_get_data_url(const SLV2Plugin* p) { assert(p); @@ -56,7 +56,7 @@ slv2_plugin_get_data_url(const SLV2Plugin* p) } -const unsigned char* +const char* slv2_plugin_get_data_path(const SLV2Plugin* p) { assert(p); @@ -67,7 +67,7 @@ slv2_plugin_get_data_path(const SLV2Plugin* p) } -const unsigned char* +const char* slv2_plugin_get_library_url(const SLV2Plugin* p) { assert(p); @@ -75,7 +75,7 @@ slv2_plugin_get_library_url(const SLV2Plugin* p) } -const unsigned char* +const char* slv2_plugin_get_library_path(const SLV2Plugin* p) { assert(p); @@ -111,11 +111,11 @@ slv2_plugin_verify(const SLV2Plugin* plugin) } -unsigned char* +char* slv2_plugin_get_name(const SLV2Plugin* plugin) { // FIXME: leak - unsigned char* result = NULL; + char* result = NULL; struct _Property* prop = slv2_plugin_get_property(plugin, "doap:name"); // FIXME: guaranteed to be the untagged one? @@ -134,14 +134,14 @@ slv2_plugin_get_property(const SLV2Plugin* p, assert(property); /* - uchar* header = slv2_query_header(p); - uchar* lang_filter = slv2_query_lang_filter(U("?value")); + char* header = slv2_query_header(p); + char* lang_filter = slv2_query_lang_filter("?value"); - uchar* query_string = ustrjoin( + char* query_string = strjoin( header, - U("SELECT DISTINCT ?value FROM data: WHERE { \n"), - U("plugin: "), property, U(" ?value . \n"), - ((lang_filter != NULL) ? lang_filter : U("")), + "SELECT DISTINCT ?value FROM data: WHERE { \n", + "plugin: ", property, " ?value . \n", + ((lang_filter != NULL) ? lang_filter : ""), "}", 0); free(header); @@ -150,9 +150,9 @@ slv2_plugin_get_property(const SLV2Plugin* p, rasqal_init(); rasqal_query_results* results = slv2_plugin_run_query(p, - U("SELECT DISTINCT ?value FROM data: WHERE { \n" - "plugin: "), property, U(" ?value . \n" - "} \n"), NULL); + "SELECT DISTINCT ?value FROM data: WHERE { \n" + "plugin: ", property, " ?value . \n" + "} \n", NULL); struct _Property* result = slv2_query_get_results(results); @@ -164,17 +164,17 @@ slv2_plugin_get_property(const SLV2Plugin* p, } -unsigned long +uint32_t slv2_plugin_get_num_ports(const SLV2Plugin* p) { - unsigned long result = 0; + uint32_t result = 0; rasqal_init(); rasqal_query_results* results = slv2_plugin_run_query(p, - U("SELECT DISTINCT ?value FROM data: WHERE { \n" - "plugin: lv2:port ?value . \n" - "} \n"), NULL); + "SELECT DISTINCT ?value FROM data: WHERE { \n" + "plugin: lv2:port ?value . \n" + "} \n", NULL); while (!rasqal_query_results_finished(results)) { ++result; diff --git a/src/plugininstance.c b/src/plugininstance.c index 8ff9e54..6665fd7 100644 --- a/src/plugininstance.c +++ b/src/plugininstance.c @@ -30,12 +30,12 @@ SLV2Instance* slv2_plugin_instantiate(const SLV2Plugin* plugin, - unsigned long sample_rate, + uint32_t sample_rate, const LV2_Host_Feature** host_features) { struct _Instance* result = NULL; - const unsigned char* const lib_path = slv2_plugin_get_library_path(plugin); + const char* const lib_path = slv2_plugin_get_library_path(plugin); if (!lib_path) return NULL; @@ -57,7 +57,7 @@ slv2_plugin_instantiate(const SLV2Plugin* plugin, const char* const bundle_path = url2path(plugin->bundle_url); - for (unsigned long i=0; 1; ++i) { + for (uint32_t i=0; 1; ++i) { const LV2_Descriptor* ld = df(i); if (!ld) { @@ -66,7 +66,7 @@ slv2_plugin_instantiate(const SLV2Plugin* plugin, dlclose(lib); break; // return NULL } else if (!strcmp(ld->URI, (char*)plugin->plugin_uri)) { - printf("Found %s at index %ld in:\n\t%s\n\n", plugin->plugin_uri, i, lib_path); + printf("Found %s at index %u in:\n\t%s\n\n", plugin->plugin_uri, i, lib_path); assert(ld->instantiate); @@ -86,7 +86,7 @@ slv2_plugin_instantiate(const SLV2Plugin* plugin, assert(slv2_plugin_get_num_ports(plugin) > 0); // Connect all ports to NULL (catches bugs) - for (unsigned long i=0; i < slv2_plugin_get_num_ports(plugin); ++i) + for (uint32_t i=0; i < slv2_plugin_get_num_ports(plugin); ++i) result->descriptor->connect_port(result->lv2_handle, i, NULL); return result; diff --git a/src/pluginlist.c b/src/pluginlist.c index 6a1a8c1..cd83629 100644 --- a/src/pluginlist.c +++ b/src/pluginlist.c @@ -70,8 +70,8 @@ slv2_list_load_all(SLV2List list) /* This is the parser for manifest.ttl */ void -slv2_list_load_bundle(SLV2List list, - const unsigned char* bundle_base_uri) +slv2_list_load_bundle(SLV2List list, + const char* bundle_base_uri) { // FIXME: ew unsigned char* manifest_uri = malloc( @@ -85,44 +85,41 @@ slv2_list_load_bundle(SLV2List list, rasqal_init(); rasqal_query_results *results; raptor_uri *base_uri = raptor_new_uri(manifest_uri); - rasqal_query *rq = rasqal_new_query((const char*)"sparql", (const uchar*)base_uri); + rasqal_query *rq = rasqal_new_query("sparql", (unsigned char*)base_uri); - unsigned char* query_string = - U("PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> \n" - "PREFIX : <http://lv2plug.in/ontology#> \n\n" - - "SELECT DISTINCT $plugin_uri $data_url $lib_url FROM <> WHERE { \n" - "$plugin_uri :binary $lib_url ; \n" - " rdfs:seeAlso $data_url . \n" - "} \n"); + char* query_string = + "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> \n" + "PREFIX : <http://lv2plug.in/ontology#> \n\n" + + "SELECT DISTINCT $plugin_uri $data_url $lib_url FROM <> WHERE { \n" + "$plugin_uri :binary $lib_url ; \n" + " rdfs:seeAlso $data_url . \n" + "} \n"; //printf("%s\n\n", query_string); - rasqal_query_prepare(rq, (const uchar*)query_string, base_uri); + rasqal_query_prepare(rq, (unsigned char*)query_string, base_uri); results = rasqal_query_execute(rq); while (!rasqal_query_results_finished(results)) { // Create a new plugin struct _Plugin* new_plugin = malloc(sizeof(struct _Plugin)); - new_plugin->bundle_url = ustrdup(bundle_base_uri); + new_plugin->bundle_url = strdup(bundle_base_uri); rasqal_literal* literal = NULL; - literal = rasqal_query_results_get_binding_value_by_name(results, - U("plugin_uri")); + literal = rasqal_query_results_get_binding_value_by_name(results, "plugin_uri"); if (literal) - new_plugin->plugin_uri = ustrdup(rasqal_literal_as_string(literal)); + new_plugin->plugin_uri = strdup(rasqal_literal_as_string(literal)); - literal = rasqal_query_results_get_binding_value_by_name(results, - U("data_url")); + literal = rasqal_query_results_get_binding_value_by_name(results, "data_url"); if (literal) - new_plugin->data_url = ustrdup(rasqal_literal_as_string(literal)); + new_plugin->data_url = strdup(rasqal_literal_as_string(literal)); - literal = rasqal_query_results_get_binding_value_by_name(results, - U("lib_url")); + literal = rasqal_query_results_get_binding_value_by_name(results, "lib_url"); if (literal) - new_plugin->lib_url = ustrdup(rasqal_literal_as_string(literal)); + new_plugin->lib_url = strdup(rasqal_literal_as_string(literal)); /* Add the plugin if it's valid */ if (new_plugin->lib_url && new_plugin->data_url && new_plugin->plugin_uri @@ -165,14 +162,14 @@ add_plugins_from_dir(SLV2List list, const char* dir) if (!strcmp(pfile->d_name, ".") || !strcmp(pfile->d_name, "..")) continue; - char* bundle_path = (char*)ustrjoin(U(dir), U("/"), U(pfile->d_name), NULL); - char* bundle_url = (char*)ustrjoin(U("file://"), U(dir), U("/"), U(pfile->d_name), NULL); + char* bundle_path = (char*)strjoin(dir, "/", pfile->d_name, NULL); + char* bundle_url = (char*)strjoin("file://", dir, "/", pfile->d_name, NULL); DIR* bundle_dir = opendir(bundle_path); if (bundle_dir != NULL) { closedir(bundle_dir); - slv2_list_load_bundle(list, U(bundle_url)); + slv2_list_load_bundle(list, bundle_url); //printf("Loaded bundle %s\n", bundle_url); } @@ -188,7 +185,7 @@ slv2_list_load_path(SLV2List list, const char* slv2_path) { - char* path = (char*)ustrjoin(U(slv2_path), U(":"), NULL); + char* path = (char*)strjoin(slv2_path, ":", NULL); char* dir = path; // Pointer into path @@ -210,7 +207,7 @@ slv2_list_load_path(SLV2List list, } -unsigned long +size_t slv2_list_get_length(const SLV2List list) { assert(list != NULL); @@ -219,12 +216,12 @@ slv2_list_get_length(const SLV2List list) SLV2Plugin* -slv2_list_get_plugin_by_uri(const SLV2List list, const unsigned char* uri) +slv2_list_get_plugin_by_uri(const SLV2List list, const char* uri) { if (list->num_plugins > 0) { assert(list->plugins != NULL); - for (unsigned long i=0; i < list->num_plugins; ++i) + for (size_t i=0; i < list->num_plugins; ++i) if (!strcmp((char*)list->plugins[i]->plugin_uri, (char*)uri)) return list->plugins[i]; } @@ -234,7 +231,7 @@ slv2_list_get_plugin_by_uri(const SLV2List list, const unsigned char* uri) SLV2Plugin* -slv2_list_get_plugin_by_index(const SLV2List list, unsigned long index) +slv2_list_get_plugin_by_index(const SLV2List list, size_t index) { if (list->num_plugins == 0) return NULL; @@ -26,10 +26,10 @@ #include "util.h" enum SLV2PortClass -slv2_port_get_class(SLV2Plugin* p, - unsigned long index) +slv2_port_get_class(SLV2Plugin* p, + uint32_t index) { - struct _Property* class = slv2_port_get_property(p, index, U("rdf:type")); + struct _Property* class = slv2_port_get_property(p, index, "rdf:type"); assert(class); assert(class->num_values == 1); assert(class->values); @@ -51,39 +51,39 @@ slv2_port_get_class(SLV2Plugin* p, } -uchar* -slv2_port_get_data_type(SLV2Plugin* p, - unsigned long index) +char* +slv2_port_get_data_type(SLV2Plugin* p, + uint32_t index) { - SLV2Property type = slv2_port_get_property(p, index, U("lv2:datatype")); + SLV2Property type = slv2_port_get_property(p, index, "lv2:datatype"); assert(type); assert(type->num_values == 1); assert(type->values); - uchar* ret = type->values[0]; + char* ret = type->values[0]; slv2_property_free(type); return ret; } SLV2Property -slv2_port_get_property(SLV2Plugin* p, - unsigned long index, - const uchar* property) +slv2_port_get_property(SLV2Plugin* p, + uint32_t index, + const char* property) { assert(p); assert(property); char index_str[4]; - snprintf(index_str, (size_t)4, "%lu", index); + snprintf(index_str, (size_t)4, "%u", index); rasqal_init(); rasqal_query_results* results = slv2_plugin_run_query(p, - U("SELECT DISTINCT ?value FROM data: WHERE { \n" + "SELECT DISTINCT ?value FROM data: WHERE { \n" "plugin: lv2:port ?port \n" - "?port lv2:index "), index_str, U(" \n" - "?port "), property, U(" ?value . \n}\n"), NULL); + "?port lv2:index ", index_str, " \n" + "?port ", property, " ?value . \n}\n", NULL); SLV2Property result = slv2_query_get_results(results); @@ -94,18 +94,18 @@ slv2_port_get_property(SLV2Plugin* p, } -uchar* -slv2_port_get_symbol(SLV2Plugin* p, - unsigned long index) +char* +slv2_port_get_symbol(SLV2Plugin* p, + uint32_t index) { // FIXME: leaks - uchar* result = NULL; + char* result = NULL; SLV2Property prop - = slv2_port_get_property(p, index, U("lv2:symbol")); + = slv2_port_get_property(p, index, "lv2:symbol"); if (prop && prop->num_values == 1) - result = (uchar*)strdup((char*)prop->values[0]); + result = strdup(prop->values[0]); slv2_property_free(prop); return result; @@ -114,14 +114,14 @@ slv2_port_get_symbol(SLV2Plugin* p, float slv2_port_get_default_value(SLV2Plugin* p, - unsigned long index) + uint32_t index) { // FIXME: do casting properly in the SPARQL query float result = 0.0f; SLV2Property prop - = slv2_port_get_property(p, index, U("lv2:default")); + = slv2_port_get_property(p, index, "lv2:default"); if (prop && prop->num_values == 1) result = atof((char*)prop->values[0]); @@ -133,15 +133,15 @@ slv2_port_get_default_value(SLV2Plugin* p, float -slv2_port_get_minimum_value(SLV2Plugin* p, - unsigned long index) +slv2_port_get_minimum_value(SLV2Plugin* p, + uint32_t index) { // FIXME: do casting properly in the SPARQL query float result = 0.0f; SLV2Property prop - = slv2_port_get_property(p, index, U("lv2:minimum")); + = slv2_port_get_property(p, index, "lv2:minimum"); if (prop && prop->num_values == 1) result = atof((char*)prop->values[0]); @@ -153,15 +153,15 @@ slv2_port_get_minimum_value(SLV2Plugin* p, float -slv2_port_get_maximum_value(SLV2Plugin* p, - unsigned long index) +slv2_port_get_maximum_value(SLV2Plugin* p, + uint32_t index) { // FIXME: do casting properly in the SPARQL query float result = 0.0f; SLV2Property prop - = slv2_port_get_property(p, index, U("lv2:maximum")); + = slv2_port_get_property(p, index, "lv2:maximum"); if (prop && prop->num_values == 1) result = atof((char*)prop->values[0]); diff --git a/src/query.c b/src/query.c index da9239d..b8d279f 100644 --- a/src/query.c +++ b/src/query.c @@ -23,35 +23,35 @@ #include <slv2/query.h> -unsigned char* +char* slv2_query_header(const SLV2Plugin* p) { - const unsigned char* plugin_uri = slv2_plugin_get_uri(p); - const unsigned char* data_file_url = slv2_plugin_get_data_url(p); + const char* const plugin_uri = slv2_plugin_get_uri(p); + const char* const data_file_url = slv2_plugin_get_data_url(p); - unsigned char* query_string = ustrjoin(U( - "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> \n" - "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> \n" - "PREFIX doap: <http://usefulinc.com/ns/doap#> \n" - "PREFIX lv2: <http://lv2plug.in/ontology#> \n" - "PREFIX plugin: <"), plugin_uri, U("> \n"), - U("PREFIX data: <"), data_file_url, U("> \n\n"), NULL); + char* query_string = strjoin( + "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> \n" + "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> \n" + "PREFIX doap: <http://usefulinc.com/ns/doap#> \n" + "PREFIX lv2: <http://lv2plug.in/ontology#> \n" + "PREFIX plugin: <", plugin_uri, "> \n", + "PREFIX data: <", data_file_url, "> \n\n", NULL); return query_string; } -unsigned char* -slv2_query_lang_filter(const uchar* variable) +char* +slv2_query_lang_filter(const char* variable) { - uchar* result = NULL; - uchar* const lang = (uchar*)getenv("LANG"); + char* result = NULL; + char* const lang = (char*)getenv("LANG"); if (lang) { // FILTER( LANG(?value) = "en" || LANG(?value) = "" ) - result = ustrjoin( - //U("FILTER (lang(?value) = \""), lang, U("\")\n"), 0); - U("FILTER( lang(?"), variable, U(") = \""), lang, - U("\" || lang(?"), variable, U(") = \"\" )\n"), NULL); + result = strjoin( + //"FILTER (lang(?value) = \"", lang, "\"\n"), 0); + "FILTER( lang(?", variable, ") = \"", lang, + "\" || lang(?", variable, ") = \"\" )\n", NULL); } return result; @@ -60,17 +60,17 @@ slv2_query_lang_filter(const uchar* variable) rasqal_query_results* slv2_plugin_run_query(const SLV2Plugin* p, - const uchar* first, ...) + const char* first, ...) { /* FIXME: Too much unecessary allocation */ - uchar* header = slv2_query_header(p); + char* header = slv2_query_header(p); va_list args_list; va_start(args_list, first); - uchar* args_str = vstrjoin(first, args_list); - uchar* query_str = ustrjoin(header, args_str, NULL); + char* args_str = vstrjoin(first, args_list); + char* query_str = strjoin(header, args_str, NULL); va_end(args_list); assert(p); @@ -80,7 +80,7 @@ slv2_plugin_run_query(const SLV2Plugin* p, //printf("Query: \n%s\n\n", query_str); - rasqal_query_prepare(rq, query_str, NULL); + rasqal_query_prepare(rq, (unsigned char*)query_str, NULL); rasqal_query_results* results = rasqal_query_execute(rq); rasqal_free_query(rq); @@ -107,14 +107,14 @@ slv2_query_get_results(rasqal_query_results* results) while (!rasqal_query_results_finished(results)) { rasqal_literal* literal = - rasqal_query_results_get_binding_value_by_name(results, U("value")); + rasqal_query_results_get_binding_value_by_name(results, "value"); assert(literal != NULL); // Add value on to the array. Yes, this is disgusting. result->num_values++; // FIXME LEAK: result->values = realloc(result->values, result->num_values * sizeof(char*)); - result->values[result->num_values-1] = ustrdup(rasqal_literal_as_string(literal)); + result->values[result->num_values-1] = strdup(rasqal_literal_as_string(literal)); rasqal_query_results_next(results); } @@ -26,7 +26,7 @@ void -ustrappend(uchar** dst, const uchar* suffix) +strappend(char** dst, const char* suffix) { assert(dst); assert(*dst); @@ -39,21 +39,13 @@ ustrappend(uchar** dst, const uchar* suffix) } -uchar* -ustrdup(const uchar* src) -{ - assert(src); - return (uchar*)strdup((char*)src); -} - - -uchar* -ustrjoin(const uchar* first, ...) +char* +strjoin(const char* first, ...) { va_list args_list; va_start(args_list, first); - uchar* result = vstrjoin(first, args_list); + char* result = vstrjoin(first, args_list); va_end(args_list); @@ -61,17 +53,17 @@ ustrjoin(const uchar* first, ...) } -uchar* -vstrjoin(const uchar* first, va_list args_list) +char* +vstrjoin(const char* first, va_list args_list) { // FIXME: this is horribly, awfully, disgracefully slow. // so I'm lazy. - const uchar* arg = NULL; - uchar* result = ustrdup(first); + const char* arg = NULL; + char* result = strdup(first); - while ((arg = va_arg(args_list, const uchar*)) != NULL) - ustrappend(&result, arg); + while ((arg = va_arg(args_list, const char*)) != NULL) + strappend(&result, arg); //va_end(args_list); @@ -87,7 +79,7 @@ vstrjoin(const uchar* first, va_list args_list) * Result is simply a pointer in to \a url and must not be free()'d. */ const char* -url2path(const uchar* const url) +url2path(const char* const url) { /*assert(strlen((char*)url) > 8); char* result = calloc(strlen((char*)url)-7+1, sizeof(char)); @@ -19,11 +19,12 @@ #ifndef __UTIL_H #define __UTIL_H +#define _XOPEN_SOURCE 500 +#include <string.h> + #include <stdarg.h> #include <slv2/types.h> -/* Cast a char* to an unsigned char* (Used for string literals) */ -#define U(x) (unsigned char*)(x) /** Append \a suffix to \a *dst, reallocating \a dst as necessary. * @@ -31,23 +32,21 @@ * or NULL. */ void -ustrappend(uchar** dst, const uchar* suffix); +strappend(char** dst, const char* suffix); -uchar* -ustrdup(const uchar* src); /** Join all arguments into one string. * * Arguments are not modified, return value must be free()'d. */ -uchar* -ustrjoin(const uchar* first, ...); +char* +strjoin(const char* first, ...); -uchar* -vstrjoin(const uchar* first, va_list args_list); +char* +vstrjoin(const char* first, va_list args_list); const char* -url2path(const uchar* const url); +url2path(const char* const url); #endif |