aboutsummaryrefslogtreecommitdiffstats
path: root/lv2/lv2plug.in/ns/lv2core
diff options
context:
space:
mode:
Diffstat (limited to 'lv2/lv2plug.in/ns/lv2core')
-rw-r--r--lv2/lv2plug.in/ns/lv2core/AUTHORS13
-rw-r--r--lv2/lv2plug.in/ns/lv2core/COPYING16
-rw-r--r--lv2/lv2plug.in/ns/lv2core/INSTALL41
-rw-r--r--lv2/lv2plug.in/ns/lv2core/README42
-rw-r--r--lv2/lv2plug.in/ns/lv2core/lv2.h299
-rw-r--r--lv2/lv2plug.in/ns/lv2core/lv2core.doap.ttl117
-rw-r--r--lv2/lv2plug.in/ns/lv2core/lv2core.pc.in10
-rw-r--r--lv2/lv2plug.in/ns/lv2core/lv2core.ttl883
-rw-r--r--lv2/lv2plug.in/ns/lv2core/manifest.ttl10
-rwxr-xr-xlv2/lv2plug.in/ns/lv2core/wafbin0 -> 91475 bytes
-rw-r--r--lv2/lv2plug.in/ns/lv2core/wscript141
11 files changed, 1572 insertions, 0 deletions
diff --git a/lv2/lv2plug.in/ns/lv2core/AUTHORS b/lv2/lv2plug.in/ns/lv2core/AUTHORS
new file mode 100644
index 0000000..64febf8
--- /dev/null
+++ b/lv2/lv2plug.in/ns/lv2core/AUTHORS
@@ -0,0 +1,13 @@
+LV2 is written and maintained by:
+
+David Robillard <d@drobilla.net>
+Steve Harris <steve@plugin.org.uk>
+
+with the input and help of many others.
+
+LV2 is based on LADSPA, which was by:
+ Paul Barton-Davis
+ Richard W.E. Furse
+ Stefan Westerfeld
+
+Thanks to all members of the free software community who made LV2 possible.
diff --git a/lv2/lv2plug.in/ns/lv2core/COPYING b/lv2/lv2plug.in/ns/lv2core/COPYING
new file mode 100644
index 0000000..c46d5dd
--- /dev/null
+++ b/lv2/lv2plug.in/ns/lv2core/COPYING
@@ -0,0 +1,16 @@
+Copyright 2006-2011 Steve Harris, David Robillard.
+
+Based on LADSPA, Copyright 2000-2002 Richard W.E. Furse,
+Paul Barton-Davis, Stefan Westerfeld.
+
+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. \ No newline at end of file
diff --git a/lv2/lv2plug.in/ns/lv2core/INSTALL b/lv2/lv2plug.in/ns/lv2core/INSTALL
new file mode 100644
index 0000000..16b1427
--- /dev/null
+++ b/lv2/lv2plug.in/ns/lv2core/INSTALL
@@ -0,0 +1,41 @@
+This software requires only Python to build. The build system, based on waf,
+is included in this source distribution.
+
+
+LV2Core
+=======
+
+This package contains everything necessary to compile against and/or use LV2
+plugins and extensions: a header file, pkg-config file, and LV2 bundle (with
+Turtle files).
+
+The configure option --bundle-only can be used to install only the lv2core.lv2
+bundle. This is useful for installing the bundle to a project-specific or
+user-specific location (e.g. ~/.lv2).
+
+See README for details on how to correctly package LV2, and how to depend on
+LV2 in other projects.
+
+
+Generic Waf Instructions
+========================
+
+As with most build systems, building and installing a project with waf is done
+in three separate stages:
+
+ 1. ./waf configure [OPTIONS]
+ 2. ./waf build
+ 3. ./waf install
+
+The default command is build. For example:
+
+ ./waf configure --prefix=/some/where
+ ./waf -j2
+ sudo ./waf install
+
+The environment variable DESTDIR can be used to add a prefix to all install
+paths (useful for packaging), for example:
+
+ DESTDIR=./lv2core.pkg ./waf install
+
+Run './waf --help' for detailed option information.
diff --git a/lv2/lv2plug.in/ns/lv2core/README b/lv2/lv2plug.in/ns/lv2core/README
new file mode 100644
index 0000000..f49513f
--- /dev/null
+++ b/lv2/lv2plug.in/ns/lv2core/README
@@ -0,0 +1,42 @@
+LV2
+===
+
+LV2 gives programmers the ability to write audio processors (or "plugins") in
+C/C++ which can be dynamically loaded into a range of applications (or
+"hosts").
+
+This core specification is deliberately as short and simple as possible, but is
+designed so that extensions can be defined to add more advanced features.
+
+More information about LV2 can be found at <http://lv2plug.in>.
+
+
+Using LV2
+---------
+
+Applications that use LV2 plugins should depend on this package. It includes a
+header, LV2 bundle, and a pkg-config file. To compile against LV2, build
+scripts should check for the pkg-config package "lv2core", or simply check for
+the header "lv2/lv2plug.in/ns/lv2core/lv2.h".
+
+The appropriate C include for LV2 specifications is based on their URI, e.g.:
+
+ #include "lv2/lv2plug.in/ns/lv2core/lv2.h"
+
+Is how code should include the header "lv2.h" in this bundle, which defines the
+specification with URI "http://lv2plug.in/ns/lv2core". Other specifications
+should follow this convention, e.g. the correct way to include the header
+"foo.h" in the extension "http://example.org/foo" is:
+
+ #include "lv2/example.org/foo/foo.h"
+
+
+Packaging
+---------
+
+Please package these components in a single package (i.e. do not split the
+headers, data, and program into separate packages). This package, in its
+entirety, is a build and run time dependency of any code that uses LV2.
+Distributions are encouraged to include it with package name "lv2core".
+
+ -- David Robillard <d@drobilla.net>
diff --git a/lv2/lv2plug.in/ns/lv2core/lv2.h b/lv2/lv2plug.in/ns/lv2core/lv2.h
new file mode 100644
index 0000000..29adf7b
--- /dev/null
+++ b/lv2/lv2plug.in/ns/lv2core/lv2.h
@@ -0,0 +1,299 @@
+/*
+ LV2 - An audio plugin interface specification.
+ Copyright 2006-2012 Steve Harris, David Robillard.
+
+ Based on LADSPA, Copyright 2000-2002 Richard W.E. Furse,
+ Paul Barton-Davis, Stefan Westerfeld.
+
+ 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.
+*/
+
+/**
+ @file lv2.h
+ API for the LV2 specification <http://lv2plug.in/ns/lv2core>.
+ Revision: 6.1
+*/
+
+#ifndef LV2_H_INCLUDED
+#define LV2_H_INCLUDED
+
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ Plugin Instance Handle.
+
+ This is a handle for one particular instance of a plugin. It is valid to
+ compare to NULL (or 0 for C++) but otherwise the host MUST NOT attempt to
+ interpret it.
+*/
+typedef void * LV2_Handle;
+
+/**
+ Feature.
+
+ Features allow hosts to make additional functionality available to plugins
+ without requiring modification to the LV2 API. Extensions may define new
+ features and specify the @ref URI and @ref data to be used if necessary.
+ Some features, such as lv2:isLive, do not require the host to pass data.
+*/
+typedef struct _LV2_Feature {
+ /**
+ A globally unique, case-sensitive identifier (URI) for this feature.
+
+ This MUST be a valid URI string as defined by RFC 3986.
+ */
+ const char * URI;
+
+ /**
+ Pointer to arbitrary data.
+
+ The format of this data is defined by the extension which describes the
+ feature with the given @ref URI.
+ */
+ void * data;
+} LV2_Feature;
+
+/**
+ Plugin Descriptor.
+
+ This structure provides the core functions necessary to instantiate and use
+ a plugin.
+*/
+typedef struct _LV2_Descriptor {
+ /**
+ A globally unique, case-sensitive identifier for this plugin.
+
+ This MUST be a valid URI string as defined by RFC 3986. All plugins with
+ the same URI MUST be compatible to some degree, see
+ http://lv2plug.in/ns/lv2core for details.
+ */
+ const char * URI;
+
+ /**
+ Instantiate the plugin.
+
+ Note that instance initialisation should generally occur in activate()
+ rather than here. If a host calls instantiate(), it MUST call cleanup()
+ at some point in the future.
+
+ @param descriptor Descriptor of the plugin to instantiate.
+
+ @param sample_rate Sample rate, in Hz, for the new plugin instance.
+
+ @param bundle_path Path to the LV2 bundle which contains this plugin
+ binary. It MUST include the trailing directory separator (e.g. '/') so
+ that simply appending a filename will yield the path to that file in the
+ bundle.
+
+ @param features A NULL terminated array of LV2_Feature structs which
+ represent the features the host supports. Plugins may refuse to
+ instantiate if required features are not found here. However, hosts MUST
+ NOT use this as a discovery mechanism: instead, use the RDF data to
+ determine which features are required and do not attempt to instantiate
+ unsupported plugins at all. This parameter MUST NOT be NULL, i.e. a host
+ that supports no features MUST pass a single element array containing
+ NULL.
+
+ @return A handle for the new plugin instance, or NULL if instantiation
+ has failed.
+ */
+ LV2_Handle (*instantiate)(const struct _LV2_Descriptor * descriptor,
+ double sample_rate,
+ const char * bundle_path,
+ const LV2_Feature *const * features);
+
+ /**
+ Connect a port on a plugin instance to a memory location.
+
+ Plugin writers should be aware that the host may elect to use the same
+ buffer for more than one port and even use the same buffer for both
+ input and output (see lv2:inPlaceBroken in lv2.ttl).
+
+ If the plugin has the feature lv2:hardRTCapable then there are various
+ things that the plugin MUST NOT do within the connect_port() function;
+ see lv2core.ttl for details.
+
+ connect_port() MUST be called at least once for each port before run()
+ is called, unless that port is lv2:connectionOptional. The plugin must
+ pay careful attention to the block size passed to run() since the block
+ allocated may only just be large enough to contain the data, and is not
+ guaranteed to remain constant between run() calls.
+
+ connect_port() may be called more than once for a plugin instance to
+ allow the host to change the buffers that the plugin is reading or
+ writing. These calls may be made before or after activate() or
+ deactivate() calls.
+
+ @param instance Plugin instance containing the port.
+
+ @param port Index of the port to connect. The host MUST NOT try to
+ connect a port index that is not defined in the plugin's RDF data. If
+ it does, the plugin's behaviour is undefined (a crash is likely).
+
+ @param data_location Pointer to data of the type defined by the port
+ type in the plugin's RDF data (e.g. an array of float for an
+ lv2:AudioPort). This pointer must be stored by the plugin instance and
+ used to read/write data when run() is called. Data present at the time
+ of the connect_port() call MUST NOT be considered meaningful.
+ */
+ void (*connect_port)(LV2_Handle instance,
+ uint32_t port,
+ void * data_location);
+
+ /**
+ Initialise a plugin instance and activate it for use.
+
+ This is separated from instantiate() to aid real-time support and so
+ that hosts can reinitialise a plugin instance by calling deactivate()
+ and then activate(). In this case the plugin instance MUST reset all
+ state information dependent on the history of the plugin instance except
+ for any data locations provided by connect_port(). If there is nothing
+ for activate() to do then this field may be NULL.
+
+ When present, hosts MUST call this function once before run() is called
+ for the first time. This call SHOULD be made as close to the run() call
+ as possible and indicates to real-time plugins that they are now live,
+ however plugins MUST NOT rely on a prompt call to run() after
+ activate().
+
+ The host MUST NOT call activate() again until deactivate() has been
+ called first. If a host calls activate(), it MUST call deactivate() at
+ some point in the future. Note that connect_port() may be called before
+ or after activate().
+ */
+ void (*activate)(LV2_Handle instance);
+
+ /**
+ Run a plugin instance for a block.
+
+ Note that if an activate() function exists then it must be called before
+ run(). If deactivate() is called for a plugin instance then run() may
+ not be called until activate() has been called again.
+
+ If the plugin has the feature lv2:hardRTCapable then there are various
+ things that the plugin MUST NOT do within the run() function (see
+ lv2core.ttl for details).
+
+ As a special case, when @c sample_count == 0, the plugin should update
+ any output ports that represent a single instant in time (e.g. control
+ ports, but not audio ports). This is particularly useful for latent
+ plugins, which should update their latency output port so hosts can
+ pre-roll plugins to compute latency. Plugins MUST NOT crash when
+ @c sample_count == 0.
+
+ @param instance Instance to be run.
+
+ @param sample_count The block size (in samples) for which the plugin
+ instance must run.
+ */
+ void (*run)(LV2_Handle instance,
+ uint32_t sample_count);
+
+ /**
+ Deactivate a plugin instance (counterpart to activate()).
+
+ Hosts MUST deactivate all activated instances after they have been run()
+ for the last time. This call SHOULD be made as close to the last run()
+ call as possible and indicates to real-time plugins that they are no
+ longer live, however plugins MUST NOT rely on prompt deactivation. If
+ there is nothing for deactivate() to do then this field may be NULL
+
+ Deactivation is not similar to pausing since the plugin instance will be
+ reinitialised by activate(). However, deactivate() itself MUST NOT fully
+ reset plugin state. For example, the host may deactivate a plugin, then
+ store its state (using some extension to do so).
+
+ Hosts MUST NOT call deactivate() unless activate() was previously
+ called. Note that connect_port() may be called before or after
+ deactivate().
+ */
+ void (*deactivate)(LV2_Handle instance);
+
+ /**
+ Clean up a plugin instance (counterpart to instantiate()).
+
+ Once an instance of a plugin has been finished with it must be deleted
+ using this function. The instance handle passed ceases to be valid after
+ this call.
+
+ If activate() was called for a plugin instance then a corresponding call
+ to deactivate() MUST be made before cleanup() is called. Hosts MUST NOT
+ call cleanup() unless instantiate() was previously called.
+ */
+ void (*cleanup)(LV2_Handle instance);
+
+ /**
+ Return additional plugin data defined by some extenion.
+
+ A typical use of this facility is to return a struct containing function
+ pointers to extend the LV2_Descriptor API.
+
+ The actual type and meaning of the returned object MUST be specified
+ precisely by the extension. This function MUST return NULL for any
+ unsupported URI. If a plugin does not support any extension data, this
+ field may be NULL.
+
+ The host is never responsible for freeing the returned value.
+ */
+ const void * (*extension_data)(const char * uri);
+} LV2_Descriptor;
+
+/**
+ Put this (LV2_SYMBOL_EXPORT) before any functions that are to be loaded
+ by the host as a symbol from the dynamic library.
+*/
+#ifdef _WIN32
+# define LV2_SYMBOL_EXPORT __declspec(dllexport)
+#else
+# define LV2_SYMBOL_EXPORT
+#endif
+
+/**
+ Prototype for plugin accessor function.
+
+ Plugins are discovered by hosts using RDF data (not by loading libraries).
+ See http://lv2plug.in for details on the discovery process, though most
+ hosts should use an existing library to implement this functionality.
+
+ A plugin library MUST include a function called "lv2_descriptor" with this
+ prototype. This function MUST have C-style linkage (if you are using C++
+ this is taken care of by the 'extern "C"' clause at the top of this file).
+
+ When it is time to load a plugin (designated by its URI), the host loads the
+ plugin's library, gets the lv2_descriptor() function from it, and uses this
+ function to find the LV2_Descriptor for the desired plugin. Plugins are
+ accessed by index using values from 0 upwards. This function MUST return
+ NULL for out of range indices, so the host can enumerate plugins by
+ increasing @c index until NULL is returned.
+
+ Note that @c index has no meaning, hosts MUST NOT depend on it remaining
+ consistent between loads of the plugin library.
+*/
+LV2_SYMBOL_EXPORT
+const LV2_Descriptor * lv2_descriptor(uint32_t index);
+
+/**
+ Type of the lv2_descriptor() function in a plugin library.
+*/
+typedef const LV2_Descriptor *
+(*LV2_Descriptor_Function)(uint32_t index);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LV2_H_INCLUDED */
diff --git a/lv2/lv2plug.in/ns/lv2core/lv2core.doap.ttl b/lv2/lv2plug.in/ns/lv2core/lv2core.doap.ttl
new file mode 100644
index 0000000..33048a2
--- /dev/null
+++ b/lv2/lv2plug.in/ns/lv2core/lv2core.doap.ttl
@@ -0,0 +1,117 @@
+@prefix dcs: <http://ontologi.es/doap-changeset#> .
+@prefix doap: <http://usefulinc.com/ns/doap#> .
+@prefix foaf: <http://xmlns.com/foaf/0.1/> .
+@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+
+<http://plugin.org.uk/swh.xrdf#me>
+ a foaf:Person ;
+ foaf:name "Steve Harris" ;
+ foaf:homepage <http://plugin.org.uk/> ;
+ rdfs:seeAlso <http://plugin.org.uk/swh.xrdf> .
+
+<http://drobilla.net/drobilla#me>
+ a foaf:Person ;
+ foaf:name "David Robillard" ;
+ foaf:homepage <http://drobilla.net/> ;
+ foaf:mbox <mailto:d@drobilla.net> ;
+ rdfs:seeAlso <http://drobilla.net/drobilla> .
+
+<http://lv2plug.in/ns/lv2core>
+ a doap:Project ;
+ doap:license <http://opensource.org/licenses/isc> ;
+ doap:name "LV2" ;
+ doap:homepage <http://lv2plug.in> ;
+ doap:created "2004-04-21" ;
+ doap:shortdesc "An audio plugin interface specification." ;
+ doap:programming-language "C" ;
+ doap:release [
+ doap:revision "6.1" ;
+ doap:created "2012-02-01" ;
+ dcs:blame <http://drobilla.net/drobilla#me> ;
+ dcs:changeset [
+ dcs:item [
+ rdfs:label "Fix LV2_SYMBOL_EXPORT and lv2_descriptor prototype for Windows."
+ ]
+ ]
+ ] , [
+ doap:revision "6.0" ;
+ doap:created "2011-11-21" ;
+ doap:file-release <http://lv2plug.in/spec/lv2core-6.0.tar.bz2> ;
+ dcs:blame <http://drobilla.net/drobilla#me> ;
+ dcs:changeset [
+ dcs:item [
+ rdfs:label "Rename core.lv2 and lv2.ttl to lv2core.lv2 and lv2core.ttl to adhere to modern conventions."
+ ] , [
+ rdfs:label "Add lv2:extensionData and lv2:ExtensionData for plugins to indicate that they support some URI for extension_data()."
+ ] , [
+ rdfs:label "Remove lv2config in favour of the simple convention that specifications install headers to standard URI-based paths."
+ ] , [
+ rdfs:label "Switch to the ISC license, a simple BSD-style license (with permission of all contributors to lv2.h and its ancestor, ladspa.h)."
+ ] , [
+ rdfs:label "Make lv2core.ttl a valid OWL 2 DL ontology."
+ ] , [
+ rdfs:label "Improve documentation."
+ ]
+ ]
+ ] , [
+ doap:revision "4.0" ;
+ doap:created "2011-03-18" ;
+ doap:file-release <http://lv2plug.in/spec/lv2core-4.0.tar.bz2> ;
+ dcs:blame <http://drobilla.net/drobilla#me> ;
+ dcs:changeset [
+ dcs:item [
+ rdfs:label "Make doap:license suggested, but not required (for wrappers)."
+ ] , [
+ rdfs:label "Define lv2:binary (MUST be in manifest.ttl)."
+ ] , [
+ rdfs:label "Define lv2:minorVersion and lv2:microVersion (MUST be in manifest.ttl)."
+ ] , [
+ rdfs:label "Define lv2:documentation and use it to document lv2core."
+ ] , [
+ rdfs:label "Add lv2:FunctionPlugin and lv2:ConstantPlugin classes."
+ ] , [
+ rdfs:label "Move lv2:AmplifierPlugin under lv2:DynamicsPlugin."
+ ] , [
+ rdfs:label "Loosen domain of lv2:optionalFeature and lv2:requiredFeature (to allow re-use in extensions)."
+ ] , [
+ rdfs:label "Add generic lv2:Resource and lv2:PluginBase classes."
+ ] , [
+ rdfs:label "Fix definition of lv2:minimum etc. (used for values, not scale points)."
+ ] , [
+ rdfs:label "More precisely define properties with OWL."
+ ] , [
+ rdfs:label "Move project metadata to manifest."
+ ] , [
+ rdfs:label "Add lv2:enumeration port property."
+ ] , [
+ rdfs:label "Define run() pre-roll special case (sample_count == 0)."
+ ]
+ ]
+ ] , [
+ doap:revision "3.0" ;
+ doap:created "2008-11-08" ;
+ doap:file-release <http://lv2plug.in/spec/lv2core-3.0.tar.bz2> ;
+ dcs:blame <http://drobilla.net/drobilla#me> ;
+ dcs:changeset [
+ dcs:item [
+ rdfs:label "Require that serialisations refer to ports by symbol rather than index."
+ ] , [
+ rdfs:label "Minor stylistic changes to lv2.ttl."
+ ] , [
+ rdfs:label "No header changes."
+ ]
+ ]
+ ] , [
+ doap:revision "2.0" ;
+ doap:created "2008-02-10" ;
+ doap:file-release <http://lv2plug.in/spec/lv2core-2.0.tar.gz> ;
+ dcs:blame <http://drobilla.net/drobilla#me> ;
+ dcs:changeset [
+ dcs:item [
+ rdfs:label "Initial release."
+ ]
+ ]
+ ] ;
+ doap:developer <http://plugin.org.uk/swh.xrdf#me> ,
+ <http://drobilla.net/drobilla#me> ;
+ doap:maintainer <http://drobilla.net/drobilla#me> .
diff --git a/lv2/lv2plug.in/ns/lv2core/lv2core.pc.in b/lv2/lv2plug.in/ns/lv2core/lv2core.pc.in
new file mode 100644
index 0000000..96e5169
--- /dev/null
+++ b/lv2/lv2plug.in/ns/lv2core/lv2core.pc.in
@@ -0,0 +1,10 @@
+prefix=@PREFIX@
+exec_prefix=@EXEC_PREFIX@
+libdir=@LIBDIR@
+includedir=@INCLUDEDIR@
+
+Name: lv2core
+Version: @LV2CORE_VERSION@
+Description: An audio plugin interface specification.
+Libs:
+Cflags: -I${includedir}
diff --git a/lv2/lv2plug.in/ns/lv2core/lv2core.ttl b/lv2/lv2plug.in/ns/lv2core/lv2core.ttl
new file mode 100644
index 0000000..0ab56c5
--- /dev/null
+++ b/lv2/lv2plug.in/ns/lv2core/lv2core.ttl
@@ -0,0 +1,883 @@
+# This document describes LV2, a plugin interface.
+# See <http://lv2plug.in> for more information.
+#
+# Copyright 2006-2011 Steve Harris, 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.
+
+@prefix doap: <http://usefulinc.com/ns/doap#> .
+@prefix lv2: <http://lv2plug.in/ns/lv2core#> .
+@prefix owl: <http://www.w3.org/2002/07/owl#> .
+@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
+
+###########################
+## General LV2 Resources ##
+###########################
+
+lv2:Resource a rdfs:Class , owl:Class ;
+ rdfs:comment """
+An LV2 Resource (e.g. plugin, specification, or any other LV2 related thing).
+""" .
+
+lv2:Specification a rdfs:Class , owl:Class ;
+ rdfs:subClassOf lv2:Resource ;
+ lv2:documentation """
+<p>An LV2 specification (i.e. this specification, or an LV2 extension).</p>
+
+<p>Specification data, like plugin data, is distributed in bundles
+so hosts may discover <em>all</em> present LV2 data.</p>
+""" .
+
+lv2:documentation a rdf:Property , owl:AnnotationProperty ;
+ rdfs:range rdfs:Literal ;
+ rdfs:label "documentation" ;
+ rdfs:seeAlso <http://www.w3.org/TR/xhtml-basic/> ;
+ lv2:documentation """
+<p>Relates a Resource to documentation markup. The value of this property
+MUST be a string literal which is a valid XHTML Basic 1.1 fragment suitable
+for use as the content of the &lt;body&gt; element. This can be used by
+hosts to provide rich online documentation or by tools to generate external
+documentation pages. The standard language tagging facility of RDF can be
+used to provide multi-lingual documentation.</p>
+<p>XHTML Basic is a W3C Recommendation which defines a basic subset of XHTML
+intended to be reasonable to implement with limited resources (e.g. on embedded
+devices). See <a href="http://www.w3.org/TR/xhtml-basic/#s_xhtmlmodules"
+>XHTML Basic, Section 3</a> for a list of legal tags.</p>
+""" .
+
+<http://lv2plug.in/ns/lv2core>
+ a owl:Ontology ;
+ owl:imports <http://lv2plug.in/ns/doap.owl> ;
+ lv2:documentation """
+<p>LV2 is an interface for writing audio processors, or <q>plugins</q>, in
+C/C++ which can be dynamically loaded into many applications, or <q>hosts</q>.
+This <q>core</q> specification is simple and minimal, but is designed so that
+<q>extensions</q> can be defined to add more advanced features, making it
+possibly to implement nearly any feature imaginable.</p>
+
+<p>LV2 maintains a strong distinction between <q>code</q> and <q>data</q>.
+Plugin code is in a shared library, while data is in a companion data file
+written in <a href="http://www.w3.org/TeamSubmission/turtle/">Turtle</a>.
+Code, data, and any other resources (e.g. waveforms) are shipped together in a
+<q>bundle</q> directory. The code contains only the executable portions of the
+plugin which inherently <em>must</em> be written in code. All other data is
+provided in the data file(s). This makes plugin data flexible and extensible,
+and allows the host to do everything but run the plugin without loading or
+executing any code. Among other advantages, this makes hosts more robust
+(broken plugins can't crash a host during discovery) and allows generic tools
+and non-C programs to work with LV2 data. LV2 itself and extensions are
+distributed in a similar way.</p>
+
+<p>An LV2 plugin library is suitable for dynamic loading (e.g. via
+<code>dlopen()</code>) and provides one or more plugin descriptors via the
+<code>lv2_descriptor()</code> function. These can be instantiated to create
+plugin <q>instances</q>, which can be run directly on data or connected
+together to perform advanced signal processing tasks.</p>
+
+<p>Plugins communicate via <q>ports</q>, which can transmit any type of data.
+Data is processed by first <q>connecting</q> each port to a buffer, then
+repeatedly calling a plugin's <code>run()</code> method to process blocks of
+data.</p>
+
+<p>This core specification defines two types of port, equivalent to those in <a
+href="http://www.ladspa.org/">LADSPA</a>: lv2:ControlPort and lv2:AudioPort.
+Audio ports contain arrays with one <code>float</code> element per sample,
+allowing a block of audio to be processed in a single call to
+<code>run()</code>. Control ports contain single <code>float</code> values,
+which are fixed and valid for the duration of the call to <code>run()</code>.
+Thus the <q>control rate</q> is determined by the block size, which is
+controlled by the host (and not necessarily constant).</p>
+
+<h3>Threading Rules</h3>
+
+<p>To faciliate use in multi-threaded programs, LV2 functions are partitioned
+into several threading classes:</p>
+
+<table>
+<tr><th>Discovery Class</th>
+ <th>Instantiation Class</th>
+ <th>Audio Class</th></tr>
+<tr><td>lv2_descriptor()</td>
+ <td>LV2_Descriptor::instantiate()</td>
+ <td>LV2_Descriptor::run()</td></tr>
+<tr><td>LV2_Descriptor::extension_data()</td>
+ <td>LV2_Descriptor::cleanup()</td>
+ <td>LV2_Descriptor::connect_port()</td></tr>
+<tr><td></td><td>LV2_Descriptor::activate()</td><td></td></tr>
+<tr><td></td><td>LV2_Descriptor::deactivate()</td><td></td></tr>
+</table>
+
+<p>The rules that hosts MUST follow are:</p>
+<ul>
+<li>When any function is running for a plugin instance,
+no other function in the same class may run for that instance.</li>
+<li>When a <em>Discovery</em> function is running,
+no other functions in the same shared object file may run.</li>
+<li>When an <em>Instantiation</em> function is running for a plugin instance,
+no other functions for that instance may run.</li>
+</ul>
+
+<p>Any simultaneous calls that are not explicitly forbidden by these rules are
+allowed. For example, a host may call <code>run()</code> for two different
+plugin instances simultaneously.</p>
+
+<p>Plugin functions in any class MUST NOT manipulate any state which might
+affect other plugin or host code, e.g. by using non-reentrant global
+functions.</p>
+
+<p>Extensions to this specification which add new functions MUST declare in
+which of these classes the functions belong, define new classes for them, or
+otherwise precisely describe their threading rules.</p>
+""" .
+
+############
+## Plugin ##
+############
+
+lv2:PluginBase a rdfs:Class , owl:Class ;
+ rdfs:subClassOf lv2:Resource ;
+ lv2:documentation """
+<p>An abstract plugin-like resource that MAY not actually be an LV2 plugin
+(e.g. may not actually have a plugin binary).</p>
+
+<p>PluginBase SHOULD be used as a base type for any resource that may have
+ports or otherwise mimic the structure of a Plugin (e.g. a preset), since
+hosts and other tools already <q>understand</q> this structure.</p>
+""" .
+
+lv2:Plugin a rdfs:Class , owl:Class ;
+ rdfs:subClassOf lv2:PluginBase ;
+ rdfs:label "Plugin" ;
+ rdfs:subClassOf [
+ a owl:Restriction ;
+ owl:onProperty doap:name ;
+ owl:someValuesFrom xsd:string ;
+ rdfs:comment """
+A Plugin MUST have at least one doap:name that is a string
+with no language tag.
+""" ] ;
+ lv2:documentation """
+<p>The class which represents an LV2 plugin.</p>
+
+<p>To be discovered by hosts, plugins MUST explicitly have rdf:type lv2:Plugin
+listed in their bundle's manifest, e.g.:</p>
+<pre class="turtle-code">
+&lt;http://example.org/my-plugin&gt; a lv2:Plugin .
+</pre>
+
+<p>Plugins SHOULD have a doap:license property whenever possible. The doap:name
+property should be at most a few words in length using title capitalization,
+e.g. <q>Tape Delay Unit</q>. Use doap:shortdesc or doap:description for more
+detailed descriptions.</p>
+""" .
+
+##########
+## Port ##
+##########
+
+lv2:Port a rdfs:Class , owl:Class ;
+ rdfs:subClassOf lv2:Resource ;
+ rdfs:label "Port" ;
+ rdfs:subClassOf [
+ a owl:Restriction ;
+ owl:onProperty lv2:index ;
+ owl:allValuesFrom xsd:nonNegativeInteger ;
+ owl:cardinality 1 ;
+ rdfs:comment """
+A port MUST have a single lv2:index which is of type xsd:nonNegativeInteger
+(e.g. a non-negative integer literal in Turtle). The actual RDF datatype
+of the index MAY be xsd:integer (which is what a generic Turtle parser
+will do), but the value itself MUST be non-negative.
+""" ] , [
+ a owl:Restriction ;
+ owl:onProperty lv2:symbol ;
+ owl:someValuesFrom xsd:string ;
+ rdfs:comment """
+A port MUST have a single lv2:symbol which is of type xsd:string with no
+language tag.
+""" ] , [
+ a owl:Restriction ;
+ owl:onProperty lv2:name ;
+ owl:someValuesFrom xsd:string ;
+ rdfs:comment """
+A port MUST have at least one lv2:name which is of type xsd:string.
+""" ] ;
+ lv2:documentation """
+<p>The class which represents an LV2 port.</p>
+
+<p>All LV2 port descriptions MUST have a rdf:type that is one of lv2:Port
+lv2:InputPort or lv2:OutputPort. Additionally there MUST be at least one other
+rdf:type which more precisely describes type of the port
+(e.g. lv2:AudioPort).</p>
+
+<p>Hosts that do not support a specific port class MUST NOT instantiate the
+plugin, unless that port has the connectionOptional property set (in which case
+the host can simply <q>connect</q> that port to NULL). If a host is interested
+in plugins to insert in a certain signal path (e.g. stereo audio), it SHOULD
+consider all the classes of a port to determine which ports are most suitable
+for connection (e.g. by ignoring ports with additional classes the host does
+not recognize).</p>
+
+<p>A port has two identifiers: a (numeric) index, and a (textual) symbol.
+The index can be used as an identifier at run-time, but persistent references
+to ports (e.g. in a saved preset) MUST use the symbol. A symbol is guaranteed
+to refer to the same port on all plugins with a given URI. An index does NOT
+necessarily refer to the same port on all plugins with a given URI (i.e. the
+index for a port may differ between plugin binaries).</p>
+""" .
+
+lv2:InputPort a rdfs:Class , owl:Class ;
+ rdfs:subClassOf lv2:Port ;
+ rdfs:label "Input port" ;
+ rdfs:comment """
+Ports of this type will be connected to a pointer to some value, which will
+be read by the plugin during their run method.
+""" .
+
+lv2:OutputPort a rdfs:Class , owl:Class ;
+ rdfs:subClassOf lv2:Port ;
+ rdfs:label "Output port" ;
+ rdfs:comment """
+Ports of this type will be connected to a pointer to some value, which will
+be written to by the plugin during their run method.
+""" .
+
+lv2:ControlPort a rdfs:Class , owl:Class ;
+ rdfs:subClassOf lv2:Port ;
+ rdfs:label "Control port" ;
+ lv2:documentation """
+<p>Ports of this type will be connected to a pointer to a single value of C
+type <code>float</code>.</p>
+
+""" .
+
+lv2:AudioPort a rdfs:Class , owl:Class ;
+ rdfs:subClassOf lv2:Port ;
+ rdfs:label "Audio port" ;
+ lv2:documentation """
+<p>Ports of this type will be connected to an array of length sample_count
+with elements of C type <code>float</code>.</p>
+""" .
+
+#######################
+## Plugin Properties ##
+#######################
+
+lv2:port a rdf:Property , owl:ObjectProperty ;
+ rdfs:domain lv2:PluginBase ;
+ rdfs:range lv2:Port ;
+ rdfs:label "port" ;
+ rdfs:comment "Relates a Plugin to the Ports it contains" .
+
+lv2:minorVersion a rdf:Property , owl:DatatypeProperty ;
+ rdfs:domain lv2:Resource ;
+ rdfs:range xsd:nonNegativeInteger ;
+ rdfs:label "minor version" ;
+ lv2:documentation """
+<p>The minor version of an LV2 Resource. This property is used (along with
+lv2:microVersion) by hosts to distinguish different versions of a compatible
+resource, e.g. to load only the bundle with the most recent version.</p>
+
+<p>The version of an LV2 resource is composed of two fields: minor version,
+and micro version. These have the usual semantics:</p>
+
+<ul>
+<li>The minor version MUST be incremented when backwards (but not
+forwards) compatible additions are made, e.g. the addition of a port to a
+plugin.</li>
+
+<li>The micro version is incremented for changes which do not affect
+compatibility at all, e.g. bug fixes or documentation updates.</li>
+</ul>
+
+<p>Note there is deliberately no concept of a major version: all versions of an
+LV2 resource with a given URI are by definition backwards compatible. More
+precisely: replacing a resource with a newer version of that resource MUST NOT
+break anything. If a change is made which breaks this rule, the URI
+of the resource MUST be changed. In contexts where a full (e.g. <a
+href="http://semver.org">SemVer</a> conformant) version number is required, the
+major version of all released LV2 resources is 1.</p>
+
+<p>Plugins and extensions MUST adhere to the following rules:</p>
+<ul>
+<li>All versions of a plugin with a given URI MUST have the <q>same</q> set of
+mandatory (i.e. not lv2:connectionOptional) ports with respect to lv2:symbol
+and rdf:type. In other words, every port on a specific version of a plugin has
+a lv2:symbol and a set of rdf:types; all future versions of that plugin are
+guaranteed to have a port with the same lv2:symbol and at least those
+rdf:types. New types may be added only if doing so does not break
+compatibility, i.e. if old hosts will continue to work correctly with the new
+plugin.</li>
+
+<li>New ports MAY be added without changing the plugin URI if and only if they
+are lv2:connectionOptional and the minor version is incremented.</li>
+
+<li>The minor version MUST be incremented if the index of any port (identified
+by its symbol) is changed.</li>
+
+<li>All versions of an extension MUST be compatible in the sense that an
+implementation of the new version can interoperate with an implementation of
+any previous version.</li>
+</ul>
+
+<p>(Note these rules are not necessarily exhaustive)</p>
+
+<p>Anything that depends on a specific version of a plugin (e.g. a
+serialisation that references ports by index) MUST refer to the plugin by both
+URI and version. However, implementations should be tolerant and extensions
+should be designed such that there is no need to do this (e.g. indices should
+only be meaningful for a particular plugin <em>instance</em> at run-time).</p>
+
+<p>When hosts discover several installed versions of a resource, they SHOULD
+warn the user and load only the most recent version.</p>
+
+<p>An odd minor <em>or</em> micro version indicates that the resource is a
+possibly unstable development version. Hosts and tools SHOULD clearly indicate
+this wherever appropriate. Several versions of a resource with an odd version
+may exist; i.e. it is acceptable to work on a development version of a resource
+(e.g. in source control) without worrying about version numbers as long as
+either the minor or micro version is odd.</p>
+
+<p>This property describes half of a resource version. See also <a
+href="http://lv2plug.in/ns/lv2core#minorVersion">lv2:minorVersion</a>, the
+property which describes the other half.</p>
+""" .
+
+lv2:microVersion a rdf:Property , owl:DatatypeProperty ;
+ rdfs:domain lv2:Resource ;
+ rdfs:range xsd:nonNegativeInteger ;
+ rdfs:label "micro version" ;
+ lv2:documentation """
+<p>The micro component of a Resource's version.</p>
+
+<p>Releases of plugins and extensions MUST be explicitly versioned. Correct
+version numbers MUST always be maintained for any versioned resource that is
+published. For example, after a release, if a change is made in the development
+version in source control, the micro version MUST be incremented (to an odd
+number) to distinguish this modified version from the previous release.</p>
+
+<p>This property describes half of a resource version. For detailed
+documentation on LV2 resource versioning, see <a
+href="http://lv2plug.in/ns/lv2core#minorVersion">lv2:minorVersion</a>.</p>
+""" .
+
+lv2:binary a rdf:Property , owl:ObjectProperty ;
+ rdfs:domain lv2:Resource ;
+ rdfs:range owl:Thing ;
+ rdfs:label "binary" ;
+ lv2:documentation """
+<p>The binary of an LV2 resource. The value of this property must be a URI that
+resolves to a shared library object (the actual type of this library is system
+specific).</p>
+
+<p>This is a required property of a Plugin which MUST be included in the
+bundle's manifest.ttl file. The lv2:binary of an lv2:Plugin is the
+shared object containing the <code>lv2_descriptor()</code> function which can
+be used to access the descriptor for that plugin. This property may be used
+similarly by extensions to relate other resources to their implementations.</p>
+""" .
+
+lv2:appliesTo a rdf:Property , owl:ObjectProperty ;
+ rdfs:domain lv2:Resource ;
+ rdfs:range lv2:Plugin ;
+ rdfs:label "Applies to" ;
+ lv2:documentation """
+<p>Specifies that a resource is related to a plugin. This is primarily intended
+for discovery purposes: bundles that describe resources that work with
+particular plugins (e.g. presets or user interfaces) SHOULD use this predicate
+in manifest.ttl to relate the resource to the applicable
+plugin(s), e.g.:</p>
+<pre class="turtle-code">
+&lt;thing&gt;
+ a ext:Thing ;
+ lv2:appliesTo &lt;plugin&gt; ;
+ rdfs:seeAlso &lt;thing.ttl&gt; .
+</pre>
+
+<p>Particularly for large amounts of data, this is preferable to
+extending the plugin description with rdfs:seeAlso since the host may choose
+if/when to load the data, knowing that it describes an additional resource and
+not the plugin itself.</p>
+""" .
+
+#####################
+## Port Properties ##
+#####################
+
+lv2:index a rdf:Property , owl:DatatypeProperty ;
+ rdfs:domain lv2: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. The index uniqely identifies the port on an instance of the plugin.
+""" .
+
+lv2:symbol a rdf:Property , owl:DatatypeProperty ;
+ rdfs:label "symbol" ;
+ rdfs:comment """
+A short name used as a machine and human readable identifier.
+
+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.
+
+A language tag MUST NOT be used on this property. The symbol uniquely
+identifies the port on a plugin with a given URI (i.e. the plugin author MUST
+change the plugin URI if a port symbol is changed or removed).
+""" .
+
+lv2:name a rdf:Property , owl:DatatypeProperty ;
+ rdfs:domain lv2:Port ;
+ rdfs:label "name" ;
+ rdfs:comment """
+A display name for labeling the Port in a user interface.
+
+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.
+""" .
+
+###########################
+## Port Range and Points ##
+###########################
+
+lv2:Point a rdfs:Class , owl:Class ;
+ rdfs:label "Port value point" ;
+ # Unfortunately, it is illegal to specify restrictions on rdfs:label or
+ # rdf:value. If the migration can be handled gracefully, it would be
+ # good to switch to more appropriate predicates here for validators.
+ lv2:documentation """
+<p>A Point describes an interesting value in a Port's range (much like a labeled
+<q>notch</q> on a physical knob).</p>
+<ul>
+ <li>A Point MUST have at least one rdfs:label which is a string.</li>
+ <li>A Point MUST have exactly one rdf:value with a type that is compatible
+ with the type of the corresponding Port.</li>
+</ul>
+""" .
+
+lv2:ScalePoint a rdfs:Class , owl:Class ;
+ rdfs:subClassOf lv2:Point ;
+ rdfs:comment "A single float Point (for control inputs)." .
+
+lv2:scalePoint a rdf:Property , owl:ObjectProperty ;
+ rdfs:domain lv2:Port ;
+ rdfs:range lv2:ScalePoint ;
+ rdfs:label "Scale point" ;
+ rdfs:comment "Relates a Port to its ScalePoints." .
+
+lv2:default a rdf:Property , owl:DatatypeProperty ;
+ rdfs:domain lv2:Port ;
+ rdfs:label "Default value" ;
+ rdfs:comment """
+The default value that the host SHOULD set this port to when there is no
+other information available.
+""" .
+
+lv2:minimum a rdf:Property , owl:DatatypeProperty ;
+ rdfs:domain lv2:Port ;
+ rdfs:label "Minimum value" ;
+ lv2:documentation """
+<p>A hint to the host for the minimum useful value that the port will use. This
+is a <q>soft</q> limit; the plugin is required to gracefully accept all values
+in the range of a port's data type.</p>
+""" .
+
+lv2:maximum a rdf:Property , owl:DatatypeProperty ;
+ rdfs:domain lv2:Port ;
+ rdfs:label "Maximum value" ;
+ lv2:documentation """
+<p>A hint to the host for the maximum useful value that the port will use.
+This is a <q>soft</q> limit; the plugin is required to gracefully accept all
+values in the range of a port's data type.</p>
+""" .
+
+#############
+## Feature ##
+#############
+
+lv2:Feature a rdfs:Class , owl:Class ;
+ rdfs:subClassOf lv2:Resource ;
+ rdfs:label "Feature" ;
+ rdfs:comment """
+An additional feature which a plugin or other resource may use or require.
+""".
+
+lv2:optionalFeature a rdf:Property , owl:ObjectProperty ;
+ rdfs:domain lv2:Resource ;
+ rdfs:range lv2:Feature ;
+ rdfs:label "Optional feature" ;
+ lv2:documentation """
+<p>Signifies that a plugin or other resource supports a certain feature. If
+the host supports this feature, it MUST pass its URI and any additional data to
+the plugin in LV2_Descriptor::instantiate(). The plugin MUST NOT fail to
+instantiate if an optional feature is not supported by the host.</p>
+""" .
+
+lv2:requiredFeature a rdf:Property , owl:ObjectProperty ;
+ rdfs:domain lv2:Resource ;
+ rdfs:range lv2:Feature ;
+ rdfs:label "Required feature" ;
+ lv2:documentation """
+<p>Signifies that a plugin or other resource requires a certain feature. If
+the host supports this feature, it MUST pass its URI and any additional data to
+the plugin in LV2_Descriptor::instantiate(). The plugin MUST fail to
+instantiate if a required feature is not present; hosts SHOULD always check
+this before attempting to instantiate a plugin (i.e. discovery by attempting to
+instantiate is strongly discouraged).</p>
+""" .
+
+####################
+## Extension Data ##
+####################
+
+lv2:ExtensionData a rdfs:Class , owl:Class ;
+ rdfs:subClassOf lv2:Resource ;
+ rdfs:label "Extension Data" ;
+ rdfs:comment """
+Additional data and/or functions a plugin may return from
+LV2_Descriptor:extension_data() which can be used to add additional API beyond
+that defined by LV2_Descriptor.
+""".
+
+lv2:extensionData a rdf:Property , owl:ObjectProperty ;
+ rdfs:domain lv2:Resource ;
+ rdfs:range lv2:ExtensionData ;
+ rdfs:label "Available extension data" ;
+ lv2:documentation """
+<p>Signifies that a plugin provides additional data or functions (as defined by
+some extension) via LV2:Descriptor::instantiate().</p>
+""" .
+
+#######################
+## Standard Features ##
+#######################
+
+lv2:isLive a lv2:Feature ;
+ rdfs:label "Has a live (realtime) dependency" ;
+ lv2:documentation """
+<p>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. This
+property is not related to <q>hard real-time</q> execution requirements (see
+lv2:hardRTCapable).</p>
+""" .
+
+lv2:inPlaceBroken a lv2:Feature ;
+ rdfs:label "In-place broken" ;
+ lv2:documentation """
+<p>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 port is connected to the same location as ANY
+output port MUST require this Feature. Doing so should be avoided as it makes
+it impossible for hosts to use the plugin to process data <q>in-place</q>.</p>
+""" .
+
+lv2:hardRTCapable a lv2:Feature ;
+ rdfs:label "Hard realtime capable" ;
+ lv2:documentation """
+<p>Indicates that the plugin is capable of running not only in a conventional
+host but also in a <q>hard real-time</q> environment. To qualify for this the
+plugin MUST satisfy all of the following:</p>
+<ol>
+<li>The plugin MUST NOT use malloc(), free() or other heap memory management
+ functions within its Audio class functions.</li>
+
+<li>The plugin MUST NOT attempt to make use of any library functions in its
+ Audio class functions, unless those functions themselves adhere to these
+ rules (i.e. are hard realtime safe). The plugin MAY assume the standard C
+ and C math library functions are safe.</li>
+
+<li>The plugin will not access files, devices, pipes, sockets, IPC or any other
+ mechanism that might result in process or thread blocking within its Audio
+ class functions.</li>
+
+<li>The plugin will take an amount of time to execute a run() call
+ approximately of form <code>A + B * sample_count</code> where <code>A</code>
+ and <code>B</code> depend on the machine and host in use. This amount of
+ time MUST NOT depend on input signals or plugin state.</li>
+</ol>
+<p>Note these rules apply to the connect_port() function as well as run().</p>
+""" .
+
+##################
+## PortProperty ##
+##################
+
+lv2:PortProperty a rdfs:Class , owl:Class ;
+ rdfs:label "Port property" ;
+ rdfs:comment """
+A port property - a useful piece of information that allows a host to make more
+sensible decisions (e.g. to provide a better interface).
+""" .
+
+lv2:portProperty a rdf:Property , owl:ObjectProperty ;
+ rdfs:domain lv2:Port ;
+ rdfs:range lv2:PortProperty ;
+ rdfs:label "Port property" ;
+ rdfs:comment """
+Relates Ports to PortProperties. The PortProperty may be ignored without
+catastrophic effects, though it may be useful e.g. for providing a sensible
+interface for the port.
+""" .
+
+#############################
+## Standard PortProperties ##
+#############################
+
+lv2:connectionOptional a lv2:PortProperty ;
+ 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.
+""" .
+
+lv2:reportsLatency a lv2:PortProperty ;
+ rdfs:label "Latency reporting port" ;
+ lv2:documentation """
+<p>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 property set which informs the host of the
+<q>correct</q> latency. In <q>fuzzy</q> 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).</p>
+""" .
+
+lv2:toggled a lv2:PortProperty ;
+ rdfs:label "Toggled" ;
+ lv2:documentation """
+<p>Indicates that the data item should be considered a Boolean toggle. Data
+less than or equal to zero should be considered <q>off</q> or <q>false</q>, and
+data above zero should be considered <q>on</q> or <q>true</q>.</p>
+""" .
+
+lv2:sampleRate a lv2:PortProperty ;
+ 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
+(half the sample rate) could be requested by this property in conjunction with
+lv2:minimum 0.0 and lv2:maximum 0.5.
+Hosts that support bounds at all MUST support this property.
+""" .
+
+lv2:integer a lv2:PortProperty ;
+ rdfs:label "Integer" ;
+ rdfs:comment """
+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.
+""" .
+
+lv2:enumeration a lv2:PortProperty ;
+ rdfs:label "Enumeration" ;
+ rdfs:comment """
+Indicates that a port's only reasonable values are the scale points defined for
+that port. A host SHOULD NOT allow a user to set the value of such a port to
+anything other than a scale point. However, a plugin MUST operate reasonably
+even if such a port has an input that is not a scale point, preferably by
+simply choosing the largest enumeration value less than or equal to the actual
+input value (i.e. round the input value down).
+""" .
+
+####################
+## Plugin Classes ##
+####################
+
+lv2:GeneratorPlugin a rdfs:Class , owl:Class ;
+ rdfs:subClassOf lv2:Plugin ;
+ rdfs:label "Generator" ;
+ rdfs:comment """
+Any plugin that generates sound internally, rather than processing its input.
+""" .
+
+lv2:InstrumentPlugin a rdfs:Class , owl:Class ;
+ rdfs:subClassOf lv2:GeneratorPlugin ;
+ rdfs:label "Instrument" ;
+ rdfs:comment """
+Any plugin that is intended to be played as a musical instrument.
+""" .
+
+lv2:OscillatorPlugin a rdfs:Class , owl:Class ;
+ rdfs:subClassOf lv2:GeneratorPlugin ;
+ rdfs:label "Oscillator" .
+
+lv2:UtilityPlugin a rdfs:Class , owl:Class ;
+ rdfs:subClassOf lv2:Plugin ;
+ rdfs:label "Utility" ;
+ rdfs:comment """
+Includes things like mathematical functions and non-musical delays.
+""" .
+
+lv2:ConverterPlugin a rdfs:Class , owl:Class ;
+ rdfs:subClassOf lv2:UtilityPlugin ;
+ rdfs:label "Converter" ;
+ rdfs:comment """
+Any plugin that converts some form of input into a different form of output.
+""" .
+
+lv2:AnalyserPlugin a rdfs:Class , owl:Class ;
+ rdfs:subClassOf lv2:UtilityPlugin ;
+ rdfs:label "Analyser" ;
+ rdfs:comment """
+Any plugin that analyses input to output some useful information.
+""" .
+
+lv2:MixerPlugin a rdfs:Class , owl:Class ;
+ rdfs:subClassOf lv2:UtilityPlugin ;
+ rdfs:label "Mixer" ;
+ rdfs:comment """
+A plugin which mixes some number of inputs into some number of outputs.
+""" .
+
+lv2:SimulatorPlugin a rdfs:Class , owl:Class ;
+ rdfs:subClassOf lv2:Plugin ;
+ rdfs:label "Simulator" ;
+ rdfs:comment """
+Plugins that aim to duplicate the effect of some environmental effect or
+musical equipment.
+""" .
+
+lv2:DelayPlugin a rdfs:Class , owl:Class ;
+ rdfs:subClassOf lv2:Plugin ;
+ rdfs:label "Delay" ;
+ rdfs:comment """
+Plugins that intentionally delay their input signal as an effect.
+""" .
+
+lv2:ModulatorPlugin a rdfs:Class , owl:Class ;
+ rdfs:subClassOf lv2:Plugin ;
+ rdfs:label "Modulator" .
+
+lv2:ReverbPlugin a rdfs:Class , owl:Class ;
+ rdfs:subClassOf lv2:Plugin ;
+ rdfs:subClassOf lv2:SimulatorPlugin ;
+ rdfs:subClassOf lv2:DelayPlugin ;
+ rdfs:label "Reverb" .
+
+lv2:PhaserPlugin a rdfs:Class , owl:Class ;
+ rdfs:subClassOf lv2:ModulatorPlugin ;
+ rdfs:label "Phaser" .
+
+lv2:FlangerPlugin a rdfs:Class , owl:Class ;
+ rdfs:subClassOf lv2:ModulatorPlugin ;
+ rdfs:label "Flanger" .
+
+lv2:ChorusPlugin a rdfs:Class , owl:Class ;
+ rdfs:subClassOf lv2:ModulatorPlugin ;
+ rdfs:label "Chorus" .
+
+lv2:FilterPlugin a rdfs:Class , owl:Class ;
+ rdfs:subClassOf lv2:Plugin ;
+ rdfs:label "Filter" .
+
+lv2:LowpassPlugin a rdfs:Class , owl:Class ;
+ rdfs:subClassOf lv2:FilterPlugin ;
+ rdfs:label "Lowpass" .
+
+lv2:BandpassPlugin a rdfs:Class , owl:Class ;
+ rdfs:subClassOf lv2:FilterPlugin ;
+ rdfs:label "Bandpass" .
+
+lv2:HighpassPlugin a rdfs:Class , owl:Class ;
+ rdfs:subClassOf lv2:FilterPlugin ;
+ rdfs:label "Highpass" .
+
+lv2:CombPlugin a rdfs:Class , owl:Class ;
+ rdfs:subClassOf lv2:FilterPlugin ;
+ rdfs:label "Comb" .
+
+lv2:AllpassPlugin a rdfs:Class , owl:Class ;
+ rdfs:subClassOf lv2:FilterPlugin ;
+ rdfs:label "Allpass" .
+
+lv2:EQPlugin a rdfs:Class , owl:Class ;
+ rdfs:subClassOf lv2:FilterPlugin ;
+ rdfs:label "Equaliser" .
+
+lv2:ParaEQPlugin a rdfs:Class , owl:Class ;
+ rdfs:subClassOf lv2:EQPlugin ;
+ rdfs:label "Parametric" .
+
+lv2:MultiEQPlugin a rdfs:Class , owl:Class ;
+ rdfs:subClassOf lv2:EQPlugin ;
+ rdfs:label "Multiband" .
+
+lv2:SpatialPlugin a rdfs:Class , owl:Class ;
+ rdfs:subClassOf lv2:Plugin ;
+ rdfs:label "Spatial" ;
+ rdfs:comment """
+Plugins that manipulate the position of audio in space (e.g. panning,
+stereo width, surround encoding, etc.).
+""" .
+
+lv2:SpectralPlugin a rdfs:Class , owl:Class ;
+ rdfs:subClassOf lv2:Plugin ;
+ rdfs:label "Spectral" ;
+ rdfs:comment """
+Plugins that alter the spectral properties (e.g. frequency) of audio.
+""" .
+
+lv2:PitchPlugin a rdfs:Class , owl:Class ;
+ rdfs:subClassOf lv2:SpectralPlugin ;
+ rdfs:label "Pitch Shifter" .
+
+lv2:AmplifierPlugin a rdfs:Class , owl:Class ;
+ rdfs:subClassOf lv2:DynamicsPlugin ;
+ rdfs:label "Amplifier" .
+
+lv2:DistortionPlugin a rdfs:Class , owl:Class ;
+ rdfs:subClassOf lv2:Plugin ;
+ rdfs:label "Distortion" .
+
+lv2:WaveshaperPlugin a rdfs:Class , owl:Class ;
+ rdfs:subClassOf lv2:DistortionPlugin ;
+ rdfs:label "Waveshaper" .
+
+lv2:DynamicsPlugin a rdfs:Class , owl:Class ;
+ rdfs:subClassOf lv2:Plugin ;
+ rdfs:label "Dynamics" ;
+ rdfs:comment """
+Plugins that alter the envelope or dynamic range of audio.
+""" .
+
+lv2:CompressorPlugin a rdfs:Class , owl:Class ;
+ rdfs:subClassOf lv2:DynamicsPlugin ;
+ rdfs:label "Compressor" .
+
+lv2:ExpanderPlugin a rdfs:Class , owl:Class ;
+ rdfs:subClassOf lv2:DynamicsPlugin ;
+ rdfs:label "Expander" .
+
+lv2:LimiterPlugin a rdfs:Class , owl:Class ;
+ rdfs:subClassOf lv2:DynamicsPlugin ;
+ rdfs:label "Limiter" .
+
+lv2:GatePlugin a rdfs:Class , owl:Class ;
+ rdfs:subClassOf lv2:DynamicsPlugin ;
+ rdfs:label "Gate" .
+
+lv2:FunctionPlugin a rdfs:Class , owl:Class ;
+ rdfs:subClassOf lv2:UtilityPlugin ;
+ rdfs:label "Function" .
+
+lv2:ConstantPlugin a rdfs:Class , owl:Class ;
+ rdfs:subClassOf lv2:GeneratorPlugin ;
+ rdfs:label "Constant" .
diff --git a/lv2/lv2plug.in/ns/lv2core/manifest.ttl b/lv2/lv2plug.in/ns/lv2core/manifest.ttl
new file mode 100644
index 0000000..5733b55
--- /dev/null
+++ b/lv2/lv2plug.in/ns/lv2core/manifest.ttl
@@ -0,0 +1,10 @@
+@prefix doap: <http://usefulinc.com/ns/doap#> .
+@prefix lv2: <http://lv2plug.in/ns/lv2core#> .
+@prefix owl: <http://www.w3.org/2002/07/owl#> .
+@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+
+<http://lv2plug.in/ns/lv2core>
+ a doap:Project , lv2:Specification , owl:Ontology ;
+ lv2:minorVersion 6 ;
+ lv2:microVersion 1 ;
+ rdfs:seeAlso <lv2core.ttl> , <lv2core.doap.ttl> . \ No newline at end of file
diff --git a/lv2/lv2plug.in/ns/lv2core/waf b/lv2/lv2plug.in/ns/lv2core/waf
new file mode 100755
index 0000000..907b984
--- /dev/null
+++ b/lv2/lv2plug.in/ns/lv2core/waf
Binary files differ
diff --git a/lv2/lv2plug.in/ns/lv2core/wscript b/lv2/lv2plug.in/ns/lv2core/wscript
new file mode 100644
index 0000000..bb76b13
--- /dev/null
+++ b/lv2/lv2plug.in/ns/lv2core/wscript
@@ -0,0 +1,141 @@
+#!/usr/bin/env python
+import os
+
+from waflib.extras import autowaf as autowaf
+import waflib.Options as Options
+import waflib.Scripting as Scripting
+import glob
+
+# Version of this package (even if built as a child)
+LV2CORE_VERSION = '6.1'
+
+# Variables for 'waf dist'
+APPNAME = 'lv2core'
+VERSION = LV2CORE_VERSION
+
+# Mandatory variables
+top = '.'
+out = 'build'
+
+def options(opt):
+ opt.load('compiler_c')
+ autowaf.set_options(opt)
+ opt.add_option('--bundle-only', action='store_true', default=False,
+ dest='bundle_only',
+ help="Only install bundle (not header or pkg-config file)")
+ opt.add_option('--copy-headers', action='store_true', default=False,
+ dest='copy_headers',
+ help='Copy headers instead of linking to bundle')
+
+def configure(conf):
+ if not hasattr(os.path, 'relpath') and not Options.options.copy_headers:
+ conf.fatal(
+ 'os.path.relpath missing, get Python 2.6 or use --copy-headers')
+
+ conf.load('compiler_c')
+ autowaf.configure(conf)
+
+ autowaf.display_msg(conf, "LV2 bundle directory", conf.env['LV2DIR'])
+ print('')
+
+def write_news(doap_file):
+ import rdflib
+ import textwrap
+ from time import strftime, strptime
+
+ doap = rdflib.Namespace('http://usefulinc.com/ns/doap#')
+ dcs = rdflib.Namespace('http://ontologi.es/doap-changeset#')
+ rdfs = rdflib.Namespace('http://www.w3.org/2000/01/rdf-schema#')
+ foaf = rdflib.Namespace('http://xmlns.com/foaf/0.1/')
+ rdf = rdflib.Namespace('http://www.w3.org/1999/02/22-rdf-syntax-ns#')
+
+ m = rdflib.ConjunctiveGraph()
+
+ try:
+ m.parse(doap_file, format='n3')
+ except:
+ print('warning: %s not found, unable to generate NEWS' % doap_file)
+ return
+
+ spec = m.value(None, rdf.type, doap.Project)
+
+ entries = {}
+ for r in m.triples([spec, doap.release, None]):
+ release = r[2]
+ revision = m.value(release, doap.revision, None) or '9999'
+ date = m.value(release, doap.created, None) or '9999-01-01'
+ blamee = m.value(release, dcs.blame, None)
+ changeset = m.value(release, dcs.changeset, None)
+
+ entry = '%s (%s) stable;\n' % (APPNAME, revision)
+
+ if changeset:
+ for i in m.triples([changeset, dcs.item, None]):
+ entry += '\n * ' + '\n '.join(
+ textwrap.wrap(m.value(i[2], rdfs.label, None), width=79))
+
+ entry += '\n\n -- %s <%s> %s\n\n' % (
+ m.value(blamee, foaf.name, None),
+ m.value(blamee, foaf.mbox, None).replace('mailto:', ''),
+ strftime('%a, %d %b %Y %H:%M:%S +0000', strptime(date, '%Y-%m-%d')))
+
+ entries[revision] = entry
+
+ news = open('NEWS', 'w')
+ for e in sorted(entries.keys(), reverse=True):
+ news.write(entries[e])
+ news.close()
+
+def build(bld):
+ # Header "library"
+ obj = bld(export_includes = ['.'],
+ name = 'liblv2core',
+ target = 'lv2core')
+
+ # Bundle (data)
+ bld.install_files('${LV2DIR}/lv2core.lv2', bld.path.ant_glob('*.ttl'))
+
+ if not Options.options.bundle_only:
+ # Header
+ bld.install_files('${INCLUDEDIR}', 'lv2.h')
+ bld.install_files('${LV2DIR}/lv2core.lv2', 'lv2.h')
+
+ # Pkgconfig file
+ autowaf.build_pc(bld, 'LV2CORE', LV2CORE_VERSION, '', [])
+
+ # URI-like header include
+ include_dir = os.path.join(bld.env['INCLUDEDIR'], 'lv2/lv2plug.in/ns')
+ bundle_dir = os.path.join(bld.env['LV2DIR'], 'lv2core.lv2')
+ if bld.env['COPY_HEADERS']:
+ bld.install_files(os.path.join(include_dir, 'lv2core'),
+ bld.path.ant_glob('*.h'))
+ else:
+ bld.symlink_as(os.path.join(include_dir, 'lv2core'),
+ os.path.relpath(bundle_dir, include_dir))
+
+import pprint
+class Dist(Scripting.Dist):
+ fun = 'dist'
+ cmd = 'dist'
+
+ def archive(self):
+ pprint.pprint(self.exec_dict['bld'].__dict__)
+ print os.path.abspath(top)
+ # Write NEWS file
+ write_news('lv2core.doap.ttl')
+
+ # Build distribution
+ Scripting.Dist.archive(self)
+
+ # Delete generated NEWS file
+ try:
+ os.remove('NEWS')
+ except:
+ pass
+
+class DistCheck(Dist, Scripting.DistCheck):
+ fun = 'distcheck'
+ cmd = 'distcheck'
+
+ def archive(self):
+ Dist.archive(self)