aboutsummaryrefslogtreecommitdiffstats
path: root/lv2/event
diff options
context:
space:
mode:
Diffstat (limited to 'lv2/event')
-rw-r--r--lv2/event/event-helpers.h268
-rw-r--r--lv2/event/event.h304
-rw-r--r--lv2/event/event.meta.ttl246
-rw-r--r--lv2/event/event.ttl86
-rw-r--r--lv2/event/manifest.ttl9
5 files changed, 913 insertions, 0 deletions
diff --git a/lv2/event/event-helpers.h b/lv2/event/event-helpers.h
new file mode 100644
index 0000000..ca3abec
--- /dev/null
+++ b/lv2/event/event-helpers.h
@@ -0,0 +1,268 @@
+/*
+ Copyright 2008-2015 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.
+*/
+
+/**
+ @file event-helpers.h Helper functions for the LV2 Event extension
+ <http://lv2plug.in/ns/ext/event>.
+*/
+
+#ifndef LV2_EVENT_HELPERS_H
+#define LV2_EVENT_HELPERS_H
+
+#include "lv2/core/attributes.h"
+#include "lv2/event/event.h"
+
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+LV2_DISABLE_DEPRECATION_WARNINGS
+
+/** @file
+ * Helper functions for the LV2 Event extension
+ * <http://lv2plug.in/ns/ext/event>.
+ *
+ * These functions are provided for convenience only, use of them is not
+ * required for supporting lv2ev (i.e. the events extension is defined by the
+ * raw buffer format described in lv2_event.h and NOT by this API).
+ *
+ * Note that these functions are all static inline which basically means:
+ * do not take the address of these functions. */
+
+
+/** Pad a size to 64 bits (for event sizes) */
+static inline uint16_t
+lv2_event_pad_size(uint16_t size)
+{
+ return (uint16_t)(size + 7U) & (uint16_t)(~7U);
+}
+
+
+/** Initialize (empty, reset..) an existing event buffer.
+ * The contents of buf are ignored entirely and overwritten, except capacity
+ * which is unmodified. */
+static inline void
+lv2_event_buffer_reset(LV2_Event_Buffer* buf,
+ uint16_t stamp_type,
+ uint8_t* data)
+{
+ buf->data = data;
+ buf->header_size = sizeof(LV2_Event_Buffer);
+ buf->stamp_type = stamp_type;
+ buf->event_count = 0;
+ buf->size = 0;
+}
+
+
+/** Allocate a new, empty event buffer. */
+static inline LV2_Event_Buffer*
+lv2_event_buffer_new(uint32_t capacity, uint16_t stamp_type)
+{
+ const size_t size = sizeof(LV2_Event_Buffer) + capacity;
+ LV2_Event_Buffer* buf = (LV2_Event_Buffer*)malloc(size);
+ if (buf != NULL) {
+ buf->capacity = capacity;
+ lv2_event_buffer_reset(buf, stamp_type, (uint8_t *)(buf + 1));
+ return buf;
+ }
+ return NULL;
+}
+
+
+/** An iterator over an LV2_Event_Buffer.
+ *
+ * Multiple simultaneous read iterators over a single buffer is fine,
+ * but changing the buffer invalidates all iterators. */
+typedef struct {
+ LV2_Event_Buffer* buf;
+ uint32_t offset;
+} LV2_Event_Iterator;
+
+
+/** Reset an iterator to point to the start of `buf`.
+ * @return True if `iter` is valid, otherwise false (buffer is empty) */
+static inline bool
+lv2_event_begin(LV2_Event_Iterator* iter,
+ LV2_Event_Buffer* buf)
+{
+ iter->buf = buf;
+ iter->offset = 0;
+ return (buf->size > 0);
+}
+
+
+/** Check if `iter` is valid.
+ * @return True if `iter` is valid, otherwise false (past end of buffer) */
+static inline bool
+lv2_event_is_valid(LV2_Event_Iterator* iter)
+{
+ return (iter->buf && (iter->offset < iter->buf->size));
+}
+
+
+/** Advance `iter` forward one event.
+ * `iter` must be valid.
+ * @return True if `iter` is valid, otherwise false (reached end of buffer) */
+static inline bool
+lv2_event_increment(LV2_Event_Iterator* iter)
+{
+ if (!lv2_event_is_valid(iter)) {
+ return false;
+ }
+
+ LV2_Event* const ev = (LV2_Event*)(iter->buf->data + iter->offset);
+
+ iter->offset += lv2_event_pad_size(
+ (uint16_t)((uint16_t)sizeof(LV2_Event) + ev->size));
+
+ return true;
+}
+
+
+/** Dereference an event iterator (get the event currently pointed at).
+ * `iter` must be valid.
+ * `data` if non-NULL, will be set to point to the contents of the event
+ * returned.
+ * @return A Pointer to the event `iter` is currently pointing at, or NULL
+ * if the end of the buffer is reached (in which case `data` is
+ * also set to NULL). */
+static inline LV2_Event*
+lv2_event_get(LV2_Event_Iterator* iter,
+ uint8_t** data)
+{
+ if (!lv2_event_is_valid(iter)) {
+ return NULL;
+ }
+
+ LV2_Event* const ev = (LV2_Event*)(iter->buf->data + iter->offset);
+
+ if (data) {
+ *data = (uint8_t*)ev + sizeof(LV2_Event);
+ }
+
+ return ev;
+}
+
+
+/** Write an event at `iter`.
+ * The event (if any) pointed to by `iter` will be overwritten, and `iter`
+ * incremented to point to the following event (i.e. several calls to this
+ * function can be done in sequence without twiddling iter in-between).
+ * @return True if event was written, otherwise false (buffer is full). */
+static inline bool
+lv2_event_write(LV2_Event_Iterator* iter,
+ uint32_t frames,
+ uint32_t subframes,
+ uint16_t type,
+ uint16_t size,
+ const uint8_t* data)
+{
+ if (!iter->buf) {
+ return false;
+ }
+
+ if (iter->buf->capacity - iter->buf->size < sizeof(LV2_Event) + size) {
+ return false;
+ }
+
+ LV2_Event* const ev = (LV2_Event*)(iter->buf->data + iter->offset);
+
+ ev->frames = frames;
+ ev->subframes = subframes;
+ ev->type = type;
+ ev->size = size;
+ memcpy((uint8_t*)ev + sizeof(LV2_Event), data, size);
+ ++iter->buf->event_count;
+
+ size = lv2_event_pad_size((uint16_t)(sizeof(LV2_Event) + size));
+ iter->buf->size += size;
+ iter->offset += size;
+
+ return true;
+}
+
+
+/** Reserve space for an event in the buffer and return a pointer to
+ the memory where the caller can write the event data, or NULL if there
+ is not enough room in the buffer. */
+static inline uint8_t*
+lv2_event_reserve(LV2_Event_Iterator* iter,
+ uint32_t frames,
+ uint32_t subframes,
+ uint16_t type,
+ uint16_t size)
+{
+ const uint16_t total_size = (uint16_t)(sizeof(LV2_Event) + size);
+ if (iter->buf->capacity - iter->buf->size < total_size) {
+ return NULL;
+ }
+
+ LV2_Event* const ev = (LV2_Event*)(iter->buf->data + iter->offset);
+
+ ev->frames = frames;
+ ev->subframes = subframes;
+ ev->type = type;
+ ev->size = size;
+ ++iter->buf->event_count;
+
+ const uint16_t padded_size = lv2_event_pad_size(total_size);
+ iter->buf->size += padded_size;
+ iter->offset += padded_size;
+
+ return (uint8_t*)ev + sizeof(LV2_Event);
+}
+
+
+/** Write an event at `iter`.
+ * The event (if any) pointed to by `iter` will be overwritten, and `iter`
+ * incremented to point to the following event (i.e. several calls to this
+ * function can be done in sequence without twiddling iter in-between).
+ * @return True if event was written, otherwise false (buffer is full). */
+static inline bool
+lv2_event_write_event(LV2_Event_Iterator* iter,
+ const LV2_Event* ev,
+ const uint8_t* data)
+{
+ const uint16_t total_size = (uint16_t)(sizeof(LV2_Event) + ev->size);
+ if (iter->buf->capacity - iter->buf->size < total_size) {
+ return false;
+ }
+
+ LV2_Event* const write_ev = (LV2_Event*)(iter->buf->data + iter->offset);
+
+ *write_ev = *ev;
+ memcpy((uint8_t*)write_ev + sizeof(LV2_Event), data, ev->size);
+ ++iter->buf->event_count;
+
+ const uint16_t padded_size = lv2_event_pad_size(total_size);
+ iter->buf->size += padded_size;
+ iter->offset += padded_size;
+
+ return true;
+}
+
+LV2_RESTORE_WARNINGS
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* LV2_EVENT_HELPERS_H */
diff --git a/lv2/event/event.h b/lv2/event/event.h
new file mode 100644
index 0000000..aa67390
--- /dev/null
+++ b/lv2/event/event.h
@@ -0,0 +1,304 @@
+/*
+ Copyright 2008-2016 David Robillard <http://drobilla.net>
+ Copyright 2006-2007 Lars Luthman <lars.luthman@gmail.com>
+
+ 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 event Event
+ @ingroup lv2
+
+ Generic time-stamped events, see <http://lv2plug.in/ns/ext/event> for
+ details.
+
+ @{
+*/
+
+#ifndef LV2_EVENT_H
+#define LV2_EVENT_H
+
+#define LV2_EVENT_URI "http://lv2plug.in/ns/ext/event" ///< http://lv2plug.in/ns/ext/event
+#define LV2_EVENT_PREFIX LV2_EVENT_URI "#" ///< http://lv2plug.in/ns/ext/event#
+
+#define LV2_EVENT__Event LV2_EVENT_PREFIX "Event" ///< http://lv2plug.in/ns/ext/event#Event
+#define LV2_EVENT__EventPort LV2_EVENT_PREFIX "EventPort" ///< http://lv2plug.in/ns/ext/event#EventPort
+#define LV2_EVENT__FrameStamp LV2_EVENT_PREFIX "FrameStamp" ///< http://lv2plug.in/ns/ext/event#FrameStamp
+#define LV2_EVENT__TimeStamp LV2_EVENT_PREFIX "TimeStamp" ///< http://lv2plug.in/ns/ext/event#TimeStamp
+#define LV2_EVENT__generatesTimeStamp LV2_EVENT_PREFIX "generatesTimeStamp" ///< http://lv2plug.in/ns/ext/event#generatesTimeStamp
+#define LV2_EVENT__generic LV2_EVENT_PREFIX "generic" ///< http://lv2plug.in/ns/ext/event#generic
+#define LV2_EVENT__inheritsEvent LV2_EVENT_PREFIX "inheritsEvent" ///< http://lv2plug.in/ns/ext/event#inheritsEvent
+#define LV2_EVENT__inheritsTimeStamp LV2_EVENT_PREFIX "inheritsTimeStamp" ///< http://lv2plug.in/ns/ext/event#inheritsTimeStamp
+#define LV2_EVENT__supportsEvent LV2_EVENT_PREFIX "supportsEvent" ///< http://lv2plug.in/ns/ext/event#supportsEvent
+#define LV2_EVENT__supportsTimeStamp LV2_EVENT_PREFIX "supportsTimeStamp" ///< http://lv2plug.in/ns/ext/event#supportsTimeStamp
+
+#define LV2_EVENT_AUDIO_STAMP 0 ///< Special timestamp type for audio frames
+
+#include "lv2/core/attributes.h"
+
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+LV2_DISABLE_DEPRECATION_WARNINGS
+
+/**
+ The best Pulses Per Quarter Note for tempo-based uint32_t timestamps.
+ Equal to 2^12 * 5 * 7 * 9 * 11 * 13 * 17, which is evenly divisble
+ by all integers from 1 through 18 inclusive, and powers of 2 up to 2^12.
+*/
+LV2_DEPRECATED
+static const uint32_t LV2_EVENT_PPQN = 3136573440U;
+
+/**
+ An LV2 event (header only).
+
+ LV2 events are generic time-stamped containers for any type of event.
+ The type field defines the format of a given event's contents.
+
+ This struct defines the header of an LV2 event. An LV2 event is a single
+ chunk of POD (plain old data), usually contained in a flat buffer (see
+ LV2_EventBuffer below). Unless a required feature says otherwise, hosts may
+ assume a deep copy of an LV2 event can be created safely using a simple:
+
+ memcpy(ev_copy, ev, sizeof(LV2_Event) + ev->size); (or equivalent)
+*/
+LV2_DEPRECATED
+typedef struct {
+ /**
+ The frames portion of timestamp. The units used here can optionally be
+ set for a port (with the lv2ev:timeUnits property), otherwise this is
+ audio frames, corresponding to the sample_count parameter of the LV2 run
+ method (frame 0 is the first frame for that call to run).
+ */
+ uint32_t frames;
+
+ /**
+ The sub-frames portion of timestamp. The units used here can optionally
+ be set for a port (with the lv2ev:timeUnits property), otherwise this is
+ 1/(2^32) of an audio frame.
+ */
+ uint32_t subframes;
+
+ /**
+ The type of this event, as a number which represents some URI
+ defining an event type. This value MUST be some value previously
+ returned from a call to the uri_to_id function defined in the LV2
+ URI map extension (see lv2_uri_map.h).
+ There are special rules which must be followed depending on the type
+ of an event. If the plugin recognizes an event type, the definition
+ of that event type will describe how to interpret the event, and
+ any required behaviour. Otherwise, if the type is 0, this event is a
+ non-POD event and lv2_event_unref MUST be called if the event is
+ 'dropped' (see above). Even if the plugin does not understand an event,
+ it may pass the event through to an output by simply copying (and NOT
+ calling lv2_event_unref). These rules are designed to allow for generic
+ event handling plugins and large non-POD events, but with minimal hassle
+ on simple plugins that "don't care" about these more advanced features.
+ */
+ uint16_t type;
+
+ /**
+ The size of the data portion of this event in bytes, which immediately
+ follows. The header size (12 bytes) is not included in this value.
+ */
+ uint16_t size;
+
+ /* size bytes of data follow here */
+} LV2_Event;
+
+
+/**
+ A buffer of LV2 events (header only).
+
+ Like events (which this contains) an event buffer is a single chunk of POD:
+ the entire buffer (including contents) can be copied with a single memcpy.
+ The first contained event begins sizeof(LV2_EventBuffer) bytes after the
+ start of this struct.
+
+ After this header, the buffer contains an event header (defined by struct
+ LV2_Event), followed by that event's contents (padded to 64 bits), followed
+ by another header, etc:
+
+ | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | |
+ |FRAMES |SUBFRMS|TYP|LEN|DATA..DATA..PAD|FRAMES | ...
+*/
+LV2_DEPRECATED
+typedef struct {
+ /**
+ The contents of the event buffer. This may or may not reside in the
+ same block of memory as this header, plugins must not assume either.
+ The host guarantees this points to at least capacity bytes of allocated
+ memory (though only size bytes of that are valid events).
+ */
+ uint8_t* data;
+
+ /**
+ The size of this event header in bytes (including everything).
+
+ This is to allow for extending this header in the future without
+ breaking binary compatibility. Whenever this header is copied,
+ it MUST be done using this field (and NOT the sizeof this struct).
+ */
+ uint16_t header_size;
+
+ /**
+ The type of the time stamps for events in this buffer.
+ As a special exception, '0' always means audio frames and subframes
+ (1/UINT32_MAX'th of a frame) in the sample rate passed to instantiate.
+
+ INPUTS: The host must set this field to the numeric ID of some URI
+ defining the meaning of the frames/subframes fields of contained events
+ (obtained by the LV2 URI Map uri_to_id function with the URI of this
+ extension as the 'map' argument, see lv2_uri_map.h). The host must
+ never pass a plugin a buffer which uses a stamp type the plugin does not
+ 'understand'. The value of this field must never change, except when
+ connect_port is called on the input port, at which time the host MUST
+ have set the stamp_type field to the value that will be used for all
+ subsequent run calls.
+
+ OUTPUTS: The plugin may set this to any value that has been returned
+ from uri_to_id with the URI of this extension for a 'map' argument.
+ When connected to a buffer with connect_port, output ports MUST set this
+ field to the type of time stamp they will be writing. On any call to
+ connect_port on an event input port, the plugin may change this field on
+ any output port, it is the responsibility of the host to check if any of
+ these values have changed and act accordingly.
+ */
+ uint16_t stamp_type;
+
+ /**
+ The number of events in this buffer.
+
+ INPUTS: The host must set this field to the number of events contained
+ in the data buffer before calling run(). The plugin must not change
+ this field.
+
+ OUTPUTS: The plugin must set this field to the number of events it has
+ written to the buffer before returning from run(). Any initial value
+ should be ignored by the plugin.
+ */
+ uint32_t event_count;
+
+ /**
+ The size of the data buffer in bytes.
+ This is set by the host and must not be changed by the plugin.
+ The host is allowed to change this between run() calls.
+ */
+ uint32_t capacity;
+
+ /**
+ The size of the initial portion of the data buffer containing data.
+
+ INPUTS: The host must set this field to the number of bytes used
+ by all events it has written to the buffer (including headers)
+ before calling the plugin's run().
+ The plugin must not change this field.
+
+ OUTPUTS: The plugin must set this field to the number of bytes
+ used by all events it has written to the buffer (including headers)
+ before returning from run().
+ Any initial value should be ignored by the plugin.
+ */
+ uint32_t size;
+} LV2_Event_Buffer;
+
+
+/**
+ Opaque pointer to host data.
+*/
+LV2_DEPRECATED
+typedef void* LV2_Event_Callback_Data;
+
+
+/**
+ Non-POD events feature.
+
+ To support this feature the host must pass an LV2_Feature struct to the
+ plugin's instantiate method with URI "http://lv2plug.in/ns/ext/event"
+ and data pointed to an instance of this struct. Note this feature
+ is not mandatory to support the event extension.
+*/
+LV2_DEPRECATED
+typedef struct {
+ /**
+ Opaque pointer to host data.
+
+ The plugin MUST pass this to any call to functions in this struct.
+ Otherwise, it must not be interpreted in any way.
+ */
+ LV2_Event_Callback_Data callback_data;
+
+ /**
+ Take a reference to a non-POD event.
+
+ If a plugin receives an event with type 0, it means the event is a
+ pointer to some object in memory and not a flat sequence of bytes
+ in the buffer. When receiving a non-POD event, the plugin already
+ has an implicit reference to the event. If the event is stored AND
+ passed to an output, lv2_event_ref MUST be called on that event.
+ If the event is only stored OR passed through, this is not necessary
+ (as the plugin already has 1 implicit reference).
+
+ @param event An event received at an input that will not be copied to
+ an output or stored in any way.
+
+ @param context The calling context. Like event types, this is a mapped
+ URI, see lv2_context.h. Simple plugin with just a run() method should
+ pass 0 here (the ID of the 'standard' LV2 run context). The host
+ guarantees that this function is realtime safe iff the context is
+ realtime safe.
+
+ PLUGINS THAT VIOLATE THESE RULES MAY CAUSE CRASHES AND MEMORY LEAKS.
+ */
+ uint32_t (*lv2_event_ref)(LV2_Event_Callback_Data callback_data,
+ LV2_Event* event);
+
+ /**
+ Drop a reference to a non-POD event.
+
+ If a plugin receives an event with type 0, it means the event is a
+ pointer to some object in memory and not a flat sequence of bytes
+ in the buffer. If the plugin does not pass the event through to
+ an output or store it internally somehow, it MUST call this function
+ on the event (more information on using non-POD events below).
+
+ @param event An event received at an input that will not be copied to an
+ output or stored in any way.
+
+ @param context The calling context. Like event types, this is a mapped
+ URI, see lv2_context.h. Simple plugin with just a run() method should
+ pass 0 here (the ID of the 'standard' LV2 run context). The host
+ guarantees that this function is realtime safe iff the context is
+ realtime safe.
+
+ PLUGINS THAT VIOLATE THESE RULES MAY CAUSE CRASHES AND MEMORY LEAKS.
+ */
+ uint32_t (*lv2_event_unref)(LV2_Event_Callback_Data callback_data,
+ LV2_Event* event);
+} LV2_Event_Feature;
+
+LV2_RESTORE_WARNINGS
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* LV2_EVENT_H */
+
+/**
+ @}
+*/
diff --git a/lv2/event/event.meta.ttl b/lv2/event/event.meta.ttl
new file mode 100644
index 0000000..80593ce
--- /dev/null
+++ b/lv2/event/event.meta.ttl
@@ -0,0 +1,246 @@
+@prefix dcs: <http://ontologi.es/doap-changeset#> .
+@prefix doap: <http://usefulinc.com/ns/doap#> .
+@prefix ev: <http://lv2plug.in/ns/ext/event#> .
+@prefix foaf: <http://xmlns.com/foaf/0.1/> .
+@prefix lv2: <http://lv2plug.in/ns/lv2core#> .
+@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+
+<http://lv2plug.in/ns/ext/event>
+ a doap:Project ;
+ doap:license <http://opensource.org/licenses/isc> ;
+ doap:name "LV2 Event" ;
+ doap:shortdesc "A port-based real-time generic event interface." ;
+ doap:created "2008-00-00" ;
+ doap:developer <http://drobilla.net/drobilla#me> ,
+ <http://lv2plug.in/ns/meta#larsl> ;
+ doap:release [
+ doap:revision "1.12" ;
+ doap:created "2014-08-08" ;
+ doap:file-release <http://lv2plug.in/spec/lv2-1.10.0.tar.bz2> ;
+ dcs:blame <http://drobilla.net/drobilla#me> ;
+ dcs:changeset [
+ dcs:item [
+ rdfs:label "Minor documentation improvements."
+ ]
+ ]
+ ] , [
+ doap:revision "1.10" ;
+ doap:created "2013-01-13" ;
+ doap:file-release <http://lv2plug.in/spec/lv2-1.4.0.tar.bz2> ;
+ dcs:blame <http://drobilla.net/drobilla#me> ;
+ dcs:changeset [
+ dcs:item [
+ rdfs:label "Fix incorrect return type in lv2_event_get()."
+ ]
+ ]
+ ] , [
+ doap:revision "1.8" ;
+ doap:created "2012-10-14" ;
+ doap:file-release <http://lv2plug.in/spec/lv2-1.2.0.tar.bz2> ;
+ dcs:blame <http://drobilla.net/drobilla#me> ;
+ dcs:changeset [
+ dcs:item [
+ rdfs:label "Make event iterator gracefully handle optional ports."
+ ] , [
+ rdfs:label "Remove asserts from event-helper.h."
+ ] , [
+ rdfs:label "Use more precise domain and range for EventPort properties."
+ ] , [
+ rdfs:label "Use consistent label style."
+ ]
+ ]
+ ] , [
+ doap:revision "1.6" ;
+ doap:created "2012-04-17" ;
+ doap:file-release <http://lv2plug.in/spec/lv2-1.0.0.tar.bz2> ;
+ dcs:blame <http://drobilla.net/drobilla#me> ;
+ dcs:changeset [
+ dcs:item [
+ rdfs:label "Fix bug in lv2_event_reserve()."
+ ] , [
+ rdfs:label "Fix incorrect ranges of some properties."
+ ] , [
+ rdfs:label "Merge with unified LV2 package."
+ ]
+ ]
+ ] , [
+ doap:revision "1.4" ;
+ doap:created "2011-11-21" ;
+ doap:file-release <http://lv2plug.in/spec/lv2-event-1.4.tar.bz2> ;
+ dcs:blame <http://drobilla.net/drobilla#me> ;
+ dcs:changeset [
+ dcs:item [
+ rdfs:label "Update packaging."
+ ]
+ ]
+ ] , [
+ doap:revision "1.2" ;
+ doap:created "2011-05-26" ;
+ doap:file-release <http://lv2plug.in/spec/lv2-event-1.2.tar.bz2> ;
+ dcs:blame <http://drobilla.net/drobilla#me> ;
+ dcs:changeset [
+ dcs:item [
+ rdfs:label "Add build system (for installation)."
+ ] , [
+ rdfs:label "Convert documentation to HTML and use lv2:documentation."
+ ] , [
+ rdfs:label "Use lv2:Specification to be discovered as an extension."
+ ]
+ ]
+ ] , [
+ doap:revision "1.0" ;
+ doap:created "2010-11-24" ;
+ doap:file-release <http://lv2plug.in/spec/lv2-event-1.0.tar.gz> ;
+ dcs:blame <http://drobilla.net/drobilla#me> ;
+ dcs:changeset [
+ dcs:item [
+ rdfs:label "Initial release."
+ ]
+ ]
+ ] ;
+ lv2:documentation """
+
+<span class="warning">This extension is deprecated.</span> New implementations
+should use <a href="atom.html">LV2 Atom</a> instead.
+
+This extension defines a generic time-stamped event port type, which can be
+used to create plugins that read and write real-time events, such as MIDI,
+OSC, or any other type of event payload. The type(s) of event supported by
+a port is defined in the data file for a plugin, for example:
+
+ :::turtle
+ &lt;http://example.org/some-plugin&gt;
+ lv2:port [
+ a ev:EventPort, lv2:InputPort ;
+ lv2:index 0 ;
+ ev:supportsEvent &lt;http://lv2plug.in/ns/ext/midi#MidiEvent&gt; ;
+ lv2:symbol "midi_input" ;
+ lv2:name "MIDI input" ;
+ ] .
+
+"""^^lv2:Markdown .
+
+ev:EventPort
+ lv2:documentation """
+
+Ports of this type will be connected to a struct of type LV2_Event_Buffer,
+defined in event.h. These ports contain a sequence of generic events (possibly
+several types mixed in a single stream), the specific types of which are
+defined by some URI in another LV2 extension.
+
+"""^^lv2:Markdown .
+
+ev:Event
+ a rdfs:Class ;
+ rdfs:label "Event" ;
+ lv2:documentation """
+
+An ev:EventPort contains an LV2_Event_Buffer which contains a sequence of these
+events. The binary format of LV2 events is defined by the LV2_Event struct in
+event.h.
+
+Specific event types (such as MIDI or OSC) are defined by extensions, and
+should be rdfs:subClassOf this class.
+
+"""^^lv2:Markdown .
+
+ev:TimeStamp
+ lv2:documentation """
+
+This defines the meaning of the 'frames' and 'subframes' fields of an LV2_Event
+(both unsigned 32-bit integers).
+
+"""^^lv2:Markdown .
+
+ev:FrameStamp
+ lv2:documentation """
+
+The default time stamp unit for an LV2 event: the frames field represents audio
+frames (in the sample rate passed to intantiate), and the subframes field is
+1/UINT32_MAX of a frame.
+
+"""^^lv2:Markdown .
+
+ev:generic
+ lv2:documentation """
+
+Indicates that this port does something meaningful for any event type. This is
+useful for things like event mixers, delays, serialisers, and so on.
+
+If this property is set, hosts should consider the port suitable for any type
+of event. Otherwise, hosts should consider the port 'appropriate' only for the
+specific event types listed with :supportsEvent. Note that plugins must
+gracefully handle unknown event types whether or not this property is present.
+
+"""^^lv2:Markdown .
+
+ev:supportsEvent
+ lv2:documentation """
+
+Indicates that this port supports or "understands" a certain event type.
+
+For input ports, this means the plugin understands and does something useful
+with events of this type. For output ports, this means the plugin may generate
+events of this type. If the plugin never actually generates events of this
+type, but might pass them through from an input, this property should not be
+set (use ev:inheritsEvent for that).
+
+Plugins with event input ports must always gracefully handle any type of event,
+even if it does not 'support' it. This property should always be set for event
+types the plugin understands/generates so hosts can discover plugins
+appropriate for a given scenario (for example, plugins with a MIDI input).
+Hosts are not expected to consider event ports suitable for some type of event
+if the relevant :supportsEvent property is not set, unless the ev:generic
+property for that port is also set.
+
+
+"""^^lv2:Markdown .
+
+ev:inheritsEvent
+ lv2:documentation """
+
+Indicates that this output port might pass through events that arrived at some
+other input port (or generate an event of the same type as events arriving at
+that input). The host must always check the stamp type of all outputs when
+connecting an input, but this property should be set whenever it applies.
+
+
+"""^^lv2:Markdown .
+
+ev:supportsTimeStamp
+ lv2:documentation """
+
+Indicates that this port supports or "understands" a certain time stamp type.
+Meaningful only for input ports, the host must never connect a port to an event
+buffer with a time stamp type that isn't supported by the port.
+
+"""^^lv2:Markdown .
+
+ev:generatesTimeStamp
+ lv2:documentation """
+
+Indicates that this port may output a certain time stamp type, regardless of
+the time stamp type of any input ports.
+
+If the port outputs stamps based on what type inputs are connected to, this
+property should not be set (use the ev:inheritsTimeStamp property for that).
+Hosts MUST check the time_stamp value of any output port buffers after a call
+to connect_port on ANY event input port on the plugin.
+
+If the plugin changes the stamp_type field of an output event buffer during a
+call to run(), the plugin must call the stamp_type_changed function provided by
+the host in the LV2_Event_Feature struct, if it is non-NULL.
+
+"""^^lv2:Markdown .
+
+ev:inheritsTimeStamp
+ lv2:documentation """
+
+Indicates that this port follows the time stamp type of an input port.
+
+This property is not necessary, but it should be set for outputs that base
+their output type on an input port so the host can make more sense of the
+plugin and provide a more sensible interface.
+
+"""^^lv2:Markdown .
+
diff --git a/lv2/event/event.ttl b/lv2/event/event.ttl
new file mode 100644
index 0000000..de400d4
--- /dev/null
+++ b/lv2/event/event.ttl
@@ -0,0 +1,86 @@
+@prefix ev: <http://lv2plug.in/ns/ext/event#> .
+@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#> .
+
+<http://lv2plug.in/ns/ext/event>
+ a owl:Ontology ;
+ owl:deprecated true ;
+ rdfs:label "LV2 Event" ;
+ rdfs:comment "A port-based real-time generic event interface." ;
+ rdfs:seeAlso <event.h> ,
+ <event-helpers.h> ,
+ <event.meta.ttl> .
+
+ev:EventPort
+ a rdfs:Class ;
+ rdfs:label "Event Port" ;
+ rdfs:subClassOf lv2:Port ;
+ rdfs:comment "An LV2 event port." .
+
+ev:Event
+ a rdfs:Class ;
+ rdfs:label "Event" ;
+ rdfs:comment "A single generic time-stamped event." .
+
+ev:TimeStamp
+ a rdfs:Class ;
+ rdfs:label "Event Time Stamp" ;
+ rdfs:comment "The time stamp of an Event." .
+
+ev:FrameStamp
+ a rdfs:Class ;
+ rdfs:subClassOf ev:TimeStamp ;
+ rdfs:label "Audio Frame Time Stamp" ;
+ rdfs:comment "The default time stamp unit for an event." .
+
+ev:generic
+ a lv2:PortProperty ;
+ rdfs:label "generic event port" ;
+ rdfs:comment "Port works with generic events." .
+
+ev:supportsEvent
+ a rdf:Property ,
+ owl:ObjectProperty ;
+ rdfs:domain ev:EventPort ;
+ rdfs:range rdfs:Class ;
+ rdfs:label "supports event type" ;
+ rdfs:comment "An event type supported by this port." .
+
+ev:inheritsEvent
+ a rdf:Property ,
+ owl:ObjectProperty ;
+ rdfs:domain ev:EventPort ,
+ lv2:OutputPort ;
+ rdfs:range lv2:Port ;
+ rdfs:label "inherits event type" ;
+ rdfs:comment "Output port inherits event types from an input port." .
+
+ev:supportsTimeStamp
+ a rdf:Property ,
+ owl:ObjectProperty ;
+ rdfs:domain ev:EventPort ,
+ lv2:InputPort ;
+ rdfs:range rdfs:Class ;
+ rdfs:label "supports time stamp type" ;
+ rdfs:comment "A time stamp type suported by this input port." .
+
+ev:generatesTimeStamp
+ a rdf:Property ,
+ owl:ObjectProperty ;
+ rdfs:domain ev:EventPort ,
+ lv2:OutputPort ;
+ rdfs:range rdfs:Class ;
+ rdfs:label "generates time stamp type" ;
+ rdfs:comment "A time stamp type generated by this input port." .
+
+ev:inheritsTimeStamp
+ a rdf:Property ,
+ owl:ObjectProperty ;
+ rdfs:domain ev:EventPort ,
+ lv2:OutputPort ;
+ rdfs:range lv2:Port ;
+ rdfs:label "inherits time stamp type" ;
+ rdfs:comment "Output port inherits time stamp types from an input port." .
+
diff --git a/lv2/event/manifest.ttl b/lv2/event/manifest.ttl
new file mode 100644
index 0000000..0194d71
--- /dev/null
+++ b/lv2/event/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/event>
+ a lv2:Specification ;
+ lv2:minorVersion 1 ;
+ lv2:microVersion 12 ;
+ rdfs:seeAlso <event.ttl> .
+