diff options
author | David Robillard <d@drobilla.net> | 2012-05-31 01:13:58 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2012-05-31 01:13:58 +0000 |
commit | 3c83ae6ed27e0486a1d5520f1674ee38ba6767c5 (patch) | |
tree | 3678a57b3c1802b60072937218d89c93973ff04d /lv2/lv2plug.in/ns/ext/morph | |
parent | 338857fe5f2525f50c9105969d2b07cbc8415940 (diff) | |
download | lv2-3c83ae6ed27e0486a1d5520f1674ee38ba6767c5.tar.xz |
Add morph extension.
Diffstat (limited to 'lv2/lv2plug.in/ns/ext/morph')
-rw-r--r-- | lv2/lv2plug.in/ns/ext/morph/manifest.ttl | 9 | ||||
-rw-r--r-- | lv2/lv2plug.in/ns/ext/morph/morph.h | 118 | ||||
-rw-r--r-- | lv2/lv2plug.in/ns/ext/morph/morph.ttl | 82 | ||||
l--------- | lv2/lv2plug.in/ns/ext/morph/wscript | 1 |
4 files changed, 210 insertions, 0 deletions
diff --git a/lv2/lv2plug.in/ns/ext/morph/manifest.ttl b/lv2/lv2plug.in/ns/ext/morph/manifest.ttl new file mode 100644 index 0000000..1b578c0 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/morph/manifest.ttl @@ -0,0 +1,9 @@ +@prefix lv2: <http://lv2plug.in/ns/lv2core#> . +@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . + +<http://lv2plug.in/ns/ext/morph> + a lv2:Specification ; + lv2:minorVersion 0 ; + lv2:microVersion 0 ; + rdfs:seeAlso <morph.ttl> . + diff --git a/lv2/lv2plug.in/ns/ext/morph/morph.h b/lv2/lv2plug.in/ns/ext/morph/morph.h new file mode 100644 index 0000000..e411e10 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/morph/morph.h @@ -0,0 +1,118 @@ +/* + Copyright 2012 David Robillard <http://drobilla.net> + + 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. +*/ + +#ifndef LV2_MORPH_H +#define LV2_MORPH_H + +#include <stdint.h> + +#include "lv2/lv2plug.in/ns/lv2core/lv2.h" +#include "lv2/lv2plug.in/ns/ext/urid/urid.h" + +#define LV2_MORPH_URI "http://lv2plug.in/ns/ext/morph" +#define LV2_MORPH_PREFIX LV2_MORPH_URI "#" + +#define LV2_MORPH__AutoMorphPort LV2_MORPH_PREFIX "AutoMorphPort" +#define LV2_MORPH__MorphPort LV2_MORPH_PREFIX "MorphPort" +#define LV2_MORPH__interface LV2_MORPH_PREFIX "interface" +#define LV2_MORPH__supportsType LV2_MORPH_PREFIX "supportsType" + +#ifdef __cplusplus +extern "C" { +#else +# include <stdbool.h> +#endif + +typedef enum { + LV2_MORPH_SUCCESS = 0, /**< Completed successfully. */ + LV2_MORPH_ERR_UNKNOWN = 1, /**< Unknown error. */ + LV2_MORPH_ERR_BAD_TYPE = 2, /**< Unsupported type. */ + LV2_MORPH_ERR_BAD_PORT = 3 /**< Port is not morphable. */ +} LV2_Morph_Status; + +/** A port property. */ +typedef struct { + LV2_URID key; /**< Key (predicate) */ + uint32_t size; /**< Value size */ + LV2_URID type; /**< Value type */ + const void* value; /**< Value (object) */ +} LV2_Morph_Property; + +/** The interface provided by a plugin to support morph ports. */ +typedef struct { + /** + Morph a port to a different type. + + This function is in the audio threading class. + + This function MAY return an error, in which case the port's type was not + changed. If the type was changed and the plugin has AutoMorphPort + ports, the host MUST check the type of every AutoMorphPort using the + port_type() function since they may have changed. + + This function MUST gracefully handle being called for ports that are not + MorpPorts by ignoring the request and returning LV2_MORPH_ERR_BAD_PORT. + + A NULL-terminated array of additional properties to set on the port may + be passed via @p properties. These properties and their values are + owned by the caller and valid only for the duration of the call. + + @param instance The plugin instance. + @param port The index of the port to change the type of. + @param type The new port type URID. + @param properties Additional properties to set, or NULL. + */ + LV2_Morph_Status (*morph_port)(LV2_Handle instance, + uint32_t port, + LV2_URID type, + const LV2_Morph_Property*const* properties); + + /** + Get the type of an AutoMorphPort. + + This function is in the audio threading class. + + If the plugin has no auto morph ports, this field may be NULL. This + function may only be called for ports which are AutoMorphPorts. + + This function MAY return 0, which indicates that the current + configuration of MorphPort types is invalid and the port is + non-functional. If the port is not lv2:connectionOptional, then the + plugin MUST NOT be used. + + The @p properties parameter may be used to get additional properties of + the port. To do so, the host passes a NULL-terminated property array + with keys set to the desired properties and all other fields zeroed. + The plugin sets these fields appropriately if possible. The data + pointed to is owned by the plugin and only valid until the next call to + a method on this plugin (this mechanism is only meant for accessing + simple properties, such as buffer size). + + @param instance The plugin instance. + @param port The index of the port to return the type of. + @param properties Additional properties to get, or NULL. + @return The current type of the port. + */ + LV2_URID (*port_type)(LV2_Handle instance, + uint32_t port, + LV2_Morph_Property*const* properties); +} LV2_Morph_Interface; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV2_MORPH_H */ diff --git a/lv2/lv2plug.in/ns/ext/morph/morph.ttl b/lv2/lv2plug.in/ns/ext/morph/morph.ttl new file mode 100644 index 0000000..39e1ced --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/morph/morph.ttl @@ -0,0 +1,82 @@ +@prefix dcs: <http://ontologi.es/doap-changeset#> . +@prefix doap: <http://usefulinc.com/ns/doap#> . +@prefix foaf: <http://xmlns.com/foaf/0.1/> . +@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 morph: <http://lv2plug.in/ns/ext/morph#> . +@prefix xsd: <http://www.w3.org/2001/XMLSchema#> . + +<http://lv2plug.in/ns/ext/morph> + a lv2:Specification , + lv2:Feature ; + rdfs:seeAlso <morph.h> , + <../../meta/meta.ttl> ; + doap:name "LV2 Morph Port Extension" ; + doap:shortdesc "Ports that can dynamically change type." ; + doap:created "2012-05-22" ; + doap:developer <http://drobilla.net/drobilla#me> ; + lv2:documentation """ +<p>This extension defines two port types: morph:MorphPort, which has a +host-configurable type, and morph:AutoMorphPort, which may change type based on +the type of other ports. These ports always have a default type and work +normally work in hosts that are unaware of this extension. Thus, this +extension provides a backwards compatibility mechanism which allows plugins to +use new port types but gracefully fall back to a default type in hosts that do +not support them.</p> +""" . + +morph:MorphPort + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Port ; + rdfs:label "Morph Port" ; + lv2:documentation """ +<p>Ports of this type MUST have another type which defines the default buffer +format (e.g. lv2:ControlPort) but can be dynamically changed to a different +type in hosts that support morph:interface.</p> + +<p>The host may change the type of a MorphPort by calling +LV2_Morph_Port_Interface::morph_port(). If the plugin has any +morph:AutoMorphPort ports, the host MUST check their types after changing any +port type since they may have changed.</p> +""" . + +morph:AutoMorphPort + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Port ; + rdfs:label "Auto Morph Port" ; + lv2:documentation """ +<p>Ports of this type MUST have another type which defines the default buffer +format (e.g. lv2:ControlPort) but may dynamically change types based on the +configured types of any morph:MorphPort ports on the same plugin instance.</p> + +<p>The type of a port may only change in response to a call to +LV2_Morph_Port_Interface::morph_port(), i.e. ports can only change type as a +result of an explicit host request. Whenever any port type on the instance +changes, the host MUST check the type of all morph:AutoMorphPort ports on the +instance before calling run() again, since they may have changed.</p> + +<p>This is mainly useful for outputs whose type depends on the type of +corresponding inputs.</p> +""" . + +morph:interface + a lv2:ExtensionData ; + lv2:documentation """ +<p>The interface provided by the plugin to support morph ports. To support +this extension, the plugin must return a LV2_Morph_Port_Interface from +LV2_Descriptor::extension_data() when it is called with this URI +(LV2_STATE__interface).</p> """ . + +morph:supportsType + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain morph:MorphPort ; + rdfs:label "supports type" ; + lv2:documentation """ +<p>Indicates that a port supports being switched to a certain type via +morph:interface.</p> +""" . diff --git a/lv2/lv2plug.in/ns/ext/morph/wscript b/lv2/lv2plug.in/ns/ext/morph/wscript new file mode 120000 index 0000000..7e2c01b --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/morph/wscript @@ -0,0 +1 @@ +../../../../../ext.wscript
\ No newline at end of file |