summaryrefslogtreecommitdiff
path: root/lv2/lv2_uri_map.h
blob: 93571d55ab602d5df6f081420e2b2a7e5e4754f9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
/* lv2_uri_map.h - C header file for the LV2 URI Map extension.
 *
 * Copyright (C) 2008-2009 David Robillard <http://drobilla.net>
 *
 * 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 URI Map extension <http://lv2plug.in/ns/ext/uri-map>.
 *
 * 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 <stdint.h>


/** Opaque pointer to host data. */
typedef void* LV2_URI_Map_Callback_Data;


/** The data field of the LV2_Feature for this extension.
 *
 * 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.
         * @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 means an ID for that URI could not
         * be created for whatever reason.  Extensions may define more precisely
         * what this means, but in general plugins should gracefully handle 0
         * and consider whatever they wanted the URI for "unsupported".
         */
        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 */