-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlight_sampler_uris.h
More file actions
125 lines (108 loc) · 4.14 KB
/
Copy pathlight_sampler_uris.h
File metadata and controls
125 lines (108 loc) · 4.14 KB
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
120
121
122
123
124
125
#ifndef LIGHT_SAMPLER_URIS_H
#define LIGHT_SAMPLER_URIS_H
#include "lv2/atom/atom.h"
#include "lv2/atom/forge.h"
#include "lv2/atom/util.h"
#include "lv2/midi/midi.h"
#include "lv2/parameters/parameters.h"
#include "lv2/patch/patch.h"
#include "lv2/urid/urid.h"
#include <stdint.h>
#include <stdio.h>
#define LIGHT_SAMPLER_URI "urn:simdott:light_sampler"
#define LIGHT_SAMPLER__applySample LIGHT_SAMPLER_URI "#applySample"
#define LIGHT_SAMPLER__freeSample LIGHT_SAMPLER_URI "#freeSample"
#define LIGHT_SAMPLER__sample LIGHT_SAMPLER_URI "#sample"
typedef struct {
LV2_URID atom_Float;
LV2_URID atom_Path;
LV2_URID atom_Resource;
LV2_URID atom_Sequence;
LV2_URID atom_URID;
LV2_URID atom_eventTransfer;
LV2_URID ls_applySample;
LV2_URID ls_freeSample;
LV2_URID ls_sample;
LV2_URID midi_Event;
LV2_URID param_gain;
LV2_URID patch_Get;
LV2_URID patch_Set;
LV2_URID patch_accept;
LV2_URID patch_property;
LV2_URID patch_value;
} LightSamplerURIs;
static inline void
map_light_sampler_uris(LV2_URID_Map* map, LightSamplerURIs* uris)
{
uris->atom_Float = map->map(map->handle, LV2_ATOM__Float);
uris->atom_Path = map->map(map->handle, LV2_ATOM__Path);
uris->atom_Resource = map->map(map->handle, LV2_ATOM__Resource);
uris->atom_Sequence = map->map(map->handle, LV2_ATOM__Sequence);
uris->atom_URID = map->map(map->handle, LV2_ATOM__URID);
uris->atom_eventTransfer = map->map(map->handle, LV2_ATOM__eventTransfer);
uris->ls_applySample = map->map(map->handle, LIGHT_SAMPLER__applySample);
uris->ls_freeSample = map->map(map->handle, LIGHT_SAMPLER__freeSample);
uris->ls_sample = map->map(map->handle, LIGHT_SAMPLER__sample);
uris->midi_Event = map->map(map->handle, LV2_MIDI__MidiEvent);
uris->param_gain = map->map(map->handle, LV2_PARAMETERS__gain);
uris->patch_Get = map->map(map->handle, LV2_PATCH__Get);
uris->patch_Set = map->map(map->handle, LV2_PATCH__Set);
uris->patch_accept = map->map(map->handle, LV2_PATCH__accept);
uris->patch_property = map->map(map->handle, LV2_PATCH__property);
uris->patch_value = map->map(map->handle, LV2_PATCH__value);
}
static inline LV2_Atom_Forge_Ref
write_set_gain(LV2_Atom_Forge* forge, const LightSamplerURIs* uris, const float gain)
{
LV2_Atom_Forge_Frame frame;
LV2_Atom_Forge_Ref set =
lv2_atom_forge_object(forge, &frame, 0, uris->patch_Set);
lv2_atom_forge_key(forge, uris->patch_property);
lv2_atom_forge_urid(forge, uris->param_gain);
lv2_atom_forge_key(forge, uris->patch_value);
lv2_atom_forge_float(forge, gain);
lv2_atom_forge_pop(forge, &frame);
return set;
}
static inline LV2_Atom_Forge_Ref
write_set_file(LV2_Atom_Forge* forge,
const LightSamplerURIs* uris,
const char* filename,
const uint32_t filename_len)
{
LV2_Atom_Forge_Frame frame;
LV2_Atom_Forge_Ref set =
lv2_atom_forge_object(forge, &frame, 0, uris->patch_Set);
lv2_atom_forge_key(forge, uris->patch_property);
lv2_atom_forge_urid(forge, uris->ls_sample);
lv2_atom_forge_key(forge, uris->patch_value);
lv2_atom_forge_path(forge, filename, filename_len);
lv2_atom_forge_pop(forge, &frame);
return set;
}
static inline const char*
read_set_file(const LightSamplerURIs* uris, const LV2_Atom_Object* obj)
{
if (obj->body.otype != uris->patch_Set) {
fprintf(stderr, "Ignoring unknown message type %u\n", obj->body.otype);
return NULL;
}
const LV2_Atom* property = NULL;
lv2_atom_object_get(obj, uris->patch_property, &property, 0);
if (!property || property->type != uris->atom_URID) {
fprintf(stderr, "Malformed set message\n");
return NULL;
}
if (((const LV2_Atom_URID*)property)->body != uris->ls_sample) {
fprintf(stderr, "Set message for unknown property\n");
return NULL;
}
const LV2_Atom* value = NULL;
lv2_atom_object_get(obj, uris->patch_value, &value, 0);
if (!value || value->type != uris->atom_Path) {
fprintf(stderr, "Set message value is not a Path\n");
return NULL;
}
return (const char*)LV2_ATOM_BODY_CONST(value);
}
#endif /* LIGHT_SAMPLER_URIS_H */