LMMS
Loading...
Searching...
No Matches
lv2wrap.h
Go to the documentation of this file.
1/* Calf DSP Library
2 * LV2 wrapper templates
3 *
4 * Copyright (C) 2001-2015 Krzysztof Foltman
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General
17 * Public License along with this program; if not, write to the
18 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19 * Boston, MA 02111-1307, USA.
20 */
21#ifndef CALF_LV2WRAP_H
22#define CALF_LV2WRAP_H
23
24#if USE_LV2
25
26#include <string>
27#include <vector>
28#include "lv2/lv2plug.in/ns/lv2core/lv2.h"
29#include <calf/giface.h>
30#include <calf/lv2_atom.h>
31#include <calf/lv2_atom_util.h>
32#include <calf/lv2_midi.h>
33#include <calf/lv2_state.h>
34#include <calf/lv2_options.h>
35#include <calf/lv2_progress.h>
36#include <calf/lv2_urid.h>
37#include <string.h>
38
39namespace calf_plugins {
40
41struct lv2_instance: public plugin_ctl_iface, public progress_report_iface
42{
43 const plugin_metadata_iface *metadata;
44 audio_module_iface *module;
45 bool set_srate;
46 int srate_to_set;
47 LV2_Atom_Sequence *event_in_data, *event_out_data;
48 uint32_t event_out_capacity;
50 uint32_t midi_event_type, property_type, string_type, sequence_type;
51 LV2_Progress *progress_report_feature;
52 LV2_Options_Interface *options_feature;
53 float **ins, **outs, **params;
54 int in_count;
55 int out_count;
56 int real_param_count;
57 struct lv2_var
58 {
59 std::string name;
60 uint32_t mapped_uri;
61 };
62 std::vector<lv2_var> vars;
63 std::map<uint32_t, int> uri_to_var;
64
65 lv2_instance(audio_module_iface *_module);
66 void lv2_instantiate(const LV2_Descriptor * Descriptor, double sample_rate, const char *bundle_path, const LV2_Feature *const *features);
67
69 void post_instantiate();
70
71 virtual bool activate_preset(int bank, int program) {
72 return false;
73 }
74 virtual float get_level(unsigned int port) { return 0.f; }
75 virtual void execute(int cmd_no) {
76 module->execute(cmd_no);
77 }
78 virtual void report_progress(float percentage, const std::string &message) {
79 if (progress_report_feature)
80 (*progress_report_feature->progress)(progress_report_feature->context, percentage, !message.empty() ? message.c_str() : NULL);
81 }
82 void send_configures(send_configure_iface *sci) {
83 module->send_configures(sci);
84 }
86 uint32_t flags, const LV2_Feature *const * features);
87 void impl_restore(LV2_State_Retrieve_Function retrieve, void *callback_data);
88 char *configure(const char *key, const char *value) {
89 // disambiguation - the plugin_ctl_iface version is just a stub, so don't use it
90 return module->configure(key, value);
91 }
92 /* Loosely based on David Robillard's lv2_atom_sequence_append_event */
93 inline void* add_event_to_seq(uint64_t time_frames, uint32_t type, uint32_t data_size)
94 {
95 uint32_t remaining = event_out_capacity - event_out_data->atom.size;
96 uint32_t hdr_size = sizeof(LV2_Atom_Event);
97 if (remaining < sizeof(LV2_Atom_Event) + data_size)
98 return NULL;
99 LV2_Atom_Event *event = lv2_atom_sequence_end(&event_out_data->body, event_out_data->atom.size);
100 event->time.frames = time_frames;
101 event->body.type = type;
102 event->body.size = data_size;
103 event_out_data->atom.size += lv2_atom_pad_size(hdr_size + data_size);
104 return ((uint8_t *)event) + hdr_size;
105 }
106 void output_event_string(const char *str, int len = -1);
107 void output_event_property(const char *key, const char *value);
108 void process_event_string(const char *str);
109 void process_event_property(const LV2_Atom_Property *prop);
110 void process_events(uint32_t &offset);
111 void run(uint32_t SampleCount, bool has_simulate_stereo_input_flag);
112 virtual float get_param_value(int param_no)
113 {
114 // XXXKF hack
115 if (param_no >= real_param_count)
116 return 0;
117 return (*params)[param_no];
118 }
119 virtual void set_param_value(int param_no, float value)
120 {
121 // XXXKF hack
122 if (param_no >= real_param_count)
123 return;
124 *params[param_no] = value;
125 }
126 virtual const plugin_metadata_iface *get_metadata_iface() const { return metadata; }
127 virtual const line_graph_iface *get_line_graph_iface() const { return module->get_line_graph_iface(); }
128 virtual const phase_graph_iface *get_phase_graph_iface() const { return module->get_phase_graph_iface(); }
129 virtual int send_status_updates(send_updates_iface *sui, int last_serial) { return module->send_status_updates(sui, last_serial); }
130};
131
132struct LV2_Calf_Descriptor {
133 plugin_ctl_iface *(*get_pci)(LV2_Handle Instance);
134};
135
136struct store_lv2_state: public send_configure_iface
137{
139 void *callback_data;
140 lv2_instance *inst;
141 uint32_t string_data_type;
142
143 virtual void send_configure(const char *key, const char *value);
144};
145
146
147template<class Module>
148struct lv2_wrapper
149{
150 typedef lv2_instance instance;
152 static LV2_Calf_Descriptor calf_descriptor;
153 static LV2_State_Interface state_iface;
154 std::string uri;
155
156 lv2_wrapper()
157 {
158 ladspa_plugin_info &info = Module::plugin_info;
159 uri = "http://calf.sourceforge.net/plugins/" + std::string(info.label);
160 descriptor.URI = uri.c_str();
161 descriptor.instantiate = cb_instantiate;
162 descriptor.connect_port = cb_connect;
163 descriptor.activate = cb_activate;
164 descriptor.run = cb_run;
165 descriptor.deactivate = cb_deactivate;
166 descriptor.cleanup = cb_cleanup;
167 descriptor.extension_data = cb_ext_data;
168 state_iface.save = cb_state_save;
169 state_iface.restore = cb_state_restore;
170 calf_descriptor.get_pci = cb_get_pci;
171 }
172
173 static void cb_connect(LV2_Handle Instance, uint32_t port, void *DataLocation)
174 {
175 instance *const mod = (instance *)Instance;
176 const plugin_metadata_iface *md = mod->metadata;
177 unsigned long ins = md->get_input_count();
178 unsigned long outs = md->get_output_count();
179 unsigned long params = md->get_param_count();
180 bool has_event_in = md->get_midi() || md->sends_live_updates();
181 bool has_event_out = md->sends_live_updates();
182
183 if (port < ins)
184 mod->ins[port] = (float *)DataLocation;
185 else if (port < ins + outs)
186 mod->outs[port - ins] = (float *)DataLocation;
187 else if (port < ins + outs + params) {
188 int i = port - ins - outs;
189 mod->params[i] = (float *)DataLocation;
190 }
191 else if (has_event_in && port == ins + outs + params) {
192 mod->event_in_data = (LV2_Atom_Sequence *)DataLocation;
193 }
194 else if (has_event_out && port == ins + outs + params + (has_event_in ? 1 : 0)) {
195 mod->event_out_data = (LV2_Atom_Sequence *)DataLocation;
196 }
197 }
198
199 static void cb_activate(LV2_Handle Instance)
200 {
201 instance *const mod = (instance *)Instance;
202 mod->set_srate = true;
203 }
204
205 static void cb_deactivate(LV2_Handle Instance)
206 {
207 instance *const mod = (instance *)Instance;
208 mod->module->deactivate();
209 }
210
211 static LV2_Handle cb_instantiate(const LV2_Descriptor * Descriptor, double sample_rate, const char *bundle_path, const LV2_Feature *const *features)
212 {
213 instance *mod = new instance(new Module);
214 mod->lv2_instantiate(Descriptor, sample_rate, bundle_path, features);
215 return mod;
216 }
217 static plugin_ctl_iface *cb_get_pci(LV2_Handle Instance)
218 {
219 return static_cast<plugin_ctl_iface *>(Instance);
220 }
221
222 static void cb_run(LV2_Handle Instance, uint32_t SampleCount)
223 {
224 instance *const inst = (instance *)Instance;
225 inst->run(SampleCount, Module::simulate_stereo_input);
226 }
227 static void cb_cleanup(LV2_Handle Instance)
228 {
229 instance *const mod = (instance *)Instance;
230 delete mod->module;
231 delete mod;
232 }
233
234 static const void *cb_ext_data(const char *URI)
235 {
236 if (!strcmp(URI, "http://foltman.com/ns/calf-plugin-instance"))
237 return &calf_descriptor;
238 if (!strcmp(URI, LV2_STATE__interface))
239 return &state_iface;
240 return NULL;
241 }
242 static LV2_State_Status cb_state_save(
244 uint32_t flags, const LV2_Feature *const * features)
245 {
246 instance *const inst = (instance *)Instance;
247 return inst->state_save(store, handle, flags, features);
248 }
249 static LV2_State_Status cb_state_restore(
250 LV2_Handle Instance, LV2_State_Retrieve_Function retrieve, LV2_State_Handle callback_data,
251 uint32_t flags, const LV2_Feature *const * features)
252 {
253 instance *const inst = (instance *)Instance;
254 inst->impl_restore(retrieve, callback_data);
255 return LV2_STATE_SUCCESS;
256 }
257
258 static lv2_wrapper &get() {
259 static lv2_wrapper instance;
260 return instance;
261 }
262};
263
264};
265
266#endif
267#endif
#define NULL
Definition CarlaBridgeFormat.cpp:30
static LV2_Handle lv2_instantiate(const LV2_Descriptor *lv2Descriptor, double sampleRate, const char *bundlePath, const LV2_Feature *const *features)
Definition CarlaBridgeSingleLV2.cpp:565
CAdPlugDatabase::CRecord::RecordType type
Definition adplugdb.cpp:93
static void message(int level, const char *fmt,...)
Definition adplugdb.cpp:120
static const LV2_Descriptor descriptor
Definition bindings_test_plugin.c:165
static void run(LV2_Handle instance, uint32_t n_samples)
Definition bindings_test_plugin.c:112
unsigned md
Definition inflate.c:944
register unsigned i
Definition inflate.c:1575
static PuglViewHint int value
Definition pugl.h:1708
static const char * name
Definition pugl.h:1582
void * LV2_Handle
Definition lv2.h:133
struct _LV2_Descriptor LV2_Descriptor
struct _LV2_Feature LV2_Feature
struct _LV2_Options_Interface LV2_Options_Interface
void * LV2_State_Handle
Opaque handle for state save/restore.
Definition state.h:54
#define LV2_STATE__interface
http://lv2plug.in/ns/ext/state#interface
Definition state.h:41
LV2_State_Status(* LV2_State_Store_Function)(LV2_State_Handle handle, uint32_t key, const void *value, size_t size, uint32_t type, uint32_t flags)
Definition state.h:147
const void *(* LV2_State_Retrieve_Function)(LV2_State_Handle handle, uint32_t key, size_t *size, uint32_t *type, uint32_t *flags)
Definition state.h:173
LV2_State_Status
Definition state.h:104
@ LV2_STATE_SUCCESS
Definition state.h:105
struct _LV2_URID_Map LV2_URID_Map
static uint32_t lv2_atom_pad_size(uint32_t size)
Definition atom-util.h:48
static const LV2_Atom_Event * lv2_atom_sequence_end(const LV2_Atom_Sequence_Body *body, uint32_t size)
Definition atom-util.h:90
struct backing_store_struct * info
Definition jmemsys.h:183
static SordNode * uri(SordWorld *world, int num)
Definition sord_test.c:47
#define URI(prefix, suffix)
LV2 progress notification extension definition.
struct _LV2_Progress LV2_Progress
host feature structure
struct _LV2_State_Interface LV2_State_Interface
static LilvNode * urid_map
Definition lv2bench.c:37
unsigned int uint32_t
Definition mid.cpp:100
unsigned char uint8_t
Definition mid.cpp:98
Definition benchmark.cpp:53
auto & get(ProcessorChain< Processors... > &chain) noexcept
Definition juce_ProcessorChain.h:133
jack_client_t client jack_client_t client jack_client_t client jack_client_t JackInfoShutdownCallback void arg jack_client_t jack_port_t * port
Definition juce_linux_JackAudio.cpp:65
Instrument * ins
Definition HydrogenImport.cpp:138
void * context
Definition lv2_progress.h:63
void(* progress)(void *context, float progress, const char *message)
Definition lv2_progress.h:75
LV2_Atom atom
Definition atom.h:244
LV2_Atom_Sequence_Body body
Definition atom.h:245
uint32_t size
Definition atom.h:107
plugin_ctl_iface *(* get_pci)(LV2_Handle Instance)
Definition lv2gui.cpp:39
void(* deactivate)(LV2_Handle instance)
Definition lv2.h:324
const char * URI
Definition lv2.h:188
void(* run)(LV2_Handle instance, uint32_t sample_count)
Definition lv2.h:304
void(* connect_port)(LV2_Handle instance, uint32_t port, void *data_location)
Definition lv2.h:256
void(* cleanup)(LV2_Handle instance)
Definition lv2.h:337
LV2_Handle(* instantiate)(const struct LV2_Descriptor *descriptor, double sample_rate, const char *bundle_path, const LV2_Feature *const *features)
Definition lv2.h:217
void(* activate)(LV2_Handle instance)
Definition lv2.h:279
const void *(* extension_data)(const char *uri)
Definition lv2.h:352
LV2_State_Status(* restore)(LV2_Handle instance, LV2_State_Retrieve_Function retrieve, LV2_State_Handle handle, uint32_t flags, const LV2_Feature *const *features)
Definition state.h:266
LV2_State_Status(* save)(LV2_Handle instance, LV2_State_Store_Function store, LV2_State_Handle handle, uint32_t flags, const LV2_Feature *const *features)
Definition state.h:235
Interface for host-GUI-plugin interaction (should be really split in two, but ... meh).
Definition giface.h:389
'may receive configure variables' interface
Definition giface.h:291
ZCONST char * key
Definition crypt.c:587