Ardour  9.0-pre0-582-g084a23a80d
lv2_plugin.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2008-2016 David Robillard <d@drobilla.net>
3  * Copyright (C) 2008-2017 Paul Davis <paul@linuxaudiosystems.com>
4  * Copyright (C) 2009-2012 Carl Hetherington <carl@carlh.net>
5  * Copyright (C) 2012-2019 Robin Gareus <robin@gareus.org>
6  * Copyright (C) 2013 John Emmas <john@creativepost.co.uk>
7  * Copyright (C) 2017 Johannes Mueller <github@johannes-mueller.org>
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License along
20  * with this program; if not, write to the Free Software Foundation, Inc.,
21  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22  */
23 
24 #ifndef __ardour_lv2_plugin_h__
25 #define __ardour_lv2_plugin_h__
26 
27 #include <glibmm/threads.h>
28 #include <set>
29 #include <string>
30 #include <vector>
31 
32 #include "temporal/tempo.h"
33 
34 #include "ardour/plugin.h"
36 #include "ardour/uri_map.h"
37 #include "ardour/worker.h"
38 #include "pbd/ringbuffer.h"
39 
40 #ifdef LV2_EXTENDED // -> needs to eventually go upstream to lv2plug.in
41 #include "ardour/lv2_extensions.h"
42 #endif
43 
44 #ifndef PATH_MAX
45 #define PATH_MAX 1024
46 #endif
47 
48 
49 namespace ARDOUR {
50 
51 // a callback function for lilv_state_new_from_instance(). friend of LV2Plugin
52 // so we can pass an LV2Plugin* in user_data and access its private members.
53 const void* lv2plugin_get_port_value(const char* port_symbol,
54  void* user_data,
55  uint32_t* size,
56  uint32_t* type);
57 
58 class AudioEngine;
59 class Session;
60 struct LV2_Evbuf;
61 
63 {
64  public:
67  const void* c_plugin,
68  samplecnt_t sample_rate);
69  LV2Plugin (const LV2Plugin &);
71 
72  static bool force_state_save; // to be used only by session-state
73 
74  std::string unique_id () const;
75  const char* uri () const;
76  const char* label () const;
77  const char* name () const;
78  const char* maker () const;
79 
80  uint32_t num_ports () const;
81  uint32_t parameter_count () const;
82  float default_value (uint32_t port);
84  void set_parameter (uint32_t port, float val, sampleoffset_t);
85  float get_parameter (uint32_t port) const;
86  std::string get_docs() const;
87  std::string get_parameter_docs(uint32_t which) const;
88  int get_parameter_descriptor (uint32_t which, ParameterDescriptor&) const;
89  uint32_t nth_parameter (uint32_t port, bool& ok) const;
90 
91  IOPortDescription describe_io_port (DataType dt, bool input, uint32_t id) const;
92 
93  const void* extension_data (const char* uri) const;
94 
95 #ifdef LV2_EXTENDED
96  int setup_export (const char*, LV2_Options_Option const* options = NULL);
98  bool can_export () const { return _export_interface; }
99 #endif
100 
101  const void* c_plugin();
102  const void* c_ui();
103  const void* c_ui_type();
104 
105  bool is_external_ui () const;
106  bool is_external_kx () const;
107  bool ui_is_resizable () const;
108 
109  const char* port_symbol (uint32_t port) const;
110  uint32_t port_index (const char* symbol) const;
111 
112  const LV2_Feature* const* features () { return _features; }
113 
114  std::set<Evoral::Parameter> automatable () const;
115  virtual void set_automation_control (uint32_t, std::shared_ptr<AutomationControl>);
116 
117  void activate ();
118  void deactivate ();
119  void cleanup ();
120 
124 
126  samplepos_t start, samplepos_t end, double speed,
127  ChanMapping const& in, ChanMapping const& out,
128  pframes_t nframes, samplecnt_t offset);
129 
131  std::string state_node_name () const { return "lv2"; }
132 
133  bool parameter_is_audio (uint32_t) const;
134  bool parameter_is_control (uint32_t) const;
135  bool parameter_is_input (uint32_t) const;
136  bool parameter_is_output (uint32_t) const;
137  bool parameter_is_toggled (uint32_t) const;
138 
140 
141  std::shared_ptr<ScalePoints>
142  get_scale_points(uint32_t port_index) const;
143 
145  void set_state_dir (const std::string& d = "");
146 
147  int set_state (const XMLNode& node, int version);
149  std::string current_preset () const;
150 
151  bool has_editor () const;
152  bool has_message_output () const;
153 
154  void add_slave (std::shared_ptr<Plugin>, bool);
155  void remove_slave (std::shared_ptr<Plugin>);
156  void set_non_realtime (bool);
157 
158  bool write_from_ui(uint32_t index,
159  uint32_t protocol,
160  uint32_t size,
161  const uint8_t* body);
162 
163  typedef void UIMessageSink(void* controller,
164  uint32_t index,
165  uint32_t size,
166  uint32_t format,
167  const void* buffer);
168 
170  void emit_to_ui(void* controller, UIMessageSink sink);
171 
172  Worker* worker() { return _worker; }
173 
174  URIMap& uri_map() { return _uri_map; }
175  const URIMap& uri_map() const { return _uri_map; }
176 
177  int work(Worker& worker, uint32_t size, const void* data);
178  int work_response(uint32_t size, const void* data);
179 
180  void set_property(uint32_t key, const Variant& value);
181  const PropertyDescriptors& get_supported_properties() const { return _property_descriptors; }
182  const ParameterDescriptor& get_property_descriptor(uint32_t id) const;
183  Variant get_property_value (uint32_t) const;
185 
186  /* LV2 Option Options */
187  static void set_global_ui_background_color (uint32_t c) {
188  _ui_background_color = c;
189  }
190  static void set_global_ui_foreground_color (uint32_t c) {
191  _ui_foreground_color = c;
192  }
193  static void set_global_ui_contrasting_color (uint32_t c) {
194  _ui_contrasting_color = c;
195  }
196  static void set_global_ui_style_boxy (bool yn) {
197  _ui_style_boxy = yn ? 1 : 0;
198  }
199  static void set_global_ui_style_flat (bool yn) {
200  _ui_style_flat = yn ? 1 : 0;
201  }
202  static void set_main_window_id (unsigned long id) {
203  _ui_transient_win_id = id;
204  }
205 
206  private:
207  struct Impl;
208  Impl* _impl;
209  void* _module;
210  LV2_Feature** _features;
216  float* _shadow_data;
217  float* _defaults;
218  LV2_Evbuf** _ev_buffers;
219  LV2_Evbuf** _atom_ev_buffers;
226  double _current_bpm;
230  std::string _plugin_state_dir;
240 
241  friend const void* lv2plugin_get_port_value(const char* port_symbol,
242  void* user_data,
243  uint32_t* size,
244  uint32_t* type);
245 
246  typedef enum {
247  PORT_INPUT = 1,
248  PORT_OUTPUT = 1 << 1,
249  PORT_AUDIO = 1 << 2,
250  PORT_CONTROL = 1 << 3,
251  PORT_SEQUENCE = 1 << 5,
252  PORT_MIDI = 1 << 6,
253  PORT_POSITION = 1 << 7,
254  PORT_PATCHMSG = 1 << 8,
255  PORT_AUTOCTRL = 1 << 9,
256  PORT_CTRLED = 1 << 10,
257  PORT_CTRLER = 1 << 11,
258  PORT_NOAUTO = 1 << 12,
259  PORT_OTHOPT = 1 << 13
260  } PortFlag;
261 
262  typedef unsigned PortFlags;
263 
264  std::vector<PortFlags> _port_flags;
265  std::vector<size_t> _port_minimumSize;
266  std::map<std::string,uint32_t> _port_indices;
267 
268  std::map<uint32_t, Variant> _property_values;
269 
271 
272  struct AutomationCtrl {
274  : ac (other.ac)
275  , guard (other.guard)
276  { }
277 
278  AutomationCtrl (std::shared_ptr<ARDOUR::AutomationControl> c)
279  : ac (c)
280  , guard (false)
281  { }
282  std::shared_ptr<ARDOUR::AutomationControl> ac;
283  bool guard;
284  };
285 
286  typedef std::shared_ptr<AutomationCtrl> AutomationCtrlPtr;
287  typedef std::map<uint32_t, AutomationCtrlPtr> AutomationCtrlMap;
290 
292  struct UIMessage {
293  uint32_t index;
294  uint32_t protocol;
295  uint32_t size;
296  };
297 
298  bool write_to_ui(uint32_t index,
299  uint32_t protocol,
300  uint32_t size,
301  const uint8_t* body);
302 
304  uint32_t index,
305  uint32_t protocol,
306  uint32_t size,
307  const uint8_t* body);
308 
309  // Created on demand so the space is only consumed if necessary
312 
313  Glib::Threads::Mutex _work_mutex;
314 
315  Glib::Threads::Mutex _slave_lock;
316  std::set<std::shared_ptr<LV2Plugin>> _slaves;
317 
318 #ifdef LV2_EXTENDED
321  static void bankpatch_notify (LV2_BankPatch_Handle, uint8_t, uint32_t, uint8_t);
322 
327 
328  uint32_t _bankpatch[16];
330  bool knows_bank_patch () { return seen_bankpatch; }
331  uint32_t bank_patch (uint8_t chn) {
332  assert (chn < 16);
333  if (chn > 15) return UINT32_MAX;
334  return _bankpatch[chn];
335  }
336 #endif
337 
338  typedef struct {
339  const void* (*extension_data) (const char* uri);
340  } LV2_DataAccess;
341 
343  LV2_Feature _data_access_feature;
345  LV2_Feature _make_path_feature;
346  LV2_Feature _log_feature;
348  LV2_Feature _options_feature;
349  LV2_Feature _def_state_feature;
351 #ifdef LV2_EXTENDED
352  LV2_Feature _queue_draw_feature;
353  LV2_Feature _midnam_feature;
354  LV2_Feature _bankpatch_feature;
355 #endif
356 
357  // Options passed to plugin
358  int32_t _seq_size;
359  static int32_t _ui_style_flat;
360  static int32_t _ui_style_boxy;
361  static uint32_t _ui_background_color;
362  static uint32_t _ui_foreground_color;
363  static uint32_t _ui_contrasting_color;
364  static unsigned long _ui_transient_win_id;
365 
366  mutable unsigned _state_version;
367 
370 
371  const std::string plugin_dir () const;
372  const std::string scratch_dir () const;
373  const std::string file_dir () const;
374  const std::string state_dir (unsigned num) const;
375 
376  static char* lv2_state_make_path (void* host_data,
377  const char* path);
378 
379  void init (const void* c_plugin, samplecnt_t rate);
381  void run (pframes_t nsamples, bool sync_work = false);
382 
384 
385 #ifdef LV2_EXTENDED
389 
390  bool has_midnam ();
391  bool read_midnam ();
392  std::string midnam_model ();
394 #endif
395 
397 
399  std::string do_save_preset (std::string);
400  void do_remove_preset (std::string);
401  void find_presets ();
402  void add_state (XMLNode *) const;
403 
405 };
406 
407 
408 class LIBARDOUR_API LV2PluginInfo : public PluginInfo , public std::enable_shared_from_this<ARDOUR::LV2PluginInfo> {
409 public:
410  LV2PluginInfo (const char* plugin_uri);
412 
413  static PluginInfoList* discover (std::function <void (std::string const&, PluginScanLogEntry::PluginScanResult, std::string const&, bool)> cb);
414 
416  std::vector<Plugin::PresetRecord> get_presets (bool user_only) const;
417 
418  bool is_instrument () const;
419  bool is_utility () const;
420  bool is_analyzer () const;
421 
422  char * _plugin_uri;
423 
424 private:
428 };
429 
430 typedef std::shared_ptr<LV2PluginInfo> LV2PluginInfoPtr;
431 
432 } // namespace ARDOUR
433 
434 #endif /* __ardour_lv2_plugin_h__ */
bool is_instrument() const
std::vector< Plugin::PresetRecord > get_presets(bool user_only) const
static PluginInfoList * discover(std::function< void(std::string const &, PluginScanLogEntry::PluginScanResult, std::string const &, bool)> cb)
bool is_analyzer() const
bool is_utility() const
PluginPtr load(Session &session)
LV2PluginInfo(const char *plugin_uri)
bool ui_is_resizable() const
LV2_Feature ** _features
Definition: lv2_plugin.h:210
LV2_Feature _log_feature
Definition: lv2_plugin.h:346
bool parameter_is_control(uint32_t) const
URIMap & _uri_map
Definition: lv2_plugin.h:234
bool parameter_is_audio(uint32_t) const
void set_state_dir(const std::string &d="")
int connect_and_run(BufferSet &bufs, samplepos_t start, samplepos_t end, double speed, ChanMapping const &in, ChanMapping const &out, pframes_t nframes, samplecnt_t offset)
LV2Plugin(const LV2Plugin &)
std::string midnam_model()
std::vector< size_t > _port_minimumSize
Definition: lv2_plugin.h:265
float * _bpm_control_port
Special input set by ardour.
Definition: lv2_plugin.h:220
const LV2_Feature *const * features()
Definition: lv2_plugin.h:112
const void * extension_data(const char *uri) const
const std::string scratch_dir() const
void load_supported_properties(PropertyDescriptors &descs)
void UIMessageSink(void *controller, uint32_t index, uint32_t size, uint32_t format, const void *buffer)
Definition: lv2_plugin.h:163
uint32_t designated_bypass_port()
const char * label() const
int set_block_size(pframes_t)
Plugin::Display_Image_Surface * render_inline_display(uint32_t, uint32_t)
const void * c_ui_type()
static int32_t _ui_style_boxy
Definition: lv2_plugin.h:360
LV2_Feature _options_feature
Definition: lv2_plugin.h:348
uint32_t port_index(const char *symbol) const
static uint32_t _ui_background_color
Definition: lv2_plugin.h:361
bool _has_state_interface
Definition: lv2_plugin.h:369
double _next_cycle_speed
Expected start sample of next run cycle.
Definition: lv2_plugin.h:224
std::map< uint32_t, AutomationCtrlPtr > AutomationCtrlMap
Definition: lv2_plugin.h:287
uint32_t _patch_port_in_index
Definition: lv2_plugin.h:232
int work(Worker &worker, uint32_t size, const void *data)
bool is_external_kx() const
void enable_ui_emission()
bool _no_sample_accurate_ctrl
Definition: lv2_plugin.h:235
const std::string state_dir(unsigned num) const
int work_response(uint32_t size, const void *data)
const std::string file_dir() const
float default_value(uint32_t port)
bool has_editor() const
void add_slave(std::shared_ptr< Plugin >, bool)
samplecnt_t _sample_rate
Definition: lv2_plugin.h:213
static unsigned long _ui_transient_win_id
Definition: lv2_plugin.h:364
PBD::RingBuffer< uint8_t > * _from_ui
Definition: lv2_plugin.h:311
LV2_Feature _data_access_feature
Definition: lv2_plugin.h:343
LV2_Feature _queue_draw_feature
Definition: lv2_plugin.h:352
bool load_preset(PresetRecord)
static void set_global_ui_contrasting_color(uint32_t c)
Definition: lv2_plugin.h:193
URIMap & uri_map()
Definition: lv2_plugin.h:174
bool _connect_all_audio_outputs
Definition: lv2_plugin.h:236
AutomationCtrlMap _ctrl_map
Definition: lv2_plugin.h:288
double _next_cycle_beat
Expected bar_beat of next run cycle.
Definition: lv2_plugin.h:225
void set_property(uint32_t key, const Variant &value)
bool parameter_is_output(uint32_t) const
int get_parameter_descriptor(uint32_t which, ParameterDescriptor &) const
std::string current_preset() const
const LV2_Inline_Display_Interface * _display_interface
Definition: lv2_plugin.h:324
std::map< uint32_t, Variant > _property_values
Definition: lv2_plugin.h:268
bool parameter_is_toggled(uint32_t) const
void init(const void *c_plugin, samplecnt_t rate)
Worker * _state_worker
Definition: lv2_plugin.h:212
bool parameter_is_input(uint32_t) const
std::string state_node_name() const
Definition: lv2_plugin.h:131
unsigned PortFlags
Definition: lv2_plugin.h:262
samplepos_t _next_cycle_start
Expected start sample of next run cycle.
Definition: lv2_plugin.h:223
bool write_from_ui(uint32_t index, uint32_t protocol, uint32_t size, const uint8_t *body)
uint32_t _patch_port_out_index
Definition: lv2_plugin.h:233
std::string get_parameter_docs(uint32_t which) const
std::shared_ptr< AutomationCtrl > AutomationCtrlPtr
Definition: lv2_plugin.h:286
const char * name() const
LV2_Evbuf ** _ev_buffers
Definition: lv2_plugin.h:218
PBD::RingBuffer< uint8_t > * _to_ui
Definition: lv2_plugin.h:310
std::string get_docs() const
static void bankpatch_notify(LV2_BankPatch_Handle, uint8_t, uint32_t, uint8_t)
const LV2_Export_Interface * _export_interface
Definition: lv2_plugin.h:326
const LV2_Midnam_Interface * _midname_interface
Definition: lv2_plugin.h:325
void announce_property_values()
static void midnam_update(LV2_Midnam_Handle)
const char * uri() const
LV2_Feature _def_state_feature
Definition: lv2_plugin.h:349
bool has_message_output() const
const char * port_symbol(uint32_t port) const
LV2_Feature _instance_access_feature
Definition: lv2_plugin.h:344
static uint32_t _ui_foreground_color
Definition: lv2_plugin.h:362
LV2Plugin(ARDOUR::AudioEngine &engine, ARDOUR::Session &session, const void *c_plugin, samplecnt_t sample_rate)
void run(pframes_t nsamples, bool sync_work=false)
std::string describe_parameter(Evoral::Parameter)
Variant get_property_value(uint32_t) const
static void set_global_ui_style_flat(bool yn)
Definition: lv2_plugin.h:199
samplecnt_t _current_latency
Definition: lv2_plugin.h:239
const ParameterDescriptor & get_property_descriptor(uint32_t id) const
float * _freewheel_control_port
Special input set by ardour.
Definition: lv2_plugin.h:221
LV2_Feature _make_path_feature
Definition: lv2_plugin.h:345
std::string _plugin_state_dir
Definition: lv2_plugin.h:230
static void set_global_ui_foreground_color(uint32_t c)
Definition: lv2_plugin.h:190
const std::string plugin_dir() const
Worker * worker()
Definition: lv2_plugin.h:172
const PropertyDescriptors & get_supported_properties() const
Definition: lv2_plugin.h:181
uint32_t parameter_count() const
static void set_global_ui_style_boxy(bool yn)
Definition: lv2_plugin.h:196
float * _shadow_data
Definition: lv2_plugin.h:216
std::set< Evoral::Parameter > automatable() const
static int32_t _ui_style_flat
Definition: lv2_plugin.h:359
void emit_to_ui(void *controller, UIMessageSink sink)
void remove_slave(std::shared_ptr< Plugin >)
static bool force_state_save
Definition: lv2_plugin.h:72
int set_state(const XMLNode &node, int version)
std::string unique_id() const
bool inline_display_in_gui()
float get_parameter(uint32_t port) const
void allocate_atom_event_buffers()
bool requires_fixed_sized_buffers() const
const void * c_ui()
bool is_external_ui() const
void do_remove_preset(std::string)
PBD::ID _insert_id
Definition: lv2_plugin.h:228
std::vector< PortFlags > _port_flags
Definition: lv2_plugin.h:264
const char * maker() const
unsigned _state_version
Definition: lv2_plugin.h:366
samplecnt_t max_latency() const
void set_insert_id(PBD::ID id)
static char * lv2_state_make_path(void *host_data, const char *path)
bool write_to(PBD::RingBuffer< uint8_t > *dest, uint32_t index, uint32_t protocol, uint32_t size, const uint8_t *body)
Glib::Threads::Mutex _slave_lock
Definition: lv2_plugin.h:315
std::set< std::shared_ptr< LV2Plugin > > _slaves
Definition: lv2_plugin.h:316
int setup_export(const char *, LV2_Options_Option const *options=NULL)
float * _latency_control_port
Special output set by ardour.
Definition: lv2_plugin.h:222
Glib::Threads::Mutex _work_mutex
Definition: lv2_plugin.h:313
LV2_Feature _bankpatch_feature
Definition: lv2_plugin.h:354
double _prev_time_scale
previous Port::speed_ratio
Definition: lv2_plugin.h:227
bool write_to_ui(uint32_t index, uint32_t protocol, uint32_t size, const uint8_t *body)
std::map< std::string, uint32_t > _port_indices
Definition: lv2_plugin.h:266
void set_parameter(uint32_t port, float val, sampleoffset_t)
bool knows_bank_patch()
Definition: lv2_plugin.h:330
uint32_t _bpm_control_port_index
Definition: lv2_plugin.h:231
static uint32_t _ui_contrasting_color
Definition: lv2_plugin.h:363
LV2_Feature _block_length_feature
Definition: lv2_plugin.h:350
float * _control_data
Definition: lv2_plugin.h:215
virtual void set_automation_control(uint32_t, std::shared_ptr< AutomationControl >)
Temporal::GridIterator grid_iterator
Definition: lv2_plugin.h:404
IOPortDescription describe_io_port(DataType dt, bool input, uint32_t id) const
uint32_t nth_parameter(uint32_t port, bool &ok) const
std::string do_save_preset(std::string)
static void set_main_window_id(unsigned long id)
Definition: lv2_plugin.h:202
LV2_Feature _work_schedule_feature
Definition: lv2_plugin.h:347
bool connect_all_audio_outputs() const
LV2_Evbuf ** _atom_ev_buffers
Definition: lv2_plugin.h:219
uint32_t bank_patch(uint8_t chn)
Definition: lv2_plugin.h:331
samplecnt_t plugin_latency() const
LV2_Feature _midnam_feature
Definition: lv2_plugin.h:353
void latency_compute_run()
bool has_inline_display()
AutomationCtrlPtr get_automation_control(uint32_t)
bool can_export() const
Definition: lv2_plugin.h:98
LV2_DataAccess _data_access_extension_data
Definition: lv2_plugin.h:342
friend const void * lv2plugin_get_port_value(const char *port_symbol, void *user_data, uint32_t *size, uint32_t *type)
samplecnt_t _max_latency
Definition: lv2_plugin.h:238
const void * c_plugin()
void add_state(XMLNode *) const
static void queue_draw(LV2_Inline_Display_Handle)
Worker * _worker
Definition: lv2_plugin.h:211
const URIMap & uri_map() const
Definition: lv2_plugin.h:175
PropertyDescriptors _property_descriptors
Definition: lv2_plugin.h:270
bool _can_write_automation
Definition: lv2_plugin.h:237
void set_non_realtime(bool)
static void set_global_ui_background_color(uint32_t c)
Definition: lv2_plugin.h:187
uint32_t num_ports() const
bool _inline_display_in_gui
Definition: lv2_plugin.h:323
std::shared_ptr< ScalePoints > get_scale_points(uint32_t port_index) const
std::map< uint32_t, ParameterDescriptor > PropertyDescriptors
Definition: plugin.h:340
Definition: id.h:34
Definition: xml++.h:114
void * LV2_BankPatch_Handle
void * LV2_Inline_Display_Handle
void * LV2_Midnam_Handle
#define LIBARDOUR_API
void session(lua_State *L)
PBD::PropertyDescriptor< timepos_t > start
uint32_t pframes_t
std::list< PluginInfoPtr > PluginInfoList
Definition: plugin.h:66
std::shared_ptr< LV2PluginInfo > LV2PluginInfoPtr
Definition: lv2_plugin.h:430
std::shared_ptr< Plugin > PluginPtr
Definition: plugin.h:62
Temporal::samplecnt_t samplecnt_t
const void * lv2plugin_get_port_value(const char *port_symbol, void *user_data, uint32_t *size, uint32_t *type)
Temporal::sampleoffset_t sampleoffset_t
Temporal::samplepos_t samplepos_t
std::shared_ptr< ARDOUR::AutomationControl > ac
Definition: lv2_plugin.h:282
AutomationCtrl(const AutomationCtrl &other)
Definition: lv2_plugin.h:273
AutomationCtrl(std::shared_ptr< ARDOUR::AutomationControl > c)
Definition: lv2_plugin.h:278
Message send to/from UI via ports.
Definition: lv2_plugin.h:292