From 4a49e65f82b8206c1a5f71484e66a191a62c63ad Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sat, 30 Mar 2019 22:52:14 +0100 Subject: EXPERIMENT: Add unified static ID header --- lv2/urid/check-static-ids.c | 135 +++++++ lv2/urid/sid.h | 927 +++++++++++++++++++++++++++++++++++++++++++ lv2/urid/urid.h | 17 + plugins/eg-metro.lv2/metro.c | 52 +-- wscript | 38 +- 5 files changed, 1121 insertions(+), 48 deletions(-) create mode 100644 lv2/urid/check-static-ids.c create mode 100644 lv2/urid/sid.h diff --git a/lv2/urid/check-static-ids.c b/lv2/urid/check-static-ids.c new file mode 100644 index 0000000..d87e12a --- /dev/null +++ b/lv2/urid/check-static-ids.c @@ -0,0 +1,135 @@ +/* + Copyright 2012-2015 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include "lv2/core/lv2.h" +#include "lv2/urid/sid.h" + +#include + +#include + +int n_errors = 0; + +static int +on_node(const SerdEnv* env, const SerdNode* node) +{ + const SerdNode* base_uri = serd_env_get_base_uri(env); + const char* base_uri_str = serd_node_get_string(base_uri); + const size_t base_uri_len = serd_node_get_length(base_uri); + + if (serd_node_get_type(node) == SERD_URI || + serd_node_get_type(node) == SERD_CURIE) { + + SerdNode* expanded = serd_env_expand(env, node); + if (!expanded) { + fprintf(stderr, + "error: Failed to expand <%s>\n", + serd_node_get_string(node)); + return 1; + } + + assert(serd_node_get_type(expanded) == SERD_URI); + + const char* uri = serd_node_get_string(expanded); + if (!strcmp(uri, base_uri_str)) { + return 0; // Ignore ontology itself + } else if (strncmp(uri, base_uri_str, base_uri_len)) { + fprintf(stderr, + "warning: Subject <%s> not within prefix <%s>\n", + uri, + serd_node_get_string(base_uri)); + return 0; + } + + const LV2_URID id = lv2_urid_static_map(uri); + const char* out = lv2_urid_static_unmap(id); + + if (!id) { + fprintf(stderr, "error: Failed to map <%s>\n", uri); + return 1; // SERD_ERR_INTERNAL; + } + + assert(out); + if (strcmp(uri, out)) { + fprintf(stderr, + "error: <%s> (%d) unmapped to <%s>\n", + uri, + id, + out); + return 1; // SERD_ERR_INTERNAL; + } + + printf("OK %s %s\n", uri, out); + serd_node_free(expanded); + } + + return 0; +} + +static SerdStatus +on_statement(void* handle, + SerdStatementFlags flags, + const SerdStatement* statement) +{ + (void)flags; + + const SerdEnv* env = (const SerdEnv*)handle; + + n_errors += on_node(env, serd_statement_get_subject(statement)); + /* on_node(env, serd_statement_get_predicate(statement)); */ + /* on_node(env, serd_statement_get_object(statement)); */ + + return SERD_SUCCESS; +} + +int +main(int argc, char** argv) +{ + if (argc != 3) { + fprintf(stderr, "Usage: %s SCHEMA SCHEMA_URI\n", argv[0]); + return 1; + } + + const char* const filename = argv[1]; + const char* const schema_uri = argv[2]; + + SerdWorld* world = serd_world_new(); + SerdNode* base_uri = serd_new_uri(schema_uri); + SerdEnv* env = serd_env_new(base_uri); + SerdSink* sink = serd_sink_new(env, env); + SerdReader* reader = serd_reader_new(world, SERD_TURTLE, sink, 1 << 20); + + serd_env_set_base_uri(env, base_uri); + serd_sink_set_statement_func(sink, on_statement); + + SerdStatus st = SERD_SUCCESS; + if ((st = serd_reader_start_file(reader, filename, true))) { + fprintf(stderr, "error: %s\n", serd_strerror(st)); + return st; + } else if ((st = serd_reader_read_document(reader))) { + fprintf(stderr, "error: %s\n", serd_strerror(st)); + return st; + } + + serd_node_free(base_uri); + serd_reader_free(reader); + serd_sink_free(sink); + serd_env_free(env); + serd_node_free(base_uri); + serd_world_free(world); + + return n_errors; +} diff --git a/lv2/urid/sid.h b/lv2/urid/sid.h new file mode 100644 index 0000000..536b965 --- /dev/null +++ b/lv2/urid/sid.h @@ -0,0 +1,927 @@ +/* + Copyright 2019 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/** + @defgroup sid Static URIDs + @ingroup URID + @{ +*/ + +#ifndef LV2_URID_SID_H +#define LV2_URID_SID_H + +#include "lv2/urid/urid.h" + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +static const char* const lv2_urid_static_uris[] = { + NULL, + "http://lv2plug.in/ns/ext/atom#Atom", + "http://lv2plug.in/ns/ext/atom#AtomPort", + "http://lv2plug.in/ns/ext/atom#Blank", + "http://lv2plug.in/ns/ext/atom#Bool", + "http://lv2plug.in/ns/ext/atom#Chunk", + "http://lv2plug.in/ns/ext/atom#Double", + "http://lv2plug.in/ns/ext/atom#Event", + "http://lv2plug.in/ns/ext/atom#Float", + "http://lv2plug.in/ns/ext/atom#Int", + "http://lv2plug.in/ns/ext/atom#Literal", + "http://lv2plug.in/ns/ext/atom#Long", + "http://lv2plug.in/ns/ext/atom#Number", + "http://lv2plug.in/ns/ext/atom#Object", + "http://lv2plug.in/ns/ext/atom#Path", + "http://lv2plug.in/ns/ext/atom#Property", + "http://lv2plug.in/ns/ext/atom#Resource", + "http://lv2plug.in/ns/ext/atom#Sequence", + "http://lv2plug.in/ns/ext/atom#Sound", + "http://lv2plug.in/ns/ext/atom#String", + "http://lv2plug.in/ns/ext/atom#Tuple", + "http://lv2plug.in/ns/ext/atom#URI", + "http://lv2plug.in/ns/ext/atom#URID", + "http://lv2plug.in/ns/ext/atom#Vector", + "http://lv2plug.in/ns/ext/atom#atomTransfer", + "http://lv2plug.in/ns/ext/atom#beatTime", + "http://lv2plug.in/ns/ext/atom#bufferType", + "http://lv2plug.in/ns/ext/atom#cType", + "http://lv2plug.in/ns/ext/atom#childType", + "http://lv2plug.in/ns/ext/atom#eventTransfer", + "http://lv2plug.in/ns/ext/atom#frameTime", + "http://lv2plug.in/ns/ext/atom#supports", + "http://lv2plug.in/ns/ext/atom#timeUnit", + "http://lv2plug.in/ns/ext/buf-size#boundedBlockLength", + "http://lv2plug.in/ns/ext/buf-size#coarseBlockLength", + "http://lv2plug.in/ns/ext/buf-size#fixedBlockLength", + "http://lv2plug.in/ns/ext/buf-size#maxBlockLength", + "http://lv2plug.in/ns/ext/buf-size#minBlockLength", + "http://lv2plug.in/ns/ext/buf-size#nominalBlockLength", + "http://lv2plug.in/ns/ext/buf-size#powerOf2BlockLength", + "http://lv2plug.in/ns/ext/buf-size#sequenceSize", + "http://lv2plug.in/ns/ext/dynmanifest#DynManifest", + "http://lv2plug.in/ns/ext/event#Event", + "http://lv2plug.in/ns/ext/event#EventPort", + "http://lv2plug.in/ns/ext/event#FrameStamp", + "http://lv2plug.in/ns/ext/event#TimeStamp", + "http://lv2plug.in/ns/ext/event#generatesTimeStamp", + "http://lv2plug.in/ns/ext/event#generic", + "http://lv2plug.in/ns/ext/event#inheritsEvent", + "http://lv2plug.in/ns/ext/event#inheritsTimeStamp", + "http://lv2plug.in/ns/ext/event#supportsEvent", + "http://lv2plug.in/ns/ext/event#supportsTimeStamp", + "http://lv2plug.in/ns/ext/log#Entry", + "http://lv2plug.in/ns/ext/log#Error", + "http://lv2plug.in/ns/ext/log#Note", + "http://lv2plug.in/ns/ext/log#Trace", + "http://lv2plug.in/ns/ext/log#Warning", + "http://lv2plug.in/ns/ext/log#log", + "http://lv2plug.in/ns/ext/midi#ActiveSense", + "http://lv2plug.in/ns/ext/midi#Aftertouch", + "http://lv2plug.in/ns/ext/midi#Bender", + "http://lv2plug.in/ns/ext/midi#ChannelPressure", + "http://lv2plug.in/ns/ext/midi#Chunk", + "http://lv2plug.in/ns/ext/midi#Clock", + "http://lv2plug.in/ns/ext/midi#Continue", + "http://lv2plug.in/ns/ext/midi#Controller", + "http://lv2plug.in/ns/ext/midi#HexByte", + "http://lv2plug.in/ns/ext/midi#MidiEvent", + "http://lv2plug.in/ns/ext/midi#NoteOff", + "http://lv2plug.in/ns/ext/midi#NoteOn", + "http://lv2plug.in/ns/ext/midi#ProgramChange", + "http://lv2plug.in/ns/ext/midi#QuarterFrame", + "http://lv2plug.in/ns/ext/midi#Reset", + "http://lv2plug.in/ns/ext/midi#SongPosition", + "http://lv2plug.in/ns/ext/midi#SongSelect", + "http://lv2plug.in/ns/ext/midi#Start", + "http://lv2plug.in/ns/ext/midi#Stop", + "http://lv2plug.in/ns/ext/midi#SystemCommon", + "http://lv2plug.in/ns/ext/midi#SystemExclusive", + "http://lv2plug.in/ns/ext/midi#SystemMessage", + "http://lv2plug.in/ns/ext/midi#SystemRealtime", + "http://lv2plug.in/ns/ext/midi#Tick", + "http://lv2plug.in/ns/ext/midi#TuneRequest", + "http://lv2plug.in/ns/ext/midi#VoiceMessage", + "http://lv2plug.in/ns/ext/midi#benderValue", + "http://lv2plug.in/ns/ext/midi#binding", + "http://lv2plug.in/ns/ext/midi#byteNumber", + "http://lv2plug.in/ns/ext/midi#channel", + "http://lv2plug.in/ns/ext/midi#chunk", + "http://lv2plug.in/ns/ext/midi#controllerNumber", + "http://lv2plug.in/ns/ext/midi#controllerValue", + "http://lv2plug.in/ns/ext/midi#noteNumber", + "http://lv2plug.in/ns/ext/midi#pressure", + "http://lv2plug.in/ns/ext/midi#programNumber", + "http://lv2plug.in/ns/ext/midi#property", + "http://lv2plug.in/ns/ext/midi#songNumber", + "http://lv2plug.in/ns/ext/midi#songPosition", + "http://lv2plug.in/ns/ext/midi#status", + "http://lv2plug.in/ns/ext/midi#statusMask", + "http://lv2plug.in/ns/ext/midi#velocity", + "http://lv2plug.in/ns/ext/morph#AutoMorphPort", + "http://lv2plug.in/ns/ext/morph#MorphPort", + "http://lv2plug.in/ns/ext/morph#currentType", + "http://lv2plug.in/ns/ext/morph#interface", + "http://lv2plug.in/ns/ext/morph#supportsType", + "http://lv2plug.in/ns/ext/options#Option", + "http://lv2plug.in/ns/ext/options#interface", + "http://lv2plug.in/ns/ext/options#options", + "http://lv2plug.in/ns/ext/options#requiredOption", + "http://lv2plug.in/ns/ext/options#supportedOption", + "http://lv2plug.in/ns/ext/parameters#CompressorControls", + "http://lv2plug.in/ns/ext/parameters#ControlGroup", + "http://lv2plug.in/ns/ext/parameters#EnvelopeControls", + "http://lv2plug.in/ns/ext/parameters#FilterControls", + "http://lv2plug.in/ns/ext/parameters#OscillatorControls", + "http://lv2plug.in/ns/ext/parameters#amplitude", + "http://lv2plug.in/ns/ext/parameters#attack", + "http://lv2plug.in/ns/ext/parameters#bypass", + "http://lv2plug.in/ns/ext/parameters#cutoffFrequency", + "http://lv2plug.in/ns/ext/parameters#decay", + "http://lv2plug.in/ns/ext/parameters#delay", + "http://lv2plug.in/ns/ext/parameters#dryLevel", + "http://lv2plug.in/ns/ext/parameters#frequency", + "http://lv2plug.in/ns/ext/parameters#gain", + "http://lv2plug.in/ns/ext/parameters#hold", + "http://lv2plug.in/ns/ext/parameters#pulseWidth", + "http://lv2plug.in/ns/ext/parameters#ratio", + "http://lv2plug.in/ns/ext/parameters#release", + "http://lv2plug.in/ns/ext/parameters#resonance", + "http://lv2plug.in/ns/ext/parameters#sampleRate", + "http://lv2plug.in/ns/ext/parameters#sustain", + "http://lv2plug.in/ns/ext/parameters#threshold", + "http://lv2plug.in/ns/ext/parameters#waveform", + "http://lv2plug.in/ns/ext/parameters#wetDryRatio", + "http://lv2plug.in/ns/ext/parameters#wetLevel", + "http://lv2plug.in/ns/ext/patch#Ack", + "http://lv2plug.in/ns/ext/patch#Copy", + "http://lv2plug.in/ns/ext/patch#Delete", + "http://lv2plug.in/ns/ext/patch#Error", + "http://lv2plug.in/ns/ext/patch#Get", + "http://lv2plug.in/ns/ext/patch#Insert", + "http://lv2plug.in/ns/ext/patch#Message", + "http://lv2plug.in/ns/ext/patch#Move", + "http://lv2plug.in/ns/ext/patch#Patch", + "http://lv2plug.in/ns/ext/patch#Post", + "http://lv2plug.in/ns/ext/patch#Put", + "http://lv2plug.in/ns/ext/patch#Request", + "http://lv2plug.in/ns/ext/patch#Response", + "http://lv2plug.in/ns/ext/patch#Set", + "http://lv2plug.in/ns/ext/patch#accept", + "http://lv2plug.in/ns/ext/patch#add", + "http://lv2plug.in/ns/ext/patch#body", + "http://lv2plug.in/ns/ext/patch#context", + "http://lv2plug.in/ns/ext/patch#destination", + "http://lv2plug.in/ns/ext/patch#property", + "http://lv2plug.in/ns/ext/patch#readable", + "http://lv2plug.in/ns/ext/patch#remove", + "http://lv2plug.in/ns/ext/patch#request", + "http://lv2plug.in/ns/ext/patch#sequenceNumber", + "http://lv2plug.in/ns/ext/patch#subject", + "http://lv2plug.in/ns/ext/patch#value", + "http://lv2plug.in/ns/ext/patch#wildcard", + "http://lv2plug.in/ns/ext/patch#writable", + "http://lv2plug.in/ns/ext/port-groups#AmbisonicBH1P0Group", + "http://lv2plug.in/ns/ext/port-groups#AmbisonicBH1P1Group", + "http://lv2plug.in/ns/ext/port-groups#AmbisonicBH2P0Group", + "http://lv2plug.in/ns/ext/port-groups#AmbisonicBH2P1Group", + "http://lv2plug.in/ns/ext/port-groups#AmbisonicBH2P2Group", + "http://lv2plug.in/ns/ext/port-groups#AmbisonicBH3P0Group", + "http://lv2plug.in/ns/ext/port-groups#AmbisonicBH3P1Group", + "http://lv2plug.in/ns/ext/port-groups#AmbisonicBH3P2Group", + "http://lv2plug.in/ns/ext/port-groups#AmbisonicBH3P3Group", + "http://lv2plug.in/ns/ext/port-groups#AmbisonicGroup", + "http://lv2plug.in/ns/ext/port-groups#DiscreteGroup", + "http://lv2plug.in/ns/ext/port-groups#Element", + "http://lv2plug.in/ns/ext/port-groups#FivePointOneGroup", + "http://lv2plug.in/ns/ext/port-groups#FivePointZeroGroup", + "http://lv2plug.in/ns/ext/port-groups#FourPointZeroGroup", + "http://lv2plug.in/ns/ext/port-groups#Group", + "http://lv2plug.in/ns/ext/port-groups#InputGroup", + "http://lv2plug.in/ns/ext/port-groups#MidSideGroup", + "http://lv2plug.in/ns/ext/port-groups#MonoGroup", + "http://lv2plug.in/ns/ext/port-groups#OutputGroup", + "http://lv2plug.in/ns/ext/port-groups#SevenPointOneGroup", + "http://lv2plug.in/ns/ext/port-groups#SevenPointOneWideGroup", + "http://lv2plug.in/ns/ext/port-groups#SixPointOneGroup", + "http://lv2plug.in/ns/ext/port-groups#StereoGroup", + "http://lv2plug.in/ns/ext/port-groups#ThreePointZeroGroup", + "http://lv2plug.in/ns/ext/port-groups#center", + "http://lv2plug.in/ns/ext/port-groups#centerLeft", + "http://lv2plug.in/ns/ext/port-groups#centerRight", + "http://lv2plug.in/ns/ext/port-groups#element", + "http://lv2plug.in/ns/ext/port-groups#group", + "http://lv2plug.in/ns/ext/port-groups#left", + "http://lv2plug.in/ns/ext/port-groups#lowFrequencyEffects", + "http://lv2plug.in/ns/ext/port-groups#mainInput", + "http://lv2plug.in/ns/ext/port-groups#mainOutput", + "http://lv2plug.in/ns/ext/port-groups#rearCenter", + "http://lv2plug.in/ns/ext/port-groups#rearLeft", + "http://lv2plug.in/ns/ext/port-groups#rearRight", + "http://lv2plug.in/ns/ext/port-groups#right", + "http://lv2plug.in/ns/ext/port-groups#side", + "http://lv2plug.in/ns/ext/port-groups#sideChainOf", + "http://lv2plug.in/ns/ext/port-groups#sideLeft", + "http://lv2plug.in/ns/ext/port-groups#sideRight", + "http://lv2plug.in/ns/ext/port-groups#source", + "http://lv2plug.in/ns/ext/port-groups#subGroupOf", + "http://lv2plug.in/ns/ext/port-props#causesArtifacts", + "http://lv2plug.in/ns/ext/port-props#continuousCV", + "http://lv2plug.in/ns/ext/port-props#discreteCV", + "http://lv2plug.in/ns/ext/port-props#displayPriority", + "http://lv2plug.in/ns/ext/port-props#expensive", + "http://lv2plug.in/ns/ext/port-props#hasStrictBounds", + "http://lv2plug.in/ns/ext/port-props#logarithmic", + "http://lv2plug.in/ns/ext/port-props#notAutomatic", + "http://lv2plug.in/ns/ext/port-props#notOnGUI", + "http://lv2plug.in/ns/ext/port-props#rangeSteps", + "http://lv2plug.in/ns/ext/port-props#supportsStrictBounds", + "http://lv2plug.in/ns/ext/port-props#trigger", + "http://lv2plug.in/ns/ext/presets#Bank", + "http://lv2plug.in/ns/ext/presets#Preset", + "http://lv2plug.in/ns/ext/presets#bank", + "http://lv2plug.in/ns/ext/presets#preset", + "http://lv2plug.in/ns/ext/presets#value", + "http://lv2plug.in/ns/ext/resize-port#asLargeAs", + "http://lv2plug.in/ns/ext/resize-port#minimumSize", + "http://lv2plug.in/ns/ext/resize-port#resize", + "http://lv2plug.in/ns/ext/state#Changed", + "http://lv2plug.in/ns/ext/state#State", + "http://lv2plug.in/ns/ext/state#interface", + "http://lv2plug.in/ns/ext/state#loadDefaultState", + "http://lv2plug.in/ns/ext/state#makePath", + "http://lv2plug.in/ns/ext/state#mapPath", + "http://lv2plug.in/ns/ext/state#state", + "http://lv2plug.in/ns/ext/state#threadSafeRestore", + "http://lv2plug.in/ns/ext/time#Position", + "http://lv2plug.in/ns/ext/time#Rate", + "http://lv2plug.in/ns/ext/time#Time", + "http://lv2plug.in/ns/ext/time#bar", + "http://lv2plug.in/ns/ext/time#barBeat", + "http://lv2plug.in/ns/ext/time#beat", + "http://lv2plug.in/ns/ext/time#beatUnit", + "http://lv2plug.in/ns/ext/time#beatsPerBar", + "http://lv2plug.in/ns/ext/time#beatsPerMinute", + "http://lv2plug.in/ns/ext/time#frame", + "http://lv2plug.in/ns/ext/time#framesPerSecond", + "http://lv2plug.in/ns/ext/time#position", + "http://lv2plug.in/ns/ext/time#speed", + "http://lv2plug.in/ns/ext/urid#map", + "http://lv2plug.in/ns/ext/urid#unmap", + "http://lv2plug.in/ns/ext/worker#interface", + "http://lv2plug.in/ns/ext/worker#schedule", + "http://lv2plug.in/ns/extensions/ui#CocoaUI", + "http://lv2plug.in/ns/extensions/ui#Gtk3UI", + "http://lv2plug.in/ns/extensions/ui#GtkUI", + "http://lv2plug.in/ns/extensions/ui#PortNotification", + "http://lv2plug.in/ns/extensions/ui#PortProtocol", + "http://lv2plug.in/ns/extensions/ui#Qt4UI", + "http://lv2plug.in/ns/extensions/ui#Qt5UI", + "http://lv2plug.in/ns/extensions/ui#UI", + "http://lv2plug.in/ns/extensions/ui#WindowsUI", + "http://lv2plug.in/ns/extensions/ui#X11UI", + "http://lv2plug.in/ns/extensions/ui#binary", + "http://lv2plug.in/ns/extensions/ui#fixedSize", + "http://lv2plug.in/ns/extensions/ui#floatProtocol", + "http://lv2plug.in/ns/extensions/ui#idleInterface", + "http://lv2plug.in/ns/extensions/ui#makeSONameResident", + "http://lv2plug.in/ns/extensions/ui#noUserResize", + "http://lv2plug.in/ns/extensions/ui#notifyType", + "http://lv2plug.in/ns/extensions/ui#parent", + "http://lv2plug.in/ns/extensions/ui#peakProtocol", + "http://lv2plug.in/ns/extensions/ui#plugin", + "http://lv2plug.in/ns/extensions/ui#portIndex", + "http://lv2plug.in/ns/extensions/ui#portMap", + "http://lv2plug.in/ns/extensions/ui#portNotification", + "http://lv2plug.in/ns/extensions/ui#portSubscribe", + "http://lv2plug.in/ns/extensions/ui#protocol", + "http://lv2plug.in/ns/extensions/ui#resize", + "http://lv2plug.in/ns/extensions/ui#showInterface", + "http://lv2plug.in/ns/extensions/ui#touch", + "http://lv2plug.in/ns/extensions/ui#ui", + "http://lv2plug.in/ns/extensions/ui#updateRate", + "http://lv2plug.in/ns/extensions/ui#windowTitle", + "http://lv2plug.in/ns/extensions/units#Conversion", + "http://lv2plug.in/ns/extensions/units#Unit", + "http://lv2plug.in/ns/extensions/units#bar", + "http://lv2plug.in/ns/extensions/units#beat", + "http://lv2plug.in/ns/extensions/units#bpm", + "http://lv2plug.in/ns/extensions/units#cent", + "http://lv2plug.in/ns/extensions/units#cm", + "http://lv2plug.in/ns/extensions/units#coef", + "http://lv2plug.in/ns/extensions/units#conversion", + "http://lv2plug.in/ns/extensions/units#db", + "http://lv2plug.in/ns/extensions/units#degree", + "http://lv2plug.in/ns/extensions/units#factor", + "http://lv2plug.in/ns/extensions/units#frame", + "http://lv2plug.in/ns/extensions/units#hz", + "http://lv2plug.in/ns/extensions/units#inch", + "http://lv2plug.in/ns/extensions/units#khz", + "http://lv2plug.in/ns/extensions/units#km", + "http://lv2plug.in/ns/extensions/units#m", + "http://lv2plug.in/ns/extensions/units#mhz", + "http://lv2plug.in/ns/extensions/units#midiNote", + "http://lv2plug.in/ns/extensions/units#mile", + "http://lv2plug.in/ns/extensions/units#min", + "http://lv2plug.in/ns/extensions/units#mm", + "http://lv2plug.in/ns/extensions/units#ms", + "http://lv2plug.in/ns/extensions/units#name", + "http://lv2plug.in/ns/extensions/units#oct", + "http://lv2plug.in/ns/extensions/units#pc", + "http://lv2plug.in/ns/extensions/units#prefixConversion", + "http://lv2plug.in/ns/extensions/units#render", + "http://lv2plug.in/ns/extensions/units#s", + "http://lv2plug.in/ns/extensions/units#semitone12TET", + "http://lv2plug.in/ns/extensions/units#symbol", + "http://lv2plug.in/ns/extensions/units#to", + "http://lv2plug.in/ns/extensions/units#unit", + "http://lv2plug.in/ns/lv2core#AllpassPlugin", + "http://lv2plug.in/ns/lv2core#AmplifierPlugin", + "http://lv2plug.in/ns/lv2core#AnalyserPlugin", + "http://lv2plug.in/ns/lv2core#AudioPort", + "http://lv2plug.in/ns/lv2core#BandpassPlugin", + "http://lv2plug.in/ns/lv2core#CVPort", + "http://lv2plug.in/ns/lv2core#Channel", + "http://lv2plug.in/ns/lv2core#ChorusPlugin", + "http://lv2plug.in/ns/lv2core#CombPlugin", + "http://lv2plug.in/ns/lv2core#CompressorPlugin", + "http://lv2plug.in/ns/lv2core#ConstantPlugin", + "http://lv2plug.in/ns/lv2core#ControlPort", + "http://lv2plug.in/ns/lv2core#ConverterPlugin", + "http://lv2plug.in/ns/lv2core#DelayPlugin", + "http://lv2plug.in/ns/lv2core#Designation", + "http://lv2plug.in/ns/lv2core#DistortionPlugin", + "http://lv2plug.in/ns/lv2core#DynamicsPlugin", + "http://lv2plug.in/ns/lv2core#EQPlugin", + "http://lv2plug.in/ns/lv2core#EnvelopePlugin", + "http://lv2plug.in/ns/lv2core#ExpanderPlugin", + "http://lv2plug.in/ns/lv2core#ExtensionData", + "http://lv2plug.in/ns/lv2core#Feature", + "http://lv2plug.in/ns/lv2core#FilterPlugin", + "http://lv2plug.in/ns/lv2core#FlangerPlugin", + "http://lv2plug.in/ns/lv2core#FunctionPlugin", + "http://lv2plug.in/ns/lv2core#GatePlugin", + "http://lv2plug.in/ns/lv2core#GeneratorPlugin", + "http://lv2plug.in/ns/lv2core#HighpassPlugin", + "http://lv2plug.in/ns/lv2core#InputPort", + "http://lv2plug.in/ns/lv2core#InstrumentPlugin", + "http://lv2plug.in/ns/lv2core#LimiterPlugin", + "http://lv2plug.in/ns/lv2core#LowpassPlugin", + "http://lv2plug.in/ns/lv2core#MIDIPlugin", + "http://lv2plug.in/ns/lv2core#MixerPlugin", + "http://lv2plug.in/ns/lv2core#ModulatorPlugin", + "http://lv2plug.in/ns/lv2core#MultiEQPlugin", + "http://lv2plug.in/ns/lv2core#OscillatorPlugin", + "http://lv2plug.in/ns/lv2core#OutputPort", + "http://lv2plug.in/ns/lv2core#ParaEQPlugin", + "http://lv2plug.in/ns/lv2core#Parameter", + "http://lv2plug.in/ns/lv2core#PhaserPlugin", + "http://lv2plug.in/ns/lv2core#PitchPlugin", + "http://lv2plug.in/ns/lv2core#Plugin", + "http://lv2plug.in/ns/lv2core#PluginBase", + "http://lv2plug.in/ns/lv2core#Point", + "http://lv2plug.in/ns/lv2core#Port", + "http://lv2plug.in/ns/lv2core#PortBase", + "http://lv2plug.in/ns/lv2core#PortProperty", + "http://lv2plug.in/ns/lv2core#Resource", + "http://lv2plug.in/ns/lv2core#ReverbPlugin", + "http://lv2plug.in/ns/lv2core#ScalePoint", + "http://lv2plug.in/ns/lv2core#ShortName", + "http://lv2plug.in/ns/lv2core#SimulatorPlugin", + "http://lv2plug.in/ns/lv2core#SpatialPlugin", + "http://lv2plug.in/ns/lv2core#Specification", + "http://lv2plug.in/ns/lv2core#SpectralPlugin", + "http://lv2plug.in/ns/lv2core#Symbol", + "http://lv2plug.in/ns/lv2core#UtilityPlugin", + "http://lv2plug.in/ns/lv2core#WaveshaperPlugin", + "http://lv2plug.in/ns/lv2core#appliesTo", + "http://lv2plug.in/ns/lv2core#binary", + "http://lv2plug.in/ns/lv2core#connectionOptional", + "http://lv2plug.in/ns/lv2core#control", + "http://lv2plug.in/ns/lv2core#default", + "http://lv2plug.in/ns/lv2core#designation", + "http://lv2plug.in/ns/lv2core#documentation", + "http://lv2plug.in/ns/lv2core#enabled", + "http://lv2plug.in/ns/lv2core#enumeration", + "http://lv2plug.in/ns/lv2core#extensionData", + "http://lv2plug.in/ns/lv2core#freeWheeling", + "http://lv2plug.in/ns/lv2core#hardRTCapable", + "http://lv2plug.in/ns/lv2core#inPlaceBroken", + "http://lv2plug.in/ns/lv2core#index", + "http://lv2plug.in/ns/lv2core#integer", + "http://lv2plug.in/ns/lv2core#isLive", + "http://lv2plug.in/ns/lv2core#isSideChain", + "http://lv2plug.in/ns/lv2core#latency", + "http://lv2plug.in/ns/lv2core#maximum", + "http://lv2plug.in/ns/lv2core#microVersion", + "http://lv2plug.in/ns/lv2core#minimum", + "http://lv2plug.in/ns/lv2core#minorVersion", + "http://lv2plug.in/ns/lv2core#name", + "http://lv2plug.in/ns/lv2core#optionalFeature", + "http://lv2plug.in/ns/lv2core#port", + "http://lv2plug.in/ns/lv2core#portProperty", + "http://lv2plug.in/ns/lv2core#project", + "http://lv2plug.in/ns/lv2core#prototype", + "http://lv2plug.in/ns/lv2core#reportsLatency", + "http://lv2plug.in/ns/lv2core#requiredFeature", + "http://lv2plug.in/ns/lv2core#sampleRate", + "http://lv2plug.in/ns/lv2core#scalePoint", + "http://lv2plug.in/ns/lv2core#shortName", + "http://lv2plug.in/ns/lv2core#symbol", + "http://lv2plug.in/ns/lv2core#toggled", + NULL +}; + +enum LV2_URID_ID { + LV2_URID_ATOM_Atom = 1, + LV2_URID_ATOM_AtomPort, + LV2_URID_ATOM_Blank, + LV2_URID_ATOM_Bool, + LV2_URID_ATOM_Chunk, + LV2_URID_ATOM_Double, + LV2_URID_ATOM_Event, + LV2_URID_ATOM_Float, + LV2_URID_ATOM_Int, + LV2_URID_ATOM_Literal, + LV2_URID_ATOM_Long, + LV2_URID_ATOM_Number, + LV2_URID_ATOM_Object, + LV2_URID_ATOM_Path, + LV2_URID_ATOM_Property, + LV2_URID_ATOM_Resource, + LV2_URID_ATOM_Sequence, + LV2_URID_ATOM_Sound, + LV2_URID_ATOM_String, + LV2_URID_ATOM_Tuple, + LV2_URID_ATOM_URI, + LV2_URID_ATOM_URID, + LV2_URID_ATOM_Vector, + LV2_URID_ATOM_atomTransfer, + LV2_URID_ATOM_beatTime, + LV2_URID_ATOM_bufferType, + LV2_URID_ATOM_cType, + LV2_URID_ATOM_childType, + LV2_URID_ATOM_eventTransfer, + LV2_URID_ATOM_frameTime, + LV2_URID_ATOM_supports, + LV2_URID_ATOM_timeUnit, + + LV2_URID_BUFSZ_boundedBlockLength, + LV2_URID_BUFSZ_coarseBlockLength, + LV2_URID_BUFSZ_fixedBlockLength, + LV2_URID_BUFSZ_maxBlockLength, + LV2_URID_BUFSZ_minBlockLength, + LV2_URID_BUFSZ_nominalBlockLength, + LV2_URID_BUFSZ_powerOf2BlockLength, + LV2_URID_BUFSZ_sequenceSize, + + LV2_URID_DMAN_DynManifest, + + LV2_URID_EVENT_Event, + LV2_URID_EVENT_EventPort, + LV2_URID_EVENT_FrameStamp, + LV2_URID_EVENT_TimeStamp, + LV2_URID_EVENT_generatesTimeStamp, + LV2_URID_EVENT_generic, + LV2_URID_EVENT_inheritsEvent, + LV2_URID_EVENT_inheritsTimeStamp, + LV2_URID_EVENT_supportsEvent, + LV2_URID_EVENT_supportsTimeStamp, + + LV2_URID_LOG_Entry, + LV2_URID_LOG_Error, + LV2_URID_LOG_Note, + LV2_URID_LOG_Trace, + LV2_URID_LOG_Warning, + LV2_URID_LOG_log, + + LV2_URID_MIDI_ActiveSense, + LV2_URID_MIDI_Aftertouch, + LV2_URID_MIDI_Bender, + LV2_URID_MIDI_ChannelPressure, + LV2_URID_MIDI_Chunk, + LV2_URID_MIDI_Clock, + LV2_URID_MIDI_Continue, + LV2_URID_MIDI_Controller, + LV2_URID_MIDI_HexByte, + LV2_URID_MIDI_MidiEvent, + LV2_URID_MIDI_NoteOff, + LV2_URID_MIDI_NoteOn, + LV2_URID_MIDI_ProgramChange, + LV2_URID_MIDI_QuarterFrame, + LV2_URID_MIDI_Reset, + LV2_URID_MIDI_SongPosition, + LV2_URID_MIDI_SongSelect, + LV2_URID_MIDI_Start, + LV2_URID_MIDI_Stop, + LV2_URID_MIDI_SystemCommon, + LV2_URID_MIDI_SystemExclusive, + LV2_URID_MIDI_SystemMessage, + LV2_URID_MIDI_SystemRealtime, + LV2_URID_MIDI_Tick, + LV2_URID_MIDI_TuneRequest, + LV2_URID_MIDI_VoiceMessage, + LV2_URID_MIDI_benderValue, + LV2_URID_MIDI_binding, + LV2_URID_MIDI_byteNumber, + LV2_URID_MIDI_channel, + LV2_URID_MIDI_chunk, + LV2_URID_MIDI_controllerNumber, + LV2_URID_MIDI_controllerValue, + LV2_URID_MIDI_noteNumber, + LV2_URID_MIDI_pressure, + LV2_URID_MIDI_programNumber, + LV2_URID_MIDI_property, + LV2_URID_MIDI_songNumber, + LV2_URID_MIDI_songPosition, + LV2_URID_MIDI_status, + LV2_URID_MIDI_statusMask, + LV2_URID_MIDI_velocity, + + LV2_URID_MORPH_AutoMorphPort, + LV2_URID_MORPH_MorphPort, + LV2_URID_MORPH_currentType, + LV2_URID_MORPH_interface, + LV2_URID_MORPH_supportsType, + + LV2_URID_OPTIONS_Option, + LV2_URID_OPTIONS_interface, + LV2_URID_OPTIONS_options, + LV2_URID_OPTIONS_requiredOption, + LV2_URID_OPTIONS_supportedOption, + + LV2_URID_PARAMETERS_CompressorControls, + LV2_URID_PARAMETERS_ControlGroup, + LV2_URID_PARAMETERS_EnvelopeControls, + LV2_URID_PARAMETERS_FilterControls, + LV2_URID_PARAMETERS_OscillatorControls, + LV2_URID_PARAMETERS_amplitude, + LV2_URID_PARAMETERS_attack, + LV2_URID_PARAMETERS_bypass, + LV2_URID_PARAMETERS_cutoffFrequency, + LV2_URID_PARAMETERS_decay, + LV2_URID_PARAMETERS_delay, + LV2_URID_PARAMETERS_dryLevel, + LV2_URID_PARAMETERS_frequency, + LV2_URID_PARAMETERS_gain, + LV2_URID_PARAMETERS_hold, + LV2_URID_PARAMETERS_pulseWidth, + LV2_URID_PARAMETERS_ratio, + LV2_URID_PARAMETERS_release, + LV2_URID_PARAMETERS_resonance, + LV2_URID_PARAMETERS_sampleRate, + LV2_URID_PARAMETERS_sustain, + LV2_URID_PARAMETERS_threshold, + LV2_URID_PARAMETERS_waveform, + LV2_URID_PARAMETERS_wetDryRatio, + LV2_URID_PARAMETERS_wetLevel, + + LV2_URID_PATCH_Ack, + LV2_URID_PATCH_Copy, + LV2_URID_PATCH_Delete, + LV2_URID_PATCH_Error, + LV2_URID_PATCH_Get, + LV2_URID_PATCH_Insert, + LV2_URID_PATCH_Message, + LV2_URID_PATCH_Move, + LV2_URID_PATCH_Patch, + LV2_URID_PATCH_Post, + LV2_URID_PATCH_Put, + LV2_URID_PATCH_Request, + LV2_URID_PATCH_Response, + LV2_URID_PATCH_Set, + LV2_URID_PATCH_accept, + LV2_URID_PATCH_add, + LV2_URID_PATCH_body, + LV2_URID_PATCH_context, + LV2_URID_PATCH_destination, + LV2_URID_PATCH_property, + LV2_URID_PATCH_readable, + LV2_URID_PATCH_remove, + LV2_URID_PATCH_request, + LV2_URID_PATCH_sequenceNumber, + LV2_URID_PATCH_subject, + LV2_URID_PATCH_value, + LV2_URID_PATCH_wildcard, + LV2_URID_PATCH_writable, + + LV2_URID_PORT_GROUPS_AmbisonicBH1P0Group, + LV2_URID_PORT_GROUPS_AmbisonicBH1P1Group, + LV2_URID_PORT_GROUPS_AmbisonicBH2P0Group, + LV2_URID_PORT_GROUPS_AmbisonicBH2P1Group, + LV2_URID_PORT_GROUPS_AmbisonicBH2P2Group, + LV2_URID_PORT_GROUPS_AmbisonicBH3P0Group, + LV2_URID_PORT_GROUPS_AmbisonicBH3P1Group, + LV2_URID_PORT_GROUPS_AmbisonicBH3P2Group, + LV2_URID_PORT_GROUPS_AmbisonicBH3P3Group, + LV2_URID_PORT_GROUPS_DiscreteGroup, + LV2_URID_PORT_GROUPS_Element, + LV2_URID_PORT_GROUPS_FivePointOneGroup, + LV2_URID_PORT_GROUPS_FivePointZeroGroup, + LV2_URID_PORT_GROUPS_FourPointZeroGroup, + LV2_URID_PORT_GROUPS_Group, + LV2_URID_PORT_GROUPS_InputGroup, + LV2_URID_PORT_GROUPS_MidSideGroup, + LV2_URID_PORT_GROUPS_MonoGroup, + LV2_URID_PORT_GROUPS_OutputGroup, + LV2_URID_PORT_GROUPS_SevenPointOneGroup, + LV2_URID_PORT_GROUPS_SevenPointOneWideGroup, + LV2_URID_PORT_GROUPS_SixPointOneGroup, + LV2_URID_PORT_GROUPS_StereoGroup, + LV2_URID_PORT_GROUPS_ThreePointZeroGroup, + LV2_URID_PORT_GROUPS_center, + LV2_URID_PORT_GROUPS_centerLeft, + LV2_URID_PORT_GROUPS_centerRight, + LV2_URID_PORT_GROUPS_element, + LV2_URID_PORT_GROUPS_group, + LV2_URID_PORT_GROUPS_left, + LV2_URID_PORT_GROUPS_lowFrequencyEffects, + LV2_URID_PORT_GROUPS_mainInput, + LV2_URID_PORT_GROUPS_mainOutput, + LV2_URID_PORT_GROUPS_rearCenter, + LV2_URID_PORT_GROUPS_rearLeft, + LV2_URID_PORT_GROUPS_rearRight, + LV2_URID_PORT_GROUPS_right, + LV2_URID_PORT_GROUPS_side, + LV2_URID_PORT_GROUPS_sideChainOf, + LV2_URID_PORT_GROUPS_sideLeft, + LV2_URID_PORT_GROUPS_sideRight, + LV2_URID_PORT_GROUPS_source, + LV2_URID_PORT_GROUPS_subGroupOf, + + LV2_URID_PORT_PROPS_causesArtifacts, + LV2_URID_PORT_PROPS_continuousCV, + LV2_URID_PORT_PROPS_discreteCV, + LV2_URID_PORT_PROPS_displayPriority, + LV2_URID_PORT_PROPS_expensive, + LV2_URID_PORT_PROPS_hasStrictBounds, + LV2_URID_PORT_PROPS_logarithmic, + LV2_URID_PORT_PROPS_notAutomatic, + LV2_URID_PORT_PROPS_notOnGUI, + LV2_URID_PORT_PROPS_rangeSteps, + LV2_URID_PORT_PROPS_supportsStrictBounds, + LV2_URID_PORT_PROPS_trigger, + + LV2_URID_PRESETS_Bank, + LV2_URID_PRESETS_Preset, + LV2_URID_PRESETS_bank, + LV2_URID_PRESETS_preset, + LV2_URID_PRESETS_value, + + LV2_URID_RSZ_asLargeAs, + LV2_URID_RSZ_minimumSize, + LV2_URID_RSZ_resize, + + LV2_URID_STATE_Changed, + LV2_URID_STATE_State, + LV2_URID_STATE_interface, + LV2_URID_STATE_loadDefaultState, + LV2_URID_STATE_makePath, + LV2_URID_STATE_mapPath, + LV2_URID_STATE_state, + LV2_URID_STATE_threadSafeRestore, + + LV2_URID_TIME_Position, + LV2_URID_TIME_Rate, + LV2_URID_TIME_Time, + LV2_URID_TIME_bar, + LV2_URID_TIME_barBeat, + LV2_URID_TIME_beat, + LV2_URID_TIME_beatUnit, + LV2_URID_TIME_beatsPerBar, + LV2_URID_TIME_beatsPerMinute, + LV2_URID_TIME_frame, + LV2_URID_TIME_framesPerSecond, + LV2_URID_TIME_position, + LV2_URID_TIME_speed, + + LV2_URID_URID_map, + LV2_URID_URID_unmap, + + LV2_URID_WORKER_interface, + LV2_URID_WORKER_schedule, + + LV2_URID_UI_CocoaUI, + LV2_URID_UI_Gtk3UI, + LV2_URID_UI_GtkUI, + LV2_URID_UI_PortNotification, + LV2_URID_UI_PortProtocol, + LV2_URID_UI_Qt4UI, + LV2_URID_UI_Qt5UI, + LV2_URID_UI_UI, + LV2_URID_UI_WindowsUI, + LV2_URID_UI_X11UI, + LV2_URID_UI_binary, + LV2_URID_UI_fixedSize, + LV2_URID_UI_floatProtocol, + LV2_URID_UI_idleInterface, + LV2_URID_UI_makeSONameResident, + LV2_URID_UI_noUserResize, + LV2_URID_UI_notifyType, + LV2_URID_UI_parent, + LV2_URID_UI_peakProtocol, + LV2_URID_UI_plugin, + LV2_URID_UI_portIndex, + LV2_URID_UI_portMap, + LV2_URID_UI_portNotification, + LV2_URID_UI_portSubscribe, + LV2_URID_UI_protocol, + LV2_URID_UI_resize, + LV2_URID_UI_showInterface, + LV2_URID_UI_touch, + LV2_URID_UI_ui, + LV2_URID_UI_updateRate, + LV2_URID_UI_windowTitle, + + LV2_URID_UNITS_Conversion, + LV2_URID_UNITS_Unit, + LV2_URID_UNITS_bar, + LV2_URID_UNITS_beat, + LV2_URID_UNITS_bpm, + LV2_URID_UNITS_cent, + LV2_URID_UNITS_cm, + LV2_URID_UNITS_coef, + LV2_URID_UNITS_conversion, + LV2_URID_UNITS_db, + LV2_URID_UNITS_degree, + LV2_URID_UNITS_factor, + LV2_URID_UNITS_frame, + LV2_URID_UNITS_hz, + LV2_URID_UNITS_inch, + LV2_URID_UNITS_khz, + LV2_URID_UNITS_km, + LV2_URID_UNITS_m, + LV2_URID_UNITS_mhz, + LV2_URID_UNITS_midiNote, + LV2_URID_UNITS_mile, + LV2_URID_UNITS_min, + LV2_URID_UNITS_mm, + LV2_URID_UNITS_ms, + LV2_URID_UNITS_name, + LV2_URID_UNITS_oct, + LV2_URID_UNITS_pc, + LV2_URID_UNITS_prefixConversion, + LV2_URID_UNITS_render, + LV2_URID_UNITS_s, + LV2_URID_UNITS_semitone12TET, + LV2_URID_UNITS_symbol, + LV2_URID_UNITS_to, + LV2_URID_UNITS_unit, + + LV2_URID_LV2_AllpassPlugin, + LV2_URID_LV2_AmplifierPlugin, + LV2_URID_LV2_AnalyserPlugin, + LV2_URID_LV2_AudioPort, + LV2_URID_LV2_BandpassPlugin, + LV2_URID_LV2_CVPort, + LV2_URID_LV2_Channel, + LV2_URID_LV2_ChorusPlugin, + LV2_URID_LV2_CombPlugin, + LV2_URID_LV2_CompressorPlugin, + LV2_URID_LV2_ConstantPlugin, + LV2_URID_LV2_ControlPort, + LV2_URID_LV2_ConverterPlugin, + LV2_URID_LV2_DelayPlugin, + LV2_URID_LV2_Designation, + LV2_URID_LV2_DistortionPlugin, + LV2_URID_LV2_DynamicsPlugin, + LV2_URID_LV2_EQPlugin, + LV2_URID_LV2_EnvelopePlugin, + LV2_URID_LV2_ExpanderPlugin, + LV2_URID_LV2_ExtensionData, + LV2_URID_LV2_Feature, + LV2_URID_LV2_FilterPlugin, + LV2_URID_LV2_FlangerPlugin, + LV2_URID_LV2_FunctionPlugin, + LV2_URID_LV2_GatePlugin, + LV2_URID_LV2_GeneratorPlugin, + LV2_URID_LV2_HighpassPlugin, + LV2_URID_LV2_InputPort, + LV2_URID_LV2_InstrumentPlugin, + LV2_URID_LV2_LimiterPlugin, + LV2_URID_LV2_LowpassPlugin, + LV2_URID_LV2_MIDIPlugin, + LV2_URID_LV2_MixerPlugin, + LV2_URID_LV2_ModulatorPlugin, + LV2_URID_LV2_MultiEQPlugin, + LV2_URID_LV2_OscillatorPlugin, + LV2_URID_LV2_OutputPort, + LV2_URID_LV2_ParaEQPlugin, + LV2_URID_LV2_Parameter, + LV2_URID_LV2_PhaserPlugin, + LV2_URID_LV2_PitchPlugin, + LV2_URID_LV2_Plugin, + LV2_URID_LV2_PluginBase, + LV2_URID_LV2_Point, + LV2_URID_LV2_Port, + LV2_URID_LV2_PortBase, + LV2_URID_LV2_PortProperty, + LV2_URID_LV2_Resource, + LV2_URID_LV2_ReverbPlugin, + LV2_URID_LV2_ScalePoint, + LV2_URID_LV2_ShortName, + LV2_URID_LV2_SimulatorPlugin, + LV2_URID_LV2_SpatialPlugin, + LV2_URID_LV2_Specification, + LV2_URID_LV2_SpectralPlugin, + LV2_URID_LV2_Symbol, + LV2_URID_LV2_UtilityPlugin, + LV2_URID_LV2_WaveshaperPlugin, + LV2_URID_LV2_appliesTo, + LV2_URID_LV2_binary, + LV2_URID_LV2_connectionOptional, + LV2_URID_LV2_control, + LV2_URID_LV2_default, + LV2_URID_LV2_designation, + LV2_URID_LV2_documentation, + LV2_URID_LV2_enabled, + LV2_URID_LV2_enumeration, + LV2_URID_LV2_extensionData, + LV2_URID_LV2_freeWheeling, + LV2_URID_LV2_hardRTCapable, + LV2_URID_LV2_inPlaceBroken, + LV2_URID_LV2_index, + LV2_URID_LV2_integer, + LV2_URID_LV2_isLive, + LV2_URID_LV2_isSideChain, + LV2_URID_LV2_latency, + LV2_URID_LV2_maximum, + LV2_URID_LV2_microVersion, + LV2_URID_LV2_minimum, + LV2_URID_LV2_minorVersion, + LV2_URID_LV2_name, + LV2_URID_LV2_optionalFeature, + LV2_URID_LV2_port, + LV2_URID_LV2_portProperty, + LV2_URID_LV2_project, + LV2_URID_LV2_prototype, + LV2_URID_LV2_reportsLatency, + LV2_URID_LV2_requiredFeature, + LV2_URID_LV2_sampleRate, + LV2_URID_LV2_scalePoint, + LV2_URID_LV2_shortName, + LV2_URID_LV2_symbol, + LV2_URID_LV2_toggled, + + LV2_URID_STATIC_END, +}; + +#define LV2_URID_NUM_STATIC_IDS (LV2_URID_STATIC_END - 1) + +static inline int +lv2_urid_static_cmp(const void* lhs, const void* rhs) +{ + const char* key = *(const char**)lhs; + const char* element = *(const char**)rhs; + + return strcmp(key, element); +} + +static inline LV2_URID +lv2_urid_static_map(const char* const uri) +{ + const char** p = (const char**)bsearch(&uri, + lv2_urid_static_uris + 1, + LV2_URID_STATIC_END, + sizeof(char*), + lv2_urid_static_cmp); + + assert(!p || (!strcmp(uri, *p) && p >= lv2_urid_static_uris && + p <= lv2_urid_static_uris + LV2_URID_STATIC_END)); + + return p ? (p - lv2_urid_static_uris) : 0; +} + +static inline const char* +lv2_urid_static_unmap(const LV2_URID urid) +{ + assert(urid <= LV2_URID_STATIC_END); + return urid && urid <= LV2_URID_STATIC_END ? lv2_urid_static_uris[urid] + : NULL; +} + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif // LV2_URID_SID_H + +/** + @} +*/ diff --git a/lv2/urid/urid.h b/lv2/urid/urid.h index c9ee2e0..3706007 100644 --- a/lv2/urid/urid.h +++ b/lv2/urid/urid.h @@ -125,6 +125,23 @@ typedef struct _LV2_URID_Unmap { LV2_URID urid); } LV2_URID_Unmap; +#if 0 +/** + Static URIDs Feature (LV2_URID__staticURIDs) +*/ +typedef struct _LV2_URID_Static_URIDs { + /** + Opaque pointer to host data. + + This MUST be passed to unmap() whenever it is called. + Otherwise, it must not be interpreted in any way. + */ + LV2_URID_Static_URIDs_Handle handle; + + int max_static_id; +} LV2_URID_Static_URIDs; +#endif + #ifdef __cplusplus } /* extern "C" */ #endif diff --git a/plugins/eg-metro.lv2/metro.c b/plugins/eg-metro.lv2/metro.c index a7231d2..cf6bccf 100644 --- a/plugins/eg-metro.lv2/metro.c +++ b/plugins/eg-metro.lv2/metro.c @@ -22,6 +22,7 @@ #include "lv2/log/log.h" #include "lv2/log/logger.h" #include "lv2/time/time.h" +#include "lv2/urid/sid.h" #include "lv2/urid/urid.h" #include @@ -37,19 +38,6 @@ #define EG_METRO_URI "http://lv2plug.in/plugins/eg-metro" -typedef struct { - LV2_URID atom_Blank; - LV2_URID atom_Float; - LV2_URID atom_Object; - LV2_URID atom_Path; - LV2_URID atom_Resource; - LV2_URID atom_Sequence; - LV2_URID time_Position; - LV2_URID time_barBeat; - LV2_URID time_beatsPerMinute; - LV2_URID time_speed; -} MetroURIs; - static const double attack_s = 0.005; static const double decay_s = 0.075; @@ -79,7 +67,6 @@ typedef enum { typedef struct { LV2_URID_Map* map; // URID map feature LV2_Log_Logger logger; // Logger API - MetroURIs uris; // Cache of mapped URIDs struct { LV2_Atom_Sequence* control; @@ -167,20 +154,6 @@ instantiate(const LV2_Descriptor* descriptor, return NULL; } - // Map URIS - MetroURIs* const uris = &self->uris; - LV2_URID_Map* const map = self->map; - uris->atom_Blank = map->map(map->handle, LV2_ATOM__Blank); - uris->atom_Float = map->map(map->handle, LV2_ATOM__Float); - uris->atom_Object = map->map(map->handle, LV2_ATOM__Object); - uris->atom_Path = map->map(map->handle, LV2_ATOM__Path); - uris->atom_Resource = map->map(map->handle, LV2_ATOM__Resource); - uris->atom_Sequence = map->map(map->handle, LV2_ATOM__Sequence); - uris->time_Position = map->map(map->handle, LV2_TIME__Position); - uris->time_barBeat = map->map(map->handle, LV2_TIME__barBeat); - uris->time_beatsPerMinute = map->map(map->handle, LV2_TIME__beatsPerMinute); - uris->time_speed = map->map(map->handle, LV2_TIME__speed); - // Initialise instance fields self->rate = rate; self->bpm = 120.0f; @@ -263,24 +236,22 @@ play(Metro* self, uint32_t begin, uint32_t end) static void update_position(Metro* self, const LV2_Atom_Object* obj) { - const MetroURIs* uris = &self->uris; - // Received new transport position/speed LV2_Atom *beat = NULL, *bpm = NULL, *speed = NULL; lv2_atom_object_get(obj, - uris->time_barBeat, &beat, - uris->time_beatsPerMinute, &bpm, - uris->time_speed, &speed, + LV2_URID_TIME_barBeat, &beat, + LV2_URID_TIME_beatsPerMinute, &bpm, + LV2_URID_TIME_speed, &speed, NULL); - if (bpm && bpm->type == uris->atom_Float) { + if (bpm && bpm->type == LV2_URID_ATOM_Float) { // Tempo changed, update BPM self->bpm = ((LV2_Atom_Float*)bpm)->body; } - if (speed && speed->type == uris->atom_Float) { + if (speed && speed->type == LV2_URID_ATOM_Float) { // Speed changed, e.g. 0 (stop) to 1 (play) self->speed = ((LV2_Atom_Float*)speed)->body; } - if (beat && beat->type == uris->atom_Float) { + if (beat && beat->type == LV2_URID_ATOM_Float) { // Received a beat position, synchronise // This hard sync may cause clicks, a real plugin would be more graceful const float frames_per_beat = 60.0f / self->bpm * self->rate; @@ -300,8 +271,7 @@ update_position(Metro* self, const LV2_Atom_Object* obj) static void run(LV2_Handle instance, uint32_t sample_count) { - Metro* self = (Metro*)instance; - const MetroURIs* uris = &self->uris; + Metro* self = (Metro*)instance; // Work forwards in time frame by frame, handling events as we go const LV2_Atom_Sequence* in = self->ports.control; @@ -315,10 +285,10 @@ run(LV2_Handle instance, uint32_t sample_count) // Check if this event is an Object // (or deprecated Blank to tolerate old hosts) - if (ev->body.type == uris->atom_Object || - ev->body.type == uris->atom_Blank) { + if (ev->body.type == LV2_URID_ATOM_Object || + ev->body.type == LV2_URID_ATOM_Blank) { const LV2_Atom_Object* obj = (const LV2_Atom_Object*)&ev->body; - if (obj->body.otype == uris->time_Position) { + if (obj->body.otype == LV2_URID_TIME_Position) { // Received position information, update update_position(self, obj); } diff --git a/wscript b/wscript index cb97c54..7a74205 100644 --- a/wscript +++ b/wscript @@ -88,6 +88,10 @@ def configure(conf): var='LINKCHECKER', mandatory=False): Logs.warn('Documentation will not be checked for broken links') + if conf.env.BUILD_TESTS: + autowaf.check_pkg(conf, 'serd-1', uselib_store='SERD', + atleast_version='1.0.0', mandatory=False) + # Check for gcov library (for test coverage) if (conf.env.BUILD_TESTS and not Options.options.no_coverage @@ -226,13 +230,13 @@ def build_spec(bld, path): test_linkflags += ['--coverage'] # Unit test program - bld(features = 'c cprogram', - source = test, - lib = test_lib, - target = os.path.splitext(str(test.get_bld()))[0], - install_path = None, - cflags = test_cflags, - linkflags = test_linkflags) + obj = bld(features = 'c cprogram', + source = test, + lib = test_lib, + target = os.path.splitext(str(test.get_bld()))[0], + install_path = None, + cflags = test_cflags, + linkflags = test_linkflags) # Install bundle bld.install_files(bundle_dir, @@ -411,6 +415,14 @@ def build(bld): target = 'build-test', install_path = None) + # Unit test program + if bld.env.HAVE_SERD: + obj = bld(features = 'c cprogram', + source = 'lv2/urid/check-static-ids.c', + target = 'lv2/urid/check-static-ids', + install_path = None, + use = 'SERD') + if bld.env.BUILD_BOOK: # Build "Programming LV2 Plugins" book from plugin examples bld.recurse('plugins') @@ -438,6 +450,18 @@ def test(tst): test = './' + i.path_from(tst.path.find_node('build')) check([test]) + with tst.group('URID') as check: + specs = (tst.path.ant_glob('lv2/*', dir=True)) + + for name, path in spec_map.items(): + if name == 'core': + schema = tst.path.find_node('lv2/core/lv2core.ttl') + else: + schema = tst.path.find_node('lv2/%s/%s.ttl' % (name, name)) + + uri = path.replace('lv2/lv2plug.in/', 'http://lv2plug.in/') + check(['lv2/urid/check-static-ids', str(schema), uri]) + class Dist(Scripting.Dist): def execute(self): 'Execute but do not call archive() since dist() has already done so.' -- cgit v1.2.1