# LV2 Reference Extension
# Copyright 2007-2011 David Robillard <d@drobilla.net>
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

@prefix atom:      <http://lv2plug.in/ns/ext/atom#> .
@prefix doap:      <http://usefulinc.com/ns/doap#> .
@prefix foaf:      <http://xmlns.com/foaf/0.1/> .
@prefix lv2:       <http://lv2plug.in/ns/lv2core#> .
@prefix rdf:       <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs:      <http://www.w3.org/2000/01/rdf-schema#> .
@prefix reference: <http://lv2plug.in/ns/ext/reference#> .

<http://lv2plug.in/ns/ext/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 <http://drobilla.net/> ;
		rdfs:seeAlso  <http://drobilla.net/drobilla.rdf>
	] ;
	lv2:documentation """
<p>This extension defines a mechanism for working with generic/opaque
dynamically allocated memory, called a <a href="#Blob">"Blob"</a>, which is
(unlike an Atom) not necessarily POD.  Blobs are accessed via a
reference:Reference, which is a special case of <a
href="http://lv2plug.in/ns/ext#Atom">Atom</a> that always has <code>type =
0</code>, 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.</p>
""" .

reference:Reference a rdfs:Class ;
	rdfs:subClassOf atom:Atom ;
	rdfs:label      "Reference" ;
	lv2:documentation """
<p>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.</p>

<p>A Reference is a special case of Atom with <code>type = 0</code>.
"Null" is the unique Atom with <code>type = 0</code> and
<code>size = 0</code>.</p>
""" .

reference:blobSupport a lv2:Feature ;
	rdfs:label "Blob support" ;
	lv2:documentation """
<p>Support for dynamically allocated blobs.  If a host supports this feature,
it MUST pass a LV2_Feature with <code>URI</code>
http://lv2plug.in/ns/ext/atom#blobSupport and <code>data</code> pointing to a
LV2_Blob_Support.</p>
""" .

reference:Blob a rdfs:Class ;
	rdfs:label      "Blob" ;
	lv2:documentation """
<p>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.</p>

<p>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).</p>
""" .