From ed78bbe5ba12be1f9bcc736f14c51da6b4f639f3 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Wed, 8 Feb 2012 04:56:24 +0000 Subject: Rearrange tree so top level can be used as an include path for standard style LV2 includes. --- lv2/lv2plug.in/ns/ext/atom/atom-helpers.h | 310 ++++++++ lv2/lv2plug.in/ns/ext/atom/atom-test.c | 304 +++++++ lv2/lv2plug.in/ns/ext/atom/atom.h | 203 +++++ lv2/lv2plug.in/ns/ext/atom/atom.ttl | 462 +++++++++++ lv2/lv2plug.in/ns/ext/atom/ext.pc.in | 1 + lv2/lv2plug.in/ns/ext/atom/forge.h | 445 +++++++++++ lv2/lv2plug.in/ns/ext/atom/manifest.ttl | 9 + lv2/lv2plug.in/ns/ext/atom/waf | 1 + lv2/lv2plug.in/ns/ext/atom/wscript | 1 + lv2/lv2plug.in/ns/ext/contexts/contexts.h | 82 ++ lv2/lv2plug.in/ns/ext/contexts/contexts.ttl | 134 ++++ lv2/lv2plug.in/ns/ext/contexts/ext.pc.in | 1 + lv2/lv2plug.in/ns/ext/contexts/manifest.ttl | 9 + lv2/lv2plug.in/ns/ext/contexts/test.c | 67 ++ lv2/lv2plug.in/ns/ext/contexts/waf | 1 + lv2/lv2plug.in/ns/ext/contexts/wscript | 1 + lv2/lv2plug.in/ns/ext/cv-port/cv-port.ttl | 77 ++ lv2/lv2plug.in/ns/ext/cv-port/ext.pc.in | 1 + lv2/lv2plug.in/ns/ext/cv-port/manifest.ttl | 9 + lv2/lv2plug.in/ns/ext/cv-port/waf | 1 + lv2/lv2plug.in/ns/ext/cv-port/wscript | 1 + lv2/lv2plug.in/ns/ext/data-access/data-access.h | 56 ++ lv2/lv2plug.in/ns/ext/data-access/data-access.ttl | 82 ++ lv2/lv2plug.in/ns/ext/data-access/ext.pc.in | 1 + lv2/lv2plug.in/ns/ext/data-access/manifest.ttl | 9 + lv2/lv2plug.in/ns/ext/data-access/waf | 1 + lv2/lv2plug.in/ns/ext/data-access/wscript | 1 + lv2/lv2plug.in/ns/ext/dynmanifest/dynmanifest.h | 144 ++++ lv2/lv2plug.in/ns/ext/dynmanifest/dynmanifest.ttl | 107 +++ lv2/lv2plug.in/ns/ext/dynmanifest/ext.pc.in | 1 + .../ns/ext/dynmanifest/lv2-dynmanifest.doap.ttl | 43 + lv2/lv2plug.in/ns/ext/dynmanifest/manifest.ttl | 9 + lv2/lv2plug.in/ns/ext/dynmanifest/waf | 1 + lv2/lv2plug.in/ns/ext/dynmanifest/wscript | 1 + lv2/lv2plug.in/ns/ext/event/event-helpers.h | 246 ++++++ lv2/lv2plug.in/ns/ext/event/event.h | 281 +++++++ lv2/lv2plug.in/ns/ext/event/event.ttl | 224 ++++++ lv2/lv2plug.in/ns/ext/event/ext.pc.in | 1 + lv2/lv2plug.in/ns/ext/event/manifest.ttl | 9 + lv2/lv2plug.in/ns/ext/event/waf | 1 + lv2/lv2plug.in/ns/ext/event/wscript | 1 + lv2/lv2plug.in/ns/ext/host-info/ext.pc.in | 1 + lv2/lv2plug.in/ns/ext/host-info/host-info.ttl | 117 +++ lv2/lv2plug.in/ns/ext/host-info/manifest.ttl | 9 + lv2/lv2plug.in/ns/ext/host-info/waf | 1 + lv2/lv2plug.in/ns/ext/host-info/wscript | 1 + lv2/lv2plug.in/ns/ext/instance-access/ext.pc.in | 1 + .../ns/ext/instance-access/instance-access.h | 38 + .../ns/ext/instance-access/instance-access.ttl | 80 ++ lv2/lv2plug.in/ns/ext/instance-access/manifest.ttl | 9 + lv2/lv2plug.in/ns/ext/instance-access/waf | 1 + lv2/lv2plug.in/ns/ext/instance-access/wscript | 1 + lv2/lv2plug.in/ns/ext/log/ext.pc.in | 1 + lv2/lv2plug.in/ns/ext/log/log.h | 91 +++ lv2/lv2plug.in/ns/ext/log/log.ttl | 74 ++ lv2/lv2plug.in/ns/ext/log/manifest.ttl | 9 + lv2/lv2plug.in/ns/ext/log/waf | 1 + lv2/lv2plug.in/ns/ext/log/wscript | 1 + lv2/lv2plug.in/ns/ext/midi/ext.pc.in | 1 + lv2/lv2plug.in/ns/ext/midi/manifest.ttl | 9 + lv2/lv2plug.in/ns/ext/midi/midi.ttl | 115 +++ lv2/lv2plug.in/ns/ext/midi/waf | 1 + lv2/lv2plug.in/ns/ext/midi/wscript | 1 + lv2/lv2plug.in/ns/ext/osc/ext.pc.in | 1 + lv2/lv2plug.in/ns/ext/osc/lv2_osc.c | 238 ++++++ lv2/lv2plug.in/ns/ext/osc/lv2_osc_print.c | 66 ++ lv2/lv2plug.in/ns/ext/osc/lv2_osc_test.c | 55 ++ lv2/lv2plug.in/ns/ext/osc/manifest.ttl | 9 + lv2/lv2plug.in/ns/ext/osc/osc-print.h | 42 + lv2/lv2plug.in/ns/ext/osc/osc.h | 119 +++ lv2/lv2plug.in/ns/ext/osc/osc.ttl | 39 + lv2/lv2plug.in/ns/ext/osc/waf | 1 + lv2/lv2plug.in/ns/ext/osc/wscript | 1 + lv2/lv2plug.in/ns/ext/parameter/ext.pc.in | 1 + lv2/lv2plug.in/ns/ext/parameter/manifest.ttl | 9 + lv2/lv2plug.in/ns/ext/parameter/parameter.ttl | 111 +++ lv2/lv2plug.in/ns/ext/parameter/waf | 1 + lv2/lv2plug.in/ns/ext/parameter/wscript | 1 + lv2/lv2plug.in/ns/ext/port-groups/ext.pc.in | 1 + lv2/lv2plug.in/ns/ext/port-groups/manifest.ttl | 9 + lv2/lv2plug.in/ns/ext/port-groups/port-groups.ttl | 490 ++++++++++++ lv2/lv2plug.in/ns/ext/port-groups/waf | 1 + lv2/lv2plug.in/ns/ext/port-groups/wscript | 1 + lv2/lv2plug.in/ns/ext/port-props/ext.pc.in | 1 + lv2/lv2plug.in/ns/ext/port-props/manifest.ttl | 8 + lv2/lv2plug.in/ns/ext/port-props/port-props.ttl | 217 +++++ lv2/lv2plug.in/ns/ext/port-props/waf | 1 + lv2/lv2plug.in/ns/ext/port-props/wscript | 1 + lv2/lv2plug.in/ns/ext/presets/ext.pc.in | 1 + lv2/lv2plug.in/ns/ext/presets/manifest.ttl | 9 + lv2/lv2plug.in/ns/ext/presets/presets.ttl | 148 ++++ lv2/lv2plug.in/ns/ext/presets/waf | 1 + lv2/lv2plug.in/ns/ext/presets/wscript | 1 + lv2/lv2plug.in/ns/ext/pui/ext.pc.in | 1 + lv2/lv2plug.in/ns/ext/pui/manifest.ttl | 8 + lv2/lv2plug.in/ns/ext/pui/pui.h | 374 +++++++++ lv2/lv2plug.in/ns/ext/pui/pui.ttl | 284 +++++++ lv2/lv2plug.in/ns/ext/pui/waf | 1 + lv2/lv2plug.in/ns/ext/pui/wscript | 1 + lv2/lv2plug.in/ns/ext/reference/ext.pc.in | 1 + lv2/lv2plug.in/ns/ext/reference/manifest.ttl | 9 + lv2/lv2plug.in/ns/ext/reference/reference.h | 161 ++++ lv2/lv2plug.in/ns/ext/reference/reference.ttl | 82 ++ lv2/lv2plug.in/ns/ext/reference/waf | 1 + lv2/lv2plug.in/ns/ext/reference/wscript | 1 + lv2/lv2plug.in/ns/ext/resize-port/ext.pc.in | 1 + lv2/lv2plug.in/ns/ext/resize-port/manifest.ttl | 9 + lv2/lv2plug.in/ns/ext/resize-port/resize-port.h | 57 ++ lv2/lv2plug.in/ns/ext/resize-port/resize-port.ttl | 80 ++ lv2/lv2plug.in/ns/ext/resize-port/waf | 1 + lv2/lv2plug.in/ns/ext/resize-port/wscript | 1 + lv2/lv2plug.in/ns/ext/state/ext.pc.in | 1 + lv2/lv2plug.in/ns/ext/state/manifest.ttl | 8 + lv2/lv2plug.in/ns/ext/state/state.h | 359 +++++++++ lv2/lv2plug.in/ns/ext/state/state.ttl | 359 +++++++++ lv2/lv2plug.in/ns/ext/state/waf | 1 + lv2/lv2plug.in/ns/ext/state/wscript | 1 + lv2/lv2plug.in/ns/ext/string-port/ext.pc.in | 1 + lv2/lv2plug.in/ns/ext/string-port/manifest.ttl | 8 + lv2/lv2plug.in/ns/ext/string-port/string-port.h | 58 ++ lv2/lv2plug.in/ns/ext/string-port/string-port.ttl | 105 +++ lv2/lv2plug.in/ns/ext/string-port/waf | 1 + lv2/lv2plug.in/ns/ext/string-port/wscript | 1 + lv2/lv2plug.in/ns/ext/time/ext.pc.in | 1 + lv2/lv2plug.in/ns/ext/time/manifest.ttl | 9 + lv2/lv2plug.in/ns/ext/time/time.h | 131 +++ lv2/lv2plug.in/ns/ext/time/time.ttl | 57 ++ lv2/lv2plug.in/ns/ext/time/waf | 1 + lv2/lv2plug.in/ns/ext/time/wscript | 1 + lv2/lv2plug.in/ns/ext/ui-resize/ext.pc.in | 1 + lv2/lv2plug.in/ns/ext/ui-resize/manifest.ttl | 9 + lv2/lv2plug.in/ns/ext/ui-resize/ui-resize.h | 58 ++ lv2/lv2plug.in/ns/ext/ui-resize/ui-resize.ttl | 43 + lv2/lv2plug.in/ns/ext/ui-resize/waf | 1 + lv2/lv2plug.in/ns/ext/ui-resize/wscript | 1 + lv2/lv2plug.in/ns/ext/uri-map/ext.pc.in | 1 + lv2/lv2plug.in/ns/ext/uri-map/manifest.ttl | 8 + lv2/lv2plug.in/ns/ext/uri-map/uri-map.h | 92 +++ lv2/lv2plug.in/ns/ext/uri-map/uri-map.ttl | 93 +++ lv2/lv2plug.in/ns/ext/uri-map/waf | 1 + lv2/lv2plug.in/ns/ext/uri-map/wscript | 1 + lv2/lv2plug.in/ns/ext/urid/ext.pc.in | 1 + lv2/lv2plug.in/ns/ext/urid/manifest.ttl | 9 + lv2/lv2plug.in/ns/ext/urid/urid.h | 115 +++ lv2/lv2plug.in/ns/ext/urid/urid.ttl | 81 ++ lv2/lv2plug.in/ns/ext/urid/waf | 1 + lv2/lv2plug.in/ns/ext/urid/wscript | 1 + lv2/lv2plug.in/ns/extensions/ui/ext.pc.in | 1 + lv2/lv2plug.in/ns/extensions/ui/lv2-ui.doap.ttl | 74 ++ lv2/lv2plug.in/ns/extensions/ui/manifest.ttl | 9 + lv2/lv2plug.in/ns/extensions/ui/ui.h | 247 ++++++ lv2/lv2plug.in/ns/extensions/ui/ui.ttl | 235 ++++++ lv2/lv2plug.in/ns/extensions/ui/waf | 1 + lv2/lv2plug.in/ns/extensions/ui/wscript | 1 + lv2/lv2plug.in/ns/extensions/units/ext.pc.in | 1 + .../ns/extensions/units/lv2-units.doap.ttl | 72 ++ lv2/lv2plug.in/ns/extensions/units/manifest.ttl | 9 + lv2/lv2plug.in/ns/extensions/units/units.ttl | 408 ++++++++++ lv2/lv2plug.in/ns/extensions/units/waf | 1 + lv2/lv2plug.in/ns/extensions/units/wscript | 1 + lv2/lv2plug.in/ns/index.html.in | 32 + lv2/lv2plug.in/ns/lv2core/AUTHORS | 13 + lv2/lv2plug.in/ns/lv2core/COPYING | 16 + lv2/lv2plug.in/ns/lv2core/INSTALL | 41 + lv2/lv2plug.in/ns/lv2core/README | 42 + lv2/lv2plug.in/ns/lv2core/lv2.h | 299 +++++++ lv2/lv2plug.in/ns/lv2core/lv2core.doap.ttl | 117 +++ lv2/lv2plug.in/ns/lv2core/lv2core.pc.in | 10 + lv2/lv2plug.in/ns/lv2core/lv2core.ttl | 883 +++++++++++++++++++++ lv2/lv2plug.in/ns/lv2core/manifest.ttl | 10 + lv2/lv2plug.in/ns/lv2core/waf | Bin 0 -> 91475 bytes lv2/lv2plug.in/ns/lv2core/wscript | 141 ++++ lv2/ns/ext/atom/atom-helpers.h | 310 -------- lv2/ns/ext/atom/atom-test.c | 304 ------- lv2/ns/ext/atom/atom.h | 203 ----- lv2/ns/ext/atom/atom.ttl | 462 ----------- lv2/ns/ext/atom/ext.pc.in | 1 - lv2/ns/ext/atom/forge.h | 445 ----------- lv2/ns/ext/atom/manifest.ttl | 9 - lv2/ns/ext/atom/waf | 1 - lv2/ns/ext/atom/wscript | 1 - lv2/ns/ext/contexts/contexts.h | 82 -- lv2/ns/ext/contexts/contexts.ttl | 134 ---- lv2/ns/ext/contexts/ext.pc.in | 1 - lv2/ns/ext/contexts/manifest.ttl | 9 - lv2/ns/ext/contexts/test.c | 67 -- lv2/ns/ext/contexts/waf | 1 - lv2/ns/ext/contexts/wscript | 1 - lv2/ns/ext/cv-port/cv-port.ttl | 77 -- lv2/ns/ext/cv-port/ext.pc.in | 1 - lv2/ns/ext/cv-port/manifest.ttl | 9 - lv2/ns/ext/cv-port/waf | 1 - lv2/ns/ext/cv-port/wscript | 1 - lv2/ns/ext/data-access/data-access.h | 56 -- lv2/ns/ext/data-access/data-access.ttl | 82 -- lv2/ns/ext/data-access/ext.pc.in | 1 - lv2/ns/ext/data-access/manifest.ttl | 9 - lv2/ns/ext/data-access/waf | 1 - lv2/ns/ext/data-access/wscript | 1 - lv2/ns/ext/dynmanifest/dynmanifest.h | 144 ---- lv2/ns/ext/dynmanifest/dynmanifest.ttl | 107 --- lv2/ns/ext/dynmanifest/ext.pc.in | 1 - lv2/ns/ext/dynmanifest/lv2-dynmanifest.doap.ttl | 43 - lv2/ns/ext/dynmanifest/manifest.ttl | 9 - lv2/ns/ext/dynmanifest/waf | 1 - lv2/ns/ext/dynmanifest/wscript | 1 - lv2/ns/ext/event/event-helpers.h | 246 ------ lv2/ns/ext/event/event.h | 281 ------- lv2/ns/ext/event/event.ttl | 224 ------ lv2/ns/ext/event/ext.pc.in | 1 - lv2/ns/ext/event/manifest.ttl | 9 - lv2/ns/ext/event/waf | 1 - lv2/ns/ext/event/wscript | 1 - lv2/ns/ext/host-info/ext.pc.in | 1 - lv2/ns/ext/host-info/host-info.ttl | 117 --- lv2/ns/ext/host-info/manifest.ttl | 9 - lv2/ns/ext/host-info/waf | 1 - lv2/ns/ext/host-info/wscript | 1 - lv2/ns/ext/instance-access/ext.pc.in | 1 - lv2/ns/ext/instance-access/instance-access.h | 38 - lv2/ns/ext/instance-access/instance-access.ttl | 80 -- lv2/ns/ext/instance-access/manifest.ttl | 9 - lv2/ns/ext/instance-access/waf | 1 - lv2/ns/ext/instance-access/wscript | 1 - lv2/ns/ext/log/ext.pc.in | 1 - lv2/ns/ext/log/log.h | 91 --- lv2/ns/ext/log/log.ttl | 74 -- lv2/ns/ext/log/manifest.ttl | 9 - lv2/ns/ext/log/waf | 1 - lv2/ns/ext/log/wscript | 1 - lv2/ns/ext/midi/ext.pc.in | 1 - lv2/ns/ext/midi/manifest.ttl | 9 - lv2/ns/ext/midi/midi.ttl | 115 --- lv2/ns/ext/midi/waf | 1 - lv2/ns/ext/midi/wscript | 1 - lv2/ns/ext/osc/ext.pc.in | 1 - lv2/ns/ext/osc/lv2_osc.c | 238 ------ lv2/ns/ext/osc/lv2_osc_print.c | 66 -- lv2/ns/ext/osc/lv2_osc_test.c | 55 -- lv2/ns/ext/osc/manifest.ttl | 9 - lv2/ns/ext/osc/osc-print.h | 42 - lv2/ns/ext/osc/osc.h | 119 --- lv2/ns/ext/osc/osc.ttl | 39 - lv2/ns/ext/osc/waf | 1 - lv2/ns/ext/osc/wscript | 1 - lv2/ns/ext/parameter/ext.pc.in | 1 - lv2/ns/ext/parameter/manifest.ttl | 9 - lv2/ns/ext/parameter/parameter.ttl | 111 --- lv2/ns/ext/parameter/waf | 1 - lv2/ns/ext/parameter/wscript | 1 - lv2/ns/ext/port-groups/ext.pc.in | 1 - lv2/ns/ext/port-groups/manifest.ttl | 9 - lv2/ns/ext/port-groups/port-groups.ttl | 490 ------------ lv2/ns/ext/port-groups/waf | 1 - lv2/ns/ext/port-groups/wscript | 1 - lv2/ns/ext/port-props/ext.pc.in | 1 - lv2/ns/ext/port-props/manifest.ttl | 8 - lv2/ns/ext/port-props/port-props.ttl | 217 ----- lv2/ns/ext/port-props/waf | 1 - lv2/ns/ext/port-props/wscript | 1 - lv2/ns/ext/presets/ext.pc.in | 1 - lv2/ns/ext/presets/manifest.ttl | 9 - lv2/ns/ext/presets/presets.ttl | 148 ---- lv2/ns/ext/presets/waf | 1 - lv2/ns/ext/presets/wscript | 1 - lv2/ns/ext/pui/ext.pc.in | 1 - lv2/ns/ext/pui/manifest.ttl | 8 - lv2/ns/ext/pui/pui.h | 374 --------- lv2/ns/ext/pui/pui.ttl | 284 ------- lv2/ns/ext/pui/waf | 1 - lv2/ns/ext/pui/wscript | 1 - lv2/ns/ext/reference/ext.pc.in | 1 - lv2/ns/ext/reference/manifest.ttl | 9 - lv2/ns/ext/reference/reference.h | 161 ---- lv2/ns/ext/reference/reference.ttl | 82 -- lv2/ns/ext/reference/waf | 1 - lv2/ns/ext/reference/wscript | 1 - lv2/ns/ext/resize-port/ext.pc.in | 1 - lv2/ns/ext/resize-port/manifest.ttl | 9 - lv2/ns/ext/resize-port/resize-port.h | 57 -- lv2/ns/ext/resize-port/resize-port.ttl | 80 -- lv2/ns/ext/resize-port/waf | 1 - lv2/ns/ext/resize-port/wscript | 1 - lv2/ns/ext/state/ext.pc.in | 1 - lv2/ns/ext/state/manifest.ttl | 8 - lv2/ns/ext/state/state.h | 359 --------- lv2/ns/ext/state/state.ttl | 359 --------- lv2/ns/ext/state/waf | 1 - lv2/ns/ext/state/wscript | 1 - lv2/ns/ext/string-port/ext.pc.in | 1 - lv2/ns/ext/string-port/manifest.ttl | 8 - lv2/ns/ext/string-port/string-port.h | 58 -- lv2/ns/ext/string-port/string-port.ttl | 105 --- lv2/ns/ext/string-port/waf | 1 - lv2/ns/ext/string-port/wscript | 1 - lv2/ns/ext/time/ext.pc.in | 1 - lv2/ns/ext/time/manifest.ttl | 9 - lv2/ns/ext/time/time.h | 131 --- lv2/ns/ext/time/time.ttl | 57 -- lv2/ns/ext/time/waf | 1 - lv2/ns/ext/time/wscript | 1 - lv2/ns/ext/ui-resize/ext.pc.in | 1 - lv2/ns/ext/ui-resize/manifest.ttl | 9 - lv2/ns/ext/ui-resize/ui-resize.h | 58 -- lv2/ns/ext/ui-resize/ui-resize.ttl | 43 - lv2/ns/ext/ui-resize/waf | 1 - lv2/ns/ext/ui-resize/wscript | 1 - lv2/ns/ext/uri-map/ext.pc.in | 1 - lv2/ns/ext/uri-map/manifest.ttl | 8 - lv2/ns/ext/uri-map/uri-map.h | 92 --- lv2/ns/ext/uri-map/uri-map.ttl | 93 --- lv2/ns/ext/uri-map/waf | 1 - lv2/ns/ext/uri-map/wscript | 1 - lv2/ns/ext/urid/ext.pc.in | 1 - lv2/ns/ext/urid/manifest.ttl | 9 - lv2/ns/ext/urid/urid.h | 115 --- lv2/ns/ext/urid/urid.ttl | 81 -- lv2/ns/ext/urid/waf | 1 - lv2/ns/ext/urid/wscript | 1 - lv2/ns/extensions/ui/ext.pc.in | 1 - lv2/ns/extensions/ui/lv2-ui.doap.ttl | 74 -- lv2/ns/extensions/ui/manifest.ttl | 9 - lv2/ns/extensions/ui/ui.h | 247 ------ lv2/ns/extensions/ui/ui.ttl | 235 ------ lv2/ns/extensions/ui/waf | 1 - lv2/ns/extensions/ui/wscript | 1 - lv2/ns/extensions/units/ext.pc.in | 1 - lv2/ns/extensions/units/lv2-units.doap.ttl | 72 -- lv2/ns/extensions/units/manifest.ttl | 9 - lv2/ns/extensions/units/units.ttl | 408 ---------- lv2/ns/extensions/units/waf | 1 - lv2/ns/extensions/units/wscript | 1 - lv2/ns/index.html.in | 32 - lv2/ns/lv2core/AUTHORS | 13 - lv2/ns/lv2core/COPYING | 16 - lv2/ns/lv2core/INSTALL | 41 - lv2/ns/lv2core/README | 42 - lv2/ns/lv2core/lv2.h | 299 ------- lv2/ns/lv2core/lv2core.doap.ttl | 117 --- lv2/ns/lv2core/lv2core.pc.in | 10 - lv2/ns/lv2core/lv2core.ttl | 883 --------------------- lv2/ns/lv2core/manifest.ttl | 10 - lv2/ns/lv2core/waf | Bin 91475 -> 0 bytes lv2/ns/lv2core/wscript | 134 ---- wscript | 20 +- 345 files changed, 10853 insertions(+), 10846 deletions(-) create mode 100644 lv2/lv2plug.in/ns/ext/atom/atom-helpers.h create mode 100644 lv2/lv2plug.in/ns/ext/atom/atom-test.c create mode 100644 lv2/lv2plug.in/ns/ext/atom/atom.h create mode 100644 lv2/lv2plug.in/ns/ext/atom/atom.ttl create mode 120000 lv2/lv2plug.in/ns/ext/atom/ext.pc.in create mode 100644 lv2/lv2plug.in/ns/ext/atom/forge.h create mode 100644 lv2/lv2plug.in/ns/ext/atom/manifest.ttl create mode 120000 lv2/lv2plug.in/ns/ext/atom/waf create mode 120000 lv2/lv2plug.in/ns/ext/atom/wscript create mode 100644 lv2/lv2plug.in/ns/ext/contexts/contexts.h create mode 100644 lv2/lv2plug.in/ns/ext/contexts/contexts.ttl create mode 120000 lv2/lv2plug.in/ns/ext/contexts/ext.pc.in create mode 100644 lv2/lv2plug.in/ns/ext/contexts/manifest.ttl create mode 100644 lv2/lv2plug.in/ns/ext/contexts/test.c create mode 120000 lv2/lv2plug.in/ns/ext/contexts/waf create mode 120000 lv2/lv2plug.in/ns/ext/contexts/wscript create mode 100644 lv2/lv2plug.in/ns/ext/cv-port/cv-port.ttl create mode 120000 lv2/lv2plug.in/ns/ext/cv-port/ext.pc.in create mode 100644 lv2/lv2plug.in/ns/ext/cv-port/manifest.ttl create mode 120000 lv2/lv2plug.in/ns/ext/cv-port/waf create mode 120000 lv2/lv2plug.in/ns/ext/cv-port/wscript create mode 100644 lv2/lv2plug.in/ns/ext/data-access/data-access.h create mode 100644 lv2/lv2plug.in/ns/ext/data-access/data-access.ttl create mode 120000 lv2/lv2plug.in/ns/ext/data-access/ext.pc.in create mode 100644 lv2/lv2plug.in/ns/ext/data-access/manifest.ttl create mode 120000 lv2/lv2plug.in/ns/ext/data-access/waf create mode 120000 lv2/lv2plug.in/ns/ext/data-access/wscript create mode 100644 lv2/lv2plug.in/ns/ext/dynmanifest/dynmanifest.h create mode 100644 lv2/lv2plug.in/ns/ext/dynmanifest/dynmanifest.ttl create mode 120000 lv2/lv2plug.in/ns/ext/dynmanifest/ext.pc.in create mode 100644 lv2/lv2plug.in/ns/ext/dynmanifest/lv2-dynmanifest.doap.ttl create mode 100644 lv2/lv2plug.in/ns/ext/dynmanifest/manifest.ttl create mode 120000 lv2/lv2plug.in/ns/ext/dynmanifest/waf create mode 120000 lv2/lv2plug.in/ns/ext/dynmanifest/wscript create mode 100644 lv2/lv2plug.in/ns/ext/event/event-helpers.h create mode 100644 lv2/lv2plug.in/ns/ext/event/event.h create mode 100644 lv2/lv2plug.in/ns/ext/event/event.ttl create mode 120000 lv2/lv2plug.in/ns/ext/event/ext.pc.in create mode 100644 lv2/lv2plug.in/ns/ext/event/manifest.ttl create mode 120000 lv2/lv2plug.in/ns/ext/event/waf create mode 120000 lv2/lv2plug.in/ns/ext/event/wscript create mode 120000 lv2/lv2plug.in/ns/ext/host-info/ext.pc.in create mode 100644 lv2/lv2plug.in/ns/ext/host-info/host-info.ttl create mode 100644 lv2/lv2plug.in/ns/ext/host-info/manifest.ttl create mode 120000 lv2/lv2plug.in/ns/ext/host-info/waf create mode 120000 lv2/lv2plug.in/ns/ext/host-info/wscript create mode 120000 lv2/lv2plug.in/ns/ext/instance-access/ext.pc.in create mode 100644 lv2/lv2plug.in/ns/ext/instance-access/instance-access.h create mode 100644 lv2/lv2plug.in/ns/ext/instance-access/instance-access.ttl create mode 100644 lv2/lv2plug.in/ns/ext/instance-access/manifest.ttl create mode 120000 lv2/lv2plug.in/ns/ext/instance-access/waf create mode 120000 lv2/lv2plug.in/ns/ext/instance-access/wscript create mode 120000 lv2/lv2plug.in/ns/ext/log/ext.pc.in create mode 100644 lv2/lv2plug.in/ns/ext/log/log.h create mode 100644 lv2/lv2plug.in/ns/ext/log/log.ttl create mode 100644 lv2/lv2plug.in/ns/ext/log/manifest.ttl create mode 120000 lv2/lv2plug.in/ns/ext/log/waf create mode 120000 lv2/lv2plug.in/ns/ext/log/wscript create mode 120000 lv2/lv2plug.in/ns/ext/midi/ext.pc.in create mode 100644 lv2/lv2plug.in/ns/ext/midi/manifest.ttl create mode 100644 lv2/lv2plug.in/ns/ext/midi/midi.ttl create mode 120000 lv2/lv2plug.in/ns/ext/midi/waf create mode 120000 lv2/lv2plug.in/ns/ext/midi/wscript create mode 120000 lv2/lv2plug.in/ns/ext/osc/ext.pc.in create mode 100644 lv2/lv2plug.in/ns/ext/osc/lv2_osc.c create mode 100644 lv2/lv2plug.in/ns/ext/osc/lv2_osc_print.c create mode 100644 lv2/lv2plug.in/ns/ext/osc/lv2_osc_test.c create mode 100644 lv2/lv2plug.in/ns/ext/osc/manifest.ttl create mode 100644 lv2/lv2plug.in/ns/ext/osc/osc-print.h create mode 100644 lv2/lv2plug.in/ns/ext/osc/osc.h create mode 100644 lv2/lv2plug.in/ns/ext/osc/osc.ttl create mode 120000 lv2/lv2plug.in/ns/ext/osc/waf create mode 120000 lv2/lv2plug.in/ns/ext/osc/wscript create mode 120000 lv2/lv2plug.in/ns/ext/parameter/ext.pc.in create mode 100644 lv2/lv2plug.in/ns/ext/parameter/manifest.ttl create mode 100644 lv2/lv2plug.in/ns/ext/parameter/parameter.ttl create mode 120000 lv2/lv2plug.in/ns/ext/parameter/waf create mode 120000 lv2/lv2plug.in/ns/ext/parameter/wscript create mode 120000 lv2/lv2plug.in/ns/ext/port-groups/ext.pc.in create mode 100644 lv2/lv2plug.in/ns/ext/port-groups/manifest.ttl create mode 100644 lv2/lv2plug.in/ns/ext/port-groups/port-groups.ttl create mode 120000 lv2/lv2plug.in/ns/ext/port-groups/waf create mode 120000 lv2/lv2plug.in/ns/ext/port-groups/wscript create mode 120000 lv2/lv2plug.in/ns/ext/port-props/ext.pc.in create mode 100644 lv2/lv2plug.in/ns/ext/port-props/manifest.ttl create mode 100644 lv2/lv2plug.in/ns/ext/port-props/port-props.ttl create mode 120000 lv2/lv2plug.in/ns/ext/port-props/waf create mode 120000 lv2/lv2plug.in/ns/ext/port-props/wscript create mode 120000 lv2/lv2plug.in/ns/ext/presets/ext.pc.in create mode 100644 lv2/lv2plug.in/ns/ext/presets/manifest.ttl create mode 100644 lv2/lv2plug.in/ns/ext/presets/presets.ttl create mode 120000 lv2/lv2plug.in/ns/ext/presets/waf create mode 120000 lv2/lv2plug.in/ns/ext/presets/wscript create mode 120000 lv2/lv2plug.in/ns/ext/pui/ext.pc.in create mode 100644 lv2/lv2plug.in/ns/ext/pui/manifest.ttl create mode 100644 lv2/lv2plug.in/ns/ext/pui/pui.h create mode 100644 lv2/lv2plug.in/ns/ext/pui/pui.ttl create mode 120000 lv2/lv2plug.in/ns/ext/pui/waf create mode 120000 lv2/lv2plug.in/ns/ext/pui/wscript create mode 120000 lv2/lv2plug.in/ns/ext/reference/ext.pc.in create mode 100644 lv2/lv2plug.in/ns/ext/reference/manifest.ttl create mode 100644 lv2/lv2plug.in/ns/ext/reference/reference.h create mode 100644 lv2/lv2plug.in/ns/ext/reference/reference.ttl create mode 120000 lv2/lv2plug.in/ns/ext/reference/waf create mode 120000 lv2/lv2plug.in/ns/ext/reference/wscript create mode 120000 lv2/lv2plug.in/ns/ext/resize-port/ext.pc.in create mode 100644 lv2/lv2plug.in/ns/ext/resize-port/manifest.ttl create mode 100644 lv2/lv2plug.in/ns/ext/resize-port/resize-port.h create mode 100644 lv2/lv2plug.in/ns/ext/resize-port/resize-port.ttl create mode 120000 lv2/lv2plug.in/ns/ext/resize-port/waf create mode 120000 lv2/lv2plug.in/ns/ext/resize-port/wscript create mode 120000 lv2/lv2plug.in/ns/ext/state/ext.pc.in create mode 100644 lv2/lv2plug.in/ns/ext/state/manifest.ttl create mode 100644 lv2/lv2plug.in/ns/ext/state/state.h create mode 100644 lv2/lv2plug.in/ns/ext/state/state.ttl create mode 120000 lv2/lv2plug.in/ns/ext/state/waf create mode 120000 lv2/lv2plug.in/ns/ext/state/wscript create mode 120000 lv2/lv2plug.in/ns/ext/string-port/ext.pc.in create mode 100644 lv2/lv2plug.in/ns/ext/string-port/manifest.ttl create mode 100644 lv2/lv2plug.in/ns/ext/string-port/string-port.h create mode 100644 lv2/lv2plug.in/ns/ext/string-port/string-port.ttl create mode 120000 lv2/lv2plug.in/ns/ext/string-port/waf create mode 120000 lv2/lv2plug.in/ns/ext/string-port/wscript create mode 120000 lv2/lv2plug.in/ns/ext/time/ext.pc.in create mode 100644 lv2/lv2plug.in/ns/ext/time/manifest.ttl create mode 100644 lv2/lv2plug.in/ns/ext/time/time.h create mode 100644 lv2/lv2plug.in/ns/ext/time/time.ttl create mode 120000 lv2/lv2plug.in/ns/ext/time/waf create mode 120000 lv2/lv2plug.in/ns/ext/time/wscript create mode 120000 lv2/lv2plug.in/ns/ext/ui-resize/ext.pc.in create mode 100644 lv2/lv2plug.in/ns/ext/ui-resize/manifest.ttl create mode 100644 lv2/lv2plug.in/ns/ext/ui-resize/ui-resize.h create mode 100644 lv2/lv2plug.in/ns/ext/ui-resize/ui-resize.ttl create mode 120000 lv2/lv2plug.in/ns/ext/ui-resize/waf create mode 120000 lv2/lv2plug.in/ns/ext/ui-resize/wscript create mode 120000 lv2/lv2plug.in/ns/ext/uri-map/ext.pc.in create mode 100644 lv2/lv2plug.in/ns/ext/uri-map/manifest.ttl create mode 100644 lv2/lv2plug.in/ns/ext/uri-map/uri-map.h create mode 100644 lv2/lv2plug.in/ns/ext/uri-map/uri-map.ttl create mode 120000 lv2/lv2plug.in/ns/ext/uri-map/waf create mode 120000 lv2/lv2plug.in/ns/ext/uri-map/wscript create mode 120000 lv2/lv2plug.in/ns/ext/urid/ext.pc.in create mode 100644 lv2/lv2plug.in/ns/ext/urid/manifest.ttl create mode 100644 lv2/lv2plug.in/ns/ext/urid/urid.h create mode 100644 lv2/lv2plug.in/ns/ext/urid/urid.ttl create mode 120000 lv2/lv2plug.in/ns/ext/urid/waf create mode 120000 lv2/lv2plug.in/ns/ext/urid/wscript create mode 120000 lv2/lv2plug.in/ns/extensions/ui/ext.pc.in create mode 100644 lv2/lv2plug.in/ns/extensions/ui/lv2-ui.doap.ttl create mode 100644 lv2/lv2plug.in/ns/extensions/ui/manifest.ttl create mode 100644 lv2/lv2plug.in/ns/extensions/ui/ui.h create mode 100644 lv2/lv2plug.in/ns/extensions/ui/ui.ttl create mode 120000 lv2/lv2plug.in/ns/extensions/ui/waf create mode 120000 lv2/lv2plug.in/ns/extensions/ui/wscript create mode 120000 lv2/lv2plug.in/ns/extensions/units/ext.pc.in create mode 100644 lv2/lv2plug.in/ns/extensions/units/lv2-units.doap.ttl create mode 100644 lv2/lv2plug.in/ns/extensions/units/manifest.ttl create mode 100644 lv2/lv2plug.in/ns/extensions/units/units.ttl create mode 120000 lv2/lv2plug.in/ns/extensions/units/waf create mode 120000 lv2/lv2plug.in/ns/extensions/units/wscript create mode 100644 lv2/lv2plug.in/ns/index.html.in create mode 100644 lv2/lv2plug.in/ns/lv2core/AUTHORS create mode 100644 lv2/lv2plug.in/ns/lv2core/COPYING create mode 100644 lv2/lv2plug.in/ns/lv2core/INSTALL create mode 100644 lv2/lv2plug.in/ns/lv2core/README create mode 100644 lv2/lv2plug.in/ns/lv2core/lv2.h create mode 100644 lv2/lv2plug.in/ns/lv2core/lv2core.doap.ttl create mode 100644 lv2/lv2plug.in/ns/lv2core/lv2core.pc.in create mode 100644 lv2/lv2plug.in/ns/lv2core/lv2core.ttl create mode 100644 lv2/lv2plug.in/ns/lv2core/manifest.ttl create mode 100755 lv2/lv2plug.in/ns/lv2core/waf create mode 100644 lv2/lv2plug.in/ns/lv2core/wscript delete mode 100644 lv2/ns/ext/atom/atom-helpers.h delete mode 100644 lv2/ns/ext/atom/atom-test.c delete mode 100644 lv2/ns/ext/atom/atom.h delete mode 100644 lv2/ns/ext/atom/atom.ttl delete mode 120000 lv2/ns/ext/atom/ext.pc.in delete mode 100644 lv2/ns/ext/atom/forge.h delete mode 100644 lv2/ns/ext/atom/manifest.ttl delete mode 120000 lv2/ns/ext/atom/waf delete mode 120000 lv2/ns/ext/atom/wscript delete mode 100644 lv2/ns/ext/contexts/contexts.h delete mode 100644 lv2/ns/ext/contexts/contexts.ttl delete mode 120000 lv2/ns/ext/contexts/ext.pc.in delete mode 100644 lv2/ns/ext/contexts/manifest.ttl delete mode 100644 lv2/ns/ext/contexts/test.c delete mode 120000 lv2/ns/ext/contexts/waf delete mode 120000 lv2/ns/ext/contexts/wscript delete mode 100644 lv2/ns/ext/cv-port/cv-port.ttl delete mode 120000 lv2/ns/ext/cv-port/ext.pc.in delete mode 100644 lv2/ns/ext/cv-port/manifest.ttl delete mode 120000 lv2/ns/ext/cv-port/waf delete mode 120000 lv2/ns/ext/cv-port/wscript delete mode 100644 lv2/ns/ext/data-access/data-access.h delete mode 100644 lv2/ns/ext/data-access/data-access.ttl delete mode 120000 lv2/ns/ext/data-access/ext.pc.in delete mode 100644 lv2/ns/ext/data-access/manifest.ttl delete mode 120000 lv2/ns/ext/data-access/waf delete mode 120000 lv2/ns/ext/data-access/wscript delete mode 100644 lv2/ns/ext/dynmanifest/dynmanifest.h delete mode 100644 lv2/ns/ext/dynmanifest/dynmanifest.ttl delete mode 120000 lv2/ns/ext/dynmanifest/ext.pc.in delete mode 100644 lv2/ns/ext/dynmanifest/lv2-dynmanifest.doap.ttl delete mode 100644 lv2/ns/ext/dynmanifest/manifest.ttl delete mode 120000 lv2/ns/ext/dynmanifest/waf delete mode 120000 lv2/ns/ext/dynmanifest/wscript delete mode 100644 lv2/ns/ext/event/event-helpers.h delete mode 100644 lv2/ns/ext/event/event.h delete mode 100644 lv2/ns/ext/event/event.ttl delete mode 120000 lv2/ns/ext/event/ext.pc.in delete mode 100644 lv2/ns/ext/event/manifest.ttl delete mode 120000 lv2/ns/ext/event/waf delete mode 120000 lv2/ns/ext/event/wscript delete mode 120000 lv2/ns/ext/host-info/ext.pc.in delete mode 100644 lv2/ns/ext/host-info/host-info.ttl delete mode 100644 lv2/ns/ext/host-info/manifest.ttl delete mode 120000 lv2/ns/ext/host-info/waf delete mode 120000 lv2/ns/ext/host-info/wscript delete mode 120000 lv2/ns/ext/instance-access/ext.pc.in delete mode 100644 lv2/ns/ext/instance-access/instance-access.h delete mode 100644 lv2/ns/ext/instance-access/instance-access.ttl delete mode 100644 lv2/ns/ext/instance-access/manifest.ttl delete mode 120000 lv2/ns/ext/instance-access/waf delete mode 120000 lv2/ns/ext/instance-access/wscript delete mode 120000 lv2/ns/ext/log/ext.pc.in delete mode 100644 lv2/ns/ext/log/log.h delete mode 100644 lv2/ns/ext/log/log.ttl delete mode 100644 lv2/ns/ext/log/manifest.ttl delete mode 120000 lv2/ns/ext/log/waf delete mode 120000 lv2/ns/ext/log/wscript delete mode 120000 lv2/ns/ext/midi/ext.pc.in delete mode 100644 lv2/ns/ext/midi/manifest.ttl delete mode 100644 lv2/ns/ext/midi/midi.ttl delete mode 120000 lv2/ns/ext/midi/waf delete mode 120000 lv2/ns/ext/midi/wscript delete mode 120000 lv2/ns/ext/osc/ext.pc.in delete mode 100644 lv2/ns/ext/osc/lv2_osc.c delete mode 100644 lv2/ns/ext/osc/lv2_osc_print.c delete mode 100644 lv2/ns/ext/osc/lv2_osc_test.c delete mode 100644 lv2/ns/ext/osc/manifest.ttl delete mode 100644 lv2/ns/ext/osc/osc-print.h delete mode 100644 lv2/ns/ext/osc/osc.h delete mode 100644 lv2/ns/ext/osc/osc.ttl delete mode 120000 lv2/ns/ext/osc/waf delete mode 120000 lv2/ns/ext/osc/wscript delete mode 120000 lv2/ns/ext/parameter/ext.pc.in delete mode 100644 lv2/ns/ext/parameter/manifest.ttl delete mode 100644 lv2/ns/ext/parameter/parameter.ttl delete mode 120000 lv2/ns/ext/parameter/waf delete mode 120000 lv2/ns/ext/parameter/wscript delete mode 120000 lv2/ns/ext/port-groups/ext.pc.in delete mode 100644 lv2/ns/ext/port-groups/manifest.ttl delete mode 100644 lv2/ns/ext/port-groups/port-groups.ttl delete mode 120000 lv2/ns/ext/port-groups/waf delete mode 120000 lv2/ns/ext/port-groups/wscript delete mode 120000 lv2/ns/ext/port-props/ext.pc.in delete mode 100644 lv2/ns/ext/port-props/manifest.ttl delete mode 100644 lv2/ns/ext/port-props/port-props.ttl delete mode 120000 lv2/ns/ext/port-props/waf delete mode 120000 lv2/ns/ext/port-props/wscript delete mode 120000 lv2/ns/ext/presets/ext.pc.in delete mode 100644 lv2/ns/ext/presets/manifest.ttl delete mode 100644 lv2/ns/ext/presets/presets.ttl delete mode 120000 lv2/ns/ext/presets/waf delete mode 120000 lv2/ns/ext/presets/wscript delete mode 120000 lv2/ns/ext/pui/ext.pc.in delete mode 100644 lv2/ns/ext/pui/manifest.ttl delete mode 100644 lv2/ns/ext/pui/pui.h delete mode 100644 lv2/ns/ext/pui/pui.ttl delete mode 120000 lv2/ns/ext/pui/waf delete mode 120000 lv2/ns/ext/pui/wscript delete mode 120000 lv2/ns/ext/reference/ext.pc.in delete mode 100644 lv2/ns/ext/reference/manifest.ttl delete mode 100644 lv2/ns/ext/reference/reference.h delete mode 100644 lv2/ns/ext/reference/reference.ttl delete mode 120000 lv2/ns/ext/reference/waf delete mode 120000 lv2/ns/ext/reference/wscript delete mode 120000 lv2/ns/ext/resize-port/ext.pc.in delete mode 100644 lv2/ns/ext/resize-port/manifest.ttl delete mode 100644 lv2/ns/ext/resize-port/resize-port.h delete mode 100644 lv2/ns/ext/resize-port/resize-port.ttl delete mode 120000 lv2/ns/ext/resize-port/waf delete mode 120000 lv2/ns/ext/resize-port/wscript delete mode 120000 lv2/ns/ext/state/ext.pc.in delete mode 100644 lv2/ns/ext/state/manifest.ttl delete mode 100644 lv2/ns/ext/state/state.h delete mode 100644 lv2/ns/ext/state/state.ttl delete mode 120000 lv2/ns/ext/state/waf delete mode 120000 lv2/ns/ext/state/wscript delete mode 120000 lv2/ns/ext/string-port/ext.pc.in delete mode 100644 lv2/ns/ext/string-port/manifest.ttl delete mode 100644 lv2/ns/ext/string-port/string-port.h delete mode 100644 lv2/ns/ext/string-port/string-port.ttl delete mode 120000 lv2/ns/ext/string-port/waf delete mode 120000 lv2/ns/ext/string-port/wscript delete mode 120000 lv2/ns/ext/time/ext.pc.in delete mode 100644 lv2/ns/ext/time/manifest.ttl delete mode 100644 lv2/ns/ext/time/time.h delete mode 100644 lv2/ns/ext/time/time.ttl delete mode 120000 lv2/ns/ext/time/waf delete mode 120000 lv2/ns/ext/time/wscript delete mode 120000 lv2/ns/ext/ui-resize/ext.pc.in delete mode 100644 lv2/ns/ext/ui-resize/manifest.ttl delete mode 100644 lv2/ns/ext/ui-resize/ui-resize.h delete mode 100644 lv2/ns/ext/ui-resize/ui-resize.ttl delete mode 120000 lv2/ns/ext/ui-resize/waf delete mode 120000 lv2/ns/ext/ui-resize/wscript delete mode 120000 lv2/ns/ext/uri-map/ext.pc.in delete mode 100644 lv2/ns/ext/uri-map/manifest.ttl delete mode 100644 lv2/ns/ext/uri-map/uri-map.h delete mode 100644 lv2/ns/ext/uri-map/uri-map.ttl delete mode 120000 lv2/ns/ext/uri-map/waf delete mode 120000 lv2/ns/ext/uri-map/wscript delete mode 120000 lv2/ns/ext/urid/ext.pc.in delete mode 100644 lv2/ns/ext/urid/manifest.ttl delete mode 100644 lv2/ns/ext/urid/urid.h delete mode 100644 lv2/ns/ext/urid/urid.ttl delete mode 120000 lv2/ns/ext/urid/waf delete mode 120000 lv2/ns/ext/urid/wscript delete mode 120000 lv2/ns/extensions/ui/ext.pc.in delete mode 100644 lv2/ns/extensions/ui/lv2-ui.doap.ttl delete mode 100644 lv2/ns/extensions/ui/manifest.ttl delete mode 100644 lv2/ns/extensions/ui/ui.h delete mode 100644 lv2/ns/extensions/ui/ui.ttl delete mode 120000 lv2/ns/extensions/ui/waf delete mode 120000 lv2/ns/extensions/ui/wscript delete mode 120000 lv2/ns/extensions/units/ext.pc.in delete mode 100644 lv2/ns/extensions/units/lv2-units.doap.ttl delete mode 100644 lv2/ns/extensions/units/manifest.ttl delete mode 100644 lv2/ns/extensions/units/units.ttl delete mode 120000 lv2/ns/extensions/units/waf delete mode 120000 lv2/ns/extensions/units/wscript delete mode 100644 lv2/ns/index.html.in delete mode 100644 lv2/ns/lv2core/AUTHORS delete mode 100644 lv2/ns/lv2core/COPYING delete mode 100644 lv2/ns/lv2core/INSTALL delete mode 100644 lv2/ns/lv2core/README delete mode 100644 lv2/ns/lv2core/lv2.h delete mode 100644 lv2/ns/lv2core/lv2core.doap.ttl delete mode 100644 lv2/ns/lv2core/lv2core.pc.in delete mode 100644 lv2/ns/lv2core/lv2core.ttl delete mode 100644 lv2/ns/lv2core/manifest.ttl delete mode 100755 lv2/ns/lv2core/waf delete mode 100644 lv2/ns/lv2core/wscript diff --git a/lv2/lv2plug.in/ns/ext/atom/atom-helpers.h b/lv2/lv2plug.in/ns/ext/atom/atom-helpers.h new file mode 100644 index 0000000..6fff74b --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/atom/atom-helpers.h @@ -0,0 +1,310 @@ +/* + Copyright 2008-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. +*/ + +/** + @file atom-helpers.h Helper functions for the LV2 Atom extension. + + Note these functions are all static inline, do not take their address. + + This header is non-normative, it is provided for convenience. +*/ + +#ifndef LV2_ATOM_HELPERS_H +#define LV2_ATOM_HELPERS_H + +#include +#include +#include + +#include "lv2/lv2plug.in/ns/ext/atom/atom.h" + +#ifdef __cplusplus +extern "C" { +#else +# include +#endif + +/** Pad a size to 64 bits. */ +static inline uint32_t +lv2_atom_pad_size(uint32_t size) +{ + return (size + 7) & (~7); +} + +/** Return true iff @p atom is null. */ +static inline bool +lv2_atom_is_null(const LV2_Atom* atom) +{ + return !atom || (atom->type == 0 && atom->size == 0); +} + +/** Return true iff @p a is equal to @p b. */ +static inline bool +lv2_atom_equals(const LV2_Atom* a, const LV2_Atom* b) +{ + return (a == b) || ( + (a->type == b->type) && + (a->size == b->size) && + !memcmp(LV2_ATOM_CONTENTS(LV2_Atom, a), + LV2_ATOM_CONTENTS(LV2_Atom, b), + a->size)); +} + +/** + @name Sequence Iterator + @{ +*/ + +/** An iterator over the elements of an LV2_Atom_Sequence. */ +typedef LV2_Atom_Event* LV2_Atom_Sequence_Iter; + +/** Get an iterator pointing to the first element in @p tup. */ +static inline LV2_Atom_Sequence_Iter +lv2_sequence_begin(const LV2_Atom_Sequence* seq) +{ + return (LV2_Atom_Sequence_Iter)(LV2_ATOM_CONTENTS(LV2_Atom_Sequence, seq)); +} + +/** Return true iff @p i has reached the end of @p tup. */ +static inline bool +lv2_sequence_is_end(const LV2_Atom_Sequence* seq, LV2_Atom_Sequence_Iter i) +{ + return (uint8_t*)i >= ((uint8_t*)seq + sizeof(LV2_Atom) + seq->atom.size); +} + +/** Return an iterator to the element following @p i. */ +static inline LV2_Atom_Sequence_Iter +lv2_sequence_iter_next(const LV2_Atom_Sequence_Iter i) +{ + return (LV2_Atom_Sequence_Iter)((uint8_t*)i + + sizeof(LV2_Atom_Event) + + lv2_atom_pad_size(i->body.size)); +} + +/** Return the element pointed to by @p i. */ +static inline LV2_Atom_Event* +lv2_sequence_iter_get(LV2_Atom_Sequence_Iter i) +{ + return (LV2_Atom_Event*)i; +} + +/** + A macro for iterating over all events in a Sequence. + @param sequence The sequence to iterate over + @param iter The name of the iterator + + This macro is used similarly to a for loop (which it expands to), e.g.: + @code + LV2_SEQUENCE_FOREACH(sequence, i) { + LV2_Atom_Event* ev = lv2_sequence_iter_get(i); + // Do something with ev here... + } + @endcode +*/ +#define LV2_SEQUENCE_FOREACH(sequence, iter) \ + for (LV2_Atom_Sequence_Iter (iter) = lv2_sequence_begin(sequence); \ + !lv2_sequence_is_end(sequence, (iter)); \ + (iter) = lv2_sequence_iter_next(iter)) + +/** + @} + @name Tuple Iterator + @{ +*/ + +/** An iterator over the elements of an LV2_Atom_Tuple. */ +typedef LV2_Atom* LV2_Atom_Tuple_Iter; + +/** Get an iterator pointing to the first element in @p tup. */ +static inline LV2_Atom_Tuple_Iter +lv2_tuple_begin(const LV2_Atom_Tuple* tup) +{ + return (LV2_Atom_Tuple_Iter)(LV2_ATOM_BODY(tup)); +} + +/** Return true iff @p i has reached the end of @p tup. */ +static inline bool +lv2_tuple_is_end(const LV2_Atom_Tuple* tup, LV2_Atom_Tuple_Iter i) +{ + return (uint8_t*)i >= ((uint8_t*)tup + sizeof(LV2_Atom) + tup->atom.size); +} + +/** Return an iterator to the element following @p i. */ +static inline LV2_Atom_Tuple_Iter +lv2_tuple_iter_next(const LV2_Atom_Tuple_Iter i) +{ + return (LV2_Atom_Tuple_Iter)( + (uint8_t*)i + sizeof(LV2_Atom) + lv2_atom_pad_size(i->size)); +} + +/** Return the element pointed to by @p i. */ +static inline LV2_Atom* +lv2_tuple_iter_get(LV2_Atom_Tuple_Iter i) +{ + return (LV2_Atom*)i; +} + +/** + A macro for iterating over all properties of a Tuple. + @param tuple The tuple to iterate over + @param iter The name of the iterator + + This macro is used similarly to a for loop (which it expands to), e.g.: + @code + LV2_TUPLE_FOREACH(tuple, i) { + LV2_Atom_Property* prop = lv2_tuple_iter_get(i); + // Do something with prop here... + } + @endcode +*/ +#define LV2_TUPLE_FOREACH(tuple, iter) \ + for (LV2_Atom_Tuple_Iter (iter) = lv2_tuple_begin(tuple); \ + !lv2_tuple_is_end(tuple, (iter)); \ + (iter) = lv2_tuple_iter_next(iter)) + +/** + @} + @name Object Iterator + @{ +*/ + +/** An iterator over the properties of an LV2_Atom_Object. */ +typedef LV2_Atom_Property_Body* LV2_Atom_Object_Iter; + +/** Get an iterator pointing to the first property in @p obj. */ +static inline LV2_Atom_Object_Iter +lv2_object_begin(const LV2_Atom_Object* obj) +{ + return (LV2_Atom_Object_Iter)(LV2_ATOM_CONTENTS(LV2_Atom_Object, obj)); +} + +/** Return true iff @p i has reached the end of @p obj. */ +static inline bool +lv2_object_is_end(const LV2_Atom_Object* obj, LV2_Atom_Object_Iter i) +{ + return (uint8_t*)i >= ((uint8_t*)obj + sizeof(LV2_Atom) + obj->atom.size); +} + +/** Return true iff @p l points to the same property as @p r. */ +static inline bool +lv2_object_iter_equals(const LV2_Atom_Object_Iter l, + const LV2_Atom_Object_Iter r) +{ + return l == r; +} + +/** Return an iterator to the property following @p i. */ +static inline LV2_Atom_Object_Iter +lv2_object_iter_next(const LV2_Atom_Object_Iter i) +{ + const LV2_Atom* const value = (LV2_Atom*)((uint8_t*)i + sizeof(i)); + return (LV2_Atom_Object_Iter)((uint8_t*)i + + sizeof(LV2_Atom_Property_Body) + + lv2_atom_pad_size(value->size)); +} + +/** Return the property pointed to by @p i. */ +static inline LV2_Atom_Property_Body* +lv2_object_iter_get(LV2_Atom_Object_Iter i) +{ + return (LV2_Atom_Property_Body*)i; +} + +/** + A macro for iterating over all properties of an Object. + @param object The object to iterate over + @param iter The name of the iterator + + This macro is used similarly to a for loop (which it expands to), e.g.: + @code + LV2_OBJECT_FOREACH(object, i) { + LV2_Atom_Property* prop = lv2_object_iter_get(i); + // Do something with prop here... + } + @endcode +*/ +#define LV2_OBJECT_FOREACH(object, iter) \ + for (LV2_Atom_Object_Iter (iter) = lv2_object_begin(object); \ + !lv2_object_is_end(object, (iter)); \ + (iter) = lv2_object_iter_next(iter)) + +/** + @} + @name Object Query + @{ +*/ + +/** A single entry in an Object query. */ +typedef struct { + uint32_t key; /**< Key to query (input set by user) */ + const LV2_Atom** value; /**< Found value (output set by query function) */ +} LV2_Atom_Object_Query; + +static const LV2_Atom_Object_Query LV2_OBJECT_QUERY_END = { 0, NULL }; + +/** + Get an object's values for various keys. + + The value pointer of each item in @p query will be set to the location of + the corresponding value in @p object. Every value pointer in @p query MUST + be initialised to NULL. This function reads @p object in a single linear + sweep. By allocating @p query on the stack, objects can be "queried" + quickly without allocating any memory. This function is realtime safe. + + For example: + @code + const LV2_Atom* name = NULL; + const LV2_Atom* age = NULL; + LV2_Atom_Object_Query q[] = { + { urids.eg_name, &name }, + { urids.eg_age, &age }, + LV2_OBJECT_QUERY_END + }; + lv2_object_get(obj, q); + // name and age are now set to the appropriate values in obj, or NULL. + @endcode +*/ +static inline int +lv2_object_get(const LV2_Atom_Object* object, LV2_Atom_Object_Query* query) +{ + int matches = 0; + int n_queries = 0; + + /* Count number of query keys so we can short-circuit when done */ + for (LV2_Atom_Object_Query* q = query; q->key; ++q) { + ++n_queries; + } + + LV2_OBJECT_FOREACH(object, o) { + const LV2_Atom_Property_Body* prop = lv2_object_iter_get(o); + for (LV2_Atom_Object_Query* q = query; q->key; ++q) { + if (q->key == prop->key && !*q->value) { + *q->value = &prop->value; + if (++matches == n_queries) { + return matches; + } + break; + } + } + } + return matches; +} + +/** + @} +*/ + +#endif /* LV2_ATOM_HELPERS_H */ diff --git a/lv2/lv2plug.in/ns/ext/atom/atom-test.c b/lv2/lv2plug.in/ns/ext/atom/atom-test.c new file mode 100644 index 0000000..1a88d7d --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/atom/atom-test.c @@ -0,0 +1,304 @@ +/* + 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. +*/ + +#include +#include +#include + +#include "lv2/lv2plug.in/ns/ext/atom/atom-helpers.h" +#include "lv2/lv2plug.in/ns/ext/atom/forge.h" + +char** uris = NULL; +size_t n_uris = 0; + +char* +copy_string(const char* str) +{ + const size_t len = strlen(str); + char* dup = (char*)malloc(len + 1); + memcpy(dup, str, len + 1); + return dup; +} + +LV2_URID +urid_map(LV2_URID_Map_Handle handle, const char* uri) +{ + for (size_t i = 0; i < n_uris; ++i) { + if (!strcmp(uris[i], uri)) { + return i + 1; + } + } + + uris = (char**)realloc(uris, ++n_uris * sizeof(char*)); + uris[n_uris - 1] = copy_string(uri); + return n_uris; +} + +int +test_fail(const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + fprintf(stderr, "error: "); + vfprintf(stderr, fmt, args); + va_end(args); + return 1; +} + +int +main() +{ + LV2_URID_Map map = { NULL, urid_map }; + LV2_Atom_Forge forge; + lv2_atom_forge_init(&forge, &map); + + LV2_URID eg_Object = urid_map(NULL, "http://example.org/Object"); + LV2_URID eg_one = urid_map(NULL, "http://example.org/one"); + LV2_URID eg_two = urid_map(NULL, "http://example.org/two"); + LV2_URID eg_three = urid_map(NULL, "http://example.org/three"); + LV2_URID eg_four = urid_map(NULL, "http://example.org/four"); + LV2_URID eg_true = urid_map(NULL, "http://example.org/true"); + LV2_URID eg_false = urid_map(NULL, "http://example.org/false"); + LV2_URID eg_uri = urid_map(NULL, "http://example.org/uri"); + LV2_URID eg_string = urid_map(NULL, "http://example.org/string"); + LV2_URID eg_literal = urid_map(NULL, "http://example.org/literal"); + LV2_URID eg_tuple = urid_map(NULL, "http://example.org/tuple"); + LV2_URID eg_vector = urid_map(NULL, "http://example.org/vector"); + LV2_URID eg_seq = urid_map(NULL, "http://example.org/seq"); + +#define BUF_SIZE 1024 +#define NUM_PROPS 12 + + uint8_t buf[BUF_SIZE]; + lv2_atom_forge_set_buffer(&forge, buf, BUF_SIZE); + + LV2_Atom* obj = (LV2_Atom*)lv2_atom_forge_object( + &forge, NULL, 0, eg_Object); + + // eg_one = (Int32)1 + lv2_atom_forge_property_head(&forge, obj, eg_one, 0); + LV2_Atom_Int32* one = lv2_atom_forge_int32(&forge, obj, 1); + if (one->value != 1) { + return test_fail("%d != 1\n", one->value); + } + + // eg_two = (Int64)2 + lv2_atom_forge_property_head(&forge, obj, eg_two, 0); + LV2_Atom_Int64* two = lv2_atom_forge_int64(&forge, obj, 2); + if (two->value != 2) { + return test_fail("%ld != 2\n", two->value); + } + + // eg_three = (Float)3.0 + lv2_atom_forge_property_head(&forge, obj, eg_three, 0); + LV2_Atom_Float* three = lv2_atom_forge_float(&forge, obj, 3.0f); + if (three->value != 3) { + return test_fail("%f != 3\n", three->value); + } + + // eg_four = (Double)4.0 + lv2_atom_forge_property_head(&forge, obj, eg_four, 0); + LV2_Atom_Double* four = lv2_atom_forge_double(&forge, obj, 4.0); + if (four->value != 4) { + return test_fail("%ld != 4\n", four->value); + } + + // eg_true = (Bool)1 + lv2_atom_forge_property_head(&forge, obj, eg_true, 0); + LV2_Atom_Bool* t = lv2_atom_forge_bool(&forge, obj, true); + if (t->value != 1) { + return test_fail("%ld != 1 (true)\n", t->value); + } + + // eg_false = (Bool)0 + lv2_atom_forge_property_head(&forge, obj, eg_false, 0); + LV2_Atom_Bool* f = lv2_atom_forge_bool(&forge, obj, false); + if (f->value != 0) { + return test_fail("%ld != 0 (false)\n", f->value); + } + + // eg_uri = (URID)"http://example.org/value" + LV2_URID eg_value = urid_map(NULL, "http://example.org/value"); + lv2_atom_forge_property_head(&forge, obj, eg_uri, 0); + LV2_Atom_URID* uri = lv2_atom_forge_urid(&forge, obj, eg_value); + if (uri->id != eg_value) { + return test_fail("%u != %u\n", uri->id, eg_value); + } + + // eg_string = (String)"hello" + lv2_atom_forge_property_head(&forge, obj, eg_string, 0); + LV2_Atom_String* string = lv2_atom_forge_string( + &forge, obj, (const uint8_t*)"hello", strlen("hello")); + uint8_t* body = (uint8_t*)LV2_ATOM_BODY(string); + if (strcmp((const char*)body, "hello")) { + return test_fail("%s != \"hello\"\n", (const char*)body); + } + + // eg_literal = (Literal)"hello"@fr + lv2_atom_forge_property_head(&forge, obj, eg_literal, 0); + LV2_Atom_Literal* literal = lv2_atom_forge_literal( + &forge, obj, (const uint8_t*)"bonjour", strlen("bonjour"), + 0, urid_map(NULL, "http://lexvo.org/id/term/fr")); + body = (uint8_t*)LV2_ATOM_CONTENTS(LV2_Atom_Literal, literal); + if (strcmp((const char*)body, "bonjour")) { + return test_fail("%s != \"bonjour\"\n", (const char*)body); + } + + // eg_tuple = "foo",true + lv2_atom_forge_property_head(&forge, obj, eg_tuple, 0); + LV2_Atom_Tuple* tuple = lv2_atom_forge_tuple(&forge, obj); + LV2_Atom_String* tup0 = lv2_atom_forge_string( + &forge, (LV2_Atom*)tuple, (const uint8_t*)"foo", strlen("foo")); + LV2_Atom_Bool* tup1 = lv2_atom_forge_bool(&forge, (LV2_Atom*)tuple, true); + obj->size += ((LV2_Atom*)tuple)->size; + LV2_Atom_Tuple_Iter i = lv2_tuple_begin(tuple); + if (lv2_tuple_is_end(tuple, i)) { + return test_fail("Tuple iterator is empty\n"); + } + LV2_Atom* tup0i = (LV2_Atom*)lv2_tuple_iter_get(i); + if (!lv2_atom_equals((LV2_Atom*)tup0, tup0i)) { + return test_fail("Corrupt tuple element 0\n"); + } + i = lv2_tuple_iter_next(i); + if (lv2_tuple_is_end(tuple, i)) { + return test_fail("Premature end of tuple iterator\n"); + } + LV2_Atom* tup1i = lv2_tuple_iter_get(i); + if (!lv2_atom_equals((LV2_Atom*)tup1, tup1i)) { + return test_fail("Corrupt tuple element 1\n"); + } + i = lv2_tuple_iter_next(i); + if (!lv2_tuple_is_end(tuple, i)) { + return test_fail("Tuple iter is not at end\n"); + } + + // eg_vector = (Vector)1,2,3,4 + lv2_atom_forge_property_head(&forge, obj, eg_vector, 0); + int32_t elems[] = { 1, 2, 3, 4 }; + LV2_Atom_Vector* vector = lv2_atom_forge_vector( + &forge, obj, 4, forge.Int32, sizeof(int32_t), elems); + void* vec_body = LV2_ATOM_CONTENTS(LV2_Atom_Vector, vector); + if (memcmp(elems, vec_body, sizeof(elems))) { + return test_fail("Corrupt vector\n"); + } + + // eg_seq = (Sequence)1, 2 + lv2_atom_forge_property_head(&forge, obj, eg_seq, 0); + LV2_Atom_Sequence* seq = lv2_atom_forge_sequence_head(&forge, obj, 0); + lv2_atom_forge_audio_time(&forge, (LV2_Atom*)seq, 0, 0); + lv2_atom_forge_int32(&forge, (LV2_Atom*)seq, 1); + lv2_atom_forge_audio_time(&forge, (LV2_Atom*)seq, 1, 0); + lv2_atom_forge_int32(&forge, (LV2_Atom*)seq, 2); + obj->size += seq->atom.size - sizeof(LV2_Atom); + + // Test equality + LV2_Atom_Int32 itwo = { { forge.Int32, sizeof(int32_t) }, 2 }; + if (lv2_atom_equals((LV2_Atom*)one, (LV2_Atom*)two)) { + return test_fail("1 == 2.0\n"); + } else if (lv2_atom_equals((LV2_Atom*)one, (LV2_Atom*)&itwo)) { + return test_fail("1 == 2\n"); + } + + unsigned n_events = 0; + LV2_SEQUENCE_FOREACH(seq, i) { + LV2_Atom_Event* ev = lv2_sequence_iter_get(i); + if (ev->time.audio.frames != n_events + || ev->time.audio.subframes != 0) { + return test_fail("Corrupt event %u has bad time\n", n_events); + } else if (ev->body.type != forge.Int32) { + return test_fail("Corrupt event %u has bad type\n", n_events); + } else if (((LV2_Atom_Int32*)&ev->body)->value != (int)n_events + 1) { + return test_fail("Event %u != %d\n", n_events, n_events + 1); + } + ++n_events; + } + + unsigned n_props = 0; + LV2_OBJECT_FOREACH((LV2_Atom_Object*)obj, i) { + LV2_Atom_Property_Body* prop = lv2_object_iter_get(i); + if (!prop->key) { + return test_fail("Corrupt property %u has no key\n", n_props); + } else if (prop->context) { + return test_fail("Corrupt property %u has context\n", n_props); + } + ++n_props; + } + + if (n_props != NUM_PROPS) { + return test_fail("Corrupt object has %u properties != %u\n", + n_props, NUM_PROPS); + } + + const LV2_Atom* one_match = NULL; + const LV2_Atom* two_match = NULL; + const LV2_Atom* three_match = NULL; + const LV2_Atom* four_match = NULL; + const LV2_Atom* true_match = NULL; + const LV2_Atom* false_match = NULL; + const LV2_Atom* uri_match = NULL; + const LV2_Atom* string_match = NULL; + const LV2_Atom* literal_match = NULL; + const LV2_Atom* tuple_match = NULL; + const LV2_Atom* vector_match = NULL; + const LV2_Atom* seq_match = NULL; + LV2_Atom_Object_Query q[] = { + { eg_one, &one_match }, + { eg_two, &two_match }, + { eg_three, &three_match }, + { eg_four, &four_match }, + { eg_true, &true_match }, + { eg_false, &false_match }, + { eg_uri, &uri_match }, + { eg_string, &string_match }, + { eg_literal, &literal_match }, + { eg_tuple, &tuple_match }, + { eg_vector, &vector_match }, + { eg_seq, &seq_match }, + LV2_OBJECT_QUERY_END + }; + + unsigned matches = lv2_object_get((LV2_Atom_Object*)obj, q); + if (matches != n_props) { + return test_fail("Query failed, %u matches != %u\n", matches, n_props); + } else if (!lv2_atom_equals((LV2_Atom*)one, one_match)) { + return test_fail("Bad match one\n"); + } else if (!lv2_atom_equals((LV2_Atom*)two, two_match)) { + return test_fail("Bad match two\n"); + } else if (!lv2_atom_equals((LV2_Atom*)three, three_match)) { + return test_fail("Bad match three\n"); + } else if (!lv2_atom_equals((LV2_Atom*)four, four_match)) { + return test_fail("Bad match four\n"); + } else if (!lv2_atom_equals((LV2_Atom*)t, true_match)) { + return test_fail("Bad match true\n"); + } else if (!lv2_atom_equals((LV2_Atom*)f, false_match)) { + return test_fail("Bad match false\n"); + } else if (!lv2_atom_equals((LV2_Atom*)uri, uri_match)) { + return test_fail("Bad match URI\n"); + } else if (!lv2_atom_equals((LV2_Atom*)string, string_match)) { + return test_fail("Bad match string\n"); + } else if (!lv2_atom_equals((LV2_Atom*)literal, literal_match)) { + return test_fail("Bad match literal\n"); + } else if (!lv2_atom_equals((LV2_Atom*)tuple, tuple_match)) { + return test_fail("Bad match tuple\n"); + } else if (!lv2_atom_equals((LV2_Atom*)vector, vector_match)) { + return test_fail("Bad match vector\n"); + } else if (!lv2_atom_equals((LV2_Atom*)seq, seq_match)) { + return test_fail("Bad match sequence\n"); + } + + printf("All tests passed.\n"); + return 0; +} diff --git a/lv2/lv2plug.in/ns/ext/atom/atom.h b/lv2/lv2plug.in/ns/ext/atom/atom.h new file mode 100644 index 0000000..bea9197 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/atom/atom.h @@ -0,0 +1,203 @@ +/* + Copyright 2008-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. +*/ + +/** + @file atom.h C header for the LV2 Atom extension + . + + This header describes the binary layout of various types defined in the + atom extension. +*/ + +#ifndef LV2_ATOM_H +#define LV2_ATOM_H + +#define LV2_ATOM_URI "http://lv2plug.in/ns/ext/atom" + +#define LV2_ATOM_REFERENCE_TYPE 0 + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** This expression will fail to compile if double does not fit in 64 bits. */ +typedef char lv2_atom_assert_double_fits_in_64_bits[ + ((sizeof(double) <= sizeof(uint64_t)) * 2) - 1]; + +/** + Return a pointer to the contents of a variable-sized atom. + @param type The type of the atom, e.g. LV2_Atom_String. + @param atom A variable-sized atom. +*/ +#define LV2_ATOM_CONTENTS(type, atom) \ + ((void*)((uint8_t*)(atom) + sizeof(type))) + +/** Return a pointer to the body of @p atom (just past the LV2_Atom head). */ +#define LV2_ATOM_BODY(atom) LV2_ATOM_CONTENTS(LV2_Atom, atom) + +/** The header of an atom:Atom. */ +typedef struct { + uint32_t type; /**< Type of this atom (mapped URI). */ + uint32_t size; /**< Size in bytes, not including type and size. */ +} LV2_Atom; + +/** An atom:Int32 or atom:Bool. May be cast to LV2_Atom. */ +typedef struct { + LV2_Atom atom; + int32_t value; +} LV2_Atom_Int32; + +/** An atom:Int64. May be cast to LV2_Atom. */ +typedef struct { + LV2_Atom atom; + int64_t value; +} LV2_Atom_Int64; + +/** An atom:Float. May be cast to LV2_Atom. */ +typedef struct { + LV2_Atom atom; + float value; +} LV2_Atom_Float; + +/** An atom:Double. May be cast to LV2_Atom. */ +typedef struct { + LV2_Atom atom; + double value; +} LV2_Atom_Double; + +/** An atom:Bool. May be cast to LV2_Atom. */ +typedef LV2_Atom_Int32 LV2_Atom_Bool; + +/** An atom:URID. May be cast to LV2_Atom. */ +typedef struct { + LV2_Atom atom; /**< Atom header. */ + uint32_t id; /**< URID. */ +} LV2_Atom_URID; + +/** The complete header of an atom:String. */ +typedef struct { + LV2_Atom atom; /**< Atom header. */ + /* Contents (a null-terminated UTF-8 string) follow here. */ +} LV2_Atom_String; + +/** The header of an atom:Literal body. */ +typedef struct { + uint32_t datatype; /**< The ID of the datatype of this literal. */ + uint32_t lang; /**< The ID of the language of this literal. */ +} LV2_Atom_Literal_Head; + +/** The complete header of an atom:Literal. */ +typedef struct { + LV2_Atom atom; /**< Atom header. */ + LV2_Atom_Literal_Head literal; /**< Literal body header. */ + /* Contents (a null-terminated UTF-8 string) follow here. */ +} LV2_Atom_Literal; + +/** The complete header of an atom:Tuple. */ +typedef struct { + LV2_Atom atom; /**< Atom header. */ + /* Contents (a series of complete atoms) follow here. */ +} LV2_Atom_Tuple; + +/** The complete header of an atom:Vector. */ +typedef struct { + LV2_Atom atom; /**< Atom header. */ + uint32_t elem_count; /**< The number of elements in the vector */ + uint32_t elem_type; /**< The type of each element in the vector */ + /* Contents (a series of packed atom bodies) follow here. */ +} LV2_Atom_Vector; + +/** The header of an atom:Property body (e.g. in an atom:Object). */ +typedef struct { + uint32_t key; /**< Key (predicate) (mapped URI). */ + uint32_t context; /**< Context URID (may be, and generally is, 0). */ + LV2_Atom value; /**< Value atom header. */ +} LV2_Atom_Property_Body; + +/** The complete header of an atom:Property. */ +typedef struct { + LV2_Atom atom; /**< Atom header. */ + uint32_t key; /**< Key (predicate) (mapped URI). */ + uint32_t context; /**< Context URID (may be, and generally is, 0). */ + LV2_Atom value; /**< Value atom header. */ + /* Value atom body follows here. */ +} LV2_Atom_Property; + +/** The complete header of an atom:Object. */ +typedef struct { + LV2_Atom atom; /**< Atom header. */ + uint32_t id; /**< URID for atom:Resource, or blank ID for atom:Blank. */ + uint32_t type; /**< Type URID (same as rdf:type, for fast dispatch). */ + /* Contents (a series of property bodies) follow here. */ +} LV2_Atom_Object; + +/** The complete header of an atom:Response. */ +typedef struct { + LV2_Atom atom; /**< Atom header. */ + uint32_t source; /**< ID of message this is a response to (may be 0). */ + uint32_t type; /**< Specific response type URID (may be 0). */ + uint32_t seq; /**< Response sequence number, 0 for end. */ + LV2_Atom body; /**< Body atom header (may be empty). */ + /* Body optionally follows here. */ +} LV2_Atom_Response; + +/** A time stamp in frames. Note this type is NOT an LV2_Atom. */ +typedef struct { + uint32_t frames; /**< Time in frames relative to this block. */ + uint32_t subframes; /**< Fractional time in 1/(2^32)ths of a frame. */ +} LV2_Atom_Audio_Time; + +/** The header of an atom:Event. Note this type is NOT an LV2_Atom. */ +typedef struct { + /** Time stamp. Which type is valid is determined by context. */ + union { + LV2_Atom_Audio_Time audio; /**< Time in audio frames. */ + double beats; /**< Time in beats. */ + } time; + LV2_Atom body; /**< Event body atom header. */ + /* Body atom contents follow here. */ +} LV2_Atom_Event; + +/** + A sequence of events (time-stamped atoms). + + This is used as the contents of an atom:EventPort, but is a generic Atom + type which can be used anywhere. + + The contents of a sequence is a series of LV2_Atom_Event, each aligned + to 64-bits, e.g.: +
+   | Event 1 (size 6)                              | Event 2
+   |       |       |       |       |       |       |       |       |
+   | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+   |FRAMES |SUBFRMS|TYPE   |SIZE   |DATADATADATAPAD|FRAMES |SUBFRMS|...
+   
+*/ +typedef struct { + LV2_Atom atom; /**< Atom header. */ + uint32_t capacity; /**< Maximum size of contents. */ + uint32_t time_type; /**< URID type of event time stamps. */ + /* Contents (a series of events) follow here. */ +} LV2_Atom_Sequence; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV2_ATOM_H */ diff --git a/lv2/lv2plug.in/ns/ext/atom/atom.ttl b/lv2/lv2plug.in/ns/ext/atom/atom.ttl new file mode 100644 index 0000000..7d534d0 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/atom/atom.ttl @@ -0,0 +1,462 @@ +# LV2 Atom Extension +# Copyright 2007-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. + +@prefix atom: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a lv2:Specification ; + doap:name "LV2 Atom" ; + doap:shortdesc "A generic value container and several data types." ; + doap:license ; + rdfs:seeAlso , + ; + doap:release [ + doap:revision "0.4" ; + doap:created "2012-02-07" + ] ; + doap:maintainer [ + a foaf:Person ; + foaf:name "David Robillard" ; + foaf:homepage ; + rdfs:seeAlso + ] ; + lv2:documentation """ +

This extension defines a generic container for data, called an Atom, +and several basic Atom types which can be used to express structured data. +Atoms allow LV2 plugins and hosts to communicate, process, serialise, and store +values of any type via a generic mechanism (e.g. ports, files, networks, +ringbuffers, etc.). Atoms are, with one exception, Plain Old Data (POD) which +may safely be copied (e.g. with a simple call to memcpy).

+ +

Since Atom communication can be implemented generically, plugins that +understand some type can be used together in a host that does not understand +that type, and plugins (e.g. routers, delays) can process atoms of unknown +type.

+ +

Atoms can and should be used anywhere values of various types must be stored +or transmitted. This extension defines port types, atom:ValuePort and +atom:MessagePort, which are connected to an Atom. The atom:Sequence type in +conjunction with atom:MessagePort is intended to replace the LV2 event extension.

+ +

The types defined in this extension should be powerful enough to express +almost any structure. Implementers SHOULD build structures out of the types +provided here, rather than define new binary formats (e.g. use atom:Object +rather than a new C struct type). New binary formats are an +implementation burden which harms interoperabilty, and should only be defined +where absolutely necessary.

+ +

Implementing this extension requires a facility for mapping URIs to +integers, such as the LV2 URID +extension.

+""" . + +atom:cType + a rdf:Property , + owl:DatatypeProperty ; + rdfs:label "C type" ; + rdfs:domain rdfs:Class ; + rdfs:range xsd:string ; + rdfs:comment """ +The identifier for a C type describing the in-memory representation of +an instance of this class. +""" . + +atom:Atom + a rdfs:Class ; + rdfs:label "Atom" ; + atom:cType "LV2_Atom" ; + lv2:documentation """ +

Abstract base class for all atoms. An LV2_Atom has a 32-bit +type and size followed by a body of size +bytes. Atoms MUST be 64-bit aligned.

+ +

All concrete Atom types (subclasses of this class) MUST define a precise +binary layout for their body.

+ +

The type field is the URI of an Atom type mapped to an integer. +Implementations SHOULD gracefully ignore, or pass through, atoms with unknown +types.

+ +

All atoms are POD by definition except references, which as a special case +have type = 0. An Atom MUST NOT contain a Reference. It is safe +to copy any non-reference Atom with a simple memcpy, even if the +implementation does not understand type. Though this extension +reserves the type 0 for references, the details of reference handling are +currently unspecified. A future revision of this extension, or a different +extension, may define how to use non-POD data and references. Implementations +MUST NOT send references to another implementation unless the receiver is +explicitly known to support references (e.g. by supporting a feature). The +atom with both type and size 0 is +null, which is not considered a Reference.

+""" . + +atom:Bang + a rdfs:Class ; + rdfs:subClassOf atom:Atom ; + rdfs:label "Bang" ; + rdfs:comment "Generic activity or trigger, with no body." . + +atom:Number + a rdfs:Class ; + rdfs:subClassOf atom:Atom ; + rdfs:label "Number" . + +atom:Int32 + a rdfs:Class ; + rdfs:subClassOf atom:Number ; + rdfs:label "Signed 32-bit integer" ; + atom:cType "LV2_Atom_Int32" . + +atom:Int64 + a rdfs:Class ; + rdfs:subClassOf atom:Number ; + rdfs:label "Signed 64-bit integer" ; + atom:cType "LV2_Atom_Int64" . + +atom:Float + a rdfs:Class ; + rdfs:subClassOf atom:Number ; + rdfs:label "32-bit IEEE-754 floating point number" ; + atom:cType "LV2_Atom_Float" . + +atom:Double + a rdfs:Class ; + rdfs:subClassOf atom:Number ; + rdfs:label "64-bit IEEE-754 floating point number" ; + atom:cType "LV2_Atom_Double" . + +atom:Bool + a rdfs:Class ; + rdfs:subClassOf atom:Atom ; + rdfs:label "Boolean" ; + atom:cType "LV2_Atom_Bool" ; + rdfs:comment "An Int32 where 0 is false and any other value is true." . + +atom:String + a rdfs:Class ; + rdfs:subClassOf atom:Atom ; + rdfs:label "String" ; + atom:cType "LV2_Atom_String" ; + lv2:documentation """ +

A UTF-8 encoded string.

+ +

The body of an LV2_Atom_String is a C string in UTF-8 encoding, i.e. an +array of bytes (uint8_t) terminated with a NULL byte +('\\0').

+ +

This type can be used for free-form strings, but in most cases it is better to +use atom:Literal since this supports a language tag or datatype. Implementations +SHOULD NOT use atom:String unless translating the string does not make sense and +the string has no meaningful datatype.

+""" . + +atom:Literal + a rdfs:Class ; + rdfs:subClassOf atom:Atom ; + rdfs:label "String Literal" ; + atom:cType "LV2_Atom_Literal" ; + lv2:documentation """ +

A UTF-8 encoded string literal, with an optional datatype or language.

+ +

This type is compatible with rdf:Literal and is capable of expressing a +string in any language or a value of any type. A Literal has a +datatype and lang followed by string data in UTF-8 +encoding. The length of the string data in bytes is size - +sizeof(LV2_Atom_Literal), including the terminating NULL character. The +lang field SHOULD be a URI of the form +<http://lexvo.org/id/term/LANG> where LANG is an ISO 693-2 or ISO 693-3 language code.

+ +

A Literal may have a datatype OR a lang, but never +both.

+ +

For example, a Literal can be "Hello" in English:

+
+void set_to_hello_in_english(LV2_Atom_Literal* lit) {
+     lit->atom.type = map(expand("atom:Literal"));
+     lit->atom.size = 14;
+     lit->datatype  = 0;
+     lit->lang      = map("http://lexvo.org/id/term/en");
+     memcpy(LV2_ATOM_CONTENTS(LV2_Atom_Literal, lit),
+            "Hello",
+            sizeof("Hello"));  // Assumes enough space
+}
+
+ +

or a Turtle string:

+
+void set_to_turtle_string(LV2_Atom_Literal* lit, const char* ttl) {
+     lit->atom.type = map(expand("atom:Literal"));
+     lit->atom.size = 64;
+     lit->datatype  = map("http://www.w3.org/2008/turtle#turtle");
+     lit->lang      = 0;
+     memcpy(LV2_ATOM_CONTENTS(LV2_Atom_Literal, lit),
+            ttl,
+            strlen(ttl) + 1);  // Assumes enough space
+}
+
+""" . + +atom:URID + a rdfs:Class ; + rdfs:subClassOf atom:Atom ; + rdfs:label "Integer ID mapped from a URI" ; + atom:cType "LV2_Atom_ID" ; + lv2:documentation """ +

An unsigned 32-bit integer mapped from a URI (e.g. with LV2_URID_Map).

+""" . + +atom:Vector + a rdfs:Class ; + rdfs:subClassOf atom:Atom ; + rdfs:label "Vector" ; + atom:cType "LV2_Atom_Vector" ; + lv2:documentation """ +

A homogeneous series of atom bodies with equivalent type and size.

+ +

An LV2_Atom_Vector is a 32-bit elem_count and +elem_type followed by elem_count atom bodies of type +elem_type. The element type must be a fixed size atom:Atom type, +i.e. the size of each element is the vector's size / +elem_count.

+ +

For example, an atom:Vector containing 42 elements of type atom:Float:

+
+struct VectorOf42Floats {
+    uint32_t type;        // map(expand("atom:Vector"))
+    uint32_t size;        // sizeof(LV2_Atom_Vector) + (42 * sizeof(float);
+    uint32_t elem_count;  // 42
+    uint32_t elem_type;   // map(expand("atom:Float"))
+    float    elems[32];
+};
+
+ +

Note that it is possible to construct a valid Atom for each element +of the vector, even by an implementation which does not understand +elem_type.

+""" . + +atom:Tuple + a rdfs:Class ; + rdfs:subClassOf atom:Atom ; + rdfs:label "Tuple" ; + lv2:documentation """ +

A series of Atoms with varying type and size.

+ +

The body of a Tuple is simply a series of complete atoms, each aligned to +64 bits.

+""" . + +atom:Property + a rdfs:Class ; + rdfs:subClassOf atom:Atom ; + rdfs:label "Property" ; + atom:cType "LV2_Atom_Property" ; + lv2:documentation """ +

A property of an atom:Object. An LV2_Atom_Property has a URID +key and context, and an Atom value. +This corresponds to an RDF Property, where the key is the predicate +and the value is the object.

+ +

The context field can be used to specify a different context +for each property, where this is useful. Otherwise, it may be 0.

+""" . + +atom:Object + a rdfs:Class ; + rdfs:subClassOf atom:Atom ; + rdfs:label "Object" ; + atom:cType "LV2_Atom_Object" ; + lv2:documentation """ +

An Object is an atom with a set of properties. This corresponds to +an RDF Resource, and can be thought of as a dictionary with URID keys.

+ +

An LV2_Atom_Object has a uint32_t id and uint32_t +type, followed by a series of atom:Property bodies (without +headers, i.e. LV2_Atom_Property_Body). The LV2_Atom_Object::type field is +semantically equivalent to a property with key rdf:type, but is included in the +structure to allow for fast dispatch.

+ +

This is an abstract Atom type, an Object is always either a atom:Resource +or a atom:Blank.

+""" . + +atom:Resource + a rdfs:Class ; + rdfs:subClassOf atom:Object ; + rdfs:label "Resource" ; + atom:cType "LV2_Atom_Object" ; + lv2:documentation """ +

An atom:Object where the id field is a URID, i.e. an Object +with a URI.

+""" . + +atom:Blank + a rdfs:Class ; + rdfs:subClassOf atom:Object ; + rdfs:label "Blank" ; + atom:cType "LV2_Atom_Object" ; + lv2:documentation """ +

An atom:Object where the LV2_Atom_Object::id is a blank node ID (NOT a URI). +The ID of a Blank is valid only within the context the Blank appears in. For +ports this is the context of the associated run() call, i.e. all ports share +the same context so outputs can contain IDs that correspond to IDs of blanks in +the input.

""" . + +atom:Event + a rdfs:Class ; + rdfs:label "Event" ; + atom:cType "LV2_Atom_Event" ; + lv2:documentation """ +

An atom with a time stamp header prepended, typically an element of an +atom:Sequence. Note this is not an Atom type.

+""" . + +atom:Sequence + a rdfs:Class ; + rdfs:subClassOf atom:Atom ; + rdfs:label "Sequence" ; + atom:cType "LV2_Atom_Sequence" ; + lv2:documentation """ +

A sequence of atom:Event, i.e. a series of time-stamped Atoms.

+""" . + +atom:AtomPort + a rdfs:Class ; + rdfs:subClassOf lv2:Port ; + rdfs:label "Atom Port" ; + lv2:documentation """ +

A port which contains an lv2:Atom. Ports of this type will be connected to +a 64-bit aligned LV2_Atom immediately followed by size bytes of +data.

+ +

This is an abstract port type with incomplete semantics which can not be +used directly as a port type. Atom ports should be either a atom:ValuePort or +a atom:MessagePort.

+ +

Before calling a method on a plugin that writes to an AtomPort output, the +host MUST set the size of the Atom in that output to the amount of available +memory immediately following the Atom header. The plugin MUST write a valid +Atom to that port; leaving it untouched is illegal. If there is no reasonable +value to write to the port, the plugin MUST write null (the Atom with both +type and size 0).

+""" . + +atom:ValuePort + a rdfs:Class ; + rdfs:subClassOf atom:AtomPort ; + rdfs:label "Value Port" ; + lv2:documentation """ + +

An AtomPort that contains a persistent value. A value is +time-independent and may be used numerous times. A ValuePort is pure in +the sense that it may affect output but MUST NOT affect persistent plugin state +in any externally visible way.

+ +
    +
  • If a plugin has fixed values for all inputs, all ValuePort outputs are also +fixed regardless of the number of times the plugin is run.
  • + +
  • If a plugin has fixed input values for all ports except a ValuePort, each +value of that port corresponds to a single set of values for all +ValuePort outputs.
  • + +
  • If the plugin saves state other than port values (e.g. using the LV2 State extension), changing only +the value of a ValuePort input MUST NOT change that state. In other words, +value port changes MUST NOT trigger a state change that requires a save.
  • +
+ +

Value ports are essentially purely functional ports: if a plugin has only +value ports, that plugin is purely functional. Hosts may elect to cache output +and avoid calling run() if the output is already known according to these +rules.

+""" . + +atom:MessagePort + a rdfs:Class ; + rdfs:subClassOf atom:AtomPort ; + rdfs:label "Message Port" ; + lv2:documentation """ +

An AtomPort that contains transient data which is consumed or +sent. The Atom contained in a MessagePort is time-dependent and only +valid for a single run invocation. Unlike a ValuePort, a MessagePort may be +used to manipulate internal plugin state.

+ +

Intuitively, a MessagePort contains a message or event which +is reacted to once (not a value which is computed with any +number of times).

+""" . + +atom:bufferType + a rdf:Property ; + rdfs:domain atom:AtomPort ; + rdfs:label "buffer type" ; + lv2:documentation """ +

Indicates that an AtomPort may be connected to a certain Atom type. A port +MAY support several buffer types. The host MUST NOT connect a port to an Atom +with a type not explicitly listed with this property. The value of this +property MUST be a sub-class of atom:Atom. For example, an input port that is +connected directly to an LV2_Atom_Double value is described like so:

+ +
+<plugin>
+    lv2:port [
+        a lv2:InputPort , atom:ValuePort ;
+        atom:bufferType atom:Double ;
+    ] .
+
+ +

Note this property only indicates the atom types a port may be directly +connected to, it is not recursive. If a port can be connected to a +collection, use atom:supports to indicate which element types are understood. +If a port supports heterogeneous collections (collections that can contain +several types of elements at once), implementations MUST gracefully handle any +types that are present in the collection, even if those types are not +explicitly supported.

+""" . + +atom:supports + a rdf:Property ; + rdfs:label "supports" ; + lv2:documentation """ +

Indicates that a particular Atom type is supported.

+ +

This property is defined loosely, it may be used to indicate that anything +supports an Atom type, wherever that may be useful. It applies +recursively where collections are involved.

+ +

In particular, this property can be used to describe which event types are +supported by a port. For example, a port that receives MIDI events is +described like so:

+ +
+<plugin>
+    lv2:port [
+        a lv2:InputPort , atom:MessagePort ;
+        atom:bufferType atom:Sequence ;
+        atom:supports midi:MidiEvent ;
+    ] .
+
+""" . diff --git a/lv2/lv2plug.in/ns/ext/atom/ext.pc.in b/lv2/lv2plug.in/ns/ext/atom/ext.pc.in new file mode 120000 index 0000000..03dd044 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/atom/ext.pc.in @@ -0,0 +1 @@ +../../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/atom/forge.h b/lv2/lv2plug.in/ns/ext/atom/forge.h new file mode 100644 index 0000000..2790778 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/atom/forge.h @@ -0,0 +1,445 @@ +/* + Copyright 2008-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. +*/ + +/** + @file forge.h An API for constructing LV2 atoms. + + This file provides a simple API which can be used to create complex nested + atoms by calling the provided functions to append atoms (or atom headers) in + the correct order. The size of the parent atom is automatically updated, + but the caller must handle this situation if atoms are more deeply nested. + + All output is written to a user-provided buffer. This entire API is + realtime safe and suitable for writing to output port buffers in the run + method. + + Note these functions are all static inline, do not take their address. + + This header is non-normative, it is provided for convenience. +*/ + +#ifndef LV2_ATOM_FORGE_H +#define LV2_ATOM_FORGE_H + +#include +#include + +#include "lv2/lv2plug.in/ns/ext/atom/atom-helpers.h" +#include "lv2/lv2plug.in/ns/ext/atom/atom.h" +#include "lv2/lv2plug.in/ns/ext/urid/urid.h" + +#ifdef __cplusplus +extern "C" { +#else +# include +#endif + +/** + A "forge" for creating atoms by appending to a buffer. +*/ +typedef struct { + uint8_t* buf; + size_t offset; + size_t size; + + LV2_URID Bool; + LV2_URID Double; + LV2_URID Float; + LV2_URID Int32; + LV2_URID Int64; + LV2_URID Literal; + LV2_URID Object; + LV2_URID Property; + LV2_URID Sequence; + LV2_URID String; + LV2_URID Tuple; + LV2_URID URID; + LV2_URID Vector; +} LV2_Atom_Forge; + +/** Set the output buffer where @c forge will write atoms. */ +static inline void +lv2_atom_forge_set_buffer(LV2_Atom_Forge* forge, uint8_t* buf, size_t size) +{ + forge->buf = buf; + forge->size = size; + forge->offset = 0; +} + +/** + Initialise @c forge. + + URIs will be mapped using @c map and stored, a reference to @c map itself is + not held. +*/ +static inline void +lv2_atom_forge_init(LV2_Atom_Forge* forge, LV2_URID_Map* map) +{ + lv2_atom_forge_set_buffer(forge, NULL, 0); + forge->Bool = map->map(map->handle, LV2_ATOM_URI "#Bool"); + forge->Double = map->map(map->handle, LV2_ATOM_URI "#Double"); + forge->Float = map->map(map->handle, LV2_ATOM_URI "#Float"); + forge->Int32 = map->map(map->handle, LV2_ATOM_URI "#Int32"); + forge->Int64 = map->map(map->handle, LV2_ATOM_URI "#Int64"); + forge->Literal = map->map(map->handle, LV2_ATOM_URI "#Literal"); + forge->Object = map->map(map->handle, LV2_ATOM_URI "#Object"); + forge->Property = map->map(map->handle, LV2_ATOM_URI "#Property"); + forge->Sequence = map->map(map->handle, LV2_ATOM_URI "#Sequence"); + forge->String = map->map(map->handle, LV2_ATOM_URI "#String"); + forge->Tuple = map->map(map->handle, LV2_ATOM_URI "#Tuple"); + forge->URID = map->map(map->handle, LV2_ATOM_URI "#URID"); + forge->Vector = map->map(map->handle, LV2_ATOM_URI "#Vector"); +} + +/** + Reserve @c size bytes in the output buffer (used internally). + @return The start of the reserved memory, or NULL if out of space. +*/ +static inline uint8_t* +lv2_atom_forge_reserve(LV2_Atom_Forge* forge, + LV2_Atom* parent, + uint32_t size) +{ + uint8_t* const out = forge->buf + forge->offset; + const uint32_t padded_size = lv2_atom_pad_size(size); + if (forge->offset + padded_size > forge->size) { + return NULL; + } + if (parent) { + parent->size += padded_size; + } + forge->offset += padded_size; + return out; +} + +/** + Write the header of an atom:Atom. + + Space for the complete atom will be reserved, but uninitialised. +*/ +static inline LV2_Atom* +lv2_atom_forge_atom_head(LV2_Atom_Forge* forge, + LV2_Atom* parent, + uint32_t type, + uint32_t size) +{ + LV2_Atom* const out = (LV2_Atom*)lv2_atom_forge_reserve( + forge, parent, size); + if (out) { + out->type = type; + out->size = size - sizeof(LV2_Atom); + } + return out; +} + +/** Write an atom:Int32. */ +static inline LV2_Atom_Int32* +lv2_atom_forge_int32(LV2_Atom_Forge* forge, LV2_Atom* parent, int32_t val) +{ + LV2_Atom_Int32* out = (LV2_Atom_Int32*)lv2_atom_forge_atom_head( + forge, parent, forge->Int32, sizeof(LV2_Atom_Int32)); + if (out) { + out->value = val; + } + return out; +} + +/** Write an atom:Int64. */ +static inline LV2_Atom_Int64* +lv2_atom_forge_int64(LV2_Atom_Forge* forge, LV2_Atom* parent, int64_t val) +{ + LV2_Atom_Int64* out = (LV2_Atom_Int64*)lv2_atom_forge_atom_head( + forge, parent, forge->Int64, sizeof(LV2_Atom_Int64)); + if (out) { + out->value = val; + } + return out; +} + +/** Write an atom:Float. */ +static inline LV2_Atom_Float* +lv2_atom_forge_float(LV2_Atom_Forge* forge, LV2_Atom* parent, float val) +{ + LV2_Atom_Float* out = (LV2_Atom_Float*)lv2_atom_forge_atom_head( + forge, parent, forge->Float, sizeof(LV2_Atom_Float)); + if (out) { + out->value = val; + } + return out; +} + +/** Write an atom:Double. */ +static inline LV2_Atom_Double* +lv2_atom_forge_double(LV2_Atom_Forge* forge, LV2_Atom* parent, double val) +{ + LV2_Atom_Double* out = (LV2_Atom_Double*)lv2_atom_forge_atom_head( + forge, parent, forge->Double, sizeof(LV2_Atom_Double)); + if (out) { + out->value = val; + } + return out; +} + +/** Write an atom:Bool. */ +static inline LV2_Atom_Bool* +lv2_atom_forge_bool(LV2_Atom_Forge* forge, LV2_Atom* parent, bool val) +{ + LV2_Atom_Bool* out = (LV2_Atom_Bool*)lv2_atom_forge_atom_head( + forge, parent, forge->Bool, sizeof(LV2_Atom_Bool)); + if (out) { + out->value = val ? 1 : 0; + } + return out; +} + +/** Write an atom:URID. */ +static inline LV2_Atom_URID* +lv2_atom_forge_urid(LV2_Atom_Forge* forge, LV2_Atom* parent, LV2_URID id) +{ + LV2_Atom_URID* out = (LV2_Atom_URID*)lv2_atom_forge_reserve( + forge, parent, sizeof(LV2_Atom_URID)); + if (out) { + out->atom.type = forge->URID; + out->atom.size = sizeof(uint32_t); + out->id = id; + } + return out; +} + +/** Write an atom:String. */ +static inline LV2_Atom_String* +lv2_atom_forge_string(LV2_Atom_Forge* forge, + LV2_Atom* parent, + const uint8_t* str, + size_t len) +{ + LV2_Atom_String* out = (LV2_Atom_String*)lv2_atom_forge_reserve( + forge, parent, sizeof(LV2_Atom_String) + len + 1); + if (out) { + out->atom.type = forge->String; + out->atom.size = len + 1; + assert(LV2_ATOM_CONTENTS(LV2_Atom_String, out) == LV2_ATOM_BODY(out)); + uint8_t* buf = LV2_ATOM_CONTENTS(LV2_Atom_String, out); + memcpy(buf, str, len); + buf[len] = '\0'; + } + return out; +} + +/** Write an atom:Literal. */ +static inline LV2_Atom_Literal* +lv2_atom_forge_literal(LV2_Atom_Forge* forge, + LV2_Atom* parent, + const uint8_t* str, + size_t len, + uint32_t datatype, + uint32_t lang) +{ + LV2_Atom_Literal* out = (LV2_Atom_Literal*)lv2_atom_forge_reserve( + forge, parent, sizeof(LV2_Atom_Literal) + len + 1); + if (out) { + out->atom.type = forge->Literal; + out->atom.size = sizeof(LV2_Atom_Literal_Head) + len + 1; + out->literal.datatype = datatype; + out->literal.lang = lang; + uint8_t* buf = LV2_ATOM_CONTENTS(LV2_Atom_Literal, out); + memcpy(buf, str, len); + buf[len] = '\0'; + } + return out; +} + +/** Write an atom:Vector header and reserve space for the body. */ +static inline LV2_Atom_Vector* +lv2_atom_forge_reserve_vector(LV2_Atom_Forge* forge, + LV2_Atom* parent, + uint32_t elem_count, + uint32_t elem_type, + uint32_t elem_size) +{ + const size_t size = sizeof(LV2_Atom_Vector) + (elem_size * elem_count); + LV2_Atom_Vector* out = (LV2_Atom_Vector*)lv2_atom_forge_reserve( + forge, parent, size); + if (out) { + out->atom.type = forge->Vector; + out->atom.size = size - sizeof(LV2_Atom); + out->elem_count = elem_count; + out->elem_type = elem_type; + } + return out; +} + +/** Write an atom:Vector. */ +static inline LV2_Atom_Vector* +lv2_atom_forge_vector(LV2_Atom_Forge* forge, + LV2_Atom* parent, + uint32_t elem_count, + uint32_t elem_type, + uint32_t elem_size, + void* elems) +{ + LV2_Atom_Vector* out = lv2_atom_forge_reserve_vector( + forge, parent, elem_count, elem_type, elem_size); + if (out) { + uint8_t* buf = LV2_ATOM_CONTENTS(LV2_Atom_Vector, out); + memcpy(buf, elems, elem_size * elem_count); + } + return out; +} + +/** + Write the header of an atom:Tuple. + + To complete the tuple, write a sequence of atoms, always passing the + returned tuple as the @c parent parameter (or otherwise ensuring the size is + updated correctly). + + For example: + @code + // Write tuple (1, 2.0) + LV2_Atom* tup = (LV2_Atom*)lv2_atom_forge_tuple(forge, NULL); + lv2_atom_forge_int32(forge, tup, 1); + lv2_atom_forge_float(forge, tup, 2.0); + @endcode +*/ +static inline LV2_Atom_Tuple* +lv2_atom_forge_tuple(LV2_Atom_Forge* forge, + LV2_Atom* parent) +{ + return (LV2_Atom_Tuple*)lv2_atom_forge_atom_head( + forge, parent, forge->Tuple, sizeof(LV2_Atom)); +} + +/** + Write the header of an atom:Object. + + To complete the object, write a sequence of properties, always passing the + object as the @c parent parameter (or otherwise ensuring the size is updated + correctly). + + For example: + @code + LV2_URID eg_Cat = map("http://example.org/Cat"); + LV2_URID eg_name = map("http://example.org/name"); + + // Write object header + LV2_Atom* obj = (LV2_Atom*)lv2_atom_forge_object(forge, NULL, 0, eg_Cat); + + // Write property: eg:name = "Hobbes" + lv2_atom_forge_property_head(forge, obj, eg_name, 0); + lv2_atom_forge_string(forge, obj, "Hobbes", strlen("Hobbes")); + @endcode +*/ +static inline LV2_Atom_Object* +lv2_atom_forge_object(LV2_Atom_Forge* forge, + LV2_Atom* parent, + LV2_URID id, + LV2_URID type) +{ + LV2_Atom_Object* out = (LV2_Atom_Object*)lv2_atom_forge_reserve( + forge, parent, sizeof(LV2_Atom_Object)); + if (out) { + out->atom.type = forge->Object; + out->atom.size = sizeof(LV2_Atom_Object) - sizeof(LV2_Atom); + out->id = id; + out->type = type; + } + return out; +} + +/** + Write the header for a property body (likely in an Object). + See lv2_atom_forge_object() documentation for an example. +*/ +static inline LV2_Atom_Property_Body* +lv2_atom_forge_property_head(LV2_Atom_Forge* forge, + LV2_Atom* parent, + LV2_URID key, + LV2_URID context) +{ + LV2_Atom_Property_Body* out = (LV2_Atom_Property_Body*) + lv2_atom_forge_reserve(forge, parent, 2 * sizeof(uint32_t)); + if (out) { + out->key = key; + out->context = context; + } + return out; +} + +/** + Write the header for a Sequence. + The size of the returned sequence will be 0, so passing it as the parent + parameter to other forge methods will do the right thing. +*/ +static inline LV2_Atom_Sequence* +lv2_atom_forge_sequence_head(LV2_Atom_Forge* forge, + LV2_Atom* parent, + uint32_t capacity) +{ + LV2_Atom_Sequence* out = (LV2_Atom_Sequence*) + lv2_atom_forge_reserve(forge, parent, sizeof(LV2_Atom_Sequence)); + if (out) { + out->atom.type = forge->Sequence; + out->atom.size = sizeof(LV2_Atom_Sequence) - sizeof(LV2_Atom); + out->capacity = capacity; + out->pad = 0; + } + return out; +} + +/** + Write the time stamp header of an Event (in a Sequence) in audio frames. + After this, call the appropriate forge method(s) to write the body, passing + the same @c parent parameter. Note the returned LV2_Event is NOT an Atom. +*/ +static inline LV2_Atom_Event* +lv2_atom_forge_audio_time(LV2_Atom_Forge* forge, + LV2_Atom* parent, + uint32_t frames, + uint32_t subframes) +{ + LV2_Atom_Event* out = (LV2_Atom_Event*) + lv2_atom_forge_reserve(forge, parent, 2 * sizeof(uint32_t)); + if (out) { + out->time.audio.frames = frames; + out->time.audio.subframes = subframes; + } + return out; +} + +/** + Write the time stamp header of an Event (in a Sequence) in beats. + After this, call the appropriate forge method(s) to write the body, passing + the same @c parent parameter. Note the returned LV2_Event is NOT an Atom. +*/ +static inline LV2_Atom_Event* +lv2_atom_forge_beat_time(LV2_Atom_Forge* forge, + LV2_Atom* parent, + double beats) +{ + LV2_Atom_Event* out = (LV2_Atom_Event*) + lv2_atom_forge_reserve(forge, parent, sizeof(double)); + if (out) { + out->time.beats = beats; + } + return out; +} + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV2_ATOM_FORGE_H */ diff --git a/lv2/lv2plug.in/ns/ext/atom/manifest.ttl b/lv2/lv2plug.in/ns/ext/atom/manifest.ttl new file mode 100644 index 0000000..37f0f58 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/atom/manifest.ttl @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 0 ; + lv2:microVersion 4 ; + rdfs:seeAlso . + diff --git a/lv2/lv2plug.in/ns/ext/atom/waf b/lv2/lv2plug.in/ns/ext/atom/waf new file mode 120000 index 0000000..5235032 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/atom/waf @@ -0,0 +1 @@ +../../../../../waf \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/atom/wscript b/lv2/lv2plug.in/ns/ext/atom/wscript new file mode 120000 index 0000000..7e2c01b --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/atom/wscript @@ -0,0 +1 @@ +../../../../../ext.wscript \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/contexts/contexts.h b/lv2/lv2plug.in/ns/ext/contexts/contexts.h new file mode 100644 index 0000000..f49b474 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/contexts/contexts.h @@ -0,0 +1,82 @@ +/* LV2 Contexts Extension + * Copyright (C) 2007-2009 David Robillard + * + * This header is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This header is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +/** @file + * C header for the LV2 Contexts extension + * . + */ + +#ifndef LV2_CONTEXTS_H +#define LV2_CONTEXTS_H + +#include + +#include "lv2/lv2plug.in/ns/lv2core/lv2.h" + +#define LV2_CONTEXTS_URI "http://lv2plug.in/ns/ext/contexts" + +static inline void +lv2_contexts_set_port_valid(void* flags, uint32_t index) { + ((uint8_t*)flags)[index / 8] |= 1 << (index % 8); +} + +static inline void +lv2_contexts_unset_port_valid(void* flags, uint32_t index) { + ((uint8_t*)flags)[index / 8] &= ~(1 << (index % 8)); +} + +static inline int +lv2_contexts_port_is_valid(const void* flags, uint32_t index) { + return (((uint8_t*)flags)[index / 8] & (1 << (index % 8))) != 0; +} + +typedef struct { + + /** The message run function. This is called once to process a set of + * inputs and produce a set of outputs. + * + * Before calling the host MUST set valid_inputs such that the bit + * corresponding to each input port is 1 iff data is present. The plugin + * MUST only inspect bits corresponding to ports in the message thread. + * + * Similarly, before returning the plugin MUST set valid_outputs such that + * the bit corresponding to each output port of the message context is 1 + * iff the value at that port has changed. + * The plugin must return 1 if outputs have been written, 0 otherwise. + */ + uint32_t (*run)(LV2_Handle instance, + const void* valid_inputs, + void* valid_outputs); + +} LV2_Contexts_MessageContext; + +typedef void* LV2_Contexts_Request_Run_Data; + +typedef struct { + + /** Pointer to opaque host data (to be passed to request_run) */ + LV2_Contexts_Request_Run_Data data; + + /** Request the host execute the context with the given URI */ + void (*request_run)(LV2_Contexts_Request_Run_Data host_handle, + uint32_t context_uri); + +} LV2_Contexts_Request_Run_Feature; + +#endif /* LV2_CONTEXTS_H */ + diff --git a/lv2/lv2plug.in/ns/ext/contexts/contexts.ttl b/lv2/lv2plug.in/ns/ext/contexts/contexts.ttl new file mode 100644 index 0000000..c56c649 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/contexts/contexts.ttl @@ -0,0 +1,134 @@ +# LV2 Contexts Extension +# +# Allows for an LV2 plugin to have several independent contexts, each with its +# own run callback and associated ports. +# +# Copyright (C) 2007-2010 David Robillard +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR +# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +# OTHER DEALINGS IN THE SOFTWARE. + +@prefix ctx: . +@prefix lv2: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . +@prefix doap: . +@prefix foaf: . + + + a lv2:Specification , lv2:Feature ; + doap:name "LV2 Contexts" ; + doap:shortdesc "Support for plugins with several execution contexts." ; + lv2:documentation """ +

An extension for LV2 plugins which have several execution contexts.

+ +

Contexts allow plugins to run tasks and/or process input/output in +multiple threads. Contexts can be used to add non-realtime functionality +to a plugin while still keeping the audio run() method realtime safe.

+ +

A context is an LV2 feature, so the usual LV2 feature mechanism is used +to determine whether a plugin has a given context, and whether or not it is +mandatory.

+ +

Unless otherwise stated, each context (defined by some URI) adds a new +threading class similar to the Audio class defined by LV2. Each context has a +run callback and a connect_port callback both in the same class (i.e. can't be +called concurrently), but may be called concurrently with functions for other +contexts (excluding the Instantiation class). Context properties such as +ctx:hardRTCapable apply to both functions. +The host MUST only call the correct connect_port function associated with the +context for that port, i.e. it is an error to use the main LV2 connect_port +function on a port with a context other than the main LV2 run function.

+""" . + + +########################## +## Context Base Classes ## +########################## + +ctx:Context a rdfs:Class ; + rdfs:label "LV2 Context" ; + lv2:documentation """ +

A potentially concurrent context (callback) on a plugin.

+ +

Ports are always associated with a context. If a port has no explicit context +property, then its context is ctx:audioContext (the default LV2 run() context).

+ +

A plugin indicates support for a context by supporting an LV2 Feature with +that context's URI. If a plugin optionally supports a context (e.g. +<plugin> lv2:optionalFeature ctx:idleContext .), then +all ports associated with that context MUST be lv2:connectionOptional. Thus, +hosts that do not support contexts will connect such ports to NULL and the +plugin can run with only a standard LV2 run() context.

+ +

Any plugin that supports any context (optionally or mandatorily) MUST adhere +to the following additional threading rules for LV2_Descriptor.connect_port:

+
    +
  • connect_port MUST only be called for a given port from the context +associated with that port
  • +
  • connect_port MAY be called concurrently for ports with different +contexts (but MUST NOT be called concurrently for multiple ports in the +same context)
  • +
+

Note this implies that any shared data access in connect_port may be +accessed concurrently. The plugin is responsible for any synchronisation +or locking necessary to make this possible.

+""" . + +ctx:audioContext a ctx:Context , lv2:Feature ; + rdfs:comment """The context of LV2_Descriptor.run().""" . + +ctx:messageContext a ctx:Context , lv2:Feature ; + lv2:documentation """ +

A non-realtime context for plugin control via message passing. This context +has a run method which takes a bitset of flags for parameters specifying which +input and output ports are valid before and after the run method has executed, +respectively (see LV2_Contexts_MessageContext).

+""" . + +ctx:idleContext a ctx:Context , lv2:Feature ; + rdfs:comment """ +A non-realtime idle context, periodically run by the host roughly every second. +This context never has any ports. +""" . + +ctx:requestRunFeature a lv2:Feature ; + lv2:documentation """ +

A feature allowing the plugin to request the execution of a particular +context at an arbitrary time. To support this feature, the host MUST pass an +LV2_Feature to instantiate with data pointing to a +LV2_Contexts_Request_Run_Feature.

+ +

The plugin MAY call request_run with the given +data from any non-realtime context to demand soon-as-possible execution +of the specified context.

+""" . + +ctx:context a rdf:Property ; + rdfs:domain lv2:Port ; + rdfs:range ctx:Context ; + rdfs:label "is used in context" ; + rdfs:comment """ +The context a particular port is associated with; the port will only be +connected/read/written by that context. + +If no context is specified, the port is considered part of the default LV2 +audio context.""" . + + diff --git a/lv2/lv2plug.in/ns/ext/contexts/ext.pc.in b/lv2/lv2plug.in/ns/ext/contexts/ext.pc.in new file mode 120000 index 0000000..03dd044 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/contexts/ext.pc.in @@ -0,0 +1 @@ +../../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/contexts/manifest.ttl b/lv2/lv2plug.in/ns/ext/contexts/manifest.ttl new file mode 100644 index 0000000..d2cc036 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/contexts/manifest.ttl @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 0 ; + lv2:microVersion 1 ; + rdfs:seeAlso . + diff --git a/lv2/lv2plug.in/ns/ext/contexts/test.c b/lv2/lv2plug.in/ns/ext/contexts/test.c new file mode 100644 index 0000000..ca41a10 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/contexts/test.c @@ -0,0 +1,67 @@ +#include +#include +#include +#include +#include +#include +#include "contexts.h" + +#define TEST_ASSERT(check) do {\ + if (!(check)) {\ + fprintf(stderr, "Failure at line %d: %s\n", __LINE__, #check);\ + assert(false);\ + _exit(1);\ + }\ +} while (0) + +#define NUM_PORTS 64 + +void +print_flags(void* flags) +{ + for (int i = NUM_PORTS; i >= 0; --i) + printf((lv2_contexts_port_is_valid(flags, i)) ? "1" : "0"); + printf("\n"); +} + + +int +main() +{ + uint64_t flags = 0; + print_flags(&flags); + + lv2_contexts_set_port_valid(&flags, 16); + print_flags(&flags); + for (int i = 0; i < NUM_PORTS; ++i) { + if (i == 16) { + TEST_ASSERT(lv2_contexts_port_is_valid(&flags, i)); + } else { + TEST_ASSERT(!lv2_contexts_port_is_valid(&flags, i)); + } + } + + lv2_contexts_set_port_valid(&flags, 46); + lv2_contexts_set_port_valid(&flags, 0); + print_flags(&flags); + for (int i = 0; i < NUM_PORTS; ++i) { + if (i == 0 || i == 16 || i == 46) { + TEST_ASSERT(lv2_contexts_port_is_valid(&flags, i)); + } else { + TEST_ASSERT(!lv2_contexts_port_is_valid(&flags, i)); + } + } + + lv2_contexts_unset_port_valid(&flags, 16); + print_flags(&flags); + for (int i = 0; i < NUM_PORTS; ++i) { + if (i == 0 || i == 46) { + TEST_ASSERT(lv2_contexts_port_is_valid(&flags, i)); + } else { + TEST_ASSERT(!lv2_contexts_port_is_valid(&flags, i)); + } + } + + return 0; +} + diff --git a/lv2/lv2plug.in/ns/ext/contexts/waf b/lv2/lv2plug.in/ns/ext/contexts/waf new file mode 120000 index 0000000..5235032 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/contexts/waf @@ -0,0 +1 @@ +../../../../../waf \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/contexts/wscript b/lv2/lv2plug.in/ns/ext/contexts/wscript new file mode 120000 index 0000000..7e2c01b --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/contexts/wscript @@ -0,0 +1 @@ +../../../../../ext.wscript \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/cv-port/cv-port.ttl b/lv2/lv2plug.in/ns/ext/cv-port/cv-port.ttl new file mode 100644 index 0000000..09016d6 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/cv-port/cv-port.ttl @@ -0,0 +1,77 @@ +# LV2 CV Port Extension +# Copyright 2011 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 cv: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdf: . +@prefix rdfs: . + + + a lv2:Specification ; + doap:license ; + doap:name "LV2 CV Port" ; + doap:shortdesc "Control Voltage ports for LV2 plugins." ; + doap:maintainer [ + a foaf:Person ; + foaf:name "David Robillard" ; + foaf:homepage ; + rdfs:seeAlso + ] ; + lv2:documentation """ +

This extension defines Control Voltage (CV) ports, which are audio-rate +control ports like those used on classical voltage-controlled synthesizers. +These ports serve as control ports like lv2:ControlPort but can +also be used for audio-rate modulation of control signals. This enables many +types of processing and synthesis which are not possible with a lower control +rate.

+""" . + +cv:CVPort + a rdfs:Class ; + rdfs:label "CV Port" ; + rdfs:subClassOf lv2:Port ; + lv2:documentation """ + +

Ports of this type have identical semantics to lv2:AudioPort in terms of +buffer format and connection/input/output logistics. However, rather than the +buffer representing audio, the buffer represents audio-rate control data. A +CVPort SHOULD have the same properties a lv2:ControlPort typically +has to describe appropriate control values (e.g. lv2:minimum, lv2:maximum, lv2:default)

+ +

Hosts SHOULD take care to prevent data from a CVPort port from being used as +audio except in cases where this is known to be safe.

+ +

Example:

+
+<http://example.org/some-plugin>
+    lv2:port [
+        a cv:CVPort, lv2:InputPort ;
+        lv2:index 0 ;
+        lv2:minimum -1.0 ;
+        lv2:maximum 1.0 ;
+        lv2:default 0.0 ;
+        lv2:symbol "modulation" ;
+        lv2:name "Modulation" ;
+    ] .
+
+""" . diff --git a/lv2/lv2plug.in/ns/ext/cv-port/ext.pc.in b/lv2/lv2plug.in/ns/ext/cv-port/ext.pc.in new file mode 120000 index 0000000..03dd044 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/cv-port/ext.pc.in @@ -0,0 +1 @@ +../../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/cv-port/manifest.ttl b/lv2/lv2plug.in/ns/ext/cv-port/manifest.ttl new file mode 100644 index 0000000..e5fa145 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/cv-port/manifest.ttl @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 0 ; + lv2:microVersion 1 ; + rdfs:seeAlso . + diff --git a/lv2/lv2plug.in/ns/ext/cv-port/waf b/lv2/lv2plug.in/ns/ext/cv-port/waf new file mode 120000 index 0000000..5235032 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/cv-port/waf @@ -0,0 +1 @@ +../../../../../waf \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/cv-port/wscript b/lv2/lv2plug.in/ns/ext/cv-port/wscript new file mode 120000 index 0000000..7e2c01b --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/cv-port/wscript @@ -0,0 +1 @@ +../../../../../ext.wscript \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/data-access/data-access.h b/lv2/lv2plug.in/ns/ext/data-access/data-access.h new file mode 100644 index 0000000..fac6974 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/data-access/data-access.h @@ -0,0 +1,56 @@ +/* + LV2 Data Access Extension + Copyright 2008-2011 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. +*/ + +/** + @file data-access.h + C header for the LV2 Extension Data extension + . + + This extension defines a method for (e.g.) plugin UIs to have (possibly + marshalled) access to the extension_data function on a plugin instance. +*/ + +#ifndef LV2_DATA_ACCESS_H +#define LV2_DATA_ACCESS_H + +#define LV2_DATA_ACCESS_URI "http://lv2plug.in/ns/ext/data-access" + +/** + The data field of the LV2_Feature for this extension. + + To support this feature the host must pass an LV2_Feature struct to the + instantiate method with URI "http://lv2plug.in/ns/ext/data-access" + and data pointed to an instance of this struct. +*/ +typedef struct { + /** + A pointer to a method the UI can call to get data (of a type specified + by some other extension) from the plugin. + + This call never is never guaranteed to return anything, UIs should + degrade gracefully if direct access to the plugin data is not possible + (in which case this function will return NULL). + + This is for access to large data that can only possibly work if the UI + and plugin are running in the same process. For all other things, use + the normal LV2 UI communication system. + */ + const void* (*data_access)(const char* uri); + +} LV2_Extension_Data_Feature; + +#endif /* LV2_DATA_ACCESS_H */ diff --git a/lv2/lv2plug.in/ns/ext/data-access/data-access.ttl b/lv2/lv2plug.in/ns/ext/data-access/data-access.ttl new file mode 100644 index 0000000..6b0d817 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/data-access/data-access.ttl @@ -0,0 +1,82 @@ +# LV2 Data Access Extension +# Copyright 2008-2011 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 da: . +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix lv2ev: . +@prefix rdf: . +@prefix rdfs: . + + + a foaf:Person ; + foaf:name "David Robillard" ; + foaf:homepage ; + foaf:mbox ; + rdfs:seeAlso . + + + a lv2:Specification , + doap:Project ; + doap:license ; + doap:name "LV2 Data Access" ; + doap:shortdesc "Provides access to LV2_Descriptor::extension_data()." ; + doap:developer ; + doap:release [ + doap:revision "1.4" ; + doap:created "2011-11-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Update packaging." + ] , [ + rdfs:label "Improve documentation." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2011-05-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add build system for installation." + ] , [ + rdfs:label "Switch to ISC license." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2010-10-04" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ +

This extension defines a feature, LV2_Extension_Data_Feature, which provides +access to LV2_Descriptor::extension_data() for plugin UIs or other potentially +remote users of a plugin.

+ +

To support this feature the host must pass an LV2_Feature struct to the +instantiate method with URI LV2_DATA_ACCESS_URI and data pointed to an instance +of LV2_Extension_Data_Feature.

+""" . \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/data-access/ext.pc.in b/lv2/lv2plug.in/ns/ext/data-access/ext.pc.in new file mode 120000 index 0000000..03dd044 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/data-access/ext.pc.in @@ -0,0 +1 @@ +../../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/data-access/manifest.ttl b/lv2/lv2plug.in/ns/ext/data-access/manifest.ttl new file mode 100644 index 0000000..f7ccd9d --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/data-access/manifest.ttl @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 4 ; + rdfs:seeAlso . + diff --git a/lv2/lv2plug.in/ns/ext/data-access/waf b/lv2/lv2plug.in/ns/ext/data-access/waf new file mode 120000 index 0000000..5235032 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/data-access/waf @@ -0,0 +1 @@ +../../../../../waf \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/data-access/wscript b/lv2/lv2plug.in/ns/ext/data-access/wscript new file mode 120000 index 0000000..7e2c01b --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/data-access/wscript @@ -0,0 +1 @@ +../../../../../ext.wscript \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/dynmanifest/dynmanifest.h b/lv2/lv2plug.in/ns/ext/dynmanifest/dynmanifest.h new file mode 100644 index 0000000..51908b7 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/dynmanifest/dynmanifest.h @@ -0,0 +1,144 @@ +/* + Dynamic manifest specification for LV2 + Copyright 2008-2011 Stefano D'Angelo + + 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 dynmanifest.h + C header for the LV2 Dynamic Manifest extension + . + Revision: 1.2 +*/ + +#ifndef LV2_DYN_MANIFEST_H_INCLUDED +#define LV2_DYN_MANIFEST_H_INCLUDED + +#include + +#include "lv2/lv2plug.in/ns/lv2core/lv2.h" + +#define LV2_DYN_MANIFEST_URI "http://lv2plug.in/ns/ext/dynmanifest" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + Dynamic manifest generator handle. + + This handle indicates a particular status of a dynamic manifest generator. + The host MUST NOT attempt to interpret it and, unlikely LV2_Handle, it is + NOT even valid to compare this to NULL. The dynamic manifest generator MAY + use it to reference internal data. +*/ +typedef void * LV2_Dyn_Manifest_Handle; + +/** + Generate the dynamic manifest. + + @param handle Pointer to an uninitialized dynamic manifest generator handle. + + @param features NULL terminated array of LV2_Feature structs which represent + the features the host supports. The dynamic manifest generator may refuse to + (re)generate the dynamic manifest if required features are not found here + (however hosts SHOULD NOT use this as a discovery mechanism, instead of + reading the static manifest file). This array must always exist; if a host + has no features, it MUST pass a single element array containing NULL. + + @return 0 on success, otherwise a non-zero error code. The host SHOULD + evaluate the result of the operation by examining the returned value and + MUST NOT try to interpret the value of handle. +*/ +int lv2_dyn_manifest_open(LV2_Dyn_Manifest_Handle * handle, + const LV2_Feature *const * features); + +/** + Fetch a "list" of subject URIs described in the dynamic manifest. + + The dynamic manifest generator has to fill the resource only with the needed + triples to make the host aware of the "objects" it wants to expose. For + example, if the plugin library exposes a regular LV2 plugin, it should + output only a triple like the following: + + a lv2:Plugin . + + The objects that are elegible for exposure are those that would need to be + represented by a subject node in a static manifest. + + @param handle Dynamic manifest generator handle. + + @param fp FILE * identifying the resource the host has to set up for the + dynamic manifest generator. The host MUST pass a writable, empty resource to + this function, and the dynamic manifest generator MUST ONLY perform write + operations on it at the end of the stream (e.g., using only fprintf(), + fwrite() and similar). + + @return 0 on success, otherwise a non-zero error code. +*/ +int lv2_dyn_manifest_get_subjects(LV2_Dyn_Manifest_Handle handle, + FILE * fp); + +/** + Function that fetches data related to a specific URI. + + The dynamic manifest generator has to fill the resource with data related to + object represented by the given URI. For example, if the library exposes a + regular LV2 plugin whose URI, as retrieved by the host using + lv2_dyn_manifest_get_subjects() is http://www.example.com/plugin/uri, it + should output something like: + +
+   
+       a lv2:Plugin ;
+       doap:name "My Plugin" ;
+       lv2:binary  ;
+       etc:etc "..." .
+   
+ + @param handle Dynamic manifest generator handle. + + @param fp FILE * identifying the resource the host has to set up for the + dynamic manifest generator. The host MUST pass a writable resource to this + function, and the dynamic manifest generator MUST ONLY perform write + operations on it at the current position of the stream (e.g. using only + fprintf(), fwrite() and similar). + + @param uri URI to get data about (in the "plain" form, i.e., absolute URI + without Turtle prefixes). + + @return 0 on success, otherwise a non-zero error code. +*/ +int lv2_dyn_manifest_get_data(LV2_Dyn_Manifest_Handle handle, + FILE * fp, + const char * uri); + +/** + Function that ends the operations on the dynamic manifest generator. + + This function SHOULD be used by the dynamic manifest generator to perform + cleanup operations, etc. + + Once this function is called, referring to handle will cause undefined + behavior. + + @param handle Dynamic manifest generator handle. +*/ +void lv2_dyn_manifest_close(LV2_Dyn_Manifest_Handle handle); + +#ifdef __cplusplus +} +#endif + +#endif /* LV2_DYN_MANIFEST_H_INCLUDED */ diff --git a/lv2/lv2plug.in/ns/ext/dynmanifest/dynmanifest.ttl b/lv2/lv2plug.in/ns/ext/dynmanifest/dynmanifest.ttl new file mode 100644 index 0000000..2054a17 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/dynmanifest/dynmanifest.ttl @@ -0,0 +1,107 @@ +# LV2 Dynamic Manifest Extension +# Copyright 2008-2011 Stefano D'Angelo +# +# 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 dman: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a lv2:Specification ; + lv2:documentation """ +

The LV2 API, on its own, cannot be used to write plugin libraries where data +is dynamically generated at runtime (e.g. API wrappers), since LV2 requires +needed information to be provided in one or more static data (RDF) files. This +API addresses this limitation by extending the LV2 API.

+ +

To detect that a plugin library implements a dynamic manifest generator, +the host checks its static manifest for a description like:

+ +
+<http://example.org/my-dynamic-manifest>
+    a dman:DynManifest ;
+    lv2:binary <mydynmanifest.so> .
+
+ +

To load the data, the host loads the library +(e.g. mydynmanifest.so) as usual and fetches the dynamic Turtle +data from it using this API.

+ +

The host is allowed to request regeneration of the dynamic manifest multiple +times, and the plugin library is expected to provide updated data if/when +possible. All data and references provided via this API before the last +regeneration of the dynamic manifest is to be considered invalid by the host, +including plugin descriptors whose URIs were discovered using this API.

+ +

Accessing Data

+ +

Whenever a host wants to access data using this API, it could:

+ +
    +
  1. Call lv2_dyn_manifest_open().
  2. +
  3. Create a FILE for functions to write data to (e.g. using tmpfile()).
  4. +
  5. Get a list of exposed subject URIs using + lv2_dyn_manifest_get_subjects().
  6. +
  7. Call lv2_dyn_manifest_get_data() for each URI of interest to + get the data related to that URI (which can be written to any FILE).
  8. +
  9. Call lv2_dyn_manifest_close().
  10. +
  11. Parse the content of the FILE(s).
  12. +
  13. Free/delete/unlink the FILE(s).
  14. +
+ +

Each call to the above mentioned dynamic manifest functions MUST write a +complete, valid Turtle document (including all needed prefix definitions) to +the output FILE.

+ +

Each call to lv2_dyn_manifest_open() causes the (re)generation of the +dynamic manifest data, and invalidates all data fetched before the call.

+ +

In case the plugin library uses this same API to access other dynamic +manifests, it MUST implement some mechanism to avoid potentially endless loops +(such as A loads B, B loads A, etc.) and, in case such a loop is detected, the +operation MUST fail. For this purpose, use of a static boolean flag is +suggested.

+ +

Threading Rules

+ +

All of the functions defined by this specification belong to the Discovery +class.

+""" . + +dman:DynManifest + a rdfs:Class ; + rdfs:subClassOf lv2:Resource ; + rdfs:label "Dynamic manifest generator" ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:onProperty lv2:binary ; + owl:minCardinality 1 ; + rdfs:comment """ +A DynManifest MUST have at least 1 lv2:binary, which MUST implement all the +functions defined in dynmanifest.h. +""" + ] ; + rdfs:comment """ +The class which represents a dynamic manifest generator. + +There MUST NOT be any instances of dman:DynManifest in the generated manifest. + +All relative URIs in the generated data MUST be relative to the base path +that would be used to parse a normal LV2 manifest (the bundle path). +""" . diff --git a/lv2/lv2plug.in/ns/ext/dynmanifest/ext.pc.in b/lv2/lv2plug.in/ns/ext/dynmanifest/ext.pc.in new file mode 120000 index 0000000..03dd044 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/dynmanifest/ext.pc.in @@ -0,0 +1 @@ +../../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/dynmanifest/lv2-dynmanifest.doap.ttl b/lv2/lv2plug.in/ns/ext/dynmanifest/lv2-dynmanifest.doap.ttl new file mode 100644 index 0000000..6c4d985 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/dynmanifest/lv2-dynmanifest.doap.ttl @@ -0,0 +1,43 @@ +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix rdfs: . + + + a foaf:Person ; + foaf:name "David Robillard" ; + foaf:homepage ; + foaf:mbox ; + rdfs:seeAlso . + + + a doap:Project ; + doap:license ; + doap:name "LV2 Dynamic Manifest" ; + doap:homepage ; + doap:created "2009-06-13" ; + doap:shortdesc "Support for dynamic data generation." ; + doap:programming-language "C" ; + doap:developer [ + a foaf:Person ; + foaf:name "Stefano D'Angelo" + ] ; + doap:release [ + doap:revision "1.2" ; + doap:created "2011-11-21" ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Improve documentation." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2010-04-10" ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] . diff --git a/lv2/lv2plug.in/ns/ext/dynmanifest/manifest.ttl b/lv2/lv2plug.in/ns/ext/dynmanifest/manifest.ttl new file mode 100644 index 0000000..cc5a83d --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/dynmanifest/manifest.ttl @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 2 ; + rdfs:seeAlso , + . diff --git a/lv2/lv2plug.in/ns/ext/dynmanifest/waf b/lv2/lv2plug.in/ns/ext/dynmanifest/waf new file mode 120000 index 0000000..5235032 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/dynmanifest/waf @@ -0,0 +1 @@ +../../../../../waf \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/dynmanifest/wscript b/lv2/lv2plug.in/ns/ext/dynmanifest/wscript new file mode 120000 index 0000000..7e2c01b --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/dynmanifest/wscript @@ -0,0 +1 @@ +../../../../../ext.wscript \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/event/event-helpers.h b/lv2/lv2plug.in/ns/ext/event/event-helpers.h new file mode 100644 index 0000000..75ba14b --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/event/event-helpers.h @@ -0,0 +1,246 @@ +/* lv2_event_helpers.h - Helper functions for the LV2 events extension. + * + * Copyright (C) 2008-2009 David Robillard + * + * This header is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This header is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this header; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place, Suite 330, Boston, MA 01222-1307 USA + */ + +#ifndef LV2_EVENT_HELPERS_H +#define LV2_EVENT_HELPERS_H + +#include +#include +#include +#include +#include +#include "lv2/lv2plug.in/ns/ext/event/event.h" + +/** @file + * Helper functions for the LV2 Event extension + * . + * + * 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 (size + 7) & (~7); +} + + +/** 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; + } else { + 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 (e.g. RW Lock). */ +typedef struct { + LV2_Event_Buffer* buf; + uint32_t offset; +} LV2_Event_Iterator; + + +/** Reset an iterator to point to the start of @a buf. + * @return True if @a 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 @a iter is valid. + * @return True if @a iter is valid, otherwise false (past end of buffer) */ +static inline bool +lv2_event_is_valid(LV2_Event_Iterator* iter) +{ + return (iter->offset < iter->buf->size); +} + + +/** Advance @a iter forward one event. + * @a iter must be valid. + * @return True if @a iter is valid, otherwise false (reached end of buffer) */ +static inline bool +lv2_event_increment(LV2_Event_Iterator* iter) +{ + assert(lv2_event_is_valid(iter)); + + LV2_Event* const ev = (LV2_Event*)( + (uint8_t*)iter->buf->data + iter->offset); + + iter->offset += lv2_event_pad_size(sizeof(LV2_Event) + ev->size); + + return true; +} + + +/** Dereference an event iterator (get the event currently pointed at). + * @a iter must be valid. + * @a data if non-NULL, will be set to point to the contents of the event + * returned. + * @return A Pointer to the event @a iter is currently pointing at, or NULL + * if the end of the buffer is reached (in which case @a data is + * also set to NULL). */ +static inline LV2_Event* +lv2_event_get(LV2_Event_Iterator* iter, + uint8_t** data) +{ + assert(lv2_event_is_valid(iter)); + + LV2_Event* const ev = (LV2_Event*)( + (uint8_t*)iter->buf->data + iter->offset); + + if (data) + *data = (uint8_t*)ev + sizeof(LV2_Event); + + return ev; +} + + +/** Write an event at @a iter. + * The event (if any) pointed to by @a iter will be overwritten, and @a 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->capacity - iter->buf->size < sizeof(LV2_Event) + size) + return false; + + LV2_Event* const ev = (LV2_Event*)( + (uint8_t*)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(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) +{ + size = lv2_event_pad_size(size); + if (iter->buf->capacity - iter->buf->size < sizeof(LV2_Event) + size) + return NULL; + + LV2_Event* const ev = (LV2_Event*)((uint8_t*)iter->buf->data + + iter->offset); + + ev->frames = frames; + ev->subframes = subframes; + ev->type = type; + ev->size = size; + ++iter->buf->event_count; + + size = lv2_event_pad_size(sizeof(LV2_Event) + size); + iter->buf->size += size; + iter->offset += size; + + return (uint8_t*)ev + sizeof(LV2_Event); +} + + +/** Write an event at @a iter. + * The event (if any) pointed to by @a iter will be overwritten, and @a 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) +{ + if (iter->buf->capacity - iter->buf->size < sizeof(LV2_Event) + ev->size) + return false; + + LV2_Event* const write_ev = (LV2_Event*)( + (uint8_t*)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 size = lv2_event_pad_size(sizeof(LV2_Event) + ev->size); + iter->buf->size += size; + iter->offset += size; + + return true; +} + +#endif /* LV2_EVENT_HELPERS_H */ + diff --git a/lv2/lv2plug.in/ns/ext/event/event.h b/lv2/lv2plug.in/ns/ext/event/event.h new file mode 100644 index 0000000..2c340ba --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/event/event.h @@ -0,0 +1,281 @@ +/* + LV2 Event Extension + Copyright 2008-2011 David Robillard + Copyright 2006-2007 Lars Luthman + + 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_EVENT_H +#define LV2_EVENT_H + +#define LV2_EVENT_URI "http://lv2plug.in/ns/ext/event" +#define LV2_EVENT_AUDIO_STAMP 0 + +#include + +/** + @file event.h + C API for the LV2 Event extension . + + This extension is a generic transport mechanism for time stamped events + of any type (e.g. MIDI, OSC, ramps, etc). Each port can transport mixed + events of any type; the type of events and timestamps are defined by a URI + which is mapped to an integer by the host for performance reasons. + + This extension requires the host to support the LV2 URI Map extension. + Any host which supports this extension MUST guarantee that any call to + the LV2 URI Map uri_to_id function with the URI of this extension as the + 'map' argument returns a value within the range of uint16_t. +*/ + +/** + 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. +*/ +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) +*/ +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 (e.g. 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 | ... +*/ +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. +*/ +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. +*/ +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 @a 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 @a 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; + + +#endif /* LV2_EVENT_H */ diff --git a/lv2/lv2plug.in/ns/ext/event/event.ttl b/lv2/lv2plug.in/ns/ext/event/event.ttl new file mode 100644 index 0000000..67285aa --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/event/event.ttl @@ -0,0 +1,224 @@ +# LV2 Event Extension +# Copyright 2008-2011 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 dcs: . +@prefix doap: . +@prefix ev: . +@prefix foaf: . +@prefix lv2: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . + + + a foaf:Person ; + foaf:name "David Robillard" ; + foaf:homepage ; + foaf:mbox ; + rdfs:seeAlso . + +_:larsl + a foaf:Person ; + foaf:name "Lars Luthman" . + + + a lv2:Specification ; + doap:license ; + doap:name "LV2 Event" ; + doap:shortdesc "A port-based real-time generic event interface." ; + rdfs:seeAlso ; + doap:release [ + doap:revision "1.4" ; + doap:created "2011-11-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Update packaging." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2011-05-26" ; + doap:file-release ; + dcs:blame ; + 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 ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + doap:developer , + _:larsl ; + lv2:documentation """ +

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:

+
+<http://example.org/some-plugin>
+    lv2:port [
+        a ev:EventPort, lv2:InputPort ;
+        lv2:index 0 ;
+        ev:supportsEvent <http://lv2plug.in/ns/ext/midi#MidiEvent> ;
+        lv2:symbol "midi_input" ;
+        lv2:name "MIDI input" ;
+    ] .
+
+""" . + +ev:EventPort + a rdfs:Class ; + rdfs:label "Event port" ; + rdfs:subClassOf lv2:Port ; + rdfs:comment """ +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. +""" . + +ev:Event + a rdfs:Class ; + rdfs:label "LV2 event" ; + rdfs:comment """ +A single generic time-stamped event. + +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 (e.g. MIDI, OSC) are defined by extensions, and should +be rdfs:subClassOf this class. +""" . + +ev:TimeStamp + a rdfs:Class ; + rdfs:label "LV2 event time stamp" ; + rdfs:comment """ +The time stamp of an Event. + +This defines the meaning of the 'frames' and 'subframes' fields of an +LV2_Event (both unsigned 32-bit integers). +""" . + +ev:FrameStamp + a rdfs:Class ; + rdfs:subClassOf ev:TimeStamp ; + rdfs:label "Audio frame time stamp" ; + rdfs:comment """ +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. +""" . + +ev:generic + a lv2:PortProperty ; + rdfs:label "Generic event port" ; + rdfs:comment """ +Indicates that this port does something meaningful for any event type +(e.g. event mixers, delays, serialisers, etc). 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. +""" . + +ev:supportsEvent + a rdf:Property ; + rdfs:domain lv2:Port ; + rdfs:range ev:Event ; + rdfs:label "Supports event type" ; + rdfs:comment """ +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 (e.g. 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. +""" . + +ev:inheritsEvent + a rdf:Property ; + rdfs:domain lv2:Port ; + rdfs:range lv2:Port ; + rdfs:label "Inherits event type" ; + rdfs:comment """ +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. +""" . + +ev:supportsTimeStamp + a rdf:Property ; + rdfs:domain lv2:Port ; + rdfs:range ev:TimeStamp ; + rdfs:label "Supports time stamp type" ; + rdfs:comment """ +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. +""" . + +ev:generatesTimeStamp + a rdf:Property ; + rdfs:domain lv2:Port ; + rdfs:range ev:TimeStamp ; + rdfs:label "Outputs time stamp type" ; + rdfs:comment """ +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. +""" . + +ev:inheritsTimeStamp + a rdf:Property ; + rdfs:domain lv2:Port ; + rdfs:range lv2:Port ; + rdfs:label "Inherits time stamp type" ; + rdfs:comment """ +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. +""" . diff --git a/lv2/lv2plug.in/ns/ext/event/ext.pc.in b/lv2/lv2plug.in/ns/ext/event/ext.pc.in new file mode 120000 index 0000000..03dd044 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/event/ext.pc.in @@ -0,0 +1 @@ +../../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/event/manifest.ttl b/lv2/lv2plug.in/ns/ext/event/manifest.ttl new file mode 100644 index 0000000..fa12f94 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/event/manifest.ttl @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 4 ; + rdfs:seeAlso . + diff --git a/lv2/lv2plug.in/ns/ext/event/waf b/lv2/lv2plug.in/ns/ext/event/waf new file mode 120000 index 0000000..5235032 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/event/waf @@ -0,0 +1 @@ +../../../../../waf \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/event/wscript b/lv2/lv2plug.in/ns/ext/event/wscript new file mode 120000 index 0000000..7e2c01b --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/event/wscript @@ -0,0 +1 @@ +../../../../../ext.wscript \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/host-info/ext.pc.in b/lv2/lv2plug.in/ns/ext/host-info/ext.pc.in new file mode 120000 index 0000000..03dd044 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/host-info/ext.pc.in @@ -0,0 +1 @@ +../../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/host-info/host-info.ttl b/lv2/lv2plug.in/ns/ext/host-info/host-info.ttl new file mode 100644 index 0000000..4f563bb --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/host-info/host-info.ttl @@ -0,0 +1,117 @@ +# LV2 Host Info Extension +# Copyright (C) 2009 David Robillard +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR +# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +# OTHER DEALINGS IN THE SOFTWARE. + +@prefix hi: . +@prefix lv2: . +@prefix rdf: . +@prefix rdfs: . +@prefix owl: . +@prefix xsd: . +@prefix doap: . +@prefix foaf: . +@prefix amb: . + + a lv2:Specification ; + doap:license ; + doap:name "LV2 Host Info" ; + doap:shortdesc "A format for describing LV2 hosts." ; + doap:maintainer [ + a foaf:Person ; + foaf:name "David Robillard" ; + foaf:homepage ; + rdfs:seeAlso + ] ; + lv2:documentation """ +

This specification defines various properties to represent useful information +about LV2 hosts. Currently, the primary use of this specification is to describe which +extensions are supported by a given host.

+ +

The extensions supported by a host can be described like this:

+
+@prefix hi: <http://lv2plug.in/ns/ext/host-info#> .
+
+<http://example.org/some-host>
+    a hi:Host ;
+    doap:name "Foo Rack" ;
+    hi:supportsExtension [
+        hi:extension <http://example.org/some-extension> ;
+        hi:sinceVersion "1.2.0"
+    ] .
+
+""" . + + +## Core Classes / Properties + +hi:Host a rdfs:Class ; + rdfs:label "LV2 Host" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty doap:name ; + owl:someValuesFrom xsd:string ; + owl:minCardinality 1 ; + rdfs:comment "A hi:Host MUST have at least one string doap:name" + ] ; + rdfs:comment """ +An application that supports loading LV2 plugins, or performs other +LV2 related functionality. +""" . + +hi:supportsExtension a rdf:Property ; + rdfs:domain hi:Host ; + rdfs:range hi:ExtensionSupport ; + rdfs:label "supports extension" ; + rdfs:comment "Relates a Host to its ExtensionSupport" . + +hi:ExtensionSupport a rdfs:Class ; + rdfs:label "Extension Support" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty hi:sinceVersion ; + owl:someValuesFrom xsd:string ; + owl:minCardinality 1 ; + rdfs:comment """ +A hi:ExtensionSupport MUST have at least one string hi:sinceVersion +""" ] ; + rdfs:comment "A description of the support for an extension by a Host" . + +hi:extension a rdf:Property ; + rdfs:domain hi:ExtensionSupport ; + rdfs:range lv2:Specification ; + rdfs:label "extension" ; + rdfs:comment "Indicates the extension supported by a host." . + +hi:sinceVersion a rdf:Property ; + rdfs:domain hi:ExtensionSupport ; + rdfs:range xsd:string ; + rdfs:label "since version" ; + rdfs:comment """ +The initial version of a host which supported an extension. +This property MUST always be given +""" . + +hi:untilVersion a rdf:Property ; + rdfs:domain hi:ExtensionSupport ; + rdfs:range xsd:string ; + rdfs:label "until version" ; + rdfs:comment """ +The final version of a host which supported an extension. This property can +be used if support for an extension was discontinued in a host for some reason. +""" . + diff --git a/lv2/lv2plug.in/ns/ext/host-info/manifest.ttl b/lv2/lv2plug.in/ns/ext/host-info/manifest.ttl new file mode 100644 index 0000000..ae1e097 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/host-info/manifest.ttl @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 0 ; + lv2:microVersion 1 ; + rdfs:seeAlso . + diff --git a/lv2/lv2plug.in/ns/ext/host-info/waf b/lv2/lv2plug.in/ns/ext/host-info/waf new file mode 120000 index 0000000..5235032 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/host-info/waf @@ -0,0 +1 @@ +../../../../../waf \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/host-info/wscript b/lv2/lv2plug.in/ns/ext/host-info/wscript new file mode 120000 index 0000000..7e2c01b --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/host-info/wscript @@ -0,0 +1 @@ +../../../../../ext.wscript \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/instance-access/ext.pc.in b/lv2/lv2plug.in/ns/ext/instance-access/ext.pc.in new file mode 120000 index 0000000..03dd044 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/instance-access/ext.pc.in @@ -0,0 +1 @@ +../../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/instance-access/instance-access.h b/lv2/lv2plug.in/ns/ext/instance-access/instance-access.h new file mode 100644 index 0000000..7e18ee4 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/instance-access/instance-access.h @@ -0,0 +1,38 @@ +/* + LV2 Instance Access Extension + Copyright 2008-2011 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_INSTANCE_ACCESS_H +#define LV2_INSTANCE_ACCESS_H + +#define LV2_INSTANCE_ACCESS_URI "http://lv2plug.in/ns/ext/instance-access" + + +/** @file + * C header for the LV2 Instance Access extension + * . + * + * This extension defines a method for (e.g.) plugin UIs to get a direct + * handle to an LV2 plugin instance (LV2_Handle), if possible. + * + * To support this feature the host must pass an LV2_Feature struct to the + * UI instantiate method with URI "http://lv2plug.in/ns/ext/instance-access" + * and data pointed directly to the LV2_Handle of the plugin instance. + */ + + +#endif /* LV2_INSTANCE_ACCESS_H */ + diff --git a/lv2/lv2plug.in/ns/ext/instance-access/instance-access.ttl b/lv2/lv2plug.in/ns/ext/instance-access/instance-access.ttl new file mode 100644 index 0000000..14eb732 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/instance-access/instance-access.ttl @@ -0,0 +1,80 @@ +# LV2 Instance Access Extension +# Copyright 2008-2011 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 dcs: . +@prefix doap: . +@prefix foaf: . +@prefix ia: . +@prefix lv2: . +@prefix lv2ev: . +@prefix rdf: . +@prefix rdfs: . + + + a foaf:Person ; + foaf:name "David Robillard" ; + foaf:homepage ; + foaf:mbox ; + rdfs:seeAlso . + + + a lv2:Specification ; + doap:license ; + doap:name "LV2 Instance Access" ; + doap:shortdesc "Provides access to the LV2_Handle of a plugin." ; + doap:developer ; + doap:release [ + doap:revision "1.4" ; + doap:created "2011-11-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Update packaging." + ] , [ + rdfs:label "Improve documentation." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2011-05-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add build system for installation." + ] , [ + rdfs:label "Switch to ISC license." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2010-10-04" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ +

This extension defines a feature which allows plugin UIs to get a direct +handle to an LV2 plugin instance (LV2_Handle), if possible.

+ +

To support this feature the host must pass an LV2_Feature struct to the UI +instantiate method with URI LV2_INSTANCE_ACCESS_URI and data pointed directly +to the LV2_Handle of the plugin instance.

+""" . diff --git a/lv2/lv2plug.in/ns/ext/instance-access/manifest.ttl b/lv2/lv2plug.in/ns/ext/instance-access/manifest.ttl new file mode 100644 index 0000000..d6412c5 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/instance-access/manifest.ttl @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 4 ; + rdfs:seeAlso . + diff --git a/lv2/lv2plug.in/ns/ext/instance-access/waf b/lv2/lv2plug.in/ns/ext/instance-access/waf new file mode 120000 index 0000000..5235032 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/instance-access/waf @@ -0,0 +1 @@ +../../../../../waf \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/instance-access/wscript b/lv2/lv2plug.in/ns/ext/instance-access/wscript new file mode 120000 index 0000000..7e2c01b --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/instance-access/wscript @@ -0,0 +1 @@ +../../../../../ext.wscript \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/log/ext.pc.in b/lv2/lv2plug.in/ns/ext/log/ext.pc.in new file mode 120000 index 0000000..03dd044 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/log/ext.pc.in @@ -0,0 +1 @@ +../../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/log/log.h b/lv2/lv2plug.in/ns/ext/log/log.h new file mode 100644 index 0000000..c139a27 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/log/log.h @@ -0,0 +1,91 @@ +/* + 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. +*/ + +/** + @file log.h C header for the LV2 Log extension + . +*/ + +#ifndef LV2_LOG_H +#define LV2_LOG_H + +#define LV2_LOG_URI "http://lv2plug.in/ns/ext/log" +#define LV2_LOG_LOG_URI LV2_LOG_URI "#log" +#define LV2_LOG_ERROR_URI LV2_LOG_URI "#Error" +#define LV2_LOG_INFO_URI LV2_LOG_URI "#Info" +#define LV2_LOG_WARN_URI LV2_LOG_URI "#Warn" + +#include + +#include "lv2/lv2plug.in/ns/ext/urid/urid.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __GNUC__ +/** Allow type checking of printf-like functions. */ +# define LV2_LOG_FUNC(fmt, arg1) __attribute__((format(printf, fmt, arg1))) +#else +# define LV2_LOG_FUNC +#endif + +/** + Opaque data to host data for LV2_Log_Log. +*/ +typedef void* LV2_Log_Handle; + +/** + Log (http://lv2plug.in/ns/ext/log#log). +*/ +typedef struct _LV2_Log { + /** + Opaque pointer to host data. + + This MUST be passed to methods in this struct henever they are called. + Otherwise, it must not be interpreted in any way. + */ + LV2_Log_Handle handle; + + /** + Log a message, passing format parameters directly. + + The API of this function matches that of the standard C printf + function, except for the addition of the first two parameters. + */ + LV2_LOG_FUNC(3, 4) + int (*printf)(LV2_Log_Handle handle, + LV2_URID level, + const char* fmt, ...); + + /** + Log a message, passing format parameters in a va_list. + + The API of this function matches that of the standard C vprintf + function, except for the addition of the first two parameters. + */ + LV2_LOG_FUNC(3, 0) + int (*vprintf)(LV2_Log_Handle handle, + LV2_URID level, + const char* fmt, + va_list ap); +} LV2_Log_Log; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV2_LOG_H */ diff --git a/lv2/lv2plug.in/ns/ext/log/log.ttl b/lv2/lv2plug.in/ns/ext/log/log.ttl new file mode 100644 index 0000000..567333f --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/log/log.ttl @@ -0,0 +1,74 @@ +# LV2 Log Extension +# 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. + +@prefix doap: . +@prefix foaf: . +@prefix log: . +@prefix lv2: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a lv2:Specification ; + doap:name "LV2 Log" ; + doap:shortdesc "A feature for writing log messages." ; + doap:maintainer [ + a foaf:Person ; + foaf:name "David Robillard" ; + foaf:homepage ; + rdfs:seeAlso + ] ; + lv2:documentation """ + +

This extension defines a feature, LV2_Log_Log, which allows plugins to print +messages to logs implemented by the host with an API much like the standard C +printf functions. This allows, for example, plugin logs to be nicely presented +to the user in a graphical user interface.

+ +

Different log levels (e.g. error or information) are +defined by URI and passed as an LV2_URID. Thus, the possible number of log +levels is unlimited, but implementations SHOULD use the levels defined in this +extension unless they have a special reason to do otherwise.

+""" . + +log:Level + a rdfs:Class ; + lv2:documentation """ +

A log level. Subclasses of this class can be passed to LV2_Log_Log methods +to describe the nature of the log message.

""" . + +log:Error + a rdfs:Class ; + rdfs:subClassOf log:Level ; + rdfs:comment "An error" . + +log:Info + a rdfs:Class ; + rdfs:subClassOf log:Level ; + rdfs:comment "An informative message" . + +log:Warn + a rdfs:Class ; + rdfs:subClassOf log:Level ; + rdfs:comment "A warning" . + +log:log + a lv2:Feature ; + lv2:documentation """ +

A feature which plugins may use to log messages. To support this feature, +the host must pass an LV2_Feature to LV2_Descriptor::instantiate() with URI +LV2_LOG_LOG_URI and data pointed to an instance of LV2_Log_Log.

+""" . diff --git a/lv2/lv2plug.in/ns/ext/log/manifest.ttl b/lv2/lv2plug.in/ns/ext/log/manifest.ttl new file mode 100644 index 0000000..7d00e2e --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/log/manifest.ttl @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 0 ; + lv2:microVersion 1 ; + rdfs:seeAlso . + diff --git a/lv2/lv2plug.in/ns/ext/log/waf b/lv2/lv2plug.in/ns/ext/log/waf new file mode 120000 index 0000000..5235032 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/log/waf @@ -0,0 +1 @@ +../../../../../waf \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/log/wscript b/lv2/lv2plug.in/ns/ext/log/wscript new file mode 120000 index 0000000..7e2c01b --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/log/wscript @@ -0,0 +1 @@ +../../../../../ext.wscript \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/midi/ext.pc.in b/lv2/lv2plug.in/ns/ext/midi/ext.pc.in new file mode 120000 index 0000000..03dd044 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/midi/ext.pc.in @@ -0,0 +1 @@ +../../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/midi/manifest.ttl b/lv2/lv2plug.in/ns/ext/midi/manifest.ttl new file mode 100644 index 0000000..a8e194e --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/midi/manifest.ttl @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 4 ; + rdfs:seeAlso . + diff --git a/lv2/lv2plug.in/ns/ext/midi/midi.ttl b/lv2/lv2plug.in/ns/ext/midi/midi.ttl new file mode 100644 index 0000000..64edf0e --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/midi/midi.ttl @@ -0,0 +1,115 @@ +# LV2 MIDI Extension +# Copyright 2008-2011 David Robillard +# Copyright 2006 Lars Luthman +# +# 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 dcs: . +@prefix atom: . +@prefix doap: . +@prefix ev: . +@prefix foaf: . +@prefix lv2: . +@prefix midi: . +@prefix rdfs: . + + + a foaf:Person ; + foaf:name "David Robillard" ; + foaf:homepage ; + foaf:mbox ; + rdfs:seeAlso . + +_:larsl + a foaf:Person ; + foaf:name "Lars Luthman" ; + foaf:mbox . + + + a lv2:Specification ; + doap:license ; + doap:name "LV2 MIDI" ; + doap:shortdesc "A data type for raw MIDI." ; + doap:maintainer ; + doap:developer _:larsl ; + doap:release [ + doap:revision "1.4" ; + doap:created "2011-11-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Update packaging." + ] , [ + rdfs:label "Improve documentation." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2011-05-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add build system for installation." + ] , [ + rdfs:label "Switch to ISC license." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2010-10-04" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ +

This extension defines a data type for a MIDI message, midi:MidiEvent, which +is normalized for fast and convenient processing by plugins. It is +particularly useful as the payload of an Atom or Event.

+""" . + +midi:MidiEvent + a rdfs:Class ; + rdfs:label "LV2 MIDI message." ; + rdfs:subClassOf ev:Event , + atom:Atom ; + lv2:documentation """ +

A single raw MIDI message (i.e. a sequence of bytes).

+ +

This is equivalent to a standard MIDI messages, except with the following +restrictions to simplify handling:

+
    +
  • Running status is not allowed, every message must have its own status + byte.
  • + +
  • Note On messages with velocity 0 are not allowed. These messages are + equivalent to Note Off in standard MIDI streams, but here only proper Note + Off messages are allowed.
  • + +
  • "Realtime messages" (status bytes 0xF8 to 0xFF) are allowed, but may + not occur inside other messages like they can in standard MIDI streams.
  • + +
  • All messages are complete valid MIDI messages. This means, for example, + that only the first byte in each event (the status byte) may have the eighth + bit set, that Note On and Note Off events are always 3 bytes long, etc. + Where messages are communicated, the writer is responsible for writing valid + messages, and the reader may assume that all events are valid.
  • +
+""" . diff --git a/lv2/lv2plug.in/ns/ext/midi/waf b/lv2/lv2plug.in/ns/ext/midi/waf new file mode 120000 index 0000000..5235032 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/midi/waf @@ -0,0 +1 @@ +../../../../../waf \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/midi/wscript b/lv2/lv2plug.in/ns/ext/midi/wscript new file mode 120000 index 0000000..7e2c01b --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/midi/wscript @@ -0,0 +1 @@ +../../../../../ext.wscript \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/osc/ext.pc.in b/lv2/lv2plug.in/ns/ext/osc/ext.pc.in new file mode 120000 index 0000000..03dd044 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/osc/ext.pc.in @@ -0,0 +1 @@ +../../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/osc/lv2_osc.c b/lv2/lv2plug.in/ns/ext/osc/lv2_osc.c new file mode 100644 index 0000000..afea2c9 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/osc/lv2_osc.c @@ -0,0 +1,238 @@ +/* LV2 OSC Messages Extension + * Copyright (C) 2007-2009 David Robillard + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include +#include +#include +#include "lv2_osc.h" +#include "lv2_osc_print.h" + +/*#ifndef BIG_ENDIAN + #ifndef LITTLE_ENDIAN + #warning This code requires BIG_ENDIAN or LITTLE_ENDIAN to be defined + #warning Assuming little endian. THIS MAY BREAK HORRIBLY! + #endif +#endif*/ + +#define lv2_osc_swap32(x) \ +({ \ + uint32_t __x = (x); \ + ((uint32_t)( \ + (((uint32_t)(__x) & (uint32_t)0x000000ffUL) << 24) | \ + (((uint32_t)(__x) & (uint32_t)0x0000ff00UL) << 8) | \ + (((uint32_t)(__x) & (uint32_t)0x00ff0000UL) >> 8) | \ + (((uint32_t)(__x) & (uint32_t)0xff000000UL) >> 24) )); \ +}) + +#define lv2_osc_swap64(x) \ +({ \ + uint64_t __x = (x); \ + ((uint64_t)( \ + (uint64_t)(((uint64_t)(__x) & (uint64_t)0x00000000000000ffULL) << 56) | \ + (uint64_t)(((uint64_t)(__x) & (uint64_t)0x000000000000ff00ULL) << 40) | \ + (uint64_t)(((uint64_t)(__x) & (uint64_t)0x0000000000ff0000ULL) << 24) | \ + (uint64_t)(((uint64_t)(__x) & (uint64_t)0x00000000ff000000ULL) << 8) | \ + (uint64_t)(((uint64_t)(__x) & (uint64_t)0x000000ff00000000ULL) >> 8) | \ + (uint64_t)(((uint64_t)(__x) & (uint64_t)0x0000ff0000000000ULL) >> 24) | \ + (uint64_t)(((uint64_t)(__x) & (uint64_t)0x00ff000000000000ULL) >> 40) | \ + (uint64_t)(((uint64_t)(__x) & (uint64_t)0xff00000000000000ULL) >> 56) )); \ +}) + + +/** Pad a size to a multiple of 32 bits */ +inline static uint32_t +lv2_osc_pad_size(uint32_t size) +{ + return size + 3 - ((size-1) % 4); +} + + +inline static uint32_t +lv2_osc_string_size(const char *s) +{ + return lv2_osc_pad_size((uint32_t)strlen(s) + 1); +} + + +static inline uint32_t +lv2_osc_blob_size(const void* blob) +{ + return sizeof(uint32_t) + lv2_osc_pad_size(*((uint32_t*)blob)); +} + + +uint32_t +lv2_osc_arg_size(char type, const LV2_OSC_Argument* arg) +{ + switch (type) { + case 'c': + case 'i': + case 'f': + case 'S': // Symbol (URI-mapped integer) + return 4; + + case 'h': + case 'd': + return 8; + + case 's': + return lv2_osc_string_size(&arg->s); + + case 'b': + return lv2_osc_blob_size(&arg->b); + + default: + fprintf(stderr, "Warning: unknown OSC type '%c'.", type); + return 0; + } +} + + +void +lv2_osc_argument_swap_byte_order(char type, LV2_OSC_Argument* arg) +{ + switch (type) { + case 'i': + case 'f': + case 'b': + case 'c': + *(int32_t*)arg = lv2_osc_swap32(*(int32_t*)arg); + break; + + case 'h': + case 'd': + *(int64_t*)arg = lv2_osc_swap64(*(int64_t*)arg); + break; + } +} + + +/** Convert a message from network byte order to host byte order. */ +void +lv2_osc_message_swap_byte_order(LV2_OSC_Event* msg) +{ + const char* const types = lv2_osc_get_types(msg); + + for (uint32_t i=0; i < msg->argument_count; ++i) + lv2_osc_argument_swap_byte_order(types[i], lv2_osc_get_argument(msg, i)); +} + + +/** Not realtime safe, returned value must be free()'d by caller. */ +LV2_OSC_Event* +lv2_osc_message_new(const char* path, const char* types, ...) +{ + /* FIXME: path only */ + + LV2_OSC_Event* result = malloc(sizeof(LV2_OSC_Event) + + 4 + lv2_osc_string_size(path)); + + const uint32_t path_size = lv2_osc_string_size(path); + result->data_size = path_size + 4; // 4 for types + result->argument_count = 0; + result->types_offset = lv2_osc_string_size(path) + 1; + (&result->data)[result->types_offset - 1] = ','; + (&result->data)[result->types_offset] = '\0'; + + memcpy(&result->data, path, strlen(path) + 1); + + return result; +} + + +/** Create a new LV2_OSC_Event from a raw OSC message. + * + * If \a out_buf is NULL, new memory will be allocated. Otherwise the returned + * value will be equal to buf, unless there is insufficient space in which + * case NULL is returned. + */ +LV2_OSC_Event* +lv2_osc_message_from_raw(uint32_t out_buf_size, + void* out_buf, + uint32_t raw_msg_size, + void* raw_msg) +{ + const uint32_t message_header_size = (sizeof(uint32_t) * 4); + + const uint32_t path_size = lv2_osc_string_size((char*)raw_msg); + const uint32_t types_len = strlen((char*)(raw_msg + path_size + 1)); + uint32_t index_size = types_len * sizeof(uint32_t); + + if (out_buf == NULL) { + out_buf_size = message_header_size + index_size + raw_msg_size; + out_buf = malloc((size_t)out_buf_size); + } else if (out_buf && out_buf_size < message_header_size + raw_msg_size) { + return NULL; + } + + LV2_OSC_Event* write_loc = (LV2_OSC_Event*)(out_buf); + write_loc->argument_count = types_len; + write_loc->data_size = index_size + raw_msg_size; + + // Copy raw message + memcpy(&write_loc->data + index_size, raw_msg, raw_msg_size); + + write_loc->types_offset = index_size + path_size + 1; + const char* const types = lv2_osc_get_types(write_loc); + + // Calculate/Write index + uint32_t args_base_offset = write_loc->types_offset + lv2_osc_string_size(types) - 1; + uint32_t arg_offset = 0; + + for (uint32_t i=0; i < write_loc->argument_count; ++i) { + ((uint32_t*)&write_loc->data)[i] = args_base_offset + arg_offset; + const LV2_OSC_Argument* const arg = (LV2_OSC_Argument*)(&write_loc->data + args_base_offset + arg_offset); + // Special case because size is still big-endian +#ifndef BIG_ENDIAN + if (types[i] == 'b') // special case because size is still big-endian + arg_offset += lv2_osc_swap32(*((int32_t*)arg)); + else +#endif + arg_offset += lv2_osc_arg_size(types[i], arg); + } + + /*printf("Index:\n"); + for (uint32_t i=0; i < write_loc->argument_count; ++i) { + printf("%u ", ((uint32_t*)&write_loc->data)[i]); + } + printf("\n"); + + printf("Data:\n"); + for (uint32_t i=0; i < (write_loc->argument_count * 4) + size; ++i) { + printf("%3u", i % 10); + } + printf("\n"); + for (uint32_t i=0; i < (write_loc->argument_count * 4) + size; ++i) { + char c = *(((char*)&write_loc->data) + i); + if (c >= 32 && c <= 126) + printf("%3c", c); + else + printf("%3d", (int)c); + } + printf("\n");*/ + + // Swap to host byte order if necessary +#ifndef BIG_ENDIAN + lv2_osc_message_swap_byte_order(write_loc); +#endif + + printf("Created message:\n"); + lv2_osc_message_print(write_loc); + + return write_loc; +} diff --git a/lv2/lv2plug.in/ns/ext/osc/lv2_osc_print.c b/lv2/lv2plug.in/ns/ext/osc/lv2_osc_print.c new file mode 100644 index 0000000..5282d46 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/osc/lv2_osc_print.c @@ -0,0 +1,66 @@ +/* LV2 OSC Messages Extension - Pretty printing methods + * Copyright (C) 2007-2009 David Robillard + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include "lv2_osc_print.h" + +void +lv2_osc_argument_print(char type, const LV2_OSC_Argument* arg) +{ + int32_t blob_size; + + switch (type) { + case 'c': + printf("%c", arg->c); break; + case 'i': + printf("%d", arg->i); break; + case 'f': + printf("%f", arg->f); break; + case 'h': + printf("%ld", arg->h); break; + case 'd': + printf("%f", arg->d); break; + case 's': + printf("\"%s\"", &arg->s); break; + /*case 'S': + printf("\"%s\"", &arg->S); break;*/ + case 'b': + blob_size = *((int32_t*)arg); + printf("{ "); + for (int32_t i=0; i < blob_size; ++i) + printf("%X, ", (&arg->b)[i+4]); + printf(" }"); + break; + default: + printf("?"); + } +} + + +void +lv2_osc_print(const LV2_OSC_Event* msg) +{ + const char* const types = lv2_osc_get_types(msg); + + printf("%s (%s) ", lv2_osc_get_path(msg), types); + for (uint32_t i=0; i < msg->argument_count; ++i) { + lv2_osc_argument_print(types[i], lv2_osc_get_argument(msg, i)); + printf(" "); + } + printf("\n"); +} + diff --git a/lv2/lv2plug.in/ns/ext/osc/lv2_osc_test.c b/lv2/lv2plug.in/ns/ext/osc/lv2_osc_test.c new file mode 100644 index 0000000..3f76d41 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/osc/lv2_osc_test.c @@ -0,0 +1,55 @@ +#include +#include +#include +#include +#include "lv2_osc.h" +#include "lv2_osc_print.h" + +int +main() +{ + lo_message lo_msg = lo_message_new(); + //lo_message_add_symbol(lo_msg, "a_sym"); + lo_message_add_string(lo_msg, "Hello World"); + lo_message_add_char(lo_msg, 'a'); + lo_message_add_int32(lo_msg, 1234); + lo_message_add_float(lo_msg, 0.1234); + lo_message_add_int64(lo_msg, 5678); + lo_message_add_double(lo_msg, 0.5678); + + + /*unsigned char blob_data[] = { 0,1,2,3,4,5,6,7,8,9 }; + lo_blob blob = lo_blob_new(10, blob_data); + lo_message_add_blob(lo_msg, blob);*/ + + /* Leaks like a sieve */ + + size_t raw_msg_size = 0; + void* raw_msg = lo_message_serialise(lo_msg, "/foo/bar", NULL, &raw_msg_size); + + LV2Message* msg = lv2_osc_message_from_raw(0.0, 0, NULL, raw_msg_size, raw_msg); + assert(msg); + + LV2OSCBuffer* buf = lv2_osc_buffer_new(1024); + + int ret = lv2_osc_buffer_append_message(buf, msg); + if (ret) + fprintf(stderr, "Message append failed: %s", strerror(ret)); + + lo_message lo_msg_2 = lo_message_new(); + lo_message_add_string(lo_msg_2, "Another message"); + + raw_msg = lo_message_serialise(lo_msg_2, "/baz", NULL, &raw_msg_size); + + msg = lv2_osc_message_from_raw(0.0, 0, NULL, raw_msg_size, raw_msg); + assert(msg); + + ret = lv2_osc_buffer_append_message(buf, msg); + if (ret) + fprintf(stderr, "Message append failed: %s", strerror(ret)); + + printf("\nBuffer contents:\n\n"); + lv2_osc_buffer_print(buf); + + return 0; +} diff --git a/lv2/lv2plug.in/ns/ext/osc/manifest.ttl b/lv2/lv2plug.in/ns/ext/osc/manifest.ttl new file mode 100644 index 0000000..7209b05 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/osc/manifest.ttl @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 0 ; + lv2:microVersion 1 ; + rdfs:seeAlso . + diff --git a/lv2/lv2plug.in/ns/ext/osc/osc-print.h b/lv2/lv2plug.in/ns/ext/osc/osc-print.h new file mode 100644 index 0000000..ceebbf7 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/osc/osc-print.h @@ -0,0 +1,42 @@ +/* LV2 OSC Messages Extension - Pretty printing methods + * Copyright (C) 2007-2009 David Robillard + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** @file + * Helper functions for printing LV2 OSC messages as defined by the + * LV2 OSC extension . + */ + +#ifndef LV2_OSC_PRINT_H +#define LV2_OSC_PRINT_H + +#include "lv2/lv2plug.in/ns/ext/osc/osc.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void +lv2_osc_argument_print(char type, const LV2_OSC_Argument* arg); + +void +lv2_osc_message_print(const LV2_OSC_Event* msg); + +#ifdef __cplusplus +} +#endif + +#endif /* LV2_OSC_PRINT_H */ diff --git a/lv2/lv2plug.in/ns/ext/osc/osc.h b/lv2/lv2plug.in/ns/ext/osc/osc.h new file mode 100644 index 0000000..05e39cc --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/osc/osc.h @@ -0,0 +1,119 @@ +/* LV2 OSC Messages Extension + * Copyright (C) 2007-2009 David Robillard + * + * This header is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This header is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef LV2_OSC_H +#define LV2_OSC_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** @file + * C header for the LV2 OSC extension . + * This extension defines a format for (raw) OSC messages/events. + */ + + +/** Argument (in a message). + * + * The name of the element in this union directly corresponds to the OSC + * type tag character in LV2_Event::types. + */ +typedef union { + /* Standard OSC types */ + int32_t i; /**< 32 bit signed integer */ + float f; /**< 32 bit IEEE-754 floating point number ("float") */ + char s; /**< Standard C, NULL terminated string */ + uint8_t b; /**< Blob (int32 size then size bytes padded to 32 bits) */ + + /* "Nonstandard" OSC types (defined in the OSC standard) */ + int64_t h; /* 64 bit signed integer */ + // t /* OSC-timetag */ + double d; /* 64 bit IEEE 754 floating point number ("double") */ + // S /* Symbol, represented as an OSC-string */ + int32_t c; /* Character, represented as a 32-bit integer */ + // r /* 32 bit RGBA color */ + // m /* 4 byte MIDI message. Bytes from MSB to LSB are: port id, status byte, data1, data2 */ + // T /* True. No bytes are allocated in the argument data. */ + // F /* False. No bytes are allocated in the argument data. */ + // N /* Nil. No bytes are allocated in the argument data. */ + // I /* Infinitum. No bytes are allocated in the argument data. */ + // [ /* The beginning of an array. */ + // ] /* The end of an array. */ +} LV2_OSC_Argument; + + + +/** Message. + * + * This is an OSC message at heart, but with some additional cache information + * to allow fast access to parameters. This is the payload of an LV2_Event, + * time stamp and size (being generic) are in the containing header. + */ +typedef struct { + uint32_t data_size; /**< Total size of data, in bytes */ + uint32_t argument_count; /**< Number of arguments in data */ + uint32_t types_offset; /**< Offset of types string in data */ + + /** Take the address of this member to get a pointer to the remaining data. + * + * Contents are an argument index: + * uint32_t argument_index[argument_count] + * + * followed by a standard OSC message: + * char path[path_length] (padded OSC string) + * char types[argument_count] (padded OSC string) + * void data[data_size] + */ + char data; + +} LV2_OSC_Event; + +LV2_OSC_Event* lv2_osc_event_new(const char* path, const char* types, ...); + +LV2_OSC_Event* lv2_osc_event_from_raw(uint32_t out_buf_size, void* out_buf, + uint32_t raw_msg_size, void* raw_msg); + +static inline uint32_t lv2_osc_get_osc_message_size(const LV2_OSC_Event* msg) + { return (msg->argument_count * sizeof(char) + 1) + msg->data_size; } + +static inline const void* lv2_osc_get_osc_message(const LV2_OSC_Event* msg) + { return (const void*)(&msg->data + (sizeof(uint32_t) * msg->argument_count)); } + +static inline const char* lv2_osc_get_path(const LV2_OSC_Event* msg) + { return (const char*)(&msg->data + (sizeof(uint32_t) * msg->argument_count)); } + +static inline const char* lv2_osc_get_types(const LV2_OSC_Event* msg) + { return (const char*)(&msg->data + msg->types_offset); } + +static inline LV2_OSC_Argument* lv2_osc_get_argument(const LV2_OSC_Event* msg, uint32_t i) + { return (LV2_OSC_Argument*)(&msg->data + ((uint32_t*)&msg->data)[i]); } + +/* +int lv2_osc_buffer_append_message(LV2_Event_Buffer* buf, LV2_Event* msg); +int lv2_osc_buffer_append(LV2_Event_Buffer* buf, double time, const char* path, const char* types, ...); +void lv2_osc_buffer_compact(LV2_Event_Buffer* buf); +*/ + +#ifdef __cplusplus +} +#endif + +#endif /* LV2_OSC_H */ diff --git a/lv2/lv2plug.in/ns/ext/osc/osc.ttl b/lv2/lv2plug.in/ns/ext/osc/osc.ttl new file mode 100644 index 0000000..c83a69d --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/osc/osc.ttl @@ -0,0 +1,39 @@ +# LV2 OSC Messages Extension +# Copyright (C) 2007 David Robillard +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR +# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +# OTHER DEALINGS IN THE SOFTWARE. + +@prefix osc: . +@prefix lv2: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . +@prefix doap: . +@prefix foaf: . + + a lv2:Specification ; + doap:license ; + doap:name "LV2 OSC Events" ; + doap:shortdesc "A data type for raw OSC." ; + doap:maintainer [ + a foaf:Person ; + foaf:name "David Robillard" ; + foaf:homepage ; + rdfs:seeAlso + ] . diff --git a/lv2/lv2plug.in/ns/ext/osc/waf b/lv2/lv2plug.in/ns/ext/osc/waf new file mode 120000 index 0000000..5235032 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/osc/waf @@ -0,0 +1 @@ +../../../../../waf \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/osc/wscript b/lv2/lv2plug.in/ns/ext/osc/wscript new file mode 120000 index 0000000..7e2c01b --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/osc/wscript @@ -0,0 +1 @@ +../../../../../ext.wscript \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/parameter/ext.pc.in b/lv2/lv2plug.in/ns/ext/parameter/ext.pc.in new file mode 120000 index 0000000..03dd044 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/parameter/ext.pc.in @@ -0,0 +1 @@ +../../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/parameter/manifest.ttl b/lv2/lv2plug.in/ns/ext/parameter/manifest.ttl new file mode 100644 index 0000000..d7af7ff --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/parameter/manifest.ttl @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 0 ; + lv2:microVersion 1 ; + rdfs:seeAlso . + diff --git a/lv2/lv2plug.in/ns/ext/parameter/parameter.ttl b/lv2/lv2plug.in/ns/ext/parameter/parameter.ttl new file mode 100644 index 0000000..e43cc48 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/parameter/parameter.ttl @@ -0,0 +1,111 @@ +# LV2 Parameter Extension +# Copyright (C) 2010 David Robillard +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR +# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +# OTHER DEALINGS IN THE SOFTWARE. + +@prefix atom: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix param: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a lv2:Specification ; + doap:name "LV2 Parameter" ; + doap:shortdesc "Dynamic message-controlled LV2 plugin parameters." ; + doap:maintainer [ + a foaf:Person ; + foaf:name "David Robillard" ; + foaf:homepage ; + rdfs:seeAlso + ] ; + rdfs:comment """ +""" . + + +param:Parameter a rdfs:Class ; a lv2:Resource ; + rdfs:label "Parameter" ; + lv2:documentation """ +

A parameter on an LV2 plugin. Parameters can be manipulated to alter +the behaviour or output of a plugin. Unlike lv2:ControlPort:

+
    +
  • A parameter may have any data type
  • +
  • Parameters can be dynamically added or removed
  • +
  • Parameter values can be manipulated by the plugin
  • +
+ +

Note that plugins are not required to support this potential functionality, +parameters can be used to provide a basic LADSPA-like set of floating point +parameters in a more extensible manner.

+ +

Parameters are essentially controls that are not 1:1 associated with ports +(manipulation of parameters can be accomplished by e.g. sending messages +to a command port).

+""" . + + +param:supportsType a rdf:Property ; + rdfs:domain param:Parameter ; + rdfs:range atom:Atom ; + rdfs:label "supports type" ; + lv2:documentation """ +

Indicates that a Parameter has values of a particular type. A Parameter may +support many types. Parameter values are always LV2 Atoms as defined by the LV2 Atom Extension Any type of LV2 +Atom may be used as a parameter value.

+""" . + + +param:value a rdf:Property ; + rdfs:domain param:Parameter ; + rdfs:label "value" ; + rdfs:comment """ +Indicates that a Parameter has a certain value. A Parameter has at most +one value at any given time. The type of the value specified must be +one of the types specified by param:supportsType. When used in a plugin +data file this property specifies the default value of a parameter. +""" . + + +param:minimum a rdf:Property ; + rdfs:domain param:Parameter ; + rdfs:label "minimum" ; + rdfs:comment """ +Specifies the minimum value of a Parameter (for Parameters with comparable +types for which this makes sense). The type of the minimum must be one of +the types specified by param:supportsType. The host MAY attempt to set a +parameter to any value (of a legal type), i.e. the plugin MUST NOT assume +attempts to change a parameter are within range and SHOULD clamp accordingly. +""" . + + +param:maximum a rdf:Property ; + rdfs:domain param:Parameter ; + rdfs:label "maximum" ; + rdfs:comment """ +Specifies the maximum value of a Parameter (for Parameters with comparable +types for which this makes sense). The type of the maximum must be one of +the types specified by param:supportsType. The host MAY attempt to set a +parameter to any value (of a legal type), i.e. the plugin MUST NOT assume +attempts to change a parameter are within range and SHOULD clamp accordingly. +""" . + diff --git a/lv2/lv2plug.in/ns/ext/parameter/waf b/lv2/lv2plug.in/ns/ext/parameter/waf new file mode 120000 index 0000000..5235032 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/parameter/waf @@ -0,0 +1 @@ +../../../../../waf \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/parameter/wscript b/lv2/lv2plug.in/ns/ext/parameter/wscript new file mode 120000 index 0000000..7e2c01b --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/parameter/wscript @@ -0,0 +1 @@ +../../../../../ext.wscript \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/port-groups/ext.pc.in b/lv2/lv2plug.in/ns/ext/port-groups/ext.pc.in new file mode 120000 index 0000000..03dd044 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/port-groups/ext.pc.in @@ -0,0 +1 @@ +../../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/port-groups/manifest.ttl b/lv2/lv2plug.in/ns/ext/port-groups/manifest.ttl new file mode 100644 index 0000000..ff4205b --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/port-groups/manifest.ttl @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 0 ; + lv2:microVersion 1 ; + rdfs:seeAlso . + diff --git a/lv2/lv2plug.in/ns/ext/port-groups/port-groups.ttl b/lv2/lv2plug.in/ns/ext/port-groups/port-groups.ttl new file mode 100644 index 0000000..edf5359 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/port-groups/port-groups.ttl @@ -0,0 +1,490 @@ +# LV2 Port Groups Extension +# Copyright 2009-2011 David Robillard +# Copyright 2008-2009 Lars Luthman +# +# 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 pg: . +@prefix lv2: . +@prefix rdf: . +@prefix rdfs: . +@prefix owl: . +@prefix xsd: . +@prefix doap: . +@prefix foaf: . +@prefix amb: . + + a lv2:Specification ; + doap:license ; + doap:name "LV2 Port Groups" ; + doap:shortdesc "Multi-channel groups of LV2 ports." ; + rdfs:comment "Defines semantic groupings of LV2 ports" ; + doap:maintainer [ + a foaf:Person ; + foaf:name "Lars Luthman" ; + foaf:mbox + ] , [ + a foaf:Person ; + foaf:name "David Robillard" ; + foaf:homepage ; + rdfs:seeAlso + ] . + + +## Core Classes / Properties + +pg:Group a rdfs:Class ; + rdfs:label "LV2 Port Group" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty lv2:symbol ; + owl:someValuesFrom xsd:string ; + owl:cardinality 1 ; + rdfs:comment """ +A pg:Group MUST have exactly one string lv2:symbol. This symbol must be +unique according to the same rules as the lv2:symbol for an lv2:Port, where +group symbols and port symbols reside in the same namespace. In other words, +a group on a plugin MUST NOT have the same symbol as another group or a port +on that plugin. Rationale: Hosts or bindings may find it useful to construct +an identifier to refer to groups for the same reasons this is useful for ports. +""" + ] ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty pg:hasRole ; + owl:someValuesFrom pg:RoleAssignment ; + owl:minCardinality 1 ; + rdfs:comment "A Group MUST have at least one role assignment" + ] ; + rdfs:comment """ +A grouping of ports that can be logically considered a single "stream", e.g. +two audio ports in a group may form a stereo stream. The pg:source predicate +can also be used to describe this correspondence between separate ports/groups. +""" . + +pg:index a rdf:Property ; + rdfs:domain pg:RoleAssignment ; + rdfs:range xsd:nonNegativeInteger ; + rdfs:label "index" ; + rdfs:comment "Index of a role within some group" . + +pg:RoleAssignment a rdfs:Class ; + rdfs:label "Role Assignment" ; + rdfs:comment "A numbered role within some Group." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty pg:index ; + owl:cardinality 1 ; + rdfs:comment """ +A RoleAssignment MUST have exactly one index. +""" ] ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty pg:role ; + owl:cardinality 1 ; + rdfs:comment """ +A RoleAssignment MUST have exactly one role. +""" ] ; + rdfs:comment """ +All group definitions MUST define the order of channels. Note that this +does not have anything to do with port indices, this information is only +defined here for use by other extensions. For simply assigning groups +and roles to a basic LV2 plugin, index is irrelevant. +""" . + +pg:hasRole a rdf:Property ; + rdfs:domain pg:Group ; + rdfs:range pg:Role ; + rdfs:label "Has port with role" ; + rdfs:comment """ +Indicates that a group always has a port with a particular role. +""" . + +pg:mayHaveRole a rdf:Property ; + rdfs:domain pg:Group ; + rdfs:range pg:Role ; + rdfs:label "May have port with role" ; + rdfs:comment """ +Indicates that a group may have a port with a particular role. +""" . + +pg:sideChainOf a rdf:Property ; + rdfs:domain pg:Group , lv2:Port ; + rdfs:range pg:Group , lv2:Port ; + rdfs:label "Side-chain of" ; + rdfs:comment """ +Indicates that this port or group should be considered a "side chain" of +some other port or group. The precise definition of "side chain" depends +on the plugin, but in general this group should be considered a modifier to +some other group, rather than an independent input itself. +""" . + +pg:subGroupOf a rdf:Property ; + rdfs:domain pg:Group ; + rdfs:range pg:Group ; + rdfs:label "Sub-group of" ; + rdfs:comment """ +Indicates that this group is a child of another group. This property has +no meaning with respect to plugin execution, but the host may find this +information useful (e.g. to provide a compact user interface). Note that +all groups on a plugin MUST have a unique symbol with respect to the plugin +as documented for pg:Group, i.e. sub-groups must have a unique symbol among +all groups and ports on the plugin. +""" . + +pg:source a rdf:Property ; + rdfs:domain pg:Group , lv2:Port ; + rdfs:range pg:Group , lv2:Port ; + rdfs:label "Source group" ; + rdfs:comment """ +Indicates that this port or group should be considered the "result" of +some other port or group. This property only makes sense on groups with +outputs when the source is a group with inputs. This can be used to convey +a relationship between corresponding input and output groups with different +types, e.g. a mono->stereo plugin. +""" . + +pg:mainGroup a rdf:Property ; + rdfs:domain lv2:Plugin ; + rdfs:range pg:Group ; + rdfs:label "Main port group" ; + rdfs:comment """ +Indicates that this group should be considered the "main" inputs/outputs of +the plugin, e.g. it probably makes sense to just connect main groups and set +some controls. A plugin MUST NOT have more than one :mainGroup property. +High-level hosts that simply want to insert an plugin in a given stream +should use this property to determine where the plugin 'fits'. +""" . + +pg:inGroup a rdf:Property ; + rdfs:domain lv2:Port ; + rdfs:range pg:Group ; + rdfs:label "In port group" ; + rdfs:comment """ +Indicates that this port is a part of a group of ports on the plugin. +Ports that have a meaningful "role" that may be useful to hosts SHOULD also +have a :role property, otherwise ports in the group have no meaningful order. +""" . + +pg:Role a rdfs:Class ; + rdfs:label "Port role" ; + rdfs:comment """ +The role of a port with respect to its plugin or group. If the port is a +member of a group (has an :inGroup property) the role is relevant with respect +to that group. Otherwise the role is relevant with respect to the plugin. +""" . + +pg:role a rdf:Property ; + rdfs:range pg:Role ; + rdfs:label "Role" ; + rdfs:comment """ +Indicates that this port has a particular role with respect to its enclosing +plugin or group (whichever is smaller). A port may have several roles if it +makes sense to do so (though some Role or Group definition may forbid this). +""" . + + +# Discrete + +pg:DiscreteGroup a rdfs:Class ; + rdfs:subClassOf pg:Group ; + rdfs:comment """ +"Discrete" channel configurations. These groups are divided into channels +where each represents a particular speaker location. The position of sound +in one of these groups depends on a particular speaker configuration. +""" . + +pg:leftChannel a pg:Role ; rdfs:label "Left" . +pg:rightChannel a pg:Role ; rdfs:label "Right" . +pg:centerChannel a pg:Role ; rdfs:label "Center" . +pg:sideChannel a pg:Role ; rdfs:label "Side" . +pg:centerLeftChannel a pg:Role ; rdfs:label "Center Left" . +pg:centerRightChannel a pg:Role ; rdfs:label "Center Right" . +pg:sideLeftChannel a pg:Role ; rdfs:label "Side Left" . +pg:sideRightChannel a pg:Role ; rdfs:label "Side Right" . +pg:rearLeftChannel a pg:Role ; rdfs:label "Rear Left" . +pg:rearRightChannel a pg:Role ; rdfs:label "Rear Right" . +pg:rearCenterChannel a pg:Role ; rdfs:label "Rear Center" . +pg:lfeChannel a pg:Role ; rdfs:label "Sub (LFE)" . + +pg:MonoGroup a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "Mono" ; + pg:hasRole [ pg:index 0; pg:role pg:centerChannel ] . + +pg:StereoGroup a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "Stereo" ; + pg:hasRole [ pg:index 0; pg:role pg:leftChannel ] ; + pg:hasRole [ pg:index 1; pg:role pg:rightChannel ] . + +pg:MidSideGroup a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "Mid-Side Stereo" ; + pg:hasRole [ pg:index 0; pg:role pg:centerChannel ] ; + pg:hasRole [ pg:index 1; pg:role pg:sideChannel ] . + +pg:ThreePointZeroGroup a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "3.0 Surround" ; + pg:hasRole [ pg:index 0; pg:role pg:leftChannel ] ; + pg:hasRole [ pg:index 1; pg:role pg:rightChannel ] ; + pg:hasRole [ pg:index 2; pg:role pg:rearCenterChannel ] . + +pg:FourPointZeroGroup a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "4.0 Surround (Quadraphonic)" ; + pg:hasRole [ pg:index 0; pg:role pg:leftChannel ] ; + pg:hasRole [ pg:index 1; pg:role pg:centerChannel ] ; + pg:hasRole [ pg:index 2; pg:role pg:rightChannel ] ; + pg:hasRole [ pg:index 3; pg:role pg:rearCenterChannel ] . + +pg:FivePointZeroGroup a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "5.0 Surround (3-2 stereo)" ; + pg:hasRole [ pg:index 0; pg:role pg:leftChannel ] ; + pg:hasRole [ pg:index 1; pg:role pg:centerChannel ] ; + pg:hasRole [ pg:index 2; pg:role pg:rightChannel ] ; + pg:hasRole [ pg:index 3; pg:role pg:rearLeftChannel ] ; + pg:hasRole [ pg:index 4; pg:role pg:rearRightChannel ] . + +pg:FivePointOneGroup a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "5.1 Surround (3-2 stereo)" ; + pg:hasRole [ pg:index 0; pg:role pg:leftChannel ] ; + pg:hasRole [ pg:index 1; pg:role pg:centerChannel ] ; + pg:hasRole [ pg:index 2; pg:role pg:rightChannel ] ; + pg:hasRole [ pg:index 3; pg:role pg:rearLeftChannel ] ; + pg:hasRole [ pg:index 4; pg:role pg:rearRightChannel ] ; + pg:hasRole [ pg:index 5; pg:role pg:lfeChannel ] . + +pg:SixPointOneGroup a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "6.1 Surround" ; + pg:hasRole [ pg:index 0; pg:role pg:leftChannel ] ; + pg:hasRole [ pg:index 1; pg:role pg:centerChannel ] ; + pg:hasRole [ pg:index 2; pg:role pg:rightChannel ] ; + pg:hasRole [ pg:index 3; pg:role pg:sideLeftChannel ] ; + pg:hasRole [ pg:index 4; pg:role pg:sideRightChannel ] ; + pg:hasRole [ pg:index 5; pg:role pg:rearCenterChannel ] ; + pg:hasRole [ pg:index 6; pg:role pg:lfeChannel ] . + +pg:SevenPointOneGroup a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "7.1 Surround" ; + pg:hasRole [ pg:index 0; pg:role pg:leftChannel ] ; + pg:hasRole [ pg:index 1; pg:role pg:centerChannel ] ; + pg:hasRole [ pg:index 2; pg:role pg:rightChannel ] ; + pg:hasRole [ pg:index 3; pg:role pg:sideLeftChannel ] ; + pg:hasRole [ pg:index 4; pg:role pg:sideRightChannel ] ; + pg:hasRole [ pg:index 5; pg:role pg:rearLeftChannel ] ; + pg:hasRole [ pg:index 6; pg:role pg:rearRightChannel ] ; + pg:hasRole [ pg:index 7; pg:role pg:lfeChannel ] . + +pg:SevenPointOneWideGroup a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "7.1 Surround (Wide)" ; + pg:hasRole [ pg:index 0; pg:role pg:leftChannel ] ; + pg:hasRole [ pg:index 1; pg:role pg:centerLeftChannel ] ; + pg:hasRole [ pg:index 2; pg:role pg:centerChannel ] ; + pg:hasRole [ pg:index 3; pg:role pg:centerRightChannel ] ; + pg:hasRole [ pg:index 4; pg:role pg:rightChannel ] ; + pg:hasRole [ pg:index 5; pg:role pg:rearLeftChannel ] ; + pg:hasRole [ pg:index 6; pg:role pg:rearRightChannel ] ; + pg:hasRole [ pg:index 7; pg:role pg:lfeChannel ] . + + +# Ambisonic + +pg:AmbisonicGroup a rdfs:Class ; + rdfs:subClassOf pg:Group ; + rdfs:comment """ +"Ambisonic" channel configurations. These groups are divided into channels +which together represent a position in an abstract n-dimensional space. +The position of sound in one of these groups does not depend on a particular +speaker configuration; a decoder can be used to convert an ambisonic stream +for any speaker configuration. +""" . + +#amb:ACN0 a pg:Role ; rdfs:label "ACN 0 (W)" . +#amb:ACN1 a pg:Role ; rdfs:label "ACN 1 (Y)" . +#amb:ACN2 a pg:Role ; rdfs:label "ACN 2 (Z)" . +#amb:ACN3 a pg:Role ; rdfs:label "ACN 3 (X)" . +#amb:ACN4 a pg:Role ; rdfs:label "ACN 4 (V)" . +#amb:ACN5 a pg:Role ; rdfs:label "ACN 5 (T)" . +#amb:ACN6 a pg:Role ; rdfs:label "ACN 6 (R)" . +#amb:ACN7 a pg:Role ; rdfs:label "ACN 7 (S)" . +#amb:ACN8 a pg:Role ; rdfs:label "ACN 8 (U)" . +#amb:ACN9 a pg:Role ; rdfs:label "ACN 9 (Q)" . +#amb:ACN10 a pg:Role ; rdfs:label "ACN 10 (O)" . +#amb:ACN11 a pg:Role ; rdfs:label "ACN 11 (M)" . +#amb:ACN12 a pg:Role ; rdfs:label "ACN 12 (K)" . +#amb:ACN13 a pg:Role ; rdfs:label "ACN 13 (L)" . +#amb:ACN14 a pg:Role ; rdfs:label "ACN 14 (N)" . +#amb:ACN15 a pg:Role ; rdfs:label "ACN 15 (P)" . + +pg:AmbisonicBH1P0Group a rdfs:Class ; + rdfs:subClassOf pg:AmbisonicGroup ; + rdfs:label "Ambisonic B stream of horizontal order 1 and peripheral order 0." ; + pg:hasRole [ pg:index 0; pg:role amb:ACN0 ] ; + pg:hasRole [ pg:index 1; pg:role amb:ACN1 ] ; + pg:hasRole [ pg:index 2; pg:role amb:ACN3 ] . + +pg:AmbisonicBH1P1Group a rdfs:Class ; + rdfs:subClassOf pg:AmbisonicGroup ; + rdfs:label "Ambisonic B stream of horizontal order 1 and peripheral order 1." ; + pg:hasRole [ pg:index 0; pg:role amb:ACN0 ] ; + pg:hasRole [ pg:index 1; pg:role amb:ACN1 ] ; + pg:hasRole [ pg:index 2; pg:role amb:ACN2 ] ; + pg:hasRole [ pg:index 3; pg:role amb:ACN3 ] . + +pg:AmbisonicBH2P0Group a rdfs:Class ; + rdfs:subClassOf pg:AmbisonicGroup ; + rdfs:label "Ambisonic B stream of horizontal order 2 and peripheral order 0." ; + pg:hasRole [ pg:index 0; pg:role amb:ACN0 ] ; + pg:hasRole [ pg:index 1; pg:role amb:ACN1 ] ; + pg:hasRole [ pg:index 2; pg:role amb:ACN3 ] ; + pg:hasRole [ pg:index 3; pg:role amb:ACN4 ] ; + pg:hasRole [ pg:index 4; pg:role amb:ACN8 ] . + +pg:AmbisonicBH2P1Group a rdfs:Class ; + rdfs:subClassOf pg:AmbisonicGroup ; + rdfs:label "Ambisonic B stream of horizontal order 2 and peripheral order 1." ; + pg:hasRole [ pg:index 0; pg:role amb:ACN0 ] ; + pg:hasRole [ pg:index 1; pg:role amb:ACN1 ] ; + pg:hasRole [ pg:index 2; pg:role amb:ACN2 ] ; + pg:hasRole [ pg:index 3; pg:role amb:ACN3 ] ; + pg:hasRole [ pg:index 4; pg:role amb:ACN4 ] ; + pg:hasRole [ pg:index 5; pg:role amb:ACN8 ] . + +pg:AmbisonicBH2P2Group a rdfs:Class ; + rdfs:subClassOf pg:AmbisonicGroup ; + rdfs:label "Ambisonic B stream of horizontal order 2 and peripheral order 2." ; + pg:hasRole [ pg:index 0; pg:role amb:ACN0 ] ; + pg:hasRole [ pg:index 1; pg:role amb:ACN1 ] ; + pg:hasRole [ pg:index 2; pg:role amb:ACN2 ] ; + pg:hasRole [ pg:index 3; pg:role amb:ACN3 ] ; + pg:hasRole [ pg:index 4; pg:role amb:ACN4 ] ; + pg:hasRole [ pg:index 5; pg:role amb:ACN5 ] ; + pg:hasRole [ pg:index 6; pg:role amb:ACN6 ] ; + pg:hasRole [ pg:index 7; pg:role amb:ACN7 ] ; + pg:hasRole [ pg:index 8; pg:role amb:ACN8 ] . + +pg:AmbisonicBH3P0Group a rdfs:Class ; + rdfs:subClassOf pg:AmbisonicGroup ; + rdfs:label "Ambisonic B stream of horizontal order 3 and peripheral order 0." ; + pg:hasRole [ pg:index 0; pg:role amb:ACN0 ] ; + pg:hasRole [ pg:index 1; pg:role amb:ACN1 ] ; + pg:hasRole [ pg:index 2; pg:role amb:ACN3 ] ; + pg:hasRole [ pg:index 3; pg:role amb:ACN4 ] ; + pg:hasRole [ pg:index 4; pg:role amb:ACN8 ] ; + pg:hasRole [ pg:index 5; pg:role amb:ACN9 ] ; + pg:hasRole [ pg:index 6; pg:role amb:ACN15 ] . + +pg:AmbisonicBH3P1Group a rdfs:Class ; + rdfs:subClassOf pg:AmbisonicGroup ; + rdfs:label "Ambisonic B stream of horizontal order 3 and peripheral order 1." ; + pg:hasRole [ pg:index 0; pg:role amb:ACN0 ] ; + pg:hasRole [ pg:index 1; pg:role amb:ACN1 ] ; + pg:hasRole [ pg:index 2; pg:role amb:ACN2 ] ; + pg:hasRole [ pg:index 3; pg:role amb:ACN3 ] ; + pg:hasRole [ pg:index 4; pg:role amb:ACN4 ] ; + pg:hasRole [ pg:index 5; pg:role amb:ACN8 ] ; + pg:hasRole [ pg:index 6; pg:role amb:ACN9 ] ; + pg:hasRole [ pg:index 7; pg:role amb:ACN15 ] . + +pg:AmbisonicBH3P2Group a rdfs:Class ; + rdfs:subClassOf pg:AmbisonicGroup ; + rdfs:label "Ambisonic B stream of horizontal order 3 and peripheral order 2." ; + pg:hasRole [ pg:index 0; pg:role amb:ACN0 ] ; + pg:hasRole [ pg:index 1; pg:role amb:ACN1 ] ; + pg:hasRole [ pg:index 2; pg:role amb:ACN2 ] ; + pg:hasRole [ pg:index 3; pg:role amb:ACN3 ] ; + pg:hasRole [ pg:index 4; pg:role amb:ACN4 ] ; + pg:hasRole [ pg:index 5; pg:role amb:ACN5 ] ; + pg:hasRole [ pg:index 6; pg:role amb:ACN6 ] ; + pg:hasRole [ pg:index 7; pg:role amb:ACN7 ] ; + pg:hasRole [ pg:index 8; pg:role amb:ACN8 ] ; + pg:hasRole [ pg:index 9; pg:role amb:ACN9 ] ; + pg:hasRole [ pg:index 10; pg:role amb:ACN15 ] . + +pg:AmbisonicBH3P3Group a rdfs:Class ; + rdfs:subClassOf pg:AmbisonicGroup ; + rdfs:label "Ambisonic B stream of horizontal order 3 and peripheral order 3." ; + pg:hasRole [ pg:index 0; pg:role amb:ACN0 ] ; + pg:hasRole [ pg:index 1; pg:role amb:ACN1 ] ; + pg:hasRole [ pg:index 2; pg:role amb:ACN2 ] ; + pg:hasRole [ pg:index 3; pg:role amb:ACN3 ] ; + pg:hasRole [ pg:index 4; pg:role amb:ACN4 ] ; + pg:hasRole [ pg:index 5; pg:role amb:ACN5 ] ; + pg:hasRole [ pg:index 6; pg:role amb:ACN6 ] ; + pg:hasRole [ pg:index 7; pg:role amb:ACN7 ] ; + pg:hasRole [ pg:index 8; pg:role amb:ACN8 ] ; + pg:hasRole [ pg:index 9; pg:role amb:ACN9 ] ; + pg:hasRole [ pg:index 10; pg:role amb:ACN10 ] ; + pg:hasRole [ pg:index 11; pg:role amb:ACN11 ] ; + pg:hasRole [ pg:index 12; pg:role amb:ACN12 ] ; + pg:hasRole [ pg:index 13; pg:role amb:ACN13 ] ; + pg:hasRole [ pg:index 14; pg:role amb:ACN14 ] ; + pg:hasRole [ pg:index 15; pg:role amb:ACN15 ] . + + +# Controls + +pg:ControlGroup a rdfs:Class ; + rdfs:subClassOf pg:Group ; + rdfs:comment """ +A group representing a set of associated controls. +""" . + +pg:amplitude a pg:Role ; rdfs:label "Amplitude" . +pg:attack a pg:Role ; rdfs:label "Attack" . +pg:cutoffFrequency a pg:Role ; rdfs:label "Cutoff Frequency" . +pg:decay a pg:Role ; rdfs:label "Decay" . +pg:delay a pg:Role ; rdfs:label "Delay" . +pg:frequency a pg:Role ; rdfs:label "Frequency" . +pg:hold a pg:Role ; rdfs:label "Hold" . +pg:pulseWidth a pg:Role ; rdfs:label "Pulse Width" . +pg:ratio a pg:Role ; rdfs:label "Ratio" . +pg:release a pg:Role ; rdfs:label "Release" . +pg:resonance a pg:Role ; rdfs:label "Resonance" . +pg:sustain a pg:Role ; rdfs:label "Sustain" . +pg:threshold a pg:Role ; rdfs:label "Threshold" . +pg:waveform a pg:Role ; rdfs:label "Waveform" . + +pg:EnvelopeControlGroup a rdfs:Class ; + rdfs:subClassOf pg:ControlGroup ; + rdfs:label "Controls for a DAHDSR envelope." ; + pg:mayHaveRole pg:delay ; + pg:mayHaveRole pg:attack ; + pg:mayHaveRole pg:hold ; + pg:mayHaveRole pg:decay ; + pg:mayHaveRole pg:sustain ; + pg:mayHaveRole pg:release . + +pg:OscillatorControlGroup a rdfs:Class ; + rdfs:subClassOf pg:ControlGroup ; + rdfs:label "Controls for an oscillator." ; + pg:mayHaveRole pg:frequency ; + pg:mayHaveRole pg:amplitude ; + pg:mayHaveRole pg:waveform ; + pg:mayHaveRole pg:pulseWidth . + +pg:FilterControlGroup a rdfs:Class ; + rdfs:subClassOf pg:ControlGroup ; + rdfs:label "Controls for a filter." ; + pg:mayHaveRole pg:cutoffFrequency ; + pg:mayHaveRole pg:resonance . + +pg:CompressorControlGroup a rdfs:Class ; + rdfs:subClassOf pg:ControlGroup ; + rdfs:label "Controls for a compressor." ; + pg:mayHaveRole pg:threshold ; + pg:mayHaveRole pg:ratio . + diff --git a/lv2/lv2plug.in/ns/ext/port-groups/waf b/lv2/lv2plug.in/ns/ext/port-groups/waf new file mode 120000 index 0000000..5235032 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/port-groups/waf @@ -0,0 +1 @@ +../../../../../waf \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/port-groups/wscript b/lv2/lv2plug.in/ns/ext/port-groups/wscript new file mode 120000 index 0000000..7e2c01b --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/port-groups/wscript @@ -0,0 +1 @@ +../../../../../ext.wscript \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/port-props/ext.pc.in b/lv2/lv2plug.in/ns/ext/port-props/ext.pc.in new file mode 120000 index 0000000..03dd044 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/port-props/ext.pc.in @@ -0,0 +1 @@ +../../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/port-props/manifest.ttl b/lv2/lv2plug.in/ns/ext/port-props/manifest.ttl new file mode 100644 index 0000000..b4afe2f --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/port-props/manifest.ttl @@ -0,0 +1,8 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 0 ; + lv2:microVersion 1 ; + rdfs:seeAlso . diff --git a/lv2/lv2plug.in/ns/ext/port-props/port-props.ttl b/lv2/lv2plug.in/ns/ext/port-props/port-props.ttl new file mode 100644 index 0000000..d811959 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/port-props/port-props.ttl @@ -0,0 +1,217 @@ +@prefix pprops: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a lv2:Specification ; + doap:name "LV2 Port Properties" ; + doap:release [ + doap:revision "0.1" ; + doap:created "2011-11-01" + ] ; + doap:created "2009-01-01" ; + doap:shortdesc "Additional properties for LV2 plugin ports." ; + doap:maintainer [ + a foaf:Person ; + foaf:name "Krzysztof Foltman" + ] , [ + a foaf:Person ; + foaf:name "David Robillard" ; + rdfs:seeAlso + ] ; + lv2:documentation """ +

This extension defines several useful properties for LV2 plugin ports, which +can be used in plugin descriptions to better describe ports. Using this +metadata, hosts can build better UIs for plugins, and provide more advanced +automatic functionality.

+""" . + +pprops:trigger + a lv2:PortProperty ; + rdfs:label "Trigger" ; + rdfs:comment """ +Indicates that the data item corresponds to a momentary event that has been +detected (control output ports) or is to be triggered (control input ports). +For input ports, the port needs to be reset to lv2:default value after run() +function of the plugin has returned. If the control port is assigned a GUI +widget by the host, the widget should be of auto-off (momentary, one-shot) type +- for example, a push button if the port is also declared as lv2:toggled, or a +series of push button or auto-clear input box with a "Send" button if the port +is also lv2:integer. +""" . + +pprops:supportsStrictBounds + a lv2:Feature ; + rdfs:label "Supports strict bounds" ; + rdfs:comment """ +Indicates use of host support for pprops:hasStrictBounds port property. A +plugin that specifies it as optional feature can omit value clamping for +hasStrictBounds ports, if the feature is supported by the host. When specified +as required feature, it indicates that the plugin does not do any clamping for +input ports that have a pprops:hasStrictBounds property. +""" . + +pprops:hasStrictBounds + a lv2:PortProperty ; + rdfs:label "Has strict bounds" ; + rdfs:comment """ +For hosts that support pprops:supportsStrictBounds, this indicates that the +value of the port should never exceed the port's minimum and maximum control +points. For input ports, it moves the responsibility for limiting the range of +values to host, if it supports pprops:supportsStrictBounds. For output ports, +it indicates that values within specified range are to be expected, and +breaking that should be considered by the host as error in plugin +implementation. +""" . + +pprops:expensive + a lv2:PortProperty ; + rdfs:label "Changes trigger expensive calculation" ; + rdfs:comment """ +Input ports only. Indicates that any changes to the port value may trigger +expensive background calculation (e.g. regenerate some lookup tables in a +background thread). Any value changes may have not have immediate effect, or +may cause silence or diminished-quality version of the output until background +processing is finished. Ports having this property are typically not well +suited for connection to outputs of other plugins, and should not be offered as +connection targets or for automation by default. +""" . + +pprops:causesArtifacts + a lv2:PortProperty ; + rdfs:label "May cause audio artifacts when changed" ; + rdfs:comment """ +Input ports only. Indicates that any changes to the port value may produce +slight artifacts to produced audio signals (zipper noise and other results of +signal discontinuities). Connecting ports of this type to continuous signals +is not recommended, and when presenting a list of automation targets, those +ports may be marked as artifact-producing. +""" . + +pprops:continuousCV + a lv2:PortProperty ; + rdfs:label "Carries a smooth modulation signal" ; + rdfs:comment """ +Indicates that the port carries a "smooth" modulation signal. Control input +ports of this type are well-suited for being connected to sources of smooth +signals (knobs with smoothing, modulation rate oscillators, output ports with +continuousCV type, etc.). Typically, the plugin with ports which have this +property will implement appropriate smoothing to avoid audio artifacts. For +output ports, this property suggests the value of the port is likely to change +frequently, and describes a smooth signal (e.g. successive values may be +considered points along a curve). +""" . + +pprops:discreteCV + a lv2:PortProperty ; + rdfs:label "Carries a discrete modulation signal" ; + rdfs:comment """ +Indicates that the port carries a "discrete" modulation signal. Input ports of +this type are well-suited for being connected to sources of discrete signals +(switches, buttons, classifiers, event detectors, etc.). May be combined with +pprops:trigger property. For output ports, this property suggests the value of +the port describe discrete values that should be interpreted as steps (and not +points along a curve). +""" . + +pprops:reportsBpm + a lv2:PortProperty ; + rdfs:label "Carries the current tempo expressed in BPM" ; + rdfs:comment """ +Indicates that the port is used to pass the current tempo in context of the +plugin (which may be current song tempo, or tempo of a particular subset of the +song, or the subgraph the plugin resides in). For input ports, the host may +automatically feed the port with current tempo and hide the port from the user, +unless the user or other factors encourage different behaviour. +""" . + +pprops:reportsBeatsPerBar + a lv2:PortProperty ; + rdfs:label "Carries the current number of beats in a bar" ; + rdfs:comment """ +Indicates that the port may be used to pass the current number of beats in a +bar. """ . + +pprops:reportsBeatUnit + a lv2:PortProperty ; + rdfs:label "Carries the current beat size" ; + rdfs:comment """ +Indicates that the port may be used to pass the current size of a beat (4 for a +crochet/quarter note, 8 for a quaver/eighth note, etc.). +""" . + +pprops:logarithmic + a lv2:PortProperty ; + rdfs:label "Port value uses a logarithmic scale" ; + rdfs:comment """ +Indicates that port value behaviour within specified range (bounds) is a value +using logarithmic scale. The lower and upper bounds must be specified, and +must be of the same sign. +""" . + +pprops:notAutomatic + a lv2:PortProperty ; + rdfs:label "Port is not intended as a CV input" ; + rdfs:comment """ +Indicates that the port is not primarily intended to be fed with modulation +signals from external sources (other plugins, etc.). It is merely a UI hint +and hosts may allow the user to override it. +""" . + +pprops:notOnGUI + a lv2:PortProperty ; + rdfs:label "Port is not to be displayed on a GUI or equivalent" ; + rdfs:comment """ +Indicates that the port is not primarily intended to be represented by a +separate control in the user interface window (or any similar mechanism used +for direct, immediate control of control ports). It is merely a UI hint and +hosts may allow the user to override it. +""" . + +pprops:priority + a rdf:Property ; + rdfs:domain lv2:Port ; + rdfs:range xsd:float ; + rdfs:label "Relative usefulness of a port" ; + rdfs:comment """ +Indicates how (typically) useful is the port comparing to other ports with that +property (higher value = more important). The values do not need to be unique, +and ports can be grouped based on their priorities. +""" . + +pprops:rangeSteps + a rdf:Property ; + rdfs:domain lv2:Port ; + rdfs:range xsd:nonNegativeInteger ; + rdfs:label "Number of value quantization steps" ; + lv2:documentation """ +

This value indicates into how many evenly-divided points the (control) port +range shoujld be divided for step-wise control. This may be used for changing +the value with step-based controllers like arrow keys, mouse wheel, rotary +encoders, etc.

+ +

Note that when used with a pprops:logarithmic port, the steps are +logarithmic too, and port value can be calculated as:

+ +
+value = lower * pow(upper / lower, step / (steps - 1))
+
+ +

and the step from value is:

+ +
+step = (steps - 1) * log(value / lower) / log(upper / lower)
+
+ +

where:

+
    +
  • value is the port value
  • +
  • step is the step number (0..steps)
  • +
  • steps is the number of steps (= value of :rangeSteps property)
  • +
  • lower and upper are the bounds
  • +
+""" . diff --git a/lv2/lv2plug.in/ns/ext/port-props/waf b/lv2/lv2plug.in/ns/ext/port-props/waf new file mode 120000 index 0000000..5235032 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/port-props/waf @@ -0,0 +1 @@ +../../../../../waf \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/port-props/wscript b/lv2/lv2plug.in/ns/ext/port-props/wscript new file mode 120000 index 0000000..7e2c01b --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/port-props/wscript @@ -0,0 +1 @@ +../../../../../ext.wscript \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/presets/ext.pc.in b/lv2/lv2plug.in/ns/ext/presets/ext.pc.in new file mode 120000 index 0000000..03dd044 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/presets/ext.pc.in @@ -0,0 +1 @@ +../../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/presets/manifest.ttl b/lv2/lv2plug.in/ns/ext/presets/manifest.ttl new file mode 100644 index 0000000..51985ab --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/presets/manifest.ttl @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 2 ; + lv2:microVersion 2 ; + rdfs:seeAlso . + diff --git a/lv2/lv2plug.in/ns/ext/presets/presets.ttl b/lv2/lv2plug.in/ns/ext/presets/presets.ttl new file mode 100644 index 0000000..e11210a --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/presets/presets.ttl @@ -0,0 +1,148 @@ +# LV2 Presets Extension +# Copyright 2009-2011 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 dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix owl: . +@prefix pset: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a foaf:Person ; + foaf:name "David Robillard" ; + foaf:homepage ; + foaf:mbox ; + rdfs:seeAlso . + + + a lv2:Specification ; + doap:license ; + doap:name "LV2 Presets" ; + doap:shortdesc "Presets for LV2 plugins. " ; + doap:maintainer ; + doap:release [ + doap:revision "2.2" ; + doap:created "2011-11-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Update packaging." + ] , [ + rdfs:label "Improve documentation." + ] + ] + ] , [ + doap:revision "2.0" ; + doap:created "2010-10-04" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ +

This extension describes a format for presets (i.e. named sets of control +values) for LV2 plugins. The structure of pset:Preset is deliberately very +similar to the description of a plugin and can be thought of as a plugin +overlay. For example:

+ +
+@prefix eg: <http://example.org/> .
+
+eg:mypreset
+    a pset:Preset ;
+    rdfs:label "One louder" ;
+    pset:appliesTo eg:myplugin ;
+    lv2:port [
+        lv2:symbol "volume1" ;
+        pset:value 11
+    ] , [
+        lv2:symbol "volume2" ;
+        pset:value 11.0
+    ] .
+
+ +

Presets may be defined in any bundles, including the plugin's bundle, +separate third party preset bundles, or user-created preset bundles created by +hosts. The manifest.ttl of a bundle containing presets should list the +presets like so:

+ +
+eg:mypreset
+    a              pset:Preset ;
+    pset:appliesTo eg:myplugin ;
+    rdfs:seeAlso   <mypreset.ttl> .
+
+ +

This extension does not define a dynamic mechanism for changing plugin +presets for plugins that require such a facility, but may be extended to do +so.

+""" . + +pset:Preset + a rdfs:Class ; + rdfs:subClassOf lv2:PluginBase ; + rdfs:label "LV2 Preset" ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:onProperty rdfs:label ; + owl:someValuesFrom xsd:string ; + rdfs:comment "A Preset MUST have at least one string rdfs:label." + ] ; + rdfs:comment """ +A Preset for an LV2 Plugin. A preset can be considered an "overlay" on a +Plugin. Rather than attempting to define all valid predicates for a Preset +(which is not possible since presets may need to specify values for things +defined in other extensions), the presets extension simply provides this +class which can be augmented with any data in the exact same fashion as the +definition of a Plugin. + +A Preset SHOULD have at least one pset:appliesTo property. +Each Port on a Preset MUST have at least a lv2:symbol property and a +pset:value property. +""" . + +pset:appliesTo + a rdf:Property ; + rdfs:domain pset:Preset ; + rdfs:range lv2:Plugin ; + rdfs:label "Applies to" ; + rdfs:comment """ +Specifies the Plugin(s) a Preset may be applied to. When a Preset applies +to a Plugin, that Preset SHOULD have ports for every control port on that +plugin, each of which SHOULD have a pset:value property. If the Preset is +missing ports, or refers to ports which do not exist on the Plugin, then +the host SHOULD apply all the values in the preset that do match the Plugin. + +The Preset MAY have any other values that should be applied to the Plugin +in some way. The host SHOULD simply ignore any values on a Preset it does +not understand. +""" . + +pset:value + a rdf:Property ; + rdfs:domain lv2:Port ; + rdfs:label "Has value" ; + rdfs:comment """ +Specifies the value of a Port on some Preset. This property is used +in a similar way to e.g. lv2:default. +""" . diff --git a/lv2/lv2plug.in/ns/ext/presets/waf b/lv2/lv2plug.in/ns/ext/presets/waf new file mode 120000 index 0000000..5235032 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/presets/waf @@ -0,0 +1 @@ +../../../../../waf \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/presets/wscript b/lv2/lv2plug.in/ns/ext/presets/wscript new file mode 120000 index 0000000..7e2c01b --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/presets/wscript @@ -0,0 +1 @@ +../../../../../ext.wscript \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/pui/ext.pc.in b/lv2/lv2plug.in/ns/ext/pui/ext.pc.in new file mode 120000 index 0000000..03dd044 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/pui/ext.pc.in @@ -0,0 +1 @@ +../../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/pui/manifest.ttl b/lv2/lv2plug.in/ns/ext/pui/manifest.ttl new file mode 100644 index 0000000..1229118 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/pui/manifest.ttl @@ -0,0 +1,8 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification; + lv2:minorVersion 0; + lv2:microVersion 1; + rdfs:seeAlso . diff --git a/lv2/lv2plug.in/ns/ext/pui/pui.h b/lv2/lv2plug.in/ns/ext/pui/pui.h new file mode 100644 index 0000000..caa7deb --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/pui/pui.h @@ -0,0 +1,374 @@ +/************************************************************************ + * + * Plugin UI extension for LV2 + * + * Copyright (C) 2006-2011 Lars Luthman + * + * Based on lv2.h, which was + * + * Copyright (C) 2000-2002 Richard W.E. Furse, Paul Barton-Davis, + * Stefan Westerfeld + * Copyright (C) 2006 Steve Harris, David Robillard. + * + * This header is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation; either version 2.1 of the License, + * or (at your option) any later version. + * + * This header is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 + * USA. + * + ***********************************************************************/ + +/** + @file pui.h C API for the LV2 UI extension . + + This file specifies a C API for communication between an LV2 host and an + LV2 UI. The interface is similar to the one used for actual LV2 plugins. + + The entry point is the function lv2ui_descriptor(). +*/ + +#ifndef LV2_PUI_H +#define LV2_PUI_H + +#include + +/** The URI of this extension (note this is not the same as the prefix). */ +#define LV2_PUI_URI "http://lv2plug.in/ns/ext/pui" + +/** The numerical ID returned by LV2_PUI_Host_Descriptor::port_index() for + invalid port symbols. */ +#define LV2_PUI_INVALID_PORT_INDEX ((uint32_t)-1) + +/** The full URI for the pui:floatControl PortProtocol. */ +#define LV2_PUI_FLOAT_CONTROL_URI "http://lv2plug.in/ns/ext/pui#floatControl" + +/** The full URI for the pui:floatPeakRMS PortProtocol. */ +#define LV2_PUI_FLOAT_PEAK_RMS_URI "http://lv2plug.in/ns/ext/pui#floatPeakRMS" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + A data type that is used to pass peak and RMS values for a period of + audio data at an input or output port to an UI, using port_event. See the + documentation for pui:floatPeakRMS for details about how and when this + should be done. +*/ +typedef struct _LV2_PUI_Peak_RMS_Data { + + /** + The start of the measurement period. This is just a running counter that + must not be interpreted as any sort of global frame position. It should + only be interpreted relative to the starts of other measurement periods + in port_event() calls to the same plugin instance. + + This counter is allowed to overflow, in which case it should just wrap + around. + */ + uint32_t period_start; + + /** + The size of the measurement period, in the same units as period_start. + */ + uint32_t period_size; + + /** + The peak value for the measurement period. This should be the maximal + value for abs(sample) over all the samples in the period. + */ + float peak; + + /** + The RMS value for the measurement period. This should be the root mean + square value of the samples in the period, equivalent to + sqrt((pow(sample1, 2) + pow(sample2, 2) + ... + pow(sampleN, 2)) / N) + where N is period_size. + */ + float rms; + +} LV2_PUI_Peak_RMS_Data; + +/** + A pointer to a widget or other type of UI. + The actual type is defined by the type of the UI defined in the RDF data. + All the functionality provided by this extension is toolkit independent, the + host only needs to pass the necessary callbacks and display the widget, if + possible. Plugins may have several UIs, in various toolkits. +*/ +typedef void* LV2_PUI_Widget; + +/** + Handle for a particular instance of a UI. + It is valid to compare this to NULL (0 for C++) but otherwise the host MUST + NOT attempt to interpret it. The UI may use it to reference internal + instance data. +*/ +typedef void* LV2_PUI_Handle; + +/** + Handle for host functions and data provided to a UI. + An object of this type is passed to the UI's instantiate() function, and the + UI must in turn pass it as the first parameter to the callbacks in + LV2_PUI_Host_Descriptor. The host may use it to reference internal data, such + as the plugin instance that the UI is associated with. The UI MUST NOT + interpret the value of an LV2_PUI_Host_Handle in any way. +*/ +typedef void* LV2_PUI_Host_Handle; + +/** + Host-provided functions that the UI can use to control the plugin instance. + + A pointer to an object of this type is passed to the lv2ui_descriptor() + function. + + The host MUST provide non-NULL values for all the function pointers. +*/ +typedef struct _LV2_PUI_Host_Descriptor { + + /** + Send data to one of the plugin's input ports. + + The @c buffer parameter MUST point to a block of data @c buffer_size + bytes large. The contents of this buffer and what the host should do + with it depends on the value of the @c port_protocol parameter. + + The @c port_protocol parameter MUST be a numeric ID for a + pui:PortProtocol. Numeric IDs for PortProtocols are retrieved using the + port_protocol_id() function. + + The @c buffer is only valid during the time of this function call, so if + the host wants to keep it for later use it has to copy the contents to an + internal buffer. + + @param host_handle The @c host_handle that was passed to the UI's + instantiate() function. + @param port_index The index of the port that the data should be written + to, as returned by port_index(). + @param buffer_size The size of the data pointed to by @c buffer, in + bytes. + @param port_protocol The numeric ID of the Port Protocol to use, + as returned by port_protocol_id(). + */ + void (*write_port)(LV2_PUI_Host_Handle host_handle, + uint32_t port_index, + uint32_t buffer_size, + uint32_t port_protocol, + void const* buffer); + + /** + Return the numerical index for a port. + This index is used when writing data to ports using write_port() and whe + receiving data using port_event(). If @c port_symbol is not a valid port + symbol for @c plugin the host it MUST return + LV2_PUI_INVALID_PORT_INDEX. For performance reasons it may be a good idea + to cache port indices in the UI at instantiation time. + + @param host_handle The LV2_PUI_Host_Handle that was passed to the UI's + instantiate() function. + @param port_symbol The port's symbol, as defined in the RDF data for + the plugin. + */ + uint32_t (*port_index)(LV2_PUI_Host_Handle host_handle, + char const* port_symbol); + + /** + Subscribe to updates for a port. + This means that the host will call the UI's port_event() function when + the port value changes (as defined by the PortProtocol). + + Calling this function with the same @c port_index and @c port_protocol + as an already active subscription has no effect. + + @param host_handle The @c host_handle that was passed to the UI's + instantiate() function. + @param port_index The index of the port, as returned by port_index(). + @param port_protocol The numeric ID of the PortProtocol, as + returned by port_protocol_id(). + */ + void (*subscribe_to_port)(LV2_PUI_Host_Handle host_handle, + uint32_t port_index, + uint32_t port_protocol, + const LV2_Feature* const* features); + + /** + Unsubscribe from updates for a port. + This means that the host will cease calling calling port_event() when + the port value changes. + + Calling this function with a @c port_index and @c port_protocol that + does not refer to an active port subscription has no effect. + + @param host_handle The @c host_handle that was passed to the UI's + instantiate() function. + @param port_index The index of the port, as returned by port_index(). + @param port_protocol The numeric ID of the PortProtocol, as + returned by port_protocol_id(). + */ + void (*unsubscribe_from_port)(LV2_PUI_Host_Handle host_handle, + uint32_t port_index, + uint32_t port_protocol, + const LV2_Feature* const* features); + + +} LV2_PUI_Host_Descriptor; + +/** + This struct contains the implementation of an UI. A pointer to an + object of this type is returned by the lv2ui_descriptor() function. +*/ +typedef struct _LV2_PUI_Descriptor { + + /** + The URI for this UI (not for the plugin it controls). + */ + char const* URI; + + /** + Create a new UI object and return a handle to it. This function works + similarly to the instantiate() member in LV2_Descriptor. + + @param descriptor The descriptor for the UI to instantiate. + + @param plugin_uri The URI of the plugin that this UI will control. + + @param bundle_path The path to the bundle containing the RDF data that + references this shared object file, with trailing separator (e.g. '/'). + + @param host_descriptor A pointer to an object that contains function + pointers that the UI instance should use to control the plugin + instance. This pointer MUST be valid until cleanup() is called for this + UI instance. + + @param host_handle A handle that the host may use to reference internal + data. It MUST be passed as the first parameter to the function + pointers in @c host_descriptor, and MUST NOT be interpreted in any other + way by the UI. + + @param features A NULL-terminated array of LV2_Feature pointers. The + host must pass all feature URIs that it and the UI supports and any + additional data, just like in the LV2 plugin instantiate() + function. Note that UI features and plugin features are NOT necessarily + the same; @c features will probably not be the same array as the one the + plugin host passes to a plugin. + */ + LV2_PUI_Handle (*instantiate)( + struct _LV2_PUI_Descriptor const* descriptor, + char const* plugin_uri, + char const* bundle_path, + LV2_PUI_Host_Descriptor const* host_descriptor, + LV2_PUI_Host_Handle host_handle, + LV2_Feature const* const* features); + + /** + Return the widget pointer for the UI object. + This MUST return the same value during the entire lifetime of the UI + object. + */ + LV2_PUI_Widget (*get_widget)(LV2_PUI_Handle ui); + + /** + Destroy the UI object and the associated widget. + The host must not try to access the widget after calling this function. + */ + void (*cleanup)(LV2_PUI_Handle ui); + + /** + Notify the UI that something has happened to a subscribed port. + + This is called by the host when something happens at a plugin port that + has been subscribed to using + LV2_PUI_Host_Descriptor::add_port_subscription(). + + The @c buffer is only valid during the time of this function call, so if + the UI wants to keep it for later use it has to copy the contents to an + internal buffer. + + @param ui A handle for the UI object. + @param port_index The index of the port that has changed, as returned by + LV2_PUI_Host_Descriptor::port_index(). + @param buffer_size The size of the data buffer in bytes. + @param port_protocol The format of the data buffer, as returned by + LV2_PUI_Host_Descriptor::port_protocol_id(). + @param buffer A pointer to the data buffer. + */ + void (*port_event)(LV2_PUI_Handle ui, + uint32_t port_index, + uint32_t buffer_size, + uint32_t port_protocol, + void const* buffer); + + /** + Return a data structure associated with an extension URI. + + This facility can be used by extensions to extend the LV2_PUI_Descriptor + API. This function adheres to the same rules as + LV2_Descriptor::extension_data, except it applies to UIs rather than + plugins. + */ + void const* (*extension_data)(char const* uri); + +} LV2_PUI_Descriptor; + +typedef void* LV2_PUI_Lib_Data; + +/** + Descriptor for a plugin UI library. + + Each plugin UI shared library has exactly one of these objects, accessed + via the lv2_pui_lib_descriptor() function in that library. +*/ +typedef struct { + /** + Opaque library data which must be passed as the first parameter to + all the methods of this struct. + */ + LV2_PUI_Lib_Data lib_data; + + void (*cleanup)(LV2_PUI_Lib_Data lib_data); + + /** + Prototype for UI accessor function. + + This function follows the same rules as lv2_descriptor(), except it + applies to UIs rather than plugins. + */ + LV2_PUI_Descriptor const* (*pui_descriptor)(LV2_PUI_Lib_Data lib_data, + uint32_t index); + +} LV2_PUI_Lib_Descriptor; + +/** + Prototype for UI library accessor function. + + This is the entry point for a plugin UI library. Hosts load this symbol + from the library and call this function to obtain a library descriptor which + can be used to access all the UIs contained in this library. The returned + object must not be destroyed (with LV2_PUI_Lib_Descriptor::cleanup()) until + all UIs loaded from that library have been destroyed. +*/ +LV2_PUI_Lib_Descriptor const* lv2_pui_lib_descriptor( + const char* bundle_path, + LV2_Feature const* const* features); + +/** + Type of the lv2_pui_lib_descriptor() function in a UI library. +*/ +typedef LV2_PUI_Lib_Descriptor const* (*LV2_PUI_Lib_Descriptor_Func)( + const char* bundle_path, + LV2_Feature const* const* features); + +#ifdef __cplusplus +} +#endif + +#endif /* LV2_PUI_H */ diff --git a/lv2/lv2plug.in/ns/ext/pui/pui.ttl b/lv2/lv2plug.in/ns/ext/pui/pui.ttl new file mode 100644 index 0000000..d305769 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/pui/pui.ttl @@ -0,0 +1,284 @@ +# LV2 Plugin UI Extension +# Copyright (C) 2010-2011 Lars Luthman +# +# Based on lv2.ttl, which is +# Copyright (C) 2006-2008 Steve Harris, David Robillard +# +# This extension should be considered a replacement for the earlier +# in-process UI extension with the URI . +# Hosts and plugins that used that extension should use this one instead. +# The earlier in-process UI extension is not compatible with LV2 revision 3 +# and later and may break in subtle ways. +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR +# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +# OTHER DEALINGS IN THE SOFTWARE. + +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix pui: . +@prefix rdf: . +@prefix rdfs: . + + + a lv2:Specification ; + doap:license ; + doap:name "LV2 UI" ; + doap:shortdesc "Generic UI interface for LV2 plugins." ; + doap:release [ + doap:revision "0.1" ; + doap:created "2011-03-26" + ] ; + doap:maintainer [ + a foaf:Person ; + foaf:name "Lars Luthman" ; + foaf:mbox + ] ; + lv2:documentation """ +

This extension defines an interface that can be used to create UIs for +plugins. The UIs are code that reside in shared object files in an LV2 +bundle and are referenced in the RDF data using the triples:

+
+@prefix pui: <http://lv2plug.in/ns/ext/pui#> .
+
+<http://example.org/my-ui>
+    a             pui:Gtk2UI ;
+    lv2:appliesTo <http://example.org/my-plugin> ;
+    pui:binary    <my-ui.so> .
+
+

... where http://example.org/my-plugin is the URI of the plugin, +http://example.org/my-ui is the URI of the plugin UI and +my-ui.so is the relative URI to the shared object file. While it +is possible to have the plugin UI and the plugin in the same shared object file +it is probably a good idea to keep them separate so that hosts that don't want +UIs don't have to load the UI code.

+ +

A UI MUST specify its class in the RDF data and the class MUST be a proper +subclass of pui:UI, in this case pui:Gtk2UI. The class defines what type the +UI is, e.g. what graphics toolkit it uses. There are no UI classes defined in +this extension, those are specified separately (and anyone can define their +own).

+ +

It's entirely possible to have multiple UIs for the same plugin, or to have +the UI for a plugin in a different bundle from the actual plugin - this way +people other than the plugin author can write plugin UIs independently without +editing the original plugin bundle. It is also possible to have one UI that +works with several different plugins.

+ +

UIs should also be written in such a way that the host may load several +instances of an UI, or different UIs, and use them with the same plugin +instance.

+ +

Note that the process that loads the shared object file containing the UI +code and the process that loads the shared object file containing the actual +plugin implementation do not have to be the same. There are many valid reasons +for having the plugin and the UI in different processes, or even on different +machines. This means that you can not use singletons and +global variables and expect them to refer to the same objects in the UI and the +actual plugin. The function callback interface defined in the header pui.h is +all you can expect to work.

+""" . + +pui:UI + a rdfs:Class ; + rdfs:subClassOf lv2:Feature ; + rdfs:label "UI" ; + lv2:documentation """ +

The class which represents an LV2 plugin UI. +

+ +

To be used by a host a UI MUST have at least the following properties:

+
    +
  • rdf:type (with object a proper subclass of pui:UI)
  • +
  • doap:name (one without language tag)
  • +
  • lv2:binary (with a shared object file as object)
  • +
  • lv2:appliesTo (with a LV2 plugin as object)
  • +
+ +

The rdf:type of an UI is used by the host to decide whether it supports the +UI and how to handle the LV2_PUI_Widget object that is returned by the UIs +get_widget() function. For example, a type of pui:Gtk2UI might tell the +host that LV2_PUI_Widget is a pointer to an object of a type defined in the +Gtk+ library. No UI types are defined in this extension, that is intentionally +left for other extensions.

+ +

The doap:name property should be at most a few words in length using title +capitalization, e.g. "Flashy Mixer GUI". Use lv2:documentation for more +detailed descriptions.

+ +

UIs may have optional or required features, specified using lv2:optionalFeature +or lv2:requiredFeature. The same rules apply here as for plugins; a host MUST +pass the LV2_Feature objects for all features it supports to the UI's +instantiate() function, a host SHOULD NOT try to instantiate an UI if it +doesn't support all of its required features, and an UI MUST fail to +instantiate if the host doesn't pass all required features to instantiate(). +

+ +

For details about the C API used to load UIs, see the file pui.h. +

+""" . + +pui:PortProtocol + a rdfs:Class ; + rdfs:subClassOf lv2:Feature ; + rdfs:label "Port protocol" ; + lv2:documentation """ +

A PortProtocol defines a certain way of communicating port data between UI +and plugin. PortProtocols can be specified in additional extensions, and +those extensions MUST specify: +

+ +
    +
  1. Which plugin port types the buffer type is valid for
  2. +
  3. When the host should call port_event() in LV2_PUI_Descriptor
  4. +
  5. The format of the data in the buffer passed to port_event()
  6. +
  7. The format of the data in the buffer passed to write_port()
  8. +
  9. What happens when the UI calls write_port() in LV2_PUI_Host_Descriptor
  10. +
  11. What data (if any) should be passed in the LV2_Feature data pointer.
  12. +
+ +

For an example, see pui:floatControl or pui:floatPeakRMS. +

+ +

PortProtocol is a subclass of lv2:Feature, so UIs use lv2:optionalFeature and +lv2:requiredFeature to specify which PortProtocols they want to use. +

+""" . + +pui:floatControl + a pui:PortProtocol ; + rdfs:label "Floating point value" ; + lv2:documentation """ +

The rules (see pui:PortProtocol) for this port protocol are:

+
    +
  1. This PortProtocol is valid for ports with the type lv2:ControlPort.
  2. +
  3. The host SHOULD call port_event() as soon as possible when the port value + has changed, but the plugin MUST NOT depend on a call for every change or + the timing of the calls. However, the host MUST do the calls in the same + order that the value changes occur in.
  4. +
  5. The format of the data in the buffer passed to port_event() is a single + float, and the buffer size is sizeof(float).
  6. +
  7. Same as 3.
  8. +
  9. The host SHOULD change the port value as soon as possible when write_port() + is called, but the UI MUST NOT depend on a change for every call or the + timing of the changes. However, the host MUST do the changes in the same + order that the function calls occur in.
  10. +
  11. The data pointer in the LV2_Feature object for this feature should be + NULL.
  12. +
+""" . + +pui:floatPeakRMS + a pui:PortProtocol ; + rdfs:label "Peak and RMS for a period of audio data" ; + lv2:documentation """ +

This port protocol defines a way for the host to send continuous peak +and RMS measurements of the audio signal at a certain port to the UI. The +intended use is visualisation, e.g. an animated meter widget that shows +the level of the audio input or output.

+ +

A contiguous sequence of audio samples for which a single peak value +and a single RMS value have been computed is called a measurement +period.

+ +

The rules (see pui:PortProtocol) for this port protocol are:

+
    +
  1. This PortProtocol is valid for ports with the type lv2:AudioPort.
  2. +
  3. The host SHOULD call port_event() at regular intervals. The measurement + periods used for calls to port_event() for the same port SHOULD be + contiguous (i.e. the measurement period for one call should begin right + after the end of the measurement period for the previous call ends) unless + the UI has removed and re-added the port subscription between those calls. + However, UIs MUST NOT depend on either the regularity of the calls or the + contiguity of the measurement periods; hosts may change the call rate + or skip calls for performance or other reasons. Measurement periods for + different calls to port_event() for the same port MUST NOT overlap.
  4. +
  5. The format of the data in the buffer passed to port_event() is a single + LV2_PUI_Peak_RMS_Data object, and the buffer size is + sizeof(LV2_PUI_Peak_RMS_Data).
  6. +
  7. The UI MUST NOT call write_port() with the ID for this port protocol as + the port_protocol parameter.
  8. +
  9. The host MUST ignore any write_port() calls with the ID for this port + protocol as the port_protocol parameter.
  10. +
  11. The data pointer in the LV2_Feature object for this feature should be + NULL.
  12. +
+""" . + +pui:events + a pui:PortProtocol ; + rdfs:label "Event buffer" ; + lv2:documentation """ +
    +
  1. This PortProtocol is valid for ports with the type ev:EventPort.
  2. +
  3. The host MUST call port_event() whenever there is an event in an input port + prior to the plugin instance's run() function is called, and whenever there + is an event in an output port after run() has been called. The UI MUST NOT + depend on the timing of the calls. However, the host MUST do the calls in + the same order that the events occur in. The host is allowed and encouraged + to bundle multiple events into a single port_event() call if it improves + performance.
  4. +
  5. The data buffer passed to port_event() is an LV2_Event_Buffer, as specified + in the Event extension. The stamp_type MUST be ignored. The frames and + subframes fields of every event in the buffer MUST be ignored. Events with + type 0 (reference counted events) MUST be ignored.
  6. +
  7. The data buffer passed to write_event() is an LV2_Event_Buffer, as + specified in the Event extension. The stamp_type MUST be ignored. The + frames and subframes fields of every event in the buffer MUST be + ignored. The host MUST NOT pass events with type 0 (references) unless the + UI supports the feature "http://lv2plug.in/ns/ext/event".
  8. +
  9. The host MUST pass all the events in the buffer to the plugin instance's + event port in the same order, but the plugin and the UI MUST NOT depend on + the timing of the events, or on whether they are all sent to the plugin in + the same run() call or distributed over multiple calls.
  10. +
  11. The data pointer in the LV2_Feature object for this feature should be + NULL.
  12. +
+""" . + +pui:Gtk2UI + a rdfs:Class ; + rdfs:subClassOf pui:UI ; + rdfs:label "Gtk+ UI" ; + lv2:documentation """ +

The class which represents a Gtk+ UI. For a successfully created instance of +an UI of this class, the get_widget() function MUST return a pointer to a valid +GtkWidget object compatible with Gtk+ version 2.0. The host MUST ensure that +the Gtk+ library has been initialised and that the Glib main loop is running +before an UI of this type is instantiated.

+ +

Unless otherwise specified by extensions, all function pointers in +LV2_PUI_Descriptor may only be called from the thread that runs the Glib main +loop.

+""" . + +pui:noHostResize + a lv2:Feature ; + rdfs:label "No host resize" ; + lv2:documentation """ +

This Feature should only be used with UIs.

+ +

When this Feature is active the host SHOULD NOT resize the UI widget to any +other size than its natural size, which the host should be able to determine +via the API of whatever toolkit the UI is implemented in. However, the UI MUST +NOT break if the widget is resized to another size. This Feature can be used +for example when the widget uses a fixed-size pixmap interface.

+ +

The data pointer in the LV2_Feature object for this Feature should be set to +NULL.

+""" . diff --git a/lv2/lv2plug.in/ns/ext/pui/waf b/lv2/lv2plug.in/ns/ext/pui/waf new file mode 120000 index 0000000..5235032 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/pui/waf @@ -0,0 +1 @@ +../../../../../waf \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/pui/wscript b/lv2/lv2plug.in/ns/ext/pui/wscript new file mode 120000 index 0000000..7e2c01b --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/pui/wscript @@ -0,0 +1 @@ +../../../../../ext.wscript \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/reference/ext.pc.in b/lv2/lv2plug.in/ns/ext/reference/ext.pc.in new file mode 120000 index 0000000..03dd044 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/reference/ext.pc.in @@ -0,0 +1 @@ +../../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/reference/manifest.ttl b/lv2/lv2plug.in/ns/ext/reference/manifest.ttl new file mode 100644 index 0000000..e25c54d --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/reference/manifest.ttl @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 0 ; + lv2:microVersion 1 ; + rdfs:seeAlso . + diff --git a/lv2/lv2plug.in/ns/ext/reference/reference.h b/lv2/lv2plug.in/ns/ext/reference/reference.h new file mode 100644 index 0000000..26ef4c3 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/reference/reference.h @@ -0,0 +1,161 @@ +/* + Copyright 2008-2011 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. +*/ + +/** + @file reference.h C header for the LV2 Reference extension + . +*/ + +#ifndef LV2_REFERENCE_H +#define LV2_REFERENCE_H + +#define LV2_REFERENCE_URI "http://lv2plug.in/ns/ext/reference" +#define LV2_REFERENCE_BLOB_SUPPORT_URI LV2_REFERENCE_URI "#blobSupport" + +#include +#include + +#include "lv2/lv2plug.in/ns/ext/atom/atom.h" + +/** + Dynamically Allocated Data. + + This is an opaque piece of data of any type, dynamically allocated in memory. + Unlike an "atom", a "blob" is not necessarily POD. Non-POD data is referred + to by a "reference (a special case of atom with type 0). + + This is a pointer to host data which is opaque to the plugin. Plugins MUST + NOT interpret this data in any way, except via host-provided functions in + LV2_Blob_Support. +*/ +typedef void* LV2_Blob; + +typedef LV2_Atom LV2_Reference; + +typedef void* LV2_Blob_Support_Data; + +typedef void (*LV2_Blob_Destroy)(LV2_Blob* blob); + +/** + The data field of the LV2_Feature for reference:blobSupport. + + A host which supports blobs must pass an LV2_Feature to the plugin's + instantiate method with 'URI' = "http://lv2plug.in/ns/ext/reference#blobSupport" + and 'data' pointing to an instance of this struct. All fields of this struct + MUST be set to non-NULL values by the host, except possibly 'data'. +*/ +typedef struct { + + /** + Pointer to opaque host data. + + The plugin MUST pass this to any call to functions in this struct. + Otherwise, the plugin MUST NOT interpret this value in any way. + */ + LV2_Blob_Support_Data data; + + /** + The size of a reference, in bytes. + + This value is provided by the host so plugins can allocate large enough + chunks of memory to store references. Note a reference is an LV2_Reference + with type reference:Reference, hence ref_size is a uint16, like + LV2_Reference.size. + */ + uint16_t ref_size; + + /** + Return the Blob referred to by @a ref. + + The returned value MUST NOT be used in any way other than by calling + methods defined in LV2_Blob_Support (e.g. it MUST NOT be directly + accessed, copied, or destroyed). The actual payload of the blob can + be accessed with LV2_Blob_Support.blob_get. + */ + LV2_Blob (*ref_get)(LV2_Blob_Support_Data data, + LV2_Reference* ref); + + /** + Copy a reference. + This copies a reference but not the blob it refers to, + i.e. after this call @a dst and @a src refer to the same LV2_Blob. + */ + void (*ref_copy)(LV2_Blob_Support_Data data, + LV2_Reference* dst, + LV2_Reference* src); + + /** + Reset (release) a reference. + After this call, @a ref is invalid. Implementations must be sure to + call this function when necessary, or memory leaks will result. The + specific times this is necessary MUST be defined by any extensions that + define a mechanism for transporting references. The standard semantics are: +
  • Whenever passed a Reference (e.g. via a Port) and run, the + plugin owns that reference.
  • +
  • The plugin owns any reference it creates (e.g. by using blob_new or + ref_copy).
  • +
  • For any reference it owns, the plugin MUST either: +
    • Copy the reference and store it (to be used in future runs and + released later).
    • +
    • Copy the reference to an output port exactly once.
    • +
    • Release it with ref_reset.
  • +
+ */ + void (*ref_reset)(LV2_Blob_Support_Data data, + LV2_Reference* ref); + + /** + Initialize a reference to point to a newly allocated Blob. + + @param data Must be the data member of this struct. + @param ref Pointer to an area of memory at least as large as + the ref_size field of this struct. On return, this will + be the unique reference to the new blob, which is owned by the + caller. Assumed to be uninitialised, i.e. the caller MUST NOT + pass a valid reference since this could cause a memory leak. + @param destroy Function to destroy this blob. This function + MUST clean up any resources contained in the blob, but MUST NOT + attempt to free the memory pointed to by its LV2_Blob* parameter + (since this is allocated by the host). + @param type ID of type of blob to allocate. + @param size Size of blob to allocate in bytes. + */ + void (*blob_new)(LV2_Blob_Support_Data data, + LV2_Reference* ref, + LV2_Blob_Destroy destroy, + uint32_t type, + size_t size); + + /** + Get blob's type as an ID. + + The return value may be any type URI, mapped to an integer with the + URI Map extension with context = NULL. + */ + uint32_t (*blob_type)(LV2_Blob blob); + + /** + Get blob's body. + + Returns a pointer to the start of the blob data. The format of this + data is defined by the return value of the type method. It MUST NOT + be used in any way by code which does not understand that type. + */ + void* (*blob_data)(LV2_Blob blob); + +} LV2_Blob_Support; + +#endif /* LV2_REFERENCE_H */ diff --git a/lv2/lv2plug.in/ns/ext/reference/reference.ttl b/lv2/lv2plug.in/ns/ext/reference/reference.ttl new file mode 100644 index 0000000..bbf56d4 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/reference/reference.ttl @@ -0,0 +1,82 @@ +# LV2 Reference Extension +# Copyright 2007-2011 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 atom: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdf: . +@prefix rdfs: . +@prefix reference: . + + + a lv2:Specification ; + doap:name "LV2 Reference" ; + doap:shortdesc "A reference data type for using non-POD data." ; + doap:release [ + doap:revision "0.1" ; + doap:created "2011-07-22" + ] ; + doap:maintainer [ + a foaf:Person ; + foaf:name "David Robillard" ; + foaf:homepage ; + rdfs:seeAlso + ] ; + lv2:documentation """ +

This extension defines a mechanism for working with generic/opaque +dynamically allocated memory, called a "Blob", which is +(unlike an Atom) not necessarily POD. Blobs are accessed via a +reference:Reference, which is a special case of Atom that always has type = +0, is not POD, and can only be copied using host provided functions. +This allows plugins and hosts to work with data of any type at all.

+""" . + +reference:Reference a rdfs:Class ; + rdfs:subClassOf atom:Atom ; + rdfs:label "Reference" ; + lv2:documentation """ +

Reference to an lv2:Blob. The actual contents of a Reference are opaque and +host specific, and must not be copied, serialized, or otherwise interpreted by +a plugin, except via functions provided by the host in LV2_Blob_Support.

+ +

A Reference is a special case of Atom with type = 0. +"Null" is the unique Atom with type = 0 and +size = 0.

+""" . + +reference:blobSupport a lv2:Feature ; + rdfs:label "Blob support" ; + lv2:documentation """ +

Support for dynamically allocated blobs. If a host supports this feature, +it MUST pass a LV2_Feature with URI +http://lv2plug.in/ns/ext/atom#blobSupport and data pointing to a +LV2_Blob_Support.

+""" . + +reference:Blob a rdfs:Class ; + rdfs:label "Blob" ; + lv2:documentation """ +

Base class for all dynamically allocated blobs. An LV2_Blob is an opaque +pointer to host data. The type and data of a blob can be accessed via +host-provided functions in LV2_Blob_Support. The type of a blob can be any URI +that describes a data format. Blobs are always allocated by the host, and +unlike atoms are not necessarily POD.

+ +

Blob data MUST NOT be used in any way by an implementation that does not +understand that blob type (unlike Atoms, meaningful type-oblivious use +of a Blob is impossible).

+""" . diff --git a/lv2/lv2plug.in/ns/ext/reference/waf b/lv2/lv2plug.in/ns/ext/reference/waf new file mode 120000 index 0000000..5235032 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/reference/waf @@ -0,0 +1 @@ +../../../../../waf \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/reference/wscript b/lv2/lv2plug.in/ns/ext/reference/wscript new file mode 120000 index 0000000..7e2c01b --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/reference/wscript @@ -0,0 +1 @@ +../../../../../ext.wscript \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/resize-port/ext.pc.in b/lv2/lv2plug.in/ns/ext/resize-port/ext.pc.in new file mode 120000 index 0000000..03dd044 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/resize-port/ext.pc.in @@ -0,0 +1 @@ +../../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/resize-port/manifest.ttl b/lv2/lv2plug.in/ns/ext/resize-port/manifest.ttl new file mode 100644 index 0000000..37d1b42 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/resize-port/manifest.ttl @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 0 ; + lv2:microVersion 1 ; + rdfs:seeAlso . + diff --git a/lv2/lv2plug.in/ns/ext/resize-port/resize-port.h b/lv2/lv2plug.in/ns/ext/resize-port/resize-port.h new file mode 100644 index 0000000..7f014a3 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/resize-port/resize-port.h @@ -0,0 +1,57 @@ +/* LV2 Resize Port Extension + * Copyright (C) 2007-2009 David Robillard + * + * This header is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This header is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef LV2_RESIZE_PORT_H +#define LV2_RESIZE_PORT_H + +#include +#include +#include + +#define LV2_RESIZE_PORT_URI "http://lv2plug.in/ns/ext/resize-port" + +typedef void* LV2_Resize_Port_Feature_Data; + +typedef struct { + + LV2_Resize_Port_Feature_Data data; + + /** Resize a port buffer to at least @a size bytes. + * + * This function MAY return false, in which case the port buffer was + * not resized and the port is still connected to the same location. + * Plugins MUST gracefully handle this situation. + * + * This function MUST NOT be called from any context other than + * the context associated with the port of the given index. + * + * The host MUST preserve the contents of the port buffer when + * resizing. + * + * Plugins MAY resize a port many times in a single run callback. + * Hosts SHOULD make this an inexpensive as possible (i.e. plugins + * can liberally use this function in a similar way to realloc). + */ + bool (*resize_port)(LV2_Resize_Port_Feature_Data data, + uint32_t index, + size_t size); + +} LV2_Resize_Port_Feature; + +#endif /* LV2_RESIZE_PORT_H */ + diff --git a/lv2/lv2plug.in/ns/ext/resize-port/resize-port.ttl b/lv2/lv2plug.in/ns/ext/resize-port/resize-port.ttl new file mode 100644 index 0000000..a458431 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/resize-port/resize-port.ttl @@ -0,0 +1,80 @@ +# LV2 Contexts Extension +# +# Allows for an LV2 plugin to have several independent contexts, each with its +# own run callback and associated ports. +# +# Copyright (C) 2007 David Robillard +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR +# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +# OTHER DEALINGS IN THE SOFTWARE. + +@prefix rsz: . +@prefix lv2: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . +@prefix doap: . +@prefix foaf: . + + + a lv2:Specification ; + a lv2:Feature ; + doap:name "LV2 Resize Port Extension" ; + doap:shortdesc "Dynamically sized LV2 port buffers." ; + lv2:documentation """ +

An extension that allows LV2 plugins to request a resize of an output +port.

+ +

Any host which supports this extension must pass an LV2_Feature to the +plugin's instantiate method with URI http://lv2plug.in/ns/ext/resize-port and a +pointer to a LV2_Resize_Port_Feature structure. This structure provides a +resize_port function which plugins may use to resize output port buffers as +necessary.

+ +

This extension also defines several predicates useful for describing the +amount of space required for a particular port buffer.

+""" . + +rsz:asLargeAs a rdf:Property ; + rdfs:domain lv2:Port ; + rdfs:range lv2:Symbol ; + rdfs:label "as large as" ; + rdfs:comment """ +Indicates that a port requires at least as much buffer space as the port +with the given symbol on the same plugin instance. This may be used for +any ports, but is generally most useful to indicate an output port must +be at least as large as some input port (because it will copy from it). +If a port is asLargeAs several ports, it is asLargeAs the largest such port +(not the sum of those ports' sizes). + +The host guarantees that whenever an ObjectPort's run method is called, +any output O that is obj:asLargeAs an input I is connected to a buffer large +enough to copy I, or NULL if the port is lv2:connectionOptional. +""" . + +rsz:minimumSize a rdf:Property ; + rdfs:domain lv2:Port ; + rdfs:range lv2:Symbol ; + rdfs:label "minimum size" ; + rdfs:comment """ +Indicates that a port requires a buffer at least this large, in bytes. +Any host that supports the resize-port feature MUST connect any port with a +minimumSize specified to a buffer at least as large as the value given for +this property. Any host, especially those that do NOT support dynamic port +resizing, SHOULD do so or reduced functionality may result. +""" . diff --git a/lv2/lv2plug.in/ns/ext/resize-port/waf b/lv2/lv2plug.in/ns/ext/resize-port/waf new file mode 120000 index 0000000..5235032 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/resize-port/waf @@ -0,0 +1 @@ +../../../../../waf \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/resize-port/wscript b/lv2/lv2plug.in/ns/ext/resize-port/wscript new file mode 120000 index 0000000..7e2c01b --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/resize-port/wscript @@ -0,0 +1 @@ +../../../../../ext.wscript \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/state/ext.pc.in b/lv2/lv2plug.in/ns/ext/state/ext.pc.in new file mode 120000 index 0000000..03dd044 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/state/ext.pc.in @@ -0,0 +1 @@ +../../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/state/manifest.ttl b/lv2/lv2plug.in/ns/ext/state/manifest.ttl new file mode 100644 index 0000000..bff9ad5 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/state/manifest.ttl @@ -0,0 +1,8 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 0 ; + lv2:microVersion 5 ; + rdfs:seeAlso . diff --git a/lv2/lv2plug.in/ns/ext/state/state.h b/lv2/lv2plug.in/ns/ext/state/state.h new file mode 100644 index 0000000..b450b93 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/state/state.h @@ -0,0 +1,359 @@ +/* + Copyright 2010-2012 David Robillard + Copyright 2010 Leonard Ritter + + 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 + C API for the LV2 State extension . +*/ + +#ifndef LV2_STATE_H +#define LV2_STATE_H + +#include +#include + +#include "lv2/lv2plug.in/ns/lv2core/lv2.h" + +#ifdef __cplusplus +extern "C" { +#else +# include +#endif + +#define LV2_STATE_URI "http://lv2plug.in/ns/ext/state" + +#define LV2_STATE_INTERFACE_URI LV2_STATE_URI "#Interface" +#define LV2_STATE_PATH_URI LV2_STATE_URI "#Path" +#define LV2_STATE_MAP_PATH_URI LV2_STATE_URI "#mapPath" +#define LV2_STATE_MAKE_PATH_URI LV2_STATE_URI "#makePath" + +typedef void* LV2_State_Handle; +typedef void* LV2_State_Map_Path_Handle; +typedef void* LV2_State_Make_Path_Handle; + +/** + Flags describing value characteristics. + + These flags are used along with the value's type URI to determine how to + (de-)serialise the value data, or whether it is even possible to do so. +*/ +typedef enum { + + /** + Plain Old Data. + + Values with this flag contain no references to non-persistent or + non-global resources (e.g. pointers, handles, local paths, etc.). It is + safe to copy POD values with a simple memcpy and store them for use at + any time in the future on a machine with a compatible architecture + (e.g. the same endianness and alignment). + + Implementations MUST NOT attempt to copy or serialise a non-POD value if + they do not understand its type (and thus know how to correctly do so). + */ + LV2_STATE_IS_POD = 1, + + /** + Portable (architecture independent) data. + + Values with this flag are in a format that is usable on any + architecture, i.e. if the value is saved on one machine it can safely be + restored on another machine regardless of endianness, alignment, etc. + */ + LV2_STATE_IS_PORTABLE = 1 << 1, + + /** + Native data. + + This flag is used by the host to indicate that the saved data is only + going to be used locally in the currently running process (e.g. for + instance duplication or snapshots), so the plugin should use the most + efficient representation possible and not worry about serialisation + and portability. + */ + LV2_STATE_IS_NATIVE = 1 << 2 + +} LV2_State_Flags; + +/** + A host-provided function to store a property. + @param handle Must be the handle passed to LV2_State_Interface.save(). + @param key The key (predicate) to store @c value under (URI mapped integer). + @param value Pointer to the value (object) to be stored. + @param size The size of the data at @c value in bytes. + @param type The type of @c value (URI). + @param flags LV2_State_Flags for @c value. + @return 0 on success, otherwise a non-zero error code. + + The host passes a callback of this type to LV2_State_Interface.save(). This + callback is called repeatedly by the plugin within + LV2_State_Interface.save() to store all the statements that describe its + current state. + + DO NOT INVENT NONSENSE URI SCHEMES FOR THE KEY. Best is to use keys from + existing vocabularies. If nothing appropriate is available, use http URIs + that point to somewhere you can host documents, so you can make + documentation resolvable. If this is not possible, invent a URN scheme, + e.g. urn:myproj:whatever. The plugin MUST NOT pass an invalid URI key. + + The host MAY fail to store a property for whatever reason, but SHOULD + store any property that is LV2_STATE_IS_POD and LV2_STATE_IS_PORTABLE. + Implementations SHOULD use the types from the LV2 Atom extension + (http://lv2plug.in/ns/ext/atom) wherever possible. + + Note that @c size MUST be > 0, and @c value MUST point to a valid region of + memory @c size bytes long (this is required to make restore unambiguous). + + The plugin MUST NOT attempt to use this function outside of the + LV2_State_Interface.restore() context. +*/ +typedef int (*LV2_State_Store_Function)(LV2_State_Handle handle, + uint32_t key, + const void* value, + size_t size, + uint32_t type, + uint32_t flags); + +/** + A host-provided function to retrieve a property. + @param handle Must be the handle passed to + LV2_State_Interface.restore(). + @param key The key (predicate) of the property to retrieve (URI). + @param size (Output) If non-NULL, set to the size of the restored value. + @param type (Output) If non-NULL, set to the type of the restored value. + @param flags (Output) If non-NULL, set to the LV2_State_Flags for + the returned value. + @return A pointer to the restored value (object), or NULL if no value + has been stored under @c key. + + A callback of this type is passed by the host to + LV2_State_Interface.restore(). This callback is called repeatedly by the + plugin within LV2_State_Interface.restore() to retrieve any properties it + requires to restore its state. + + The returned value MUST remain valid until LV2_State_Interface.restore() + returns. + + The plugin MUST NOT attempt to use this function, or any value returned from + it, outside of the LV2_State_Interface.restore() context. Returned values + MAY be copied for later use if necessary, assuming the plugin knows how to + do so correctly (e.g. the value is POD, or the plugin understands the type). +*/ +typedef const void* (*LV2_State_Retrieve_Function)(LV2_State_Handle handle, + uint32_t key, + size_t* size, + uint32_t* type, + uint32_t* flags); + +/** + State Extension Data. + + When the plugin's extension_data is called with argument LV2_STATE_URI, + the plugin MUST return an LV2_State structure, which remains valid for the + lifetime of the plugin. + + The host can use the contained function pointers to save and restore the + state of a plugin instance at any time (provided the threading restrictions + for the given function are met). + + The typical use case is to save the plugin's state when a project is saved, + and to restore the state when a project has been loaded. Other uses are + possible (e.g. cloning plugin instances or taking a snapshot of plugin + state). + + Stored data is only guaranteed to be compatible between instances of plugins + with the same URI (i.e. if a change to a plugin would cause a fatal error + when restoring state saved by a previous version of that plugin, the plugin + URI MUST change just as it must when ports change incompatibly). Plugin + authors should consider this possibility, and always store sensible data + with meaningful types to avoid such compatibility issues in the future. +*/ +typedef struct _LV2_State_Interface { + + /** + Save plugin state using a host-provided @c store callback. + + @param instance The instance handle of the plugin. + @param store The host-provided store callback. + @param handle An opaque pointer to host data, e.g. the map or + file where the values are to be stored. If @c store is called, this MUST + be passed as its handle parameter. + @param flags Flags describing desires properties of this save. The + plugin SHOULD use these values to determine the most appropriate and/or + efficient serialisation, but is not required to do so. + @param features Extensible parameter for passing any additional + features to be used for this save. + + The plugin is expected to store everything necessary to completely + restore its state later (possibly much later, in a different process, on + a completely different machine, etc.) + + The @c handle pointer and @c store function MUST NOT be used + beyond the scope of save(). + + This function has its own special threading class: it may not be called + concurrently with any "Instantiation" function, but it may be called + concurrently with functions in any other class, unless the definition of + that class prohibits it (e.g. it may not be called concurrently with a + "Discovery" function, but it may be called concurrently with an "Audio" + function. The plugin is responsible for any locking or lock-free + techniques necessary to make this possible. + + Note that in the simple case where state is only modified by restore(), + there are no synchronization issues since save() is never called + concurrently with restore() (though run() may read it during a save). + + Plugins that dynamically modify state while running, however, must take + care to do so in such a way that a concurrent call to save() will save a + consistent representation of plugin state for a single instant in time. + */ + void (*save)(LV2_Handle instance, + LV2_State_Store_Function store, + LV2_State_Handle handle, + uint32_t flags, + const LV2_Feature *const * features); + + /** + Restore plugin state using a host-provided @c retrieve callback. + + @param instance The instance handle of the plugin. + @param retrieve The host-provided retrieve callback. + @param handle An opaque pointer to host data, e.g. the map or + file from which the values are to be restored. If @c retrieve is + called, this MUST be passed as its handle parameter. + @param flags Currently unused. + @param features Extensible parameter for passing any additional + features to be used for this restore. + + The plugin MAY assume a restored value was set by a previous call to + LV2_State_Interface.save() by a plugin with the same URI. + + The plugin MUST gracefully fall back to a default value when a value can + not be retrieved. This allows the host to reset the plugin state with an + empty map. + + The @c handle pointer and @c store function MUST NOT be used + beyond the scope of restore(). + + This function is in the "Instantiation" threading class as defined by + LV2. This means it MUST NOT be called concurrently with any other + function on the same plugin instance. + */ + void (*restore)(LV2_Handle instance, + LV2_State_Retrieve_Function retrieve, + LV2_State_Handle handle, + uint32_t flags, + const LV2_Feature *const * features); + +} LV2_State_Interface; + +/** + Feature data for state:mapPath (LV2_STATE_MAP_PATH_URI). +*/ +typedef struct { + + /** + Opaque host data. + */ + LV2_State_Map_Path_Handle handle; + + /** + Map an absolute path to an abstract path for use in plugin state. + @param handle MUST be the @a handle member of this struct. + @param absolute_path The absolute path of a file. + @return An abstract path suitable for use in plugin state. + + The plugin MUST use this function to map any paths that will be stored + in files in plugin state. The returned value is an abstract path which + MAY not be an actual file system path; @ref absolute_path MUST be used + to map it to an actual path in order to use the file. + + Hosts MAY map paths in any way (e.g. by creating symbolic links within + the plugin's state directory or storing a list of referenced files + elsewhere). Plugins MUST NOT make any assumptions about abstract paths + except that they can be mapped back to an absolute path using @ref + absolute_path. + + This function may only be called within the context of + LV2_State_Interface.save() or LV2_State_Interface.restore(). The caller + is responsible for freeing the returned value. + */ + char* (*abstract_path)(LV2_State_Map_Path_Handle handle, + const char* absolute_path); + + /** + Map an abstract path from plugin state to an absolute path. + @param handle MUST be the @a handle member of this struct. + @param abstract_path An abstract path (e.g. a path from plugin state). + @return An absolute file system path. + + Since abstract paths are not necessarily actual file paths (or at least + not necessarily absolute paths), this function MUST be used in order to + actually open or otherwise use the file referred to by an abstract path. + + This function may only be called within the context of + LV2_State_Interface.save() or LV2_State_Interface.restore(). The caller + is responsible for freeing the returned value. + */ + char* (*absolute_path)(LV2_State_Map_Path_Handle handle, + const char* abstract_path); + +} LV2_State_Map_Path; + +/** + Feature data for state:makePath (@ref LV2_STATE_MAKE_PATH_URI). +*/ +typedef struct { + + /** + Opaque host data. + */ + LV2_State_Make_Path_Handle handle; + + /** + Return a path the plugin may use to create a new file. + @param handle MUST be the @a handle member of this struct. + @param path The path of the new file relative to a namespace unique + to this plugin instance. + @return The absolute path to use for the new file. + + This function can be used by plugins to create files and directories, + either at state saving time (if this feature is passed to + LV2_State_Interface.save()) or any time (if this feature is passed to + LV2_Descriptor.instantiate()). + + The host must do whatever is necessary for the plugin to be able to + create a file at the returned path (e.g. using fopen), including + creating any leading directories. + + If this function is passed to LV2_Descriptor.instantiate(), it may be + called from any non-realtime context. If it is passed to + LV2_State_Interface.save(), it may only be called within the dynamic + scope of that function call. + + The caller is responsible for freeing the returned value with free(). + */ + char* (*path)(LV2_State_Make_Path_Handle handle, + const char* path); + +} LV2_State_Make_Path; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV2_STATE_H */ diff --git a/lv2/lv2plug.in/ns/ext/state/state.ttl b/lv2/lv2plug.in/ns/ext/state/state.ttl new file mode 100644 index 0000000..6c0656a --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/state/state.ttl @@ -0,0 +1,359 @@ +# LV2 State Extension +# Copyright 2010-2012 David Robillard +# Copyright 2010 Leonard Ritter +# +# 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 dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdf: . +@prefix rdfs: . +@prefix state: . + + + a foaf:Person ; + foaf:name "David Robillard" ; + foaf:homepage ; + foaf:mbox ; + rdfs:seeAlso . + + + a lv2:Specification ; + doap:name "LV2 State" ; + doap:shortdesc "An interface for LV2 plugins to save and restore state." ; + doap:license ; + doap:release [ + doap:revision "0.5" ; + doap:created "2012-01-29" ; + dcs:blame + ] ; + doap:developer [ + a foaf:Person ; + foaf:name "Leonard Ritter" ; + foaf:homepage + ] ; + doap:maintainer [ + a foaf:Person ; + foaf:name "David Robillard" ; + foaf:homepage ; + rdfs:seeAlso + ] ; + lv2:documentation """ +

This extension provides a simple mechanism for plugins to save and restore +state across instances, allowing hosts to save and restore a plugin instance's +state at any time. The goal is for an instance's state to be +completely described by port values (as with all LV2 plugins) and a +dictionary.

+ +

The state described by this extension is conceptually a simple +key:value dictionary, where keys are URIDs (URIs mapped to integers) and values +are type-tagged blobs of any type. A single key:value pair is called a +property. To implement state, the plugin provides a state:Interface to +the host. To save or restore, the host calls LV2_State_Interface::save() or +LV2_State_Interface::restore(), passing a callback to be used for handling a +single property. The host is free to implement property storage and retrieval +in any way.

+ +

This state model is simple yet has many benefits:

+
    +
  • URID keys provide both fast performance and RDF compatibility.
  • +
  • Fully extensible, no limitations on keys or value types.
  • +
  • Easy to serialise in many formats (e.g. any RDF syntax, plain + text, JSON, XML, key:value databases, SQL, s-expressions, etc.).
  • +
  • Elegantly described in Turtle, which is useful for describing presets + or default state in LV2 data files (the predicate state:state is provided + for this purpose).
  • +
  • Does not impose any file formats, data structures, or file system + requirements.
  • +
  • Suitable for portable persistent state as well as fast in-memory + snapshots.
  • +
  • Easily stored in a typical map or dictionary data + structure.
  • +
  • Keys may be defined by extensions and used by several plugins, + making state meaningful enabling dynamic state control.
  • +
+ +

Implementations or further extensions which work with plugin state +(including dynamic plugin control) SHOULD work entirely within this model. +That is, do not complicate the state model. All +information required to express an instance's state at any given time can, and +should, be expressed within this model.

+ +

Plugin Code Example

+ +
+#define NS_EG   "http://example.org/"
+#define NS_ATOM "http://lv2plug.in/ns/ext/atom#"
+
+LV2_Handle my_instantiate(...)
+{
+    MyPlugin* plugin = ...;
+    plugin->uris.atom_String = map_uri(NS_ATOM "String");
+    plugin->uris.eg_greeting = map_uri(NS_EG "greeting");
+    plugin->state.greeting   = strdup("Hello");
+    return plugin;
+}
+
+void my_save(LV2_Handle                 instance,
+             LV2_State_Store_Function   store,
+             void*                      handle,
+             uint32_t                   flags,
+             const LV2_Feature *const * features)
+{
+    MyPlugin*   plugin   = (MyPlugin*)instance;
+    const char* greeting = plugin->state.greeting;
+
+    store(handle,
+          plugin->uris.eg_greeting,
+          greeting,
+          strlen(greeting) + 1,
+          plugin->uris.atom_String,
+          LV2_STATE_IS_POD | LV2_STATE_IS_PORTABLE);
+}
+
+void my_restore(LV2_Handle                  instance,
+                LV2_State_Retrieve_Function retrieve,
+                void*                       handle,
+                uint32_t                    flags,
+                const LV2_Feature *const *  features)
+{
+    MyPlugin* plugin = (MyPlugin*)instance;
+
+    size_t      size;
+    uint32_t    type;
+    uint32_t    flags;
+    const char* greeting = retrieve(
+        handle, plugin->uris.eg_greeting, &size, &type, &flags);
+
+    if (greeting) {
+        free(plugin->state->greeting);
+        plugin->state->greeting = strdup(greeting);
+    } else {
+        plugin->state->greeting = strdup("Hello");
+    }
+}
+
+const void* my_extension_data(const char* uri)
+{
+    static const LV2_State_Interface state_iface = { my_save, my_restore };
+    if (!strcmp(uri, LV2_STATE_INTERFACE_URI)) {
+        return &state_iface;
+    }
+}
+
+ +

Host Code Example

+ +
+int store_callback(void*       handle,
+                   uint32_t    key,
+                   const void* value,
+                   size_t      size,
+                   uint32_t    type,
+                   uint32_t    flags)
+{
+    if ((flags & LV2_STATE_IS_POD)) {
+        /* We only care about POD since we're keeping state in memory only.
+           If this was for disk or network storage/transmission,
+           LV2_STATE_IS_PORTABLE would have to be checked as well.
+        */
+        Map* state_map = (Map*)handle;
+        state_map->insert(key, Value(copy(value), size, type, pod));
+        return 0;
+    } else {
+        return 1; /* Non-POD events are unsupported. */
+    }
+}
+
+Map get_plugin_state(LV2_Handle instance)
+{
+    LV2_State* state = instance.extension_data("http://lv2plug.in/ns/ext/state");
+    Map state_map;
+    /** Request a fast/native/POD save, since we're just copying in memory */
+    state.save(instance, store_callback, &state_map,
+               LV2_STATE_IS_POD|LV2_STATE_IS_NATIVE);
+    return state_map;
+}
+
+ +

Referring to Existing Files

+ +

Plugins may need to refer to files (e.g. loaded samples) in their state. +This is done by storing the file's path as a property just like any other +value. However, there are some rules which MUST be followed when storing +paths, see state:mapPath for details.

+ +

Creating New Files or Directories

+ +

Implementations are strongly encouraged to avoid the use of files and simply +store all state as properties whenever possible. However, occasionally the +ability to create files is necessary. The feature state:newPath makes this possible, if it is provided by the +host.

+""" . + +state:Interface + a rdfs:Class ; + rdfs:subClassOf lv2:ExtensionData ; + lv2:documentation """ +

A structure (LV2_State_Interface) which contains functions to be called by +the host to save and restore state. In order to support this extension, the +plugin must return a valid LV2_State_Interface from +LV2_Descriptor::extension_data() when it is called with +LV2_STATE_INTERFACE_URI.

+ +

The plugin data file should describe this like so:

+
+@prefix state: <http://lv2plug.in/ns/ext/state#> .
+
+<plugin>
+    a lv2:Plugin ;
+    lv2:extensionData state:Interface .
+
+""" . + +state:State + a rdfs:Class ; + rdfs:label "Plugin Instance State" ; + lv2:documentation """ +

This class is used to express a plugin instance's state in RDF. The +key/value properties of the instance form the predicate/object (respectively) +of triples with a state:State as the subject (see state:state for an example). This may be used wherever it is +useful to express a plugin instance's state in RDF (e.g. for serialisation, +storing in a model, or transmitting over a network). Note that this class is +provided because it may be useful for hosts, plugins, or extensions that work +with instance state, but its use is not required to support the LV2 State +extension.

+""" . + +state:state + a rdf:Property ; + rdfs:range state:State ; + lv2:documentation """ +

Predicate to relate a plugin instance to its State. This may be used +wherever the state of a particular plugin instance needs to be represented. +Note that the domain of this property is unspecified, since LV2 does not define +any RDF class for plugin instance. This predicate may be used wherever it makes +sense to do so, e.g.:

+
+@prefix eg: <http://example.org/> .
+
+<plugininstance>
+    state:state [
+        eg:somekey "some value" ;
+        eg:someotherkey "some other value" ;
+        eg:favourite-number 2
+    ] .
+
+

Note that this property is provided because it may be useful for hosts, +plugins, or extensions that work with instance state, but its use is not +required to support this extension.

+""" . + +state:mapPath + a lv2:Feature ; + rdfs:label "Support for storing paths in files" ; + lv2:documentation """ + +

This feature maps absolute paths to/from abstract paths which are +stored in state. To support this feature a host must pass an LV2_Feature with +URI LV2_STATE_MAP_PATH_URI and data pointed to an LV2_State_Map_Path to the +plugin's LV2_State_Interface methods.

+ +

The plugin MUST map all paths stored in its state (including in any +files in its state). This is necessary to enable host to handle file system +references correctly, e.g. for distribution or archival.

+ +

For example, a plugin may write a path to a state file like so:

+ +
+void write_path(LV2_State_Map_Path* map_path, FILE* myfile, const char* path)
+{
+    char* abstract_path = map_path->abstract_path(map_path->handle, path);
+    fprintf(myfile, "%s", abstract_path);
+    free(abstract_path);
+}
+
+ +

Then, later reload the path like so:

+ +
+char* read_path(LV2_State_Map_Path* map_path, FILE* myfile)
+{
+    /* Obviously this is not production quality code! */
+    char abstract_path[1024];
+    fscanf(myfile, "%s", abstract_path);
+    return map_path->absolute_path(map_path->handle, abstract_path);
+}
+
+""" . + +state:makePath + a lv2:Feature ; + rdfs:label "Support for creating new files and directories" ; + lv2:documentation """ + +

This feature allows plugins to create new files and/or directories. To +support this feature the host passes an LV2_Feature with URI +LV2_STATE_MAKE_PATH_URI and data pointed to an LV2_State_Make_Path to the +plugin. The host may make this feature available only during save by passing +it to LV2_State_Interface::save(), or available any time by passing it to +LV2_Descriptor::instantiate(). If passed to LV2_State_Interface::save(), the +feature MUST NOT be used beyond the scope of that call.

+ +

The plugin is guaranteed a hierarchial namespace unique to that plugin +instance, and may expect the returned path to have the requested path as a +suffix. There is one such namespace, even if the feature is passed to +both LV2_Descriptor::instantiate() and +LV2_State_Interface::save(). Beyond this, the plugin MUST NOT make any +assumptions about the returned paths.

+ +

Like any other paths, the plugin MUST map these paths using state:mapPath before storing them in state. The plugin +MUST NOT assume these paths will be available across a save/restore otherwise, +i.e. only mapped paths saved to state are persistent, any other created paths +are temporary.

+ +

For example, a plugin may create a file in a subdirectory like so:

+ +
+char* save_myfile(LV2_State_Make_Path* make_path)
+{
+    char* path   = make_path->path(make_path->handle, "foo/bar/myfile.txt");
+    FILE* myfile = fopen(path, 'w');
+    fprintf(myfile, "Hello");
+    fclose(myfile);
+    return path;
+}
+
+""" . + +state:Path + a rdfs:Class ; + rdfs:label "Path" ; + lv2:documentation """ +

A path to a file or directory.

+ +

The format of a state:Path is a C string, possibly escaped or otherwise +restricted in a system-specific manner. This URI (LV2_STATE_PATH_URI), mapped +to an integer, MUST be used as the type parameter for any files +passed to the LV2_State_Store_Function; and will likewise be returned by the +corresponding call to the LV2_State_Retrieve_Function.

+ +

When storing and retrieving a path, the plugin MUST NOT assume the same path +will be restored. However, the restored path will refer to a file with +equivalent contents to the original.

+""" . diff --git a/lv2/lv2plug.in/ns/ext/state/waf b/lv2/lv2plug.in/ns/ext/state/waf new file mode 120000 index 0000000..5235032 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/state/waf @@ -0,0 +1 @@ +../../../../../waf \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/state/wscript b/lv2/lv2plug.in/ns/ext/state/wscript new file mode 120000 index 0000000..7e2c01b --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/state/wscript @@ -0,0 +1 @@ +../../../../../ext.wscript \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/string-port/ext.pc.in b/lv2/lv2plug.in/ns/ext/string-port/ext.pc.in new file mode 120000 index 0000000..03dd044 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/string-port/ext.pc.in @@ -0,0 +1 @@ +../../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/string-port/manifest.ttl b/lv2/lv2plug.in/ns/ext/string-port/manifest.ttl new file mode 100644 index 0000000..d0e618e --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/string-port/manifest.ttl @@ -0,0 +1,8 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 0 ; + lv2:microVersion 1 ; + rdfs:seeAlso . diff --git a/lv2/lv2plug.in/ns/ext/string-port/string-port.h b/lv2/lv2plug.in/ns/ext/string-port/string-port.h new file mode 100644 index 0000000..e7fc8c7 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/string-port/string-port.h @@ -0,0 +1,58 @@ +/* lv2_string_port.h - C header file for LV2 string port extension. + * Draft Revision 3 + * Copyright (C) 2008 Krzysztof Foltman + * + * This header is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This header is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this header; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place, Suite 330, Boston, MA 01222-1307 USA + */ + +/** @file + * C header for the LV2 String Port extension + * . + */ + +#ifndef LV2_STRING_PORT_H +#define LV2_STRING_PORT_H + +#include + +/** URI for the string port transfer mechanism feature */ +#define LV2_STRING_PORT_URI "http://lv2plug.in/ns/ext/string-port#StringTransfer" + +/** Flag: port data has been updated; for input ports, this flag is set by +the host. For output ports, this flag is set by the plugin. */ +#define LV2_STRING_DATA_CHANGED_FLAG 1 + +/** structure for string port data */ +typedef struct +{ + /** Buffer for UTF-8 encoded zero-terminated string value; host-allocated */ + char *data; + + /** Length in bytes (not characters), not including zero byte */ + size_t len; + + /** Output ports: storage space in bytes; must be >= RDF-specified requirements */ + size_t storage; + + /** Flags defined above */ + uint32_t flags; + + /** Undefined (pad to 8 bytes) */ + uint32_t pad; + +} LV2_String_Data; + +#endif + diff --git a/lv2/lv2plug.in/ns/ext/string-port/string-port.ttl b/lv2/lv2plug.in/ns/ext/string-port/string-port.ttl new file mode 100644 index 0000000..f36fa7a --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/string-port/string-port.ttl @@ -0,0 +1,105 @@ +# LV2 String Port Extension. +# Draft Revision 3 +# Copyright (C) 2008 Krzysztof Foltman +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR +# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +# OTHER DEALINGS IN THE SOFTWARE. + +@prefix sp: . +@prefix lv2: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . +@prefix doap: . +@prefix foaf: . + + a lv2:Specification ; + doap:license ; + doap:name "LV2 String Ports" ; + doap:maintainer [ + a foaf:Person ; + foaf:name "Krzysztof Foltman" ; + ] ; + lv2:documentation """ +

Defines ports which contain string data.

+ +

UI issues

+

When using port_event / write_port (and possible other communication +mechanisms), the format parameter should contain the numeric value of URI +LV2_STRING_PORT_URI (mapped with http://lv2plug.in/ns/extensions/ui specified +as map URI).

+ +

It's probably possible to use ports belonging to message context +<http://lv2plug.in/ns/ext/contexts#MessageContext> for transfer. However, +contexts mechanism does not offer any way to notify the message recipient about +which ports have been changed. To remedy that, this extension defines a flag +LV2_STRING_DATA_CHANGED_FLAG that carries that information inside a port value +structure.

+ +

Storage

+

The value of string port are assumed to be "persistent": if a host saves and +restores a state of a plugin (e.g. control port values), the values of input +string ports should also be assumed to belong to that state. This also applies +to message context: if a session is being restored, the host MUST resend the +last value that was sent to the port before session has been saved. In other +words, string port values "stick" to message ports.

+""" . + +sp:StringTransfer a lv2:Feature ; + rdfs:label "String data transfer via LV2_String_Data" . + +sp:StringPort a lv2:Port ; + rdfs:label "String port" ; + lv2:documentation """ +

Indicates that the port data points to a LV2_String_Data structure +as defined in accompanying header file.

+ +

Input Port Semantics

+

If the port does not have a context specified (it runs in the default, +realtime audio processing context), the values in the structure and the actual +string data MUST remain unchanged for the time a run() function of a plugin +is executed. However, if the port belongs to a different context, the same +data MUST remain unchanged only for the time a run() or message_process() +function of a given context is executed.

+ +

Output Port Semantics

+

The plugin may only change the string or length in a run() function (if +the port belongs to default context) or in context-defined counterparts +(if the port belongs to another context). Because of that, using default +context output string ports is contraindicated for longer strings.

+""" . + +sp:default a rdf:Property ; + rdfs:label "Default value" ; + rdfs:domain sp:StringPort ; + rdfs:range xsd:string ; + rdfs:comment """ +Gives a default value for a string port. +""" . + +sp:requiredSpace a rdf:Property ; + rdfs:label "Required storage space in bytes" ; + rdfs:domain sp:StringPort ; + rdfs:range xsd:nonNegativeInteger ; + rdfs:comment """ +Specifies required buffer space for output string ports and those of +input string ports that are meant to be GUI-controlled. The host MUST +allocate a buffer of at least required size to accommodate for all values +that can be produced by the plugin. +""" . + diff --git a/lv2/lv2plug.in/ns/ext/string-port/waf b/lv2/lv2plug.in/ns/ext/string-port/waf new file mode 120000 index 0000000..5235032 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/string-port/waf @@ -0,0 +1 @@ +../../../../../waf \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/string-port/wscript b/lv2/lv2plug.in/ns/ext/string-port/wscript new file mode 120000 index 0000000..7e2c01b --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/string-port/wscript @@ -0,0 +1 @@ +../../../../../ext.wscript \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/time/ext.pc.in b/lv2/lv2plug.in/ns/ext/time/ext.pc.in new file mode 120000 index 0000000..03dd044 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/time/ext.pc.in @@ -0,0 +1 @@ +../../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/time/manifest.ttl b/lv2/lv2plug.in/ns/ext/time/manifest.ttl new file mode 100644 index 0000000..2657388 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/time/manifest.ttl @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 0 ; + lv2:microVersion 1 ; + rdfs:seeAlso . + diff --git a/lv2/lv2plug.in/ns/ext/time/time.h b/lv2/lv2plug.in/ns/ext/time/time.h new file mode 100644 index 0000000..f3b2e77 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/time/time.h @@ -0,0 +1,131 @@ +/* + Copyright 2011 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. +*/ + +/** + @file time.h C header for the LV2 Time extension + . +*/ + +#ifndef LV2_TIME_H +#define LV2_TIME_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + Time states. +*/ +typedef enum { + LV2_TIME_STOPPED = 0, /**< Transport halted */ + LV2_TIME_ROLLING = 1, /**< Transport playing */ +} LV2_Time_State; + +/** + Bits indicating properties of an LV2_Time_Position. +*/ +typedef enum { + LV2_TIME_HAS_BBT = 1 /**< Has Bar, Beat, Tick */ +} LV2_Time_Flags; + +/** + Description of a position and/or tempo. + + This struct is used as the payload of an event to notify the plugin about + time state, such as position and tempo. +*/ +typedef struct { + /** + @{ + @name Mandatory Fields + */ + + /** + Frame number on the timeline. + */ + uint64_t frame; + + /** + Bit field of LV2_Time_Flags values indicating which fields + of this struct are valid. + */ + uint32_t flags; + + /** + Transport state. + */ + LV2_Time_State state; + + /** + @} + @{ + @name LV2_TIME_BBT fields + These fields are valid iff the LV2_TIME_BBT bit is set in @ref flags. + */ + + /** + Current bar. + The first bar is number 0 (but should be represented in a UI as bar 1). + */ + int64_t bar; + + /** + Beat within the current bar. + The first beat is number 0. + Always <= @ref beats_per_bar. + */ + int32_t beat; + + /** + Tick within the current beat. + The first tick is number 0. + Always <= @ref ticks_per_beat. + */ + int32_t tick; + + /** + Number of beats per bar (top of time signature). + */ + int32_t beats_per_bar; + + /** + Type of note that counts as one beat (bottom of time signature). + */ + int32_t beat_type; + + /** + Number of ticks per beat. + Typically this is a large integer with many even divisors. + */ + int32_t ticks_per_beat; + + /** + Current tempo, in beats per minute. + */ + double beats_per_minute; + + /** + @} + */ +} LV2_Time_Position; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV2_TIME_H */ diff --git a/lv2/lv2plug.in/ns/ext/time/time.ttl b/lv2/lv2plug.in/ns/ext/time/time.ttl new file mode 100644 index 0000000..40bfdbb --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/time/time.ttl @@ -0,0 +1,57 @@ +# LV2 Time Extension +# Copyright 2011 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 time: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a lv2:Specification ; + doap:name "LV2 Time" ; + doap:shortdesc "A data type for transport speed and position." ; + doap:maintainer [ + a foaf:Person ; + foaf:name "David Robillard" ; + foaf:homepage ; + rdfs:seeAlso + ] ; + lv2:documentation """ +

This extension defines a structure type, LV2_Time_Position, which +describes a tempo and position along a timeline. This can be used as +an event payload by the host to notify plugins about the current +tempo and position.

+""" . + +time:Position + a rdfs:Class ; + rdfs:label "LV2 time position" ; + lv2:documentation """ +

Type for an LV2_Time_Position struct. This can be mapped to an integer and +used as the type field of an event to indicate that the event payload is an +LV2_Time_Positon struct. Plugins SHOULD indicate that a port supports time +information using the ev:supports predicate, e.g.:

+
+<plugin> lv2:port [
+    a lv2:InputPort , ev:EventPort ;
+    lv2:name "control" ;
+    lv2:index 0 ;
+    ev:supportsEvent time:Position
+] .
+
+""" . diff --git a/lv2/lv2plug.in/ns/ext/time/waf b/lv2/lv2plug.in/ns/ext/time/waf new file mode 120000 index 0000000..5235032 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/time/waf @@ -0,0 +1 @@ +../../../../../waf \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/time/wscript b/lv2/lv2plug.in/ns/ext/time/wscript new file mode 120000 index 0000000..7e2c01b --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/time/wscript @@ -0,0 +1 @@ +../../../../../ext.wscript \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/ui-resize/ext.pc.in b/lv2/lv2plug.in/ns/ext/ui-resize/ext.pc.in new file mode 120000 index 0000000..03dd044 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/ui-resize/ext.pc.in @@ -0,0 +1 @@ +../../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/ui-resize/manifest.ttl b/lv2/lv2plug.in/ns/ext/ui-resize/manifest.ttl new file mode 100644 index 0000000..ca5cdf9 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/ui-resize/manifest.ttl @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 0 ; + lv2:microVersion 1 ; + rdfs:seeAlso . + diff --git a/lv2/lv2plug.in/ns/ext/ui-resize/ui-resize.h b/lv2/lv2plug.in/ns/ext/ui-resize/ui-resize.h new file mode 100644 index 0000000..cf5ccc6 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/ui-resize/ui-resize.h @@ -0,0 +1,58 @@ +/* + Copyright 2011 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_UI_RESIZE_H +#define LV2_UI_RESIZE_H + +#define LV2_UI_RESIZE_URI "http://lv2plug.in/ns/ext/ui-resize" + +typedef void* LV2_UI_Resize_Feature_Data; + +/** + UI Resize Feature. + + This structure may be used in two ways: as a feature passed by the host + (e.g. via the features parameter of LV2UI_Descriptor::instantiate()) or + as a feature exposed by a UI (e.g. via LV2UI_Descriptor::extension_data()). + + In both cases, the URI to be used is + http://lv2plug.in/ns/ext/ui-resize#UIResize +*/ +typedef struct { + + LV2_UI_Resize_Feature_Data data; + + /** + Request or notify a size change. + + When this struct is provided by the host, the UI may call this + function to notify the host that a size change is desired, or notify + the host of the initial size of the UI. + + When this struct is provided by the plugin, the host may call this + function in the UI thread to notify the UI that it should change its + size to the given dimensions. + + @return 0 on success. + */ + int (*ui_resize)(LV2_UI_Resize_Feature_Data data, + int width, + int height); + +} LV2_UI_Resize_Feature; + +#endif /* LV2_UI_RESIZE_H */ + diff --git a/lv2/lv2plug.in/ns/ext/ui-resize/ui-resize.ttl b/lv2/lv2plug.in/ns/ext/ui-resize/ui-resize.ttl new file mode 100644 index 0000000..f3b7d92 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/ui-resize/ui-resize.ttl @@ -0,0 +1,43 @@ +# LV2 UI Resize Extension +# Copyright 2011 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 uirsz: . +@prefix lv2: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . +@prefix doap: . +@prefix foaf: . + + + a lv2:Specification ; + doap:name "LV2 UI Resize Extension" ; + doap:shortdesc "A feature for self-resizing plugin UIs." ; + doap:license ; + lv2:documentation """ +

An extension that allows LV2 plugin UIs to notify the host about size +changes, or for the host to notify plugin UIs about size changes.

+""" . + +uirsz:UIResize + a lv2:Feature ; + lv2:documentation """ +

A feature that allows the UI to notify the host about its current size, or +request a size change. This feature corresponds to the LV2_UI_Resize_Feature +struct, which should be passed with the feature URI +http://lv2plug.in/ns/ext/ui-resize#UIResize. This struct may also +be provided by the UI as extension data using the same URI, in which case it +is used by the host to request that the UI change its size.

+""" . diff --git a/lv2/lv2plug.in/ns/ext/ui-resize/waf b/lv2/lv2plug.in/ns/ext/ui-resize/waf new file mode 120000 index 0000000..5235032 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/ui-resize/waf @@ -0,0 +1 @@ +../../../../../waf \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/ui-resize/wscript b/lv2/lv2plug.in/ns/ext/ui-resize/wscript new file mode 120000 index 0000000..7e2c01b --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/ui-resize/wscript @@ -0,0 +1 @@ +../../../../../ext.wscript \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/uri-map/ext.pc.in b/lv2/lv2plug.in/ns/ext/uri-map/ext.pc.in new file mode 120000 index 0000000..03dd044 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/uri-map/ext.pc.in @@ -0,0 +1 @@ +../../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/uri-map/manifest.ttl b/lv2/lv2plug.in/ns/ext/uri-map/manifest.ttl new file mode 100644 index 0000000..0348a55 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/uri-map/manifest.ttl @@ -0,0 +1,8 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 4 ; + rdfs:seeAlso . diff --git a/lv2/lv2plug.in/ns/ext/uri-map/uri-map.h b/lv2/lv2plug.in/ns/ext/uri-map/uri-map.h new file mode 100644 index 0000000..6767cd1 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/uri-map/uri-map.h @@ -0,0 +1,92 @@ +/* + Copyright 2008-2011 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. +*/ + +/** + @file + C header for the LV2 URI Map extension . + + This extension defines a simple mechanism for plugins to map URIs to + integers, usually for performance reasons (e.g. processing events typed by + URIs in real time). The expected use case is for plugins to map URIs to + integers for things they 'understand' at instantiation time, and store those + values for use in the audio thread without doing any string comparison. + This allows the extensibility of RDF with the performance of integers (or + centrally defined enumerations). +*/ + +#ifndef LV2_URI_MAP_H +#define LV2_URI_MAP_H + +#define LV2_URI_MAP_URI "http://lv2plug.in/ns/ext/uri-map" + +#include + +/** + Opaque pointer to host data. +*/ +typedef void* LV2_URI_Map_Callback_Data; + +/** + URI Map 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/uri-map" + and data pointed to an instance of this struct. +*/ +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_URI_Map_Callback_Data callback_data; + + /** + Get the numeric ID of a URI from the host. + + @param callback_data Must be the callback_data member of this struct. + @param map The 'context' of this URI. Certain extensions may define a + URI that must be passed here with certain restrictions on the return + value (e.g. limited range). This value may be NULL if the plugin needs + an ID for a URI in general. Extensions SHOULD NOT define a context + unless there is a specific need to do so, e.g. to restrict the range of + the returned value. + @param uri The URI to be mapped to an integer ID. + + This function is referentially transparent; any number of calls with the + same arguments is guaranteed to return the same value over the life of a + plugin instance (though the same URI may return different values with a + different map parameter). However, this function is not necessarily very + fast: plugins SHOULD cache any IDs they might need in performance + critical situations. + + The return value 0 is reserved and indicates that an ID for that URI + could not be created for whatever reason. Extensions MAY define more + precisely what this means in a certain context, but in general plugins + SHOULD handle this situation as gracefully as possible. However, hosts + SHOULD NOT return 0 from this function in non-exceptional circumstances + (e.g. the URI map SHOULD be dynamic). Hosts that statically support only + a fixed set of URIs should not expect plugins to function correctly. + */ + uint32_t (*uri_to_id)(LV2_URI_Map_Callback_Data callback_data, + const char* map, + const char* uri); + +} LV2_URI_Map_Feature; + +#endif /* LV2_URI_MAP_H */ diff --git a/lv2/lv2plug.in/ns/ext/uri-map/uri-map.ttl b/lv2/lv2plug.in/ns/ext/uri-map/uri-map.ttl new file mode 100644 index 0000000..88f0fdd --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/uri-map/uri-map.ttl @@ -0,0 +1,93 @@ +# LV2 URI Map Extension +# Copyright 2008-2011 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 dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix lv2ev: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix umap: . + + + a foaf:Person ; + foaf:name "David Robillard" ; + foaf:homepage ; + foaf:mbox ; + rdfs:seeAlso . + +_:larsl + a foaf:Person ; + foaf:name "Lars Luthman" . + + + a lv2:Specification , + lv2:Feature ; + owl:deprecated true ; + doap:license ; + doap:name "LV2 URI Map" ; + doap:shortdesc "A feature for mapping URIs to integers." ; + doap:release [ + doap:revision "1.4" ; + doap:created "2011-11-21" ; + dcs:blame ; + doap:file-release ; + dcs:changeset [ + dcs:item [ + rdfs:label "Update packaging." + ] , [ + rdfs:label "Deprecate uri-map in favour of urid." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2011-05-26" ; + dcs:blame ; + doap:file-release ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add build system (for installation)." + ] , [ + rdfs:label "Mark up documentation in HTML using lv2:docum" + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2010-10-18" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + doap:maintainer , + _:larsl ; + lv2:documentation """ +

This extension is deprecated. New +implementations should use LV2 URID +instead.

+ +

This extension defines a simple mechanism for plugins to map URIs to +integers, usually for performance reasons (e.g. processing events typed by URIs +in real time). The expected use case is for plugins to map URIs to integers +for things they 'understand' at instantiation time, and store those values for +use in the audio thread without doing any string comparison. This allows the +extensibility of RDF with the performance of integers (or centrally defined +enumerations).

+""" . diff --git a/lv2/lv2plug.in/ns/ext/uri-map/waf b/lv2/lv2plug.in/ns/ext/uri-map/waf new file mode 120000 index 0000000..5235032 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/uri-map/waf @@ -0,0 +1 @@ +../../../../../waf \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/uri-map/wscript b/lv2/lv2plug.in/ns/ext/uri-map/wscript new file mode 120000 index 0000000..7e2c01b --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/uri-map/wscript @@ -0,0 +1 @@ +../../../../../ext.wscript \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/urid/ext.pc.in b/lv2/lv2plug.in/ns/ext/urid/ext.pc.in new file mode 120000 index 0000000..03dd044 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/urid/ext.pc.in @@ -0,0 +1 @@ +../../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/urid/manifest.ttl b/lv2/lv2plug.in/ns/ext/urid/manifest.ttl new file mode 100644 index 0000000..4b23244 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/urid/manifest.ttl @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . +@prefix urid: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 0 ; + rdfs:seeAlso . diff --git a/lv2/lv2plug.in/ns/ext/urid/urid.h b/lv2/lv2plug.in/ns/ext/urid/urid.h new file mode 100644 index 0000000..22c9a66 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/urid/urid.h @@ -0,0 +1,115 @@ +/* + Copyright 2011 Gabriel M. Beddingfield + Copyright 2008-2011 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. +*/ + +/** + @file + C header for the LV2 URID extension +*/ + +#ifndef LV2_URID_H +#define LV2_URID_H + +#define LV2_URID_URI "http://lv2plug.in/ns/ext/urid" +#define LV2_URID_MAP_URI LV2_URID_URI "#map" +#define LV2_URID_UNMAP_URI LV2_URID_URI "#unmap" + +#include + +/** + Opaque pointer to host data for LV2_URID_Map. +*/ +typedef void* LV2_URID_Map_Handle; + +/** + Opaque pointer to host data for LV2_URID_Unmap. +*/ +typedef void* LV2_URID_Unmap_Handle; + +/** + URI mapped to an integer. +*/ +typedef uint32_t LV2_URID; + +/** + URI Map (http://lv2plug.in/ns/ext/urid#map). +*/ +typedef struct { + /** + Opaque pointer to host data. + + This MUST be passed to map_uri() whenever it is called. + Otherwise, it must not be interpreted in any way. + */ + LV2_URID_Map_Handle handle; + + /** + Get the numeric ID of a URI. + + If the ID does not already exist, it will be created. + + This function is referentially transparent; any number of calls with the + same arguments is guaranteed to return the same value over the life of a + plugin instance. Note, however, that several URIs MAY resolve to the + same ID if the host considers those URIs equivalent. + + This function is not necessarily very fast or RT-safe: plugins SHOULD + cache any IDs they might need in performance critical situations. + + The return value 0 is reserved and indicates that an ID for that URI + could not be created for whatever reason. However, hosts SHOULD NOT + return 0 from this function in non-exceptional circumstances (i.e. the + URI map SHOULD be dynamic). + + @param handle Must be the callback_data member of this struct. + @param uri The URI to be mapped to an integer ID. + */ + LV2_URID (*map)(LV2_URID_Map_Handle handle, + const char* uri); +} LV2_URID_Map; + +/** + URI Unmap (http://lv2plug.in/ns/ext/urid#unmap). +*/ +typedef struct { + /** + Opaque pointer to host data. + + This MUST be passed to unmap() whenever it is called. + Otherwise, it must not be interpreted in any way. + */ + LV2_URID_Unmap_Handle handle; + + /** + Get the URI for a previously mapped numeric ID. + + Returns NULL if @c urid is not yet mapped. Otherwise, the corresponding + URI is returned in a canonical form. This MAY not be the exact same + string that was originally passed to LV2_URID_Map::map(), but it MUST be + an identical URI according to the URI syntax specification (RFC3986). A + non-NULL return for a given @c urid will always be the same for the life + of the plugin. Plugins that intend to perform string comparison on + unmapped URIs SHOULD first canonicalise URI strings with a call to + map_uri() followed by a call to unmap_uri(). + + @param handle Must be the callback_data member of this struct. + @param urid The ID to be mapped back to the URI string. + */ + const char* (*unmap)(LV2_URID_Unmap_Handle handle, + LV2_URID urid); +} LV2_URID_Unmap; + +#endif /* LV2_URID_H */ diff --git a/lv2/lv2plug.in/ns/ext/urid/urid.ttl b/lv2/lv2plug.in/ns/ext/urid/urid.ttl new file mode 100644 index 0000000..121ffaf --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/urid/urid.ttl @@ -0,0 +1,81 @@ +# LV2 URID Extension +# Copyright 2011 Gabriel M. Beddingfield +# Copyright 2008-2011 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 dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdfs: . +@prefix urid: . + + + a foaf:Person ; + foaf:name "David Robillard" ; + foaf:homepage ; + foaf:mbox ; + rdfs:seeAlso . + +_:gabrbedd + a foaf:Person ; + foaf:name "Gabriel M. Beddingfield" ; + foaf:homepage . + + + a lv2:Specification ; + doap:license ; + doap:name "LV2 URID" ; + doap:shortdesc "Features for mapping URIs to and from integers." ; + doap:release [ + doap:revision "1.0" ; + doap:created "2011-11-21" ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + doap:developer _:gabrbedd ; + lv2:documentation """ +

This extension defines a simple mechanism for plugins to map URIs to and +from integers, usually for performance reasons (e.g. processing events typed by +URIs in real time). Typically, plugins map URIs to integers for things they +"understand" at instantiation time, and store those values for use in the audio +thread without doing any string comparison. This allows for the extensibility +of RDF but with the performance of integers.

+ +

This extension is intended as an improved and simplified replacement for the +uri-map extension, since the +map context parameter has been found problematic. New implementations +are strongly encouraged to use this extension for URI mapping.

+""" . + +urid:map + a lv2:Feature ; + lv2:documentation """ +

A feature which is used to map URIs to integers. To support this feature, +the host must pass an LV2_Feature to LV2_Descriptor::instantiate() with URI +LV2_URID_MAP_URI and data pointed to an instance of LV2_URID_Map.

+""" . + +urid:unmap + a lv2:Feature ; + lv2:documentation """ +

A feature which is used to unmap URIs previously mapped to integers by +urid:map. To support this feature, the host must pass an LV2_Feature to +LV2_Descriptor::instantiate() with URI LV2_URID_UNMAP_URI and data pointed to +an instance of LV2_URID_Unmap.

+""" . diff --git a/lv2/lv2plug.in/ns/ext/urid/waf b/lv2/lv2plug.in/ns/ext/urid/waf new file mode 120000 index 0000000..5235032 --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/urid/waf @@ -0,0 +1 @@ +../../../../../waf \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/ext/urid/wscript b/lv2/lv2plug.in/ns/ext/urid/wscript new file mode 120000 index 0000000..7e2c01b --- /dev/null +++ b/lv2/lv2plug.in/ns/ext/urid/wscript @@ -0,0 +1 @@ +../../../../../ext.wscript \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/extensions/ui/ext.pc.in b/lv2/lv2plug.in/ns/extensions/ui/ext.pc.in new file mode 120000 index 0000000..03dd044 --- /dev/null +++ b/lv2/lv2plug.in/ns/extensions/ui/ext.pc.in @@ -0,0 +1 @@ +../../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/extensions/ui/lv2-ui.doap.ttl b/lv2/lv2plug.in/ns/extensions/ui/lv2-ui.doap.ttl new file mode 100644 index 0000000..5b8ca9e --- /dev/null +++ b/lv2/lv2plug.in/ns/extensions/ui/lv2-ui.doap.ttl @@ -0,0 +1,74 @@ +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix rdfs: . + + + a foaf:Person ; + foaf:name "David Robillard" ; + foaf:homepage ; + foaf:mbox ; + rdfs:seeAlso . + + + a doap:Project ; + doap:license ; + doap:name "LV2 UI" ; + doap:shortdesc "Generic UI interface for LV2 plugins." ; + doap:developer [ + a foaf:Person ; + foaf:name "Lars Luthman" ; + foaf:mbox + ] ; + doap:maintainer ; + doap:release [ + doap:revision "2.5" ; + doap:created "2011-12-28" ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add ui:parent." + ] + ] + ] , [ + doap:revision "2.4" ; + doap:created "2011-11-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Deprecate ui:makeSONameResident." + ] , [ + rdfs:label "Add Qt4 and X11 widget types." + ] , [ + rdfs:label "Install header to URI-based system path." + ] , [ + rdfs:label "Add pkg-config file." + ] , [ + rdfs:label "Make ui.ttl a valid OWL 2 DL ontology." + ] + ] + ] , [ + doap:revision "2.2" ; + doap:created "2011-05-26" ; + doap:file-release ; + dcs:blame ; + 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 "2.0" ; + doap:created "2010-10-06" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] . diff --git a/lv2/lv2plug.in/ns/extensions/ui/manifest.ttl b/lv2/lv2plug.in/ns/extensions/ui/manifest.ttl new file mode 100644 index 0000000..28412c4 --- /dev/null +++ b/lv2/lv2plug.in/ns/extensions/ui/manifest.ttl @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 2 ; + lv2:microVersion 5 ; + rdfs:seeAlso , + . diff --git a/lv2/lv2plug.in/ns/extensions/ui/ui.h b/lv2/lv2plug.in/ns/extensions/ui/ui.h new file mode 100644 index 0000000..6d64a0d --- /dev/null +++ b/lv2/lv2plug.in/ns/extensions/ui/ui.h @@ -0,0 +1,247 @@ +/* + LV2 UI Extension + Copyright 2009-2011 David Robillard + Copyright 2006-2008 Lars Luthman + + 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 + * C header for the LV2 UI extension . + */ + +#ifndef LV2_UI_H +#define LV2_UI_H + +#include "lv2/lv2plug.in/ns/lv2core/lv2.h" + +#define LV2_UI_URI "http://lv2plug.in/ns/extensions/ui" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + A pointer to some widget or other type of UI handle. + + The actual type is defined by the type URI of the UI. All the functionality + provided by this extension is toolkit independent, the host only needs to + pass the necessary callbacks and display the widget, if possible. Plugins + may have several UIs, in various toolkits. +*/ +typedef void* LV2UI_Widget; + +/** + A pointer to a particular instance of a UI. + + It is valid to compare this to NULL (0 for C++) but otherwise the host MUST + not attempt to interpret it. The UI plugin may use it to reference internal + instance data. +*/ +typedef void* LV2UI_Handle; + +/** + A pointer to a particular plugin controller, provided by the host. + + It is valid to compare this to NULL (0 for C++) but otherwise the UI plugin + MUST NOT attempt to interpret it. The host may use it to reference internal + instance data. +*/ +typedef void* LV2UI_Controller; + +/** + The type of the host-provided function that the UI can use to + send data to a plugin's input ports. + + The @c buffer parameter must point to a block of data, @c buffer_size bytes + large. The contents of this buffer and what the host should do with it + depends on the value of the @c format parameter. + + The @c format parameter should either be 0 or a numeric ID for a "Transfer + mechanism". Transfer mechanisms are Features and may be defined in + meta-extensions. They specify how to translate the data buffers passed to + this function to input data for the plugin ports. If a UI wishes to write + data to an input port, it must list a transfer mechanism Feature for that + port's class as an optional or required feature (depending on whether the UI + will work without being able to write to that port or not). The only + exception is when the UI wants to write single float values to input ports + of the class lv2:ControlPort, in which case @c buffer_size should always be + 4, the buffer should always contain a single IEEE-754 float, and @c format + should be 0. + + The numeric IDs for the transfer mechanisms are provided by a URI-to-integer + mapping function provided by the host, using the URI Map feature + with the map URI + "http://lv2plug.in/ns/extensions/ui". Thus a UI that requires transfer + mechanism features also requires the URI Map feature, but this is implicit - + the UI does not have to list the URI map feature as a required or optional + feature in it's RDF data. + + An UI MUST NOT pass a @c format parameter value (except 0) that has not been + returned by the host-provided URI mapping function for a host-supported + transfer mechanism feature URI. + + The UI MUST NOT try to write to a port for which there is no specified + transfer mechanism, or to an output port. The UI is responsible for + allocating the buffer and deallocating it after the call. +*/ +typedef void (*LV2UI_Write_Function)(LV2UI_Controller controller, + uint32_t port_index, + uint32_t buffer_size, + uint32_t format, + const void* buffer); + +/** + The implementation of a UI. + + A pointer to an object of this type is returned by the lv2ui_descriptor() + function. +*/ +typedef struct _LV2UI_Descriptor { + /** + The URI for this UI (not for the plugin it controls). + */ + const char* URI; + + /** + Create a new UI object and return a handle to it. This function works + similarly to the instantiate() member in LV2_Descriptor. + + @param descriptor The descriptor for the UI that you want to instantiate. + + @param plugin_uri The URI of the plugin that this UI will control. + + @param bundle_path The path to the bundle containing the RDF data file + that references this shared object file, including the trailing '/'. + + @param write_function A function provided by the host that the UI can use + to send data to the plugin's input ports. + + @param controller A handle for the plugin instance that should be passed + as the first parameter of @c write_function. + + @param widget A pointer to an LV2UI_Widget. The UI will write a widget + pointer to this location (what type of widget depends on the RDF class of + the UI) that will be the main UI widget. + + @param features An array of LV2_Feature pointers. The host must pass all + feature URIs that it and the UI supports and any additional data, just + like in the LV2 plugin instantiate() function. Note that UI features and + plugin features are NOT necessarily the same, they just share the same + data structure - this will probably not be the same array as the one the + plugin host passes to a plugin. + + */ + LV2UI_Handle (*instantiate)(const struct _LV2UI_Descriptor* descriptor, + const char* plugin_uri, + const char* bundle_path, + LV2UI_Write_Function write_function, + LV2UI_Controller controller, + LV2UI_Widget* widget, + const LV2_Feature* const* features); + + + /** + Destroy the UI object and the associated widget. The host must not try + to access the widget after calling this function. + */ + void (*cleanup)(LV2UI_Handle ui); + + /** + Tell the UI that something interesting has happened at a plugin port. + + What is interesting and how it is written to the buffer passed to this + function is defined by the @c format parameter, which has the same meaning + as in LV2UI_Write_Function. The only exception is ports of the class + lv2:ControlPort, for which this function should be called when the port + value changes (it does not have to be called for every single change if + the host's UI thread has problems keeping up with the thread the plugin is + running in), @c buffer_size should be 4, the buffer should contain a + single IEEE-754 float, and @c format should be 0. + + By default, the host should only call this function for input ports of the + lv2:ControlPort class. However, the default setting can be modified by + using the following URIs in the UI's RDF data: +
+     uiext:portNotification
+     uiext:noPortNotification
+     uiext:plugin
+     uiext:portIndex
+     
+ For example, if you want the UI with uri + for the plugin with URI + to get notified when the value of the + output control port with index 4 changes, you would use the following + in the RDF for your UI: +
+      uiext:portNotification [ uiext:plugin  ;
+     uiext:portIndex 4 ] .
+     
+ and similarly with uiext:noPortNotification if you wanted + to prevent notifications for a port for which it would be on by default + otherwise. The UI is not allowed to request notifications for ports of + types for which no transfer mechanism is specified, if it does it should + be considered broken and the host should not load it. + + The @c buffer is only valid during the time of this function call, so if + the UI wants to keep it for later use it has to copy the contents to an + internal buffer. + + This member may be set to NULL if the UI is not interested in any + port events. + */ + void (*port_event)(LV2UI_Handle ui, + uint32_t port_index, + uint32_t buffer_size, + uint32_t format, + const void* buffer); + + /** + Return a data structure associated with an extension URI, for example + a struct containing additional function pointers. + + Avoid returning function pointers directly since standard C/C++ has no + valid way of casting a void* to a function pointer. This member may be set + to NULL if the UI is not interested in supporting any extensions. This is + similar to the extension_data() member in LV2_Descriptor. + */ + const void* (*extension_data)(const char* uri); + +} LV2UI_Descriptor; + +/** + A plugin UI programmer must include a function called "lv2ui_descriptor" + with the following function prototype within the shared object file. This + function will have C-style linkage (if you are using C++ this is taken care + of by the 'extern "C"' clause at the top of the file). This function will + be accessed by the UI host using the @c dlsym() function and called to get a + LV2UI_UIDescriptor for the wanted plugin. + + Just like lv2_descriptor(), this function takes an index parameter. The + index should only be used for enumeration and not as any sort of ID number - + the host should just iterate from 0 and upwards until the function returns + NULL or a descriptor with an URI matching the one the host is looking for. +*/ +const LV2UI_Descriptor* lv2ui_descriptor(uint32_t index); + +/** + The type of the lv2ui_descriptor() function. +*/ +typedef const LV2UI_Descriptor* (*LV2UI_DescriptorFunction)(uint32_t index); + +#ifdef __cplusplus +} +#endif + +#endif /* LV2_UI_H */ diff --git a/lv2/lv2plug.in/ns/extensions/ui/ui.ttl b/lv2/lv2plug.in/ns/extensions/ui/ui.ttl new file mode 100644 index 0000000..9eb0933 --- /dev/null +++ b/lv2/lv2plug.in/ns/extensions/ui/ui.ttl @@ -0,0 +1,235 @@ +# LV2 UI Extension +# Copyright 2009-2011 David Robillard +# Copyright 2006-2008 Lars Luthman +# +# 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: . +@prefix foaf: . +@prefix lv2: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix ui: . +@prefix xsd: . + + + a owl:Ontology ; + owl:imports ; + lv2:documentation """ +

This extension defines an interface that can be used in LV2 plugins and +hosts to create UIs for plugins. The UIs are similar to plugins and reside in +shared object files in an LV2 bundle. UIs are associated with a plugin in RDF +using the triples:

+ +
+@prefix ui: <http://lv2plug.in/ns/extensions/ui#> .
+
+<http://my.plugin>   ui:ui     <http://my.pluginui> .
+<http://my.pluginui> a         ui:GtkUI ;
+                     ui:binary <myui.so> .
+
+ +

where <http://my.plugin> is the URI of the plugin, +<http://my.pluginui> is the URI of the plugin UI and <myui.so> is +the relative URI to the shared object file.

+ +

While it is possible to have the plugin UI and the plugin in the same shared +object file it is probably a good idea to keep them separate so that hosts that +don't want UIs don't have to load the UI code. A UI MUST specify its class in +the RDF data (ui:GtkUI in the above example). The class defines what type the +UI is, e.g. what graphics toolkit it uses. Any type of UI class can be defined +separately from this extension.

+ +

It is possible to have multiple UIs for the same plugin, or to have the UI +for a plugin in a different bundle from the actual plugin - this way people +other than the plugin author can write plugin UIs independently without editing +the original plugin bundle.

+ +

Note that the process that loads the shared object file containing the UI +code and the process that loads the shared object file containing the actual +plugin implementation are not necessarily the same process (and not even +necessarily on the same machine). This means that plugin and UI code can +not use singletons and global variables and expect them to +refer to the same objects in the UI and the actual plugin. The function +callback interface defined in this header is the only method of communication +between UIs and plugin instances (extensions may define more, though this is +discouraged unless absolutely necessary since the significant benefits of +network transparency and serialisability are lost).

+ +

Since the LV2 specification itself allows for extensions that may add new +functionality that could be useful to control with a UI, this extension allows +for meta-extensions that can extend the interface between the UI and the +host. These extensions mirror the extensions used for plugins - there are +required and optional "features" that you declare in the RDF data for the +UI:

+ +
+<http://my.pluginui> lv2:requiredFeature <http://my.feature> .
+<http://my.pluginui> lv2:optionalFeature <http://my.feature> .
+
+ +

The rules for a UI with a required or optional feature are identical to +those of lv2:Plugin instances: if a UI declares a feature as required, the host +is NOT allowed to load it unless it supports that feature; and if it does +support a feature, it MUST pass an appropriate LV2_Feature struct to the UI's +instantiate() method. These features may be used to specify how to pass +specific types of data between the UI and the plugin port buffers (see +LV2UI_Write_Function for details).

+ +

UIs written to this specification do not need to be threadsafe - the +functions defined below may only be called in the same thread the UI main loop +is running in.

+ +

Note that this UI extension is NOT a lv2:Feature. There is no way for a +plugin to know whether the host that loads it supports UIs or not, and the +plugin must always work without the UI (although it may be rather useless +unless it has been configured using the UI in a previous session). From the +plugin perspective, control from a UI is the same as control from anywhere else +(e.g. the host, the user): via ports.

+ +

A UI does not have to be a graphical widget, it could just as well be a +server listening for OSC input or an interface to some sort of hardware device, +depending on the RDF class of the UI.

+""" . + +ui:UI + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Resource ; + rdfs:label "LV2 UI" ; + rdfs:comment "A UI for an LV2 plugin" . + +ui:GtkUI + a rdfs:Class , + owl:Class ; + rdfs:subClassOf ui:UI ; + rdfs:comment """ +A UI where the LV2_Widget is a pointer to a Gtk+ 2.0 compatible GtkWidget, +and the host guarantees that the Gtk+ library has been initialised and the +Glib main loop is running before a UI of this type is instantiated.""" . + +ui:Qt4UI + a rdfs:Class , + owl:Class ; + rdfs:subClassOf ui:UI ; + rdfs:comment """ +A UI where the LV2_Widget is a pointer to a Qt4 compatible QWidget, +and the host guarantees that the Qt4 library has been initialised and the +Qt4 main loop is running before a UI of this type is instantiated.""" . + +ui:X11UI + a rdfs:Class , + owl:Class ; + rdfs:subClassOf ui:UI ; + rdfs:comment """ +A UI where the LV2_Widget is an X11 window ID. Note this is actually an +integer, i.e. the LV2_Widget is not a pointer to an X11 window ID, but should +be itself taken as an integer value.""" . + +ui:makeSONameResident + a lv2:Feature ; + owl:deprecated "true"^^xsd:boolean ; + lv2:documentation """ +

DEPRECATED

+ +

This feature was intended to support UIs that link against toolkit +libraries which may not be unloaded during the lifetime of the host. +This is better achieved by using the appropriate flags when linking the +UI, e.g. gcc -Wl,nodelete.

+""" . + +ui:noUserResize + a lv2:Feature ; + lv2:documentation """ +

If a UI requires this feature it indicates that it does not make sense +to let the user resize the main widget, and the host should prevent that. +This feature may not make sense for all UI types. The data pointer for the +LV2_Feature for this feature should always be set to NULL.

+""" . + +ui:fixedSize + a lv2:Feature ; + lv2:documentation """ +

If a UI requires this feature it indicates the same thing as +ui:noUserResize, and additionally it means that the UI will not resize +the main widget on its own - it will always remain the same size (e.g. a +pixmap based GUI). This feature may not make sense for all UI types. +The data pointer for the LV2_Feature for this feature should always be set +to NULL.

+""" . + +ui:parent + a lv2:Feature ; + lv2:documentation """ +

The parent for the UI.

+ +

This feature can be used to pass a parent (e.g. a widget, container, canvas, +etc.) the UI should be a child of. The format of data pointer of this feature +is determined by the UI type, and is generally the same type as the LV2_Widget +the UI would return (e.g. for a GtkUI the data would be a pointer to a +GtkWidget which is a GtkContainer). This is particularly useful for +cross-toolkit embedding, where the parent often must be known at construction +time for embedding to work correctly. UIs should not require this feature +unless it is absolutely necessary for them to work at all.

+""" . + +ui:PortNotification + a rdfs:Class , + owl:Class ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:onProperty ui:plugin ; + owl:someValuesFrom lv2:Plugin ; + owl:cardinality 1 ; + rdfs:comment """ +A PortNotification MUST have exactly one ui:plugin which is a lv2:Plugin. +""" + ] , [ + a owl:Restriction ; + owl:onProperty ui:portIndex ; + owl:someValuesFrom xsd:decimal ; + owl:cardinality 1 ; + rdfs:comment """ +A PortNotification MUST have exactly one ui:portIndex which is an xsd:decimal. +""" + ] ; + rdfs:comment "Port Notification" . + +ui:portNotification + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain ui:UI ; + rdfs:range ui:PortNotification ; + lv2:documentation """ +

Indicates that a UI should receive notification (via +LV2UI_Descriptor::port_event()) when a particular port's value changes.

+""" . + +ui:plugin + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain ui:PortNotification ; + rdfs:range lv2:Plugin ; + rdfs:comment """ +The plugin a portNotification applies to. +""" . + +ui:portIndex + a rdf:Property , + owl:DatatypeProperty ; + rdfs:domain ui:PortNotification ; + rdfs:range xsd:decimal ; + rdfs:comment """ +The index of the port a portNotification applies to. +""" . diff --git a/lv2/lv2plug.in/ns/extensions/ui/waf b/lv2/lv2plug.in/ns/extensions/ui/waf new file mode 120000 index 0000000..5235032 --- /dev/null +++ b/lv2/lv2plug.in/ns/extensions/ui/waf @@ -0,0 +1 @@ +../../../../../waf \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/extensions/ui/wscript b/lv2/lv2plug.in/ns/extensions/ui/wscript new file mode 120000 index 0000000..7e2c01b --- /dev/null +++ b/lv2/lv2plug.in/ns/extensions/ui/wscript @@ -0,0 +1 @@ +../../../../../ext.wscript \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/extensions/units/ext.pc.in b/lv2/lv2plug.in/ns/extensions/units/ext.pc.in new file mode 120000 index 0000000..03dd044 --- /dev/null +++ b/lv2/lv2plug.in/ns/extensions/units/ext.pc.in @@ -0,0 +1 @@ +../../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/extensions/units/lv2-units.doap.ttl b/lv2/lv2plug.in/ns/extensions/units/lv2-units.doap.ttl new file mode 100644 index 0000000..473074d --- /dev/null +++ b/lv2/lv2plug.in/ns/extensions/units/lv2-units.doap.ttl @@ -0,0 +1,72 @@ +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix rdfs: . + + + a foaf:Person ; + foaf:name "Steve Harris" ; + foaf:homepage ; + rdfs:seeAlso . + + + a foaf:Person ; + foaf:name "David Robillard" ; + foaf:homepage ; + foaf:mbox ; + rdfs:seeAlso . + + + a doap:Project ; + doap:name "LV2 Units" ; + doap:shortdesc "Units for LV2 values." ; + doap:created "2007-02-06" ; + doap:homepage ; + doap:license ; + doap:release [ + doap:revision "5.4" ; + doap:created "2011-11-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Make units.ttl a valid OWL 2 DL ontology." + ] , [ + rdfs:label "Define used but undefined resources (units:name, units:render, units:symbol, units:Conversion, units:conversion, units:prefixConversion, units:to, and units:factor)." + ] , [ + rdfs:label "Update packaging." + ] , [ + rdfs:label "Improve documentation." + ] + ] + ] , [ + doap:revision "5.2" ; + doap:created "2010-10-05" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add build system (for installation)." + ] , [ + rdfs:label "Convert documentation to HTML and use lv2:documentation." + ] + ] + ] , [ + doap:revision "5.0" ; + doap:created "2010-10-05" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] , [ + rdfs:label "Define used but undefined resources (units:name, units:render, units:symbol, units:Conversion, units:conversion, units:prefixConversion, units:to, and units:factor)." + ] , [ + rdfs:label "Update packaging." + ] , [ + rdfs:label "Improve documentation." + ] + ] + ] ; + doap:developer ; + doap:maintainer . diff --git a/lv2/lv2plug.in/ns/extensions/units/manifest.ttl b/lv2/lv2plug.in/ns/extensions/units/manifest.ttl new file mode 100644 index 0000000..e5250cc --- /dev/null +++ b/lv2/lv2plug.in/ns/extensions/units/manifest.ttl @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 5 ; + lv2:microVersion 4 ; + rdfs:seeAlso , . + diff --git a/lv2/lv2plug.in/ns/extensions/units/units.ttl b/lv2/lv2plug.in/ns/extensions/units/units.ttl new file mode 100644 index 0000000..b0c070b --- /dev/null +++ b/lv2/lv2plug.in/ns/extensions/units/units.ttl @@ -0,0 +1,408 @@ +# LV2 Units Extension +# Copyright 2009-2011 David Robillard +# Copyright 2007 Steve Harris +# +# 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 lv2: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix units: . +@prefix xsd: . + + + a owl:Ontology ; + owl:imports ; + lv2:documentation """ +

This extension defines a number of units for use in audio processing.

+ +

For example, to say that a gain port's value is in decibels (units:db)

+
+@prefix units: <http://lv2plug.in/ns/extensions/units#> .
+@prefix eg:    <http://example.org/> .
+
+eg:plugin lv2:port [
+    a            lv2:ControlRateInputPort ;
+    lv2:datatype lv2:Float ;
+    lv2:index    0 ;
+    lv2:symbol   "gain" ;
+    lv2:name     "gain" ;
+    units:unit   units:db
+] .
+
+ +

Using the same form, plugins may also specify one-off units inline, to give +better display hints to hosts:

+
+eg:plugin lv2:port [
+    a            lv2:ControlRateInputPort ;
+    lv2:datatype lv2:Float ;
+    lv2:index    0 ;
+    lv2:symbol   "frob" ;
+    lv2:name     "frob level" ;
+    units:unit [
+        a            units:Unit ;
+        units:name   "frobnication" ;
+        units:symbol "fr" ;
+        units:render "%f f"
+    ]
+] .
+
+ +

It is also possible to define conversions between various units, which makes +it possible for hosts to automatically and generically convert from a given +unit to a desired unit. The units defined in this extension include conversion +definitions where it makes sense to do so.

+""" . + +units:Unit + a rdfs:Class , + owl:Class ; + rdfs:comment "A unit for LV2 port data" . + +units:unit + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain lv2:Port ; + rdfs:range units:Unit ; + rdfs:comment "Relates a port to the unit of its data" . + +units:name + a rdf:Property , + owl:DatatypeProperty ; + rdfs:domain units:Unit ; + rdfs:range xsd:string ; + rdfs:comment "A display name for the unit (e.g. decibels)." . + +units:render + a rdf:Property , + owl:DatatypeProperty ; + rdfs:domain units:Unit ; + rdfs:range xsd:string ; + rdfs:comment """A printf format string for rendering a value (eg. "%f dB").""" . + +units:symbol + a rdf:Property , + owl:DatatypeProperty ; + rdfs:domain units:Unit ; + rdfs:range xsd:string ; + rdfs:comment "The abbreviated symbol for the unit (e.g. dB)." . + +units:Conversion + a rdfs:Class , + owl:Class ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:onProperty units:to ; + owl:cardinality 1 ; + rdfs:comment "A conversion MUST have exactly 1 units:to property." + ] ; + rdfs:comment "A conversion from one unit to another." . + +units:conversion + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain units:Unit ; + rdfs:range units:Conversion ; + rdfs:comment "A conversion from this unit to another." . + +units:prefixConversion + a rdf:Property , + owl:ObjectProperty ; + rdfs:subPropertyOf units:conversion ; + rdfs:domain units:Unit ; + rdfs:range units:Conversion ; + rdfs:comment """ +A conversion from this unit to the same unit but with a different SI prefix +(e.g. Hz to kHz). +""" . + +units:to + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain units:Conversion ; + rdfs:range units:Unit ; + rdfs:comment "The target unit this conversion converts to." . + +units:factor + a rdf:Property , + owl:DatatypeProperty ; + rdfs:domain units:Conversion ; + rdfs:comment """ +The factor to multiple the source value by in order to convert +to the target unit. +""" . + +units:s + a units:Unit ; + units:conversion [ + units:factor 0.0166666666 ; + units:to units:min + ] ; + units:name "second" ; + units:prefixConversion [ + units:factor 1000 ; + units:to units:ms + ] ; + units:render "%f s" ; + units:symbol "s" . + +units:ms + a units:Unit ; + units:name "millisecond" ; + units:prefixConversion [ + units:factor 0.001 ; + units:to units:s + ] ; + units:render "%f ms" ; + units:symbol "ms" . + +units:min + a units:Unit ; + units:conversion [ + units:factor 60.0 ; + units:to units:s + ] ; + units:name "minute" ; + units:render "%f mins" ; + units:symbol "min" . + +units:bar + a units:Unit ; + units:name "bar" ; + units:render "%f bars" ; + units:symbol "bars" . + +units:beat + a units:Unit ; + units:name "beat" ; + units:render "%f beats" ; + units:symbol "beats" . + +units:m + a units:Unit ; + units:conversion [ + units:factor 39.37 ; + units:to units:inch + ] ; + units:name "metre" ; + units:prefixConversion [ + units:factor 100 ; + units:to units:cm + ] , [ + units:factor 1000 ; + units:to units:mm + ] , [ + units:factor 0.001 ; + units:to units:km + ] ; + units:render "%f m" ; + units:symbol "m" . + +units:cm + a units:Unit ; + units:conversion [ + units:factor 0.3937 ; + units:to units:inch + ] ; + units:name "centimetre" ; + units:prefixConversion [ + units:factor 0.01 ; + units:to units:m + ] , [ + units:factor 10 ; + units:to units:mm + ] , [ + units:factor 0.00001 ; + units:to units:km + ] ; + units:render "%f cm" ; + units:symbol "cm" . + +units:mm + a units:Unit ; + units:conversion [ + units:factor 0.03937 ; + units:to units:inch + ] ; + units:name "millimetre" ; + units:prefixConversion [ + units:factor 0.001 ; + units:to units:m + ] , [ + units:factor 0.1 ; + units:to units:cm + ] , [ + units:factor 0.000001 ; + units:to units:km + ] ; + units:render "%f mm" ; + units:symbol "mm" . + +units:km + a units:Unit ; + units:conversion [ + units:factor 0.62138818 ; + units:to units:mile + ] ; + units:name "kilometre" ; + units:prefixConversion [ + units:factor 1000 ; + units:to units:m + ] , [ + units:factor 100000 ; + units:to units:cm + ] , [ + units:factor 1000000 ; + units:to units:mm + ] ; + units:render "%f km" ; + units:symbol "km" . + +units:inch + a units:Unit ; + units:conversion [ + units:factor 2.54 ; + units:to units:cm + ] ; + units:name "inch" ; + units:render "%f\"" ; + units:symbol "in" . + +units:mile + a units:Unit ; + units:conversion [ + units:factor 1.6093 ; + units:to units:km + ] ; + units:name "mile" ; + units:render "%f mi" ; + units:symbol "mi" . + +units:db + a units:Unit ; + units:name "decibel" ; + units:render "%f dB" ; + units:symbol "dB" . + +units:pc + a units:Unit ; + units:conversion [ + units:factor 0.01 ; + units:to units:coef + ] ; + units:name "percent" ; + units:render "%f%%" ; + units:symbol "%" . + +units:coef + a units:Unit ; + units:conversion [ + units:factor 100 ; + units:to units:pc + ] ; + units:name "coefficient" ; + units:render "* %f" ; + units:symbol "" . + +units:hz + a units:Unit ; + units:name "hertz" ; + units:prefixConversion [ + units:factor 0.001 ; + units:to units:khz + ] , [ + units:factor 0.000001 ; + units:to units:mhz + ] ; + units:render "%f Hz" ; + units:symbol "Hz" . + +units:khz + a units:Unit ; + units:name "kilohertz" ; + units:prefixConversion [ + units:factor 1000 ; + units:to units:hz + ] , [ + units:factor 0.001 ; + units:to units:mhz + ] ; + units:render "%f kHz" ; + units:symbol "kHz" . + +units:mhz + a units:Unit ; + units:name "megahertz" ; + units:prefixConversion [ + units:factor 1000000 ; + units:to units:hz + ] , [ + units:factor 0.001 ; + units:to units:khz + ] ; + units:render "%f MHz" ; + units:symbol "MHz" . + +units:bpm + a units:Unit ; + units:name "beats per minute" ; + units:prefixConversion [ + units:factor 0.0166666666 ; + units:to units:hz + ] ; + units:render "%f BPM" ; + units:symbol "BPM" . + +units:oct + a units:Unit ; + units:conversion [ + units:factor 12.0 ; + units:to units:semitone12TET + ] ; + units:name "octaves" ; + units:render "%f octaves" ; + units:symbol "oct" . + +units:cent + a units:Unit ; + units:conversion [ + units:factor 0.01 ; + units:to units:semitone12TET + ] ; + units:name "cent" ; + units:render "%f ct" ; + units:symbol "ct" . + +units:semitone12TET + a units:Unit ; + units:conversion [ + units:factor 0.083333333 ; + units:to units:oct + ] ; + units:name "semitone" ; + units:render "%f semi" ; + units:symbol "semi" . + +units:degree + a units:Unit ; + units:name "degree" ; + units:render "%f deg" ; + units:symbol "deg" . + +units:midiNote + a units:Unit ; + units:name "MIDI note" ; + units:render "MIDI note %d" ; + units:symbol "note" . diff --git a/lv2/lv2plug.in/ns/extensions/units/waf b/lv2/lv2plug.in/ns/extensions/units/waf new file mode 120000 index 0000000..5235032 --- /dev/null +++ b/lv2/lv2plug.in/ns/extensions/units/waf @@ -0,0 +1 @@ +../../../../../waf \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/extensions/units/wscript b/lv2/lv2plug.in/ns/extensions/units/wscript new file mode 120000 index 0000000..7e2c01b --- /dev/null +++ b/lv2/lv2plug.in/ns/extensions/units/wscript @@ -0,0 +1 @@ +../../../../../ext.wscript \ No newline at end of file diff --git a/lv2/lv2plug.in/ns/index.html.in b/lv2/lv2plug.in/ns/index.html.in new file mode 100644 index 0000000..4863cb2 --- /dev/null +++ b/lv2/lv2plug.in/ns/index.html.in @@ -0,0 +1,32 @@ + + + + + LV2 Specifications + + + + + +
+ + + + + + + + + @ROWS@ +
NameDescriptionVersionDateStatus
+
+ + + 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 +Steve Harris + +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 . + + +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 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 . + Revision: 6.1 +*/ + +#ifndef LV2_H_INCLUDED +#define LV2_H_INCLUDED + +#include + +#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: . +@prefix doap: . +@prefix foaf: . +@prefix rdfs: . + + + a foaf:Person ; + foaf:name "Steve Harris" ; + foaf:homepage ; + rdfs:seeAlso . + + + a foaf:Person ; + foaf:name "David Robillard" ; + foaf:homepage ; + foaf:mbox ; + rdfs:seeAlso . + + + a doap:Project ; + doap:license ; + doap:name "LV2" ; + doap:homepage ; + 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 ; + 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 ; + dcs:blame ; + 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 ; + dcs:blame ; + 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 ; + dcs:blame ; + 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 ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + doap:developer , + ; + doap:maintainer . 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 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: . +@prefix lv2: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + +########################### +## 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 """ +

An LV2 specification (i.e. this specification, or an LV2 extension).

+ +

Specification data, like plugin data, is distributed in bundles +so hosts may discover all present LV2 data.

+""" . + +lv2:documentation a rdf:Property , owl:AnnotationProperty ; + rdfs:range rdfs:Literal ; + rdfs:label "documentation" ; + rdfs:seeAlso ; + lv2:documentation """ +

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

+

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 XHTML Basic, Section 3 for a list of legal tags.

+""" . + + + a owl:Ontology ; + owl:imports ; + lv2:documentation """ +

LV2 is an interface for writing audio processors, or plugins, in +C/C++ which can be dynamically loaded into many applications, or hosts. +This core specification is simple and minimal, but is designed so that +extensions can be defined to add more advanced features, making it +possibly to implement nearly any feature imaginable.

+ +

LV2 maintains a strong distinction between code and data. +Plugin code is in a shared library, while data is in a companion data file +written in Turtle. +Code, data, and any other resources (e.g. waveforms) are shipped together in a +bundle directory. The code contains only the executable portions of the +plugin which inherently must 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.

+ +

An LV2 plugin library is suitable for dynamic loading (e.g. via +dlopen()) and provides one or more plugin descriptors via the +lv2_descriptor() function. These can be instantiated to create +plugin instances, which can be run directly on data or connected +together to perform advanced signal processing tasks.

+ +

Plugins communicate via ports, which can transmit any type of data. +Data is processed by first connecting each port to a buffer, then +repeatedly calling a plugin's run() method to process blocks of +data.

+ +

This core specification defines two types of port, equivalent to those in LADSPA: lv2:ControlPort and lv2:AudioPort. +Audio ports contain arrays with one float element per sample, +allowing a block of audio to be processed in a single call to +run(). Control ports contain single float values, +which are fixed and valid for the duration of the call to run(). +Thus the control rate is determined by the block size, which is +controlled by the host (and not necessarily constant).

+ +

Threading Rules

+ +

To faciliate use in multi-threaded programs, LV2 functions are partitioned +into several threading classes:

+ + + + + + + + + + + + + +
Discovery ClassInstantiation ClassAudio Class
lv2_descriptor()LV2_Descriptor::instantiate()LV2_Descriptor::run()
LV2_Descriptor::extension_data()LV2_Descriptor::cleanup()LV2_Descriptor::connect_port()
LV2_Descriptor::activate()
LV2_Descriptor::deactivate()
+ +

The rules that hosts MUST follow are:

+
    +
  • When any function is running for a plugin instance, +no other function in the same class may run for that instance.
  • +
  • When a Discovery function is running, +no other functions in the same shared object file may run.
  • +
  • When an Instantiation function is running for a plugin instance, +no other functions for that instance may run.
  • +
+ +

Any simultaneous calls that are not explicitly forbidden by these rules are +allowed. For example, a host may call run() for two different +plugin instances simultaneously.

+ +

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.

+ +

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.

+""" . + +############ +## Plugin ## +############ + +lv2:PluginBase a rdfs:Class , owl:Class ; + rdfs:subClassOf lv2:Resource ; + lv2:documentation """ +

An abstract plugin-like resource that MAY not actually be an LV2 plugin +(e.g. may not actually have a plugin binary).

+ +

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 understand this structure.

+""" . + +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 """ +

The class which represents an LV2 plugin.

+ +

To be discovered by hosts, plugins MUST explicitly have rdf:type lv2:Plugin +listed in their bundle's manifest, e.g.:

+
+<http://example.org/my-plugin> a lv2:Plugin .
+
+ +

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. Tape Delay Unit. Use doap:shortdesc or doap:description for more +detailed descriptions.

+""" . + +########## +## 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 """ +

The class which represents an LV2 port.

+ +

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

+ +

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

+ +

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

+""" . + +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 """ +

Ports of this type will be connected to a pointer to a single value of C +type float.

+ +""" . + +lv2:AudioPort a rdfs:Class , owl:Class ; + rdfs:subClassOf lv2:Port ; + rdfs:label "Audio port" ; + lv2:documentation """ +

Ports of this type will be connected to an array of length sample_count +with elements of C type float.

+""" . + +####################### +## 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 """ +

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.

+ +

The version of an LV2 resource is composed of two fields: minor version, +and micro version. These have the usual semantics:

+ +
    +
  • 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.
  • + +
  • The micro version is incremented for changes which do not affect +compatibility at all, e.g. bug fixes or documentation updates.
  • +
+ +

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. SemVer conformant) version number is required, the +major version of all released LV2 resources is 1.

+ +

Plugins and extensions MUST adhere to the following rules:

+
    +
  • All versions of a plugin with a given URI MUST have the same 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.
  • + +
  • New ports MAY be added without changing the plugin URI if and only if they +are lv2:connectionOptional and the minor version is incremented.
  • + +
  • The minor version MUST be incremented if the index of any port (identified +by its symbol) is changed.
  • + +
  • 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.
  • +
+ +

(Note these rules are not necessarily exhaustive)

+ +

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 instance at run-time).

+ +

When hosts discover several installed versions of a resource, they SHOULD +warn the user and load only the most recent version.

+ +

An odd minor or 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.

+ +

This property describes half of a resource version. See also lv2:minorVersion, the +property which describes the other half.

+""" . + +lv2:microVersion a rdf:Property , owl:DatatypeProperty ; + rdfs:domain lv2:Resource ; + rdfs:range xsd:nonNegativeInteger ; + rdfs:label "micro version" ; + lv2:documentation """ +

The micro component of a Resource's version.

+ +

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.

+ +

This property describes half of a resource version. For detailed +documentation on LV2 resource versioning, see lv2:minorVersion.

+""" . + +lv2:binary a rdf:Property , owl:ObjectProperty ; + rdfs:domain lv2:Resource ; + rdfs:range owl:Thing ; + rdfs:label "binary" ; + lv2:documentation """ +

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

+ +

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

+""" . + +lv2:appliesTo a rdf:Property , owl:ObjectProperty ; + rdfs:domain lv2:Resource ; + rdfs:range lv2:Plugin ; + rdfs:label "Applies to" ; + lv2:documentation """ +

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

+
+<thing>
+    a             ext:Thing ;
+    lv2:appliesTo <plugin> ;
+    rdfs:seeAlso  <thing.ttl> .
+
+ +

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.

+""" . + +##################### +## 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 """ +

A Point describes an interesting value in a Port's range (much like a labeled +notch on a physical knob).

+
    +
  • A Point MUST have at least one rdfs:label which is a string.
  • +
  • A Point MUST have exactly one rdf:value with a type that is compatible + with the type of the corresponding Port.
  • +
+""" . + +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 """ +

A hint to the host for the minimum useful value that the port will use. This +is a soft limit; the plugin is required to gracefully accept all values +in the range of a port's data type.

+""" . + +lv2:maximum a rdf:Property , owl:DatatypeProperty ; + rdfs:domain lv2:Port ; + rdfs:label "Maximum value" ; + lv2:documentation """ +

A hint to the host for the maximum useful value that the port will use. +This is a soft limit; the plugin is required to gracefully accept all +values in the range of a port's data type.

+""" . + +############# +## 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 """ +

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.

+""" . + +lv2:requiredFeature a rdf:Property , owl:ObjectProperty ; + rdfs:domain lv2:Resource ; + rdfs:range lv2:Feature ; + rdfs:label "Required feature" ; + lv2:documentation """ +

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

+""" . + +#################### +## 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 """ +

Signifies that a plugin provides additional data or functions (as defined by +some extension) via LV2:Descriptor::instantiate().

+""" . + +####################### +## Standard Features ## +####################### + +lv2:isLive a lv2:Feature ; + rdfs:label "Has a live (realtime) dependency" ; + lv2:documentation """ +

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 hard real-time execution requirements (see +lv2:hardRTCapable).

+""" . + +lv2:inPlaceBroken a lv2:Feature ; + rdfs:label "In-place broken" ; + lv2:documentation """ +

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 in-place.

+""" . + +lv2:hardRTCapable a lv2:Feature ; + rdfs:label "Hard realtime capable" ; + lv2:documentation """ +

Indicates that the plugin is capable of running not only in a conventional +host but also in a hard real-time environment. To qualify for this the +plugin MUST satisfy all of the following:

+
    +
  1. The plugin MUST NOT use malloc(), free() or other heap memory management + functions within its Audio class functions.
  2. + +
  3. 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.
  4. + +
  5. 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.
  6. + +
  7. The plugin will take an amount of time to execute a run() call + approximately of form A + B * sample_count where A + and B depend on the machine and host in use. This amount of + time MUST NOT depend on input signals or plugin state.
  8. +
+

Note these rules apply to the connect_port() function as well as run().

+""" . + +################## +## 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 """ +

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 +correct latency. In fuzzy 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).

+""" . + +lv2:toggled a lv2:PortProperty ; + rdfs:label "Toggled" ; + lv2:documentation """ +

Indicates that the data item should be considered a Boolean toggle. Data +less than or equal to zero should be considered off or false, and +data above zero should be considered on or true.

+""" . + +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: . +@prefix lv2: . +@prefix owl: . +@prefix rdfs: . + + + a doap:Project , lv2:Specification , owl:Ontology ; + lv2:minorVersion 6 ; + lv2:microVersion 1 ; + rdfs:seeAlso , . \ 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 Binary files /dev/null and b/lv2/lv2plug.in/ns/lv2core/waf 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) diff --git a/lv2/ns/ext/atom/atom-helpers.h b/lv2/ns/ext/atom/atom-helpers.h deleted file mode 100644 index 6fff74b..0000000 --- a/lv2/ns/ext/atom/atom-helpers.h +++ /dev/null @@ -1,310 +0,0 @@ -/* - Copyright 2008-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. -*/ - -/** - @file atom-helpers.h Helper functions for the LV2 Atom extension. - - Note these functions are all static inline, do not take their address. - - This header is non-normative, it is provided for convenience. -*/ - -#ifndef LV2_ATOM_HELPERS_H -#define LV2_ATOM_HELPERS_H - -#include -#include -#include - -#include "lv2/lv2plug.in/ns/ext/atom/atom.h" - -#ifdef __cplusplus -extern "C" { -#else -# include -#endif - -/** Pad a size to 64 bits. */ -static inline uint32_t -lv2_atom_pad_size(uint32_t size) -{ - return (size + 7) & (~7); -} - -/** Return true iff @p atom is null. */ -static inline bool -lv2_atom_is_null(const LV2_Atom* atom) -{ - return !atom || (atom->type == 0 && atom->size == 0); -} - -/** Return true iff @p a is equal to @p b. */ -static inline bool -lv2_atom_equals(const LV2_Atom* a, const LV2_Atom* b) -{ - return (a == b) || ( - (a->type == b->type) && - (a->size == b->size) && - !memcmp(LV2_ATOM_CONTENTS(LV2_Atom, a), - LV2_ATOM_CONTENTS(LV2_Atom, b), - a->size)); -} - -/** - @name Sequence Iterator - @{ -*/ - -/** An iterator over the elements of an LV2_Atom_Sequence. */ -typedef LV2_Atom_Event* LV2_Atom_Sequence_Iter; - -/** Get an iterator pointing to the first element in @p tup. */ -static inline LV2_Atom_Sequence_Iter -lv2_sequence_begin(const LV2_Atom_Sequence* seq) -{ - return (LV2_Atom_Sequence_Iter)(LV2_ATOM_CONTENTS(LV2_Atom_Sequence, seq)); -} - -/** Return true iff @p i has reached the end of @p tup. */ -static inline bool -lv2_sequence_is_end(const LV2_Atom_Sequence* seq, LV2_Atom_Sequence_Iter i) -{ - return (uint8_t*)i >= ((uint8_t*)seq + sizeof(LV2_Atom) + seq->atom.size); -} - -/** Return an iterator to the element following @p i. */ -static inline LV2_Atom_Sequence_Iter -lv2_sequence_iter_next(const LV2_Atom_Sequence_Iter i) -{ - return (LV2_Atom_Sequence_Iter)((uint8_t*)i - + sizeof(LV2_Atom_Event) - + lv2_atom_pad_size(i->body.size)); -} - -/** Return the element pointed to by @p i. */ -static inline LV2_Atom_Event* -lv2_sequence_iter_get(LV2_Atom_Sequence_Iter i) -{ - return (LV2_Atom_Event*)i; -} - -/** - A macro for iterating over all events in a Sequence. - @param sequence The sequence to iterate over - @param iter The name of the iterator - - This macro is used similarly to a for loop (which it expands to), e.g.: - @code - LV2_SEQUENCE_FOREACH(sequence, i) { - LV2_Atom_Event* ev = lv2_sequence_iter_get(i); - // Do something with ev here... - } - @endcode -*/ -#define LV2_SEQUENCE_FOREACH(sequence, iter) \ - for (LV2_Atom_Sequence_Iter (iter) = lv2_sequence_begin(sequence); \ - !lv2_sequence_is_end(sequence, (iter)); \ - (iter) = lv2_sequence_iter_next(iter)) - -/** - @} - @name Tuple Iterator - @{ -*/ - -/** An iterator over the elements of an LV2_Atom_Tuple. */ -typedef LV2_Atom* LV2_Atom_Tuple_Iter; - -/** Get an iterator pointing to the first element in @p tup. */ -static inline LV2_Atom_Tuple_Iter -lv2_tuple_begin(const LV2_Atom_Tuple* tup) -{ - return (LV2_Atom_Tuple_Iter)(LV2_ATOM_BODY(tup)); -} - -/** Return true iff @p i has reached the end of @p tup. */ -static inline bool -lv2_tuple_is_end(const LV2_Atom_Tuple* tup, LV2_Atom_Tuple_Iter i) -{ - return (uint8_t*)i >= ((uint8_t*)tup + sizeof(LV2_Atom) + tup->atom.size); -} - -/** Return an iterator to the element following @p i. */ -static inline LV2_Atom_Tuple_Iter -lv2_tuple_iter_next(const LV2_Atom_Tuple_Iter i) -{ - return (LV2_Atom_Tuple_Iter)( - (uint8_t*)i + sizeof(LV2_Atom) + lv2_atom_pad_size(i->size)); -} - -/** Return the element pointed to by @p i. */ -static inline LV2_Atom* -lv2_tuple_iter_get(LV2_Atom_Tuple_Iter i) -{ - return (LV2_Atom*)i; -} - -/** - A macro for iterating over all properties of a Tuple. - @param tuple The tuple to iterate over - @param iter The name of the iterator - - This macro is used similarly to a for loop (which it expands to), e.g.: - @code - LV2_TUPLE_FOREACH(tuple, i) { - LV2_Atom_Property* prop = lv2_tuple_iter_get(i); - // Do something with prop here... - } - @endcode -*/ -#define LV2_TUPLE_FOREACH(tuple, iter) \ - for (LV2_Atom_Tuple_Iter (iter) = lv2_tuple_begin(tuple); \ - !lv2_tuple_is_end(tuple, (iter)); \ - (iter) = lv2_tuple_iter_next(iter)) - -/** - @} - @name Object Iterator - @{ -*/ - -/** An iterator over the properties of an LV2_Atom_Object. */ -typedef LV2_Atom_Property_Body* LV2_Atom_Object_Iter; - -/** Get an iterator pointing to the first property in @p obj. */ -static inline LV2_Atom_Object_Iter -lv2_object_begin(const LV2_Atom_Object* obj) -{ - return (LV2_Atom_Object_Iter)(LV2_ATOM_CONTENTS(LV2_Atom_Object, obj)); -} - -/** Return true iff @p i has reached the end of @p obj. */ -static inline bool -lv2_object_is_end(const LV2_Atom_Object* obj, LV2_Atom_Object_Iter i) -{ - return (uint8_t*)i >= ((uint8_t*)obj + sizeof(LV2_Atom) + obj->atom.size); -} - -/** Return true iff @p l points to the same property as @p r. */ -static inline bool -lv2_object_iter_equals(const LV2_Atom_Object_Iter l, - const LV2_Atom_Object_Iter r) -{ - return l == r; -} - -/** Return an iterator to the property following @p i. */ -static inline LV2_Atom_Object_Iter -lv2_object_iter_next(const LV2_Atom_Object_Iter i) -{ - const LV2_Atom* const value = (LV2_Atom*)((uint8_t*)i + sizeof(i)); - return (LV2_Atom_Object_Iter)((uint8_t*)i - + sizeof(LV2_Atom_Property_Body) - + lv2_atom_pad_size(value->size)); -} - -/** Return the property pointed to by @p i. */ -static inline LV2_Atom_Property_Body* -lv2_object_iter_get(LV2_Atom_Object_Iter i) -{ - return (LV2_Atom_Property_Body*)i; -} - -/** - A macro for iterating over all properties of an Object. - @param object The object to iterate over - @param iter The name of the iterator - - This macro is used similarly to a for loop (which it expands to), e.g.: - @code - LV2_OBJECT_FOREACH(object, i) { - LV2_Atom_Property* prop = lv2_object_iter_get(i); - // Do something with prop here... - } - @endcode -*/ -#define LV2_OBJECT_FOREACH(object, iter) \ - for (LV2_Atom_Object_Iter (iter) = lv2_object_begin(object); \ - !lv2_object_is_end(object, (iter)); \ - (iter) = lv2_object_iter_next(iter)) - -/** - @} - @name Object Query - @{ -*/ - -/** A single entry in an Object query. */ -typedef struct { - uint32_t key; /**< Key to query (input set by user) */ - const LV2_Atom** value; /**< Found value (output set by query function) */ -} LV2_Atom_Object_Query; - -static const LV2_Atom_Object_Query LV2_OBJECT_QUERY_END = { 0, NULL }; - -/** - Get an object's values for various keys. - - The value pointer of each item in @p query will be set to the location of - the corresponding value in @p object. Every value pointer in @p query MUST - be initialised to NULL. This function reads @p object in a single linear - sweep. By allocating @p query on the stack, objects can be "queried" - quickly without allocating any memory. This function is realtime safe. - - For example: - @code - const LV2_Atom* name = NULL; - const LV2_Atom* age = NULL; - LV2_Atom_Object_Query q[] = { - { urids.eg_name, &name }, - { urids.eg_age, &age }, - LV2_OBJECT_QUERY_END - }; - lv2_object_get(obj, q); - // name and age are now set to the appropriate values in obj, or NULL. - @endcode -*/ -static inline int -lv2_object_get(const LV2_Atom_Object* object, LV2_Atom_Object_Query* query) -{ - int matches = 0; - int n_queries = 0; - - /* Count number of query keys so we can short-circuit when done */ - for (LV2_Atom_Object_Query* q = query; q->key; ++q) { - ++n_queries; - } - - LV2_OBJECT_FOREACH(object, o) { - const LV2_Atom_Property_Body* prop = lv2_object_iter_get(o); - for (LV2_Atom_Object_Query* q = query; q->key; ++q) { - if (q->key == prop->key && !*q->value) { - *q->value = &prop->value; - if (++matches == n_queries) { - return matches; - } - break; - } - } - } - return matches; -} - -/** - @} -*/ - -#endif /* LV2_ATOM_HELPERS_H */ diff --git a/lv2/ns/ext/atom/atom-test.c b/lv2/ns/ext/atom/atom-test.c deleted file mode 100644 index 1a88d7d..0000000 --- a/lv2/ns/ext/atom/atom-test.c +++ /dev/null @@ -1,304 +0,0 @@ -/* - 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. -*/ - -#include -#include -#include - -#include "lv2/lv2plug.in/ns/ext/atom/atom-helpers.h" -#include "lv2/lv2plug.in/ns/ext/atom/forge.h" - -char** uris = NULL; -size_t n_uris = 0; - -char* -copy_string(const char* str) -{ - const size_t len = strlen(str); - char* dup = (char*)malloc(len + 1); - memcpy(dup, str, len + 1); - return dup; -} - -LV2_URID -urid_map(LV2_URID_Map_Handle handle, const char* uri) -{ - for (size_t i = 0; i < n_uris; ++i) { - if (!strcmp(uris[i], uri)) { - return i + 1; - } - } - - uris = (char**)realloc(uris, ++n_uris * sizeof(char*)); - uris[n_uris - 1] = copy_string(uri); - return n_uris; -} - -int -test_fail(const char* fmt, ...) -{ - va_list args; - va_start(args, fmt); - fprintf(stderr, "error: "); - vfprintf(stderr, fmt, args); - va_end(args); - return 1; -} - -int -main() -{ - LV2_URID_Map map = { NULL, urid_map }; - LV2_Atom_Forge forge; - lv2_atom_forge_init(&forge, &map); - - LV2_URID eg_Object = urid_map(NULL, "http://example.org/Object"); - LV2_URID eg_one = urid_map(NULL, "http://example.org/one"); - LV2_URID eg_two = urid_map(NULL, "http://example.org/two"); - LV2_URID eg_three = urid_map(NULL, "http://example.org/three"); - LV2_URID eg_four = urid_map(NULL, "http://example.org/four"); - LV2_URID eg_true = urid_map(NULL, "http://example.org/true"); - LV2_URID eg_false = urid_map(NULL, "http://example.org/false"); - LV2_URID eg_uri = urid_map(NULL, "http://example.org/uri"); - LV2_URID eg_string = urid_map(NULL, "http://example.org/string"); - LV2_URID eg_literal = urid_map(NULL, "http://example.org/literal"); - LV2_URID eg_tuple = urid_map(NULL, "http://example.org/tuple"); - LV2_URID eg_vector = urid_map(NULL, "http://example.org/vector"); - LV2_URID eg_seq = urid_map(NULL, "http://example.org/seq"); - -#define BUF_SIZE 1024 -#define NUM_PROPS 12 - - uint8_t buf[BUF_SIZE]; - lv2_atom_forge_set_buffer(&forge, buf, BUF_SIZE); - - LV2_Atom* obj = (LV2_Atom*)lv2_atom_forge_object( - &forge, NULL, 0, eg_Object); - - // eg_one = (Int32)1 - lv2_atom_forge_property_head(&forge, obj, eg_one, 0); - LV2_Atom_Int32* one = lv2_atom_forge_int32(&forge, obj, 1); - if (one->value != 1) { - return test_fail("%d != 1\n", one->value); - } - - // eg_two = (Int64)2 - lv2_atom_forge_property_head(&forge, obj, eg_two, 0); - LV2_Atom_Int64* two = lv2_atom_forge_int64(&forge, obj, 2); - if (two->value != 2) { - return test_fail("%ld != 2\n", two->value); - } - - // eg_three = (Float)3.0 - lv2_atom_forge_property_head(&forge, obj, eg_three, 0); - LV2_Atom_Float* three = lv2_atom_forge_float(&forge, obj, 3.0f); - if (three->value != 3) { - return test_fail("%f != 3\n", three->value); - } - - // eg_four = (Double)4.0 - lv2_atom_forge_property_head(&forge, obj, eg_four, 0); - LV2_Atom_Double* four = lv2_atom_forge_double(&forge, obj, 4.0); - if (four->value != 4) { - return test_fail("%ld != 4\n", four->value); - } - - // eg_true = (Bool)1 - lv2_atom_forge_property_head(&forge, obj, eg_true, 0); - LV2_Atom_Bool* t = lv2_atom_forge_bool(&forge, obj, true); - if (t->value != 1) { - return test_fail("%ld != 1 (true)\n", t->value); - } - - // eg_false = (Bool)0 - lv2_atom_forge_property_head(&forge, obj, eg_false, 0); - LV2_Atom_Bool* f = lv2_atom_forge_bool(&forge, obj, false); - if (f->value != 0) { - return test_fail("%ld != 0 (false)\n", f->value); - } - - // eg_uri = (URID)"http://example.org/value" - LV2_URID eg_value = urid_map(NULL, "http://example.org/value"); - lv2_atom_forge_property_head(&forge, obj, eg_uri, 0); - LV2_Atom_URID* uri = lv2_atom_forge_urid(&forge, obj, eg_value); - if (uri->id != eg_value) { - return test_fail("%u != %u\n", uri->id, eg_value); - } - - // eg_string = (String)"hello" - lv2_atom_forge_property_head(&forge, obj, eg_string, 0); - LV2_Atom_String* string = lv2_atom_forge_string( - &forge, obj, (const uint8_t*)"hello", strlen("hello")); - uint8_t* body = (uint8_t*)LV2_ATOM_BODY(string); - if (strcmp((const char*)body, "hello")) { - return test_fail("%s != \"hello\"\n", (const char*)body); - } - - // eg_literal = (Literal)"hello"@fr - lv2_atom_forge_property_head(&forge, obj, eg_literal, 0); - LV2_Atom_Literal* literal = lv2_atom_forge_literal( - &forge, obj, (const uint8_t*)"bonjour", strlen("bonjour"), - 0, urid_map(NULL, "http://lexvo.org/id/term/fr")); - body = (uint8_t*)LV2_ATOM_CONTENTS(LV2_Atom_Literal, literal); - if (strcmp((const char*)body, "bonjour")) { - return test_fail("%s != \"bonjour\"\n", (const char*)body); - } - - // eg_tuple = "foo",true - lv2_atom_forge_property_head(&forge, obj, eg_tuple, 0); - LV2_Atom_Tuple* tuple = lv2_atom_forge_tuple(&forge, obj); - LV2_Atom_String* tup0 = lv2_atom_forge_string( - &forge, (LV2_Atom*)tuple, (const uint8_t*)"foo", strlen("foo")); - LV2_Atom_Bool* tup1 = lv2_atom_forge_bool(&forge, (LV2_Atom*)tuple, true); - obj->size += ((LV2_Atom*)tuple)->size; - LV2_Atom_Tuple_Iter i = lv2_tuple_begin(tuple); - if (lv2_tuple_is_end(tuple, i)) { - return test_fail("Tuple iterator is empty\n"); - } - LV2_Atom* tup0i = (LV2_Atom*)lv2_tuple_iter_get(i); - if (!lv2_atom_equals((LV2_Atom*)tup0, tup0i)) { - return test_fail("Corrupt tuple element 0\n"); - } - i = lv2_tuple_iter_next(i); - if (lv2_tuple_is_end(tuple, i)) { - return test_fail("Premature end of tuple iterator\n"); - } - LV2_Atom* tup1i = lv2_tuple_iter_get(i); - if (!lv2_atom_equals((LV2_Atom*)tup1, tup1i)) { - return test_fail("Corrupt tuple element 1\n"); - } - i = lv2_tuple_iter_next(i); - if (!lv2_tuple_is_end(tuple, i)) { - return test_fail("Tuple iter is not at end\n"); - } - - // eg_vector = (Vector)1,2,3,4 - lv2_atom_forge_property_head(&forge, obj, eg_vector, 0); - int32_t elems[] = { 1, 2, 3, 4 }; - LV2_Atom_Vector* vector = lv2_atom_forge_vector( - &forge, obj, 4, forge.Int32, sizeof(int32_t), elems); - void* vec_body = LV2_ATOM_CONTENTS(LV2_Atom_Vector, vector); - if (memcmp(elems, vec_body, sizeof(elems))) { - return test_fail("Corrupt vector\n"); - } - - // eg_seq = (Sequence)1, 2 - lv2_atom_forge_property_head(&forge, obj, eg_seq, 0); - LV2_Atom_Sequence* seq = lv2_atom_forge_sequence_head(&forge, obj, 0); - lv2_atom_forge_audio_time(&forge, (LV2_Atom*)seq, 0, 0); - lv2_atom_forge_int32(&forge, (LV2_Atom*)seq, 1); - lv2_atom_forge_audio_time(&forge, (LV2_Atom*)seq, 1, 0); - lv2_atom_forge_int32(&forge, (LV2_Atom*)seq, 2); - obj->size += seq->atom.size - sizeof(LV2_Atom); - - // Test equality - LV2_Atom_Int32 itwo = { { forge.Int32, sizeof(int32_t) }, 2 }; - if (lv2_atom_equals((LV2_Atom*)one, (LV2_Atom*)two)) { - return test_fail("1 == 2.0\n"); - } else if (lv2_atom_equals((LV2_Atom*)one, (LV2_Atom*)&itwo)) { - return test_fail("1 == 2\n"); - } - - unsigned n_events = 0; - LV2_SEQUENCE_FOREACH(seq, i) { - LV2_Atom_Event* ev = lv2_sequence_iter_get(i); - if (ev->time.audio.frames != n_events - || ev->time.audio.subframes != 0) { - return test_fail("Corrupt event %u has bad time\n", n_events); - } else if (ev->body.type != forge.Int32) { - return test_fail("Corrupt event %u has bad type\n", n_events); - } else if (((LV2_Atom_Int32*)&ev->body)->value != (int)n_events + 1) { - return test_fail("Event %u != %d\n", n_events, n_events + 1); - } - ++n_events; - } - - unsigned n_props = 0; - LV2_OBJECT_FOREACH((LV2_Atom_Object*)obj, i) { - LV2_Atom_Property_Body* prop = lv2_object_iter_get(i); - if (!prop->key) { - return test_fail("Corrupt property %u has no key\n", n_props); - } else if (prop->context) { - return test_fail("Corrupt property %u has context\n", n_props); - } - ++n_props; - } - - if (n_props != NUM_PROPS) { - return test_fail("Corrupt object has %u properties != %u\n", - n_props, NUM_PROPS); - } - - const LV2_Atom* one_match = NULL; - const LV2_Atom* two_match = NULL; - const LV2_Atom* three_match = NULL; - const LV2_Atom* four_match = NULL; - const LV2_Atom* true_match = NULL; - const LV2_Atom* false_match = NULL; - const LV2_Atom* uri_match = NULL; - const LV2_Atom* string_match = NULL; - const LV2_Atom* literal_match = NULL; - const LV2_Atom* tuple_match = NULL; - const LV2_Atom* vector_match = NULL; - const LV2_Atom* seq_match = NULL; - LV2_Atom_Object_Query q[] = { - { eg_one, &one_match }, - { eg_two, &two_match }, - { eg_three, &three_match }, - { eg_four, &four_match }, - { eg_true, &true_match }, - { eg_false, &false_match }, - { eg_uri, &uri_match }, - { eg_string, &string_match }, - { eg_literal, &literal_match }, - { eg_tuple, &tuple_match }, - { eg_vector, &vector_match }, - { eg_seq, &seq_match }, - LV2_OBJECT_QUERY_END - }; - - unsigned matches = lv2_object_get((LV2_Atom_Object*)obj, q); - if (matches != n_props) { - return test_fail("Query failed, %u matches != %u\n", matches, n_props); - } else if (!lv2_atom_equals((LV2_Atom*)one, one_match)) { - return test_fail("Bad match one\n"); - } else if (!lv2_atom_equals((LV2_Atom*)two, two_match)) { - return test_fail("Bad match two\n"); - } else if (!lv2_atom_equals((LV2_Atom*)three, three_match)) { - return test_fail("Bad match three\n"); - } else if (!lv2_atom_equals((LV2_Atom*)four, four_match)) { - return test_fail("Bad match four\n"); - } else if (!lv2_atom_equals((LV2_Atom*)t, true_match)) { - return test_fail("Bad match true\n"); - } else if (!lv2_atom_equals((LV2_Atom*)f, false_match)) { - return test_fail("Bad match false\n"); - } else if (!lv2_atom_equals((LV2_Atom*)uri, uri_match)) { - return test_fail("Bad match URI\n"); - } else if (!lv2_atom_equals((LV2_Atom*)string, string_match)) { - return test_fail("Bad match string\n"); - } else if (!lv2_atom_equals((LV2_Atom*)literal, literal_match)) { - return test_fail("Bad match literal\n"); - } else if (!lv2_atom_equals((LV2_Atom*)tuple, tuple_match)) { - return test_fail("Bad match tuple\n"); - } else if (!lv2_atom_equals((LV2_Atom*)vector, vector_match)) { - return test_fail("Bad match vector\n"); - } else if (!lv2_atom_equals((LV2_Atom*)seq, seq_match)) { - return test_fail("Bad match sequence\n"); - } - - printf("All tests passed.\n"); - return 0; -} diff --git a/lv2/ns/ext/atom/atom.h b/lv2/ns/ext/atom/atom.h deleted file mode 100644 index bea9197..0000000 --- a/lv2/ns/ext/atom/atom.h +++ /dev/null @@ -1,203 +0,0 @@ -/* - Copyright 2008-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. -*/ - -/** - @file atom.h C header for the LV2 Atom extension - . - - This header describes the binary layout of various types defined in the - atom extension. -*/ - -#ifndef LV2_ATOM_H -#define LV2_ATOM_H - -#define LV2_ATOM_URI "http://lv2plug.in/ns/ext/atom" - -#define LV2_ATOM_REFERENCE_TYPE 0 - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** This expression will fail to compile if double does not fit in 64 bits. */ -typedef char lv2_atom_assert_double_fits_in_64_bits[ - ((sizeof(double) <= sizeof(uint64_t)) * 2) - 1]; - -/** - Return a pointer to the contents of a variable-sized atom. - @param type The type of the atom, e.g. LV2_Atom_String. - @param atom A variable-sized atom. -*/ -#define LV2_ATOM_CONTENTS(type, atom) \ - ((void*)((uint8_t*)(atom) + sizeof(type))) - -/** Return a pointer to the body of @p atom (just past the LV2_Atom head). */ -#define LV2_ATOM_BODY(atom) LV2_ATOM_CONTENTS(LV2_Atom, atom) - -/** The header of an atom:Atom. */ -typedef struct { - uint32_t type; /**< Type of this atom (mapped URI). */ - uint32_t size; /**< Size in bytes, not including type and size. */ -} LV2_Atom; - -/** An atom:Int32 or atom:Bool. May be cast to LV2_Atom. */ -typedef struct { - LV2_Atom atom; - int32_t value; -} LV2_Atom_Int32; - -/** An atom:Int64. May be cast to LV2_Atom. */ -typedef struct { - LV2_Atom atom; - int64_t value; -} LV2_Atom_Int64; - -/** An atom:Float. May be cast to LV2_Atom. */ -typedef struct { - LV2_Atom atom; - float value; -} LV2_Atom_Float; - -/** An atom:Double. May be cast to LV2_Atom. */ -typedef struct { - LV2_Atom atom; - double value; -} LV2_Atom_Double; - -/** An atom:Bool. May be cast to LV2_Atom. */ -typedef LV2_Atom_Int32 LV2_Atom_Bool; - -/** An atom:URID. May be cast to LV2_Atom. */ -typedef struct { - LV2_Atom atom; /**< Atom header. */ - uint32_t id; /**< URID. */ -} LV2_Atom_URID; - -/** The complete header of an atom:String. */ -typedef struct { - LV2_Atom atom; /**< Atom header. */ - /* Contents (a null-terminated UTF-8 string) follow here. */ -} LV2_Atom_String; - -/** The header of an atom:Literal body. */ -typedef struct { - uint32_t datatype; /**< The ID of the datatype of this literal. */ - uint32_t lang; /**< The ID of the language of this literal. */ -} LV2_Atom_Literal_Head; - -/** The complete header of an atom:Literal. */ -typedef struct { - LV2_Atom atom; /**< Atom header. */ - LV2_Atom_Literal_Head literal; /**< Literal body header. */ - /* Contents (a null-terminated UTF-8 string) follow here. */ -} LV2_Atom_Literal; - -/** The complete header of an atom:Tuple. */ -typedef struct { - LV2_Atom atom; /**< Atom header. */ - /* Contents (a series of complete atoms) follow here. */ -} LV2_Atom_Tuple; - -/** The complete header of an atom:Vector. */ -typedef struct { - LV2_Atom atom; /**< Atom header. */ - uint32_t elem_count; /**< The number of elements in the vector */ - uint32_t elem_type; /**< The type of each element in the vector */ - /* Contents (a series of packed atom bodies) follow here. */ -} LV2_Atom_Vector; - -/** The header of an atom:Property body (e.g. in an atom:Object). */ -typedef struct { - uint32_t key; /**< Key (predicate) (mapped URI). */ - uint32_t context; /**< Context URID (may be, and generally is, 0). */ - LV2_Atom value; /**< Value atom header. */ -} LV2_Atom_Property_Body; - -/** The complete header of an atom:Property. */ -typedef struct { - LV2_Atom atom; /**< Atom header. */ - uint32_t key; /**< Key (predicate) (mapped URI). */ - uint32_t context; /**< Context URID (may be, and generally is, 0). */ - LV2_Atom value; /**< Value atom header. */ - /* Value atom body follows here. */ -} LV2_Atom_Property; - -/** The complete header of an atom:Object. */ -typedef struct { - LV2_Atom atom; /**< Atom header. */ - uint32_t id; /**< URID for atom:Resource, or blank ID for atom:Blank. */ - uint32_t type; /**< Type URID (same as rdf:type, for fast dispatch). */ - /* Contents (a series of property bodies) follow here. */ -} LV2_Atom_Object; - -/** The complete header of an atom:Response. */ -typedef struct { - LV2_Atom atom; /**< Atom header. */ - uint32_t source; /**< ID of message this is a response to (may be 0). */ - uint32_t type; /**< Specific response type URID (may be 0). */ - uint32_t seq; /**< Response sequence number, 0 for end. */ - LV2_Atom body; /**< Body atom header (may be empty). */ - /* Body optionally follows here. */ -} LV2_Atom_Response; - -/** A time stamp in frames. Note this type is NOT an LV2_Atom. */ -typedef struct { - uint32_t frames; /**< Time in frames relative to this block. */ - uint32_t subframes; /**< Fractional time in 1/(2^32)ths of a frame. */ -} LV2_Atom_Audio_Time; - -/** The header of an atom:Event. Note this type is NOT an LV2_Atom. */ -typedef struct { - /** Time stamp. Which type is valid is determined by context. */ - union { - LV2_Atom_Audio_Time audio; /**< Time in audio frames. */ - double beats; /**< Time in beats. */ - } time; - LV2_Atom body; /**< Event body atom header. */ - /* Body atom contents follow here. */ -} LV2_Atom_Event; - -/** - A sequence of events (time-stamped atoms). - - This is used as the contents of an atom:EventPort, but is a generic Atom - type which can be used anywhere. - - The contents of a sequence is a series of LV2_Atom_Event, each aligned - to 64-bits, e.g.: -
-   | Event 1 (size 6)                              | Event 2
-   |       |       |       |       |       |       |       |       |
-   | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
-   |FRAMES |SUBFRMS|TYPE   |SIZE   |DATADATADATAPAD|FRAMES |SUBFRMS|...
-   
-*/ -typedef struct { - LV2_Atom atom; /**< Atom header. */ - uint32_t capacity; /**< Maximum size of contents. */ - uint32_t time_type; /**< URID type of event time stamps. */ - /* Contents (a series of events) follow here. */ -} LV2_Atom_Sequence; - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* LV2_ATOM_H */ diff --git a/lv2/ns/ext/atom/atom.ttl b/lv2/ns/ext/atom/atom.ttl deleted file mode 100644 index 7d534d0..0000000 --- a/lv2/ns/ext/atom/atom.ttl +++ /dev/null @@ -1,462 +0,0 @@ -# LV2 Atom Extension -# Copyright 2007-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. - -@prefix atom: . -@prefix doap: . -@prefix foaf: . -@prefix lv2: . -@prefix owl: . -@prefix rdf: . -@prefix rdfs: . -@prefix xsd: . - - - a lv2:Specification ; - doap:name "LV2 Atom" ; - doap:shortdesc "A generic value container and several data types." ; - doap:license ; - rdfs:seeAlso , - ; - doap:release [ - doap:revision "0.4" ; - doap:created "2012-02-07" - ] ; - doap:maintainer [ - a foaf:Person ; - foaf:name "David Robillard" ; - foaf:homepage ; - rdfs:seeAlso - ] ; - lv2:documentation """ -

This extension defines a generic container for data, called an Atom, -and several basic Atom types which can be used to express structured data. -Atoms allow LV2 plugins and hosts to communicate, process, serialise, and store -values of any type via a generic mechanism (e.g. ports, files, networks, -ringbuffers, etc.). Atoms are, with one exception, Plain Old Data (POD) which -may safely be copied (e.g. with a simple call to memcpy).

- -

Since Atom communication can be implemented generically, plugins that -understand some type can be used together in a host that does not understand -that type, and plugins (e.g. routers, delays) can process atoms of unknown -type.

- -

Atoms can and should be used anywhere values of various types must be stored -or transmitted. This extension defines port types, atom:ValuePort and -atom:MessagePort, which are connected to an Atom. The atom:Sequence type in -conjunction with atom:MessagePort is intended to replace the LV2 event extension.

- -

The types defined in this extension should be powerful enough to express -almost any structure. Implementers SHOULD build structures out of the types -provided here, rather than define new binary formats (e.g. use atom:Object -rather than a new C struct type). New binary formats are an -implementation burden which harms interoperabilty, and should only be defined -where absolutely necessary.

- -

Implementing this extension requires a facility for mapping URIs to -integers, such as the LV2 URID -extension.

-""" . - -atom:cType - a rdf:Property , - owl:DatatypeProperty ; - rdfs:label "C type" ; - rdfs:domain rdfs:Class ; - rdfs:range xsd:string ; - rdfs:comment """ -The identifier for a C type describing the in-memory representation of -an instance of this class. -""" . - -atom:Atom - a rdfs:Class ; - rdfs:label "Atom" ; - atom:cType "LV2_Atom" ; - lv2:documentation """ -

Abstract base class for all atoms. An LV2_Atom has a 32-bit -type and size followed by a body of size -bytes. Atoms MUST be 64-bit aligned.

- -

All concrete Atom types (subclasses of this class) MUST define a precise -binary layout for their body.

- -

The type field is the URI of an Atom type mapped to an integer. -Implementations SHOULD gracefully ignore, or pass through, atoms with unknown -types.

- -

All atoms are POD by definition except references, which as a special case -have type = 0. An Atom MUST NOT contain a Reference. It is safe -to copy any non-reference Atom with a simple memcpy, even if the -implementation does not understand type. Though this extension -reserves the type 0 for references, the details of reference handling are -currently unspecified. A future revision of this extension, or a different -extension, may define how to use non-POD data and references. Implementations -MUST NOT send references to another implementation unless the receiver is -explicitly known to support references (e.g. by supporting a feature). The -atom with both type and size 0 is -null, which is not considered a Reference.

-""" . - -atom:Bang - a rdfs:Class ; - rdfs:subClassOf atom:Atom ; - rdfs:label "Bang" ; - rdfs:comment "Generic activity or trigger, with no body." . - -atom:Number - a rdfs:Class ; - rdfs:subClassOf atom:Atom ; - rdfs:label "Number" . - -atom:Int32 - a rdfs:Class ; - rdfs:subClassOf atom:Number ; - rdfs:label "Signed 32-bit integer" ; - atom:cType "LV2_Atom_Int32" . - -atom:Int64 - a rdfs:Class ; - rdfs:subClassOf atom:Number ; - rdfs:label "Signed 64-bit integer" ; - atom:cType "LV2_Atom_Int64" . - -atom:Float - a rdfs:Class ; - rdfs:subClassOf atom:Number ; - rdfs:label "32-bit IEEE-754 floating point number" ; - atom:cType "LV2_Atom_Float" . - -atom:Double - a rdfs:Class ; - rdfs:subClassOf atom:Number ; - rdfs:label "64-bit IEEE-754 floating point number" ; - atom:cType "LV2_Atom_Double" . - -atom:Bool - a rdfs:Class ; - rdfs:subClassOf atom:Atom ; - rdfs:label "Boolean" ; - atom:cType "LV2_Atom_Bool" ; - rdfs:comment "An Int32 where 0 is false and any other value is true." . - -atom:String - a rdfs:Class ; - rdfs:subClassOf atom:Atom ; - rdfs:label "String" ; - atom:cType "LV2_Atom_String" ; - lv2:documentation """ -

A UTF-8 encoded string.

- -

The body of an LV2_Atom_String is a C string in UTF-8 encoding, i.e. an -array of bytes (uint8_t) terminated with a NULL byte -('\\0').

- -

This type can be used for free-form strings, but in most cases it is better to -use atom:Literal since this supports a language tag or datatype. Implementations -SHOULD NOT use atom:String unless translating the string does not make sense and -the string has no meaningful datatype.

-""" . - -atom:Literal - a rdfs:Class ; - rdfs:subClassOf atom:Atom ; - rdfs:label "String Literal" ; - atom:cType "LV2_Atom_Literal" ; - lv2:documentation """ -

A UTF-8 encoded string literal, with an optional datatype or language.

- -

This type is compatible with rdf:Literal and is capable of expressing a -string in any language or a value of any type. A Literal has a -datatype and lang followed by string data in UTF-8 -encoding. The length of the string data in bytes is size - -sizeof(LV2_Atom_Literal), including the terminating NULL character. The -lang field SHOULD be a URI of the form -<http://lexvo.org/id/term/LANG> where LANG is an ISO 693-2 or ISO 693-3 language code.

- -

A Literal may have a datatype OR a lang, but never -both.

- -

For example, a Literal can be "Hello" in English:

-
-void set_to_hello_in_english(LV2_Atom_Literal* lit) {
-     lit->atom.type = map(expand("atom:Literal"));
-     lit->atom.size = 14;
-     lit->datatype  = 0;
-     lit->lang      = map("http://lexvo.org/id/term/en");
-     memcpy(LV2_ATOM_CONTENTS(LV2_Atom_Literal, lit),
-            "Hello",
-            sizeof("Hello"));  // Assumes enough space
-}
-
- -

or a Turtle string:

-
-void set_to_turtle_string(LV2_Atom_Literal* lit, const char* ttl) {
-     lit->atom.type = map(expand("atom:Literal"));
-     lit->atom.size = 64;
-     lit->datatype  = map("http://www.w3.org/2008/turtle#turtle");
-     lit->lang      = 0;
-     memcpy(LV2_ATOM_CONTENTS(LV2_Atom_Literal, lit),
-            ttl,
-            strlen(ttl) + 1);  // Assumes enough space
-}
-
-""" . - -atom:URID - a rdfs:Class ; - rdfs:subClassOf atom:Atom ; - rdfs:label "Integer ID mapped from a URI" ; - atom:cType "LV2_Atom_ID" ; - lv2:documentation """ -

An unsigned 32-bit integer mapped from a URI (e.g. with LV2_URID_Map).

-""" . - -atom:Vector - a rdfs:Class ; - rdfs:subClassOf atom:Atom ; - rdfs:label "Vector" ; - atom:cType "LV2_Atom_Vector" ; - lv2:documentation """ -

A homogeneous series of atom bodies with equivalent type and size.

- -

An LV2_Atom_Vector is a 32-bit elem_count and -elem_type followed by elem_count atom bodies of type -elem_type. The element type must be a fixed size atom:Atom type, -i.e. the size of each element is the vector's size / -elem_count.

- -

For example, an atom:Vector containing 42 elements of type atom:Float:

-
-struct VectorOf42Floats {
-    uint32_t type;        // map(expand("atom:Vector"))
-    uint32_t size;        // sizeof(LV2_Atom_Vector) + (42 * sizeof(float);
-    uint32_t elem_count;  // 42
-    uint32_t elem_type;   // map(expand("atom:Float"))
-    float    elems[32];
-};
-
- -

Note that it is possible to construct a valid Atom for each element -of the vector, even by an implementation which does not understand -elem_type.

-""" . - -atom:Tuple - a rdfs:Class ; - rdfs:subClassOf atom:Atom ; - rdfs:label "Tuple" ; - lv2:documentation """ -

A series of Atoms with varying type and size.

- -

The body of a Tuple is simply a series of complete atoms, each aligned to -64 bits.

-""" . - -atom:Property - a rdfs:Class ; - rdfs:subClassOf atom:Atom ; - rdfs:label "Property" ; - atom:cType "LV2_Atom_Property" ; - lv2:documentation """ -

A property of an atom:Object. An LV2_Atom_Property has a URID -key and context, and an Atom value. -This corresponds to an RDF Property, where the key is the predicate -and the value is the object.

- -

The context field can be used to specify a different context -for each property, where this is useful. Otherwise, it may be 0.

-""" . - -atom:Object - a rdfs:Class ; - rdfs:subClassOf atom:Atom ; - rdfs:label "Object" ; - atom:cType "LV2_Atom_Object" ; - lv2:documentation """ -

An Object is an atom with a set of properties. This corresponds to -an RDF Resource, and can be thought of as a dictionary with URID keys.

- -

An LV2_Atom_Object has a uint32_t id and uint32_t -type, followed by a series of atom:Property bodies (without -headers, i.e. LV2_Atom_Property_Body). The LV2_Atom_Object::type field is -semantically equivalent to a property with key rdf:type, but is included in the -structure to allow for fast dispatch.

- -

This is an abstract Atom type, an Object is always either a atom:Resource -or a atom:Blank.

-""" . - -atom:Resource - a rdfs:Class ; - rdfs:subClassOf atom:Object ; - rdfs:label "Resource" ; - atom:cType "LV2_Atom_Object" ; - lv2:documentation """ -

An atom:Object where the id field is a URID, i.e. an Object -with a URI.

-""" . - -atom:Blank - a rdfs:Class ; - rdfs:subClassOf atom:Object ; - rdfs:label "Blank" ; - atom:cType "LV2_Atom_Object" ; - lv2:documentation """ -

An atom:Object where the LV2_Atom_Object::id is a blank node ID (NOT a URI). -The ID of a Blank is valid only within the context the Blank appears in. For -ports this is the context of the associated run() call, i.e. all ports share -the same context so outputs can contain IDs that correspond to IDs of blanks in -the input.

""" . - -atom:Event - a rdfs:Class ; - rdfs:label "Event" ; - atom:cType "LV2_Atom_Event" ; - lv2:documentation """ -

An atom with a time stamp header prepended, typically an element of an -atom:Sequence. Note this is not an Atom type.

-""" . - -atom:Sequence - a rdfs:Class ; - rdfs:subClassOf atom:Atom ; - rdfs:label "Sequence" ; - atom:cType "LV2_Atom_Sequence" ; - lv2:documentation """ -

A sequence of atom:Event, i.e. a series of time-stamped Atoms.

-""" . - -atom:AtomPort - a rdfs:Class ; - rdfs:subClassOf lv2:Port ; - rdfs:label "Atom Port" ; - lv2:documentation """ -

A port which contains an lv2:Atom. Ports of this type will be connected to -a 64-bit aligned LV2_Atom immediately followed by size bytes of -data.

- -

This is an abstract port type with incomplete semantics which can not be -used directly as a port type. Atom ports should be either a atom:ValuePort or -a atom:MessagePort.

- -

Before calling a method on a plugin that writes to an AtomPort output, the -host MUST set the size of the Atom in that output to the amount of available -memory immediately following the Atom header. The plugin MUST write a valid -Atom to that port; leaving it untouched is illegal. If there is no reasonable -value to write to the port, the plugin MUST write null (the Atom with both -type and size 0).

-""" . - -atom:ValuePort - a rdfs:Class ; - rdfs:subClassOf atom:AtomPort ; - rdfs:label "Value Port" ; - lv2:documentation """ - -

An AtomPort that contains a persistent value. A value is -time-independent and may be used numerous times. A ValuePort is pure in -the sense that it may affect output but MUST NOT affect persistent plugin state -in any externally visible way.

- -
    -
  • If a plugin has fixed values for all inputs, all ValuePort outputs are also -fixed regardless of the number of times the plugin is run.
  • - -
  • If a plugin has fixed input values for all ports except a ValuePort, each -value of that port corresponds to a single set of values for all -ValuePort outputs.
  • - -
  • If the plugin saves state other than port values (e.g. using the LV2 State extension), changing only -the value of a ValuePort input MUST NOT change that state. In other words, -value port changes MUST NOT trigger a state change that requires a save.
  • -
- -

Value ports are essentially purely functional ports: if a plugin has only -value ports, that plugin is purely functional. Hosts may elect to cache output -and avoid calling run() if the output is already known according to these -rules.

-""" . - -atom:MessagePort - a rdfs:Class ; - rdfs:subClassOf atom:AtomPort ; - rdfs:label "Message Port" ; - lv2:documentation """ -

An AtomPort that contains transient data which is consumed or -sent. The Atom contained in a MessagePort is time-dependent and only -valid for a single run invocation. Unlike a ValuePort, a MessagePort may be -used to manipulate internal plugin state.

- -

Intuitively, a MessagePort contains a message or event which -is reacted to once (not a value which is computed with any -number of times).

-""" . - -atom:bufferType - a rdf:Property ; - rdfs:domain atom:AtomPort ; - rdfs:label "buffer type" ; - lv2:documentation """ -

Indicates that an AtomPort may be connected to a certain Atom type. A port -MAY support several buffer types. The host MUST NOT connect a port to an Atom -with a type not explicitly listed with this property. The value of this -property MUST be a sub-class of atom:Atom. For example, an input port that is -connected directly to an LV2_Atom_Double value is described like so:

- -
-<plugin>
-    lv2:port [
-        a lv2:InputPort , atom:ValuePort ;
-        atom:bufferType atom:Double ;
-    ] .
-
- -

Note this property only indicates the atom types a port may be directly -connected to, it is not recursive. If a port can be connected to a -collection, use atom:supports to indicate which element types are understood. -If a port supports heterogeneous collections (collections that can contain -several types of elements at once), implementations MUST gracefully handle any -types that are present in the collection, even if those types are not -explicitly supported.

-""" . - -atom:supports - a rdf:Property ; - rdfs:label "supports" ; - lv2:documentation """ -

Indicates that a particular Atom type is supported.

- -

This property is defined loosely, it may be used to indicate that anything -supports an Atom type, wherever that may be useful. It applies -recursively where collections are involved.

- -

In particular, this property can be used to describe which event types are -supported by a port. For example, a port that receives MIDI events is -described like so:

- -
-<plugin>
-    lv2:port [
-        a lv2:InputPort , atom:MessagePort ;
-        atom:bufferType atom:Sequence ;
-        atom:supports midi:MidiEvent ;
-    ] .
-
-""" . diff --git a/lv2/ns/ext/atom/ext.pc.in b/lv2/ns/ext/atom/ext.pc.in deleted file mode 120000 index 82b50df..0000000 --- a/lv2/ns/ext/atom/ext.pc.in +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/ns/ext/atom/forge.h b/lv2/ns/ext/atom/forge.h deleted file mode 100644 index 2790778..0000000 --- a/lv2/ns/ext/atom/forge.h +++ /dev/null @@ -1,445 +0,0 @@ -/* - Copyright 2008-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. -*/ - -/** - @file forge.h An API for constructing LV2 atoms. - - This file provides a simple API which can be used to create complex nested - atoms by calling the provided functions to append atoms (or atom headers) in - the correct order. The size of the parent atom is automatically updated, - but the caller must handle this situation if atoms are more deeply nested. - - All output is written to a user-provided buffer. This entire API is - realtime safe and suitable for writing to output port buffers in the run - method. - - Note these functions are all static inline, do not take their address. - - This header is non-normative, it is provided for convenience. -*/ - -#ifndef LV2_ATOM_FORGE_H -#define LV2_ATOM_FORGE_H - -#include -#include - -#include "lv2/lv2plug.in/ns/ext/atom/atom-helpers.h" -#include "lv2/lv2plug.in/ns/ext/atom/atom.h" -#include "lv2/lv2plug.in/ns/ext/urid/urid.h" - -#ifdef __cplusplus -extern "C" { -#else -# include -#endif - -/** - A "forge" for creating atoms by appending to a buffer. -*/ -typedef struct { - uint8_t* buf; - size_t offset; - size_t size; - - LV2_URID Bool; - LV2_URID Double; - LV2_URID Float; - LV2_URID Int32; - LV2_URID Int64; - LV2_URID Literal; - LV2_URID Object; - LV2_URID Property; - LV2_URID Sequence; - LV2_URID String; - LV2_URID Tuple; - LV2_URID URID; - LV2_URID Vector; -} LV2_Atom_Forge; - -/** Set the output buffer where @c forge will write atoms. */ -static inline void -lv2_atom_forge_set_buffer(LV2_Atom_Forge* forge, uint8_t* buf, size_t size) -{ - forge->buf = buf; - forge->size = size; - forge->offset = 0; -} - -/** - Initialise @c forge. - - URIs will be mapped using @c map and stored, a reference to @c map itself is - not held. -*/ -static inline void -lv2_atom_forge_init(LV2_Atom_Forge* forge, LV2_URID_Map* map) -{ - lv2_atom_forge_set_buffer(forge, NULL, 0); - forge->Bool = map->map(map->handle, LV2_ATOM_URI "#Bool"); - forge->Double = map->map(map->handle, LV2_ATOM_URI "#Double"); - forge->Float = map->map(map->handle, LV2_ATOM_URI "#Float"); - forge->Int32 = map->map(map->handle, LV2_ATOM_URI "#Int32"); - forge->Int64 = map->map(map->handle, LV2_ATOM_URI "#Int64"); - forge->Literal = map->map(map->handle, LV2_ATOM_URI "#Literal"); - forge->Object = map->map(map->handle, LV2_ATOM_URI "#Object"); - forge->Property = map->map(map->handle, LV2_ATOM_URI "#Property"); - forge->Sequence = map->map(map->handle, LV2_ATOM_URI "#Sequence"); - forge->String = map->map(map->handle, LV2_ATOM_URI "#String"); - forge->Tuple = map->map(map->handle, LV2_ATOM_URI "#Tuple"); - forge->URID = map->map(map->handle, LV2_ATOM_URI "#URID"); - forge->Vector = map->map(map->handle, LV2_ATOM_URI "#Vector"); -} - -/** - Reserve @c size bytes in the output buffer (used internally). - @return The start of the reserved memory, or NULL if out of space. -*/ -static inline uint8_t* -lv2_atom_forge_reserve(LV2_Atom_Forge* forge, - LV2_Atom* parent, - uint32_t size) -{ - uint8_t* const out = forge->buf + forge->offset; - const uint32_t padded_size = lv2_atom_pad_size(size); - if (forge->offset + padded_size > forge->size) { - return NULL; - } - if (parent) { - parent->size += padded_size; - } - forge->offset += padded_size; - return out; -} - -/** - Write the header of an atom:Atom. - - Space for the complete atom will be reserved, but uninitialised. -*/ -static inline LV2_Atom* -lv2_atom_forge_atom_head(LV2_Atom_Forge* forge, - LV2_Atom* parent, - uint32_t type, - uint32_t size) -{ - LV2_Atom* const out = (LV2_Atom*)lv2_atom_forge_reserve( - forge, parent, size); - if (out) { - out->type = type; - out->size = size - sizeof(LV2_Atom); - } - return out; -} - -/** Write an atom:Int32. */ -static inline LV2_Atom_Int32* -lv2_atom_forge_int32(LV2_Atom_Forge* forge, LV2_Atom* parent, int32_t val) -{ - LV2_Atom_Int32* out = (LV2_Atom_Int32*)lv2_atom_forge_atom_head( - forge, parent, forge->Int32, sizeof(LV2_Atom_Int32)); - if (out) { - out->value = val; - } - return out; -} - -/** Write an atom:Int64. */ -static inline LV2_Atom_Int64* -lv2_atom_forge_int64(LV2_Atom_Forge* forge, LV2_Atom* parent, int64_t val) -{ - LV2_Atom_Int64* out = (LV2_Atom_Int64*)lv2_atom_forge_atom_head( - forge, parent, forge->Int64, sizeof(LV2_Atom_Int64)); - if (out) { - out->value = val; - } - return out; -} - -/** Write an atom:Float. */ -static inline LV2_Atom_Float* -lv2_atom_forge_float(LV2_Atom_Forge* forge, LV2_Atom* parent, float val) -{ - LV2_Atom_Float* out = (LV2_Atom_Float*)lv2_atom_forge_atom_head( - forge, parent, forge->Float, sizeof(LV2_Atom_Float)); - if (out) { - out->value = val; - } - return out; -} - -/** Write an atom:Double. */ -static inline LV2_Atom_Double* -lv2_atom_forge_double(LV2_Atom_Forge* forge, LV2_Atom* parent, double val) -{ - LV2_Atom_Double* out = (LV2_Atom_Double*)lv2_atom_forge_atom_head( - forge, parent, forge->Double, sizeof(LV2_Atom_Double)); - if (out) { - out->value = val; - } - return out; -} - -/** Write an atom:Bool. */ -static inline LV2_Atom_Bool* -lv2_atom_forge_bool(LV2_Atom_Forge* forge, LV2_Atom* parent, bool val) -{ - LV2_Atom_Bool* out = (LV2_Atom_Bool*)lv2_atom_forge_atom_head( - forge, parent, forge->Bool, sizeof(LV2_Atom_Bool)); - if (out) { - out->value = val ? 1 : 0; - } - return out; -} - -/** Write an atom:URID. */ -static inline LV2_Atom_URID* -lv2_atom_forge_urid(LV2_Atom_Forge* forge, LV2_Atom* parent, LV2_URID id) -{ - LV2_Atom_URID* out = (LV2_Atom_URID*)lv2_atom_forge_reserve( - forge, parent, sizeof(LV2_Atom_URID)); - if (out) { - out->atom.type = forge->URID; - out->atom.size = sizeof(uint32_t); - out->id = id; - } - return out; -} - -/** Write an atom:String. */ -static inline LV2_Atom_String* -lv2_atom_forge_string(LV2_Atom_Forge* forge, - LV2_Atom* parent, - const uint8_t* str, - size_t len) -{ - LV2_Atom_String* out = (LV2_Atom_String*)lv2_atom_forge_reserve( - forge, parent, sizeof(LV2_Atom_String) + len + 1); - if (out) { - out->atom.type = forge->String; - out->atom.size = len + 1; - assert(LV2_ATOM_CONTENTS(LV2_Atom_String, out) == LV2_ATOM_BODY(out)); - uint8_t* buf = LV2_ATOM_CONTENTS(LV2_Atom_String, out); - memcpy(buf, str, len); - buf[len] = '\0'; - } - return out; -} - -/** Write an atom:Literal. */ -static inline LV2_Atom_Literal* -lv2_atom_forge_literal(LV2_Atom_Forge* forge, - LV2_Atom* parent, - const uint8_t* str, - size_t len, - uint32_t datatype, - uint32_t lang) -{ - LV2_Atom_Literal* out = (LV2_Atom_Literal*)lv2_atom_forge_reserve( - forge, parent, sizeof(LV2_Atom_Literal) + len + 1); - if (out) { - out->atom.type = forge->Literal; - out->atom.size = sizeof(LV2_Atom_Literal_Head) + len + 1; - out->literal.datatype = datatype; - out->literal.lang = lang; - uint8_t* buf = LV2_ATOM_CONTENTS(LV2_Atom_Literal, out); - memcpy(buf, str, len); - buf[len] = '\0'; - } - return out; -} - -/** Write an atom:Vector header and reserve space for the body. */ -static inline LV2_Atom_Vector* -lv2_atom_forge_reserve_vector(LV2_Atom_Forge* forge, - LV2_Atom* parent, - uint32_t elem_count, - uint32_t elem_type, - uint32_t elem_size) -{ - const size_t size = sizeof(LV2_Atom_Vector) + (elem_size * elem_count); - LV2_Atom_Vector* out = (LV2_Atom_Vector*)lv2_atom_forge_reserve( - forge, parent, size); - if (out) { - out->atom.type = forge->Vector; - out->atom.size = size - sizeof(LV2_Atom); - out->elem_count = elem_count; - out->elem_type = elem_type; - } - return out; -} - -/** Write an atom:Vector. */ -static inline LV2_Atom_Vector* -lv2_atom_forge_vector(LV2_Atom_Forge* forge, - LV2_Atom* parent, - uint32_t elem_count, - uint32_t elem_type, - uint32_t elem_size, - void* elems) -{ - LV2_Atom_Vector* out = lv2_atom_forge_reserve_vector( - forge, parent, elem_count, elem_type, elem_size); - if (out) { - uint8_t* buf = LV2_ATOM_CONTENTS(LV2_Atom_Vector, out); - memcpy(buf, elems, elem_size * elem_count); - } - return out; -} - -/** - Write the header of an atom:Tuple. - - To complete the tuple, write a sequence of atoms, always passing the - returned tuple as the @c parent parameter (or otherwise ensuring the size is - updated correctly). - - For example: - @code - // Write tuple (1, 2.0) - LV2_Atom* tup = (LV2_Atom*)lv2_atom_forge_tuple(forge, NULL); - lv2_atom_forge_int32(forge, tup, 1); - lv2_atom_forge_float(forge, tup, 2.0); - @endcode -*/ -static inline LV2_Atom_Tuple* -lv2_atom_forge_tuple(LV2_Atom_Forge* forge, - LV2_Atom* parent) -{ - return (LV2_Atom_Tuple*)lv2_atom_forge_atom_head( - forge, parent, forge->Tuple, sizeof(LV2_Atom)); -} - -/** - Write the header of an atom:Object. - - To complete the object, write a sequence of properties, always passing the - object as the @c parent parameter (or otherwise ensuring the size is updated - correctly). - - For example: - @code - LV2_URID eg_Cat = map("http://example.org/Cat"); - LV2_URID eg_name = map("http://example.org/name"); - - // Write object header - LV2_Atom* obj = (LV2_Atom*)lv2_atom_forge_object(forge, NULL, 0, eg_Cat); - - // Write property: eg:name = "Hobbes" - lv2_atom_forge_property_head(forge, obj, eg_name, 0); - lv2_atom_forge_string(forge, obj, "Hobbes", strlen("Hobbes")); - @endcode -*/ -static inline LV2_Atom_Object* -lv2_atom_forge_object(LV2_Atom_Forge* forge, - LV2_Atom* parent, - LV2_URID id, - LV2_URID type) -{ - LV2_Atom_Object* out = (LV2_Atom_Object*)lv2_atom_forge_reserve( - forge, parent, sizeof(LV2_Atom_Object)); - if (out) { - out->atom.type = forge->Object; - out->atom.size = sizeof(LV2_Atom_Object) - sizeof(LV2_Atom); - out->id = id; - out->type = type; - } - return out; -} - -/** - Write the header for a property body (likely in an Object). - See lv2_atom_forge_object() documentation for an example. -*/ -static inline LV2_Atom_Property_Body* -lv2_atom_forge_property_head(LV2_Atom_Forge* forge, - LV2_Atom* parent, - LV2_URID key, - LV2_URID context) -{ - LV2_Atom_Property_Body* out = (LV2_Atom_Property_Body*) - lv2_atom_forge_reserve(forge, parent, 2 * sizeof(uint32_t)); - if (out) { - out->key = key; - out->context = context; - } - return out; -} - -/** - Write the header for a Sequence. - The size of the returned sequence will be 0, so passing it as the parent - parameter to other forge methods will do the right thing. -*/ -static inline LV2_Atom_Sequence* -lv2_atom_forge_sequence_head(LV2_Atom_Forge* forge, - LV2_Atom* parent, - uint32_t capacity) -{ - LV2_Atom_Sequence* out = (LV2_Atom_Sequence*) - lv2_atom_forge_reserve(forge, parent, sizeof(LV2_Atom_Sequence)); - if (out) { - out->atom.type = forge->Sequence; - out->atom.size = sizeof(LV2_Atom_Sequence) - sizeof(LV2_Atom); - out->capacity = capacity; - out->pad = 0; - } - return out; -} - -/** - Write the time stamp header of an Event (in a Sequence) in audio frames. - After this, call the appropriate forge method(s) to write the body, passing - the same @c parent parameter. Note the returned LV2_Event is NOT an Atom. -*/ -static inline LV2_Atom_Event* -lv2_atom_forge_audio_time(LV2_Atom_Forge* forge, - LV2_Atom* parent, - uint32_t frames, - uint32_t subframes) -{ - LV2_Atom_Event* out = (LV2_Atom_Event*) - lv2_atom_forge_reserve(forge, parent, 2 * sizeof(uint32_t)); - if (out) { - out->time.audio.frames = frames; - out->time.audio.subframes = subframes; - } - return out; -} - -/** - Write the time stamp header of an Event (in a Sequence) in beats. - After this, call the appropriate forge method(s) to write the body, passing - the same @c parent parameter. Note the returned LV2_Event is NOT an Atom. -*/ -static inline LV2_Atom_Event* -lv2_atom_forge_beat_time(LV2_Atom_Forge* forge, - LV2_Atom* parent, - double beats) -{ - LV2_Atom_Event* out = (LV2_Atom_Event*) - lv2_atom_forge_reserve(forge, parent, sizeof(double)); - if (out) { - out->time.beats = beats; - } - return out; -} - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* LV2_ATOM_FORGE_H */ diff --git a/lv2/ns/ext/atom/manifest.ttl b/lv2/ns/ext/atom/manifest.ttl deleted file mode 100644 index 37f0f58..0000000 --- a/lv2/ns/ext/atom/manifest.ttl +++ /dev/null @@ -1,9 +0,0 @@ -@prefix lv2: . -@prefix rdfs: . - - - a lv2:Specification ; - lv2:minorVersion 0 ; - lv2:microVersion 4 ; - rdfs:seeAlso . - diff --git a/lv2/ns/ext/atom/waf b/lv2/ns/ext/atom/waf deleted file mode 120000 index b955110..0000000 --- a/lv2/ns/ext/atom/waf +++ /dev/null @@ -1 +0,0 @@ -../../../../waf \ No newline at end of file diff --git a/lv2/ns/ext/atom/wscript b/lv2/ns/ext/atom/wscript deleted file mode 120000 index ec20a77..0000000 --- a/lv2/ns/ext/atom/wscript +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.wscript \ No newline at end of file diff --git a/lv2/ns/ext/contexts/contexts.h b/lv2/ns/ext/contexts/contexts.h deleted file mode 100644 index f49b474..0000000 --- a/lv2/ns/ext/contexts/contexts.h +++ /dev/null @@ -1,82 +0,0 @@ -/* LV2 Contexts Extension - * Copyright (C) 2007-2009 David Robillard - * - * This header is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This header is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -/** @file - * C header for the LV2 Contexts extension - * . - */ - -#ifndef LV2_CONTEXTS_H -#define LV2_CONTEXTS_H - -#include - -#include "lv2/lv2plug.in/ns/lv2core/lv2.h" - -#define LV2_CONTEXTS_URI "http://lv2plug.in/ns/ext/contexts" - -static inline void -lv2_contexts_set_port_valid(void* flags, uint32_t index) { - ((uint8_t*)flags)[index / 8] |= 1 << (index % 8); -} - -static inline void -lv2_contexts_unset_port_valid(void* flags, uint32_t index) { - ((uint8_t*)flags)[index / 8] &= ~(1 << (index % 8)); -} - -static inline int -lv2_contexts_port_is_valid(const void* flags, uint32_t index) { - return (((uint8_t*)flags)[index / 8] & (1 << (index % 8))) != 0; -} - -typedef struct { - - /** The message run function. This is called once to process a set of - * inputs and produce a set of outputs. - * - * Before calling the host MUST set valid_inputs such that the bit - * corresponding to each input port is 1 iff data is present. The plugin - * MUST only inspect bits corresponding to ports in the message thread. - * - * Similarly, before returning the plugin MUST set valid_outputs such that - * the bit corresponding to each output port of the message context is 1 - * iff the value at that port has changed. - * The plugin must return 1 if outputs have been written, 0 otherwise. - */ - uint32_t (*run)(LV2_Handle instance, - const void* valid_inputs, - void* valid_outputs); - -} LV2_Contexts_MessageContext; - -typedef void* LV2_Contexts_Request_Run_Data; - -typedef struct { - - /** Pointer to opaque host data (to be passed to request_run) */ - LV2_Contexts_Request_Run_Data data; - - /** Request the host execute the context with the given URI */ - void (*request_run)(LV2_Contexts_Request_Run_Data host_handle, - uint32_t context_uri); - -} LV2_Contexts_Request_Run_Feature; - -#endif /* LV2_CONTEXTS_H */ - diff --git a/lv2/ns/ext/contexts/contexts.ttl b/lv2/ns/ext/contexts/contexts.ttl deleted file mode 100644 index c56c649..0000000 --- a/lv2/ns/ext/contexts/contexts.ttl +++ /dev/null @@ -1,134 +0,0 @@ -# LV2 Contexts Extension -# -# Allows for an LV2 plugin to have several independent contexts, each with its -# own run callback and associated ports. -# -# Copyright (C) 2007-2010 David Robillard -# -# Permission is hereby granted, free of charge, to any person obtaining a -# copy of this software and associated documentation files (the "Software"), -# to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, -# and/or sell copies of the Software, and to permit persons to whom the -# Software is furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR -# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -# OTHER DEALINGS IN THE SOFTWARE. - -@prefix ctx: . -@prefix lv2: . -@prefix rdf: . -@prefix rdfs: . -@prefix xsd: . -@prefix doap: . -@prefix foaf: . - - - a lv2:Specification , lv2:Feature ; - doap:name "LV2 Contexts" ; - doap:shortdesc "Support for plugins with several execution contexts." ; - lv2:documentation """ -

An extension for LV2 plugins which have several execution contexts.

- -

Contexts allow plugins to run tasks and/or process input/output in -multiple threads. Contexts can be used to add non-realtime functionality -to a plugin while still keeping the audio run() method realtime safe.

- -

A context is an LV2 feature, so the usual LV2 feature mechanism is used -to determine whether a plugin has a given context, and whether or not it is -mandatory.

- -

Unless otherwise stated, each context (defined by some URI) adds a new -threading class similar to the Audio class defined by LV2. Each context has a -run callback and a connect_port callback both in the same class (i.e. can't be -called concurrently), but may be called concurrently with functions for other -contexts (excluding the Instantiation class). Context properties such as -ctx:hardRTCapable apply to both functions. -The host MUST only call the correct connect_port function associated with the -context for that port, i.e. it is an error to use the main LV2 connect_port -function on a port with a context other than the main LV2 run function.

-""" . - - -########################## -## Context Base Classes ## -########################## - -ctx:Context a rdfs:Class ; - rdfs:label "LV2 Context" ; - lv2:documentation """ -

A potentially concurrent context (callback) on a plugin.

- -

Ports are always associated with a context. If a port has no explicit context -property, then its context is ctx:audioContext (the default LV2 run() context).

- -

A plugin indicates support for a context by supporting an LV2 Feature with -that context's URI. If a plugin optionally supports a context (e.g. -<plugin> lv2:optionalFeature ctx:idleContext .), then -all ports associated with that context MUST be lv2:connectionOptional. Thus, -hosts that do not support contexts will connect such ports to NULL and the -plugin can run with only a standard LV2 run() context.

- -

Any plugin that supports any context (optionally or mandatorily) MUST adhere -to the following additional threading rules for LV2_Descriptor.connect_port:

-
    -
  • connect_port MUST only be called for a given port from the context -associated with that port
  • -
  • connect_port MAY be called concurrently for ports with different -contexts (but MUST NOT be called concurrently for multiple ports in the -same context)
  • -
-

Note this implies that any shared data access in connect_port may be -accessed concurrently. The plugin is responsible for any synchronisation -or locking necessary to make this possible.

-""" . - -ctx:audioContext a ctx:Context , lv2:Feature ; - rdfs:comment """The context of LV2_Descriptor.run().""" . - -ctx:messageContext a ctx:Context , lv2:Feature ; - lv2:documentation """ -

A non-realtime context for plugin control via message passing. This context -has a run method which takes a bitset of flags for parameters specifying which -input and output ports are valid before and after the run method has executed, -respectively (see LV2_Contexts_MessageContext).

-""" . - -ctx:idleContext a ctx:Context , lv2:Feature ; - rdfs:comment """ -A non-realtime idle context, periodically run by the host roughly every second. -This context never has any ports. -""" . - -ctx:requestRunFeature a lv2:Feature ; - lv2:documentation """ -

A feature allowing the plugin to request the execution of a particular -context at an arbitrary time. To support this feature, the host MUST pass an -LV2_Feature to instantiate with data pointing to a -LV2_Contexts_Request_Run_Feature.

- -

The plugin MAY call request_run with the given -data from any non-realtime context to demand soon-as-possible execution -of the specified context.

-""" . - -ctx:context a rdf:Property ; - rdfs:domain lv2:Port ; - rdfs:range ctx:Context ; - rdfs:label "is used in context" ; - rdfs:comment """ -The context a particular port is associated with; the port will only be -connected/read/written by that context. - -If no context is specified, the port is considered part of the default LV2 -audio context.""" . - - diff --git a/lv2/ns/ext/contexts/ext.pc.in b/lv2/ns/ext/contexts/ext.pc.in deleted file mode 120000 index 82b50df..0000000 --- a/lv2/ns/ext/contexts/ext.pc.in +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/ns/ext/contexts/manifest.ttl b/lv2/ns/ext/contexts/manifest.ttl deleted file mode 100644 index d2cc036..0000000 --- a/lv2/ns/ext/contexts/manifest.ttl +++ /dev/null @@ -1,9 +0,0 @@ -@prefix lv2: . -@prefix rdfs: . - - - a lv2:Specification ; - lv2:minorVersion 0 ; - lv2:microVersion 1 ; - rdfs:seeAlso . - diff --git a/lv2/ns/ext/contexts/test.c b/lv2/ns/ext/contexts/test.c deleted file mode 100644 index ca41a10..0000000 --- a/lv2/ns/ext/contexts/test.c +++ /dev/null @@ -1,67 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include "contexts.h" - -#define TEST_ASSERT(check) do {\ - if (!(check)) {\ - fprintf(stderr, "Failure at line %d: %s\n", __LINE__, #check);\ - assert(false);\ - _exit(1);\ - }\ -} while (0) - -#define NUM_PORTS 64 - -void -print_flags(void* flags) -{ - for (int i = NUM_PORTS; i >= 0; --i) - printf((lv2_contexts_port_is_valid(flags, i)) ? "1" : "0"); - printf("\n"); -} - - -int -main() -{ - uint64_t flags = 0; - print_flags(&flags); - - lv2_contexts_set_port_valid(&flags, 16); - print_flags(&flags); - for (int i = 0; i < NUM_PORTS; ++i) { - if (i == 16) { - TEST_ASSERT(lv2_contexts_port_is_valid(&flags, i)); - } else { - TEST_ASSERT(!lv2_contexts_port_is_valid(&flags, i)); - } - } - - lv2_contexts_set_port_valid(&flags, 46); - lv2_contexts_set_port_valid(&flags, 0); - print_flags(&flags); - for (int i = 0; i < NUM_PORTS; ++i) { - if (i == 0 || i == 16 || i == 46) { - TEST_ASSERT(lv2_contexts_port_is_valid(&flags, i)); - } else { - TEST_ASSERT(!lv2_contexts_port_is_valid(&flags, i)); - } - } - - lv2_contexts_unset_port_valid(&flags, 16); - print_flags(&flags); - for (int i = 0; i < NUM_PORTS; ++i) { - if (i == 0 || i == 46) { - TEST_ASSERT(lv2_contexts_port_is_valid(&flags, i)); - } else { - TEST_ASSERT(!lv2_contexts_port_is_valid(&flags, i)); - } - } - - return 0; -} - diff --git a/lv2/ns/ext/contexts/waf b/lv2/ns/ext/contexts/waf deleted file mode 120000 index b955110..0000000 --- a/lv2/ns/ext/contexts/waf +++ /dev/null @@ -1 +0,0 @@ -../../../../waf \ No newline at end of file diff --git a/lv2/ns/ext/contexts/wscript b/lv2/ns/ext/contexts/wscript deleted file mode 120000 index ec20a77..0000000 --- a/lv2/ns/ext/contexts/wscript +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.wscript \ No newline at end of file diff --git a/lv2/ns/ext/cv-port/cv-port.ttl b/lv2/ns/ext/cv-port/cv-port.ttl deleted file mode 100644 index 09016d6..0000000 --- a/lv2/ns/ext/cv-port/cv-port.ttl +++ /dev/null @@ -1,77 +0,0 @@ -# LV2 CV Port Extension -# Copyright 2011 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 cv: . -@prefix doap: . -@prefix foaf: . -@prefix lv2: . -@prefix rdf: . -@prefix rdfs: . - - - a lv2:Specification ; - doap:license ; - doap:name "LV2 CV Port" ; - doap:shortdesc "Control Voltage ports for LV2 plugins." ; - doap:maintainer [ - a foaf:Person ; - foaf:name "David Robillard" ; - foaf:homepage ; - rdfs:seeAlso - ] ; - lv2:documentation """ -

This extension defines Control Voltage (CV) ports, which are audio-rate -control ports like those used on classical voltage-controlled synthesizers. -These ports serve as control ports like lv2:ControlPort but can -also be used for audio-rate modulation of control signals. This enables many -types of processing and synthesis which are not possible with a lower control -rate.

-""" . - -cv:CVPort - a rdfs:Class ; - rdfs:label "CV Port" ; - rdfs:subClassOf lv2:Port ; - lv2:documentation """ - -

Ports of this type have identical semantics to lv2:AudioPort in terms of -buffer format and connection/input/output logistics. However, rather than the -buffer representing audio, the buffer represents audio-rate control data. A -CVPort SHOULD have the same properties a lv2:ControlPort typically -has to describe appropriate control values (e.g. lv2:minimum, lv2:maximum, lv2:default)

- -

Hosts SHOULD take care to prevent data from a CVPort port from being used as -audio except in cases where this is known to be safe.

- -

Example:

-
-<http://example.org/some-plugin>
-    lv2:port [
-        a cv:CVPort, lv2:InputPort ;
-        lv2:index 0 ;
-        lv2:minimum -1.0 ;
-        lv2:maximum 1.0 ;
-        lv2:default 0.0 ;
-        lv2:symbol "modulation" ;
-        lv2:name "Modulation" ;
-    ] .
-
-""" . diff --git a/lv2/ns/ext/cv-port/ext.pc.in b/lv2/ns/ext/cv-port/ext.pc.in deleted file mode 120000 index 82b50df..0000000 --- a/lv2/ns/ext/cv-port/ext.pc.in +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/ns/ext/cv-port/manifest.ttl b/lv2/ns/ext/cv-port/manifest.ttl deleted file mode 100644 index e5fa145..0000000 --- a/lv2/ns/ext/cv-port/manifest.ttl +++ /dev/null @@ -1,9 +0,0 @@ -@prefix lv2: . -@prefix rdfs: . - - - a lv2:Specification ; - lv2:minorVersion 0 ; - lv2:microVersion 1 ; - rdfs:seeAlso . - diff --git a/lv2/ns/ext/cv-port/waf b/lv2/ns/ext/cv-port/waf deleted file mode 120000 index b955110..0000000 --- a/lv2/ns/ext/cv-port/waf +++ /dev/null @@ -1 +0,0 @@ -../../../../waf \ No newline at end of file diff --git a/lv2/ns/ext/cv-port/wscript b/lv2/ns/ext/cv-port/wscript deleted file mode 120000 index ec20a77..0000000 --- a/lv2/ns/ext/cv-port/wscript +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.wscript \ No newline at end of file diff --git a/lv2/ns/ext/data-access/data-access.h b/lv2/ns/ext/data-access/data-access.h deleted file mode 100644 index fac6974..0000000 --- a/lv2/ns/ext/data-access/data-access.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - LV2 Data Access Extension - Copyright 2008-2011 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. -*/ - -/** - @file data-access.h - C header for the LV2 Extension Data extension - . - - This extension defines a method for (e.g.) plugin UIs to have (possibly - marshalled) access to the extension_data function on a plugin instance. -*/ - -#ifndef LV2_DATA_ACCESS_H -#define LV2_DATA_ACCESS_H - -#define LV2_DATA_ACCESS_URI "http://lv2plug.in/ns/ext/data-access" - -/** - The data field of the LV2_Feature for this extension. - - To support this feature the host must pass an LV2_Feature struct to the - instantiate method with URI "http://lv2plug.in/ns/ext/data-access" - and data pointed to an instance of this struct. -*/ -typedef struct { - /** - A pointer to a method the UI can call to get data (of a type specified - by some other extension) from the plugin. - - This call never is never guaranteed to return anything, UIs should - degrade gracefully if direct access to the plugin data is not possible - (in which case this function will return NULL). - - This is for access to large data that can only possibly work if the UI - and plugin are running in the same process. For all other things, use - the normal LV2 UI communication system. - */ - const void* (*data_access)(const char* uri); - -} LV2_Extension_Data_Feature; - -#endif /* LV2_DATA_ACCESS_H */ diff --git a/lv2/ns/ext/data-access/data-access.ttl b/lv2/ns/ext/data-access/data-access.ttl deleted file mode 100644 index 6b0d817..0000000 --- a/lv2/ns/ext/data-access/data-access.ttl +++ /dev/null @@ -1,82 +0,0 @@ -# LV2 Data Access Extension -# Copyright 2008-2011 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 da: . -@prefix dcs: . -@prefix doap: . -@prefix foaf: . -@prefix lv2: . -@prefix lv2ev: . -@prefix rdf: . -@prefix rdfs: . - - - a foaf:Person ; - foaf:name "David Robillard" ; - foaf:homepage ; - foaf:mbox ; - rdfs:seeAlso . - - - a lv2:Specification , - doap:Project ; - doap:license ; - doap:name "LV2 Data Access" ; - doap:shortdesc "Provides access to LV2_Descriptor::extension_data()." ; - doap:developer ; - doap:release [ - doap:revision "1.4" ; - doap:created "2011-11-21" ; - doap:file-release ; - dcs:blame ; - dcs:changeset [ - dcs:item [ - rdfs:label "Update packaging." - ] , [ - rdfs:label "Improve documentation." - ] - ] - ] , [ - doap:revision "1.2" ; - doap:created "2011-05-26" ; - doap:file-release ; - dcs:blame ; - dcs:changeset [ - dcs:item [ - rdfs:label "Add build system for installation." - ] , [ - rdfs:label "Switch to ISC license." - ] - ] - ] , [ - doap:revision "1.0" ; - doap:created "2010-10-04" ; - doap:file-release ; - dcs:blame ; - dcs:changeset [ - dcs:item [ - rdfs:label "Initial release." - ] - ] - ] ; - lv2:documentation """ -

This extension defines a feature, LV2_Extension_Data_Feature, which provides -access to LV2_Descriptor::extension_data() for plugin UIs or other potentially -remote users of a plugin.

- -

To support this feature the host must pass an LV2_Feature struct to the -instantiate method with URI LV2_DATA_ACCESS_URI and data pointed to an instance -of LV2_Extension_Data_Feature.

-""" . \ No newline at end of file diff --git a/lv2/ns/ext/data-access/ext.pc.in b/lv2/ns/ext/data-access/ext.pc.in deleted file mode 120000 index 82b50df..0000000 --- a/lv2/ns/ext/data-access/ext.pc.in +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/ns/ext/data-access/manifest.ttl b/lv2/ns/ext/data-access/manifest.ttl deleted file mode 100644 index f7ccd9d..0000000 --- a/lv2/ns/ext/data-access/manifest.ttl +++ /dev/null @@ -1,9 +0,0 @@ -@prefix lv2: . -@prefix rdfs: . - - - a lv2:Specification ; - lv2:minorVersion 1 ; - lv2:microVersion 4 ; - rdfs:seeAlso . - diff --git a/lv2/ns/ext/data-access/waf b/lv2/ns/ext/data-access/waf deleted file mode 120000 index b955110..0000000 --- a/lv2/ns/ext/data-access/waf +++ /dev/null @@ -1 +0,0 @@ -../../../../waf \ No newline at end of file diff --git a/lv2/ns/ext/data-access/wscript b/lv2/ns/ext/data-access/wscript deleted file mode 120000 index ec20a77..0000000 --- a/lv2/ns/ext/data-access/wscript +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.wscript \ No newline at end of file diff --git a/lv2/ns/ext/dynmanifest/dynmanifest.h b/lv2/ns/ext/dynmanifest/dynmanifest.h deleted file mode 100644 index 51908b7..0000000 --- a/lv2/ns/ext/dynmanifest/dynmanifest.h +++ /dev/null @@ -1,144 +0,0 @@ -/* - Dynamic manifest specification for LV2 - Copyright 2008-2011 Stefano D'Angelo - - 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 dynmanifest.h - C header for the LV2 Dynamic Manifest extension - . - Revision: 1.2 -*/ - -#ifndef LV2_DYN_MANIFEST_H_INCLUDED -#define LV2_DYN_MANIFEST_H_INCLUDED - -#include - -#include "lv2/lv2plug.in/ns/lv2core/lv2.h" - -#define LV2_DYN_MANIFEST_URI "http://lv2plug.in/ns/ext/dynmanifest" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - Dynamic manifest generator handle. - - This handle indicates a particular status of a dynamic manifest generator. - The host MUST NOT attempt to interpret it and, unlikely LV2_Handle, it is - NOT even valid to compare this to NULL. The dynamic manifest generator MAY - use it to reference internal data. -*/ -typedef void * LV2_Dyn_Manifest_Handle; - -/** - Generate the dynamic manifest. - - @param handle Pointer to an uninitialized dynamic manifest generator handle. - - @param features NULL terminated array of LV2_Feature structs which represent - the features the host supports. The dynamic manifest generator may refuse to - (re)generate the dynamic manifest if required features are not found here - (however hosts SHOULD NOT use this as a discovery mechanism, instead of - reading the static manifest file). This array must always exist; if a host - has no features, it MUST pass a single element array containing NULL. - - @return 0 on success, otherwise a non-zero error code. The host SHOULD - evaluate the result of the operation by examining the returned value and - MUST NOT try to interpret the value of handle. -*/ -int lv2_dyn_manifest_open(LV2_Dyn_Manifest_Handle * handle, - const LV2_Feature *const * features); - -/** - Fetch a "list" of subject URIs described in the dynamic manifest. - - The dynamic manifest generator has to fill the resource only with the needed - triples to make the host aware of the "objects" it wants to expose. For - example, if the plugin library exposes a regular LV2 plugin, it should - output only a triple like the following: - - a lv2:Plugin . - - The objects that are elegible for exposure are those that would need to be - represented by a subject node in a static manifest. - - @param handle Dynamic manifest generator handle. - - @param fp FILE * identifying the resource the host has to set up for the - dynamic manifest generator. The host MUST pass a writable, empty resource to - this function, and the dynamic manifest generator MUST ONLY perform write - operations on it at the end of the stream (e.g., using only fprintf(), - fwrite() and similar). - - @return 0 on success, otherwise a non-zero error code. -*/ -int lv2_dyn_manifest_get_subjects(LV2_Dyn_Manifest_Handle handle, - FILE * fp); - -/** - Function that fetches data related to a specific URI. - - The dynamic manifest generator has to fill the resource with data related to - object represented by the given URI. For example, if the library exposes a - regular LV2 plugin whose URI, as retrieved by the host using - lv2_dyn_manifest_get_subjects() is http://www.example.com/plugin/uri, it - should output something like: - -
-   
-       a lv2:Plugin ;
-       doap:name "My Plugin" ;
-       lv2:binary  ;
-       etc:etc "..." .
-   
- - @param handle Dynamic manifest generator handle. - - @param fp FILE * identifying the resource the host has to set up for the - dynamic manifest generator. The host MUST pass a writable resource to this - function, and the dynamic manifest generator MUST ONLY perform write - operations on it at the current position of the stream (e.g. using only - fprintf(), fwrite() and similar). - - @param uri URI to get data about (in the "plain" form, i.e., absolute URI - without Turtle prefixes). - - @return 0 on success, otherwise a non-zero error code. -*/ -int lv2_dyn_manifest_get_data(LV2_Dyn_Manifest_Handle handle, - FILE * fp, - const char * uri); - -/** - Function that ends the operations on the dynamic manifest generator. - - This function SHOULD be used by the dynamic manifest generator to perform - cleanup operations, etc. - - Once this function is called, referring to handle will cause undefined - behavior. - - @param handle Dynamic manifest generator handle. -*/ -void lv2_dyn_manifest_close(LV2_Dyn_Manifest_Handle handle); - -#ifdef __cplusplus -} -#endif - -#endif /* LV2_DYN_MANIFEST_H_INCLUDED */ diff --git a/lv2/ns/ext/dynmanifest/dynmanifest.ttl b/lv2/ns/ext/dynmanifest/dynmanifest.ttl deleted file mode 100644 index 2054a17..0000000 --- a/lv2/ns/ext/dynmanifest/dynmanifest.ttl +++ /dev/null @@ -1,107 +0,0 @@ -# LV2 Dynamic Manifest Extension -# Copyright 2008-2011 Stefano D'Angelo -# -# 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 dman: . -@prefix doap: . -@prefix foaf: . -@prefix lv2: . -@prefix owl: . -@prefix rdf: . -@prefix rdfs: . -@prefix xsd: . - - - a lv2:Specification ; - lv2:documentation """ -

The LV2 API, on its own, cannot be used to write plugin libraries where data -is dynamically generated at runtime (e.g. API wrappers), since LV2 requires -needed information to be provided in one or more static data (RDF) files. This -API addresses this limitation by extending the LV2 API.

- -

To detect that a plugin library implements a dynamic manifest generator, -the host checks its static manifest for a description like:

- -
-<http://example.org/my-dynamic-manifest>
-    a dman:DynManifest ;
-    lv2:binary <mydynmanifest.so> .
-
- -

To load the data, the host loads the library -(e.g. mydynmanifest.so) as usual and fetches the dynamic Turtle -data from it using this API.

- -

The host is allowed to request regeneration of the dynamic manifest multiple -times, and the plugin library is expected to provide updated data if/when -possible. All data and references provided via this API before the last -regeneration of the dynamic manifest is to be considered invalid by the host, -including plugin descriptors whose URIs were discovered using this API.

- -

Accessing Data

- -

Whenever a host wants to access data using this API, it could:

- -
    -
  1. Call lv2_dyn_manifest_open().
  2. -
  3. Create a FILE for functions to write data to (e.g. using tmpfile()).
  4. -
  5. Get a list of exposed subject URIs using - lv2_dyn_manifest_get_subjects().
  6. -
  7. Call lv2_dyn_manifest_get_data() for each URI of interest to - get the data related to that URI (which can be written to any FILE).
  8. -
  9. Call lv2_dyn_manifest_close().
  10. -
  11. Parse the content of the FILE(s).
  12. -
  13. Free/delete/unlink the FILE(s).
  14. -
- -

Each call to the above mentioned dynamic manifest functions MUST write a -complete, valid Turtle document (including all needed prefix definitions) to -the output FILE.

- -

Each call to lv2_dyn_manifest_open() causes the (re)generation of the -dynamic manifest data, and invalidates all data fetched before the call.

- -

In case the plugin library uses this same API to access other dynamic -manifests, it MUST implement some mechanism to avoid potentially endless loops -(such as A loads B, B loads A, etc.) and, in case such a loop is detected, the -operation MUST fail. For this purpose, use of a static boolean flag is -suggested.

- -

Threading Rules

- -

All of the functions defined by this specification belong to the Discovery -class.

-""" . - -dman:DynManifest - a rdfs:Class ; - rdfs:subClassOf lv2:Resource ; - rdfs:label "Dynamic manifest generator" ; - rdfs:subClassOf [ - a owl:Restriction ; - owl:onProperty lv2:binary ; - owl:minCardinality 1 ; - rdfs:comment """ -A DynManifest MUST have at least 1 lv2:binary, which MUST implement all the -functions defined in dynmanifest.h. -""" - ] ; - rdfs:comment """ -The class which represents a dynamic manifest generator. - -There MUST NOT be any instances of dman:DynManifest in the generated manifest. - -All relative URIs in the generated data MUST be relative to the base path -that would be used to parse a normal LV2 manifest (the bundle path). -""" . diff --git a/lv2/ns/ext/dynmanifest/ext.pc.in b/lv2/ns/ext/dynmanifest/ext.pc.in deleted file mode 120000 index 82b50df..0000000 --- a/lv2/ns/ext/dynmanifest/ext.pc.in +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/ns/ext/dynmanifest/lv2-dynmanifest.doap.ttl b/lv2/ns/ext/dynmanifest/lv2-dynmanifest.doap.ttl deleted file mode 100644 index 6c4d985..0000000 --- a/lv2/ns/ext/dynmanifest/lv2-dynmanifest.doap.ttl +++ /dev/null @@ -1,43 +0,0 @@ -@prefix dcs: . -@prefix doap: . -@prefix foaf: . -@prefix rdfs: . - - - a foaf:Person ; - foaf:name "David Robillard" ; - foaf:homepage ; - foaf:mbox ; - rdfs:seeAlso . - - - a doap:Project ; - doap:license ; - doap:name "LV2 Dynamic Manifest" ; - doap:homepage ; - doap:created "2009-06-13" ; - doap:shortdesc "Support for dynamic data generation." ; - doap:programming-language "C" ; - doap:developer [ - a foaf:Person ; - foaf:name "Stefano D'Angelo" - ] ; - doap:release [ - doap:revision "1.2" ; - doap:created "2011-11-21" ; - dcs:blame ; - dcs:changeset [ - dcs:item [ - rdfs:label "Improve documentation." - ] - ] - ] , [ - doap:revision "1.0" ; - doap:created "2010-04-10" ; - dcs:blame ; - dcs:changeset [ - dcs:item [ - rdfs:label "Initial release." - ] - ] - ] . diff --git a/lv2/ns/ext/dynmanifest/manifest.ttl b/lv2/ns/ext/dynmanifest/manifest.ttl deleted file mode 100644 index cc5a83d..0000000 --- a/lv2/ns/ext/dynmanifest/manifest.ttl +++ /dev/null @@ -1,9 +0,0 @@ -@prefix lv2: . -@prefix rdfs: . - - - a lv2:Specification ; - lv2:minorVersion 1 ; - lv2:microVersion 2 ; - rdfs:seeAlso , - . diff --git a/lv2/ns/ext/dynmanifest/waf b/lv2/ns/ext/dynmanifest/waf deleted file mode 120000 index b955110..0000000 --- a/lv2/ns/ext/dynmanifest/waf +++ /dev/null @@ -1 +0,0 @@ -../../../../waf \ No newline at end of file diff --git a/lv2/ns/ext/dynmanifest/wscript b/lv2/ns/ext/dynmanifest/wscript deleted file mode 120000 index ec20a77..0000000 --- a/lv2/ns/ext/dynmanifest/wscript +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.wscript \ No newline at end of file diff --git a/lv2/ns/ext/event/event-helpers.h b/lv2/ns/ext/event/event-helpers.h deleted file mode 100644 index 75ba14b..0000000 --- a/lv2/ns/ext/event/event-helpers.h +++ /dev/null @@ -1,246 +0,0 @@ -/* lv2_event_helpers.h - Helper functions for the LV2 events extension. - * - * Copyright (C) 2008-2009 David Robillard - * - * This header is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published - * by the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This header is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public - * License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this header; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place, Suite 330, Boston, MA 01222-1307 USA - */ - -#ifndef LV2_EVENT_HELPERS_H -#define LV2_EVENT_HELPERS_H - -#include -#include -#include -#include -#include -#include "lv2/lv2plug.in/ns/ext/event/event.h" - -/** @file - * Helper functions for the LV2 Event extension - * . - * - * 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 (size + 7) & (~7); -} - - -/** 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; - } else { - 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 (e.g. RW Lock). */ -typedef struct { - LV2_Event_Buffer* buf; - uint32_t offset; -} LV2_Event_Iterator; - - -/** Reset an iterator to point to the start of @a buf. - * @return True if @a 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 @a iter is valid. - * @return True if @a iter is valid, otherwise false (past end of buffer) */ -static inline bool -lv2_event_is_valid(LV2_Event_Iterator* iter) -{ - return (iter->offset < iter->buf->size); -} - - -/** Advance @a iter forward one event. - * @a iter must be valid. - * @return True if @a iter is valid, otherwise false (reached end of buffer) */ -static inline bool -lv2_event_increment(LV2_Event_Iterator* iter) -{ - assert(lv2_event_is_valid(iter)); - - LV2_Event* const ev = (LV2_Event*)( - (uint8_t*)iter->buf->data + iter->offset); - - iter->offset += lv2_event_pad_size(sizeof(LV2_Event) + ev->size); - - return true; -} - - -/** Dereference an event iterator (get the event currently pointed at). - * @a iter must be valid. - * @a data if non-NULL, will be set to point to the contents of the event - * returned. - * @return A Pointer to the event @a iter is currently pointing at, or NULL - * if the end of the buffer is reached (in which case @a data is - * also set to NULL). */ -static inline LV2_Event* -lv2_event_get(LV2_Event_Iterator* iter, - uint8_t** data) -{ - assert(lv2_event_is_valid(iter)); - - LV2_Event* const ev = (LV2_Event*)( - (uint8_t*)iter->buf->data + iter->offset); - - if (data) - *data = (uint8_t*)ev + sizeof(LV2_Event); - - return ev; -} - - -/** Write an event at @a iter. - * The event (if any) pointed to by @a iter will be overwritten, and @a 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->capacity - iter->buf->size < sizeof(LV2_Event) + size) - return false; - - LV2_Event* const ev = (LV2_Event*)( - (uint8_t*)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(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) -{ - size = lv2_event_pad_size(size); - if (iter->buf->capacity - iter->buf->size < sizeof(LV2_Event) + size) - return NULL; - - LV2_Event* const ev = (LV2_Event*)((uint8_t*)iter->buf->data + - iter->offset); - - ev->frames = frames; - ev->subframes = subframes; - ev->type = type; - ev->size = size; - ++iter->buf->event_count; - - size = lv2_event_pad_size(sizeof(LV2_Event) + size); - iter->buf->size += size; - iter->offset += size; - - return (uint8_t*)ev + sizeof(LV2_Event); -} - - -/** Write an event at @a iter. - * The event (if any) pointed to by @a iter will be overwritten, and @a 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) -{ - if (iter->buf->capacity - iter->buf->size < sizeof(LV2_Event) + ev->size) - return false; - - LV2_Event* const write_ev = (LV2_Event*)( - (uint8_t*)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 size = lv2_event_pad_size(sizeof(LV2_Event) + ev->size); - iter->buf->size += size; - iter->offset += size; - - return true; -} - -#endif /* LV2_EVENT_HELPERS_H */ - diff --git a/lv2/ns/ext/event/event.h b/lv2/ns/ext/event/event.h deleted file mode 100644 index 2c340ba..0000000 --- a/lv2/ns/ext/event/event.h +++ /dev/null @@ -1,281 +0,0 @@ -/* - LV2 Event Extension - Copyright 2008-2011 David Robillard - Copyright 2006-2007 Lars Luthman - - 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_EVENT_H -#define LV2_EVENT_H - -#define LV2_EVENT_URI "http://lv2plug.in/ns/ext/event" -#define LV2_EVENT_AUDIO_STAMP 0 - -#include - -/** - @file event.h - C API for the LV2 Event extension . - - This extension is a generic transport mechanism for time stamped events - of any type (e.g. MIDI, OSC, ramps, etc). Each port can transport mixed - events of any type; the type of events and timestamps are defined by a URI - which is mapped to an integer by the host for performance reasons. - - This extension requires the host to support the LV2 URI Map extension. - Any host which supports this extension MUST guarantee that any call to - the LV2 URI Map uri_to_id function with the URI of this extension as the - 'map' argument returns a value within the range of uint16_t. -*/ - -/** - 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. -*/ -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) -*/ -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 (e.g. 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 | ... -*/ -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. -*/ -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. -*/ -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 @a 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 @a 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; - - -#endif /* LV2_EVENT_H */ diff --git a/lv2/ns/ext/event/event.ttl b/lv2/ns/ext/event/event.ttl deleted file mode 100644 index 67285aa..0000000 --- a/lv2/ns/ext/event/event.ttl +++ /dev/null @@ -1,224 +0,0 @@ -# LV2 Event Extension -# Copyright 2008-2011 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 dcs: . -@prefix doap: . -@prefix ev: . -@prefix foaf: . -@prefix lv2: . -@prefix owl: . -@prefix rdf: . -@prefix rdfs: . - - - a foaf:Person ; - foaf:name "David Robillard" ; - foaf:homepage ; - foaf:mbox ; - rdfs:seeAlso . - -_:larsl - a foaf:Person ; - foaf:name "Lars Luthman" . - - - a lv2:Specification ; - doap:license ; - doap:name "LV2 Event" ; - doap:shortdesc "A port-based real-time generic event interface." ; - rdfs:seeAlso ; - doap:release [ - doap:revision "1.4" ; - doap:created "2011-11-21" ; - doap:file-release ; - dcs:blame ; - dcs:changeset [ - dcs:item [ - rdfs:label "Update packaging." - ] - ] - ] , [ - doap:revision "1.2" ; - doap:created "2011-05-26" ; - doap:file-release ; - dcs:blame ; - 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 ; - dcs:blame ; - dcs:changeset [ - dcs:item [ - rdfs:label "Initial release." - ] - ] - ] ; - doap:developer , - _:larsl ; - lv2:documentation """ -

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:

-
-<http://example.org/some-plugin>
-    lv2:port [
-        a ev:EventPort, lv2:InputPort ;
-        lv2:index 0 ;
-        ev:supportsEvent <http://lv2plug.in/ns/ext/midi#MidiEvent> ;
-        lv2:symbol "midi_input" ;
-        lv2:name "MIDI input" ;
-    ] .
-
-""" . - -ev:EventPort - a rdfs:Class ; - rdfs:label "Event port" ; - rdfs:subClassOf lv2:Port ; - rdfs:comment """ -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. -""" . - -ev:Event - a rdfs:Class ; - rdfs:label "LV2 event" ; - rdfs:comment """ -A single generic time-stamped event. - -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 (e.g. MIDI, OSC) are defined by extensions, and should -be rdfs:subClassOf this class. -""" . - -ev:TimeStamp - a rdfs:Class ; - rdfs:label "LV2 event time stamp" ; - rdfs:comment """ -The time stamp of an Event. - -This defines the meaning of the 'frames' and 'subframes' fields of an -LV2_Event (both unsigned 32-bit integers). -""" . - -ev:FrameStamp - a rdfs:Class ; - rdfs:subClassOf ev:TimeStamp ; - rdfs:label "Audio frame time stamp" ; - rdfs:comment """ -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. -""" . - -ev:generic - a lv2:PortProperty ; - rdfs:label "Generic event port" ; - rdfs:comment """ -Indicates that this port does something meaningful for any event type -(e.g. event mixers, delays, serialisers, etc). 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. -""" . - -ev:supportsEvent - a rdf:Property ; - rdfs:domain lv2:Port ; - rdfs:range ev:Event ; - rdfs:label "Supports event type" ; - rdfs:comment """ -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 (e.g. 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. -""" . - -ev:inheritsEvent - a rdf:Property ; - rdfs:domain lv2:Port ; - rdfs:range lv2:Port ; - rdfs:label "Inherits event type" ; - rdfs:comment """ -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. -""" . - -ev:supportsTimeStamp - a rdf:Property ; - rdfs:domain lv2:Port ; - rdfs:range ev:TimeStamp ; - rdfs:label "Supports time stamp type" ; - rdfs:comment """ -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. -""" . - -ev:generatesTimeStamp - a rdf:Property ; - rdfs:domain lv2:Port ; - rdfs:range ev:TimeStamp ; - rdfs:label "Outputs time stamp type" ; - rdfs:comment """ -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. -""" . - -ev:inheritsTimeStamp - a rdf:Property ; - rdfs:domain lv2:Port ; - rdfs:range lv2:Port ; - rdfs:label "Inherits time stamp type" ; - rdfs:comment """ -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. -""" . diff --git a/lv2/ns/ext/event/ext.pc.in b/lv2/ns/ext/event/ext.pc.in deleted file mode 120000 index 82b50df..0000000 --- a/lv2/ns/ext/event/ext.pc.in +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/ns/ext/event/manifest.ttl b/lv2/ns/ext/event/manifest.ttl deleted file mode 100644 index fa12f94..0000000 --- a/lv2/ns/ext/event/manifest.ttl +++ /dev/null @@ -1,9 +0,0 @@ -@prefix lv2: . -@prefix rdfs: . - - - a lv2:Specification ; - lv2:minorVersion 1 ; - lv2:microVersion 4 ; - rdfs:seeAlso . - diff --git a/lv2/ns/ext/event/waf b/lv2/ns/ext/event/waf deleted file mode 120000 index b955110..0000000 --- a/lv2/ns/ext/event/waf +++ /dev/null @@ -1 +0,0 @@ -../../../../waf \ No newline at end of file diff --git a/lv2/ns/ext/event/wscript b/lv2/ns/ext/event/wscript deleted file mode 120000 index ec20a77..0000000 --- a/lv2/ns/ext/event/wscript +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.wscript \ No newline at end of file diff --git a/lv2/ns/ext/host-info/ext.pc.in b/lv2/ns/ext/host-info/ext.pc.in deleted file mode 120000 index 82b50df..0000000 --- a/lv2/ns/ext/host-info/ext.pc.in +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/ns/ext/host-info/host-info.ttl b/lv2/ns/ext/host-info/host-info.ttl deleted file mode 100644 index 4f563bb..0000000 --- a/lv2/ns/ext/host-info/host-info.ttl +++ /dev/null @@ -1,117 +0,0 @@ -# LV2 Host Info Extension -# Copyright (C) 2009 David Robillard -# -# Permission is hereby granted, free of charge, to any person obtaining a -# copy of this software and associated documentation files (the "Software"), -# to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, -# and/or sell copies of the Software, and to permit persons to whom the -# Software is furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR -# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -# OTHER DEALINGS IN THE SOFTWARE. - -@prefix hi: . -@prefix lv2: . -@prefix rdf: . -@prefix rdfs: . -@prefix owl: . -@prefix xsd: . -@prefix doap: . -@prefix foaf: . -@prefix amb: . - - a lv2:Specification ; - doap:license ; - doap:name "LV2 Host Info" ; - doap:shortdesc "A format for describing LV2 hosts." ; - doap:maintainer [ - a foaf:Person ; - foaf:name "David Robillard" ; - foaf:homepage ; - rdfs:seeAlso - ] ; - lv2:documentation """ -

This specification defines various properties to represent useful information -about LV2 hosts. Currently, the primary use of this specification is to describe which -extensions are supported by a given host.

- -

The extensions supported by a host can be described like this:

-
-@prefix hi: <http://lv2plug.in/ns/ext/host-info#> .
-
-<http://example.org/some-host>
-    a hi:Host ;
-    doap:name "Foo Rack" ;
-    hi:supportsExtension [
-        hi:extension <http://example.org/some-extension> ;
-        hi:sinceVersion "1.2.0"
-    ] .
-
-""" . - - -## Core Classes / Properties - -hi:Host a rdfs:Class ; - rdfs:label "LV2 Host" ; - rdfs:subClassOf [ a owl:Restriction ; - owl:onProperty doap:name ; - owl:someValuesFrom xsd:string ; - owl:minCardinality 1 ; - rdfs:comment "A hi:Host MUST have at least one string doap:name" - ] ; - rdfs:comment """ -An application that supports loading LV2 plugins, or performs other -LV2 related functionality. -""" . - -hi:supportsExtension a rdf:Property ; - rdfs:domain hi:Host ; - rdfs:range hi:ExtensionSupport ; - rdfs:label "supports extension" ; - rdfs:comment "Relates a Host to its ExtensionSupport" . - -hi:ExtensionSupport a rdfs:Class ; - rdfs:label "Extension Support" ; - rdfs:subClassOf [ a owl:Restriction ; - owl:onProperty hi:sinceVersion ; - owl:someValuesFrom xsd:string ; - owl:minCardinality 1 ; - rdfs:comment """ -A hi:ExtensionSupport MUST have at least one string hi:sinceVersion -""" ] ; - rdfs:comment "A description of the support for an extension by a Host" . - -hi:extension a rdf:Property ; - rdfs:domain hi:ExtensionSupport ; - rdfs:range lv2:Specification ; - rdfs:label "extension" ; - rdfs:comment "Indicates the extension supported by a host." . - -hi:sinceVersion a rdf:Property ; - rdfs:domain hi:ExtensionSupport ; - rdfs:range xsd:string ; - rdfs:label "since version" ; - rdfs:comment """ -The initial version of a host which supported an extension. -This property MUST always be given -""" . - -hi:untilVersion a rdf:Property ; - rdfs:domain hi:ExtensionSupport ; - rdfs:range xsd:string ; - rdfs:label "until version" ; - rdfs:comment """ -The final version of a host which supported an extension. This property can -be used if support for an extension was discontinued in a host for some reason. -""" . - diff --git a/lv2/ns/ext/host-info/manifest.ttl b/lv2/ns/ext/host-info/manifest.ttl deleted file mode 100644 index ae1e097..0000000 --- a/lv2/ns/ext/host-info/manifest.ttl +++ /dev/null @@ -1,9 +0,0 @@ -@prefix lv2: . -@prefix rdfs: . - - - a lv2:Specification ; - lv2:minorVersion 0 ; - lv2:microVersion 1 ; - rdfs:seeAlso . - diff --git a/lv2/ns/ext/host-info/waf b/lv2/ns/ext/host-info/waf deleted file mode 120000 index b955110..0000000 --- a/lv2/ns/ext/host-info/waf +++ /dev/null @@ -1 +0,0 @@ -../../../../waf \ No newline at end of file diff --git a/lv2/ns/ext/host-info/wscript b/lv2/ns/ext/host-info/wscript deleted file mode 120000 index ec20a77..0000000 --- a/lv2/ns/ext/host-info/wscript +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.wscript \ No newline at end of file diff --git a/lv2/ns/ext/instance-access/ext.pc.in b/lv2/ns/ext/instance-access/ext.pc.in deleted file mode 120000 index 82b50df..0000000 --- a/lv2/ns/ext/instance-access/ext.pc.in +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/ns/ext/instance-access/instance-access.h b/lv2/ns/ext/instance-access/instance-access.h deleted file mode 100644 index 7e18ee4..0000000 --- a/lv2/ns/ext/instance-access/instance-access.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - LV2 Instance Access Extension - Copyright 2008-2011 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_INSTANCE_ACCESS_H -#define LV2_INSTANCE_ACCESS_H - -#define LV2_INSTANCE_ACCESS_URI "http://lv2plug.in/ns/ext/instance-access" - - -/** @file - * C header for the LV2 Instance Access extension - * . - * - * This extension defines a method for (e.g.) plugin UIs to get a direct - * handle to an LV2 plugin instance (LV2_Handle), if possible. - * - * To support this feature the host must pass an LV2_Feature struct to the - * UI instantiate method with URI "http://lv2plug.in/ns/ext/instance-access" - * and data pointed directly to the LV2_Handle of the plugin instance. - */ - - -#endif /* LV2_INSTANCE_ACCESS_H */ - diff --git a/lv2/ns/ext/instance-access/instance-access.ttl b/lv2/ns/ext/instance-access/instance-access.ttl deleted file mode 100644 index 14eb732..0000000 --- a/lv2/ns/ext/instance-access/instance-access.ttl +++ /dev/null @@ -1,80 +0,0 @@ -# LV2 Instance Access Extension -# Copyright 2008-2011 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 dcs: . -@prefix doap: . -@prefix foaf: . -@prefix ia: . -@prefix lv2: . -@prefix lv2ev: . -@prefix rdf: . -@prefix rdfs: . - - - a foaf:Person ; - foaf:name "David Robillard" ; - foaf:homepage ; - foaf:mbox ; - rdfs:seeAlso . - - - a lv2:Specification ; - doap:license ; - doap:name "LV2 Instance Access" ; - doap:shortdesc "Provides access to the LV2_Handle of a plugin." ; - doap:developer ; - doap:release [ - doap:revision "1.4" ; - doap:created "2011-11-21" ; - doap:file-release ; - dcs:blame ; - dcs:changeset [ - dcs:item [ - rdfs:label "Update packaging." - ] , [ - rdfs:label "Improve documentation." - ] - ] - ] , [ - doap:revision "1.2" ; - doap:created "2011-05-26" ; - doap:file-release ; - dcs:blame ; - dcs:changeset [ - dcs:item [ - rdfs:label "Add build system for installation." - ] , [ - rdfs:label "Switch to ISC license." - ] - ] - ] , [ - doap:revision "1.0" ; - doap:created "2010-10-04" ; - doap:file-release ; - dcs:blame ; - dcs:changeset [ - dcs:item [ - rdfs:label "Initial release." - ] - ] - ] ; - lv2:documentation """ -

This extension defines a feature which allows plugin UIs to get a direct -handle to an LV2 plugin instance (LV2_Handle), if possible.

- -

To support this feature the host must pass an LV2_Feature struct to the UI -instantiate method with URI LV2_INSTANCE_ACCESS_URI and data pointed directly -to the LV2_Handle of the plugin instance.

-""" . diff --git a/lv2/ns/ext/instance-access/manifest.ttl b/lv2/ns/ext/instance-access/manifest.ttl deleted file mode 100644 index d6412c5..0000000 --- a/lv2/ns/ext/instance-access/manifest.ttl +++ /dev/null @@ -1,9 +0,0 @@ -@prefix lv2: . -@prefix rdfs: . - - - a lv2:Specification ; - lv2:minorVersion 1 ; - lv2:microVersion 4 ; - rdfs:seeAlso . - diff --git a/lv2/ns/ext/instance-access/waf b/lv2/ns/ext/instance-access/waf deleted file mode 120000 index b955110..0000000 --- a/lv2/ns/ext/instance-access/waf +++ /dev/null @@ -1 +0,0 @@ -../../../../waf \ No newline at end of file diff --git a/lv2/ns/ext/instance-access/wscript b/lv2/ns/ext/instance-access/wscript deleted file mode 120000 index ec20a77..0000000 --- a/lv2/ns/ext/instance-access/wscript +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.wscript \ No newline at end of file diff --git a/lv2/ns/ext/log/ext.pc.in b/lv2/ns/ext/log/ext.pc.in deleted file mode 120000 index 82b50df..0000000 --- a/lv2/ns/ext/log/ext.pc.in +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/ns/ext/log/log.h b/lv2/ns/ext/log/log.h deleted file mode 100644 index c139a27..0000000 --- a/lv2/ns/ext/log/log.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - 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. -*/ - -/** - @file log.h C header for the LV2 Log extension - . -*/ - -#ifndef LV2_LOG_H -#define LV2_LOG_H - -#define LV2_LOG_URI "http://lv2plug.in/ns/ext/log" -#define LV2_LOG_LOG_URI LV2_LOG_URI "#log" -#define LV2_LOG_ERROR_URI LV2_LOG_URI "#Error" -#define LV2_LOG_INFO_URI LV2_LOG_URI "#Info" -#define LV2_LOG_WARN_URI LV2_LOG_URI "#Warn" - -#include - -#include "lv2/lv2plug.in/ns/ext/urid/urid.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef __GNUC__ -/** Allow type checking of printf-like functions. */ -# define LV2_LOG_FUNC(fmt, arg1) __attribute__((format(printf, fmt, arg1))) -#else -# define LV2_LOG_FUNC -#endif - -/** - Opaque data to host data for LV2_Log_Log. -*/ -typedef void* LV2_Log_Handle; - -/** - Log (http://lv2plug.in/ns/ext/log#log). -*/ -typedef struct _LV2_Log { - /** - Opaque pointer to host data. - - This MUST be passed to methods in this struct henever they are called. - Otherwise, it must not be interpreted in any way. - */ - LV2_Log_Handle handle; - - /** - Log a message, passing format parameters directly. - - The API of this function matches that of the standard C printf - function, except for the addition of the first two parameters. - */ - LV2_LOG_FUNC(3, 4) - int (*printf)(LV2_Log_Handle handle, - LV2_URID level, - const char* fmt, ...); - - /** - Log a message, passing format parameters in a va_list. - - The API of this function matches that of the standard C vprintf - function, except for the addition of the first two parameters. - */ - LV2_LOG_FUNC(3, 0) - int (*vprintf)(LV2_Log_Handle handle, - LV2_URID level, - const char* fmt, - va_list ap); -} LV2_Log_Log; - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* LV2_LOG_H */ diff --git a/lv2/ns/ext/log/log.ttl b/lv2/ns/ext/log/log.ttl deleted file mode 100644 index 567333f..0000000 --- a/lv2/ns/ext/log/log.ttl +++ /dev/null @@ -1,74 +0,0 @@ -# LV2 Log Extension -# 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. - -@prefix doap: . -@prefix foaf: . -@prefix log: . -@prefix lv2: . -@prefix rdf: . -@prefix rdfs: . -@prefix xsd: . - - - a lv2:Specification ; - doap:name "LV2 Log" ; - doap:shortdesc "A feature for writing log messages." ; - doap:maintainer [ - a foaf:Person ; - foaf:name "David Robillard" ; - foaf:homepage ; - rdfs:seeAlso - ] ; - lv2:documentation """ - -

This extension defines a feature, LV2_Log_Log, which allows plugins to print -messages to logs implemented by the host with an API much like the standard C -printf functions. This allows, for example, plugin logs to be nicely presented -to the user in a graphical user interface.

- -

Different log levels (e.g. error or information) are -defined by URI and passed as an LV2_URID. Thus, the possible number of log -levels is unlimited, but implementations SHOULD use the levels defined in this -extension unless they have a special reason to do otherwise.

-""" . - -log:Level - a rdfs:Class ; - lv2:documentation """ -

A log level. Subclasses of this class can be passed to LV2_Log_Log methods -to describe the nature of the log message.

""" . - -log:Error - a rdfs:Class ; - rdfs:subClassOf log:Level ; - rdfs:comment "An error" . - -log:Info - a rdfs:Class ; - rdfs:subClassOf log:Level ; - rdfs:comment "An informative message" . - -log:Warn - a rdfs:Class ; - rdfs:subClassOf log:Level ; - rdfs:comment "A warning" . - -log:log - a lv2:Feature ; - lv2:documentation """ -

A feature which plugins may use to log messages. To support this feature, -the host must pass an LV2_Feature to LV2_Descriptor::instantiate() with URI -LV2_LOG_LOG_URI and data pointed to an instance of LV2_Log_Log.

-""" . diff --git a/lv2/ns/ext/log/manifest.ttl b/lv2/ns/ext/log/manifest.ttl deleted file mode 100644 index 7d00e2e..0000000 --- a/lv2/ns/ext/log/manifest.ttl +++ /dev/null @@ -1,9 +0,0 @@ -@prefix lv2: . -@prefix rdfs: . - - - a lv2:Specification ; - lv2:minorVersion 0 ; - lv2:microVersion 1 ; - rdfs:seeAlso . - diff --git a/lv2/ns/ext/log/waf b/lv2/ns/ext/log/waf deleted file mode 120000 index b955110..0000000 --- a/lv2/ns/ext/log/waf +++ /dev/null @@ -1 +0,0 @@ -../../../../waf \ No newline at end of file diff --git a/lv2/ns/ext/log/wscript b/lv2/ns/ext/log/wscript deleted file mode 120000 index ec20a77..0000000 --- a/lv2/ns/ext/log/wscript +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.wscript \ No newline at end of file diff --git a/lv2/ns/ext/midi/ext.pc.in b/lv2/ns/ext/midi/ext.pc.in deleted file mode 120000 index 82b50df..0000000 --- a/lv2/ns/ext/midi/ext.pc.in +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/ns/ext/midi/manifest.ttl b/lv2/ns/ext/midi/manifest.ttl deleted file mode 100644 index a8e194e..0000000 --- a/lv2/ns/ext/midi/manifest.ttl +++ /dev/null @@ -1,9 +0,0 @@ -@prefix lv2: . -@prefix rdfs: . - - - a lv2:Specification ; - lv2:minorVersion 1 ; - lv2:microVersion 4 ; - rdfs:seeAlso . - diff --git a/lv2/ns/ext/midi/midi.ttl b/lv2/ns/ext/midi/midi.ttl deleted file mode 100644 index 64edf0e..0000000 --- a/lv2/ns/ext/midi/midi.ttl +++ /dev/null @@ -1,115 +0,0 @@ -# LV2 MIDI Extension -# Copyright 2008-2011 David Robillard -# Copyright 2006 Lars Luthman -# -# 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 dcs: . -@prefix atom: . -@prefix doap: . -@prefix ev: . -@prefix foaf: . -@prefix lv2: . -@prefix midi: . -@prefix rdfs: . - - - a foaf:Person ; - foaf:name "David Robillard" ; - foaf:homepage ; - foaf:mbox ; - rdfs:seeAlso . - -_:larsl - a foaf:Person ; - foaf:name "Lars Luthman" ; - foaf:mbox . - - - a lv2:Specification ; - doap:license ; - doap:name "LV2 MIDI" ; - doap:shortdesc "A data type for raw MIDI." ; - doap:maintainer ; - doap:developer _:larsl ; - doap:release [ - doap:revision "1.4" ; - doap:created "2011-11-21" ; - doap:file-release ; - dcs:blame ; - dcs:changeset [ - dcs:item [ - rdfs:label "Update packaging." - ] , [ - rdfs:label "Improve documentation." - ] - ] - ] , [ - doap:revision "1.2" ; - doap:created "2011-05-26" ; - doap:file-release ; - dcs:blame ; - dcs:changeset [ - dcs:item [ - rdfs:label "Add build system for installation." - ] , [ - rdfs:label "Switch to ISC license." - ] - ] - ] , [ - doap:revision "1.0" ; - doap:created "2010-10-04" ; - doap:file-release ; - dcs:blame ; - dcs:changeset [ - dcs:item [ - rdfs:label "Initial release." - ] - ] - ] ; - lv2:documentation """ -

This extension defines a data type for a MIDI message, midi:MidiEvent, which -is normalized for fast and convenient processing by plugins. It is -particularly useful as the payload of an Atom or Event.

-""" . - -midi:MidiEvent - a rdfs:Class ; - rdfs:label "LV2 MIDI message." ; - rdfs:subClassOf ev:Event , - atom:Atom ; - lv2:documentation """ -

A single raw MIDI message (i.e. a sequence of bytes).

- -

This is equivalent to a standard MIDI messages, except with the following -restrictions to simplify handling:

-
    -
  • Running status is not allowed, every message must have its own status - byte.
  • - -
  • Note On messages with velocity 0 are not allowed. These messages are - equivalent to Note Off in standard MIDI streams, but here only proper Note - Off messages are allowed.
  • - -
  • "Realtime messages" (status bytes 0xF8 to 0xFF) are allowed, but may - not occur inside other messages like they can in standard MIDI streams.
  • - -
  • All messages are complete valid MIDI messages. This means, for example, - that only the first byte in each event (the status byte) may have the eighth - bit set, that Note On and Note Off events are always 3 bytes long, etc. - Where messages are communicated, the writer is responsible for writing valid - messages, and the reader may assume that all events are valid.
  • -
-""" . diff --git a/lv2/ns/ext/midi/waf b/lv2/ns/ext/midi/waf deleted file mode 120000 index b955110..0000000 --- a/lv2/ns/ext/midi/waf +++ /dev/null @@ -1 +0,0 @@ -../../../../waf \ No newline at end of file diff --git a/lv2/ns/ext/midi/wscript b/lv2/ns/ext/midi/wscript deleted file mode 120000 index ec20a77..0000000 --- a/lv2/ns/ext/midi/wscript +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.wscript \ No newline at end of file diff --git a/lv2/ns/ext/osc/ext.pc.in b/lv2/ns/ext/osc/ext.pc.in deleted file mode 120000 index 82b50df..0000000 --- a/lv2/ns/ext/osc/ext.pc.in +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/ns/ext/osc/lv2_osc.c b/lv2/ns/ext/osc/lv2_osc.c deleted file mode 100644 index afea2c9..0000000 --- a/lv2/ns/ext/osc/lv2_osc.c +++ /dev/null @@ -1,238 +0,0 @@ -/* LV2 OSC Messages Extension - * Copyright (C) 2007-2009 David Robillard - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include -#include -#include -#include -#include "lv2_osc.h" -#include "lv2_osc_print.h" - -/*#ifndef BIG_ENDIAN - #ifndef LITTLE_ENDIAN - #warning This code requires BIG_ENDIAN or LITTLE_ENDIAN to be defined - #warning Assuming little endian. THIS MAY BREAK HORRIBLY! - #endif -#endif*/ - -#define lv2_osc_swap32(x) \ -({ \ - uint32_t __x = (x); \ - ((uint32_t)( \ - (((uint32_t)(__x) & (uint32_t)0x000000ffUL) << 24) | \ - (((uint32_t)(__x) & (uint32_t)0x0000ff00UL) << 8) | \ - (((uint32_t)(__x) & (uint32_t)0x00ff0000UL) >> 8) | \ - (((uint32_t)(__x) & (uint32_t)0xff000000UL) >> 24) )); \ -}) - -#define lv2_osc_swap64(x) \ -({ \ - uint64_t __x = (x); \ - ((uint64_t)( \ - (uint64_t)(((uint64_t)(__x) & (uint64_t)0x00000000000000ffULL) << 56) | \ - (uint64_t)(((uint64_t)(__x) & (uint64_t)0x000000000000ff00ULL) << 40) | \ - (uint64_t)(((uint64_t)(__x) & (uint64_t)0x0000000000ff0000ULL) << 24) | \ - (uint64_t)(((uint64_t)(__x) & (uint64_t)0x00000000ff000000ULL) << 8) | \ - (uint64_t)(((uint64_t)(__x) & (uint64_t)0x000000ff00000000ULL) >> 8) | \ - (uint64_t)(((uint64_t)(__x) & (uint64_t)0x0000ff0000000000ULL) >> 24) | \ - (uint64_t)(((uint64_t)(__x) & (uint64_t)0x00ff000000000000ULL) >> 40) | \ - (uint64_t)(((uint64_t)(__x) & (uint64_t)0xff00000000000000ULL) >> 56) )); \ -}) - - -/** Pad a size to a multiple of 32 bits */ -inline static uint32_t -lv2_osc_pad_size(uint32_t size) -{ - return size + 3 - ((size-1) % 4); -} - - -inline static uint32_t -lv2_osc_string_size(const char *s) -{ - return lv2_osc_pad_size((uint32_t)strlen(s) + 1); -} - - -static inline uint32_t -lv2_osc_blob_size(const void* blob) -{ - return sizeof(uint32_t) + lv2_osc_pad_size(*((uint32_t*)blob)); -} - - -uint32_t -lv2_osc_arg_size(char type, const LV2_OSC_Argument* arg) -{ - switch (type) { - case 'c': - case 'i': - case 'f': - case 'S': // Symbol (URI-mapped integer) - return 4; - - case 'h': - case 'd': - return 8; - - case 's': - return lv2_osc_string_size(&arg->s); - - case 'b': - return lv2_osc_blob_size(&arg->b); - - default: - fprintf(stderr, "Warning: unknown OSC type '%c'.", type); - return 0; - } -} - - -void -lv2_osc_argument_swap_byte_order(char type, LV2_OSC_Argument* arg) -{ - switch (type) { - case 'i': - case 'f': - case 'b': - case 'c': - *(int32_t*)arg = lv2_osc_swap32(*(int32_t*)arg); - break; - - case 'h': - case 'd': - *(int64_t*)arg = lv2_osc_swap64(*(int64_t*)arg); - break; - } -} - - -/** Convert a message from network byte order to host byte order. */ -void -lv2_osc_message_swap_byte_order(LV2_OSC_Event* msg) -{ - const char* const types = lv2_osc_get_types(msg); - - for (uint32_t i=0; i < msg->argument_count; ++i) - lv2_osc_argument_swap_byte_order(types[i], lv2_osc_get_argument(msg, i)); -} - - -/** Not realtime safe, returned value must be free()'d by caller. */ -LV2_OSC_Event* -lv2_osc_message_new(const char* path, const char* types, ...) -{ - /* FIXME: path only */ - - LV2_OSC_Event* result = malloc(sizeof(LV2_OSC_Event) - + 4 + lv2_osc_string_size(path)); - - const uint32_t path_size = lv2_osc_string_size(path); - result->data_size = path_size + 4; // 4 for types - result->argument_count = 0; - result->types_offset = lv2_osc_string_size(path) + 1; - (&result->data)[result->types_offset - 1] = ','; - (&result->data)[result->types_offset] = '\0'; - - memcpy(&result->data, path, strlen(path) + 1); - - return result; -} - - -/** Create a new LV2_OSC_Event from a raw OSC message. - * - * If \a out_buf is NULL, new memory will be allocated. Otherwise the returned - * value will be equal to buf, unless there is insufficient space in which - * case NULL is returned. - */ -LV2_OSC_Event* -lv2_osc_message_from_raw(uint32_t out_buf_size, - void* out_buf, - uint32_t raw_msg_size, - void* raw_msg) -{ - const uint32_t message_header_size = (sizeof(uint32_t) * 4); - - const uint32_t path_size = lv2_osc_string_size((char*)raw_msg); - const uint32_t types_len = strlen((char*)(raw_msg + path_size + 1)); - uint32_t index_size = types_len * sizeof(uint32_t); - - if (out_buf == NULL) { - out_buf_size = message_header_size + index_size + raw_msg_size; - out_buf = malloc((size_t)out_buf_size); - } else if (out_buf && out_buf_size < message_header_size + raw_msg_size) { - return NULL; - } - - LV2_OSC_Event* write_loc = (LV2_OSC_Event*)(out_buf); - write_loc->argument_count = types_len; - write_loc->data_size = index_size + raw_msg_size; - - // Copy raw message - memcpy(&write_loc->data + index_size, raw_msg, raw_msg_size); - - write_loc->types_offset = index_size + path_size + 1; - const char* const types = lv2_osc_get_types(write_loc); - - // Calculate/Write index - uint32_t args_base_offset = write_loc->types_offset + lv2_osc_string_size(types) - 1; - uint32_t arg_offset = 0; - - for (uint32_t i=0; i < write_loc->argument_count; ++i) { - ((uint32_t*)&write_loc->data)[i] = args_base_offset + arg_offset; - const LV2_OSC_Argument* const arg = (LV2_OSC_Argument*)(&write_loc->data + args_base_offset + arg_offset); - // Special case because size is still big-endian -#ifndef BIG_ENDIAN - if (types[i] == 'b') // special case because size is still big-endian - arg_offset += lv2_osc_swap32(*((int32_t*)arg)); - else -#endif - arg_offset += lv2_osc_arg_size(types[i], arg); - } - - /*printf("Index:\n"); - for (uint32_t i=0; i < write_loc->argument_count; ++i) { - printf("%u ", ((uint32_t*)&write_loc->data)[i]); - } - printf("\n"); - - printf("Data:\n"); - for (uint32_t i=0; i < (write_loc->argument_count * 4) + size; ++i) { - printf("%3u", i % 10); - } - printf("\n"); - for (uint32_t i=0; i < (write_loc->argument_count * 4) + size; ++i) { - char c = *(((char*)&write_loc->data) + i); - if (c >= 32 && c <= 126) - printf("%3c", c); - else - printf("%3d", (int)c); - } - printf("\n");*/ - - // Swap to host byte order if necessary -#ifndef BIG_ENDIAN - lv2_osc_message_swap_byte_order(write_loc); -#endif - - printf("Created message:\n"); - lv2_osc_message_print(write_loc); - - return write_loc; -} diff --git a/lv2/ns/ext/osc/lv2_osc_print.c b/lv2/ns/ext/osc/lv2_osc_print.c deleted file mode 100644 index 5282d46..0000000 --- a/lv2/ns/ext/osc/lv2_osc_print.c +++ /dev/null @@ -1,66 +0,0 @@ -/* LV2 OSC Messages Extension - Pretty printing methods - * Copyright (C) 2007-2009 David Robillard - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include -#include "lv2_osc_print.h" - -void -lv2_osc_argument_print(char type, const LV2_OSC_Argument* arg) -{ - int32_t blob_size; - - switch (type) { - case 'c': - printf("%c", arg->c); break; - case 'i': - printf("%d", arg->i); break; - case 'f': - printf("%f", arg->f); break; - case 'h': - printf("%ld", arg->h); break; - case 'd': - printf("%f", arg->d); break; - case 's': - printf("\"%s\"", &arg->s); break; - /*case 'S': - printf("\"%s\"", &arg->S); break;*/ - case 'b': - blob_size = *((int32_t*)arg); - printf("{ "); - for (int32_t i=0; i < blob_size; ++i) - printf("%X, ", (&arg->b)[i+4]); - printf(" }"); - break; - default: - printf("?"); - } -} - - -void -lv2_osc_print(const LV2_OSC_Event* msg) -{ - const char* const types = lv2_osc_get_types(msg); - - printf("%s (%s) ", lv2_osc_get_path(msg), types); - for (uint32_t i=0; i < msg->argument_count; ++i) { - lv2_osc_argument_print(types[i], lv2_osc_get_argument(msg, i)); - printf(" "); - } - printf("\n"); -} - diff --git a/lv2/ns/ext/osc/lv2_osc_test.c b/lv2/ns/ext/osc/lv2_osc_test.c deleted file mode 100644 index 3f76d41..0000000 --- a/lv2/ns/ext/osc/lv2_osc_test.c +++ /dev/null @@ -1,55 +0,0 @@ -#include -#include -#include -#include -#include "lv2_osc.h" -#include "lv2_osc_print.h" - -int -main() -{ - lo_message lo_msg = lo_message_new(); - //lo_message_add_symbol(lo_msg, "a_sym"); - lo_message_add_string(lo_msg, "Hello World"); - lo_message_add_char(lo_msg, 'a'); - lo_message_add_int32(lo_msg, 1234); - lo_message_add_float(lo_msg, 0.1234); - lo_message_add_int64(lo_msg, 5678); - lo_message_add_double(lo_msg, 0.5678); - - - /*unsigned char blob_data[] = { 0,1,2,3,4,5,6,7,8,9 }; - lo_blob blob = lo_blob_new(10, blob_data); - lo_message_add_blob(lo_msg, blob);*/ - - /* Leaks like a sieve */ - - size_t raw_msg_size = 0; - void* raw_msg = lo_message_serialise(lo_msg, "/foo/bar", NULL, &raw_msg_size); - - LV2Message* msg = lv2_osc_message_from_raw(0.0, 0, NULL, raw_msg_size, raw_msg); - assert(msg); - - LV2OSCBuffer* buf = lv2_osc_buffer_new(1024); - - int ret = lv2_osc_buffer_append_message(buf, msg); - if (ret) - fprintf(stderr, "Message append failed: %s", strerror(ret)); - - lo_message lo_msg_2 = lo_message_new(); - lo_message_add_string(lo_msg_2, "Another message"); - - raw_msg = lo_message_serialise(lo_msg_2, "/baz", NULL, &raw_msg_size); - - msg = lv2_osc_message_from_raw(0.0, 0, NULL, raw_msg_size, raw_msg); - assert(msg); - - ret = lv2_osc_buffer_append_message(buf, msg); - if (ret) - fprintf(stderr, "Message append failed: %s", strerror(ret)); - - printf("\nBuffer contents:\n\n"); - lv2_osc_buffer_print(buf); - - return 0; -} diff --git a/lv2/ns/ext/osc/manifest.ttl b/lv2/ns/ext/osc/manifest.ttl deleted file mode 100644 index 7209b05..0000000 --- a/lv2/ns/ext/osc/manifest.ttl +++ /dev/null @@ -1,9 +0,0 @@ -@prefix lv2: . -@prefix rdfs: . - - - a lv2:Specification ; - lv2:minorVersion 0 ; - lv2:microVersion 1 ; - rdfs:seeAlso . - diff --git a/lv2/ns/ext/osc/osc-print.h b/lv2/ns/ext/osc/osc-print.h deleted file mode 100644 index ceebbf7..0000000 --- a/lv2/ns/ext/osc/osc-print.h +++ /dev/null @@ -1,42 +0,0 @@ -/* LV2 OSC Messages Extension - Pretty printing methods - * Copyright (C) 2007-2009 David Robillard - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -/** @file - * Helper functions for printing LV2 OSC messages as defined by the - * LV2 OSC extension . - */ - -#ifndef LV2_OSC_PRINT_H -#define LV2_OSC_PRINT_H - -#include "lv2/lv2plug.in/ns/ext/osc/osc.h" - -#ifdef __cplusplus -extern "C" { -#endif - -void -lv2_osc_argument_print(char type, const LV2_OSC_Argument* arg); - -void -lv2_osc_message_print(const LV2_OSC_Event* msg); - -#ifdef __cplusplus -} -#endif - -#endif /* LV2_OSC_PRINT_H */ diff --git a/lv2/ns/ext/osc/osc.h b/lv2/ns/ext/osc/osc.h deleted file mode 100644 index 05e39cc..0000000 --- a/lv2/ns/ext/osc/osc.h +++ /dev/null @@ -1,119 +0,0 @@ -/* LV2 OSC Messages Extension - * Copyright (C) 2007-2009 David Robillard - * - * This header is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This header is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#ifndef LV2_OSC_H -#define LV2_OSC_H - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** @file - * C header for the LV2 OSC extension . - * This extension defines a format for (raw) OSC messages/events. - */ - - -/** Argument (in a message). - * - * The name of the element in this union directly corresponds to the OSC - * type tag character in LV2_Event::types. - */ -typedef union { - /* Standard OSC types */ - int32_t i; /**< 32 bit signed integer */ - float f; /**< 32 bit IEEE-754 floating point number ("float") */ - char s; /**< Standard C, NULL terminated string */ - uint8_t b; /**< Blob (int32 size then size bytes padded to 32 bits) */ - - /* "Nonstandard" OSC types (defined in the OSC standard) */ - int64_t h; /* 64 bit signed integer */ - // t /* OSC-timetag */ - double d; /* 64 bit IEEE 754 floating point number ("double") */ - // S /* Symbol, represented as an OSC-string */ - int32_t c; /* Character, represented as a 32-bit integer */ - // r /* 32 bit RGBA color */ - // m /* 4 byte MIDI message. Bytes from MSB to LSB are: port id, status byte, data1, data2 */ - // T /* True. No bytes are allocated in the argument data. */ - // F /* False. No bytes are allocated in the argument data. */ - // N /* Nil. No bytes are allocated in the argument data. */ - // I /* Infinitum. No bytes are allocated in the argument data. */ - // [ /* The beginning of an array. */ - // ] /* The end of an array. */ -} LV2_OSC_Argument; - - - -/** Message. - * - * This is an OSC message at heart, but with some additional cache information - * to allow fast access to parameters. This is the payload of an LV2_Event, - * time stamp and size (being generic) are in the containing header. - */ -typedef struct { - uint32_t data_size; /**< Total size of data, in bytes */ - uint32_t argument_count; /**< Number of arguments in data */ - uint32_t types_offset; /**< Offset of types string in data */ - - /** Take the address of this member to get a pointer to the remaining data. - * - * Contents are an argument index: - * uint32_t argument_index[argument_count] - * - * followed by a standard OSC message: - * char path[path_length] (padded OSC string) - * char types[argument_count] (padded OSC string) - * void data[data_size] - */ - char data; - -} LV2_OSC_Event; - -LV2_OSC_Event* lv2_osc_event_new(const char* path, const char* types, ...); - -LV2_OSC_Event* lv2_osc_event_from_raw(uint32_t out_buf_size, void* out_buf, - uint32_t raw_msg_size, void* raw_msg); - -static inline uint32_t lv2_osc_get_osc_message_size(const LV2_OSC_Event* msg) - { return (msg->argument_count * sizeof(char) + 1) + msg->data_size; } - -static inline const void* lv2_osc_get_osc_message(const LV2_OSC_Event* msg) - { return (const void*)(&msg->data + (sizeof(uint32_t) * msg->argument_count)); } - -static inline const char* lv2_osc_get_path(const LV2_OSC_Event* msg) - { return (const char*)(&msg->data + (sizeof(uint32_t) * msg->argument_count)); } - -static inline const char* lv2_osc_get_types(const LV2_OSC_Event* msg) - { return (const char*)(&msg->data + msg->types_offset); } - -static inline LV2_OSC_Argument* lv2_osc_get_argument(const LV2_OSC_Event* msg, uint32_t i) - { return (LV2_OSC_Argument*)(&msg->data + ((uint32_t*)&msg->data)[i]); } - -/* -int lv2_osc_buffer_append_message(LV2_Event_Buffer* buf, LV2_Event* msg); -int lv2_osc_buffer_append(LV2_Event_Buffer* buf, double time, const char* path, const char* types, ...); -void lv2_osc_buffer_compact(LV2_Event_Buffer* buf); -*/ - -#ifdef __cplusplus -} -#endif - -#endif /* LV2_OSC_H */ diff --git a/lv2/ns/ext/osc/osc.ttl b/lv2/ns/ext/osc/osc.ttl deleted file mode 100644 index c83a69d..0000000 --- a/lv2/ns/ext/osc/osc.ttl +++ /dev/null @@ -1,39 +0,0 @@ -# LV2 OSC Messages Extension -# Copyright (C) 2007 David Robillard -# -# Permission is hereby granted, free of charge, to any person obtaining a -# copy of this software and associated documentation files (the "Software"), -# to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, -# and/or sell copies of the Software, and to permit persons to whom the -# Software is furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR -# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -# OTHER DEALINGS IN THE SOFTWARE. - -@prefix osc: . -@prefix lv2: . -@prefix rdf: . -@prefix rdfs: . -@prefix xsd: . -@prefix doap: . -@prefix foaf: . - - a lv2:Specification ; - doap:license ; - doap:name "LV2 OSC Events" ; - doap:shortdesc "A data type for raw OSC." ; - doap:maintainer [ - a foaf:Person ; - foaf:name "David Robillard" ; - foaf:homepage ; - rdfs:seeAlso - ] . diff --git a/lv2/ns/ext/osc/waf b/lv2/ns/ext/osc/waf deleted file mode 120000 index b955110..0000000 --- a/lv2/ns/ext/osc/waf +++ /dev/null @@ -1 +0,0 @@ -../../../../waf \ No newline at end of file diff --git a/lv2/ns/ext/osc/wscript b/lv2/ns/ext/osc/wscript deleted file mode 120000 index ec20a77..0000000 --- a/lv2/ns/ext/osc/wscript +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.wscript \ No newline at end of file diff --git a/lv2/ns/ext/parameter/ext.pc.in b/lv2/ns/ext/parameter/ext.pc.in deleted file mode 120000 index 82b50df..0000000 --- a/lv2/ns/ext/parameter/ext.pc.in +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/ns/ext/parameter/manifest.ttl b/lv2/ns/ext/parameter/manifest.ttl deleted file mode 100644 index d7af7ff..0000000 --- a/lv2/ns/ext/parameter/manifest.ttl +++ /dev/null @@ -1,9 +0,0 @@ -@prefix lv2: . -@prefix rdfs: . - - - a lv2:Specification ; - lv2:minorVersion 0 ; - lv2:microVersion 1 ; - rdfs:seeAlso . - diff --git a/lv2/ns/ext/parameter/parameter.ttl b/lv2/ns/ext/parameter/parameter.ttl deleted file mode 100644 index e43cc48..0000000 --- a/lv2/ns/ext/parameter/parameter.ttl +++ /dev/null @@ -1,111 +0,0 @@ -# LV2 Parameter Extension -# Copyright (C) 2010 David Robillard -# -# Permission is hereby granted, free of charge, to any person obtaining a -# copy of this software and associated documentation files (the "Software"), -# to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, -# and/or sell copies of the Software, and to permit persons to whom the -# Software is furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR -# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -# OTHER DEALINGS IN THE SOFTWARE. - -@prefix atom: . -@prefix doap: . -@prefix foaf: . -@prefix lv2: . -@prefix param: . -@prefix rdf: . -@prefix rdfs: . -@prefix xsd: . - - - a lv2:Specification ; - doap:name "LV2 Parameter" ; - doap:shortdesc "Dynamic message-controlled LV2 plugin parameters." ; - doap:maintainer [ - a foaf:Person ; - foaf:name "David Robillard" ; - foaf:homepage ; - rdfs:seeAlso - ] ; - rdfs:comment """ -""" . - - -param:Parameter a rdfs:Class ; a lv2:Resource ; - rdfs:label "Parameter" ; - lv2:documentation """ -

A parameter on an LV2 plugin. Parameters can be manipulated to alter -the behaviour or output of a plugin. Unlike lv2:ControlPort:

-
    -
  • A parameter may have any data type
  • -
  • Parameters can be dynamically added or removed
  • -
  • Parameter values can be manipulated by the plugin
  • -
- -

Note that plugins are not required to support this potential functionality, -parameters can be used to provide a basic LADSPA-like set of floating point -parameters in a more extensible manner.

- -

Parameters are essentially controls that are not 1:1 associated with ports -(manipulation of parameters can be accomplished by e.g. sending messages -to a command port).

-""" . - - -param:supportsType a rdf:Property ; - rdfs:domain param:Parameter ; - rdfs:range atom:Atom ; - rdfs:label "supports type" ; - lv2:documentation """ -

Indicates that a Parameter has values of a particular type. A Parameter may -support many types. Parameter values are always LV2 Atoms as defined by the LV2 Atom Extension Any type of LV2 -Atom may be used as a parameter value.

-""" . - - -param:value a rdf:Property ; - rdfs:domain param:Parameter ; - rdfs:label "value" ; - rdfs:comment """ -Indicates that a Parameter has a certain value. A Parameter has at most -one value at any given time. The type of the value specified must be -one of the types specified by param:supportsType. When used in a plugin -data file this property specifies the default value of a parameter. -""" . - - -param:minimum a rdf:Property ; - rdfs:domain param:Parameter ; - rdfs:label "minimum" ; - rdfs:comment """ -Specifies the minimum value of a Parameter (for Parameters with comparable -types for which this makes sense). The type of the minimum must be one of -the types specified by param:supportsType. The host MAY attempt to set a -parameter to any value (of a legal type), i.e. the plugin MUST NOT assume -attempts to change a parameter are within range and SHOULD clamp accordingly. -""" . - - -param:maximum a rdf:Property ; - rdfs:domain param:Parameter ; - rdfs:label "maximum" ; - rdfs:comment """ -Specifies the maximum value of a Parameter (for Parameters with comparable -types for which this makes sense). The type of the maximum must be one of -the types specified by param:supportsType. The host MAY attempt to set a -parameter to any value (of a legal type), i.e. the plugin MUST NOT assume -attempts to change a parameter are within range and SHOULD clamp accordingly. -""" . - diff --git a/lv2/ns/ext/parameter/waf b/lv2/ns/ext/parameter/waf deleted file mode 120000 index b955110..0000000 --- a/lv2/ns/ext/parameter/waf +++ /dev/null @@ -1 +0,0 @@ -../../../../waf \ No newline at end of file diff --git a/lv2/ns/ext/parameter/wscript b/lv2/ns/ext/parameter/wscript deleted file mode 120000 index ec20a77..0000000 --- a/lv2/ns/ext/parameter/wscript +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.wscript \ No newline at end of file diff --git a/lv2/ns/ext/port-groups/ext.pc.in b/lv2/ns/ext/port-groups/ext.pc.in deleted file mode 120000 index 82b50df..0000000 --- a/lv2/ns/ext/port-groups/ext.pc.in +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/ns/ext/port-groups/manifest.ttl b/lv2/ns/ext/port-groups/manifest.ttl deleted file mode 100644 index ff4205b..0000000 --- a/lv2/ns/ext/port-groups/manifest.ttl +++ /dev/null @@ -1,9 +0,0 @@ -@prefix lv2: . -@prefix rdfs: . - - - a lv2:Specification ; - lv2:minorVersion 0 ; - lv2:microVersion 1 ; - rdfs:seeAlso . - diff --git a/lv2/ns/ext/port-groups/port-groups.ttl b/lv2/ns/ext/port-groups/port-groups.ttl deleted file mode 100644 index edf5359..0000000 --- a/lv2/ns/ext/port-groups/port-groups.ttl +++ /dev/null @@ -1,490 +0,0 @@ -# LV2 Port Groups Extension -# Copyright 2009-2011 David Robillard -# Copyright 2008-2009 Lars Luthman -# -# 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 pg: . -@prefix lv2: . -@prefix rdf: . -@prefix rdfs: . -@prefix owl: . -@prefix xsd: . -@prefix doap: . -@prefix foaf: . -@prefix amb: . - - a lv2:Specification ; - doap:license ; - doap:name "LV2 Port Groups" ; - doap:shortdesc "Multi-channel groups of LV2 ports." ; - rdfs:comment "Defines semantic groupings of LV2 ports" ; - doap:maintainer [ - a foaf:Person ; - foaf:name "Lars Luthman" ; - foaf:mbox - ] , [ - a foaf:Person ; - foaf:name "David Robillard" ; - foaf:homepage ; - rdfs:seeAlso - ] . - - -## Core Classes / Properties - -pg:Group a rdfs:Class ; - rdfs:label "LV2 Port Group" ; - rdfs:subClassOf [ a owl:Restriction ; - owl:onProperty lv2:symbol ; - owl:someValuesFrom xsd:string ; - owl:cardinality 1 ; - rdfs:comment """ -A pg:Group MUST have exactly one string lv2:symbol. This symbol must be -unique according to the same rules as the lv2:symbol for an lv2:Port, where -group symbols and port symbols reside in the same namespace. In other words, -a group on a plugin MUST NOT have the same symbol as another group or a port -on that plugin. Rationale: Hosts or bindings may find it useful to construct -an identifier to refer to groups for the same reasons this is useful for ports. -""" - ] ; - rdfs:subClassOf [ a owl:Restriction ; - owl:onProperty pg:hasRole ; - owl:someValuesFrom pg:RoleAssignment ; - owl:minCardinality 1 ; - rdfs:comment "A Group MUST have at least one role assignment" - ] ; - rdfs:comment """ -A grouping of ports that can be logically considered a single "stream", e.g. -two audio ports in a group may form a stereo stream. The pg:source predicate -can also be used to describe this correspondence between separate ports/groups. -""" . - -pg:index a rdf:Property ; - rdfs:domain pg:RoleAssignment ; - rdfs:range xsd:nonNegativeInteger ; - rdfs:label "index" ; - rdfs:comment "Index of a role within some group" . - -pg:RoleAssignment a rdfs:Class ; - rdfs:label "Role Assignment" ; - rdfs:comment "A numbered role within some Group." ; - rdfs:subClassOf [ a owl:Restriction ; - owl:onProperty pg:index ; - owl:cardinality 1 ; - rdfs:comment """ -A RoleAssignment MUST have exactly one index. -""" ] ; - rdfs:subClassOf [ a owl:Restriction ; - owl:onProperty pg:role ; - owl:cardinality 1 ; - rdfs:comment """ -A RoleAssignment MUST have exactly one role. -""" ] ; - rdfs:comment """ -All group definitions MUST define the order of channels. Note that this -does not have anything to do with port indices, this information is only -defined here for use by other extensions. For simply assigning groups -and roles to a basic LV2 plugin, index is irrelevant. -""" . - -pg:hasRole a rdf:Property ; - rdfs:domain pg:Group ; - rdfs:range pg:Role ; - rdfs:label "Has port with role" ; - rdfs:comment """ -Indicates that a group always has a port with a particular role. -""" . - -pg:mayHaveRole a rdf:Property ; - rdfs:domain pg:Group ; - rdfs:range pg:Role ; - rdfs:label "May have port with role" ; - rdfs:comment """ -Indicates that a group may have a port with a particular role. -""" . - -pg:sideChainOf a rdf:Property ; - rdfs:domain pg:Group , lv2:Port ; - rdfs:range pg:Group , lv2:Port ; - rdfs:label "Side-chain of" ; - rdfs:comment """ -Indicates that this port or group should be considered a "side chain" of -some other port or group. The precise definition of "side chain" depends -on the plugin, but in general this group should be considered a modifier to -some other group, rather than an independent input itself. -""" . - -pg:subGroupOf a rdf:Property ; - rdfs:domain pg:Group ; - rdfs:range pg:Group ; - rdfs:label "Sub-group of" ; - rdfs:comment """ -Indicates that this group is a child of another group. This property has -no meaning with respect to plugin execution, but the host may find this -information useful (e.g. to provide a compact user interface). Note that -all groups on a plugin MUST have a unique symbol with respect to the plugin -as documented for pg:Group, i.e. sub-groups must have a unique symbol among -all groups and ports on the plugin. -""" . - -pg:source a rdf:Property ; - rdfs:domain pg:Group , lv2:Port ; - rdfs:range pg:Group , lv2:Port ; - rdfs:label "Source group" ; - rdfs:comment """ -Indicates that this port or group should be considered the "result" of -some other port or group. This property only makes sense on groups with -outputs when the source is a group with inputs. This can be used to convey -a relationship between corresponding input and output groups with different -types, e.g. a mono->stereo plugin. -""" . - -pg:mainGroup a rdf:Property ; - rdfs:domain lv2:Plugin ; - rdfs:range pg:Group ; - rdfs:label "Main port group" ; - rdfs:comment """ -Indicates that this group should be considered the "main" inputs/outputs of -the plugin, e.g. it probably makes sense to just connect main groups and set -some controls. A plugin MUST NOT have more than one :mainGroup property. -High-level hosts that simply want to insert an plugin in a given stream -should use this property to determine where the plugin 'fits'. -""" . - -pg:inGroup a rdf:Property ; - rdfs:domain lv2:Port ; - rdfs:range pg:Group ; - rdfs:label "In port group" ; - rdfs:comment """ -Indicates that this port is a part of a group of ports on the plugin. -Ports that have a meaningful "role" that may be useful to hosts SHOULD also -have a :role property, otherwise ports in the group have no meaningful order. -""" . - -pg:Role a rdfs:Class ; - rdfs:label "Port role" ; - rdfs:comment """ -The role of a port with respect to its plugin or group. If the port is a -member of a group (has an :inGroup property) the role is relevant with respect -to that group. Otherwise the role is relevant with respect to the plugin. -""" . - -pg:role a rdf:Property ; - rdfs:range pg:Role ; - rdfs:label "Role" ; - rdfs:comment """ -Indicates that this port has a particular role with respect to its enclosing -plugin or group (whichever is smaller). A port may have several roles if it -makes sense to do so (though some Role or Group definition may forbid this). -""" . - - -# Discrete - -pg:DiscreteGroup a rdfs:Class ; - rdfs:subClassOf pg:Group ; - rdfs:comment """ -"Discrete" channel configurations. These groups are divided into channels -where each represents a particular speaker location. The position of sound -in one of these groups depends on a particular speaker configuration. -""" . - -pg:leftChannel a pg:Role ; rdfs:label "Left" . -pg:rightChannel a pg:Role ; rdfs:label "Right" . -pg:centerChannel a pg:Role ; rdfs:label "Center" . -pg:sideChannel a pg:Role ; rdfs:label "Side" . -pg:centerLeftChannel a pg:Role ; rdfs:label "Center Left" . -pg:centerRightChannel a pg:Role ; rdfs:label "Center Right" . -pg:sideLeftChannel a pg:Role ; rdfs:label "Side Left" . -pg:sideRightChannel a pg:Role ; rdfs:label "Side Right" . -pg:rearLeftChannel a pg:Role ; rdfs:label "Rear Left" . -pg:rearRightChannel a pg:Role ; rdfs:label "Rear Right" . -pg:rearCenterChannel a pg:Role ; rdfs:label "Rear Center" . -pg:lfeChannel a pg:Role ; rdfs:label "Sub (LFE)" . - -pg:MonoGroup a rdfs:Class ; - rdfs:subClassOf pg:DiscreteGroup ; - rdfs:label "Mono" ; - pg:hasRole [ pg:index 0; pg:role pg:centerChannel ] . - -pg:StereoGroup a rdfs:Class ; - rdfs:subClassOf pg:DiscreteGroup ; - rdfs:label "Stereo" ; - pg:hasRole [ pg:index 0; pg:role pg:leftChannel ] ; - pg:hasRole [ pg:index 1; pg:role pg:rightChannel ] . - -pg:MidSideGroup a rdfs:Class ; - rdfs:subClassOf pg:DiscreteGroup ; - rdfs:label "Mid-Side Stereo" ; - pg:hasRole [ pg:index 0; pg:role pg:centerChannel ] ; - pg:hasRole [ pg:index 1; pg:role pg:sideChannel ] . - -pg:ThreePointZeroGroup a rdfs:Class ; - rdfs:subClassOf pg:DiscreteGroup ; - rdfs:label "3.0 Surround" ; - pg:hasRole [ pg:index 0; pg:role pg:leftChannel ] ; - pg:hasRole [ pg:index 1; pg:role pg:rightChannel ] ; - pg:hasRole [ pg:index 2; pg:role pg:rearCenterChannel ] . - -pg:FourPointZeroGroup a rdfs:Class ; - rdfs:subClassOf pg:DiscreteGroup ; - rdfs:label "4.0 Surround (Quadraphonic)" ; - pg:hasRole [ pg:index 0; pg:role pg:leftChannel ] ; - pg:hasRole [ pg:index 1; pg:role pg:centerChannel ] ; - pg:hasRole [ pg:index 2; pg:role pg:rightChannel ] ; - pg:hasRole [ pg:index 3; pg:role pg:rearCenterChannel ] . - -pg:FivePointZeroGroup a rdfs:Class ; - rdfs:subClassOf pg:DiscreteGroup ; - rdfs:label "5.0 Surround (3-2 stereo)" ; - pg:hasRole [ pg:index 0; pg:role pg:leftChannel ] ; - pg:hasRole [ pg:index 1; pg:role pg:centerChannel ] ; - pg:hasRole [ pg:index 2; pg:role pg:rightChannel ] ; - pg:hasRole [ pg:index 3; pg:role pg:rearLeftChannel ] ; - pg:hasRole [ pg:index 4; pg:role pg:rearRightChannel ] . - -pg:FivePointOneGroup a rdfs:Class ; - rdfs:subClassOf pg:DiscreteGroup ; - rdfs:label "5.1 Surround (3-2 stereo)" ; - pg:hasRole [ pg:index 0; pg:role pg:leftChannel ] ; - pg:hasRole [ pg:index 1; pg:role pg:centerChannel ] ; - pg:hasRole [ pg:index 2; pg:role pg:rightChannel ] ; - pg:hasRole [ pg:index 3; pg:role pg:rearLeftChannel ] ; - pg:hasRole [ pg:index 4; pg:role pg:rearRightChannel ] ; - pg:hasRole [ pg:index 5; pg:role pg:lfeChannel ] . - -pg:SixPointOneGroup a rdfs:Class ; - rdfs:subClassOf pg:DiscreteGroup ; - rdfs:label "6.1 Surround" ; - pg:hasRole [ pg:index 0; pg:role pg:leftChannel ] ; - pg:hasRole [ pg:index 1; pg:role pg:centerChannel ] ; - pg:hasRole [ pg:index 2; pg:role pg:rightChannel ] ; - pg:hasRole [ pg:index 3; pg:role pg:sideLeftChannel ] ; - pg:hasRole [ pg:index 4; pg:role pg:sideRightChannel ] ; - pg:hasRole [ pg:index 5; pg:role pg:rearCenterChannel ] ; - pg:hasRole [ pg:index 6; pg:role pg:lfeChannel ] . - -pg:SevenPointOneGroup a rdfs:Class ; - rdfs:subClassOf pg:DiscreteGroup ; - rdfs:label "7.1 Surround" ; - pg:hasRole [ pg:index 0; pg:role pg:leftChannel ] ; - pg:hasRole [ pg:index 1; pg:role pg:centerChannel ] ; - pg:hasRole [ pg:index 2; pg:role pg:rightChannel ] ; - pg:hasRole [ pg:index 3; pg:role pg:sideLeftChannel ] ; - pg:hasRole [ pg:index 4; pg:role pg:sideRightChannel ] ; - pg:hasRole [ pg:index 5; pg:role pg:rearLeftChannel ] ; - pg:hasRole [ pg:index 6; pg:role pg:rearRightChannel ] ; - pg:hasRole [ pg:index 7; pg:role pg:lfeChannel ] . - -pg:SevenPointOneWideGroup a rdfs:Class ; - rdfs:subClassOf pg:DiscreteGroup ; - rdfs:label "7.1 Surround (Wide)" ; - pg:hasRole [ pg:index 0; pg:role pg:leftChannel ] ; - pg:hasRole [ pg:index 1; pg:role pg:centerLeftChannel ] ; - pg:hasRole [ pg:index 2; pg:role pg:centerChannel ] ; - pg:hasRole [ pg:index 3; pg:role pg:centerRightChannel ] ; - pg:hasRole [ pg:index 4; pg:role pg:rightChannel ] ; - pg:hasRole [ pg:index 5; pg:role pg:rearLeftChannel ] ; - pg:hasRole [ pg:index 6; pg:role pg:rearRightChannel ] ; - pg:hasRole [ pg:index 7; pg:role pg:lfeChannel ] . - - -# Ambisonic - -pg:AmbisonicGroup a rdfs:Class ; - rdfs:subClassOf pg:Group ; - rdfs:comment """ -"Ambisonic" channel configurations. These groups are divided into channels -which together represent a position in an abstract n-dimensional space. -The position of sound in one of these groups does not depend on a particular -speaker configuration; a decoder can be used to convert an ambisonic stream -for any speaker configuration. -""" . - -#amb:ACN0 a pg:Role ; rdfs:label "ACN 0 (W)" . -#amb:ACN1 a pg:Role ; rdfs:label "ACN 1 (Y)" . -#amb:ACN2 a pg:Role ; rdfs:label "ACN 2 (Z)" . -#amb:ACN3 a pg:Role ; rdfs:label "ACN 3 (X)" . -#amb:ACN4 a pg:Role ; rdfs:label "ACN 4 (V)" . -#amb:ACN5 a pg:Role ; rdfs:label "ACN 5 (T)" . -#amb:ACN6 a pg:Role ; rdfs:label "ACN 6 (R)" . -#amb:ACN7 a pg:Role ; rdfs:label "ACN 7 (S)" . -#amb:ACN8 a pg:Role ; rdfs:label "ACN 8 (U)" . -#amb:ACN9 a pg:Role ; rdfs:label "ACN 9 (Q)" . -#amb:ACN10 a pg:Role ; rdfs:label "ACN 10 (O)" . -#amb:ACN11 a pg:Role ; rdfs:label "ACN 11 (M)" . -#amb:ACN12 a pg:Role ; rdfs:label "ACN 12 (K)" . -#amb:ACN13 a pg:Role ; rdfs:label "ACN 13 (L)" . -#amb:ACN14 a pg:Role ; rdfs:label "ACN 14 (N)" . -#amb:ACN15 a pg:Role ; rdfs:label "ACN 15 (P)" . - -pg:AmbisonicBH1P0Group a rdfs:Class ; - rdfs:subClassOf pg:AmbisonicGroup ; - rdfs:label "Ambisonic B stream of horizontal order 1 and peripheral order 0." ; - pg:hasRole [ pg:index 0; pg:role amb:ACN0 ] ; - pg:hasRole [ pg:index 1; pg:role amb:ACN1 ] ; - pg:hasRole [ pg:index 2; pg:role amb:ACN3 ] . - -pg:AmbisonicBH1P1Group a rdfs:Class ; - rdfs:subClassOf pg:AmbisonicGroup ; - rdfs:label "Ambisonic B stream of horizontal order 1 and peripheral order 1." ; - pg:hasRole [ pg:index 0; pg:role amb:ACN0 ] ; - pg:hasRole [ pg:index 1; pg:role amb:ACN1 ] ; - pg:hasRole [ pg:index 2; pg:role amb:ACN2 ] ; - pg:hasRole [ pg:index 3; pg:role amb:ACN3 ] . - -pg:AmbisonicBH2P0Group a rdfs:Class ; - rdfs:subClassOf pg:AmbisonicGroup ; - rdfs:label "Ambisonic B stream of horizontal order 2 and peripheral order 0." ; - pg:hasRole [ pg:index 0; pg:role amb:ACN0 ] ; - pg:hasRole [ pg:index 1; pg:role amb:ACN1 ] ; - pg:hasRole [ pg:index 2; pg:role amb:ACN3 ] ; - pg:hasRole [ pg:index 3; pg:role amb:ACN4 ] ; - pg:hasRole [ pg:index 4; pg:role amb:ACN8 ] . - -pg:AmbisonicBH2P1Group a rdfs:Class ; - rdfs:subClassOf pg:AmbisonicGroup ; - rdfs:label "Ambisonic B stream of horizontal order 2 and peripheral order 1." ; - pg:hasRole [ pg:index 0; pg:role amb:ACN0 ] ; - pg:hasRole [ pg:index 1; pg:role amb:ACN1 ] ; - pg:hasRole [ pg:index 2; pg:role amb:ACN2 ] ; - pg:hasRole [ pg:index 3; pg:role amb:ACN3 ] ; - pg:hasRole [ pg:index 4; pg:role amb:ACN4 ] ; - pg:hasRole [ pg:index 5; pg:role amb:ACN8 ] . - -pg:AmbisonicBH2P2Group a rdfs:Class ; - rdfs:subClassOf pg:AmbisonicGroup ; - rdfs:label "Ambisonic B stream of horizontal order 2 and peripheral order 2." ; - pg:hasRole [ pg:index 0; pg:role amb:ACN0 ] ; - pg:hasRole [ pg:index 1; pg:role amb:ACN1 ] ; - pg:hasRole [ pg:index 2; pg:role amb:ACN2 ] ; - pg:hasRole [ pg:index 3; pg:role amb:ACN3 ] ; - pg:hasRole [ pg:index 4; pg:role amb:ACN4 ] ; - pg:hasRole [ pg:index 5; pg:role amb:ACN5 ] ; - pg:hasRole [ pg:index 6; pg:role amb:ACN6 ] ; - pg:hasRole [ pg:index 7; pg:role amb:ACN7 ] ; - pg:hasRole [ pg:index 8; pg:role amb:ACN8 ] . - -pg:AmbisonicBH3P0Group a rdfs:Class ; - rdfs:subClassOf pg:AmbisonicGroup ; - rdfs:label "Ambisonic B stream of horizontal order 3 and peripheral order 0." ; - pg:hasRole [ pg:index 0; pg:role amb:ACN0 ] ; - pg:hasRole [ pg:index 1; pg:role amb:ACN1 ] ; - pg:hasRole [ pg:index 2; pg:role amb:ACN3 ] ; - pg:hasRole [ pg:index 3; pg:role amb:ACN4 ] ; - pg:hasRole [ pg:index 4; pg:role amb:ACN8 ] ; - pg:hasRole [ pg:index 5; pg:role amb:ACN9 ] ; - pg:hasRole [ pg:index 6; pg:role amb:ACN15 ] . - -pg:AmbisonicBH3P1Group a rdfs:Class ; - rdfs:subClassOf pg:AmbisonicGroup ; - rdfs:label "Ambisonic B stream of horizontal order 3 and peripheral order 1." ; - pg:hasRole [ pg:index 0; pg:role amb:ACN0 ] ; - pg:hasRole [ pg:index 1; pg:role amb:ACN1 ] ; - pg:hasRole [ pg:index 2; pg:role amb:ACN2 ] ; - pg:hasRole [ pg:index 3; pg:role amb:ACN3 ] ; - pg:hasRole [ pg:index 4; pg:role amb:ACN4 ] ; - pg:hasRole [ pg:index 5; pg:role amb:ACN8 ] ; - pg:hasRole [ pg:index 6; pg:role amb:ACN9 ] ; - pg:hasRole [ pg:index 7; pg:role amb:ACN15 ] . - -pg:AmbisonicBH3P2Group a rdfs:Class ; - rdfs:subClassOf pg:AmbisonicGroup ; - rdfs:label "Ambisonic B stream of horizontal order 3 and peripheral order 2." ; - pg:hasRole [ pg:index 0; pg:role amb:ACN0 ] ; - pg:hasRole [ pg:index 1; pg:role amb:ACN1 ] ; - pg:hasRole [ pg:index 2; pg:role amb:ACN2 ] ; - pg:hasRole [ pg:index 3; pg:role amb:ACN3 ] ; - pg:hasRole [ pg:index 4; pg:role amb:ACN4 ] ; - pg:hasRole [ pg:index 5; pg:role amb:ACN5 ] ; - pg:hasRole [ pg:index 6; pg:role amb:ACN6 ] ; - pg:hasRole [ pg:index 7; pg:role amb:ACN7 ] ; - pg:hasRole [ pg:index 8; pg:role amb:ACN8 ] ; - pg:hasRole [ pg:index 9; pg:role amb:ACN9 ] ; - pg:hasRole [ pg:index 10; pg:role amb:ACN15 ] . - -pg:AmbisonicBH3P3Group a rdfs:Class ; - rdfs:subClassOf pg:AmbisonicGroup ; - rdfs:label "Ambisonic B stream of horizontal order 3 and peripheral order 3." ; - pg:hasRole [ pg:index 0; pg:role amb:ACN0 ] ; - pg:hasRole [ pg:index 1; pg:role amb:ACN1 ] ; - pg:hasRole [ pg:index 2; pg:role amb:ACN2 ] ; - pg:hasRole [ pg:index 3; pg:role amb:ACN3 ] ; - pg:hasRole [ pg:index 4; pg:role amb:ACN4 ] ; - pg:hasRole [ pg:index 5; pg:role amb:ACN5 ] ; - pg:hasRole [ pg:index 6; pg:role amb:ACN6 ] ; - pg:hasRole [ pg:index 7; pg:role amb:ACN7 ] ; - pg:hasRole [ pg:index 8; pg:role amb:ACN8 ] ; - pg:hasRole [ pg:index 9; pg:role amb:ACN9 ] ; - pg:hasRole [ pg:index 10; pg:role amb:ACN10 ] ; - pg:hasRole [ pg:index 11; pg:role amb:ACN11 ] ; - pg:hasRole [ pg:index 12; pg:role amb:ACN12 ] ; - pg:hasRole [ pg:index 13; pg:role amb:ACN13 ] ; - pg:hasRole [ pg:index 14; pg:role amb:ACN14 ] ; - pg:hasRole [ pg:index 15; pg:role amb:ACN15 ] . - - -# Controls - -pg:ControlGroup a rdfs:Class ; - rdfs:subClassOf pg:Group ; - rdfs:comment """ -A group representing a set of associated controls. -""" . - -pg:amplitude a pg:Role ; rdfs:label "Amplitude" . -pg:attack a pg:Role ; rdfs:label "Attack" . -pg:cutoffFrequency a pg:Role ; rdfs:label "Cutoff Frequency" . -pg:decay a pg:Role ; rdfs:label "Decay" . -pg:delay a pg:Role ; rdfs:label "Delay" . -pg:frequency a pg:Role ; rdfs:label "Frequency" . -pg:hold a pg:Role ; rdfs:label "Hold" . -pg:pulseWidth a pg:Role ; rdfs:label "Pulse Width" . -pg:ratio a pg:Role ; rdfs:label "Ratio" . -pg:release a pg:Role ; rdfs:label "Release" . -pg:resonance a pg:Role ; rdfs:label "Resonance" . -pg:sustain a pg:Role ; rdfs:label "Sustain" . -pg:threshold a pg:Role ; rdfs:label "Threshold" . -pg:waveform a pg:Role ; rdfs:label "Waveform" . - -pg:EnvelopeControlGroup a rdfs:Class ; - rdfs:subClassOf pg:ControlGroup ; - rdfs:label "Controls for a DAHDSR envelope." ; - pg:mayHaveRole pg:delay ; - pg:mayHaveRole pg:attack ; - pg:mayHaveRole pg:hold ; - pg:mayHaveRole pg:decay ; - pg:mayHaveRole pg:sustain ; - pg:mayHaveRole pg:release . - -pg:OscillatorControlGroup a rdfs:Class ; - rdfs:subClassOf pg:ControlGroup ; - rdfs:label "Controls for an oscillator." ; - pg:mayHaveRole pg:frequency ; - pg:mayHaveRole pg:amplitude ; - pg:mayHaveRole pg:waveform ; - pg:mayHaveRole pg:pulseWidth . - -pg:FilterControlGroup a rdfs:Class ; - rdfs:subClassOf pg:ControlGroup ; - rdfs:label "Controls for a filter." ; - pg:mayHaveRole pg:cutoffFrequency ; - pg:mayHaveRole pg:resonance . - -pg:CompressorControlGroup a rdfs:Class ; - rdfs:subClassOf pg:ControlGroup ; - rdfs:label "Controls for a compressor." ; - pg:mayHaveRole pg:threshold ; - pg:mayHaveRole pg:ratio . - diff --git a/lv2/ns/ext/port-groups/waf b/lv2/ns/ext/port-groups/waf deleted file mode 120000 index b955110..0000000 --- a/lv2/ns/ext/port-groups/waf +++ /dev/null @@ -1 +0,0 @@ -../../../../waf \ No newline at end of file diff --git a/lv2/ns/ext/port-groups/wscript b/lv2/ns/ext/port-groups/wscript deleted file mode 120000 index ec20a77..0000000 --- a/lv2/ns/ext/port-groups/wscript +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.wscript \ No newline at end of file diff --git a/lv2/ns/ext/port-props/ext.pc.in b/lv2/ns/ext/port-props/ext.pc.in deleted file mode 120000 index 82b50df..0000000 --- a/lv2/ns/ext/port-props/ext.pc.in +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/ns/ext/port-props/manifest.ttl b/lv2/ns/ext/port-props/manifest.ttl deleted file mode 100644 index b4afe2f..0000000 --- a/lv2/ns/ext/port-props/manifest.ttl +++ /dev/null @@ -1,8 +0,0 @@ -@prefix lv2: . -@prefix rdfs: . - - - a lv2:Specification ; - lv2:minorVersion 0 ; - lv2:microVersion 1 ; - rdfs:seeAlso . diff --git a/lv2/ns/ext/port-props/port-props.ttl b/lv2/ns/ext/port-props/port-props.ttl deleted file mode 100644 index d811959..0000000 --- a/lv2/ns/ext/port-props/port-props.ttl +++ /dev/null @@ -1,217 +0,0 @@ -@prefix pprops: . -@prefix doap: . -@prefix foaf: . -@prefix lv2: . -@prefix rdf: . -@prefix rdfs: . -@prefix xsd: . - - - a lv2:Specification ; - doap:name "LV2 Port Properties" ; - doap:release [ - doap:revision "0.1" ; - doap:created "2011-11-01" - ] ; - doap:created "2009-01-01" ; - doap:shortdesc "Additional properties for LV2 plugin ports." ; - doap:maintainer [ - a foaf:Person ; - foaf:name "Krzysztof Foltman" - ] , [ - a foaf:Person ; - foaf:name "David Robillard" ; - rdfs:seeAlso - ] ; - lv2:documentation """ -

This extension defines several useful properties for LV2 plugin ports, which -can be used in plugin descriptions to better describe ports. Using this -metadata, hosts can build better UIs for plugins, and provide more advanced -automatic functionality.

-""" . - -pprops:trigger - a lv2:PortProperty ; - rdfs:label "Trigger" ; - rdfs:comment """ -Indicates that the data item corresponds to a momentary event that has been -detected (control output ports) or is to be triggered (control input ports). -For input ports, the port needs to be reset to lv2:default value after run() -function of the plugin has returned. If the control port is assigned a GUI -widget by the host, the widget should be of auto-off (momentary, one-shot) type -- for example, a push button if the port is also declared as lv2:toggled, or a -series of push button or auto-clear input box with a "Send" button if the port -is also lv2:integer. -""" . - -pprops:supportsStrictBounds - a lv2:Feature ; - rdfs:label "Supports strict bounds" ; - rdfs:comment """ -Indicates use of host support for pprops:hasStrictBounds port property. A -plugin that specifies it as optional feature can omit value clamping for -hasStrictBounds ports, if the feature is supported by the host. When specified -as required feature, it indicates that the plugin does not do any clamping for -input ports that have a pprops:hasStrictBounds property. -""" . - -pprops:hasStrictBounds - a lv2:PortProperty ; - rdfs:label "Has strict bounds" ; - rdfs:comment """ -For hosts that support pprops:supportsStrictBounds, this indicates that the -value of the port should never exceed the port's minimum and maximum control -points. For input ports, it moves the responsibility for limiting the range of -values to host, if it supports pprops:supportsStrictBounds. For output ports, -it indicates that values within specified range are to be expected, and -breaking that should be considered by the host as error in plugin -implementation. -""" . - -pprops:expensive - a lv2:PortProperty ; - rdfs:label "Changes trigger expensive calculation" ; - rdfs:comment """ -Input ports only. Indicates that any changes to the port value may trigger -expensive background calculation (e.g. regenerate some lookup tables in a -background thread). Any value changes may have not have immediate effect, or -may cause silence or diminished-quality version of the output until background -processing is finished. Ports having this property are typically not well -suited for connection to outputs of other plugins, and should not be offered as -connection targets or for automation by default. -""" . - -pprops:causesArtifacts - a lv2:PortProperty ; - rdfs:label "May cause audio artifacts when changed" ; - rdfs:comment """ -Input ports only. Indicates that any changes to the port value may produce -slight artifacts to produced audio signals (zipper noise and other results of -signal discontinuities). Connecting ports of this type to continuous signals -is not recommended, and when presenting a list of automation targets, those -ports may be marked as artifact-producing. -""" . - -pprops:continuousCV - a lv2:PortProperty ; - rdfs:label "Carries a smooth modulation signal" ; - rdfs:comment """ -Indicates that the port carries a "smooth" modulation signal. Control input -ports of this type are well-suited for being connected to sources of smooth -signals (knobs with smoothing, modulation rate oscillators, output ports with -continuousCV type, etc.). Typically, the plugin with ports which have this -property will implement appropriate smoothing to avoid audio artifacts. For -output ports, this property suggests the value of the port is likely to change -frequently, and describes a smooth signal (e.g. successive values may be -considered points along a curve). -""" . - -pprops:discreteCV - a lv2:PortProperty ; - rdfs:label "Carries a discrete modulation signal" ; - rdfs:comment """ -Indicates that the port carries a "discrete" modulation signal. Input ports of -this type are well-suited for being connected to sources of discrete signals -(switches, buttons, classifiers, event detectors, etc.). May be combined with -pprops:trigger property. For output ports, this property suggests the value of -the port describe discrete values that should be interpreted as steps (and not -points along a curve). -""" . - -pprops:reportsBpm - a lv2:PortProperty ; - rdfs:label "Carries the current tempo expressed in BPM" ; - rdfs:comment """ -Indicates that the port is used to pass the current tempo in context of the -plugin (which may be current song tempo, or tempo of a particular subset of the -song, or the subgraph the plugin resides in). For input ports, the host may -automatically feed the port with current tempo and hide the port from the user, -unless the user or other factors encourage different behaviour. -""" . - -pprops:reportsBeatsPerBar - a lv2:PortProperty ; - rdfs:label "Carries the current number of beats in a bar" ; - rdfs:comment """ -Indicates that the port may be used to pass the current number of beats in a -bar. """ . - -pprops:reportsBeatUnit - a lv2:PortProperty ; - rdfs:label "Carries the current beat size" ; - rdfs:comment """ -Indicates that the port may be used to pass the current size of a beat (4 for a -crochet/quarter note, 8 for a quaver/eighth note, etc.). -""" . - -pprops:logarithmic - a lv2:PortProperty ; - rdfs:label "Port value uses a logarithmic scale" ; - rdfs:comment """ -Indicates that port value behaviour within specified range (bounds) is a value -using logarithmic scale. The lower and upper bounds must be specified, and -must be of the same sign. -""" . - -pprops:notAutomatic - a lv2:PortProperty ; - rdfs:label "Port is not intended as a CV input" ; - rdfs:comment """ -Indicates that the port is not primarily intended to be fed with modulation -signals from external sources (other plugins, etc.). It is merely a UI hint -and hosts may allow the user to override it. -""" . - -pprops:notOnGUI - a lv2:PortProperty ; - rdfs:label "Port is not to be displayed on a GUI or equivalent" ; - rdfs:comment """ -Indicates that the port is not primarily intended to be represented by a -separate control in the user interface window (or any similar mechanism used -for direct, immediate control of control ports). It is merely a UI hint and -hosts may allow the user to override it. -""" . - -pprops:priority - a rdf:Property ; - rdfs:domain lv2:Port ; - rdfs:range xsd:float ; - rdfs:label "Relative usefulness of a port" ; - rdfs:comment """ -Indicates how (typically) useful is the port comparing to other ports with that -property (higher value = more important). The values do not need to be unique, -and ports can be grouped based on their priorities. -""" . - -pprops:rangeSteps - a rdf:Property ; - rdfs:domain lv2:Port ; - rdfs:range xsd:nonNegativeInteger ; - rdfs:label "Number of value quantization steps" ; - lv2:documentation """ -

This value indicates into how many evenly-divided points the (control) port -range shoujld be divided for step-wise control. This may be used for changing -the value with step-based controllers like arrow keys, mouse wheel, rotary -encoders, etc.

- -

Note that when used with a pprops:logarithmic port, the steps are -logarithmic too, and port value can be calculated as:

- -
-value = lower * pow(upper / lower, step / (steps - 1))
-
- -

and the step from value is:

- -
-step = (steps - 1) * log(value / lower) / log(upper / lower)
-
- -

where:

-
    -
  • value is the port value
  • -
  • step is the step number (0..steps)
  • -
  • steps is the number of steps (= value of :rangeSteps property)
  • -
  • lower and upper are the bounds
  • -
-""" . diff --git a/lv2/ns/ext/port-props/waf b/lv2/ns/ext/port-props/waf deleted file mode 120000 index b955110..0000000 --- a/lv2/ns/ext/port-props/waf +++ /dev/null @@ -1 +0,0 @@ -../../../../waf \ No newline at end of file diff --git a/lv2/ns/ext/port-props/wscript b/lv2/ns/ext/port-props/wscript deleted file mode 120000 index ec20a77..0000000 --- a/lv2/ns/ext/port-props/wscript +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.wscript \ No newline at end of file diff --git a/lv2/ns/ext/presets/ext.pc.in b/lv2/ns/ext/presets/ext.pc.in deleted file mode 120000 index 82b50df..0000000 --- a/lv2/ns/ext/presets/ext.pc.in +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/ns/ext/presets/manifest.ttl b/lv2/ns/ext/presets/manifest.ttl deleted file mode 100644 index 51985ab..0000000 --- a/lv2/ns/ext/presets/manifest.ttl +++ /dev/null @@ -1,9 +0,0 @@ -@prefix lv2: . -@prefix rdfs: . - - - a lv2:Specification ; - lv2:minorVersion 2 ; - lv2:microVersion 2 ; - rdfs:seeAlso . - diff --git a/lv2/ns/ext/presets/presets.ttl b/lv2/ns/ext/presets/presets.ttl deleted file mode 100644 index e11210a..0000000 --- a/lv2/ns/ext/presets/presets.ttl +++ /dev/null @@ -1,148 +0,0 @@ -# LV2 Presets Extension -# Copyright 2009-2011 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 dcs: . -@prefix doap: . -@prefix foaf: . -@prefix lv2: . -@prefix owl: . -@prefix pset: . -@prefix rdf: . -@prefix rdfs: . -@prefix xsd: . - - - a foaf:Person ; - foaf:name "David Robillard" ; - foaf:homepage ; - foaf:mbox ; - rdfs:seeAlso . - - - a lv2:Specification ; - doap:license ; - doap:name "LV2 Presets" ; - doap:shortdesc "Presets for LV2 plugins. " ; - doap:maintainer ; - doap:release [ - doap:revision "2.2" ; - doap:created "2011-11-21" ; - doap:file-release ; - dcs:blame ; - dcs:changeset [ - dcs:item [ - rdfs:label "Update packaging." - ] , [ - rdfs:label "Improve documentation." - ] - ] - ] , [ - doap:revision "2.0" ; - doap:created "2010-10-04" ; - doap:file-release ; - dcs:blame ; - dcs:changeset [ - dcs:item [ - rdfs:label "Initial release." - ] - ] - ] ; - lv2:documentation """ -

This extension describes a format for presets (i.e. named sets of control -values) for LV2 plugins. The structure of pset:Preset is deliberately very -similar to the description of a plugin and can be thought of as a plugin -overlay. For example:

- -
-@prefix eg: <http://example.org/> .
-
-eg:mypreset
-    a pset:Preset ;
-    rdfs:label "One louder" ;
-    pset:appliesTo eg:myplugin ;
-    lv2:port [
-        lv2:symbol "volume1" ;
-        pset:value 11
-    ] , [
-        lv2:symbol "volume2" ;
-        pset:value 11.0
-    ] .
-
- -

Presets may be defined in any bundles, including the plugin's bundle, -separate third party preset bundles, or user-created preset bundles created by -hosts. The manifest.ttl of a bundle containing presets should list the -presets like so:

- -
-eg:mypreset
-    a              pset:Preset ;
-    pset:appliesTo eg:myplugin ;
-    rdfs:seeAlso   <mypreset.ttl> .
-
- -

This extension does not define a dynamic mechanism for changing plugin -presets for plugins that require such a facility, but may be extended to do -so.

-""" . - -pset:Preset - a rdfs:Class ; - rdfs:subClassOf lv2:PluginBase ; - rdfs:label "LV2 Preset" ; - rdfs:subClassOf [ - a owl:Restriction ; - owl:onProperty rdfs:label ; - owl:someValuesFrom xsd:string ; - rdfs:comment "A Preset MUST have at least one string rdfs:label." - ] ; - rdfs:comment """ -A Preset for an LV2 Plugin. A preset can be considered an "overlay" on a -Plugin. Rather than attempting to define all valid predicates for a Preset -(which is not possible since presets may need to specify values for things -defined in other extensions), the presets extension simply provides this -class which can be augmented with any data in the exact same fashion as the -definition of a Plugin. - -A Preset SHOULD have at least one pset:appliesTo property. -Each Port on a Preset MUST have at least a lv2:symbol property and a -pset:value property. -""" . - -pset:appliesTo - a rdf:Property ; - rdfs:domain pset:Preset ; - rdfs:range lv2:Plugin ; - rdfs:label "Applies to" ; - rdfs:comment """ -Specifies the Plugin(s) a Preset may be applied to. When a Preset applies -to a Plugin, that Preset SHOULD have ports for every control port on that -plugin, each of which SHOULD have a pset:value property. If the Preset is -missing ports, or refers to ports which do not exist on the Plugin, then -the host SHOULD apply all the values in the preset that do match the Plugin. - -The Preset MAY have any other values that should be applied to the Plugin -in some way. The host SHOULD simply ignore any values on a Preset it does -not understand. -""" . - -pset:value - a rdf:Property ; - rdfs:domain lv2:Port ; - rdfs:label "Has value" ; - rdfs:comment """ -Specifies the value of a Port on some Preset. This property is used -in a similar way to e.g. lv2:default. -""" . diff --git a/lv2/ns/ext/presets/waf b/lv2/ns/ext/presets/waf deleted file mode 120000 index b955110..0000000 --- a/lv2/ns/ext/presets/waf +++ /dev/null @@ -1 +0,0 @@ -../../../../waf \ No newline at end of file diff --git a/lv2/ns/ext/presets/wscript b/lv2/ns/ext/presets/wscript deleted file mode 120000 index ec20a77..0000000 --- a/lv2/ns/ext/presets/wscript +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.wscript \ No newline at end of file diff --git a/lv2/ns/ext/pui/ext.pc.in b/lv2/ns/ext/pui/ext.pc.in deleted file mode 120000 index 82b50df..0000000 --- a/lv2/ns/ext/pui/ext.pc.in +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/ns/ext/pui/manifest.ttl b/lv2/ns/ext/pui/manifest.ttl deleted file mode 100644 index 1229118..0000000 --- a/lv2/ns/ext/pui/manifest.ttl +++ /dev/null @@ -1,8 +0,0 @@ -@prefix lv2: . -@prefix rdfs: . - - - a lv2:Specification; - lv2:minorVersion 0; - lv2:microVersion 1; - rdfs:seeAlso . diff --git a/lv2/ns/ext/pui/pui.h b/lv2/ns/ext/pui/pui.h deleted file mode 100644 index caa7deb..0000000 --- a/lv2/ns/ext/pui/pui.h +++ /dev/null @@ -1,374 +0,0 @@ -/************************************************************************ - * - * Plugin UI extension for LV2 - * - * Copyright (C) 2006-2011 Lars Luthman - * - * Based on lv2.h, which was - * - * Copyright (C) 2000-2002 Richard W.E. Furse, Paul Barton-Davis, - * Stefan Westerfeld - * Copyright (C) 2006 Steve Harris, David Robillard. - * - * This header is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published - * by the Free Software Foundation; either version 2.1 of the License, - * or (at your option) any later version. - * - * This header is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 - * USA. - * - ***********************************************************************/ - -/** - @file pui.h C API for the LV2 UI extension . - - This file specifies a C API for communication between an LV2 host and an - LV2 UI. The interface is similar to the one used for actual LV2 plugins. - - The entry point is the function lv2ui_descriptor(). -*/ - -#ifndef LV2_PUI_H -#define LV2_PUI_H - -#include - -/** The URI of this extension (note this is not the same as the prefix). */ -#define LV2_PUI_URI "http://lv2plug.in/ns/ext/pui" - -/** The numerical ID returned by LV2_PUI_Host_Descriptor::port_index() for - invalid port symbols. */ -#define LV2_PUI_INVALID_PORT_INDEX ((uint32_t)-1) - -/** The full URI for the pui:floatControl PortProtocol. */ -#define LV2_PUI_FLOAT_CONTROL_URI "http://lv2plug.in/ns/ext/pui#floatControl" - -/** The full URI for the pui:floatPeakRMS PortProtocol. */ -#define LV2_PUI_FLOAT_PEAK_RMS_URI "http://lv2plug.in/ns/ext/pui#floatPeakRMS" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - A data type that is used to pass peak and RMS values for a period of - audio data at an input or output port to an UI, using port_event. See the - documentation for pui:floatPeakRMS for details about how and when this - should be done. -*/ -typedef struct _LV2_PUI_Peak_RMS_Data { - - /** - The start of the measurement period. This is just a running counter that - must not be interpreted as any sort of global frame position. It should - only be interpreted relative to the starts of other measurement periods - in port_event() calls to the same plugin instance. - - This counter is allowed to overflow, in which case it should just wrap - around. - */ - uint32_t period_start; - - /** - The size of the measurement period, in the same units as period_start. - */ - uint32_t period_size; - - /** - The peak value for the measurement period. This should be the maximal - value for abs(sample) over all the samples in the period. - */ - float peak; - - /** - The RMS value for the measurement period. This should be the root mean - square value of the samples in the period, equivalent to - sqrt((pow(sample1, 2) + pow(sample2, 2) + ... + pow(sampleN, 2)) / N) - where N is period_size. - */ - float rms; - -} LV2_PUI_Peak_RMS_Data; - -/** - A pointer to a widget or other type of UI. - The actual type is defined by the type of the UI defined in the RDF data. - All the functionality provided by this extension is toolkit independent, the - host only needs to pass the necessary callbacks and display the widget, if - possible. Plugins may have several UIs, in various toolkits. -*/ -typedef void* LV2_PUI_Widget; - -/** - Handle for a particular instance of a UI. - It is valid to compare this to NULL (0 for C++) but otherwise the host MUST - NOT attempt to interpret it. The UI may use it to reference internal - instance data. -*/ -typedef void* LV2_PUI_Handle; - -/** - Handle for host functions and data provided to a UI. - An object of this type is passed to the UI's instantiate() function, and the - UI must in turn pass it as the first parameter to the callbacks in - LV2_PUI_Host_Descriptor. The host may use it to reference internal data, such - as the plugin instance that the UI is associated with. The UI MUST NOT - interpret the value of an LV2_PUI_Host_Handle in any way. -*/ -typedef void* LV2_PUI_Host_Handle; - -/** - Host-provided functions that the UI can use to control the plugin instance. - - A pointer to an object of this type is passed to the lv2ui_descriptor() - function. - - The host MUST provide non-NULL values for all the function pointers. -*/ -typedef struct _LV2_PUI_Host_Descriptor { - - /** - Send data to one of the plugin's input ports. - - The @c buffer parameter MUST point to a block of data @c buffer_size - bytes large. The contents of this buffer and what the host should do - with it depends on the value of the @c port_protocol parameter. - - The @c port_protocol parameter MUST be a numeric ID for a - pui:PortProtocol. Numeric IDs for PortProtocols are retrieved using the - port_protocol_id() function. - - The @c buffer is only valid during the time of this function call, so if - the host wants to keep it for later use it has to copy the contents to an - internal buffer. - - @param host_handle The @c host_handle that was passed to the UI's - instantiate() function. - @param port_index The index of the port that the data should be written - to, as returned by port_index(). - @param buffer_size The size of the data pointed to by @c buffer, in - bytes. - @param port_protocol The numeric ID of the Port Protocol to use, - as returned by port_protocol_id(). - */ - void (*write_port)(LV2_PUI_Host_Handle host_handle, - uint32_t port_index, - uint32_t buffer_size, - uint32_t port_protocol, - void const* buffer); - - /** - Return the numerical index for a port. - This index is used when writing data to ports using write_port() and whe - receiving data using port_event(). If @c port_symbol is not a valid port - symbol for @c plugin the host it MUST return - LV2_PUI_INVALID_PORT_INDEX. For performance reasons it may be a good idea - to cache port indices in the UI at instantiation time. - - @param host_handle The LV2_PUI_Host_Handle that was passed to the UI's - instantiate() function. - @param port_symbol The port's symbol, as defined in the RDF data for - the plugin. - */ - uint32_t (*port_index)(LV2_PUI_Host_Handle host_handle, - char const* port_symbol); - - /** - Subscribe to updates for a port. - This means that the host will call the UI's port_event() function when - the port value changes (as defined by the PortProtocol). - - Calling this function with the same @c port_index and @c port_protocol - as an already active subscription has no effect. - - @param host_handle The @c host_handle that was passed to the UI's - instantiate() function. - @param port_index The index of the port, as returned by port_index(). - @param port_protocol The numeric ID of the PortProtocol, as - returned by port_protocol_id(). - */ - void (*subscribe_to_port)(LV2_PUI_Host_Handle host_handle, - uint32_t port_index, - uint32_t port_protocol, - const LV2_Feature* const* features); - - /** - Unsubscribe from updates for a port. - This means that the host will cease calling calling port_event() when - the port value changes. - - Calling this function with a @c port_index and @c port_protocol that - does not refer to an active port subscription has no effect. - - @param host_handle The @c host_handle that was passed to the UI's - instantiate() function. - @param port_index The index of the port, as returned by port_index(). - @param port_protocol The numeric ID of the PortProtocol, as - returned by port_protocol_id(). - */ - void (*unsubscribe_from_port)(LV2_PUI_Host_Handle host_handle, - uint32_t port_index, - uint32_t port_protocol, - const LV2_Feature* const* features); - - -} LV2_PUI_Host_Descriptor; - -/** - This struct contains the implementation of an UI. A pointer to an - object of this type is returned by the lv2ui_descriptor() function. -*/ -typedef struct _LV2_PUI_Descriptor { - - /** - The URI for this UI (not for the plugin it controls). - */ - char const* URI; - - /** - Create a new UI object and return a handle to it. This function works - similarly to the instantiate() member in LV2_Descriptor. - - @param descriptor The descriptor for the UI to instantiate. - - @param plugin_uri The URI of the plugin that this UI will control. - - @param bundle_path The path to the bundle containing the RDF data that - references this shared object file, with trailing separator (e.g. '/'). - - @param host_descriptor A pointer to an object that contains function - pointers that the UI instance should use to control the plugin - instance. This pointer MUST be valid until cleanup() is called for this - UI instance. - - @param host_handle A handle that the host may use to reference internal - data. It MUST be passed as the first parameter to the function - pointers in @c host_descriptor, and MUST NOT be interpreted in any other - way by the UI. - - @param features A NULL-terminated array of LV2_Feature pointers. The - host must pass all feature URIs that it and the UI supports and any - additional data, just like in the LV2 plugin instantiate() - function. Note that UI features and plugin features are NOT necessarily - the same; @c features will probably not be the same array as the one the - plugin host passes to a plugin. - */ - LV2_PUI_Handle (*instantiate)( - struct _LV2_PUI_Descriptor const* descriptor, - char const* plugin_uri, - char const* bundle_path, - LV2_PUI_Host_Descriptor const* host_descriptor, - LV2_PUI_Host_Handle host_handle, - LV2_Feature const* const* features); - - /** - Return the widget pointer for the UI object. - This MUST return the same value during the entire lifetime of the UI - object. - */ - LV2_PUI_Widget (*get_widget)(LV2_PUI_Handle ui); - - /** - Destroy the UI object and the associated widget. - The host must not try to access the widget after calling this function. - */ - void (*cleanup)(LV2_PUI_Handle ui); - - /** - Notify the UI that something has happened to a subscribed port. - - This is called by the host when something happens at a plugin port that - has been subscribed to using - LV2_PUI_Host_Descriptor::add_port_subscription(). - - The @c buffer is only valid during the time of this function call, so if - the UI wants to keep it for later use it has to copy the contents to an - internal buffer. - - @param ui A handle for the UI object. - @param port_index The index of the port that has changed, as returned by - LV2_PUI_Host_Descriptor::port_index(). - @param buffer_size The size of the data buffer in bytes. - @param port_protocol The format of the data buffer, as returned by - LV2_PUI_Host_Descriptor::port_protocol_id(). - @param buffer A pointer to the data buffer. - */ - void (*port_event)(LV2_PUI_Handle ui, - uint32_t port_index, - uint32_t buffer_size, - uint32_t port_protocol, - void const* buffer); - - /** - Return a data structure associated with an extension URI. - - This facility can be used by extensions to extend the LV2_PUI_Descriptor - API. This function adheres to the same rules as - LV2_Descriptor::extension_data, except it applies to UIs rather than - plugins. - */ - void const* (*extension_data)(char const* uri); - -} LV2_PUI_Descriptor; - -typedef void* LV2_PUI_Lib_Data; - -/** - Descriptor for a plugin UI library. - - Each plugin UI shared library has exactly one of these objects, accessed - via the lv2_pui_lib_descriptor() function in that library. -*/ -typedef struct { - /** - Opaque library data which must be passed as the first parameter to - all the methods of this struct. - */ - LV2_PUI_Lib_Data lib_data; - - void (*cleanup)(LV2_PUI_Lib_Data lib_data); - - /** - Prototype for UI accessor function. - - This function follows the same rules as lv2_descriptor(), except it - applies to UIs rather than plugins. - */ - LV2_PUI_Descriptor const* (*pui_descriptor)(LV2_PUI_Lib_Data lib_data, - uint32_t index); - -} LV2_PUI_Lib_Descriptor; - -/** - Prototype for UI library accessor function. - - This is the entry point for a plugin UI library. Hosts load this symbol - from the library and call this function to obtain a library descriptor which - can be used to access all the UIs contained in this library. The returned - object must not be destroyed (with LV2_PUI_Lib_Descriptor::cleanup()) until - all UIs loaded from that library have been destroyed. -*/ -LV2_PUI_Lib_Descriptor const* lv2_pui_lib_descriptor( - const char* bundle_path, - LV2_Feature const* const* features); - -/** - Type of the lv2_pui_lib_descriptor() function in a UI library. -*/ -typedef LV2_PUI_Lib_Descriptor const* (*LV2_PUI_Lib_Descriptor_Func)( - const char* bundle_path, - LV2_Feature const* const* features); - -#ifdef __cplusplus -} -#endif - -#endif /* LV2_PUI_H */ diff --git a/lv2/ns/ext/pui/pui.ttl b/lv2/ns/ext/pui/pui.ttl deleted file mode 100644 index d305769..0000000 --- a/lv2/ns/ext/pui/pui.ttl +++ /dev/null @@ -1,284 +0,0 @@ -# LV2 Plugin UI Extension -# Copyright (C) 2010-2011 Lars Luthman -# -# Based on lv2.ttl, which is -# Copyright (C) 2006-2008 Steve Harris, David Robillard -# -# This extension should be considered a replacement for the earlier -# in-process UI extension with the URI . -# Hosts and plugins that used that extension should use this one instead. -# The earlier in-process UI extension is not compatible with LV2 revision 3 -# and later and may break in subtle ways. -# -# Permission is hereby granted, free of charge, to any person obtaining a -# copy of this software and associated documentation files (the "Software"), -# to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, -# and/or sell copies of the Software, and to permit persons to whom the -# Software is furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR -# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -# OTHER DEALINGS IN THE SOFTWARE. - -@prefix doap: . -@prefix foaf: . -@prefix lv2: . -@prefix pui: . -@prefix rdf: . -@prefix rdfs: . - - - a lv2:Specification ; - doap:license ; - doap:name "LV2 UI" ; - doap:shortdesc "Generic UI interface for LV2 plugins." ; - doap:release [ - doap:revision "0.1" ; - doap:created "2011-03-26" - ] ; - doap:maintainer [ - a foaf:Person ; - foaf:name "Lars Luthman" ; - foaf:mbox - ] ; - lv2:documentation """ -

This extension defines an interface that can be used to create UIs for -plugins. The UIs are code that reside in shared object files in an LV2 -bundle and are referenced in the RDF data using the triples:

-
-@prefix pui: <http://lv2plug.in/ns/ext/pui#> .
-
-<http://example.org/my-ui>
-    a             pui:Gtk2UI ;
-    lv2:appliesTo <http://example.org/my-plugin> ;
-    pui:binary    <my-ui.so> .
-
-

... where http://example.org/my-plugin is the URI of the plugin, -http://example.org/my-ui is the URI of the plugin UI and -my-ui.so is the relative URI to the shared object file. While it -is possible to have the plugin UI and the plugin in the same shared object file -it is probably a good idea to keep them separate so that hosts that don't want -UIs don't have to load the UI code.

- -

A UI MUST specify its class in the RDF data and the class MUST be a proper -subclass of pui:UI, in this case pui:Gtk2UI. The class defines what type the -UI is, e.g. what graphics toolkit it uses. There are no UI classes defined in -this extension, those are specified separately (and anyone can define their -own).

- -

It's entirely possible to have multiple UIs for the same plugin, or to have -the UI for a plugin in a different bundle from the actual plugin - this way -people other than the plugin author can write plugin UIs independently without -editing the original plugin bundle. It is also possible to have one UI that -works with several different plugins.

- -

UIs should also be written in such a way that the host may load several -instances of an UI, or different UIs, and use them with the same plugin -instance.

- -

Note that the process that loads the shared object file containing the UI -code and the process that loads the shared object file containing the actual -plugin implementation do not have to be the same. There are many valid reasons -for having the plugin and the UI in different processes, or even on different -machines. This means that you can not use singletons and -global variables and expect them to refer to the same objects in the UI and the -actual plugin. The function callback interface defined in the header pui.h is -all you can expect to work.

-""" . - -pui:UI - a rdfs:Class ; - rdfs:subClassOf lv2:Feature ; - rdfs:label "UI" ; - lv2:documentation """ -

The class which represents an LV2 plugin UI. -

- -

To be used by a host a UI MUST have at least the following properties:

-
    -
  • rdf:type (with object a proper subclass of pui:UI)
  • -
  • doap:name (one without language tag)
  • -
  • lv2:binary (with a shared object file as object)
  • -
  • lv2:appliesTo (with a LV2 plugin as object)
  • -
- -

The rdf:type of an UI is used by the host to decide whether it supports the -UI and how to handle the LV2_PUI_Widget object that is returned by the UIs -get_widget() function. For example, a type of pui:Gtk2UI might tell the -host that LV2_PUI_Widget is a pointer to an object of a type defined in the -Gtk+ library. No UI types are defined in this extension, that is intentionally -left for other extensions.

- -

The doap:name property should be at most a few words in length using title -capitalization, e.g. "Flashy Mixer GUI". Use lv2:documentation for more -detailed descriptions.

- -

UIs may have optional or required features, specified using lv2:optionalFeature -or lv2:requiredFeature. The same rules apply here as for plugins; a host MUST -pass the LV2_Feature objects for all features it supports to the UI's -instantiate() function, a host SHOULD NOT try to instantiate an UI if it -doesn't support all of its required features, and an UI MUST fail to -instantiate if the host doesn't pass all required features to instantiate(). -

- -

For details about the C API used to load UIs, see the file pui.h. -

-""" . - -pui:PortProtocol - a rdfs:Class ; - rdfs:subClassOf lv2:Feature ; - rdfs:label "Port protocol" ; - lv2:documentation """ -

A PortProtocol defines a certain way of communicating port data between UI -and plugin. PortProtocols can be specified in additional extensions, and -those extensions MUST specify: -

- -
    -
  1. Which plugin port types the buffer type is valid for
  2. -
  3. When the host should call port_event() in LV2_PUI_Descriptor
  4. -
  5. The format of the data in the buffer passed to port_event()
  6. -
  7. The format of the data in the buffer passed to write_port()
  8. -
  9. What happens when the UI calls write_port() in LV2_PUI_Host_Descriptor
  10. -
  11. What data (if any) should be passed in the LV2_Feature data pointer.
  12. -
- -

For an example, see pui:floatControl or pui:floatPeakRMS. -

- -

PortProtocol is a subclass of lv2:Feature, so UIs use lv2:optionalFeature and -lv2:requiredFeature to specify which PortProtocols they want to use. -

-""" . - -pui:floatControl - a pui:PortProtocol ; - rdfs:label "Floating point value" ; - lv2:documentation """ -

The rules (see pui:PortProtocol) for this port protocol are:

-
    -
  1. This PortProtocol is valid for ports with the type lv2:ControlPort.
  2. -
  3. The host SHOULD call port_event() as soon as possible when the port value - has changed, but the plugin MUST NOT depend on a call for every change or - the timing of the calls. However, the host MUST do the calls in the same - order that the value changes occur in.
  4. -
  5. The format of the data in the buffer passed to port_event() is a single - float, and the buffer size is sizeof(float).
  6. -
  7. Same as 3.
  8. -
  9. The host SHOULD change the port value as soon as possible when write_port() - is called, but the UI MUST NOT depend on a change for every call or the - timing of the changes. However, the host MUST do the changes in the same - order that the function calls occur in.
  10. -
  11. The data pointer in the LV2_Feature object for this feature should be - NULL.
  12. -
-""" . - -pui:floatPeakRMS - a pui:PortProtocol ; - rdfs:label "Peak and RMS for a period of audio data" ; - lv2:documentation """ -

This port protocol defines a way for the host to send continuous peak -and RMS measurements of the audio signal at a certain port to the UI. The -intended use is visualisation, e.g. an animated meter widget that shows -the level of the audio input or output.

- -

A contiguous sequence of audio samples for which a single peak value -and a single RMS value have been computed is called a measurement -period.

- -

The rules (see pui:PortProtocol) for this port protocol are:

-
    -
  1. This PortProtocol is valid for ports with the type lv2:AudioPort.
  2. -
  3. The host SHOULD call port_event() at regular intervals. The measurement - periods used for calls to port_event() for the same port SHOULD be - contiguous (i.e. the measurement period for one call should begin right - after the end of the measurement period for the previous call ends) unless - the UI has removed and re-added the port subscription between those calls. - However, UIs MUST NOT depend on either the regularity of the calls or the - contiguity of the measurement periods; hosts may change the call rate - or skip calls for performance or other reasons. Measurement periods for - different calls to port_event() for the same port MUST NOT overlap.
  4. -
  5. The format of the data in the buffer passed to port_event() is a single - LV2_PUI_Peak_RMS_Data object, and the buffer size is - sizeof(LV2_PUI_Peak_RMS_Data).
  6. -
  7. The UI MUST NOT call write_port() with the ID for this port protocol as - the port_protocol parameter.
  8. -
  9. The host MUST ignore any write_port() calls with the ID for this port - protocol as the port_protocol parameter.
  10. -
  11. The data pointer in the LV2_Feature object for this feature should be - NULL.
  12. -
-""" . - -pui:events - a pui:PortProtocol ; - rdfs:label "Event buffer" ; - lv2:documentation """ -
    -
  1. This PortProtocol is valid for ports with the type ev:EventPort.
  2. -
  3. The host MUST call port_event() whenever there is an event in an input port - prior to the plugin instance's run() function is called, and whenever there - is an event in an output port after run() has been called. The UI MUST NOT - depend on the timing of the calls. However, the host MUST do the calls in - the same order that the events occur in. The host is allowed and encouraged - to bundle multiple events into a single port_event() call if it improves - performance.
  4. -
  5. The data buffer passed to port_event() is an LV2_Event_Buffer, as specified - in the Event extension. The stamp_type MUST be ignored. The frames and - subframes fields of every event in the buffer MUST be ignored. Events with - type 0 (reference counted events) MUST be ignored.
  6. -
  7. The data buffer passed to write_event() is an LV2_Event_Buffer, as - specified in the Event extension. The stamp_type MUST be ignored. The - frames and subframes fields of every event in the buffer MUST be - ignored. The host MUST NOT pass events with type 0 (references) unless the - UI supports the feature "http://lv2plug.in/ns/ext/event".
  8. -
  9. The host MUST pass all the events in the buffer to the plugin instance's - event port in the same order, but the plugin and the UI MUST NOT depend on - the timing of the events, or on whether they are all sent to the plugin in - the same run() call or distributed over multiple calls.
  10. -
  11. The data pointer in the LV2_Feature object for this feature should be - NULL.
  12. -
-""" . - -pui:Gtk2UI - a rdfs:Class ; - rdfs:subClassOf pui:UI ; - rdfs:label "Gtk+ UI" ; - lv2:documentation """ -

The class which represents a Gtk+ UI. For a successfully created instance of -an UI of this class, the get_widget() function MUST return a pointer to a valid -GtkWidget object compatible with Gtk+ version 2.0. The host MUST ensure that -the Gtk+ library has been initialised and that the Glib main loop is running -before an UI of this type is instantiated.

- -

Unless otherwise specified by extensions, all function pointers in -LV2_PUI_Descriptor may only be called from the thread that runs the Glib main -loop.

-""" . - -pui:noHostResize - a lv2:Feature ; - rdfs:label "No host resize" ; - lv2:documentation """ -

This Feature should only be used with UIs.

- -

When this Feature is active the host SHOULD NOT resize the UI widget to any -other size than its natural size, which the host should be able to determine -via the API of whatever toolkit the UI is implemented in. However, the UI MUST -NOT break if the widget is resized to another size. This Feature can be used -for example when the widget uses a fixed-size pixmap interface.

- -

The data pointer in the LV2_Feature object for this Feature should be set to -NULL.

-""" . diff --git a/lv2/ns/ext/pui/waf b/lv2/ns/ext/pui/waf deleted file mode 120000 index b955110..0000000 --- a/lv2/ns/ext/pui/waf +++ /dev/null @@ -1 +0,0 @@ -../../../../waf \ No newline at end of file diff --git a/lv2/ns/ext/pui/wscript b/lv2/ns/ext/pui/wscript deleted file mode 120000 index ec20a77..0000000 --- a/lv2/ns/ext/pui/wscript +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.wscript \ No newline at end of file diff --git a/lv2/ns/ext/reference/ext.pc.in b/lv2/ns/ext/reference/ext.pc.in deleted file mode 120000 index 82b50df..0000000 --- a/lv2/ns/ext/reference/ext.pc.in +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/ns/ext/reference/manifest.ttl b/lv2/ns/ext/reference/manifest.ttl deleted file mode 100644 index e25c54d..0000000 --- a/lv2/ns/ext/reference/manifest.ttl +++ /dev/null @@ -1,9 +0,0 @@ -@prefix lv2: . -@prefix rdfs: . - - - a lv2:Specification ; - lv2:minorVersion 0 ; - lv2:microVersion 1 ; - rdfs:seeAlso . - diff --git a/lv2/ns/ext/reference/reference.h b/lv2/ns/ext/reference/reference.h deleted file mode 100644 index 26ef4c3..0000000 --- a/lv2/ns/ext/reference/reference.h +++ /dev/null @@ -1,161 +0,0 @@ -/* - Copyright 2008-2011 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. -*/ - -/** - @file reference.h C header for the LV2 Reference extension - . -*/ - -#ifndef LV2_REFERENCE_H -#define LV2_REFERENCE_H - -#define LV2_REFERENCE_URI "http://lv2plug.in/ns/ext/reference" -#define LV2_REFERENCE_BLOB_SUPPORT_URI LV2_REFERENCE_URI "#blobSupport" - -#include -#include - -#include "lv2/lv2plug.in/ns/ext/atom/atom.h" - -/** - Dynamically Allocated Data. - - This is an opaque piece of data of any type, dynamically allocated in memory. - Unlike an "atom", a "blob" is not necessarily POD. Non-POD data is referred - to by a "reference (a special case of atom with type 0). - - This is a pointer to host data which is opaque to the plugin. Plugins MUST - NOT interpret this data in any way, except via host-provided functions in - LV2_Blob_Support. -*/ -typedef void* LV2_Blob; - -typedef LV2_Atom LV2_Reference; - -typedef void* LV2_Blob_Support_Data; - -typedef void (*LV2_Blob_Destroy)(LV2_Blob* blob); - -/** - The data field of the LV2_Feature for reference:blobSupport. - - A host which supports blobs must pass an LV2_Feature to the plugin's - instantiate method with 'URI' = "http://lv2plug.in/ns/ext/reference#blobSupport" - and 'data' pointing to an instance of this struct. All fields of this struct - MUST be set to non-NULL values by the host, except possibly 'data'. -*/ -typedef struct { - - /** - Pointer to opaque host data. - - The plugin MUST pass this to any call to functions in this struct. - Otherwise, the plugin MUST NOT interpret this value in any way. - */ - LV2_Blob_Support_Data data; - - /** - The size of a reference, in bytes. - - This value is provided by the host so plugins can allocate large enough - chunks of memory to store references. Note a reference is an LV2_Reference - with type reference:Reference, hence ref_size is a uint16, like - LV2_Reference.size. - */ - uint16_t ref_size; - - /** - Return the Blob referred to by @a ref. - - The returned value MUST NOT be used in any way other than by calling - methods defined in LV2_Blob_Support (e.g. it MUST NOT be directly - accessed, copied, or destroyed). The actual payload of the blob can - be accessed with LV2_Blob_Support.blob_get. - */ - LV2_Blob (*ref_get)(LV2_Blob_Support_Data data, - LV2_Reference* ref); - - /** - Copy a reference. - This copies a reference but not the blob it refers to, - i.e. after this call @a dst and @a src refer to the same LV2_Blob. - */ - void (*ref_copy)(LV2_Blob_Support_Data data, - LV2_Reference* dst, - LV2_Reference* src); - - /** - Reset (release) a reference. - After this call, @a ref is invalid. Implementations must be sure to - call this function when necessary, or memory leaks will result. The - specific times this is necessary MUST be defined by any extensions that - define a mechanism for transporting references. The standard semantics are: -
  • Whenever passed a Reference (e.g. via a Port) and run, the - plugin owns that reference.
  • -
  • The plugin owns any reference it creates (e.g. by using blob_new or - ref_copy).
  • -
  • For any reference it owns, the plugin MUST either: -
    • Copy the reference and store it (to be used in future runs and - released later).
    • -
    • Copy the reference to an output port exactly once.
    • -
    • Release it with ref_reset.
  • -
- */ - void (*ref_reset)(LV2_Blob_Support_Data data, - LV2_Reference* ref); - - /** - Initialize a reference to point to a newly allocated Blob. - - @param data Must be the data member of this struct. - @param ref Pointer to an area of memory at least as large as - the ref_size field of this struct. On return, this will - be the unique reference to the new blob, which is owned by the - caller. Assumed to be uninitialised, i.e. the caller MUST NOT - pass a valid reference since this could cause a memory leak. - @param destroy Function to destroy this blob. This function - MUST clean up any resources contained in the blob, but MUST NOT - attempt to free the memory pointed to by its LV2_Blob* parameter - (since this is allocated by the host). - @param type ID of type of blob to allocate. - @param size Size of blob to allocate in bytes. - */ - void (*blob_new)(LV2_Blob_Support_Data data, - LV2_Reference* ref, - LV2_Blob_Destroy destroy, - uint32_t type, - size_t size); - - /** - Get blob's type as an ID. - - The return value may be any type URI, mapped to an integer with the - URI Map extension with context = NULL. - */ - uint32_t (*blob_type)(LV2_Blob blob); - - /** - Get blob's body. - - Returns a pointer to the start of the blob data. The format of this - data is defined by the return value of the type method. It MUST NOT - be used in any way by code which does not understand that type. - */ - void* (*blob_data)(LV2_Blob blob); - -} LV2_Blob_Support; - -#endif /* LV2_REFERENCE_H */ diff --git a/lv2/ns/ext/reference/reference.ttl b/lv2/ns/ext/reference/reference.ttl deleted file mode 100644 index bbf56d4..0000000 --- a/lv2/ns/ext/reference/reference.ttl +++ /dev/null @@ -1,82 +0,0 @@ -# LV2 Reference Extension -# Copyright 2007-2011 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 atom: . -@prefix doap: . -@prefix foaf: . -@prefix lv2: . -@prefix rdf: . -@prefix rdfs: . -@prefix reference: . - - - a lv2:Specification ; - doap:name "LV2 Reference" ; - doap:shortdesc "A reference data type for using non-POD data." ; - doap:release [ - doap:revision "0.1" ; - doap:created "2011-07-22" - ] ; - doap:maintainer [ - a foaf:Person ; - foaf:name "David Robillard" ; - foaf:homepage ; - rdfs:seeAlso - ] ; - lv2:documentation """ -

This extension defines a mechanism for working with generic/opaque -dynamically allocated memory, called a "Blob", which is -(unlike an Atom) not necessarily POD. Blobs are accessed via a -reference:Reference, which is a special case of Atom that always has type = -0, is not POD, and can only be copied using host provided functions. -This allows plugins and hosts to work with data of any type at all.

-""" . - -reference:Reference a rdfs:Class ; - rdfs:subClassOf atom:Atom ; - rdfs:label "Reference" ; - lv2:documentation """ -

Reference to an lv2:Blob. The actual contents of a Reference are opaque and -host specific, and must not be copied, serialized, or otherwise interpreted by -a plugin, except via functions provided by the host in LV2_Blob_Support.

- -

A Reference is a special case of Atom with type = 0. -"Null" is the unique Atom with type = 0 and -size = 0.

-""" . - -reference:blobSupport a lv2:Feature ; - rdfs:label "Blob support" ; - lv2:documentation """ -

Support for dynamically allocated blobs. If a host supports this feature, -it MUST pass a LV2_Feature with URI -http://lv2plug.in/ns/ext/atom#blobSupport and data pointing to a -LV2_Blob_Support.

-""" . - -reference:Blob a rdfs:Class ; - rdfs:label "Blob" ; - lv2:documentation """ -

Base class for all dynamically allocated blobs. An LV2_Blob is an opaque -pointer to host data. The type and data of a blob can be accessed via -host-provided functions in LV2_Blob_Support. The type of a blob can be any URI -that describes a data format. Blobs are always allocated by the host, and -unlike atoms are not necessarily POD.

- -

Blob data MUST NOT be used in any way by an implementation that does not -understand that blob type (unlike Atoms, meaningful type-oblivious use -of a Blob is impossible).

-""" . diff --git a/lv2/ns/ext/reference/waf b/lv2/ns/ext/reference/waf deleted file mode 120000 index b955110..0000000 --- a/lv2/ns/ext/reference/waf +++ /dev/null @@ -1 +0,0 @@ -../../../../waf \ No newline at end of file diff --git a/lv2/ns/ext/reference/wscript b/lv2/ns/ext/reference/wscript deleted file mode 120000 index ec20a77..0000000 --- a/lv2/ns/ext/reference/wscript +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.wscript \ No newline at end of file diff --git a/lv2/ns/ext/resize-port/ext.pc.in b/lv2/ns/ext/resize-port/ext.pc.in deleted file mode 120000 index 82b50df..0000000 --- a/lv2/ns/ext/resize-port/ext.pc.in +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/ns/ext/resize-port/manifest.ttl b/lv2/ns/ext/resize-port/manifest.ttl deleted file mode 100644 index 37d1b42..0000000 --- a/lv2/ns/ext/resize-port/manifest.ttl +++ /dev/null @@ -1,9 +0,0 @@ -@prefix lv2: . -@prefix rdfs: . - - - a lv2:Specification ; - lv2:minorVersion 0 ; - lv2:microVersion 1 ; - rdfs:seeAlso . - diff --git a/lv2/ns/ext/resize-port/resize-port.h b/lv2/ns/ext/resize-port/resize-port.h deleted file mode 100644 index 7f014a3..0000000 --- a/lv2/ns/ext/resize-port/resize-port.h +++ /dev/null @@ -1,57 +0,0 @@ -/* LV2 Resize Port Extension - * Copyright (C) 2007-2009 David Robillard - * - * This header is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This header is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#ifndef LV2_RESIZE_PORT_H -#define LV2_RESIZE_PORT_H - -#include -#include -#include - -#define LV2_RESIZE_PORT_URI "http://lv2plug.in/ns/ext/resize-port" - -typedef void* LV2_Resize_Port_Feature_Data; - -typedef struct { - - LV2_Resize_Port_Feature_Data data; - - /** Resize a port buffer to at least @a size bytes. - * - * This function MAY return false, in which case the port buffer was - * not resized and the port is still connected to the same location. - * Plugins MUST gracefully handle this situation. - * - * This function MUST NOT be called from any context other than - * the context associated with the port of the given index. - * - * The host MUST preserve the contents of the port buffer when - * resizing. - * - * Plugins MAY resize a port many times in a single run callback. - * Hosts SHOULD make this an inexpensive as possible (i.e. plugins - * can liberally use this function in a similar way to realloc). - */ - bool (*resize_port)(LV2_Resize_Port_Feature_Data data, - uint32_t index, - size_t size); - -} LV2_Resize_Port_Feature; - -#endif /* LV2_RESIZE_PORT_H */ - diff --git a/lv2/ns/ext/resize-port/resize-port.ttl b/lv2/ns/ext/resize-port/resize-port.ttl deleted file mode 100644 index a458431..0000000 --- a/lv2/ns/ext/resize-port/resize-port.ttl +++ /dev/null @@ -1,80 +0,0 @@ -# LV2 Contexts Extension -# -# Allows for an LV2 plugin to have several independent contexts, each with its -# own run callback and associated ports. -# -# Copyright (C) 2007 David Robillard -# -# Permission is hereby granted, free of charge, to any person obtaining a -# copy of this software and associated documentation files (the "Software"), -# to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, -# and/or sell copies of the Software, and to permit persons to whom the -# Software is furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR -# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -# OTHER DEALINGS IN THE SOFTWARE. - -@prefix rsz: . -@prefix lv2: . -@prefix rdf: . -@prefix rdfs: . -@prefix xsd: . -@prefix doap: . -@prefix foaf: . - - - a lv2:Specification ; - a lv2:Feature ; - doap:name "LV2 Resize Port Extension" ; - doap:shortdesc "Dynamically sized LV2 port buffers." ; - lv2:documentation """ -

An extension that allows LV2 plugins to request a resize of an output -port.

- -

Any host which supports this extension must pass an LV2_Feature to the -plugin's instantiate method with URI http://lv2plug.in/ns/ext/resize-port and a -pointer to a LV2_Resize_Port_Feature structure. This structure provides a -resize_port function which plugins may use to resize output port buffers as -necessary.

- -

This extension also defines several predicates useful for describing the -amount of space required for a particular port buffer.

-""" . - -rsz:asLargeAs a rdf:Property ; - rdfs:domain lv2:Port ; - rdfs:range lv2:Symbol ; - rdfs:label "as large as" ; - rdfs:comment """ -Indicates that a port requires at least as much buffer space as the port -with the given symbol on the same plugin instance. This may be used for -any ports, but is generally most useful to indicate an output port must -be at least as large as some input port (because it will copy from it). -If a port is asLargeAs several ports, it is asLargeAs the largest such port -(not the sum of those ports' sizes). - -The host guarantees that whenever an ObjectPort's run method is called, -any output O that is obj:asLargeAs an input I is connected to a buffer large -enough to copy I, or NULL if the port is lv2:connectionOptional. -""" . - -rsz:minimumSize a rdf:Property ; - rdfs:domain lv2:Port ; - rdfs:range lv2:Symbol ; - rdfs:label "minimum size" ; - rdfs:comment """ -Indicates that a port requires a buffer at least this large, in bytes. -Any host that supports the resize-port feature MUST connect any port with a -minimumSize specified to a buffer at least as large as the value given for -this property. Any host, especially those that do NOT support dynamic port -resizing, SHOULD do so or reduced functionality may result. -""" . diff --git a/lv2/ns/ext/resize-port/waf b/lv2/ns/ext/resize-port/waf deleted file mode 120000 index b955110..0000000 --- a/lv2/ns/ext/resize-port/waf +++ /dev/null @@ -1 +0,0 @@ -../../../../waf \ No newline at end of file diff --git a/lv2/ns/ext/resize-port/wscript b/lv2/ns/ext/resize-port/wscript deleted file mode 120000 index ec20a77..0000000 --- a/lv2/ns/ext/resize-port/wscript +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.wscript \ No newline at end of file diff --git a/lv2/ns/ext/state/ext.pc.in b/lv2/ns/ext/state/ext.pc.in deleted file mode 120000 index 82b50df..0000000 --- a/lv2/ns/ext/state/ext.pc.in +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/ns/ext/state/manifest.ttl b/lv2/ns/ext/state/manifest.ttl deleted file mode 100644 index bff9ad5..0000000 --- a/lv2/ns/ext/state/manifest.ttl +++ /dev/null @@ -1,8 +0,0 @@ -@prefix lv2: . -@prefix rdfs: . - - - a lv2:Specification ; - lv2:minorVersion 0 ; - lv2:microVersion 5 ; - rdfs:seeAlso . diff --git a/lv2/ns/ext/state/state.h b/lv2/ns/ext/state/state.h deleted file mode 100644 index b450b93..0000000 --- a/lv2/ns/ext/state/state.h +++ /dev/null @@ -1,359 +0,0 @@ -/* - Copyright 2010-2012 David Robillard - Copyright 2010 Leonard Ritter - - 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 - C API for the LV2 State extension . -*/ - -#ifndef LV2_STATE_H -#define LV2_STATE_H - -#include -#include - -#include "lv2/lv2plug.in/ns/lv2core/lv2.h" - -#ifdef __cplusplus -extern "C" { -#else -# include -#endif - -#define LV2_STATE_URI "http://lv2plug.in/ns/ext/state" - -#define LV2_STATE_INTERFACE_URI LV2_STATE_URI "#Interface" -#define LV2_STATE_PATH_URI LV2_STATE_URI "#Path" -#define LV2_STATE_MAP_PATH_URI LV2_STATE_URI "#mapPath" -#define LV2_STATE_MAKE_PATH_URI LV2_STATE_URI "#makePath" - -typedef void* LV2_State_Handle; -typedef void* LV2_State_Map_Path_Handle; -typedef void* LV2_State_Make_Path_Handle; - -/** - Flags describing value characteristics. - - These flags are used along with the value's type URI to determine how to - (de-)serialise the value data, or whether it is even possible to do so. -*/ -typedef enum { - - /** - Plain Old Data. - - Values with this flag contain no references to non-persistent or - non-global resources (e.g. pointers, handles, local paths, etc.). It is - safe to copy POD values with a simple memcpy and store them for use at - any time in the future on a machine with a compatible architecture - (e.g. the same endianness and alignment). - - Implementations MUST NOT attempt to copy or serialise a non-POD value if - they do not understand its type (and thus know how to correctly do so). - */ - LV2_STATE_IS_POD = 1, - - /** - Portable (architecture independent) data. - - Values with this flag are in a format that is usable on any - architecture, i.e. if the value is saved on one machine it can safely be - restored on another machine regardless of endianness, alignment, etc. - */ - LV2_STATE_IS_PORTABLE = 1 << 1, - - /** - Native data. - - This flag is used by the host to indicate that the saved data is only - going to be used locally in the currently running process (e.g. for - instance duplication or snapshots), so the plugin should use the most - efficient representation possible and not worry about serialisation - and portability. - */ - LV2_STATE_IS_NATIVE = 1 << 2 - -} LV2_State_Flags; - -/** - A host-provided function to store a property. - @param handle Must be the handle passed to LV2_State_Interface.save(). - @param key The key (predicate) to store @c value under (URI mapped integer). - @param value Pointer to the value (object) to be stored. - @param size The size of the data at @c value in bytes. - @param type The type of @c value (URI). - @param flags LV2_State_Flags for @c value. - @return 0 on success, otherwise a non-zero error code. - - The host passes a callback of this type to LV2_State_Interface.save(). This - callback is called repeatedly by the plugin within - LV2_State_Interface.save() to store all the statements that describe its - current state. - - DO NOT INVENT NONSENSE URI SCHEMES FOR THE KEY. Best is to use keys from - existing vocabularies. If nothing appropriate is available, use http URIs - that point to somewhere you can host documents, so you can make - documentation resolvable. If this is not possible, invent a URN scheme, - e.g. urn:myproj:whatever. The plugin MUST NOT pass an invalid URI key. - - The host MAY fail to store a property for whatever reason, but SHOULD - store any property that is LV2_STATE_IS_POD and LV2_STATE_IS_PORTABLE. - Implementations SHOULD use the types from the LV2 Atom extension - (http://lv2plug.in/ns/ext/atom) wherever possible. - - Note that @c size MUST be > 0, and @c value MUST point to a valid region of - memory @c size bytes long (this is required to make restore unambiguous). - - The plugin MUST NOT attempt to use this function outside of the - LV2_State_Interface.restore() context. -*/ -typedef int (*LV2_State_Store_Function)(LV2_State_Handle handle, - uint32_t key, - const void* value, - size_t size, - uint32_t type, - uint32_t flags); - -/** - A host-provided function to retrieve a property. - @param handle Must be the handle passed to - LV2_State_Interface.restore(). - @param key The key (predicate) of the property to retrieve (URI). - @param size (Output) If non-NULL, set to the size of the restored value. - @param type (Output) If non-NULL, set to the type of the restored value. - @param flags (Output) If non-NULL, set to the LV2_State_Flags for - the returned value. - @return A pointer to the restored value (object), or NULL if no value - has been stored under @c key. - - A callback of this type is passed by the host to - LV2_State_Interface.restore(). This callback is called repeatedly by the - plugin within LV2_State_Interface.restore() to retrieve any properties it - requires to restore its state. - - The returned value MUST remain valid until LV2_State_Interface.restore() - returns. - - The plugin MUST NOT attempt to use this function, or any value returned from - it, outside of the LV2_State_Interface.restore() context. Returned values - MAY be copied for later use if necessary, assuming the plugin knows how to - do so correctly (e.g. the value is POD, or the plugin understands the type). -*/ -typedef const void* (*LV2_State_Retrieve_Function)(LV2_State_Handle handle, - uint32_t key, - size_t* size, - uint32_t* type, - uint32_t* flags); - -/** - State Extension Data. - - When the plugin's extension_data is called with argument LV2_STATE_URI, - the plugin MUST return an LV2_State structure, which remains valid for the - lifetime of the plugin. - - The host can use the contained function pointers to save and restore the - state of a plugin instance at any time (provided the threading restrictions - for the given function are met). - - The typical use case is to save the plugin's state when a project is saved, - and to restore the state when a project has been loaded. Other uses are - possible (e.g. cloning plugin instances or taking a snapshot of plugin - state). - - Stored data is only guaranteed to be compatible between instances of plugins - with the same URI (i.e. if a change to a plugin would cause a fatal error - when restoring state saved by a previous version of that plugin, the plugin - URI MUST change just as it must when ports change incompatibly). Plugin - authors should consider this possibility, and always store sensible data - with meaningful types to avoid such compatibility issues in the future. -*/ -typedef struct _LV2_State_Interface { - - /** - Save plugin state using a host-provided @c store callback. - - @param instance The instance handle of the plugin. - @param store The host-provided store callback. - @param handle An opaque pointer to host data, e.g. the map or - file where the values are to be stored. If @c store is called, this MUST - be passed as its handle parameter. - @param flags Flags describing desires properties of this save. The - plugin SHOULD use these values to determine the most appropriate and/or - efficient serialisation, but is not required to do so. - @param features Extensible parameter for passing any additional - features to be used for this save. - - The plugin is expected to store everything necessary to completely - restore its state later (possibly much later, in a different process, on - a completely different machine, etc.) - - The @c handle pointer and @c store function MUST NOT be used - beyond the scope of save(). - - This function has its own special threading class: it may not be called - concurrently with any "Instantiation" function, but it may be called - concurrently with functions in any other class, unless the definition of - that class prohibits it (e.g. it may not be called concurrently with a - "Discovery" function, but it may be called concurrently with an "Audio" - function. The plugin is responsible for any locking or lock-free - techniques necessary to make this possible. - - Note that in the simple case where state is only modified by restore(), - there are no synchronization issues since save() is never called - concurrently with restore() (though run() may read it during a save). - - Plugins that dynamically modify state while running, however, must take - care to do so in such a way that a concurrent call to save() will save a - consistent representation of plugin state for a single instant in time. - */ - void (*save)(LV2_Handle instance, - LV2_State_Store_Function store, - LV2_State_Handle handle, - uint32_t flags, - const LV2_Feature *const * features); - - /** - Restore plugin state using a host-provided @c retrieve callback. - - @param instance The instance handle of the plugin. - @param retrieve The host-provided retrieve callback. - @param handle An opaque pointer to host data, e.g. the map or - file from which the values are to be restored. If @c retrieve is - called, this MUST be passed as its handle parameter. - @param flags Currently unused. - @param features Extensible parameter for passing any additional - features to be used for this restore. - - The plugin MAY assume a restored value was set by a previous call to - LV2_State_Interface.save() by a plugin with the same URI. - - The plugin MUST gracefully fall back to a default value when a value can - not be retrieved. This allows the host to reset the plugin state with an - empty map. - - The @c handle pointer and @c store function MUST NOT be used - beyond the scope of restore(). - - This function is in the "Instantiation" threading class as defined by - LV2. This means it MUST NOT be called concurrently with any other - function on the same plugin instance. - */ - void (*restore)(LV2_Handle instance, - LV2_State_Retrieve_Function retrieve, - LV2_State_Handle handle, - uint32_t flags, - const LV2_Feature *const * features); - -} LV2_State_Interface; - -/** - Feature data for state:mapPath (LV2_STATE_MAP_PATH_URI). -*/ -typedef struct { - - /** - Opaque host data. - */ - LV2_State_Map_Path_Handle handle; - - /** - Map an absolute path to an abstract path for use in plugin state. - @param handle MUST be the @a handle member of this struct. - @param absolute_path The absolute path of a file. - @return An abstract path suitable for use in plugin state. - - The plugin MUST use this function to map any paths that will be stored - in files in plugin state. The returned value is an abstract path which - MAY not be an actual file system path; @ref absolute_path MUST be used - to map it to an actual path in order to use the file. - - Hosts MAY map paths in any way (e.g. by creating symbolic links within - the plugin's state directory or storing a list of referenced files - elsewhere). Plugins MUST NOT make any assumptions about abstract paths - except that they can be mapped back to an absolute path using @ref - absolute_path. - - This function may only be called within the context of - LV2_State_Interface.save() or LV2_State_Interface.restore(). The caller - is responsible for freeing the returned value. - */ - char* (*abstract_path)(LV2_State_Map_Path_Handle handle, - const char* absolute_path); - - /** - Map an abstract path from plugin state to an absolute path. - @param handle MUST be the @a handle member of this struct. - @param abstract_path An abstract path (e.g. a path from plugin state). - @return An absolute file system path. - - Since abstract paths are not necessarily actual file paths (or at least - not necessarily absolute paths), this function MUST be used in order to - actually open or otherwise use the file referred to by an abstract path. - - This function may only be called within the context of - LV2_State_Interface.save() or LV2_State_Interface.restore(). The caller - is responsible for freeing the returned value. - */ - char* (*absolute_path)(LV2_State_Map_Path_Handle handle, - const char* abstract_path); - -} LV2_State_Map_Path; - -/** - Feature data for state:makePath (@ref LV2_STATE_MAKE_PATH_URI). -*/ -typedef struct { - - /** - Opaque host data. - */ - LV2_State_Make_Path_Handle handle; - - /** - Return a path the plugin may use to create a new file. - @param handle MUST be the @a handle member of this struct. - @param path The path of the new file relative to a namespace unique - to this plugin instance. - @return The absolute path to use for the new file. - - This function can be used by plugins to create files and directories, - either at state saving time (if this feature is passed to - LV2_State_Interface.save()) or any time (if this feature is passed to - LV2_Descriptor.instantiate()). - - The host must do whatever is necessary for the plugin to be able to - create a file at the returned path (e.g. using fopen), including - creating any leading directories. - - If this function is passed to LV2_Descriptor.instantiate(), it may be - called from any non-realtime context. If it is passed to - LV2_State_Interface.save(), it may only be called within the dynamic - scope of that function call. - - The caller is responsible for freeing the returned value with free(). - */ - char* (*path)(LV2_State_Make_Path_Handle handle, - const char* path); - -} LV2_State_Make_Path; - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* LV2_STATE_H */ diff --git a/lv2/ns/ext/state/state.ttl b/lv2/ns/ext/state/state.ttl deleted file mode 100644 index 6c0656a..0000000 --- a/lv2/ns/ext/state/state.ttl +++ /dev/null @@ -1,359 +0,0 @@ -# LV2 State Extension -# Copyright 2010-2012 David Robillard -# Copyright 2010 Leonard Ritter -# -# 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 dcs: . -@prefix doap: . -@prefix foaf: . -@prefix lv2: . -@prefix rdf: . -@prefix rdfs: . -@prefix state: . - - - a foaf:Person ; - foaf:name "David Robillard" ; - foaf:homepage ; - foaf:mbox ; - rdfs:seeAlso . - - - a lv2:Specification ; - doap:name "LV2 State" ; - doap:shortdesc "An interface for LV2 plugins to save and restore state." ; - doap:license ; - doap:release [ - doap:revision "0.5" ; - doap:created "2012-01-29" ; - dcs:blame - ] ; - doap:developer [ - a foaf:Person ; - foaf:name "Leonard Ritter" ; - foaf:homepage - ] ; - doap:maintainer [ - a foaf:Person ; - foaf:name "David Robillard" ; - foaf:homepage ; - rdfs:seeAlso - ] ; - lv2:documentation """ -

This extension provides a simple mechanism for plugins to save and restore -state across instances, allowing hosts to save and restore a plugin instance's -state at any time. The goal is for an instance's state to be -completely described by port values (as with all LV2 plugins) and a -dictionary.

- -

The state described by this extension is conceptually a simple -key:value dictionary, where keys are URIDs (URIs mapped to integers) and values -are type-tagged blobs of any type. A single key:value pair is called a -property. To implement state, the plugin provides a state:Interface to -the host. To save or restore, the host calls LV2_State_Interface::save() or -LV2_State_Interface::restore(), passing a callback to be used for handling a -single property. The host is free to implement property storage and retrieval -in any way.

- -

This state model is simple yet has many benefits:

-
    -
  • URID keys provide both fast performance and RDF compatibility.
  • -
  • Fully extensible, no limitations on keys or value types.
  • -
  • Easy to serialise in many formats (e.g. any RDF syntax, plain - text, JSON, XML, key:value databases, SQL, s-expressions, etc.).
  • -
  • Elegantly described in Turtle, which is useful for describing presets - or default state in LV2 data files (the predicate state:state is provided - for this purpose).
  • -
  • Does not impose any file formats, data structures, or file system - requirements.
  • -
  • Suitable for portable persistent state as well as fast in-memory - snapshots.
  • -
  • Easily stored in a typical map or dictionary data - structure.
  • -
  • Keys may be defined by extensions and used by several plugins, - making state meaningful enabling dynamic state control.
  • -
- -

Implementations or further extensions which work with plugin state -(including dynamic plugin control) SHOULD work entirely within this model. -That is, do not complicate the state model. All -information required to express an instance's state at any given time can, and -should, be expressed within this model.

- -

Plugin Code Example

- -
-#define NS_EG   "http://example.org/"
-#define NS_ATOM "http://lv2plug.in/ns/ext/atom#"
-
-LV2_Handle my_instantiate(...)
-{
-    MyPlugin* plugin = ...;
-    plugin->uris.atom_String = map_uri(NS_ATOM "String");
-    plugin->uris.eg_greeting = map_uri(NS_EG "greeting");
-    plugin->state.greeting   = strdup("Hello");
-    return plugin;
-}
-
-void my_save(LV2_Handle                 instance,
-             LV2_State_Store_Function   store,
-             void*                      handle,
-             uint32_t                   flags,
-             const LV2_Feature *const * features)
-{
-    MyPlugin*   plugin   = (MyPlugin*)instance;
-    const char* greeting = plugin->state.greeting;
-
-    store(handle,
-          plugin->uris.eg_greeting,
-          greeting,
-          strlen(greeting) + 1,
-          plugin->uris.atom_String,
-          LV2_STATE_IS_POD | LV2_STATE_IS_PORTABLE);
-}
-
-void my_restore(LV2_Handle                  instance,
-                LV2_State_Retrieve_Function retrieve,
-                void*                       handle,
-                uint32_t                    flags,
-                const LV2_Feature *const *  features)
-{
-    MyPlugin* plugin = (MyPlugin*)instance;
-
-    size_t      size;
-    uint32_t    type;
-    uint32_t    flags;
-    const char* greeting = retrieve(
-        handle, plugin->uris.eg_greeting, &size, &type, &flags);
-
-    if (greeting) {
-        free(plugin->state->greeting);
-        plugin->state->greeting = strdup(greeting);
-    } else {
-        plugin->state->greeting = strdup("Hello");
-    }
-}
-
-const void* my_extension_data(const char* uri)
-{
-    static const LV2_State_Interface state_iface = { my_save, my_restore };
-    if (!strcmp(uri, LV2_STATE_INTERFACE_URI)) {
-        return &state_iface;
-    }
-}
-
- -

Host Code Example

- -
-int store_callback(void*       handle,
-                   uint32_t    key,
-                   const void* value,
-                   size_t      size,
-                   uint32_t    type,
-                   uint32_t    flags)
-{
-    if ((flags & LV2_STATE_IS_POD)) {
-        /* We only care about POD since we're keeping state in memory only.
-           If this was for disk or network storage/transmission,
-           LV2_STATE_IS_PORTABLE would have to be checked as well.
-        */
-        Map* state_map = (Map*)handle;
-        state_map->insert(key, Value(copy(value), size, type, pod));
-        return 0;
-    } else {
-        return 1; /* Non-POD events are unsupported. */
-    }
-}
-
-Map get_plugin_state(LV2_Handle instance)
-{
-    LV2_State* state = instance.extension_data("http://lv2plug.in/ns/ext/state");
-    Map state_map;
-    /** Request a fast/native/POD save, since we're just copying in memory */
-    state.save(instance, store_callback, &state_map,
-               LV2_STATE_IS_POD|LV2_STATE_IS_NATIVE);
-    return state_map;
-}
-
- -

Referring to Existing Files

- -

Plugins may need to refer to files (e.g. loaded samples) in their state. -This is done by storing the file's path as a property just like any other -value. However, there are some rules which MUST be followed when storing -paths, see state:mapPath for details.

- -

Creating New Files or Directories

- -

Implementations are strongly encouraged to avoid the use of files and simply -store all state as properties whenever possible. However, occasionally the -ability to create files is necessary. The feature state:newPath makes this possible, if it is provided by the -host.

-""" . - -state:Interface - a rdfs:Class ; - rdfs:subClassOf lv2:ExtensionData ; - lv2:documentation """ -

A structure (LV2_State_Interface) which contains functions to be called by -the host to save and restore state. In order to support this extension, the -plugin must return a valid LV2_State_Interface from -LV2_Descriptor::extension_data() when it is called with -LV2_STATE_INTERFACE_URI.

- -

The plugin data file should describe this like so:

-
-@prefix state: <http://lv2plug.in/ns/ext/state#> .
-
-<plugin>
-    a lv2:Plugin ;
-    lv2:extensionData state:Interface .
-
-""" . - -state:State - a rdfs:Class ; - rdfs:label "Plugin Instance State" ; - lv2:documentation """ -

This class is used to express a plugin instance's state in RDF. The -key/value properties of the instance form the predicate/object (respectively) -of triples with a state:State as the subject (see state:state for an example). This may be used wherever it is -useful to express a plugin instance's state in RDF (e.g. for serialisation, -storing in a model, or transmitting over a network). Note that this class is -provided because it may be useful for hosts, plugins, or extensions that work -with instance state, but its use is not required to support the LV2 State -extension.

-""" . - -state:state - a rdf:Property ; - rdfs:range state:State ; - lv2:documentation """ -

Predicate to relate a plugin instance to its State. This may be used -wherever the state of a particular plugin instance needs to be represented. -Note that the domain of this property is unspecified, since LV2 does not define -any RDF class for plugin instance. This predicate may be used wherever it makes -sense to do so, e.g.:

-
-@prefix eg: <http://example.org/> .
-
-<plugininstance>
-    state:state [
-        eg:somekey "some value" ;
-        eg:someotherkey "some other value" ;
-        eg:favourite-number 2
-    ] .
-
-

Note that this property is provided because it may be useful for hosts, -plugins, or extensions that work with instance state, but its use is not -required to support this extension.

-""" . - -state:mapPath - a lv2:Feature ; - rdfs:label "Support for storing paths in files" ; - lv2:documentation """ - -

This feature maps absolute paths to/from abstract paths which are -stored in state. To support this feature a host must pass an LV2_Feature with -URI LV2_STATE_MAP_PATH_URI and data pointed to an LV2_State_Map_Path to the -plugin's LV2_State_Interface methods.

- -

The plugin MUST map all paths stored in its state (including in any -files in its state). This is necessary to enable host to handle file system -references correctly, e.g. for distribution or archival.

- -

For example, a plugin may write a path to a state file like so:

- -
-void write_path(LV2_State_Map_Path* map_path, FILE* myfile, const char* path)
-{
-    char* abstract_path = map_path->abstract_path(map_path->handle, path);
-    fprintf(myfile, "%s", abstract_path);
-    free(abstract_path);
-}
-
- -

Then, later reload the path like so:

- -
-char* read_path(LV2_State_Map_Path* map_path, FILE* myfile)
-{
-    /* Obviously this is not production quality code! */
-    char abstract_path[1024];
-    fscanf(myfile, "%s", abstract_path);
-    return map_path->absolute_path(map_path->handle, abstract_path);
-}
-
-""" . - -state:makePath - a lv2:Feature ; - rdfs:label "Support for creating new files and directories" ; - lv2:documentation """ - -

This feature allows plugins to create new files and/or directories. To -support this feature the host passes an LV2_Feature with URI -LV2_STATE_MAKE_PATH_URI and data pointed to an LV2_State_Make_Path to the -plugin. The host may make this feature available only during save by passing -it to LV2_State_Interface::save(), or available any time by passing it to -LV2_Descriptor::instantiate(). If passed to LV2_State_Interface::save(), the -feature MUST NOT be used beyond the scope of that call.

- -

The plugin is guaranteed a hierarchial namespace unique to that plugin -instance, and may expect the returned path to have the requested path as a -suffix. There is one such namespace, even if the feature is passed to -both LV2_Descriptor::instantiate() and -LV2_State_Interface::save(). Beyond this, the plugin MUST NOT make any -assumptions about the returned paths.

- -

Like any other paths, the plugin MUST map these paths using state:mapPath before storing them in state. The plugin -MUST NOT assume these paths will be available across a save/restore otherwise, -i.e. only mapped paths saved to state are persistent, any other created paths -are temporary.

- -

For example, a plugin may create a file in a subdirectory like so:

- -
-char* save_myfile(LV2_State_Make_Path* make_path)
-{
-    char* path   = make_path->path(make_path->handle, "foo/bar/myfile.txt");
-    FILE* myfile = fopen(path, 'w');
-    fprintf(myfile, "Hello");
-    fclose(myfile);
-    return path;
-}
-
-""" . - -state:Path - a rdfs:Class ; - rdfs:label "Path" ; - lv2:documentation """ -

A path to a file or directory.

- -

The format of a state:Path is a C string, possibly escaped or otherwise -restricted in a system-specific manner. This URI (LV2_STATE_PATH_URI), mapped -to an integer, MUST be used as the type parameter for any files -passed to the LV2_State_Store_Function; and will likewise be returned by the -corresponding call to the LV2_State_Retrieve_Function.

- -

When storing and retrieving a path, the plugin MUST NOT assume the same path -will be restored. However, the restored path will refer to a file with -equivalent contents to the original.

-""" . diff --git a/lv2/ns/ext/state/waf b/lv2/ns/ext/state/waf deleted file mode 120000 index b955110..0000000 --- a/lv2/ns/ext/state/waf +++ /dev/null @@ -1 +0,0 @@ -../../../../waf \ No newline at end of file diff --git a/lv2/ns/ext/state/wscript b/lv2/ns/ext/state/wscript deleted file mode 120000 index ec20a77..0000000 --- a/lv2/ns/ext/state/wscript +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.wscript \ No newline at end of file diff --git a/lv2/ns/ext/string-port/ext.pc.in b/lv2/ns/ext/string-port/ext.pc.in deleted file mode 120000 index 82b50df..0000000 --- a/lv2/ns/ext/string-port/ext.pc.in +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/ns/ext/string-port/manifest.ttl b/lv2/ns/ext/string-port/manifest.ttl deleted file mode 100644 index d0e618e..0000000 --- a/lv2/ns/ext/string-port/manifest.ttl +++ /dev/null @@ -1,8 +0,0 @@ -@prefix lv2: . -@prefix rdfs: . - - - a lv2:Specification ; - lv2:minorVersion 0 ; - lv2:microVersion 1 ; - rdfs:seeAlso . diff --git a/lv2/ns/ext/string-port/string-port.h b/lv2/ns/ext/string-port/string-port.h deleted file mode 100644 index e7fc8c7..0000000 --- a/lv2/ns/ext/string-port/string-port.h +++ /dev/null @@ -1,58 +0,0 @@ -/* lv2_string_port.h - C header file for LV2 string port extension. - * Draft Revision 3 - * Copyright (C) 2008 Krzysztof Foltman - * - * This header is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published - * by the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This header is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public - * License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this header; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place, Suite 330, Boston, MA 01222-1307 USA - */ - -/** @file - * C header for the LV2 String Port extension - * . - */ - -#ifndef LV2_STRING_PORT_H -#define LV2_STRING_PORT_H - -#include - -/** URI for the string port transfer mechanism feature */ -#define LV2_STRING_PORT_URI "http://lv2plug.in/ns/ext/string-port#StringTransfer" - -/** Flag: port data has been updated; for input ports, this flag is set by -the host. For output ports, this flag is set by the plugin. */ -#define LV2_STRING_DATA_CHANGED_FLAG 1 - -/** structure for string port data */ -typedef struct -{ - /** Buffer for UTF-8 encoded zero-terminated string value; host-allocated */ - char *data; - - /** Length in bytes (not characters), not including zero byte */ - size_t len; - - /** Output ports: storage space in bytes; must be >= RDF-specified requirements */ - size_t storage; - - /** Flags defined above */ - uint32_t flags; - - /** Undefined (pad to 8 bytes) */ - uint32_t pad; - -} LV2_String_Data; - -#endif - diff --git a/lv2/ns/ext/string-port/string-port.ttl b/lv2/ns/ext/string-port/string-port.ttl deleted file mode 100644 index f36fa7a..0000000 --- a/lv2/ns/ext/string-port/string-port.ttl +++ /dev/null @@ -1,105 +0,0 @@ -# LV2 String Port Extension. -# Draft Revision 3 -# Copyright (C) 2008 Krzysztof Foltman -# -# Permission is hereby granted, free of charge, to any person obtaining a -# copy of this software and associated documentation files (the "Software"), -# to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, -# and/or sell copies of the Software, and to permit persons to whom the -# Software is furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR -# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -# OTHER DEALINGS IN THE SOFTWARE. - -@prefix sp: . -@prefix lv2: . -@prefix rdf: . -@prefix rdfs: . -@prefix xsd: . -@prefix doap: . -@prefix foaf: . - - a lv2:Specification ; - doap:license ; - doap:name "LV2 String Ports" ; - doap:maintainer [ - a foaf:Person ; - foaf:name "Krzysztof Foltman" ; - ] ; - lv2:documentation """ -

Defines ports which contain string data.

- -

UI issues

-

When using port_event / write_port (and possible other communication -mechanisms), the format parameter should contain the numeric value of URI -LV2_STRING_PORT_URI (mapped with http://lv2plug.in/ns/extensions/ui specified -as map URI).

- -

It's probably possible to use ports belonging to message context -<http://lv2plug.in/ns/ext/contexts#MessageContext> for transfer. However, -contexts mechanism does not offer any way to notify the message recipient about -which ports have been changed. To remedy that, this extension defines a flag -LV2_STRING_DATA_CHANGED_FLAG that carries that information inside a port value -structure.

- -

Storage

-

The value of string port are assumed to be "persistent": if a host saves and -restores a state of a plugin (e.g. control port values), the values of input -string ports should also be assumed to belong to that state. This also applies -to message context: if a session is being restored, the host MUST resend the -last value that was sent to the port before session has been saved. In other -words, string port values "stick" to message ports.

-""" . - -sp:StringTransfer a lv2:Feature ; - rdfs:label "String data transfer via LV2_String_Data" . - -sp:StringPort a lv2:Port ; - rdfs:label "String port" ; - lv2:documentation """ -

Indicates that the port data points to a LV2_String_Data structure -as defined in accompanying header file.

- -

Input Port Semantics

-

If the port does not have a context specified (it runs in the default, -realtime audio processing context), the values in the structure and the actual -string data MUST remain unchanged for the time a run() function of a plugin -is executed. However, if the port belongs to a different context, the same -data MUST remain unchanged only for the time a run() or message_process() -function of a given context is executed.

- -

Output Port Semantics

-

The plugin may only change the string or length in a run() function (if -the port belongs to default context) or in context-defined counterparts -(if the port belongs to another context). Because of that, using default -context output string ports is contraindicated for longer strings.

-""" . - -sp:default a rdf:Property ; - rdfs:label "Default value" ; - rdfs:domain sp:StringPort ; - rdfs:range xsd:string ; - rdfs:comment """ -Gives a default value for a string port. -""" . - -sp:requiredSpace a rdf:Property ; - rdfs:label "Required storage space in bytes" ; - rdfs:domain sp:StringPort ; - rdfs:range xsd:nonNegativeInteger ; - rdfs:comment """ -Specifies required buffer space for output string ports and those of -input string ports that are meant to be GUI-controlled. The host MUST -allocate a buffer of at least required size to accommodate for all values -that can be produced by the plugin. -""" . - diff --git a/lv2/ns/ext/string-port/waf b/lv2/ns/ext/string-port/waf deleted file mode 120000 index b955110..0000000 --- a/lv2/ns/ext/string-port/waf +++ /dev/null @@ -1 +0,0 @@ -../../../../waf \ No newline at end of file diff --git a/lv2/ns/ext/string-port/wscript b/lv2/ns/ext/string-port/wscript deleted file mode 120000 index ec20a77..0000000 --- a/lv2/ns/ext/string-port/wscript +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.wscript \ No newline at end of file diff --git a/lv2/ns/ext/time/ext.pc.in b/lv2/ns/ext/time/ext.pc.in deleted file mode 120000 index 82b50df..0000000 --- a/lv2/ns/ext/time/ext.pc.in +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/ns/ext/time/manifest.ttl b/lv2/ns/ext/time/manifest.ttl deleted file mode 100644 index 2657388..0000000 --- a/lv2/ns/ext/time/manifest.ttl +++ /dev/null @@ -1,9 +0,0 @@ -@prefix lv2: . -@prefix rdfs: . - - - a lv2:Specification ; - lv2:minorVersion 0 ; - lv2:microVersion 1 ; - rdfs:seeAlso . - diff --git a/lv2/ns/ext/time/time.h b/lv2/ns/ext/time/time.h deleted file mode 100644 index f3b2e77..0000000 --- a/lv2/ns/ext/time/time.h +++ /dev/null @@ -1,131 +0,0 @@ -/* - Copyright 2011 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. -*/ - -/** - @file time.h C header for the LV2 Time extension - . -*/ - -#ifndef LV2_TIME_H -#define LV2_TIME_H - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** - Time states. -*/ -typedef enum { - LV2_TIME_STOPPED = 0, /**< Transport halted */ - LV2_TIME_ROLLING = 1, /**< Transport playing */ -} LV2_Time_State; - -/** - Bits indicating properties of an LV2_Time_Position. -*/ -typedef enum { - LV2_TIME_HAS_BBT = 1 /**< Has Bar, Beat, Tick */ -} LV2_Time_Flags; - -/** - Description of a position and/or tempo. - - This struct is used as the payload of an event to notify the plugin about - time state, such as position and tempo. -*/ -typedef struct { - /** - @{ - @name Mandatory Fields - */ - - /** - Frame number on the timeline. - */ - uint64_t frame; - - /** - Bit field of LV2_Time_Flags values indicating which fields - of this struct are valid. - */ - uint32_t flags; - - /** - Transport state. - */ - LV2_Time_State state; - - /** - @} - @{ - @name LV2_TIME_BBT fields - These fields are valid iff the LV2_TIME_BBT bit is set in @ref flags. - */ - - /** - Current bar. - The first bar is number 0 (but should be represented in a UI as bar 1). - */ - int64_t bar; - - /** - Beat within the current bar. - The first beat is number 0. - Always <= @ref beats_per_bar. - */ - int32_t beat; - - /** - Tick within the current beat. - The first tick is number 0. - Always <= @ref ticks_per_beat. - */ - int32_t tick; - - /** - Number of beats per bar (top of time signature). - */ - int32_t beats_per_bar; - - /** - Type of note that counts as one beat (bottom of time signature). - */ - int32_t beat_type; - - /** - Number of ticks per beat. - Typically this is a large integer with many even divisors. - */ - int32_t ticks_per_beat; - - /** - Current tempo, in beats per minute. - */ - double beats_per_minute; - - /** - @} - */ -} LV2_Time_Position; - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* LV2_TIME_H */ diff --git a/lv2/ns/ext/time/time.ttl b/lv2/ns/ext/time/time.ttl deleted file mode 100644 index 40bfdbb..0000000 --- a/lv2/ns/ext/time/time.ttl +++ /dev/null @@ -1,57 +0,0 @@ -# LV2 Time Extension -# Copyright 2011 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 time: . -@prefix doap: . -@prefix foaf: . -@prefix lv2: . -@prefix rdf: . -@prefix rdfs: . -@prefix xsd: . - - - a lv2:Specification ; - doap:name "LV2 Time" ; - doap:shortdesc "A data type for transport speed and position." ; - doap:maintainer [ - a foaf:Person ; - foaf:name "David Robillard" ; - foaf:homepage ; - rdfs:seeAlso - ] ; - lv2:documentation """ -

This extension defines a structure type, LV2_Time_Position, which -describes a tempo and position along a timeline. This can be used as -an event payload by the host to notify plugins about the current -tempo and position.

-""" . - -time:Position - a rdfs:Class ; - rdfs:label "LV2 time position" ; - lv2:documentation """ -

Type for an LV2_Time_Position struct. This can be mapped to an integer and -used as the type field of an event to indicate that the event payload is an -LV2_Time_Positon struct. Plugins SHOULD indicate that a port supports time -information using the ev:supports predicate, e.g.:

-
-<plugin> lv2:port [
-    a lv2:InputPort , ev:EventPort ;
-    lv2:name "control" ;
-    lv2:index 0 ;
-    ev:supportsEvent time:Position
-] .
-
-""" . diff --git a/lv2/ns/ext/time/waf b/lv2/ns/ext/time/waf deleted file mode 120000 index b955110..0000000 --- a/lv2/ns/ext/time/waf +++ /dev/null @@ -1 +0,0 @@ -../../../../waf \ No newline at end of file diff --git a/lv2/ns/ext/time/wscript b/lv2/ns/ext/time/wscript deleted file mode 120000 index ec20a77..0000000 --- a/lv2/ns/ext/time/wscript +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.wscript \ No newline at end of file diff --git a/lv2/ns/ext/ui-resize/ext.pc.in b/lv2/ns/ext/ui-resize/ext.pc.in deleted file mode 120000 index 82b50df..0000000 --- a/lv2/ns/ext/ui-resize/ext.pc.in +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/ns/ext/ui-resize/manifest.ttl b/lv2/ns/ext/ui-resize/manifest.ttl deleted file mode 100644 index ca5cdf9..0000000 --- a/lv2/ns/ext/ui-resize/manifest.ttl +++ /dev/null @@ -1,9 +0,0 @@ -@prefix lv2: . -@prefix rdfs: . - - - a lv2:Specification ; - lv2:minorVersion 0 ; - lv2:microVersion 1 ; - rdfs:seeAlso . - diff --git a/lv2/ns/ext/ui-resize/ui-resize.h b/lv2/ns/ext/ui-resize/ui-resize.h deleted file mode 100644 index cf5ccc6..0000000 --- a/lv2/ns/ext/ui-resize/ui-resize.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - Copyright 2011 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_UI_RESIZE_H -#define LV2_UI_RESIZE_H - -#define LV2_UI_RESIZE_URI "http://lv2plug.in/ns/ext/ui-resize" - -typedef void* LV2_UI_Resize_Feature_Data; - -/** - UI Resize Feature. - - This structure may be used in two ways: as a feature passed by the host - (e.g. via the features parameter of LV2UI_Descriptor::instantiate()) or - as a feature exposed by a UI (e.g. via LV2UI_Descriptor::extension_data()). - - In both cases, the URI to be used is - http://lv2plug.in/ns/ext/ui-resize#UIResize -*/ -typedef struct { - - LV2_UI_Resize_Feature_Data data; - - /** - Request or notify a size change. - - When this struct is provided by the host, the UI may call this - function to notify the host that a size change is desired, or notify - the host of the initial size of the UI. - - When this struct is provided by the plugin, the host may call this - function in the UI thread to notify the UI that it should change its - size to the given dimensions. - - @return 0 on success. - */ - int (*ui_resize)(LV2_UI_Resize_Feature_Data data, - int width, - int height); - -} LV2_UI_Resize_Feature; - -#endif /* LV2_UI_RESIZE_H */ - diff --git a/lv2/ns/ext/ui-resize/ui-resize.ttl b/lv2/ns/ext/ui-resize/ui-resize.ttl deleted file mode 100644 index f3b7d92..0000000 --- a/lv2/ns/ext/ui-resize/ui-resize.ttl +++ /dev/null @@ -1,43 +0,0 @@ -# LV2 UI Resize Extension -# Copyright 2011 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 uirsz: . -@prefix lv2: . -@prefix rdf: . -@prefix rdfs: . -@prefix xsd: . -@prefix doap: . -@prefix foaf: . - - - a lv2:Specification ; - doap:name "LV2 UI Resize Extension" ; - doap:shortdesc "A feature for self-resizing plugin UIs." ; - doap:license ; - lv2:documentation """ -

An extension that allows LV2 plugin UIs to notify the host about size -changes, or for the host to notify plugin UIs about size changes.

-""" . - -uirsz:UIResize - a lv2:Feature ; - lv2:documentation """ -

A feature that allows the UI to notify the host about its current size, or -request a size change. This feature corresponds to the LV2_UI_Resize_Feature -struct, which should be passed with the feature URI -http://lv2plug.in/ns/ext/ui-resize#UIResize. This struct may also -be provided by the UI as extension data using the same URI, in which case it -is used by the host to request that the UI change its size.

-""" . diff --git a/lv2/ns/ext/ui-resize/waf b/lv2/ns/ext/ui-resize/waf deleted file mode 120000 index b955110..0000000 --- a/lv2/ns/ext/ui-resize/waf +++ /dev/null @@ -1 +0,0 @@ -../../../../waf \ No newline at end of file diff --git a/lv2/ns/ext/ui-resize/wscript b/lv2/ns/ext/ui-resize/wscript deleted file mode 120000 index ec20a77..0000000 --- a/lv2/ns/ext/ui-resize/wscript +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.wscript \ No newline at end of file diff --git a/lv2/ns/ext/uri-map/ext.pc.in b/lv2/ns/ext/uri-map/ext.pc.in deleted file mode 120000 index 82b50df..0000000 --- a/lv2/ns/ext/uri-map/ext.pc.in +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/ns/ext/uri-map/manifest.ttl b/lv2/ns/ext/uri-map/manifest.ttl deleted file mode 100644 index 0348a55..0000000 --- a/lv2/ns/ext/uri-map/manifest.ttl +++ /dev/null @@ -1,8 +0,0 @@ -@prefix lv2: . -@prefix rdfs: . - - - a lv2:Specification ; - lv2:minorVersion 1 ; - lv2:microVersion 4 ; - rdfs:seeAlso . diff --git a/lv2/ns/ext/uri-map/uri-map.h b/lv2/ns/ext/uri-map/uri-map.h deleted file mode 100644 index 6767cd1..0000000 --- a/lv2/ns/ext/uri-map/uri-map.h +++ /dev/null @@ -1,92 +0,0 @@ -/* - Copyright 2008-2011 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. -*/ - -/** - @file - C header for the LV2 URI Map extension . - - This extension defines a simple mechanism for plugins to map URIs to - integers, usually for performance reasons (e.g. processing events typed by - URIs in real time). The expected use case is for plugins to map URIs to - integers for things they 'understand' at instantiation time, and store those - values for use in the audio thread without doing any string comparison. - This allows the extensibility of RDF with the performance of integers (or - centrally defined enumerations). -*/ - -#ifndef LV2_URI_MAP_H -#define LV2_URI_MAP_H - -#define LV2_URI_MAP_URI "http://lv2plug.in/ns/ext/uri-map" - -#include - -/** - Opaque pointer to host data. -*/ -typedef void* LV2_URI_Map_Callback_Data; - -/** - URI Map 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/uri-map" - and data pointed to an instance of this struct. -*/ -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_URI_Map_Callback_Data callback_data; - - /** - Get the numeric ID of a URI from the host. - - @param callback_data Must be the callback_data member of this struct. - @param map The 'context' of this URI. Certain extensions may define a - URI that must be passed here with certain restrictions on the return - value (e.g. limited range). This value may be NULL if the plugin needs - an ID for a URI in general. Extensions SHOULD NOT define a context - unless there is a specific need to do so, e.g. to restrict the range of - the returned value. - @param uri The URI to be mapped to an integer ID. - - This function is referentially transparent; any number of calls with the - same arguments is guaranteed to return the same value over the life of a - plugin instance (though the same URI may return different values with a - different map parameter). However, this function is not necessarily very - fast: plugins SHOULD cache any IDs they might need in performance - critical situations. - - The return value 0 is reserved and indicates that an ID for that URI - could not be created for whatever reason. Extensions MAY define more - precisely what this means in a certain context, but in general plugins - SHOULD handle this situation as gracefully as possible. However, hosts - SHOULD NOT return 0 from this function in non-exceptional circumstances - (e.g. the URI map SHOULD be dynamic). Hosts that statically support only - a fixed set of URIs should not expect plugins to function correctly. - */ - uint32_t (*uri_to_id)(LV2_URI_Map_Callback_Data callback_data, - const char* map, - const char* uri); - -} LV2_URI_Map_Feature; - -#endif /* LV2_URI_MAP_H */ diff --git a/lv2/ns/ext/uri-map/uri-map.ttl b/lv2/ns/ext/uri-map/uri-map.ttl deleted file mode 100644 index 88f0fdd..0000000 --- a/lv2/ns/ext/uri-map/uri-map.ttl +++ /dev/null @@ -1,93 +0,0 @@ -# LV2 URI Map Extension -# Copyright 2008-2011 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 dcs: . -@prefix doap: . -@prefix foaf: . -@prefix lv2: . -@prefix lv2ev: . -@prefix owl: . -@prefix rdf: . -@prefix rdfs: . -@prefix umap: . - - - a foaf:Person ; - foaf:name "David Robillard" ; - foaf:homepage ; - foaf:mbox ; - rdfs:seeAlso . - -_:larsl - a foaf:Person ; - foaf:name "Lars Luthman" . - - - a lv2:Specification , - lv2:Feature ; - owl:deprecated true ; - doap:license ; - doap:name "LV2 URI Map" ; - doap:shortdesc "A feature for mapping URIs to integers." ; - doap:release [ - doap:revision "1.4" ; - doap:created "2011-11-21" ; - dcs:blame ; - doap:file-release ; - dcs:changeset [ - dcs:item [ - rdfs:label "Update packaging." - ] , [ - rdfs:label "Deprecate uri-map in favour of urid." - ] - ] - ] , [ - doap:revision "1.2" ; - doap:created "2011-05-26" ; - dcs:blame ; - doap:file-release ; - dcs:changeset [ - dcs:item [ - rdfs:label "Add build system (for installation)." - ] , [ - rdfs:label "Mark up documentation in HTML using lv2:docum" - ] - ] - ] , [ - doap:revision "1.0" ; - doap:created "2010-10-18" ; - doap:file-release ; - dcs:blame ; - dcs:changeset [ - dcs:item [ - rdfs:label "Initial release." - ] - ] - ] ; - doap:maintainer , - _:larsl ; - lv2:documentation """ -

This extension is deprecated. New -implementations should use LV2 URID -instead.

- -

This extension defines a simple mechanism for plugins to map URIs to -integers, usually for performance reasons (e.g. processing events typed by URIs -in real time). The expected use case is for plugins to map URIs to integers -for things they 'understand' at instantiation time, and store those values for -use in the audio thread without doing any string comparison. This allows the -extensibility of RDF with the performance of integers (or centrally defined -enumerations).

-""" . diff --git a/lv2/ns/ext/uri-map/waf b/lv2/ns/ext/uri-map/waf deleted file mode 120000 index b955110..0000000 --- a/lv2/ns/ext/uri-map/waf +++ /dev/null @@ -1 +0,0 @@ -../../../../waf \ No newline at end of file diff --git a/lv2/ns/ext/uri-map/wscript b/lv2/ns/ext/uri-map/wscript deleted file mode 120000 index ec20a77..0000000 --- a/lv2/ns/ext/uri-map/wscript +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.wscript \ No newline at end of file diff --git a/lv2/ns/ext/urid/ext.pc.in b/lv2/ns/ext/urid/ext.pc.in deleted file mode 120000 index 82b50df..0000000 --- a/lv2/ns/ext/urid/ext.pc.in +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/ns/ext/urid/manifest.ttl b/lv2/ns/ext/urid/manifest.ttl deleted file mode 100644 index 4b23244..0000000 --- a/lv2/ns/ext/urid/manifest.ttl +++ /dev/null @@ -1,9 +0,0 @@ -@prefix lv2: . -@prefix rdfs: . -@prefix urid: . - - - a lv2:Specification ; - lv2:minorVersion 1 ; - lv2:microVersion 0 ; - rdfs:seeAlso . diff --git a/lv2/ns/ext/urid/urid.h b/lv2/ns/ext/urid/urid.h deleted file mode 100644 index 22c9a66..0000000 --- a/lv2/ns/ext/urid/urid.h +++ /dev/null @@ -1,115 +0,0 @@ -/* - Copyright 2011 Gabriel M. Beddingfield - Copyright 2008-2011 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. -*/ - -/** - @file - C header for the LV2 URID extension -*/ - -#ifndef LV2_URID_H -#define LV2_URID_H - -#define LV2_URID_URI "http://lv2plug.in/ns/ext/urid" -#define LV2_URID_MAP_URI LV2_URID_URI "#map" -#define LV2_URID_UNMAP_URI LV2_URID_URI "#unmap" - -#include - -/** - Opaque pointer to host data for LV2_URID_Map. -*/ -typedef void* LV2_URID_Map_Handle; - -/** - Opaque pointer to host data for LV2_URID_Unmap. -*/ -typedef void* LV2_URID_Unmap_Handle; - -/** - URI mapped to an integer. -*/ -typedef uint32_t LV2_URID; - -/** - URI Map (http://lv2plug.in/ns/ext/urid#map). -*/ -typedef struct { - /** - Opaque pointer to host data. - - This MUST be passed to map_uri() whenever it is called. - Otherwise, it must not be interpreted in any way. - */ - LV2_URID_Map_Handle handle; - - /** - Get the numeric ID of a URI. - - If the ID does not already exist, it will be created. - - This function is referentially transparent; any number of calls with the - same arguments is guaranteed to return the same value over the life of a - plugin instance. Note, however, that several URIs MAY resolve to the - same ID if the host considers those URIs equivalent. - - This function is not necessarily very fast or RT-safe: plugins SHOULD - cache any IDs they might need in performance critical situations. - - The return value 0 is reserved and indicates that an ID for that URI - could not be created for whatever reason. However, hosts SHOULD NOT - return 0 from this function in non-exceptional circumstances (i.e. the - URI map SHOULD be dynamic). - - @param handle Must be the callback_data member of this struct. - @param uri The URI to be mapped to an integer ID. - */ - LV2_URID (*map)(LV2_URID_Map_Handle handle, - const char* uri); -} LV2_URID_Map; - -/** - URI Unmap (http://lv2plug.in/ns/ext/urid#unmap). -*/ -typedef struct { - /** - Opaque pointer to host data. - - This MUST be passed to unmap() whenever it is called. - Otherwise, it must not be interpreted in any way. - */ - LV2_URID_Unmap_Handle handle; - - /** - Get the URI for a previously mapped numeric ID. - - Returns NULL if @c urid is not yet mapped. Otherwise, the corresponding - URI is returned in a canonical form. This MAY not be the exact same - string that was originally passed to LV2_URID_Map::map(), but it MUST be - an identical URI according to the URI syntax specification (RFC3986). A - non-NULL return for a given @c urid will always be the same for the life - of the plugin. Plugins that intend to perform string comparison on - unmapped URIs SHOULD first canonicalise URI strings with a call to - map_uri() followed by a call to unmap_uri(). - - @param handle Must be the callback_data member of this struct. - @param urid The ID to be mapped back to the URI string. - */ - const char* (*unmap)(LV2_URID_Unmap_Handle handle, - LV2_URID urid); -} LV2_URID_Unmap; - -#endif /* LV2_URID_H */ diff --git a/lv2/ns/ext/urid/urid.ttl b/lv2/ns/ext/urid/urid.ttl deleted file mode 100644 index 121ffaf..0000000 --- a/lv2/ns/ext/urid/urid.ttl +++ /dev/null @@ -1,81 +0,0 @@ -# LV2 URID Extension -# Copyright 2011 Gabriel M. Beddingfield -# Copyright 2008-2011 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 dcs: . -@prefix doap: . -@prefix foaf: . -@prefix lv2: . -@prefix rdfs: . -@prefix urid: . - - - a foaf:Person ; - foaf:name "David Robillard" ; - foaf:homepage ; - foaf:mbox ; - rdfs:seeAlso . - -_:gabrbedd - a foaf:Person ; - foaf:name "Gabriel M. Beddingfield" ; - foaf:homepage . - - - a lv2:Specification ; - doap:license ; - doap:name "LV2 URID" ; - doap:shortdesc "Features for mapping URIs to and from integers." ; - doap:release [ - doap:revision "1.0" ; - doap:created "2011-11-21" ; - dcs:blame ; - dcs:changeset [ - dcs:item [ - rdfs:label "Initial release." - ] - ] - ] ; - doap:developer _:gabrbedd ; - lv2:documentation """ -

This extension defines a simple mechanism for plugins to map URIs to and -from integers, usually for performance reasons (e.g. processing events typed by -URIs in real time). Typically, plugins map URIs to integers for things they -"understand" at instantiation time, and store those values for use in the audio -thread without doing any string comparison. This allows for the extensibility -of RDF but with the performance of integers.

- -

This extension is intended as an improved and simplified replacement for the -uri-map extension, since the -map context parameter has been found problematic. New implementations -are strongly encouraged to use this extension for URI mapping.

-""" . - -urid:map - a lv2:Feature ; - lv2:documentation """ -

A feature which is used to map URIs to integers. To support this feature, -the host must pass an LV2_Feature to LV2_Descriptor::instantiate() with URI -LV2_URID_MAP_URI and data pointed to an instance of LV2_URID_Map.

-""" . - -urid:unmap - a lv2:Feature ; - lv2:documentation """ -

A feature which is used to unmap URIs previously mapped to integers by -urid:map. To support this feature, the host must pass an LV2_Feature to -LV2_Descriptor::instantiate() with URI LV2_URID_UNMAP_URI and data pointed to -an instance of LV2_URID_Unmap.

-""" . diff --git a/lv2/ns/ext/urid/waf b/lv2/ns/ext/urid/waf deleted file mode 120000 index b955110..0000000 --- a/lv2/ns/ext/urid/waf +++ /dev/null @@ -1 +0,0 @@ -../../../../waf \ No newline at end of file diff --git a/lv2/ns/ext/urid/wscript b/lv2/ns/ext/urid/wscript deleted file mode 120000 index ec20a77..0000000 --- a/lv2/ns/ext/urid/wscript +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.wscript \ No newline at end of file diff --git a/lv2/ns/extensions/ui/ext.pc.in b/lv2/ns/extensions/ui/ext.pc.in deleted file mode 120000 index 82b50df..0000000 --- a/lv2/ns/extensions/ui/ext.pc.in +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/ns/extensions/ui/lv2-ui.doap.ttl b/lv2/ns/extensions/ui/lv2-ui.doap.ttl deleted file mode 100644 index 5b8ca9e..0000000 --- a/lv2/ns/extensions/ui/lv2-ui.doap.ttl +++ /dev/null @@ -1,74 +0,0 @@ -@prefix dcs: . -@prefix doap: . -@prefix foaf: . -@prefix rdfs: . - - - a foaf:Person ; - foaf:name "David Robillard" ; - foaf:homepage ; - foaf:mbox ; - rdfs:seeAlso . - - - a doap:Project ; - doap:license ; - doap:name "LV2 UI" ; - doap:shortdesc "Generic UI interface for LV2 plugins." ; - doap:developer [ - a foaf:Person ; - foaf:name "Lars Luthman" ; - foaf:mbox - ] ; - doap:maintainer ; - doap:release [ - doap:revision "2.5" ; - doap:created "2011-12-28" ; - dcs:changeset [ - dcs:item [ - rdfs:label "Add ui:parent." - ] - ] - ] , [ - doap:revision "2.4" ; - doap:created "2011-11-21" ; - doap:file-release ; - dcs:blame ; - dcs:changeset [ - dcs:item [ - rdfs:label "Deprecate ui:makeSONameResident." - ] , [ - rdfs:label "Add Qt4 and X11 widget types." - ] , [ - rdfs:label "Install header to URI-based system path." - ] , [ - rdfs:label "Add pkg-config file." - ] , [ - rdfs:label "Make ui.ttl a valid OWL 2 DL ontology." - ] - ] - ] , [ - doap:revision "2.2" ; - doap:created "2011-05-26" ; - doap:file-release ; - dcs:blame ; - 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 "2.0" ; - doap:created "2010-10-06" ; - doap:file-release ; - dcs:blame ; - dcs:changeset [ - dcs:item [ - rdfs:label "Initial release." - ] - ] - ] . diff --git a/lv2/ns/extensions/ui/manifest.ttl b/lv2/ns/extensions/ui/manifest.ttl deleted file mode 100644 index 28412c4..0000000 --- a/lv2/ns/extensions/ui/manifest.ttl +++ /dev/null @@ -1,9 +0,0 @@ -@prefix lv2: . -@prefix rdfs: . - - - a lv2:Specification ; - lv2:minorVersion 2 ; - lv2:microVersion 5 ; - rdfs:seeAlso , - . diff --git a/lv2/ns/extensions/ui/ui.h b/lv2/ns/extensions/ui/ui.h deleted file mode 100644 index 6d64a0d..0000000 --- a/lv2/ns/extensions/ui/ui.h +++ /dev/null @@ -1,247 +0,0 @@ -/* - LV2 UI Extension - Copyright 2009-2011 David Robillard - Copyright 2006-2008 Lars Luthman - - 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 - * C header for the LV2 UI extension . - */ - -#ifndef LV2_UI_H -#define LV2_UI_H - -#include "lv2/lv2plug.in/ns/lv2core/lv2.h" - -#define LV2_UI_URI "http://lv2plug.in/ns/extensions/ui" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - A pointer to some widget or other type of UI handle. - - The actual type is defined by the type URI of the UI. All the functionality - provided by this extension is toolkit independent, the host only needs to - pass the necessary callbacks and display the widget, if possible. Plugins - may have several UIs, in various toolkits. -*/ -typedef void* LV2UI_Widget; - -/** - A pointer to a particular instance of a UI. - - It is valid to compare this to NULL (0 for C++) but otherwise the host MUST - not attempt to interpret it. The UI plugin may use it to reference internal - instance data. -*/ -typedef void* LV2UI_Handle; - -/** - A pointer to a particular plugin controller, provided by the host. - - It is valid to compare this to NULL (0 for C++) but otherwise the UI plugin - MUST NOT attempt to interpret it. The host may use it to reference internal - instance data. -*/ -typedef void* LV2UI_Controller; - -/** - The type of the host-provided function that the UI can use to - send data to a plugin's input ports. - - The @c buffer parameter must point to a block of data, @c buffer_size bytes - large. The contents of this buffer and what the host should do with it - depends on the value of the @c format parameter. - - The @c format parameter should either be 0 or a numeric ID for a "Transfer - mechanism". Transfer mechanisms are Features and may be defined in - meta-extensions. They specify how to translate the data buffers passed to - this function to input data for the plugin ports. If a UI wishes to write - data to an input port, it must list a transfer mechanism Feature for that - port's class as an optional or required feature (depending on whether the UI - will work without being able to write to that port or not). The only - exception is when the UI wants to write single float values to input ports - of the class lv2:ControlPort, in which case @c buffer_size should always be - 4, the buffer should always contain a single IEEE-754 float, and @c format - should be 0. - - The numeric IDs for the transfer mechanisms are provided by a URI-to-integer - mapping function provided by the host, using the URI Map feature - with the map URI - "http://lv2plug.in/ns/extensions/ui". Thus a UI that requires transfer - mechanism features also requires the URI Map feature, but this is implicit - - the UI does not have to list the URI map feature as a required or optional - feature in it's RDF data. - - An UI MUST NOT pass a @c format parameter value (except 0) that has not been - returned by the host-provided URI mapping function for a host-supported - transfer mechanism feature URI. - - The UI MUST NOT try to write to a port for which there is no specified - transfer mechanism, or to an output port. The UI is responsible for - allocating the buffer and deallocating it after the call. -*/ -typedef void (*LV2UI_Write_Function)(LV2UI_Controller controller, - uint32_t port_index, - uint32_t buffer_size, - uint32_t format, - const void* buffer); - -/** - The implementation of a UI. - - A pointer to an object of this type is returned by the lv2ui_descriptor() - function. -*/ -typedef struct _LV2UI_Descriptor { - /** - The URI for this UI (not for the plugin it controls). - */ - const char* URI; - - /** - Create a new UI object and return a handle to it. This function works - similarly to the instantiate() member in LV2_Descriptor. - - @param descriptor The descriptor for the UI that you want to instantiate. - - @param plugin_uri The URI of the plugin that this UI will control. - - @param bundle_path The path to the bundle containing the RDF data file - that references this shared object file, including the trailing '/'. - - @param write_function A function provided by the host that the UI can use - to send data to the plugin's input ports. - - @param controller A handle for the plugin instance that should be passed - as the first parameter of @c write_function. - - @param widget A pointer to an LV2UI_Widget. The UI will write a widget - pointer to this location (what type of widget depends on the RDF class of - the UI) that will be the main UI widget. - - @param features An array of LV2_Feature pointers. The host must pass all - feature URIs that it and the UI supports and any additional data, just - like in the LV2 plugin instantiate() function. Note that UI features and - plugin features are NOT necessarily the same, they just share the same - data structure - this will probably not be the same array as the one the - plugin host passes to a plugin. - - */ - LV2UI_Handle (*instantiate)(const struct _LV2UI_Descriptor* descriptor, - const char* plugin_uri, - const char* bundle_path, - LV2UI_Write_Function write_function, - LV2UI_Controller controller, - LV2UI_Widget* widget, - const LV2_Feature* const* features); - - - /** - Destroy the UI object and the associated widget. The host must not try - to access the widget after calling this function. - */ - void (*cleanup)(LV2UI_Handle ui); - - /** - Tell the UI that something interesting has happened at a plugin port. - - What is interesting and how it is written to the buffer passed to this - function is defined by the @c format parameter, which has the same meaning - as in LV2UI_Write_Function. The only exception is ports of the class - lv2:ControlPort, for which this function should be called when the port - value changes (it does not have to be called for every single change if - the host's UI thread has problems keeping up with the thread the plugin is - running in), @c buffer_size should be 4, the buffer should contain a - single IEEE-754 float, and @c format should be 0. - - By default, the host should only call this function for input ports of the - lv2:ControlPort class. However, the default setting can be modified by - using the following URIs in the UI's RDF data: -
-     uiext:portNotification
-     uiext:noPortNotification
-     uiext:plugin
-     uiext:portIndex
-     
- For example, if you want the UI with uri - for the plugin with URI - to get notified when the value of the - output control port with index 4 changes, you would use the following - in the RDF for your UI: -
-      uiext:portNotification [ uiext:plugin  ;
-     uiext:portIndex 4 ] .
-     
- and similarly with uiext:noPortNotification if you wanted - to prevent notifications for a port for which it would be on by default - otherwise. The UI is not allowed to request notifications for ports of - types for which no transfer mechanism is specified, if it does it should - be considered broken and the host should not load it. - - The @c buffer is only valid during the time of this function call, so if - the UI wants to keep it for later use it has to copy the contents to an - internal buffer. - - This member may be set to NULL if the UI is not interested in any - port events. - */ - void (*port_event)(LV2UI_Handle ui, - uint32_t port_index, - uint32_t buffer_size, - uint32_t format, - const void* buffer); - - /** - Return a data structure associated with an extension URI, for example - a struct containing additional function pointers. - - Avoid returning function pointers directly since standard C/C++ has no - valid way of casting a void* to a function pointer. This member may be set - to NULL if the UI is not interested in supporting any extensions. This is - similar to the extension_data() member in LV2_Descriptor. - */ - const void* (*extension_data)(const char* uri); - -} LV2UI_Descriptor; - -/** - A plugin UI programmer must include a function called "lv2ui_descriptor" - with the following function prototype within the shared object file. This - function will have C-style linkage (if you are using C++ this is taken care - of by the 'extern "C"' clause at the top of the file). This function will - be accessed by the UI host using the @c dlsym() function and called to get a - LV2UI_UIDescriptor for the wanted plugin. - - Just like lv2_descriptor(), this function takes an index parameter. The - index should only be used for enumeration and not as any sort of ID number - - the host should just iterate from 0 and upwards until the function returns - NULL or a descriptor with an URI matching the one the host is looking for. -*/ -const LV2UI_Descriptor* lv2ui_descriptor(uint32_t index); - -/** - The type of the lv2ui_descriptor() function. -*/ -typedef const LV2UI_Descriptor* (*LV2UI_DescriptorFunction)(uint32_t index); - -#ifdef __cplusplus -} -#endif - -#endif /* LV2_UI_H */ diff --git a/lv2/ns/extensions/ui/ui.ttl b/lv2/ns/extensions/ui/ui.ttl deleted file mode 100644 index 9eb0933..0000000 --- a/lv2/ns/extensions/ui/ui.ttl +++ /dev/null @@ -1,235 +0,0 @@ -# LV2 UI Extension -# Copyright 2009-2011 David Robillard -# Copyright 2006-2008 Lars Luthman -# -# 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: . -@prefix foaf: . -@prefix lv2: . -@prefix owl: . -@prefix rdf: . -@prefix rdfs: . -@prefix ui: . -@prefix xsd: . - - - a owl:Ontology ; - owl:imports ; - lv2:documentation """ -

This extension defines an interface that can be used in LV2 plugins and -hosts to create UIs for plugins. The UIs are similar to plugins and reside in -shared object files in an LV2 bundle. UIs are associated with a plugin in RDF -using the triples:

- -
-@prefix ui: <http://lv2plug.in/ns/extensions/ui#> .
-
-<http://my.plugin>   ui:ui     <http://my.pluginui> .
-<http://my.pluginui> a         ui:GtkUI ;
-                     ui:binary <myui.so> .
-
- -

where <http://my.plugin> is the URI of the plugin, -<http://my.pluginui> is the URI of the plugin UI and <myui.so> is -the relative URI to the shared object file.

- -

While it is possible to have the plugin UI and the plugin in the same shared -object file it is probably a good idea to keep them separate so that hosts that -don't want UIs don't have to load the UI code. A UI MUST specify its class in -the RDF data (ui:GtkUI in the above example). The class defines what type the -UI is, e.g. what graphics toolkit it uses. Any type of UI class can be defined -separately from this extension.

- -

It is possible to have multiple UIs for the same plugin, or to have the UI -for a plugin in a different bundle from the actual plugin - this way people -other than the plugin author can write plugin UIs independently without editing -the original plugin bundle.

- -

Note that the process that loads the shared object file containing the UI -code and the process that loads the shared object file containing the actual -plugin implementation are not necessarily the same process (and not even -necessarily on the same machine). This means that plugin and UI code can -not use singletons and global variables and expect them to -refer to the same objects in the UI and the actual plugin. The function -callback interface defined in this header is the only method of communication -between UIs and plugin instances (extensions may define more, though this is -discouraged unless absolutely necessary since the significant benefits of -network transparency and serialisability are lost).

- -

Since the LV2 specification itself allows for extensions that may add new -functionality that could be useful to control with a UI, this extension allows -for meta-extensions that can extend the interface between the UI and the -host. These extensions mirror the extensions used for plugins - there are -required and optional "features" that you declare in the RDF data for the -UI:

- -
-<http://my.pluginui> lv2:requiredFeature <http://my.feature> .
-<http://my.pluginui> lv2:optionalFeature <http://my.feature> .
-
- -

The rules for a UI with a required or optional feature are identical to -those of lv2:Plugin instances: if a UI declares a feature as required, the host -is NOT allowed to load it unless it supports that feature; and if it does -support a feature, it MUST pass an appropriate LV2_Feature struct to the UI's -instantiate() method. These features may be used to specify how to pass -specific types of data between the UI and the plugin port buffers (see -LV2UI_Write_Function for details).

- -

UIs written to this specification do not need to be threadsafe - the -functions defined below may only be called in the same thread the UI main loop -is running in.

- -

Note that this UI extension is NOT a lv2:Feature. There is no way for a -plugin to know whether the host that loads it supports UIs or not, and the -plugin must always work without the UI (although it may be rather useless -unless it has been configured using the UI in a previous session). From the -plugin perspective, control from a UI is the same as control from anywhere else -(e.g. the host, the user): via ports.

- -

A UI does not have to be a graphical widget, it could just as well be a -server listening for OSC input or an interface to some sort of hardware device, -depending on the RDF class of the UI.

-""" . - -ui:UI - a rdfs:Class , - owl:Class ; - rdfs:subClassOf lv2:Resource ; - rdfs:label "LV2 UI" ; - rdfs:comment "A UI for an LV2 plugin" . - -ui:GtkUI - a rdfs:Class , - owl:Class ; - rdfs:subClassOf ui:UI ; - rdfs:comment """ -A UI where the LV2_Widget is a pointer to a Gtk+ 2.0 compatible GtkWidget, -and the host guarantees that the Gtk+ library has been initialised and the -Glib main loop is running before a UI of this type is instantiated.""" . - -ui:Qt4UI - a rdfs:Class , - owl:Class ; - rdfs:subClassOf ui:UI ; - rdfs:comment """ -A UI where the LV2_Widget is a pointer to a Qt4 compatible QWidget, -and the host guarantees that the Qt4 library has been initialised and the -Qt4 main loop is running before a UI of this type is instantiated.""" . - -ui:X11UI - a rdfs:Class , - owl:Class ; - rdfs:subClassOf ui:UI ; - rdfs:comment """ -A UI where the LV2_Widget is an X11 window ID. Note this is actually an -integer, i.e. the LV2_Widget is not a pointer to an X11 window ID, but should -be itself taken as an integer value.""" . - -ui:makeSONameResident - a lv2:Feature ; - owl:deprecated "true"^^xsd:boolean ; - lv2:documentation """ -

DEPRECATED

- -

This feature was intended to support UIs that link against toolkit -libraries which may not be unloaded during the lifetime of the host. -This is better achieved by using the appropriate flags when linking the -UI, e.g. gcc -Wl,nodelete.

-""" . - -ui:noUserResize - a lv2:Feature ; - lv2:documentation """ -

If a UI requires this feature it indicates that it does not make sense -to let the user resize the main widget, and the host should prevent that. -This feature may not make sense for all UI types. The data pointer for the -LV2_Feature for this feature should always be set to NULL.

-""" . - -ui:fixedSize - a lv2:Feature ; - lv2:documentation """ -

If a UI requires this feature it indicates the same thing as -ui:noUserResize, and additionally it means that the UI will not resize -the main widget on its own - it will always remain the same size (e.g. a -pixmap based GUI). This feature may not make sense for all UI types. -The data pointer for the LV2_Feature for this feature should always be set -to NULL.

-""" . - -ui:parent - a lv2:Feature ; - lv2:documentation """ -

The parent for the UI.

- -

This feature can be used to pass a parent (e.g. a widget, container, canvas, -etc.) the UI should be a child of. The format of data pointer of this feature -is determined by the UI type, and is generally the same type as the LV2_Widget -the UI would return (e.g. for a GtkUI the data would be a pointer to a -GtkWidget which is a GtkContainer). This is particularly useful for -cross-toolkit embedding, where the parent often must be known at construction -time for embedding to work correctly. UIs should not require this feature -unless it is absolutely necessary for them to work at all.

-""" . - -ui:PortNotification - a rdfs:Class , - owl:Class ; - rdfs:subClassOf [ - a owl:Restriction ; - owl:onProperty ui:plugin ; - owl:someValuesFrom lv2:Plugin ; - owl:cardinality 1 ; - rdfs:comment """ -A PortNotification MUST have exactly one ui:plugin which is a lv2:Plugin. -""" - ] , [ - a owl:Restriction ; - owl:onProperty ui:portIndex ; - owl:someValuesFrom xsd:decimal ; - owl:cardinality 1 ; - rdfs:comment """ -A PortNotification MUST have exactly one ui:portIndex which is an xsd:decimal. -""" - ] ; - rdfs:comment "Port Notification" . - -ui:portNotification - a rdf:Property , - owl:ObjectProperty ; - rdfs:domain ui:UI ; - rdfs:range ui:PortNotification ; - lv2:documentation """ -

Indicates that a UI should receive notification (via -LV2UI_Descriptor::port_event()) when a particular port's value changes.

-""" . - -ui:plugin - a rdf:Property , - owl:ObjectProperty ; - rdfs:domain ui:PortNotification ; - rdfs:range lv2:Plugin ; - rdfs:comment """ -The plugin a portNotification applies to. -""" . - -ui:portIndex - a rdf:Property , - owl:DatatypeProperty ; - rdfs:domain ui:PortNotification ; - rdfs:range xsd:decimal ; - rdfs:comment """ -The index of the port a portNotification applies to. -""" . diff --git a/lv2/ns/extensions/ui/waf b/lv2/ns/extensions/ui/waf deleted file mode 120000 index b955110..0000000 --- a/lv2/ns/extensions/ui/waf +++ /dev/null @@ -1 +0,0 @@ -../../../../waf \ No newline at end of file diff --git a/lv2/ns/extensions/ui/wscript b/lv2/ns/extensions/ui/wscript deleted file mode 120000 index ec20a77..0000000 --- a/lv2/ns/extensions/ui/wscript +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.wscript \ No newline at end of file diff --git a/lv2/ns/extensions/units/ext.pc.in b/lv2/ns/extensions/units/ext.pc.in deleted file mode 120000 index 82b50df..0000000 --- a/lv2/ns/extensions/units/ext.pc.in +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.pc.in \ No newline at end of file diff --git a/lv2/ns/extensions/units/lv2-units.doap.ttl b/lv2/ns/extensions/units/lv2-units.doap.ttl deleted file mode 100644 index 473074d..0000000 --- a/lv2/ns/extensions/units/lv2-units.doap.ttl +++ /dev/null @@ -1,72 +0,0 @@ -@prefix dcs: . -@prefix doap: . -@prefix foaf: . -@prefix rdfs: . - - - a foaf:Person ; - foaf:name "Steve Harris" ; - foaf:homepage ; - rdfs:seeAlso . - - - a foaf:Person ; - foaf:name "David Robillard" ; - foaf:homepage ; - foaf:mbox ; - rdfs:seeAlso . - - - a doap:Project ; - doap:name "LV2 Units" ; - doap:shortdesc "Units for LV2 values." ; - doap:created "2007-02-06" ; - doap:homepage ; - doap:license ; - doap:release [ - doap:revision "5.4" ; - doap:created "2011-11-21" ; - doap:file-release ; - dcs:blame ; - dcs:changeset [ - dcs:item [ - rdfs:label "Make units.ttl a valid OWL 2 DL ontology." - ] , [ - rdfs:label "Define used but undefined resources (units:name, units:render, units:symbol, units:Conversion, units:conversion, units:prefixConversion, units:to, and units:factor)." - ] , [ - rdfs:label "Update packaging." - ] , [ - rdfs:label "Improve documentation." - ] - ] - ] , [ - doap:revision "5.2" ; - doap:created "2010-10-05" ; - doap:file-release ; - dcs:blame ; - dcs:changeset [ - dcs:item [ - rdfs:label "Add build system (for installation)." - ] , [ - rdfs:label "Convert documentation to HTML and use lv2:documentation." - ] - ] - ] , [ - doap:revision "5.0" ; - doap:created "2010-10-05" ; - doap:file-release ; - dcs:blame ; - dcs:changeset [ - dcs:item [ - rdfs:label "Initial release." - ] , [ - rdfs:label "Define used but undefined resources (units:name, units:render, units:symbol, units:Conversion, units:conversion, units:prefixConversion, units:to, and units:factor)." - ] , [ - rdfs:label "Update packaging." - ] , [ - rdfs:label "Improve documentation." - ] - ] - ] ; - doap:developer ; - doap:maintainer . diff --git a/lv2/ns/extensions/units/manifest.ttl b/lv2/ns/extensions/units/manifest.ttl deleted file mode 100644 index e5250cc..0000000 --- a/lv2/ns/extensions/units/manifest.ttl +++ /dev/null @@ -1,9 +0,0 @@ -@prefix lv2: . -@prefix rdfs: . - - - a lv2:Specification ; - lv2:minorVersion 5 ; - lv2:microVersion 4 ; - rdfs:seeAlso , . - diff --git a/lv2/ns/extensions/units/units.ttl b/lv2/ns/extensions/units/units.ttl deleted file mode 100644 index b0c070b..0000000 --- a/lv2/ns/extensions/units/units.ttl +++ /dev/null @@ -1,408 +0,0 @@ -# LV2 Units Extension -# Copyright 2009-2011 David Robillard -# Copyright 2007 Steve Harris -# -# 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 lv2: . -@prefix owl: . -@prefix rdf: . -@prefix rdfs: . -@prefix units: . -@prefix xsd: . - - - a owl:Ontology ; - owl:imports ; - lv2:documentation """ -

This extension defines a number of units for use in audio processing.

- -

For example, to say that a gain port's value is in decibels (units:db)

-
-@prefix units: <http://lv2plug.in/ns/extensions/units#> .
-@prefix eg:    <http://example.org/> .
-
-eg:plugin lv2:port [
-    a            lv2:ControlRateInputPort ;
-    lv2:datatype lv2:Float ;
-    lv2:index    0 ;
-    lv2:symbol   "gain" ;
-    lv2:name     "gain" ;
-    units:unit   units:db
-] .
-
- -

Using the same form, plugins may also specify one-off units inline, to give -better display hints to hosts:

-
-eg:plugin lv2:port [
-    a            lv2:ControlRateInputPort ;
-    lv2:datatype lv2:Float ;
-    lv2:index    0 ;
-    lv2:symbol   "frob" ;
-    lv2:name     "frob level" ;
-    units:unit [
-        a            units:Unit ;
-        units:name   "frobnication" ;
-        units:symbol "fr" ;
-        units:render "%f f"
-    ]
-] .
-
- -

It is also possible to define conversions between various units, which makes -it possible for hosts to automatically and generically convert from a given -unit to a desired unit. The units defined in this extension include conversion -definitions where it makes sense to do so.

-""" . - -units:Unit - a rdfs:Class , - owl:Class ; - rdfs:comment "A unit for LV2 port data" . - -units:unit - a rdf:Property , - owl:ObjectProperty ; - rdfs:domain lv2:Port ; - rdfs:range units:Unit ; - rdfs:comment "Relates a port to the unit of its data" . - -units:name - a rdf:Property , - owl:DatatypeProperty ; - rdfs:domain units:Unit ; - rdfs:range xsd:string ; - rdfs:comment "A display name for the unit (e.g. decibels)." . - -units:render - a rdf:Property , - owl:DatatypeProperty ; - rdfs:domain units:Unit ; - rdfs:range xsd:string ; - rdfs:comment """A printf format string for rendering a value (eg. "%f dB").""" . - -units:symbol - a rdf:Property , - owl:DatatypeProperty ; - rdfs:domain units:Unit ; - rdfs:range xsd:string ; - rdfs:comment "The abbreviated symbol for the unit (e.g. dB)." . - -units:Conversion - a rdfs:Class , - owl:Class ; - rdfs:subClassOf [ - a owl:Restriction ; - owl:onProperty units:to ; - owl:cardinality 1 ; - rdfs:comment "A conversion MUST have exactly 1 units:to property." - ] ; - rdfs:comment "A conversion from one unit to another." . - -units:conversion - a rdf:Property , - owl:ObjectProperty ; - rdfs:domain units:Unit ; - rdfs:range units:Conversion ; - rdfs:comment "A conversion from this unit to another." . - -units:prefixConversion - a rdf:Property , - owl:ObjectProperty ; - rdfs:subPropertyOf units:conversion ; - rdfs:domain units:Unit ; - rdfs:range units:Conversion ; - rdfs:comment """ -A conversion from this unit to the same unit but with a different SI prefix -(e.g. Hz to kHz). -""" . - -units:to - a rdf:Property , - owl:ObjectProperty ; - rdfs:domain units:Conversion ; - rdfs:range units:Unit ; - rdfs:comment "The target unit this conversion converts to." . - -units:factor - a rdf:Property , - owl:DatatypeProperty ; - rdfs:domain units:Conversion ; - rdfs:comment """ -The factor to multiple the source value by in order to convert -to the target unit. -""" . - -units:s - a units:Unit ; - units:conversion [ - units:factor 0.0166666666 ; - units:to units:min - ] ; - units:name "second" ; - units:prefixConversion [ - units:factor 1000 ; - units:to units:ms - ] ; - units:render "%f s" ; - units:symbol "s" . - -units:ms - a units:Unit ; - units:name "millisecond" ; - units:prefixConversion [ - units:factor 0.001 ; - units:to units:s - ] ; - units:render "%f ms" ; - units:symbol "ms" . - -units:min - a units:Unit ; - units:conversion [ - units:factor 60.0 ; - units:to units:s - ] ; - units:name "minute" ; - units:render "%f mins" ; - units:symbol "min" . - -units:bar - a units:Unit ; - units:name "bar" ; - units:render "%f bars" ; - units:symbol "bars" . - -units:beat - a units:Unit ; - units:name "beat" ; - units:render "%f beats" ; - units:symbol "beats" . - -units:m - a units:Unit ; - units:conversion [ - units:factor 39.37 ; - units:to units:inch - ] ; - units:name "metre" ; - units:prefixConversion [ - units:factor 100 ; - units:to units:cm - ] , [ - units:factor 1000 ; - units:to units:mm - ] , [ - units:factor 0.001 ; - units:to units:km - ] ; - units:render "%f m" ; - units:symbol "m" . - -units:cm - a units:Unit ; - units:conversion [ - units:factor 0.3937 ; - units:to units:inch - ] ; - units:name "centimetre" ; - units:prefixConversion [ - units:factor 0.01 ; - units:to units:m - ] , [ - units:factor 10 ; - units:to units:mm - ] , [ - units:factor 0.00001 ; - units:to units:km - ] ; - units:render "%f cm" ; - units:symbol "cm" . - -units:mm - a units:Unit ; - units:conversion [ - units:factor 0.03937 ; - units:to units:inch - ] ; - units:name "millimetre" ; - units:prefixConversion [ - units:factor 0.001 ; - units:to units:m - ] , [ - units:factor 0.1 ; - units:to units:cm - ] , [ - units:factor 0.000001 ; - units:to units:km - ] ; - units:render "%f mm" ; - units:symbol "mm" . - -units:km - a units:Unit ; - units:conversion [ - units:factor 0.62138818 ; - units:to units:mile - ] ; - units:name "kilometre" ; - units:prefixConversion [ - units:factor 1000 ; - units:to units:m - ] , [ - units:factor 100000 ; - units:to units:cm - ] , [ - units:factor 1000000 ; - units:to units:mm - ] ; - units:render "%f km" ; - units:symbol "km" . - -units:inch - a units:Unit ; - units:conversion [ - units:factor 2.54 ; - units:to units:cm - ] ; - units:name "inch" ; - units:render "%f\"" ; - units:symbol "in" . - -units:mile - a units:Unit ; - units:conversion [ - units:factor 1.6093 ; - units:to units:km - ] ; - units:name "mile" ; - units:render "%f mi" ; - units:symbol "mi" . - -units:db - a units:Unit ; - units:name "decibel" ; - units:render "%f dB" ; - units:symbol "dB" . - -units:pc - a units:Unit ; - units:conversion [ - units:factor 0.01 ; - units:to units:coef - ] ; - units:name "percent" ; - units:render "%f%%" ; - units:symbol "%" . - -units:coef - a units:Unit ; - units:conversion [ - units:factor 100 ; - units:to units:pc - ] ; - units:name "coefficient" ; - units:render "* %f" ; - units:symbol "" . - -units:hz - a units:Unit ; - units:name "hertz" ; - units:prefixConversion [ - units:factor 0.001 ; - units:to units:khz - ] , [ - units:factor 0.000001 ; - units:to units:mhz - ] ; - units:render "%f Hz" ; - units:symbol "Hz" . - -units:khz - a units:Unit ; - units:name "kilohertz" ; - units:prefixConversion [ - units:factor 1000 ; - units:to units:hz - ] , [ - units:factor 0.001 ; - units:to units:mhz - ] ; - units:render "%f kHz" ; - units:symbol "kHz" . - -units:mhz - a units:Unit ; - units:name "megahertz" ; - units:prefixConversion [ - units:factor 1000000 ; - units:to units:hz - ] , [ - units:factor 0.001 ; - units:to units:khz - ] ; - units:render "%f MHz" ; - units:symbol "MHz" . - -units:bpm - a units:Unit ; - units:name "beats per minute" ; - units:prefixConversion [ - units:factor 0.0166666666 ; - units:to units:hz - ] ; - units:render "%f BPM" ; - units:symbol "BPM" . - -units:oct - a units:Unit ; - units:conversion [ - units:factor 12.0 ; - units:to units:semitone12TET - ] ; - units:name "octaves" ; - units:render "%f octaves" ; - units:symbol "oct" . - -units:cent - a units:Unit ; - units:conversion [ - units:factor 0.01 ; - units:to units:semitone12TET - ] ; - units:name "cent" ; - units:render "%f ct" ; - units:symbol "ct" . - -units:semitone12TET - a units:Unit ; - units:conversion [ - units:factor 0.083333333 ; - units:to units:oct - ] ; - units:name "semitone" ; - units:render "%f semi" ; - units:symbol "semi" . - -units:degree - a units:Unit ; - units:name "degree" ; - units:render "%f deg" ; - units:symbol "deg" . - -units:midiNote - a units:Unit ; - units:name "MIDI note" ; - units:render "MIDI note %d" ; - units:symbol "note" . diff --git a/lv2/ns/extensions/units/waf b/lv2/ns/extensions/units/waf deleted file mode 120000 index b955110..0000000 --- a/lv2/ns/extensions/units/waf +++ /dev/null @@ -1 +0,0 @@ -../../../../waf \ No newline at end of file diff --git a/lv2/ns/extensions/units/wscript b/lv2/ns/extensions/units/wscript deleted file mode 120000 index ec20a77..0000000 --- a/lv2/ns/extensions/units/wscript +++ /dev/null @@ -1 +0,0 @@ -../../../../ext.wscript \ No newline at end of file diff --git a/lv2/ns/index.html.in b/lv2/ns/index.html.in deleted file mode 100644 index 4863cb2..0000000 --- a/lv2/ns/index.html.in +++ /dev/null @@ -1,32 +0,0 @@ - - - - - LV2 Specifications - - - - - -
- - - - - - - - - @ROWS@ -
NameDescriptionVersionDateStatus
-
- - - diff --git a/lv2/ns/lv2core/AUTHORS b/lv2/ns/lv2core/AUTHORS deleted file mode 100644 index 64febf8..0000000 --- a/lv2/ns/lv2core/AUTHORS +++ /dev/null @@ -1,13 +0,0 @@ -LV2 is written and maintained by: - -David Robillard -Steve Harris - -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/ns/lv2core/COPYING b/lv2/ns/lv2core/COPYING deleted file mode 100644 index c46d5dd..0000000 --- a/lv2/ns/lv2core/COPYING +++ /dev/null @@ -1,16 +0,0 @@ -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/ns/lv2core/INSTALL b/lv2/ns/lv2core/INSTALL deleted file mode 100644 index 16b1427..0000000 --- a/lv2/ns/lv2core/INSTALL +++ /dev/null @@ -1,41 +0,0 @@ -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/ns/lv2core/README b/lv2/ns/lv2core/README deleted file mode 100644 index f49513f..0000000 --- a/lv2/ns/lv2core/README +++ /dev/null @@ -1,42 +0,0 @@ -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 . - - -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 diff --git a/lv2/ns/lv2core/lv2.h b/lv2/ns/lv2core/lv2.h deleted file mode 100644 index 29adf7b..0000000 --- a/lv2/ns/lv2core/lv2.h +++ /dev/null @@ -1,299 +0,0 @@ -/* - 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 . - Revision: 6.1 -*/ - -#ifndef LV2_H_INCLUDED -#define LV2_H_INCLUDED - -#include - -#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/ns/lv2core/lv2core.doap.ttl b/lv2/ns/lv2core/lv2core.doap.ttl deleted file mode 100644 index 33048a2..0000000 --- a/lv2/ns/lv2core/lv2core.doap.ttl +++ /dev/null @@ -1,117 +0,0 @@ -@prefix dcs: . -@prefix doap: . -@prefix foaf: . -@prefix rdfs: . - - - a foaf:Person ; - foaf:name "Steve Harris" ; - foaf:homepage ; - rdfs:seeAlso . - - - a foaf:Person ; - foaf:name "David Robillard" ; - foaf:homepage ; - foaf:mbox ; - rdfs:seeAlso . - - - a doap:Project ; - doap:license ; - doap:name "LV2" ; - doap:homepage ; - 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 ; - 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 ; - dcs:blame ; - 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 ; - dcs:blame ; - 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 ; - dcs:blame ; - 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 ; - dcs:blame ; - dcs:changeset [ - dcs:item [ - rdfs:label "Initial release." - ] - ] - ] ; - doap:developer , - ; - doap:maintainer . diff --git a/lv2/ns/lv2core/lv2core.pc.in b/lv2/ns/lv2core/lv2core.pc.in deleted file mode 100644 index 96e5169..0000000 --- a/lv2/ns/lv2core/lv2core.pc.in +++ /dev/null @@ -1,10 +0,0 @@ -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/ns/lv2core/lv2core.ttl b/lv2/ns/lv2core/lv2core.ttl deleted file mode 100644 index 0ab56c5..0000000 --- a/lv2/ns/lv2core/lv2core.ttl +++ /dev/null @@ -1,883 +0,0 @@ -# This document describes LV2, a plugin interface. -# See 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: . -@prefix lv2: . -@prefix owl: . -@prefix rdf: . -@prefix rdfs: . -@prefix xsd: . - -########################### -## 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 """ -

An LV2 specification (i.e. this specification, or an LV2 extension).

- -

Specification data, like plugin data, is distributed in bundles -so hosts may discover all present LV2 data.

-""" . - -lv2:documentation a rdf:Property , owl:AnnotationProperty ; - rdfs:range rdfs:Literal ; - rdfs:label "documentation" ; - rdfs:seeAlso ; - lv2:documentation """ -

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

-

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 XHTML Basic, Section 3 for a list of legal tags.

-""" . - - - a owl:Ontology ; - owl:imports ; - lv2:documentation """ -

LV2 is an interface for writing audio processors, or plugins, in -C/C++ which can be dynamically loaded into many applications, or hosts. -This core specification is simple and minimal, but is designed so that -extensions can be defined to add more advanced features, making it -possibly to implement nearly any feature imaginable.

- -

LV2 maintains a strong distinction between code and data. -Plugin code is in a shared library, while data is in a companion data file -written in Turtle. -Code, data, and any other resources (e.g. waveforms) are shipped together in a -bundle directory. The code contains only the executable portions of the -plugin which inherently must 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.

- -

An LV2 plugin library is suitable for dynamic loading (e.g. via -dlopen()) and provides one or more plugin descriptors via the -lv2_descriptor() function. These can be instantiated to create -plugin instances, which can be run directly on data or connected -together to perform advanced signal processing tasks.

- -

Plugins communicate via ports, which can transmit any type of data. -Data is processed by first connecting each port to a buffer, then -repeatedly calling a plugin's run() method to process blocks of -data.

- -

This core specification defines two types of port, equivalent to those in LADSPA: lv2:ControlPort and lv2:AudioPort. -Audio ports contain arrays with one float element per sample, -allowing a block of audio to be processed in a single call to -run(). Control ports contain single float values, -which are fixed and valid for the duration of the call to run(). -Thus the control rate is determined by the block size, which is -controlled by the host (and not necessarily constant).

- -

Threading Rules

- -

To faciliate use in multi-threaded programs, LV2 functions are partitioned -into several threading classes:

- - - - - - - - - - - - - -
Discovery ClassInstantiation ClassAudio Class
lv2_descriptor()LV2_Descriptor::instantiate()LV2_Descriptor::run()
LV2_Descriptor::extension_data()LV2_Descriptor::cleanup()LV2_Descriptor::connect_port()
LV2_Descriptor::activate()
LV2_Descriptor::deactivate()
- -

The rules that hosts MUST follow are:

-
    -
  • When any function is running for a plugin instance, -no other function in the same class may run for that instance.
  • -
  • When a Discovery function is running, -no other functions in the same shared object file may run.
  • -
  • When an Instantiation function is running for a plugin instance, -no other functions for that instance may run.
  • -
- -

Any simultaneous calls that are not explicitly forbidden by these rules are -allowed. For example, a host may call run() for two different -plugin instances simultaneously.

- -

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.

- -

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.

-""" . - -############ -## Plugin ## -############ - -lv2:PluginBase a rdfs:Class , owl:Class ; - rdfs:subClassOf lv2:Resource ; - lv2:documentation """ -

An abstract plugin-like resource that MAY not actually be an LV2 plugin -(e.g. may not actually have a plugin binary).

- -

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 understand this structure.

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

The class which represents an LV2 plugin.

- -

To be discovered by hosts, plugins MUST explicitly have rdf:type lv2:Plugin -listed in their bundle's manifest, e.g.:

-
-<http://example.org/my-plugin> a lv2:Plugin .
-
- -

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. Tape Delay Unit. Use doap:shortdesc or doap:description for more -detailed descriptions.

-""" . - -########## -## 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 """ -

The class which represents an LV2 port.

- -

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

- -

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

- -

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

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

Ports of this type will be connected to a pointer to a single value of C -type float.

- -""" . - -lv2:AudioPort a rdfs:Class , owl:Class ; - rdfs:subClassOf lv2:Port ; - rdfs:label "Audio port" ; - lv2:documentation """ -

Ports of this type will be connected to an array of length sample_count -with elements of C type float.

-""" . - -####################### -## 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 """ -

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.

- -

The version of an LV2 resource is composed of two fields: minor version, -and micro version. These have the usual semantics:

- -
    -
  • 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.
  • - -
  • The micro version is incremented for changes which do not affect -compatibility at all, e.g. bug fixes or documentation updates.
  • -
- -

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. SemVer conformant) version number is required, the -major version of all released LV2 resources is 1.

- -

Plugins and extensions MUST adhere to the following rules:

-
    -
  • All versions of a plugin with a given URI MUST have the same 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.
  • - -
  • New ports MAY be added without changing the plugin URI if and only if they -are lv2:connectionOptional and the minor version is incremented.
  • - -
  • The minor version MUST be incremented if the index of any port (identified -by its symbol) is changed.
  • - -
  • 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.
  • -
- -

(Note these rules are not necessarily exhaustive)

- -

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 instance at run-time).

- -

When hosts discover several installed versions of a resource, they SHOULD -warn the user and load only the most recent version.

- -

An odd minor or 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.

- -

This property describes half of a resource version. See also lv2:minorVersion, the -property which describes the other half.

-""" . - -lv2:microVersion a rdf:Property , owl:DatatypeProperty ; - rdfs:domain lv2:Resource ; - rdfs:range xsd:nonNegativeInteger ; - rdfs:label "micro version" ; - lv2:documentation """ -

The micro component of a Resource's version.

- -

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.

- -

This property describes half of a resource version. For detailed -documentation on LV2 resource versioning, see lv2:minorVersion.

-""" . - -lv2:binary a rdf:Property , owl:ObjectProperty ; - rdfs:domain lv2:Resource ; - rdfs:range owl:Thing ; - rdfs:label "binary" ; - lv2:documentation """ -

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

- -

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

-""" . - -lv2:appliesTo a rdf:Property , owl:ObjectProperty ; - rdfs:domain lv2:Resource ; - rdfs:range lv2:Plugin ; - rdfs:label "Applies to" ; - lv2:documentation """ -

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

-
-<thing>
-    a             ext:Thing ;
-    lv2:appliesTo <plugin> ;
-    rdfs:seeAlso  <thing.ttl> .
-
- -

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.

-""" . - -##################### -## 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 """ -

A Point describes an interesting value in a Port's range (much like a labeled -notch on a physical knob).

-
    -
  • A Point MUST have at least one rdfs:label which is a string.
  • -
  • A Point MUST have exactly one rdf:value with a type that is compatible - with the type of the corresponding Port.
  • -
-""" . - -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 """ -

A hint to the host for the minimum useful value that the port will use. This -is a soft limit; the plugin is required to gracefully accept all values -in the range of a port's data type.

-""" . - -lv2:maximum a rdf:Property , owl:DatatypeProperty ; - rdfs:domain lv2:Port ; - rdfs:label "Maximum value" ; - lv2:documentation """ -

A hint to the host for the maximum useful value that the port will use. -This is a soft limit; the plugin is required to gracefully accept all -values in the range of a port's data type.

-""" . - -############# -## 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 """ -

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.

-""" . - -lv2:requiredFeature a rdf:Property , owl:ObjectProperty ; - rdfs:domain lv2:Resource ; - rdfs:range lv2:Feature ; - rdfs:label "Required feature" ; - lv2:documentation """ -

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

-""" . - -#################### -## 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 """ -

Signifies that a plugin provides additional data or functions (as defined by -some extension) via LV2:Descriptor::instantiate().

-""" . - -####################### -## Standard Features ## -####################### - -lv2:isLive a lv2:Feature ; - rdfs:label "Has a live (realtime) dependency" ; - lv2:documentation """ -

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 hard real-time execution requirements (see -lv2:hardRTCapable).

-""" . - -lv2:inPlaceBroken a lv2:Feature ; - rdfs:label "In-place broken" ; - lv2:documentation """ -

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 in-place.

-""" . - -lv2:hardRTCapable a lv2:Feature ; - rdfs:label "Hard realtime capable" ; - lv2:documentation """ -

Indicates that the plugin is capable of running not only in a conventional -host but also in a hard real-time environment. To qualify for this the -plugin MUST satisfy all of the following:

-
    -
  1. The plugin MUST NOT use malloc(), free() or other heap memory management - functions within its Audio class functions.
  2. - -
  3. 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.
  4. - -
  5. 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.
  6. - -
  7. The plugin will take an amount of time to execute a run() call - approximately of form A + B * sample_count where A - and B depend on the machine and host in use. This amount of - time MUST NOT depend on input signals or plugin state.
  8. -
-

Note these rules apply to the connect_port() function as well as run().

-""" . - -################## -## 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 """ -

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 -correct latency. In fuzzy 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).

-""" . - -lv2:toggled a lv2:PortProperty ; - rdfs:label "Toggled" ; - lv2:documentation """ -

Indicates that the data item should be considered a Boolean toggle. Data -less than or equal to zero should be considered off or false, and -data above zero should be considered on or true.

-""" . - -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/ns/lv2core/manifest.ttl b/lv2/ns/lv2core/manifest.ttl deleted file mode 100644 index 5733b55..0000000 --- a/lv2/ns/lv2core/manifest.ttl +++ /dev/null @@ -1,10 +0,0 @@ -@prefix doap: . -@prefix lv2: . -@prefix owl: . -@prefix rdfs: . - - - a doap:Project , lv2:Specification , owl:Ontology ; - lv2:minorVersion 6 ; - lv2:microVersion 1 ; - rdfs:seeAlso , . \ No newline at end of file diff --git a/lv2/ns/lv2core/waf b/lv2/ns/lv2core/waf deleted file mode 100755 index 907b984..0000000 Binary files a/lv2/ns/lv2core/waf and /dev/null differ diff --git a/lv2/ns/lv2core/wscript b/lv2/ns/lv2core/wscript deleted file mode 100644 index af4045a..0000000 --- a/lv2/ns/lv2core/wscript +++ /dev/null @@ -1,134 +0,0 @@ -#!/usr/bin/env python -import os - -from waflib.extras import autowaf as autowaf -import waflib.Options as Options -import waflib.Scripting as Scripting - -# 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: no DOAP file found, unable to generate NEWS') - 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)) - -class Dist(Scripting.Dist): - fun = 'dist' - cmd = 'dist' - - def archive(self): - # Write NEWS file - write_news('lv2core.doap.ttl') - - # Build distribution - Scripting.Dist.archive(self) - - # Delete generated NEWS file - os.remove('NEWS') - -class DistCheck(Dist, Scripting.DistCheck): - fun = 'distcheck' - cmd = 'distcheck' - - def archive(self): - Dist.archive(self) diff --git a/wscript b/wscript index e173b16..f4db842 100644 --- a/wscript +++ b/wscript @@ -15,7 +15,7 @@ import waflib.Options as Options LV2EXT_VERSION = datetime.date.isoformat(datetime.datetime.now()).replace('-', '.') # Variables for 'waf dist' -APPNAME = 'lv2plug.in' +APPNAME = 'lv2world' VERSION = LV2EXT_VERSION # Mandatory variables @@ -31,7 +31,7 @@ def options(opt): opt.add_option('--experimental', action='store_true', default=False, dest='experimental', help='Install unreleased experimental extensions') - for i in ['lv2/ns/lv2core']: + for i in ['lv2/lv2plug.in/ns/lv2core']: opt.recurse(i) def configure(conf): @@ -41,9 +41,9 @@ def configure(conf): conf.env.append_unique('CFLAGS', '-std=c99') - subdirs = ['lv2/ns/lv2core'] - subdirs += glob.glob('lv2/ns/ext/*/') - subdirs += glob.glob('lv2/ns/extensions/*/') + subdirs = ['lv2/lv2plug.in/ns/lv2core'] + subdirs += glob.glob('lv2/lv2plug.in/ns/ext/*/') + subdirs += glob.glob('lv2/lv2plug.in/ns/extensions/*/') for i in subdirs: conf.recurse(i) @@ -66,8 +66,8 @@ def release(ctx): os.makedirs('build/spec') - manifests = glob.glob('lv2/ns/lv2core/manifest.ttl') - manifests += glob.glob('lv2/ns/*/*/manifest.ttl') + manifests = glob.glob('lv2/lv2plug.in/ns/lv2core/manifest.ttl') + manifests += glob.glob('lv2/lv2plug.in/ns/*/*/manifest.ttl') for manifest in manifests: dir = os.path.dirname(manifest) name = os.path.basename(dir).replace('.lv2', '') @@ -100,7 +100,7 @@ def release(ctx): subprocess.call(['./waf', 'distclean'], cwd=dir) def lint(ctx): - for i in (['lv2/ns/lv2core/lv2.h'] - + glob.glob('lv2/ns/ext/*/*.h') - + glob.glob('lv2/ns/extensions/*/*.h')): + for i in (['lv2/lv2plug.in/ns/lv2core/lv2.h'] + + glob.glob('lv2/lv2plug.in/ns/ext/*/*.h') + + glob.glob('lv2/lv2plug.in/ns/extensions/*/*.h')): subprocess.call('cpplint.py --filter=+whitespace/comments,-whitespace/tab,-whitespace/braces,-whitespace/labels,-whitespace/blank_line,-build/header_guard,-readability/casting,-readability/todo,-build/include ' + i, shell=True) -- cgit v1.2.1