Ardour  9.0-pre0-1851-g4ef4288b2a
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:
66  ARDOUR::Session& session,
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 (bool readonly) const {
182  return readonly ? _ro_property_descriptors : _property_descriptors;
183  }
184  const ParameterDescriptor& get_property_descriptor(uint32_t id) const;
185  Variant get_property_value (uint32_t) const;
187 
188  /* LV2 Option Options */
189  static void set_global_ui_background_color (uint32_t c) {
190  _ui_background_color = c;
191  }
192  static void set_global_ui_foreground_color (uint32_t c) {
193  _ui_foreground_color = c;
194  }
195  static void set_global_ui_contrasting_color (uint32_t c) {
196  _ui_contrasting_color = c;
197  }
198  static void set_global_ui_style_boxy (bool yn) {
199  _ui_style_boxy = yn ? 1 : 0;
200  }
201  static void set_global_ui_style_flat (bool yn) {
202  _ui_style_flat = yn ? 1 : 0;
203  }
204  static void set_main_window_id (unsigned long id) {
205  _ui_transient_win_id = id;
206  }
207 
208  private:
209  struct Impl;
210  Impl* _impl;
211  void* _module;
212  LV2_Feature** _features;
218  float* _shadow_data;
219  float* _defaults;
220  LV2_Evbuf** _ev_buffers;
221  LV2_Evbuf** _atom_ev_buffers;
228  double _current_bpm;
232  std::string _plugin_state_dir;
242 
243  friend const void* lv2plugin_get_port_value(const char* port_symbol,
244  void* user_data,
245  uint32_t* size,
246  uint32_t* type);
247 
248  typedef enum {
249  PORT_INPUT = 1,
250  PORT_OUTPUT = 1 << 1,
251  PORT_AUDIO = 1 << 2,
252  PORT_CONTROL = 1 << 3,
253  PORT_SEQUENCE = 1 << 5,
254  PORT_MIDI = 1 << 6,
255  PORT_POSITION = 1 << 7,
256  PORT_PATCHMSG = 1 << 8,
257  PORT_AUTOCTRL = 1 << 9,
258  PORT_CTRLED = 1 << 10,
259  PORT_CTRLER = 1 << 11,
260  PORT_NOAUTO = 1 << 12,
261  PORT_OTHOPT = 1 << 13
262  } PortFlag;
263 
264  typedef unsigned PortFlags;
265 
266  std::vector<PortFlags> _port_flags;
267  std::vector<size_t> _port_minimumSize;
268  std::map<std::string,uint32_t> _port_indices;
269 
270  std::map<uint32_t, Variant> _property_values;
271 
274 
275  struct AutomationCtrl {
277  : ac (other.ac)
278  , guard (other.guard)
279  { }
280 
281  AutomationCtrl (std::shared_ptr<ARDOUR::AutomationControl> c)
282  : ac (c)
283  , guard (false)
284  { }
285  std::shared_ptr<ARDOUR::AutomationControl> ac;
286  bool guard;
287  };
288 
289  typedef std::shared_ptr<AutomationCtrl> AutomationCtrlPtr;
290  typedef std::map<uint32_t, AutomationCtrlPtr> AutomationCtrlMap;
293 
295  struct UIMessage {
296  uint32_t index;
297  uint32_t protocol;
298  uint32_t size;
299  };
300 
301  bool write_to_ui(uint32_t index,
302  uint32_t protocol,
303  uint32_t size,
304  const uint8_t* body);
305 
307  uint32_t index,
308  uint32_t protocol,
309  uint32_t size,
310  const uint8_t* body);
311 
312  // Created on demand so the space is only consumed if necessary
315 
316  Glib::Threads::Mutex _work_mutex;
317 
318  Glib::Threads::Mutex _slave_lock;
319  std::set<std::shared_ptr<LV2Plugin>> _slaves;
320 
321 #ifdef LV2_EXTENDED
324  static void bankpatch_notify (LV2_BankPatch_Handle, uint8_t, uint32_t, uint8_t);
325 
330 
331  uint32_t _bankpatch[16];
333  bool knows_bank_patch () { return seen_bankpatch; }
334  uint32_t bank_patch (uint8_t chn) {
335  assert (chn < 16);
336  if (chn > 15) return UINT32_MAX;
337  return _bankpatch[chn];
338  }
339 #endif
340 
341  typedef struct {
342  const void* (*extension_data) (const char* uri);
343  } LV2_DataAccess;
344 
346  LV2_Feature _data_access_feature;
348  LV2_Feature _make_path_feature;
349  LV2_Feature _log_feature;
351  LV2_Feature _options_feature;
352  LV2_Feature _def_state_feature;
354 #ifdef LV2_EXTENDED
355  LV2_Feature _queue_draw_feature;
356  LV2_Feature _midnam_feature;
357  LV2_Feature _bankpatch_feature;
358 #endif
359 
360  // Options passed to plugin
361  int32_t _seq_size;
362  static int32_t _ui_style_flat;
363  static int32_t _ui_style_boxy;
364  static uint32_t _ui_background_color;
365  static uint32_t _ui_foreground_color;
366  static uint32_t _ui_contrasting_color;
367  static unsigned long _ui_transient_win_id;
368  static float _ui_update_hz;
369 
370  mutable unsigned _state_version;
371 
374 
375  const std::string plugin_dir () const;
376  const std::string scratch_dir () const;
377  const std::string file_dir () const;
378  const std::string state_dir (unsigned num) const;
379 
380  static char* lv2_state_make_path (void* host_data,
381  const char* path);
382 
383  void init (const void* c_plugin, samplecnt_t rate);
385  void run (pframes_t nsamples, bool sync_work = false);
386 
387  void load_supported_properties(PropertyDescriptors& descs, bool writable);
388 
389 #ifdef LV2_EXTENDED
393 
394  bool has_midnam ();
395  bool read_midnam ();
396  std::string midnam_model ();
398 #endif
399 
401 
403  std::string do_save_preset (std::string);
404  void do_remove_preset (std::string);
405  void find_presets ();
406  void add_state (XMLNode *) const;
407 
409 };
410 
411 
412 class LIBARDOUR_API LV2PluginInfo : public PluginInfo , public std::enable_shared_from_this<ARDOUR::LV2PluginInfo> {
413 public:
414  LV2PluginInfo (const char* plugin_uri);
416 
417  static PluginInfoList* discover (std::function <void (std::string const&, PluginScanLogEntry::PluginScanResult, std::string const&, bool)> cb);
418 
419  PluginPtr load (Session& session);
420  std::vector<Plugin::PresetRecord> get_presets (bool user_only) const;
421 
422  bool is_instrument () const;
423  bool is_utility () const;
424  bool is_analyzer () const;
425 
426  char * _plugin_uri;
427 
428 private:
432 };
433 
434 typedef std::shared_ptr<LV2PluginInfo> LV2PluginInfoPtr;
435 
436 } // namespace ARDOUR
437 
438 #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:212
LV2_Feature _log_feature
Definition: lv2_plugin.h:349
bool parameter_is_control(uint32_t) const
URIMap & _uri_map
Definition: lv2_plugin.h:236
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:267
float * _bpm_control_port
Special input set by ardour.
Definition: lv2_plugin.h:222
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 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:363
LV2_Feature _options_feature
Definition: lv2_plugin.h:351
uint32_t port_index(const char *symbol) const
static uint32_t _ui_background_color
Definition: lv2_plugin.h:364
bool _has_state_interface
Definition: lv2_plugin.h:373
double _next_cycle_speed
Expected start sample of next run cycle.
Definition: lv2_plugin.h:226
std::map< uint32_t, AutomationCtrlPtr > AutomationCtrlMap
Definition: lv2_plugin.h:290
uint32_t _patch_port_in_index
Definition: lv2_plugin.h:234
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:237
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:215
static unsigned long _ui_transient_win_id
Definition: lv2_plugin.h:367
PBD::RingBuffer< uint8_t > * _from_ui
Definition: lv2_plugin.h:314
LV2_Feature _data_access_feature
Definition: lv2_plugin.h:346
LV2_Feature _queue_draw_feature
Definition: lv2_plugin.h:355
bool load_preset(PresetRecord)
static void set_global_ui_contrasting_color(uint32_t c)
Definition: lv2_plugin.h:195
URIMap & uri_map()
Definition: lv2_plugin.h:174
bool _connect_all_audio_outputs
Definition: lv2_plugin.h:238
AutomationCtrlMap _ctrl_map
Definition: lv2_plugin.h:291
void load_supported_properties(PropertyDescriptors &descs, bool writable)
double _next_cycle_beat
Expected bar_beat of next run cycle.
Definition: lv2_plugin.h:227
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:327
std::map< uint32_t, Variant > _property_values
Definition: lv2_plugin.h:270
bool parameter_is_toggled(uint32_t) const
void init(const void *c_plugin, samplecnt_t rate)
Worker * _state_worker
Definition: lv2_plugin.h:214
bool parameter_is_input(uint32_t) const
std::string state_node_name() const
Definition: lv2_plugin.h:131
unsigned PortFlags
Definition: lv2_plugin.h:264
samplepos_t _next_cycle_start
Expected start sample of next run cycle.
Definition: lv2_plugin.h:225
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:235
std::string get_parameter_docs(uint32_t which) const
std::shared_ptr< AutomationCtrl > AutomationCtrlPtr
Definition: lv2_plugin.h:289
const char * name() const
LV2_Evbuf ** _ev_buffers
Definition: lv2_plugin.h:220
PBD::RingBuffer< uint8_t > * _to_ui
Definition: lv2_plugin.h:313
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:329
const LV2_Midnam_Interface * _midname_interface
Definition: lv2_plugin.h:328
void announce_property_values()
static void midnam_update(LV2_Midnam_Handle)
const char * uri() const
LV2_Feature _def_state_feature
Definition: lv2_plugin.h:352
bool has_message_output() const
const char * port_symbol(uint32_t port) const
LV2_Feature _instance_access_feature
Definition: lv2_plugin.h:347
static uint32_t _ui_foreground_color
Definition: lv2_plugin.h:365
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:201
samplecnt_t _current_latency
Definition: lv2_plugin.h:241
const ParameterDescriptor & get_property_descriptor(uint32_t id) const
float * _freewheel_control_port
Special input set by ardour.
Definition: lv2_plugin.h:223
LV2_Feature _make_path_feature
Definition: lv2_plugin.h:348
std::string _plugin_state_dir
Definition: lv2_plugin.h:232
static void set_global_ui_foreground_color(uint32_t c)
Definition: lv2_plugin.h:192
const std::string plugin_dir() const
Worker * worker()
Definition: lv2_plugin.h:172
uint32_t parameter_count() const
static void set_global_ui_style_boxy(bool yn)
Definition: lv2_plugin.h:198
float * _shadow_data
Definition: lv2_plugin.h:218
std::set< Evoral::Parameter > automatable() const
static float _ui_update_hz
Definition: lv2_plugin.h:368
static int32_t _ui_style_flat
Definition: lv2_plugin.h:362
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:230
std::vector< PortFlags > _port_flags
Definition: lv2_plugin.h:266
const char * maker() const
unsigned _state_version
Definition: lv2_plugin.h:370
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:318
std::set< std::shared_ptr< LV2Plugin > > _slaves
Definition: lv2_plugin.h:319
int setup_export(const char *, LV2_Options_Option const *options=NULL)
float * _latency_control_port
Special output set by ardour.
Definition: lv2_plugin.h:224
PropertyDescriptors _ro_property_descriptors
Definition: lv2_plugin.h:273
Glib::Threads::Mutex _work_mutex
Definition: lv2_plugin.h:316
LV2_Feature _bankpatch_feature
Definition: lv2_plugin.h:357
double _prev_time_scale
previous Port::speed_ratio
Definition: lv2_plugin.h:229
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:268
void set_parameter(uint32_t port, float val, sampleoffset_t)
bool knows_bank_patch()
Definition: lv2_plugin.h:333
uint32_t _bpm_control_port_index
Definition: lv2_plugin.h:233
static uint32_t _ui_contrasting_color
Definition: lv2_plugin.h:366
LV2_Feature _block_length_feature
Definition: lv2_plugin.h:353
float * _control_data
Definition: lv2_plugin.h:217
virtual void set_automation_control(uint32_t, std::shared_ptr< AutomationControl >)
Temporal::GridIterator grid_iterator
Definition: lv2_plugin.h:408
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:204
LV2_Feature _work_schedule_feature
Definition: lv2_plugin.h:350
bool connect_all_audio_outputs() const
LV2_Evbuf ** _atom_ev_buffers
Definition: lv2_plugin.h:221
uint32_t bank_patch(uint8_t chn)
Definition: lv2_plugin.h:334
samplecnt_t plugin_latency() const
LV2_Feature _midnam_feature
Definition: lv2_plugin.h:356
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:345
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:240
const void * c_plugin()
void add_state(XMLNode *) const
static void queue_draw(LV2_Inline_Display_Handle)
Worker * _worker
Definition: lv2_plugin.h:213
const PropertyDescriptors & get_supported_properties(bool readonly) const
Definition: lv2_plugin.h:181
const URIMap & uri_map() const
Definition: lv2_plugin.h:175
PropertyDescriptors _property_descriptors
Definition: lv2_plugin.h:272
bool _can_write_automation
Definition: lv2_plugin.h:239
void set_non_realtime(bool)
static void set_global_ui_background_color(uint32_t c)
Definition: lv2_plugin.h:189
uint32_t num_ports() const
bool _inline_display_in_gui
Definition: lv2_plugin.h:326
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
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:434
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:285
AutomationCtrl(const AutomationCtrl &other)
Definition: lv2_plugin.h:276
AutomationCtrl(std::shared_ptr< ARDOUR::AutomationControl > c)
Definition: lv2_plugin.h:281
Message send to/from UI via ports.
Definition: lv2_plugin.h:295