Ardour  9.2-79-gba93f2fe52
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 <set>
28 #include <string>
29 #include <vector>
30 
31 #include "pbd/mutex.h"
32 #include "pbd/ringbuffer.h"
33 
34 #include "temporal/tempo.h"
35 
36 #include "ardour/plugin.h"
38 #include "ardour/uri_map.h"
39 #include "ardour/worker.h"
40 
41 
42 #ifdef LV2_EXTENDED // -> needs to eventually go upstream to lv2plug.in
43 #include "ardour/lv2_extensions.h"
44 #endif
45 
46 #ifndef PATH_MAX
47 #define PATH_MAX 1024
48 #endif
49 
50 
51 namespace ARDOUR {
52 
53 // a callback function for lilv_state_new_from_instance(). friend of LV2Plugin
54 // so we can pass an LV2Plugin* in user_data and access its private members.
55 const void* lv2plugin_get_port_value(const char* port_symbol,
56  void* user_data,
57  uint32_t* size,
58  uint32_t* type);
59 
60 class AudioEngine;
61 class Session;
62 struct LV2_Evbuf;
63 
65 {
66  public:
68  ARDOUR::Session& session,
69  const void* c_plugin,
70  samplecnt_t sample_rate);
71  LV2Plugin (const LV2Plugin &);
73 
74  static bool force_state_save; // to be used only by session-state
75 
76  std::string unique_id () const;
77  const char* uri () const;
78  const char* label () const;
79  const char* name () const;
80  const char* maker () const;
81 
82  uint32_t num_ports () const;
83  uint32_t parameter_count () const;
84  float default_value (uint32_t port);
86  void set_parameter (uint32_t port, float val, sampleoffset_t);
87  float get_parameter (uint32_t port) const;
88  std::string get_docs() const;
89  std::string get_parameter_docs(uint32_t which) const;
90  int get_parameter_descriptor (uint32_t which, ParameterDescriptor&) const;
91  uint32_t nth_parameter (uint32_t port, bool& ok) const;
92 
93  IOPortDescription describe_io_port (DataType dt, bool input, uint32_t id) const;
94 
95  const void* extension_data (const char* uri) const;
96 
97 #ifdef LV2_EXTENDED
98  int setup_export (const char*, LV2_Options_Option const* options = NULL);
100  bool can_export () const { return _export_interface; }
101 #endif
102 
103  const void* c_plugin();
104  const void* c_ui();
105  const void* c_ui_type();
106 
107  bool is_external_ui () const;
108  bool is_external_kx () const;
109  bool ui_is_resizable () const;
110 
111  const char* port_symbol (uint32_t port) const;
112  uint32_t port_index (const char* symbol) const;
113 
114  const LV2_Feature* const* features () { return _features; }
115 
116  std::set<Evoral::Parameter> automatable () const;
117  virtual void set_automation_control (uint32_t, std::shared_ptr<AutomationControl>);
118 
119  void activate ();
120  void deactivate ();
121  void cleanup ();
122 
126 
128  samplepos_t start, samplepos_t end, double speed,
129  ChanMapping const& in, ChanMapping const& out,
130  pframes_t nframes, samplecnt_t offset);
131 
133  std::string state_node_name () const { return "lv2"; }
134 
135  bool parameter_is_audio (uint32_t) const;
136  bool parameter_is_control (uint32_t) const;
137  bool parameter_is_input (uint32_t) const;
138  bool parameter_is_output (uint32_t) const;
139  bool parameter_is_toggled (uint32_t) const;
140 
142 
143  std::shared_ptr<ScalePoints>
144  get_scale_points(uint32_t port_index) const;
145 
147  void set_state_dir (const std::string& d = "");
148 
149  int set_state (const XMLNode& node, int version);
151  std::string current_preset () const;
152 
153  bool has_editor () const;
154  bool has_message_output () const;
155 
156  void add_slave (std::shared_ptr<Plugin>, bool);
157  void remove_slave (std::shared_ptr<Plugin>);
158  void set_non_realtime (bool);
159 
160  bool write_from_ui(uint32_t index,
161  uint32_t protocol,
162  uint32_t size,
163  const uint8_t* body);
164 
165  typedef void UIMessageSink(void* controller,
166  uint32_t index,
167  uint32_t size,
168  uint32_t format,
169  const void* buffer);
170 
172  void emit_to_ui(void* controller, UIMessageSink sink);
173 
174  Worker* worker() { return _worker; }
175 
176  URIMap& uri_map() { return _uri_map; }
177  const URIMap& uri_map() const { return _uri_map; }
178 
179  int work(Worker& worker, uint32_t size, const void* data);
180  int work_response(uint32_t size, const void* data);
181 
182  void set_property(uint32_t key, const Variant& value);
183  const PropertyDescriptors& get_supported_properties (bool readonly) const {
184  return readonly ? _ro_property_descriptors : _property_descriptors;
185  }
186  const ParameterDescriptor& get_property_descriptor(uint32_t id) const;
187  Variant get_property_value (uint32_t) const;
189 
190  /* LV2 Option Options */
191  static void set_global_ui_background_color (uint32_t c) {
192  _ui_background_color = c;
193  }
194  static void set_global_ui_foreground_color (uint32_t c) {
195  _ui_foreground_color = c;
196  }
197  static void set_global_ui_contrasting_color (uint32_t c) {
198  _ui_contrasting_color = c;
199  }
200  static void set_global_ui_style_boxy (bool yn) {
201  _ui_style_boxy = yn ? 1 : 0;
202  }
203  static void set_global_ui_style_flat (bool yn) {
204  _ui_style_flat = yn ? 1 : 0;
205  }
206  static void set_main_window_id (unsigned long id) {
207  _ui_transient_win_id = id;
208  }
209 
210  private:
211  struct Impl;
212  Impl* _impl;
213  void* _module;
214  LV2_Feature** _features;
220  float* _shadow_data;
221  float* _defaults;
222  LV2_Evbuf** _ev_buffers;
223  LV2_Evbuf** _atom_ev_buffers;
230  double _current_bpm;
234  std::string _plugin_state_dir;
244 
245  friend const void* lv2plugin_get_port_value(const char* port_symbol,
246  void* user_data,
247  uint32_t* size,
248  uint32_t* type);
249 
250  typedef enum {
251  PORT_INPUT = 1,
252  PORT_OUTPUT = 1 << 1,
253  PORT_AUDIO = 1 << 2,
254  PORT_CONTROL = 1 << 3,
255  PORT_SEQUENCE = 1 << 5,
256  PORT_MIDI = 1 << 6,
257  PORT_POSITION = 1 << 7,
258  PORT_PATCHMSG = 1 << 8,
259  PORT_AUTOCTRL = 1 << 9,
260  PORT_CTRLED = 1 << 10,
261  PORT_CTRLER = 1 << 11,
262  PORT_NOAUTO = 1 << 12,
263  PORT_OTHOPT = 1 << 13
264  } PortFlag;
265 
266  typedef unsigned PortFlags;
267 
268  std::vector<PortFlags> _port_flags;
269  std::vector<size_t> _port_minimumSize;
270  std::map<std::string,uint32_t> _port_indices;
271 
272  std::map<uint32_t, Variant> _property_values;
273 
276 
277  struct AutomationCtrl {
279  : ac (other.ac)
280  , guard (other.guard)
281  { }
282 
283  AutomationCtrl (std::shared_ptr<ARDOUR::AutomationControl> c)
284  : ac (c)
285  , guard (false)
286  { }
287  std::shared_ptr<ARDOUR::AutomationControl> ac;
288  bool guard;
289  };
290 
291  typedef std::shared_ptr<AutomationCtrl> AutomationCtrlPtr;
292  typedef std::map<uint32_t, AutomationCtrlPtr> AutomationCtrlMap;
295 
297  struct UIMessage {
298  uint32_t index;
299  uint32_t protocol;
300  uint32_t size;
301  };
302 
303  bool write_to_ui(uint32_t index,
304  uint32_t protocol,
305  uint32_t size,
306  const uint8_t* body);
307 
309  uint32_t index,
310  uint32_t protocol,
311  uint32_t size,
312  const uint8_t* body);
313 
314  // Created on demand so the space is only consumed if necessary
317 
319 
321  std::set<std::shared_ptr<LV2Plugin>> _slaves;
322 
323 #ifdef LV2_EXTENDED
326  static void bankpatch_notify (LV2_BankPatch_Handle, uint8_t, uint32_t, uint8_t);
327 
332 
333  uint32_t _bankpatch[16];
335  bool knows_bank_patch () { return seen_bankpatch; }
336  uint32_t bank_patch (uint8_t chn) {
337  assert (chn < 16);
338  if (chn > 15) return UINT32_MAX;
339  return _bankpatch[chn];
340  }
341 #endif
342 
343  typedef struct {
344  const void* (*extension_data) (const char* uri);
345  } LV2_DataAccess;
346 
348  LV2_Feature _data_access_feature;
350  LV2_Feature _make_path_feature;
351  LV2_Feature _log_feature;
353  LV2_Feature _options_feature;
354  LV2_Feature _def_state_feature;
356 #ifdef LV2_EXTENDED
357  LV2_Feature _queue_draw_feature;
358  LV2_Feature _midnam_feature;
359  LV2_Feature _bankpatch_feature;
360 #endif
361 
362  // Options passed to plugin
363  int32_t _seq_size;
364  static int32_t _ui_style_flat;
365  static int32_t _ui_style_boxy;
366  static uint32_t _ui_background_color;
367  static uint32_t _ui_foreground_color;
368  static uint32_t _ui_contrasting_color;
369  static unsigned long _ui_transient_win_id;
370  static float _ui_update_hz;
371 
372  mutable unsigned _state_version;
373 
376 
377  const std::string plugin_dir () const;
378  const std::string scratch_dir () const;
379  const std::string file_dir () const;
380  const std::string state_dir (unsigned num) const;
381 
382  static char* lv2_state_make_path (void* host_data,
383  const char* path);
384 
385  void init (const void* c_plugin, samplecnt_t rate);
387  void run (pframes_t nsamples, bool sync_work = false);
388 
389  void load_supported_properties(PropertyDescriptors& descs, bool writable);
390 
391 #ifdef LV2_EXTENDED
395 
396  bool has_midnam ();
397  bool read_midnam ();
398  std::string midnam_model ();
400 #endif
401 
403 
405  std::string do_save_preset (std::string);
406  void do_remove_preset (std::string);
407  void find_presets ();
408  void add_state (XMLNode *) const;
409 
411 };
412 
413 
414 class LIBARDOUR_API LV2PluginInfo : public PluginInfo , public std::enable_shared_from_this<ARDOUR::LV2PluginInfo> {
415 public:
416  LV2PluginInfo (const char* plugin_uri);
418 
419  static PluginInfoList* discover (std::function <void (std::string const&, PluginScanLogEntry::PluginScanResult, std::string const&, bool)> cb);
420 
421  PluginPtr load (Session& session);
422  std::vector<Plugin::PresetRecord> get_presets (bool user_only) const;
423 
424  bool is_instrument () const;
425  bool is_utility () const;
426  bool is_analyzer () const;
427 
428  char * _plugin_uri;
429 
430 private:
434 };
435 
436 typedef std::shared_ptr<LV2PluginInfo> LV2PluginInfoPtr;
437 
438 } // namespace ARDOUR
439 
440 #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:214
LV2_Feature _log_feature
Definition: lv2_plugin.h:351
bool parameter_is_control(uint32_t) const
URIMap & _uri_map
Definition: lv2_plugin.h:238
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:269
float * _bpm_control_port
Special input set by ardour.
Definition: lv2_plugin.h:224
const LV2_Feature *const * features()
Definition: lv2_plugin.h:114
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:165
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:365
LV2_Feature _options_feature
Definition: lv2_plugin.h:353
uint32_t port_index(const char *symbol) const
static uint32_t _ui_background_color
Definition: lv2_plugin.h:366
bool _has_state_interface
Definition: lv2_plugin.h:375
double _next_cycle_speed
Expected start sample of next run cycle.
Definition: lv2_plugin.h:228
std::map< uint32_t, AutomationCtrlPtr > AutomationCtrlMap
Definition: lv2_plugin.h:292
uint32_t _patch_port_in_index
Definition: lv2_plugin.h:236
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:239
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:217
static unsigned long _ui_transient_win_id
Definition: lv2_plugin.h:369
PBD::RingBuffer< uint8_t > * _from_ui
Definition: lv2_plugin.h:316
LV2_Feature _data_access_feature
Definition: lv2_plugin.h:348
LV2_Feature _queue_draw_feature
Definition: lv2_plugin.h:357
bool load_preset(PresetRecord)
static void set_global_ui_contrasting_color(uint32_t c)
Definition: lv2_plugin.h:197
URIMap & uri_map()
Definition: lv2_plugin.h:176
bool _connect_all_audio_outputs
Definition: lv2_plugin.h:240
AutomationCtrlMap _ctrl_map
Definition: lv2_plugin.h:293
void load_supported_properties(PropertyDescriptors &descs, bool writable)
double _next_cycle_beat
Expected bar_beat of next run cycle.
Definition: lv2_plugin.h:229
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:329
std::map< uint32_t, Variant > _property_values
Definition: lv2_plugin.h:272
bool parameter_is_toggled(uint32_t) const
void init(const void *c_plugin, samplecnt_t rate)
Worker * _state_worker
Definition: lv2_plugin.h:216
bool parameter_is_input(uint32_t) const
std::string state_node_name() const
Definition: lv2_plugin.h:133
unsigned PortFlags
Definition: lv2_plugin.h:266
samplepos_t _next_cycle_start
Expected start sample of next run cycle.
Definition: lv2_plugin.h:227
PBD::Mutex _work_mutex
Definition: lv2_plugin.h:318
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:237
std::string get_parameter_docs(uint32_t which) const
std::shared_ptr< AutomationCtrl > AutomationCtrlPtr
Definition: lv2_plugin.h:291
const char * name() const
LV2_Evbuf ** _ev_buffers
Definition: lv2_plugin.h:222
PBD::RingBuffer< uint8_t > * _to_ui
Definition: lv2_plugin.h:315
std::string get_docs() const
static void bankpatch_notify(LV2_BankPatch_Handle, uint8_t, uint32_t, uint8_t)
PBD::Mutex _slave_lock
Definition: lv2_plugin.h:320
const LV2_Export_Interface * _export_interface
Definition: lv2_plugin.h:331
const LV2_Midnam_Interface * _midname_interface
Definition: lv2_plugin.h:330
void announce_property_values()
static void midnam_update(LV2_Midnam_Handle)
const char * uri() const
LV2_Feature _def_state_feature
Definition: lv2_plugin.h:354
bool has_message_output() const
const char * port_symbol(uint32_t port) const
LV2_Feature _instance_access_feature
Definition: lv2_plugin.h:349
static uint32_t _ui_foreground_color
Definition: lv2_plugin.h:367
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:203
samplecnt_t _current_latency
Definition: lv2_plugin.h:243
const ParameterDescriptor & get_property_descriptor(uint32_t id) const
float * _freewheel_control_port
Special input set by ardour.
Definition: lv2_plugin.h:225
LV2_Feature _make_path_feature
Definition: lv2_plugin.h:350
std::string _plugin_state_dir
Definition: lv2_plugin.h:234
static void set_global_ui_foreground_color(uint32_t c)
Definition: lv2_plugin.h:194
const std::string plugin_dir() const
Worker * worker()
Definition: lv2_plugin.h:174
uint32_t parameter_count() const
static void set_global_ui_style_boxy(bool yn)
Definition: lv2_plugin.h:200
float * _shadow_data
Definition: lv2_plugin.h:220
std::set< Evoral::Parameter > automatable() const
static float _ui_update_hz
Definition: lv2_plugin.h:370
static int32_t _ui_style_flat
Definition: lv2_plugin.h:364
void emit_to_ui(void *controller, UIMessageSink sink)
void remove_slave(std::shared_ptr< Plugin >)
static bool force_state_save
Definition: lv2_plugin.h:74
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:232
std::vector< PortFlags > _port_flags
Definition: lv2_plugin.h:268
const char * maker() const
unsigned _state_version
Definition: lv2_plugin.h:372
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)
std::set< std::shared_ptr< LV2Plugin > > _slaves
Definition: lv2_plugin.h:321
int setup_export(const char *, LV2_Options_Option const *options=NULL)
float * _latency_control_port
Special output set by ardour.
Definition: lv2_plugin.h:226
PropertyDescriptors _ro_property_descriptors
Definition: lv2_plugin.h:275
LV2_Feature _bankpatch_feature
Definition: lv2_plugin.h:359
double _prev_time_scale
previous Port::speed_ratio
Definition: lv2_plugin.h:231
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:270
void set_parameter(uint32_t port, float val, sampleoffset_t)
bool knows_bank_patch()
Definition: lv2_plugin.h:335
uint32_t _bpm_control_port_index
Definition: lv2_plugin.h:235
static uint32_t _ui_contrasting_color
Definition: lv2_plugin.h:368
LV2_Feature _block_length_feature
Definition: lv2_plugin.h:355
float * _control_data
Definition: lv2_plugin.h:219
virtual void set_automation_control(uint32_t, std::shared_ptr< AutomationControl >)
Temporal::GridIterator grid_iterator
Definition: lv2_plugin.h:410
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:206
LV2_Feature _work_schedule_feature
Definition: lv2_plugin.h:352
bool connect_all_audio_outputs() const
LV2_Evbuf ** _atom_ev_buffers
Definition: lv2_plugin.h:223
uint32_t bank_patch(uint8_t chn)
Definition: lv2_plugin.h:336
samplecnt_t plugin_latency() const
LV2_Feature _midnam_feature
Definition: lv2_plugin.h:358
void latency_compute_run()
bool has_inline_display()
AutomationCtrlPtr get_automation_control(uint32_t)
bool can_export() const
Definition: lv2_plugin.h:100
LV2_DataAccess _data_access_extension_data
Definition: lv2_plugin.h:347
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:242
const void * c_plugin()
void add_state(XMLNode *) const
static void queue_draw(LV2_Inline_Display_Handle)
Worker * _worker
Definition: lv2_plugin.h:215
const PropertyDescriptors & get_supported_properties(bool readonly) const
Definition: lv2_plugin.h:183
const URIMap & uri_map() const
Definition: lv2_plugin.h:177
PropertyDescriptors _property_descriptors
Definition: lv2_plugin.h:274
bool _can_write_automation
Definition: lv2_plugin.h:241
void set_non_realtime(bool)
static void set_global_ui_background_color(uint32_t c)
Definition: lv2_plugin.h:191
uint32_t num_ports() const
bool _inline_display_in_gui
Definition: lv2_plugin.h:328
std::shared_ptr< ScalePoints > get_scale_points(uint32_t port_index) const
std::map< uint32_t, ParameterDescriptor > PropertyDescriptors
Definition: plugin.h:337
Definition: id.h:33
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:65
std::shared_ptr< LV2PluginInfo > LV2PluginInfoPtr
Definition: lv2_plugin.h:436
std::shared_ptr< Plugin > PluginPtr
Definition: plugin.h:61
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:287
AutomationCtrl(const AutomationCtrl &other)
Definition: lv2_plugin.h:278
AutomationCtrl(std::shared_ptr< ARDOUR::AutomationControl > c)
Definition: lv2_plugin.h:283
Message send to/from UI via ports.
Definition: lv2_plugin.h:297