From 3c83ae6ed27e0486a1d5520f1674ee38ba6767c5 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Thu, 31 May 2012 01:13:58 +0000 Subject: Add morph extension. --- lv2/lv2plug.in/ns/ext/morph/manifest.ttl | 9 +++ lv2/lv2plug.in/ns/ext/morph/morph.h | 118 +++++++++++++++++++++++++++++++ lv2/lv2plug.in/ns/ext/morph/morph.ttl | 82 +++++++++++++++++++++ lv2/lv2plug.in/ns/ext/morph/wscript | 1 + 4 files changed, 210 insertions(+) create mode 100644 lv2/lv2plug.in/ns/ext/morph/manifest.ttl create mode 100644 lv2/lv2plug.in/ns/ext/morph/morph.h create mode 100644 lv2/lv2plug.in/ns/ext/morph/morph.ttl create mode 120000 lv2/lv2plug.in/ns/ext/morph/wscript (limited to 'lv2') 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: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 0 ; + lv2:microVersion 0 ; + rdfs:seeAlso . + 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 + + 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 + +#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 +#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: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix morph: . +@prefix xsd: . + + + a lv2:Specification , + lv2:Feature ; + rdfs:seeAlso , + <../../meta/meta.ttl> ; + doap:name "LV2 Morph Port Extension" ; + doap:shortdesc "Ports that can dynamically change type." ; + doap:created "2012-05-22" ; + doap:developer ; + lv2:documentation """ +

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.

+""" . + +morph:MorphPort + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Port ; + rdfs:label "Morph Port" ; + lv2:documentation """ +

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.

+ +

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.

+""" . + +morph:AutoMorphPort + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Port ; + rdfs:label "Auto Morph Port" ; + lv2:documentation """ +

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.

+ +

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.

+ +

This is mainly useful for outputs whose type depends on the type of +corresponding inputs.

+""" . + +morph:interface + a lv2:ExtensionData ; + lv2:documentation """ +

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).

""" . + +morph:supportsType + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain morph:MorphPort ; + rdfs:label "supports type" ; + lv2:documentation """ +

Indicates that a port supports being switched to a certain type via +morph:interface.

+""" . 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 -- cgit v1.2.1