ardour
lv2_plugin.h
Go to the documentation of this file.
1 /*
2  Copyright (C) 2008-2012 Paul Davis
3  Author: David Robillard
4 
5  This program is free software; you can redistribute it and/or modify
6  it under the terms of the GNU General Public License as published by
7  the Free Software Foundation; either version 2 of the License, or
8  (at your option) any later version.
9 
10  This program is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  GNU General Public License for more details.
14 
15  You should have received a copy of the GNU General Public License
16  along with this program; if not, write to the Free Software
17  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 */
19 
20 #ifndef __ardour_lv2_plugin_h__
21 #define __ardour_lv2_plugin_h__
22 
23 #include <set>
24 #include <string>
25 #include <vector>
26 #include <boost/enable_shared_from_this.hpp>
27 
28 #include "ardour/plugin.h"
29 #include "ardour/uri_map.h"
30 #include "ardour/worker.h"
31 #include "pbd/ringbuffer.h"
32 
33 #ifndef PATH_MAX
34 #define PATH_MAX 1024
35 #endif
36 
37 typedef struct LV2_Evbuf_Impl LV2_Evbuf;
38 
39 namespace ARDOUR {
40 
41 // a callback function for lilv_state_new_from_instance(). friend of LV2Plugin
42 // so we can pass an LV2Plugin* in user_data and access its private members.
43 const void* lv2plugin_get_port_value(const char* port_symbol,
44  void* user_data,
45  uint32_t* size,
46  uint32_t* type);
47 
48 class AudioEngine;
49 class Session;
50 
52 {
53  public:
55  ARDOUR::Session& session,
56  const void* c_plugin,
57  framecnt_t sample_rate);
58  LV2Plugin (const LV2Plugin &);
59  ~LV2Plugin ();
60 
61  std::string unique_id () const;
62  const char* uri () const;
63  const char* label () const;
64  const char* name () const;
65  const char* maker () const;
66 
67  uint32_t num_ports () const;
68  uint32_t parameter_count () const;
69  float default_value (uint32_t port);
70  framecnt_t signal_latency () const;
71  void set_parameter (uint32_t port, float val);
72  float get_parameter (uint32_t port) const;
73  std::string get_docs() const;
74  std::string get_parameter_docs(uint32_t which) const;
75  int get_parameter_descriptor (uint32_t which, ParameterDescriptor&) const;
76  uint32_t nth_parameter (uint32_t port, bool& ok) const;
77 
78  const void* extension_data (const char* uri) const;
79 
80  const void* c_plugin();
81  const void* c_ui();
82  const void* c_ui_type();
83 
84  bool is_external_ui () const;
85  bool is_external_kx () const;
86  bool ui_is_resizable () const;
87 
88  const char* port_symbol (uint32_t port) const;
89  uint32_t port_index (const char* symbol) const;
90 
91  const LV2_Feature* const* features () { return _features; }
92 
93  std::set<Evoral::Parameter> automatable () const;
94 
95  void activate ();
96  void deactivate ();
97  void cleanup ();
98 
99  int set_block_size (pframes_t /*nframes*/) { return 0; }
100 
101  int connect_and_run (BufferSet& bufs,
102  ChanMapping in, ChanMapping out,
103  pframes_t nframes, framecnt_t offset);
104 
105  std::string describe_parameter (Evoral::Parameter);
106  std::string state_node_name () const { return "lv2"; }
107 
108  void print_parameter (uint32_t param,
109  char* buf,
110  uint32_t len) const;
111 
112  bool parameter_is_audio (uint32_t) const;
113  bool parameter_is_control (uint32_t) const;
114  bool parameter_is_event (uint32_t) const;
115  bool parameter_is_input (uint32_t) const;
116  bool parameter_is_output (uint32_t) const;
117  bool parameter_is_toggled (uint32_t) const;
118 
120  get_scale_points(uint32_t port_index) const;
121 
122  void set_insert_id(PBD::ID id);
123 
124  int set_state (const XMLNode& node, int version);
125  bool save_preset (std::string uri);
126  void remove_preset (std::string uri);
127  bool load_preset (PresetRecord);
128  std::string current_preset () const;
129 
130  bool has_editor () const;
131  bool has_message_output () const;
132 
133  bool write_from_ui(uint32_t index,
134  uint32_t protocol,
135  uint32_t size,
136  const uint8_t* body);
137 
138  typedef void UIMessageSink(void* controller,
139  uint32_t index,
140  uint32_t size,
141  uint32_t format,
142  const void* buffer);
143 
144  void enable_ui_emission();
145  void emit_to_ui(void* controller, UIMessageSink sink);
146 
147  Worker* worker() { return _worker; }
148 
149  URIMap& uri_map() { return _uri_map; }
150  const URIMap& uri_map() const { return _uri_map; }
151 
152  int work(uint32_t size, const void* data);
153  int work_response(uint32_t size, const void* data);
154 
155  void set_property(uint32_t key, const Variant& value);
156  const PropertyDescriptors& get_supported_properties() const { return _property_descriptors; }
157  const ParameterDescriptor& get_property_descriptor(uint32_t id) const;
158  void announce_property_values();
159 
160  private:
161  struct Impl;
162  Impl* _impl;
163  void* _module;
164  LV2_Feature** _features;
168  float* _shadow_data;
169  float* _defaults;
181 
182  friend const void* lv2plugin_get_port_value(const char* port_symbol,
183  void* user_data,
184  uint32_t* size,
185  uint32_t* type);
186 
187  typedef enum {
188  PORT_INPUT = 1,
189  PORT_OUTPUT = 1 << 1,
190  PORT_AUDIO = 1 << 2,
191  PORT_CONTROL = 1 << 3,
192  PORT_EVENT = 1 << 4,
193  PORT_SEQUENCE = 1 << 5,
194  PORT_MIDI = 1 << 6,
195  PORT_POSITION = 1 << 7,
196  PORT_PATCHMSG = 1 << 8
197  } PortFlag;
198 
199  typedef unsigned PortFlags;
200 
201  std::vector<PortFlags> _port_flags;
202  std::vector<size_t> _port_minimumSize;
203  std::map<std::string,uint32_t> _port_indices;
204 
206 
208  struct UIMessage {
209  uint32_t index;
210  uint32_t protocol;
211  uint32_t size;
212  };
213 
214  bool write_to_ui(uint32_t index,
215  uint32_t protocol,
216  uint32_t size,
217  const uint8_t* body);
218 
219  bool write_to(RingBuffer<uint8_t>* dest,
220  uint32_t index,
221  uint32_t protocol,
222  uint32_t size,
223  const uint8_t* body);
224 
225  // Created on demand so the space is only consumed if necessary
228 
229  typedef struct {
230  const void* (*extension_data) (const char* uri);
231  } LV2_DataAccess;
232 
234  LV2_Feature _data_access_feature;
236  LV2_Feature _make_path_feature;
237  LV2_Feature _log_feature;
239  LV2_Feature _options_feature;
240  LV2_Feature _def_state_feature;
241 
242  // Options passed to plugin
243  int32_t _block_length;
244  int32_t _seq_size;
245 
246  mutable unsigned _state_version;
247 
250 
251  const std::string plugin_dir () const;
252  const std::string scratch_dir () const;
253  const std::string file_dir () const;
254  const std::string state_dir (unsigned num) const;
255 
256  static char* lv2_state_make_path (void* host_data,
257  const char* path);
258 
259  void init (const void* c_plugin, framecnt_t rate);
260  void allocate_atom_event_buffers ();
261  void run (pframes_t nsamples);
262 
263  void load_supported_properties(PropertyDescriptors& descs);
264 
265  void latency_compute_run ();
266  std::string do_save_preset (std::string);
267  void do_remove_preset (std::string);
268  void find_presets ();
269  void add_state (XMLNode *) const;
270 };
271 
272 
273 class LIBARDOUR_API LV2PluginInfo : public PluginInfo , public boost::enable_shared_from_this<ARDOUR::LV2PluginInfo> {
274 public:
275  LV2PluginInfo (const char* plugin_uri);
276  ~LV2PluginInfo ();
277 
278  static PluginInfoList* discover ();
279 
280  PluginPtr load (Session& session);
281 
282  char * _plugin_uri;
283 };
284 
286 
287 } // namespace ARDOUR
288 
289 #endif /* __ardour_lv2_plugin_h__ */
Worker * _worker
Definition: lv2_plugin.h:165
int set_block_size(pframes_t)
Definition: lv2_plugin.h:99
uint32_t _patch_port_out_index
Definition: lv2_plugin.h:179
float * _control_data
Definition: lv2_plugin.h:167
PBD::ID _insert_id
Definition: lv2_plugin.h:177
framepos_t _next_cycle_start
Expected start frame of next run cycle.
Definition: lv2_plugin.h:175
LV2_Feature _options_feature
Definition: lv2_plugin.h:239
URIMap & _uri_map
Definition: lv2_plugin.h:180
Worker * worker()
Definition: lv2_plugin.h:147
const PropertyDescriptors & get_supported_properties() const
Definition: lv2_plugin.h:156
LV2_Evbuf ** _ev_buffers
Definition: lv2_plugin.h:170
LV2_Feature _make_path_feature
Definition: lv2_plugin.h:236
uint32_t pframes_t
Definition: types.h:61
float * _bpm_control_port
Special input set by ardour.
Definition: lv2_plugin.h:172
LV2_DataAccess _data_access_extension_data
Definition: lv2_plugin.h:233
LV2_Feature _log_feature
Definition: lv2_plugin.h:237
Definition: id.h:32
std::vector< PortFlags > _port_flags
Definition: lv2_plugin.h:201
int64_t framecnt_t
Definition: types.h:76
LV2_Feature _def_state_feature
Definition: lv2_plugin.h:240
int32_t _block_length
Definition: lv2_plugin.h:243
float * _shadow_data
Definition: lv2_plugin.h:168
std::map< uint32_t, ParameterDescriptor > PropertyDescriptors
Definition: plugin.h:234
LV2_Feature _work_schedule_feature
Definition: lv2_plugin.h:238
Definition: amp.h:29
const LV2_Feature *const * features()
Definition: lv2_plugin.h:91
int64_t framepos_t
Definition: types.h:66
unsigned _state_version
Definition: lv2_plugin.h:246
std::string state_node_name() const
Definition: lv2_plugin.h:106
Message send to/from UI via ports.
Definition: lv2_plugin.h:208
RingBuffer< uint8_t > * _to_ui
Definition: lv2_plugin.h:226
LV2_Feature _data_access_feature
Definition: lv2_plugin.h:234
#define LIBARDOUR_API
RingBuffer< uint8_t > * _from_ui
Definition: lv2_plugin.h:227
unsigned PortFlags
Definition: lv2_plugin.h:199
LIBARDOUR_API void cleanup()
Definition: globals.cc:502
const char * name
const void * lv2plugin_get_port_value(const char *port_symbol, void *user_data, uint32_t *size, uint32_t *type)
Definition: lv2_plugin.cc:1050
LV2_Feature ** _features
Definition: lv2_plugin.h:164
Definition: xml++.h:95
framecnt_t _sample_rate
Definition: lv2_plugin.h:166
float * _latency_control_port
Special output set by ardour.
Definition: lv2_plugin.h:174
std::map< std::string, uint32_t > _port_indices
Definition: lv2_plugin.h:203
LV2_Feature _instance_access_feature
Definition: lv2_plugin.h:235
LIBARDOUR_API uint64_t AudioEngine
Definition: session.h:982
uint32_t _patch_port_in_index
Definition: lv2_plugin.h:178
std::list< PluginInfoPtr > PluginInfoList
Definition: plugin.h:90
boost::shared_ptr< LV2PluginInfo > LV2PluginInfoPtr
Definition: lv2_plugin.h:285
PropertyDescriptors _property_descriptors
Definition: lv2_plugin.h:205
const URIMap & uri_map() const
Definition: lv2_plugin.h:150
double _next_cycle_speed
Expected start frame of next run cycle.
Definition: lv2_plugin.h:176
URIMap & uri_map()
Definition: lv2_plugin.h:149
bool _has_state_interface
Definition: lv2_plugin.h:249
std::vector< size_t > _port_minimumSize
Definition: lv2_plugin.h:202
LIBARDOUR_API bool init(bool with_vst, bool try_optimization, const char *localedir)
Definition: globals.cc:376
float * _freewheel_control_port
Special input set by ardour.
Definition: lv2_plugin.h:173
LV2_Evbuf ** _atom_ev_buffers
Definition: lv2_plugin.h:171
void UIMessageSink(void *controller, uint32_t index, uint32_t size, uint32_t format, const void *buffer)
Definition: lv2_plugin.h:138