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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
/* LV2 OSC Messages Extension
* Copyright (C) 2007-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 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 <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
/** @file
* C header for the LV2 OSC extension <http://lv2plug.in/ns/ext/osc>.
* 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 */
|