940ec8ae0389ac49a47057a89da98f5550fb2f0a
[ardour.git] / libs / ardour / lv2_plugin.cc
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 #include <string>
21 #include <vector>
22 #include <limits>
23
24 #include <cmath>
25 #include <cstdlib>
26 #include <cstring>
27
28 #include "pbd/gstdio_compat.h"
29 #include <glib/gprintf.h>
30 #include <glibmm.h>
31
32 #include <boost/utility.hpp>
33
34 #include "pbd/file_utils.h"
35 #include "pbd/stl_delete.h"
36 #include "pbd/compose.h"
37 #include "pbd/error.h"
38 #include "pbd/xml++.h"
39
40 #include "libardour-config.h"
41
42 #include "ardour/audio_buffer.h"
43 #include "ardour/audioengine.h"
44 #include "ardour/debug.h"
45 #include "ardour/lv2_plugin.h"
46 #include "ardour/session.h"
47 #include "ardour/tempo.h"
48 #include "ardour/types.h"
49 #include "ardour/utils.h"
50 #include "ardour/worker.h"
51 #include "ardour/search_paths.h"
52
53 #include "i18n.h"
54 #include <locale.h>
55
56 #include <lilv/lilv.h>
57
58 #include "lv2/lv2plug.in/ns/ext/atom/atom.h"
59 #include "lv2/lv2plug.in/ns/ext/atom/forge.h"
60 #include "lv2/lv2plug.in/ns/ext/log/log.h"
61 #include "lv2/lv2plug.in/ns/ext/midi/midi.h"
62 #include "lv2/lv2plug.in/ns/ext/port-props/port-props.h"
63 #include "lv2/lv2plug.in/ns/ext/presets/presets.h"
64 #include "lv2/lv2plug.in/ns/ext/state/state.h"
65 #include "lv2/lv2plug.in/ns/ext/time/time.h"
66 #include "lv2/lv2plug.in/ns/ext/worker/worker.h"
67 #include "lv2/lv2plug.in/ns/ext/resize-port/resize-port.h"
68 #include "lv2/lv2plug.in/ns/extensions/ui/ui.h"
69 #include "lv2/lv2plug.in/ns/extensions/units/units.h"
70 #include "lv2/lv2plug.in/ns/ext/patch/patch.h"
71 #ifdef HAVE_LV2_1_2_0
72 #include "lv2/lv2plug.in/ns/ext/buf-size/buf-size.h"
73 #include "lv2/lv2plug.in/ns/ext/options/options.h"
74 #endif
75
76 #include "lv2_evbuf.h"
77
78 #ifdef HAVE_SUIL
79 #include <suil/suil.h>
80 #endif
81
82 // Compatibility for old LV2
83 #ifndef LV2_ATOM_CONTENTS_CONST
84 #define LV2_ATOM_CONTENTS_CONST(type, atom) \
85         ((const void*)((const uint8_t*)(atom) + sizeof(type)))
86 #endif
87 #ifndef LV2_ATOM_BODY_CONST
88 #define LV2_ATOM_BODY_CONST(atom) LV2_ATOM_CONTENTS_CONST(LV2_Atom, atom)
89 #endif
90 #ifndef LV2_PATCH__property
91 #define LV2_PATCH__property LV2_PATCH_PREFIX "property"
92 #endif
93 #ifndef LV2_PATCH__value
94 #define LV2_PATCH__value LV2_PATCH_PREFIX "value"
95 #endif
96 #ifndef LV2_PATCH__writable
97 #define LV2_PATCH__writable LV2_PATCH_PREFIX "writable"
98 #endif
99
100 /** The number of MIDI buffers that will fit in a UI/worker comm buffer.
101     This needs to be roughly the number of cycles the UI will get around to
102     actually processing the traffic.  Lower values are flakier but save memory.
103 */
104 static const size_t NBUFS = 4;
105
106 using namespace std;
107 using namespace ARDOUR;
108 using namespace PBD;
109
110 class LV2World : boost::noncopyable {
111 public:
112         LV2World ();
113         ~LV2World ();
114
115         void load_bundled_plugins(bool verbose=false);
116
117         LilvWorld* world;
118
119         LilvNode* atom_AtomPort;
120         LilvNode* atom_Chunk;
121         LilvNode* atom_Sequence;
122         LilvNode* atom_bufferType;
123         LilvNode* atom_eventTransfer;
124         LilvNode* atom_supports;
125         LilvNode* ev_EventPort;
126         LilvNode* ext_logarithmic;
127         LilvNode* ext_notOnGUI;
128         LilvNode* lv2_AudioPort;
129         LilvNode* lv2_ControlPort;
130         LilvNode* lv2_InputPort;
131         LilvNode* lv2_OutputPort;
132         LilvNode* lv2_enumeration;
133         LilvNode* lv2_freewheeling;
134         LilvNode* lv2_inPlaceBroken;
135         LilvNode* lv2_integer;
136         LilvNode* lv2_default;
137         LilvNode* lv2_minimum;
138         LilvNode* lv2_maximum;
139         LilvNode* lv2_reportsLatency;
140         LilvNode* lv2_sampleRate;
141         LilvNode* lv2_toggled;
142         LilvNode* midi_MidiEvent;
143         LilvNode* rdfs_comment;
144         LilvNode* rdfs_label;
145         LilvNode* rdfs_range;
146         LilvNode* rsz_minimumSize;
147         LilvNode* time_Position;
148         LilvNode* ui_GtkUI;
149         LilvNode* ui_external;
150         LilvNode* ui_externalkx;
151         LilvNode* units_hz;
152         LilvNode* units_db;
153         LilvNode* units_unit;
154         LilvNode* units_render;
155         LilvNode* units_midiNote;
156         LilvNode* patch_writable;
157         LilvNode* patch_Message;
158         LilvNode* lv2_noSampleAccurateCtrl;
159 #ifdef HAVE_LV2_1_2_0
160         LilvNode* bufz_powerOf2BlockLength;
161         LilvNode* bufz_fixedBlockLength;
162         LilvNode* bufz_nominalBlockLength;
163 #endif
164
165 private:
166         bool _bundle_checked;
167 };
168
169 static LV2World _world;
170
171 /* worker extension */
172
173 /** Called by the plugin to schedule non-RT work. */
174 static LV2_Worker_Status
175 work_schedule(LV2_Worker_Schedule_Handle handle,
176               uint32_t                   size,
177               const void*                data)
178 {
179         LV2Plugin* plugin = (LV2Plugin*)handle;
180         if (plugin->session().engine().freewheeling()) {
181                 // Freewheeling, do the work immediately in this (audio) thread
182                 return (LV2_Worker_Status)plugin->work(size, data);
183         } else {
184                 // Enqueue message for the worker thread
185                 return plugin->worker()->schedule(size, data) ?
186                         LV2_WORKER_SUCCESS : LV2_WORKER_ERR_UNKNOWN;
187         }
188 }
189
190 /** Called by the plugin to respond to non-RT work. */
191 static LV2_Worker_Status
192 work_respond(LV2_Worker_Respond_Handle handle,
193              uint32_t                  size,
194              const void*               data)
195 {
196         LV2Plugin* plugin = (LV2Plugin*)handle;
197         if (plugin->session().engine().freewheeling()) {
198                 // Freewheeling, respond immediately in this (audio) thread
199                 return (LV2_Worker_Status)plugin->work_response(size, data);
200         } else {
201                 // Enqueue response for the worker
202                 return plugin->worker()->respond(size, data) ?
203                         LV2_WORKER_SUCCESS : LV2_WORKER_ERR_UNKNOWN;
204         }
205 }
206
207 /* log extension */
208
209 static int
210 log_vprintf(LV2_Log_Handle /*handle*/,
211             LV2_URID       type,
212             const char*    fmt,
213             va_list        args)
214 {
215         char* str = NULL;
216         const int ret = g_vasprintf(&str, fmt, args);
217         if (type == URIMap::instance().urids.log_Error) {
218                 error << str << endmsg;
219         } else if (type == URIMap::instance().urids.log_Warning) {
220                 warning << str << endmsg;
221         } else if (type == URIMap::instance().urids.log_Note) {
222                 info << str << endmsg;
223         }
224         // TODO: Toggleable log:Trace message support
225         return ret;
226 }
227
228 static int
229 log_printf(LV2_Log_Handle handle,
230            LV2_URID       type,
231            const char*    fmt, ...)
232 {
233         va_list args;
234         va_start(args, fmt);
235         const int ret = log_vprintf(handle, type, fmt, args);
236         va_end(args);
237         return ret;
238 }
239
240 struct LV2Plugin::Impl {
241         Impl() : plugin(0), ui(0), ui_type(0), name(0), author(0), instance(0)
242                , work_iface(0)
243 #ifdef HAVE_LV2_1_2_0
244                , opts_iface(0)
245 #endif
246                , state(0)
247                , block_length(0)
248 #ifdef HAVE_LV2_1_2_0
249                , options(0)
250 #endif
251         {}
252
253         /** Find the LV2 input port with the given designation.
254          * If found, bufptrs[port_index] will be set to bufptr.
255          */
256         const LilvPort* designated_input (const char* uri, void** bufptrs[], void** bufptr);
257
258         const LilvPlugin*            plugin;
259         const LilvUI*                ui;
260         const LilvNode*              ui_type;
261         LilvNode*                    name;
262         LilvNode*                    author;
263         LilvInstance*                instance;
264         const LV2_Worker_Interface*  work_iface;
265 #ifdef HAVE_LV2_1_2_0
266         const LV2_Options_Interface* opts_iface;
267 #endif
268         LilvState*                   state;
269         LV2_Atom_Forge               forge;
270         LV2_Atom_Forge               ui_forge;
271         int32_t                      block_length;
272 #ifdef HAVE_LV2_1_2_0
273         LV2_Options_Option*          options;
274 #endif
275 };
276
277 LV2Plugin::LV2Plugin (AudioEngine& engine,
278                       Session&     session,
279                       const void*  c_plugin,
280                       framecnt_t   rate)
281         : Plugin (engine, session)
282         , Workee ()
283         , _impl(new Impl())
284         , _features(NULL)
285         , _worker(NULL)
286         , _insert_id("0")
287         , _patch_port_in_index((uint32_t)-1)
288         , _patch_port_out_index((uint32_t)-1)
289         , _uri_map(URIMap::instance())
290         , _no_sample_accurate_ctrl (false)
291 {
292         init(c_plugin, rate);
293 }
294
295 LV2Plugin::LV2Plugin (const LV2Plugin& other)
296         : Plugin (other)
297         , Workee ()
298         , _impl(new Impl())
299         , _features(NULL)
300         , _worker(NULL)
301         , _insert_id(other._insert_id)
302         , _patch_port_in_index((uint32_t)-1)
303         , _patch_port_out_index((uint32_t)-1)
304         , _uri_map(URIMap::instance())
305         , _no_sample_accurate_ctrl (false)
306 {
307         init(other._impl->plugin, other._sample_rate);
308
309         for (uint32_t i = 0; i < parameter_count(); ++i) {
310                 _control_data[i] = other._shadow_data[i];
311                 _shadow_data[i]  = other._shadow_data[i];
312         }
313 }
314
315 void
316 LV2Plugin::init(const void* c_plugin, framecnt_t rate)
317 {
318         DEBUG_TRACE(DEBUG::LV2, "init\n");
319
320         _impl->plugin           = (const LilvPlugin*)c_plugin;
321         _impl->ui               = NULL;
322         _impl->ui_type          = NULL;
323         _to_ui                  = NULL;
324         _from_ui                = NULL;
325         _control_data           = 0;
326         _shadow_data            = 0;
327         _atom_ev_buffers        = 0;
328         _ev_buffers             = 0;
329         _bpm_control_port       = 0;
330         _freewheel_control_port = 0;
331         _latency_control_port   = 0;
332         _next_cycle_start       = std::numeric_limits<framepos_t>::max();
333         _next_cycle_speed       = 1.0;
334         _seq_size               = _engine.raw_buffer_size(DataType::MIDI);
335         _state_version          = 0;
336         _was_activated          = false;
337         _has_state_interface    = false;
338         _impl->block_length     = _session.get_block_size();
339
340         _instance_access_feature.URI = "http://lv2plug.in/ns/ext/instance-access";
341         _data_access_feature.URI     = "http://lv2plug.in/ns/ext/data-access";
342         _make_path_feature.URI       = LV2_STATE__makePath;
343         _log_feature.URI             = LV2_LOG__log;
344         _work_schedule_feature.URI   = LV2_WORKER__schedule;
345         _work_schedule_feature.data  = NULL;
346         _def_state_feature.URI       = LV2_STATE_PREFIX "loadDefaultState";  // Post LV2-1.2.0
347         _def_state_feature.data      = NULL;
348
349         const LilvPlugin* plugin = _impl->plugin;
350
351         LilvNode* state_iface_uri = lilv_new_uri(_world.world, LV2_STATE__interface);
352         LilvNode* state_uri       = lilv_new_uri(_world.world, LV2_STATE_URI);
353         _has_state_interface =
354                 // What plugins should have (lv2:extensionData state:Interface)
355                 lilv_plugin_has_extension_data(plugin, state_iface_uri)
356                 // What some outdated/incorrect ones have
357                 || lilv_plugin_has_feature(plugin, state_uri);
358         lilv_node_free(state_uri);
359         lilv_node_free(state_iface_uri);
360
361         _features    = (LV2_Feature**)calloc(11, sizeof(LV2_Feature*));
362         _features[0] = &_instance_access_feature;
363         _features[1] = &_data_access_feature;
364         _features[2] = &_make_path_feature;
365         _features[3] = _uri_map.uri_map_feature();
366         _features[4] = _uri_map.urid_map_feature();
367         _features[5] = _uri_map.urid_unmap_feature();
368         _features[6] = &_log_feature;
369
370         unsigned n_features = 7;
371 #ifdef HAVE_LV2_1_2_0
372         _features[n_features++] = &_def_state_feature;
373 #endif
374
375         lv2_atom_forge_init(&_impl->forge, _uri_map.urid_map());
376         lv2_atom_forge_init(&_impl->ui_forge, _uri_map.urid_map());
377
378 #ifdef HAVE_LV2_1_2_0
379         LV2_URID atom_Int = _uri_map.uri_to_id(LV2_ATOM__Int);
380         static const int32_t _min_block_length = 1;   // may happen during split-cycles
381         static const int32_t _max_block_length = 8192; // max possible (with all engines and during export)
382         /* Consider updating max-block-size whenever the buffersize changes.
383          * It requires re-instantiating the plugin (which is a non-realtime operation),
384          * so it should be done lightly and only for plugins that require it.
385          *
386          * given that the block-size can change at any time (split-cycles) ardour currently
387          * does not support plugins that require bufz_fixedBlockLength.
388          */
389         LV2_Options_Option options[] = {
390                 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id(LV2_BUF_SIZE__minBlockLength),
391                   sizeof(int32_t), atom_Int, &_min_block_length },
392                 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id(LV2_BUF_SIZE__maxBlockLength),
393                   sizeof(int32_t), atom_Int, &_max_block_length },
394                 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id(LV2_BUF_SIZE__sequenceSize),
395                   sizeof(int32_t), atom_Int, &_seq_size },
396                 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id("http://lv2plug.in/ns/ext/buf-size#nominalBlockLength"),
397                   sizeof(int32_t), atom_Int, &_impl->block_length },
398                 { LV2_OPTIONS_INSTANCE, 0, 0, 0, 0, NULL }
399         };
400
401         _impl->options = (LV2_Options_Option*) malloc (sizeof (options));
402         memcpy ((void*) _impl->options, (void*) options, sizeof (options));
403
404         _options_feature.URI    = LV2_OPTIONS__options;
405         _options_feature.data   = _impl->options;
406         _features[n_features++] = &_options_feature;
407 #endif
408
409         LV2_State_Make_Path* make_path = (LV2_State_Make_Path*)malloc(
410                 sizeof(LV2_State_Make_Path));
411         make_path->handle = this;
412         make_path->path = &lv2_state_make_path;
413         _make_path_feature.data = make_path;
414
415         LV2_Log_Log* log = (LV2_Log_Log*)malloc(sizeof(LV2_Log_Log));
416         log->handle  = this;
417         log->printf  = &log_printf;
418         log->vprintf = &log_vprintf;
419         _log_feature.data = log;
420
421         LilvNode* worker_schedule = lilv_new_uri(_world.world, LV2_WORKER__schedule);
422         if (lilv_plugin_has_feature(plugin, worker_schedule)) {
423                 LV2_Worker_Schedule* schedule = (LV2_Worker_Schedule*)malloc(
424                         sizeof(LV2_Worker_Schedule));
425                 size_t buf_size = _session.engine().raw_buffer_size(DataType::MIDI) * NBUFS;
426                 _worker                     = new Worker(this, buf_size);
427                 schedule->handle            = this;
428                 schedule->schedule_work     = work_schedule;
429                 _work_schedule_feature.data = schedule;
430                 _features[n_features++]     = &_work_schedule_feature;
431         }
432         lilv_node_free(worker_schedule);
433
434         _impl->instance = lilv_plugin_instantiate(plugin, rate, _features);
435         _impl->name     = lilv_plugin_get_name(plugin);
436         _impl->author   = lilv_plugin_get_author_name(plugin);
437
438         if (_impl->instance == 0) {
439                 error << _("LV2: Failed to instantiate plugin ") << uri() << endmsg;
440                 throw failed_constructor();
441         }
442
443         _instance_access_feature.data              = (void*)_impl->instance->lv2_handle;
444         _data_access_extension_data.extension_data = _impl->instance->lv2_descriptor->extension_data;
445         _data_access_feature.data                  = &_data_access_extension_data;
446
447         LilvNode* worker_iface_uri = lilv_new_uri(_world.world, LV2_WORKER__interface);
448         if (lilv_plugin_has_extension_data(plugin, worker_iface_uri)) {
449                 _impl->work_iface = (const LV2_Worker_Interface*)extension_data(
450                         LV2_WORKER__interface);
451         }
452         lilv_node_free(worker_iface_uri);
453
454
455 #ifdef HAVE_LV2_1_2_0
456         LilvNode* options_iface_uri = lilv_new_uri(_world.world, LV2_OPTIONS__interface);
457         if (lilv_plugin_has_extension_data(plugin, options_iface_uri)) {
458                 _impl->opts_iface = (const LV2_Options_Interface*)extension_data(
459                         LV2_OPTIONS__interface);
460         }
461         lilv_node_free(options_iface_uri);
462 #endif
463
464         if (lilv_plugin_has_feature(plugin, _world.lv2_inPlaceBroken)) {
465                 error << string_compose(
466                     _("LV2: \"%1\" cannot be used, since it cannot do inplace processing."),
467                     lilv_node_as_string(_impl->name)) << endmsg;
468                 lilv_node_free(_impl->name);
469                 lilv_node_free(_impl->author);
470                 throw failed_constructor();
471         }
472
473 #ifdef HAVE_LV2_1_2_0
474         LilvNodes *required_features = lilv_plugin_get_required_features (plugin);
475         if (lilv_nodes_contains (required_features, _world.bufz_powerOf2BlockLength) ||
476                         lilv_nodes_contains (required_features, _world.bufz_fixedBlockLength)
477            ) {
478                 error << string_compose(
479                     _("LV2: \"%1\" buffer-size requirements cannot be satisfied."),
480                     lilv_node_as_string(_impl->name)) << endmsg;
481                 lilv_node_free(_impl->name);
482                 lilv_node_free(_impl->author);
483                 lilv_nodes_free(required_features);
484                 throw failed_constructor();
485         }
486         lilv_nodes_free(required_features);
487
488         LilvNodes* optional_features = lilv_plugin_get_optional_features (plugin);
489         if (lilv_nodes_contains (optional_features, _world.lv2_noSampleAccurateCtrl)) {
490                 _no_sample_accurate_ctrl = true;
491         }
492         lilv_nodes_free(optional_features);
493 #endif
494
495 #ifdef HAVE_LILV_0_16_0
496         // Load default state
497         LilvState* state = lilv_state_new_from_world(
498                 _world.world, _uri_map.urid_map(), lilv_plugin_get_uri(_impl->plugin));
499         if (state && _has_state_interface) {
500                 lilv_state_restore(state, _impl->instance, NULL, NULL, 0, NULL);
501         }
502         lilv_state_free(state);
503 #endif
504
505         _sample_rate = rate;
506
507         const uint32_t num_ports = this->num_ports();
508         for (uint32_t i = 0; i < num_ports; ++i) {
509                 const LilvPort* port  = lilv_plugin_get_port_by_index(_impl->plugin, i);
510                 PortFlags       flags = 0;
511                 size_t          minimumSize = 0;
512
513                 if (lilv_port_is_a(_impl->plugin, port, _world.lv2_OutputPort)) {
514                         flags |= PORT_OUTPUT;
515                 } else if (lilv_port_is_a(_impl->plugin, port, _world.lv2_InputPort)) {
516                         flags |= PORT_INPUT;
517                 } else {
518                         error << string_compose(
519                                 "LV2: \"%1\" port %2 is neither input nor output",
520                                 lilv_node_as_string(_impl->name), i) << endmsg;
521                         throw failed_constructor();
522                 }
523
524                 if (lilv_port_is_a(_impl->plugin, port, _world.lv2_ControlPort)) {
525                         flags |= PORT_CONTROL;
526                 } else if (lilv_port_is_a(_impl->plugin, port, _world.lv2_AudioPort)) {
527                         flags |= PORT_AUDIO;
528                 } else if (lilv_port_is_a(_impl->plugin, port, _world.ev_EventPort)) {
529                         flags |= PORT_EVENT;
530                         flags |= PORT_MIDI;  // We assume old event API ports are for MIDI
531                 } else if (lilv_port_is_a(_impl->plugin, port, _world.atom_AtomPort)) {
532                         LilvNodes* buffer_types = lilv_port_get_value(
533                                 _impl->plugin, port, _world.atom_bufferType);
534                         LilvNodes* atom_supports = lilv_port_get_value(
535                                 _impl->plugin, port, _world.atom_supports);
536
537                         if (lilv_nodes_contains(buffer_types, _world.atom_Sequence)) {
538                                 flags |= PORT_SEQUENCE;
539                                 if (lilv_nodes_contains(atom_supports, _world.midi_MidiEvent)) {
540                                         flags |= PORT_MIDI;
541                                 }
542                                 if (lilv_nodes_contains(atom_supports, _world.time_Position)) {
543                                         flags |= PORT_POSITION;
544                                 }
545                                 if (lilv_nodes_contains(atom_supports, _world.patch_Message)) {
546                                         flags |= PORT_PATCHMSG;
547                                         if (flags & PORT_INPUT) {
548                                                 _patch_port_in_index = i;
549                                         } else {
550                                                 _patch_port_out_index = i;
551                                         }
552                                 }
553                         }
554                         LilvNodes* min_size_v = lilv_port_get_value(_impl->plugin, port, _world.rsz_minimumSize);
555                         LilvNode* min_size = min_size_v ? lilv_nodes_get_first(min_size_v) : NULL;
556                         if (min_size && lilv_node_is_int(min_size)) {
557                                 minimumSize = lilv_node_as_int(min_size);
558                         }
559                         lilv_nodes_free(min_size_v);
560                         lilv_nodes_free(buffer_types);
561                         lilv_nodes_free(atom_supports);
562                 } else {
563                         error << string_compose(
564                                 "LV2: \"%1\" port %2 has no known data type",
565                                 lilv_node_as_string(_impl->name), i) << endmsg;
566                         throw failed_constructor();
567                 }
568
569                 _port_flags.push_back(flags);
570                 _port_minimumSize.push_back(minimumSize);
571         }
572
573         _control_data = new float[num_ports];
574         _shadow_data  = new float[num_ports];
575         _defaults     = new float[num_ports];
576         _ev_buffers   = new LV2_Evbuf*[num_ports];
577         memset(_ev_buffers, 0, sizeof(LV2_Evbuf*) * num_ports);
578
579         const bool     latent        = lilv_plugin_has_latency(plugin);
580         const uint32_t latency_index = (latent)
581                 ? lilv_plugin_get_latency_port_index(plugin)
582                 : 0;
583
584         // Build an array of pointers to special parameter buffers
585         void*** params = new void**[num_ports];
586         for (uint32_t i = 0; i < num_ports; ++i) {
587                 params[i] = NULL;
588         }
589         _impl->designated_input (LV2_TIME__beatsPerMinute, params, (void**)&_bpm_control_port);
590         _impl->designated_input (LV2_CORE__freeWheeling, params, (void**)&_freewheel_control_port);
591
592         for (uint32_t i = 0; i < num_ports; ++i) {
593                 const LilvPort* port = lilv_plugin_get_port_by_index(plugin, i);
594                 const LilvNode* sym  = lilv_port_get_symbol(plugin, port);
595
596                 // Store index in map so we can look up index by symbol
597                 _port_indices.insert(std::make_pair(lilv_node_as_string(sym), i));
598
599                 // Get range and default value if applicable
600                 if (parameter_is_control(i)) {
601                         LilvNode* def;
602                         lilv_port_get_range(plugin, port, &def, NULL, NULL);
603                         _defaults[i] = def ? lilv_node_as_float(def) : 0.0f;
604                         if (lilv_port_has_property (plugin, port, _world.lv2_sampleRate)) {
605                                 _defaults[i] *= _session.frame_rate ();
606                         }
607                         lilv_node_free(def);
608
609                         lilv_instance_connect_port(_impl->instance, i, &_control_data[i]);
610
611                         if (latent && i == latency_index) {
612                                 _latency_control_port  = &_control_data[i];
613                                 *_latency_control_port = 0;
614                         }
615
616                         if (parameter_is_input(i)) {
617                                 _shadow_data[i] = default_value(i);
618                                 if (params[i]) {
619                                         *params[i] = (void*)&_shadow_data[i];
620                                 }
621                         }
622                 } else {
623                         _defaults[i] = 0.0f;
624                 }
625         }
626
627         delete[] params;
628
629         LilvUIs* uis = lilv_plugin_get_uis(plugin);
630         if (lilv_uis_size(uis) > 0) {
631 #ifdef HAVE_SUIL
632                 // Look for embeddable UI
633                 LILV_FOREACH(uis, u, uis) {
634                         const LilvUI*   this_ui      = lilv_uis_get(uis, u);
635                         const LilvNode* this_ui_type = NULL;
636                         if (lilv_ui_is_supported(this_ui,
637                                                  suil_ui_supported,
638                                                  _world.ui_GtkUI,
639                                                  &this_ui_type)) {
640                                 // TODO: Multiple UI support
641                                 _impl->ui      = this_ui;
642                                 _impl->ui_type = this_ui_type;
643                                 break;
644                         }
645                 }
646 #else
647                 // Look for Gtk native UI
648                 LILV_FOREACH(uis, i, uis) {
649                         const LilvUI* ui = lilv_uis_get(uis, i);
650                         if (lilv_ui_is_a(ui, _world.ui_GtkUI)) {
651                                 _impl->ui      = ui;
652                                 _impl->ui_type = _world.ui_GtkUI;
653                                 break;
654                         }
655                 }
656 #endif
657
658                 // If Gtk UI is not available, try to find external UI
659                 if (!_impl->ui) {
660                         LILV_FOREACH(uis, i, uis) {
661                                 const LilvUI* ui = lilv_uis_get(uis, i);
662                                 if (lilv_ui_is_a(ui, _world.ui_externalkx)) {
663                                         _impl->ui      = ui;
664                                         _impl->ui_type = _world.ui_external;
665                                         break;
666                                 }
667                                 if (lilv_ui_is_a(ui, _world.ui_external)) {
668                                         _impl->ui      = ui;
669                                         _impl->ui_type = _world.ui_external;
670                                 }
671                         }
672                 }
673         }
674
675         load_supported_properties(_property_descriptors);
676         allocate_atom_event_buffers();
677         latency_compute_run();
678 }
679
680 int
681 LV2Plugin::set_block_size (pframes_t nframes)
682 {
683 #ifdef HAVE_LV2_1_2_0
684         if (_impl->opts_iface) {
685                 LV2_URID atom_Int = _uri_map.uri_to_id(LV2_ATOM__Int);
686                 _impl->block_length = nframes;
687                 LV2_Options_Option block_size_option = {
688                         LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id ("http://lv2plug.in/ns/ext/buf-size#nominalBlockLength"),
689                         sizeof(int32_t), atom_Int, (void*)&_impl->block_length
690                 };
691                 _impl->opts_iface->set (_impl->instance->lv2_handle, &block_size_option);
692         }
693 #endif
694         return 0;
695 }
696
697 bool
698 LV2Plugin::requires_fixed_sized_buffers () const
699 {
700         /* This controls if Ardour will split the plugin's run()
701          * on automation events in order to pass sample-accurate automation
702          * via standard control-ports.
703          *
704          * When returning true Ardour will *not* sub-divide the process-cycle.
705          * Automation events that happen between cycle-start and cycle-end will be
706          * ignored (ctrl values are interpolated to cycle-start).
707          * NB. Atom Sequences are still sample accurate.
708          *
709          * Note: This does not guarantee a fixed block-size.
710          * e.g The process cycle may be split when looping, also
711          * the period-size may change any time: see set_block_size()
712          */
713         return _no_sample_accurate_ctrl;
714 }
715
716 LV2Plugin::~LV2Plugin ()
717 {
718         DEBUG_TRACE(DEBUG::LV2, string_compose("%1 destroy\n", name()));
719
720         deactivate();
721         cleanup();
722
723         lilv_instance_free(_impl->instance);
724         lilv_state_free(_impl->state);
725         lilv_node_free(_impl->name);
726         lilv_node_free(_impl->author);
727 #ifdef HAVE_LV2_1_2_0
728         free(_impl->options);
729 #endif
730
731         free(_features);
732         free(_make_path_feature.data);
733         free(_work_schedule_feature.data);
734
735         delete _to_ui;
736         delete _from_ui;
737         delete _worker;
738
739         if (_atom_ev_buffers) {
740                 LV2_Evbuf**  b = _atom_ev_buffers;
741                 while (*b) {
742                         free(*b);
743                         b++;
744                 }
745                 free(_atom_ev_buffers);
746         }
747
748         delete [] _control_data;
749         delete [] _shadow_data;
750         delete [] _defaults;
751         delete [] _ev_buffers;
752 }
753
754 bool
755 LV2Plugin::is_external_ui() const
756 {
757         if (!_impl->ui) {
758                 return false;
759         }
760         return lilv_ui_is_a(_impl->ui, _world.ui_external) || lilv_ui_is_a(_impl->ui, _world.ui_externalkx);
761 }
762
763 bool
764 LV2Plugin::is_external_kx() const
765 {
766         if (!_impl->ui) {
767                 return false;
768         }
769         return lilv_ui_is_a(_impl->ui, _world.ui_externalkx);
770 }
771
772 bool
773 LV2Plugin::ui_is_resizable () const
774 {
775         const LilvNode* s   = lilv_ui_get_uri(_impl->ui);
776         LilvNode*       p   = lilv_new_uri(_world.world, LV2_CORE__optionalFeature);
777         LilvNode*       fs  = lilv_new_uri(_world.world, LV2_UI__fixedSize);
778         LilvNode*       nrs = lilv_new_uri(_world.world, LV2_UI__noUserResize);
779
780         LilvNodes* fs_matches = lilv_world_find_nodes(_world.world, s, p, fs);
781         LilvNodes* nrs_matches = lilv_world_find_nodes(_world.world, s, p, nrs);
782
783         lilv_nodes_free(nrs_matches);
784         lilv_nodes_free(fs_matches);
785         lilv_node_free(nrs);
786         lilv_node_free(fs);
787         lilv_node_free(p);
788
789         return !fs_matches && !nrs_matches;
790 }
791
792 string
793 LV2Plugin::unique_id() const
794 {
795         return lilv_node_as_uri(lilv_plugin_get_uri(_impl->plugin));
796 }
797
798 const char*
799 LV2Plugin::uri() const
800 {
801         return lilv_node_as_uri(lilv_plugin_get_uri(_impl->plugin));
802 }
803
804 const char*
805 LV2Plugin::label() const
806 {
807         return lilv_node_as_string(_impl->name);
808 }
809
810 const char*
811 LV2Plugin::name() const
812 {
813         return lilv_node_as_string(_impl->name);
814 }
815
816 const char*
817 LV2Plugin::maker() const
818 {
819         return _impl->author ? lilv_node_as_string (_impl->author) : "Unknown";
820 }
821
822 uint32_t
823 LV2Plugin::num_ports() const
824 {
825         return lilv_plugin_get_num_ports(_impl->plugin);
826 }
827
828 uint32_t
829 LV2Plugin::parameter_count() const
830 {
831         return lilv_plugin_get_num_ports(_impl->plugin);
832 }
833
834 float
835 LV2Plugin::default_value(uint32_t port)
836 {
837         return _defaults[port];
838 }
839
840 const char*
841 LV2Plugin::port_symbol(uint32_t index) const
842 {
843         const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, index);
844         if (!port) {
845                 error << name() << ": Invalid port index " << index << endmsg;
846         }
847
848         const LilvNode* sym = lilv_port_get_symbol(_impl->plugin, port);
849         return lilv_node_as_string(sym);
850 }
851
852 uint32_t
853 LV2Plugin::port_index (const char* symbol) const
854 {
855         const map<string, uint32_t>::const_iterator i = _port_indices.find(symbol);
856         if (i != _port_indices.end()) {
857                 return  i->second;
858         } else {
859                 warning << string_compose(_("LV2: Unknown port %1"), symbol) << endmsg;
860                 return (uint32_t)-1;
861         }
862 }
863
864 void
865 LV2Plugin::set_parameter(uint32_t which, float val)
866 {
867         DEBUG_TRACE(DEBUG::LV2, string_compose(
868                             "%1 set parameter %2 to %3\n", name(), which, val));
869
870         if (which < lilv_plugin_get_num_ports(_impl->plugin)) {
871                 if (get_parameter (which) == val) {
872                         return;
873                 }
874
875                 _shadow_data[which] = val;
876         } else {
877                 warning << string_compose(
878                     _("Illegal parameter number used with plugin \"%1\". "
879                       "This is a bug in either %2 or the LV2 plugin <%3>"),
880                     name(), PROGRAM_NAME, unique_id()) << endmsg;
881         }
882
883         Plugin::set_parameter(which, val);
884 }
885
886 float
887 LV2Plugin::get_parameter(uint32_t which) const
888 {
889         if (parameter_is_input(which)) {
890                 return (float)_shadow_data[which];
891         } else {
892                 return (float)_control_data[which];
893         }
894         return 0.0f;
895 }
896
897 std::string
898 LV2Plugin::get_docs() const
899 {
900         LilvNodes* comments = lilv_plugin_get_value(_impl->plugin, _world.rdfs_comment);
901         if (comments) {
902                 const std::string docs(lilv_node_as_string(lilv_nodes_get_first(comments)));
903                 lilv_nodes_free(comments);
904                 return docs;
905         }
906
907         return "";
908 }
909
910 std::string
911 LV2Plugin::get_parameter_docs(uint32_t which) const
912 {
913         LilvNodes* comments = lilv_port_get_value(
914                 _impl->plugin,
915                 lilv_plugin_get_port_by_index(_impl->plugin, which),
916                 _world.rdfs_comment);
917
918         if (comments) {
919                 const std::string docs(lilv_node_as_string(lilv_nodes_get_first(comments)));
920                 lilv_nodes_free(comments);
921                 return docs;
922         }
923
924         return "";
925 }
926
927 uint32_t
928 LV2Plugin::nth_parameter(uint32_t n, bool& ok) const
929 {
930         ok = false;
931         for (uint32_t c = 0, x = 0; x < lilv_plugin_get_num_ports(_impl->plugin); ++x) {
932                 if (parameter_is_control(x)) {
933                         if (c++ == n) {
934                                 ok = true;
935                                 return x;
936                         }
937                 }
938         }
939
940         return 0;
941 }
942
943 const void*
944 LV2Plugin::extension_data(const char* uri) const
945 {
946         return lilv_instance_get_extension_data(_impl->instance, uri);
947 }
948
949 const void*
950 LV2Plugin::c_plugin()
951 {
952         return _impl->plugin;
953 }
954
955 const void*
956 LV2Plugin::c_ui()
957 {
958         return (const void*)_impl->ui;
959 }
960
961 const void*
962 LV2Plugin::c_ui_type()
963 {
964         return (const void*)_impl->ui_type;
965 }
966
967 /** Directory for all plugin state. */
968 const std::string
969 LV2Plugin::plugin_dir() const
970 {
971         return Glib::build_filename(_session.plugins_dir(), _insert_id.to_s());
972 }
973
974 /** Directory for files created by the plugin (except during save). */
975 const std::string
976 LV2Plugin::scratch_dir() const
977 {
978         return Glib::build_filename(plugin_dir(), "scratch");
979 }
980
981 /** Directory for snapshots of files in the scratch directory. */
982 const std::string
983 LV2Plugin::file_dir() const
984 {
985         return Glib::build_filename(plugin_dir(), "files");
986 }
987
988 /** Directory to save state snapshot version @c num into. */
989 const std::string
990 LV2Plugin::state_dir(unsigned num) const
991 {
992         return Glib::build_filename(plugin_dir(), string_compose("state%1", num));
993 }
994
995 /** Implementation of state:makePath for files created at instantiation time.
996  * Note this is not used for files created at save time (Lilv deals with that).
997  */
998 char*
999 LV2Plugin::lv2_state_make_path(LV2_State_Make_Path_Handle handle,
1000                                const char*                path)
1001 {
1002         LV2Plugin* me = (LV2Plugin*)handle;
1003         if (me->_insert_id == PBD::ID("0")) {
1004                 warning << string_compose(
1005                         "File path \"%1\" requested but LV2 %2 has no insert ID",
1006                         path, me->name()) << endmsg;
1007                 return g_strdup(path);
1008         }
1009
1010         const std::string abs_path = Glib::build_filename(me->scratch_dir(), path);
1011         const std::string dirname  = Glib::path_get_dirname(abs_path);
1012         g_mkdir_with_parents(dirname.c_str(), 0744);
1013
1014         DEBUG_TRACE(DEBUG::LV2, string_compose("new file path %1 => %2\n",
1015                                                path, abs_path));
1016
1017         return g_strndup(abs_path.c_str(), abs_path.length());
1018 }
1019
1020 void
1021 LV2Plugin::add_state(XMLNode* root) const
1022 {
1023         assert(_insert_id != PBD::ID("0"));
1024
1025         XMLNode*    child;
1026         char        buf[32];
1027         LocaleGuard lg(X_("C"));
1028
1029         for (uint32_t i = 0; i < parameter_count(); ++i) {
1030                 if (parameter_is_input(i) && parameter_is_control(i)) {
1031                         child = new XMLNode("Port");
1032                         child->add_property("symbol", port_symbol(i));
1033                         snprintf(buf, sizeof(buf), "%+f", _shadow_data[i]);
1034                         child->add_property("value", string(buf));
1035                         root->add_child_nocopy(*child);
1036                 }
1037         }
1038
1039         if (_has_state_interface) {
1040                 // Provisionally increment state version and create directory
1041                 const std::string new_dir = state_dir(++_state_version);
1042                 g_mkdir_with_parents(new_dir.c_str(), 0744);
1043
1044                 LilvState* state = lilv_state_new_from_instance(
1045                         _impl->plugin,
1046                         _impl->instance,
1047                         _uri_map.urid_map(),
1048                         scratch_dir().c_str(),
1049                         file_dir().c_str(),
1050                         _session.externals_dir().c_str(),
1051                         new_dir.c_str(),
1052                         NULL,
1053                         const_cast<LV2Plugin*>(this),
1054                         0,
1055                         NULL);
1056
1057                 if (!_impl->state || !lilv_state_equals(state, _impl->state)) {
1058                         lilv_state_save(_world.world,
1059                                         _uri_map.urid_map(),
1060                                         _uri_map.urid_unmap(),
1061                                         state,
1062                                         NULL,
1063                                         new_dir.c_str(),
1064                                         "state.ttl");
1065
1066                         lilv_state_free(_impl->state);
1067                         _impl->state = state;
1068                 } else {
1069                         // State is identical, decrement version and nuke directory
1070                         lilv_state_free(state);
1071                         PBD::remove_directory(new_dir);
1072                         --_state_version;
1073                 }
1074
1075                 root->add_property("state-dir", string_compose("state%1", _state_version));
1076         }
1077 }
1078
1079 // TODO: Once we can rely on lilv 0.16.0, lilv_world_get can replace this
1080 static LilvNode*
1081 get_value(LilvWorld* world, const LilvNode* subject, const LilvNode* predicate)
1082 {
1083         LilvNodes* vs = lilv_world_find_nodes(world, subject, predicate, NULL);
1084         if (vs) {
1085                 LilvNode* node = lilv_node_duplicate(lilv_nodes_get_first(vs));
1086                 lilv_nodes_free(vs);
1087                 return node;
1088         }
1089         return NULL;
1090 }
1091
1092 void
1093 LV2Plugin::find_presets()
1094 {
1095         LilvNode* lv2_appliesTo = lilv_new_uri(_world.world, LV2_CORE__appliesTo);
1096         LilvNode* pset_Preset   = lilv_new_uri(_world.world, LV2_PRESETS__Preset);
1097         LilvNode* rdfs_label    = lilv_new_uri(_world.world, LILV_NS_RDFS "label");
1098
1099         LilvNodes* presets = lilv_plugin_get_related(_impl->plugin, pset_Preset);
1100         LILV_FOREACH(nodes, i, presets) {
1101                 const LilvNode* preset = lilv_nodes_get(presets, i);
1102                 lilv_world_load_resource(_world.world, preset);
1103                 LilvNode* name = get_value(_world.world, preset, rdfs_label);
1104                 if (name) {
1105                         _presets.insert(std::make_pair(lilv_node_as_string(preset),
1106                                                        Plugin::PresetRecord(
1107                                                                lilv_node_as_string(preset),
1108                                                                lilv_node_as_string(name))));
1109                         lilv_node_free(name);
1110                 } else {
1111                         warning << string_compose(
1112                             _("Plugin \"%1\" preset \"%2\" is missing a label\n"),
1113                             lilv_node_as_string(lilv_plugin_get_uri(_impl->plugin)),
1114                             lilv_node_as_string(preset)) << endmsg;
1115                 }
1116         }
1117         lilv_nodes_free(presets);
1118
1119         lilv_node_free(rdfs_label);
1120         lilv_node_free(pset_Preset);
1121         lilv_node_free(lv2_appliesTo);
1122 }
1123
1124 static void
1125 set_port_value(const char* port_symbol,
1126                void*       user_data,
1127                const void* value,
1128                uint32_t    /*size*/,
1129                uint32_t    type)
1130 {
1131         LV2Plugin* self = (LV2Plugin*)user_data;
1132         if (type != 0 && type != URIMap::instance().urids.atom_Float) {
1133                 return;  // TODO: Support non-float ports
1134         }
1135
1136         const uint32_t port_index = self->port_index(port_symbol);
1137         if (port_index != (uint32_t)-1) {
1138                 self->set_parameter(port_index, *(const float*)value);
1139         }
1140 }
1141
1142 bool
1143 LV2Plugin::load_preset(PresetRecord r)
1144 {
1145         LilvWorld* world = _world.world;
1146         LilvNode*  pset  = lilv_new_uri(world, r.uri.c_str());
1147         LilvState* state = lilv_state_new_from_world(world, _uri_map.urid_map(), pset);
1148
1149         if (state) {
1150                 lilv_state_restore(state, _impl->instance, set_port_value, this, 0, NULL);
1151                 lilv_state_free(state);
1152                 Plugin::load_preset(r);
1153         }
1154
1155         lilv_node_free(pset);
1156         return state;
1157 }
1158
1159 const void*
1160 ARDOUR::lv2plugin_get_port_value(const char* port_symbol,
1161                                  void*       user_data,
1162                                  uint32_t*   size,
1163                                  uint32_t*   type)
1164 {
1165         LV2Plugin *plugin = (LV2Plugin *) user_data;
1166
1167         uint32_t index = plugin->port_index(port_symbol);
1168         if (index != (uint32_t) -1) {
1169                 if (plugin->parameter_is_input(index) && plugin->parameter_is_control(index)) {
1170                         float *value;
1171                         *size = sizeof(float);
1172                         *type = plugin->_uri_map.uri_to_id(LV2_ATOM__Float);
1173                         value = &plugin->_shadow_data[index];
1174
1175                         return value;
1176                 }
1177         }
1178
1179         *size = *type = 0;
1180         return NULL;
1181 }
1182
1183
1184 std::string
1185 LV2Plugin::do_save_preset(string name)
1186 {
1187         LilvNode*    plug_name = lilv_plugin_get_name(_impl->plugin);
1188         const string prefix    = legalize_for_uri(lilv_node_as_string(plug_name));
1189         const string base_name = legalize_for_uri(name);
1190         const string file_name = base_name + ".ttl";
1191         const string bundle    = Glib::build_filename(
1192                 Glib::get_home_dir(),
1193                 Glib::build_filename(".lv2", prefix + "_" + base_name + ".lv2"));
1194
1195 #ifdef HAVE_LILV_0_21_3
1196         /* delete reference to old preset (if any) */
1197         const PresetRecord* r = preset_by_label(name);
1198         if (r) {
1199                 LilvNode*  pset  = lilv_new_uri (_world.world, r->uri.c_str());
1200                 if (pset) {
1201                         lilv_world_unload_resource (_world.world, pset);
1202                         lilv_node_free(pset);
1203                 }
1204         }
1205 #endif
1206
1207         LilvState* state = lilv_state_new_from_instance(
1208                 _impl->plugin,
1209                 _impl->instance,
1210                 _uri_map.urid_map(),
1211                 scratch_dir().c_str(),                   // file_dir
1212                 bundle.c_str(),                          // copy_dir
1213                 bundle.c_str(),                          // link_dir
1214                 bundle.c_str(),                          // save_dir
1215                 lv2plugin_get_port_value,                // get_value
1216                 (void*)this,                             // user_data
1217                 LV2_STATE_IS_POD|LV2_STATE_IS_PORTABLE,  // flags
1218                 _features                                // features
1219         );
1220
1221         lilv_state_set_label(state, name.c_str());
1222         lilv_state_save(
1223                 _world.world,           // world
1224                 _uri_map.urid_map(),    // map
1225                 _uri_map.urid_unmap(),  // unmap
1226                 state,                  // state
1227                 NULL,                   // uri (NULL = use file URI)
1228                 bundle.c_str(),         // dir
1229                 file_name.c_str()       // filename
1230         );
1231
1232         lilv_state_free(state);
1233
1234         std::string uri = Glib::filename_to_uri(Glib::build_filename(bundle, file_name));
1235         LilvNode *node_bundle = lilv_new_uri(_world.world, Glib::filename_to_uri(Glib::build_filename(bundle, "/")).c_str());
1236         LilvNode *node_preset = lilv_new_uri(_world.world, uri.c_str());
1237 #ifdef HAVE_LILV_0_21_3
1238         lilv_world_unload_resource(_world.world, node_preset);
1239         lilv_world_unload_bundle(_world.world, node_bundle);
1240 #endif
1241         lilv_world_load_bundle(_world.world, node_bundle);
1242         lilv_world_load_resource(_world.world, node_preset);
1243         lilv_node_free(node_bundle);
1244         lilv_node_free(node_preset);
1245         lilv_node_free(plug_name);
1246         return uri;
1247 }
1248
1249 void
1250 LV2Plugin::do_remove_preset(string name)
1251 {
1252 #ifdef HAVE_LILV_0_21_3
1253         /* Look up preset record by label (FIXME: ick, label as ID) */
1254         const PresetRecord* r = preset_by_label(name);
1255         if (!r) {
1256                 return;
1257         }
1258
1259         /* Load a LilvState for the preset. */
1260         LilvWorld* world = _world.world;
1261         LilvNode*  pset  = lilv_new_uri(world, r->uri.c_str());
1262         LilvState* state = lilv_state_new_from_world(world, _uri_map.urid_map(), pset);
1263         if (!state) {
1264                 lilv_node_free(pset);
1265                 return;
1266         }
1267
1268         /* Unload preset from world. */
1269         lilv_world_unload_resource(world, pset);
1270
1271         /* Delete it from the file system.  This will remove the preset file and the entry
1272            from the manifest.  If this results in an empty manifest (i.e. the
1273            preset is the only thing in the bundle), then the bundle is removed. */
1274         lilv_state_delete(world, state);
1275
1276         lilv_state_free(state);
1277         lilv_node_free(pset);
1278 #endif
1279         /* Without lilv_state_delete(), we could delete the preset file, but this
1280            would leave a broken bundle/manifest around, so the preset would still
1281            be visible, but broken.  Naively deleting a bundle is too dangerous, so
1282            we simply do not support preset deletion with older Lilv */
1283 }
1284
1285 bool
1286 LV2Plugin::has_editor() const
1287 {
1288         return _impl->ui != NULL;
1289 }
1290
1291 bool
1292 LV2Plugin::has_message_output() const
1293 {
1294         for (uint32_t i = 0; i < num_ports(); ++i) {
1295                 if ((_port_flags[i] & PORT_SEQUENCE) &&
1296                     (_port_flags[i] & PORT_OUTPUT)) {
1297                         return true;
1298                 }
1299         }
1300         return false;
1301 }
1302
1303 bool
1304 LV2Plugin::write_to(RingBuffer<uint8_t>* dest,
1305                     uint32_t             index,
1306                     uint32_t             protocol,
1307                     uint32_t             size,
1308                     const uint8_t*       body)
1309 {
1310         const uint32_t  buf_size = sizeof(UIMessage) + size;
1311         vector<uint8_t> buf(buf_size);
1312
1313         UIMessage* msg = (UIMessage*)&buf[0];
1314         msg->index    = index;
1315         msg->protocol = protocol;
1316         msg->size     = size;
1317         memcpy(msg + 1, body, size);
1318
1319         return (dest->write(&buf[0], buf_size) == buf_size);
1320 }
1321
1322 bool
1323 LV2Plugin::write_from_ui(uint32_t       index,
1324                          uint32_t       protocol,
1325                          uint32_t       size,
1326                          const uint8_t* body)
1327 {
1328         if (!_from_ui) {
1329                 size_t rbs = _session.engine().raw_buffer_size(DataType::MIDI) * NBUFS;
1330                 /* buffer data communication from plugin UI to plugin instance.
1331                  * this buffer needs to potentially hold
1332                  *   (port's minimumSize) * (audio-periods) / (UI-periods)
1333                  * bytes.
1334                  *
1335                  *  e.g 48kSPS / 128fpp -> audio-periods = 375 Hz
1336                  *  ui-periods = 25 Hz (SuperRapidScreenUpdate)
1337                  *  default minimumSize = 32K (see LV2Plugin::allocate_atom_event_buffers()
1338                  *
1339                  * it is NOT safe to overflow (msg.size will be misinterpreted)
1340                  */
1341                 uint32_t bufsiz = 32768;
1342                 if (_atom_ev_buffers && _atom_ev_buffers[0]) {
1343                         bufsiz =  lv2_evbuf_get_capacity(_atom_ev_buffers[0]);
1344                 }
1345                 rbs = max((size_t) bufsiz * 8, rbs);
1346                 _from_ui = new RingBuffer<uint8_t>(rbs);
1347         }
1348
1349         if (!write_to(_from_ui, index, protocol, size, body)) {
1350                 error << "Error writing from UI to plugin" << endmsg;
1351                 return false;
1352         }
1353         return true;
1354 }
1355
1356 bool
1357 LV2Plugin::write_to_ui(uint32_t       index,
1358                        uint32_t       protocol,
1359                        uint32_t       size,
1360                        const uint8_t* body)
1361 {
1362         if (!write_to(_to_ui, index, protocol, size, body)) {
1363                 error << "Error writing from plugin to UI" << endmsg;
1364                 return false;
1365         }
1366         return true;
1367 }
1368
1369 static void
1370 forge_variant(LV2_Atom_Forge* forge, const Variant& value)
1371 {
1372         switch (value.type()) {
1373         case Variant::NOTHING:
1374                 break;
1375         case Variant::BEATS:
1376                 // No atom type for this, just forge a double
1377                 lv2_atom_forge_double(forge, value.get_beats().to_double());
1378                 break;
1379         case Variant::BOOL:
1380                 lv2_atom_forge_bool(forge, value.get_bool());
1381                 break;
1382         case Variant::DOUBLE:
1383                 lv2_atom_forge_double(forge, value.get_double());
1384                 break;
1385         case Variant::FLOAT:
1386                 lv2_atom_forge_float(forge, value.get_float());
1387                 break;
1388         case Variant::INT:
1389                 lv2_atom_forge_int(forge, value.get_int());
1390                 break;
1391         case Variant::LONG:
1392                 lv2_atom_forge_long(forge, value.get_long());
1393                 break;
1394         case Variant::PATH:
1395                 lv2_atom_forge_path(
1396                         forge, value.get_path().c_str(), value.get_path().size());
1397                 break;
1398         case Variant::STRING:
1399                 lv2_atom_forge_string(
1400                         forge, value.get_string().c_str(), value.get_string().size());
1401                 break;
1402         case Variant::URI:
1403                 lv2_atom_forge_uri(
1404                         forge, value.get_uri().c_str(), value.get_uri().size());
1405                 break;
1406         }
1407 }
1408
1409 /** Get a variant type from a URI, return false iff no match found. */
1410 static bool
1411 uri_to_variant_type(const std::string& uri, Variant::Type& type)
1412 {
1413         if (uri == LV2_ATOM__Bool) {
1414                 type = Variant::BOOL;
1415         } else if (uri == LV2_ATOM__Double) {
1416                 type = Variant::DOUBLE;
1417         } else if (uri == LV2_ATOM__Float) {
1418                 type = Variant::FLOAT;
1419         } else if (uri == LV2_ATOM__Int) {
1420                 type = Variant::INT;
1421         } else if (uri == LV2_ATOM__Long) {
1422                 type = Variant::LONG;
1423         } else if (uri == LV2_ATOM__Path) {
1424                 type = Variant::PATH;
1425         } else if (uri == LV2_ATOM__String) {
1426                 type = Variant::STRING;
1427         } else if (uri == LV2_ATOM__URI) {
1428                 type = Variant::URI;
1429         } else {
1430                 return false;
1431         }
1432         return true;
1433 }
1434
1435 void
1436 LV2Plugin::set_property(uint32_t key, const Variant& value)
1437 {
1438         if (_patch_port_in_index == (uint32_t)-1) {
1439                 error << "LV2: set_property called with unset patch_port_in_index" << endmsg;
1440                 return;
1441         } else if (value.type() == Variant::NOTHING) {
1442                 error << "LV2: set_property called with void value" << endmsg;
1443                 return;
1444         }
1445
1446         // Set up forge to write to temporary buffer on the stack
1447         LV2_Atom_Forge*      forge = &_impl->ui_forge;
1448         LV2_Atom_Forge_Frame frame;
1449         uint8_t              buf[PATH_MAX];  // Ought to be enough for anyone...
1450
1451         lv2_atom_forge_set_buffer(forge, buf, sizeof(buf));
1452
1453         // Serialize patch:Set message to set property
1454 #ifdef HAVE_LV2_1_10_0
1455         lv2_atom_forge_object(forge, &frame, 1, _uri_map.urids.patch_Set);
1456         lv2_atom_forge_key(forge, _uri_map.urids.patch_property);
1457         lv2_atom_forge_urid(forge, key);
1458         lv2_atom_forge_key(forge, _uri_map.urids.patch_value);
1459 #else
1460         lv2_atom_forge_blank(forge, &frame, 1, _uri_map.urids.patch_Set);
1461         lv2_atom_forge_property_head(forge, _uri_map.urids.patch_property, 0);
1462         lv2_atom_forge_urid(forge, key);
1463         lv2_atom_forge_property_head(forge, _uri_map.urids.patch_value, 0);
1464 #endif
1465
1466         forge_variant(forge, value);
1467
1468         // Write message to UI=>Plugin ring
1469         const LV2_Atom* const atom = (const LV2_Atom*)buf;
1470         write_from_ui(_patch_port_in_index,
1471                       _uri_map.urids.atom_eventTransfer,
1472                       lv2_atom_total_size(atom),
1473                       (const uint8_t*)atom);
1474 }
1475
1476 const ParameterDescriptor&
1477 LV2Plugin::get_property_descriptor(uint32_t id) const
1478 {
1479         PropertyDescriptors::const_iterator p = _property_descriptors.find(id);
1480         if (p != _property_descriptors.end()) {
1481                 return p->second;
1482         }
1483         return Plugin::get_property_descriptor(id);
1484 }
1485
1486 static void
1487 load_parameter_descriptor_units(LilvWorld* lworld, ParameterDescriptor& desc, const LilvNodes* units)
1488 {
1489         if (lilv_nodes_contains(units, _world.units_midiNote)) {
1490                 desc.unit = ParameterDescriptor::MIDI_NOTE;
1491         } else if (lilv_nodes_contains(units, _world.units_db)) {
1492                 desc.unit = ParameterDescriptor::DB;
1493         } else if (lilv_nodes_contains(units, _world.units_hz)) {
1494                 desc.unit = ParameterDescriptor::HZ;
1495         }
1496         if (lilv_nodes_size(units) > 0) {
1497                 const LilvNode* unit = lilv_nodes_get_first(units);
1498                 LilvNode* render = get_value(lworld, unit, _world.units_render);
1499                 if (render) {
1500                         desc.print_fmt = lilv_node_as_string(render);
1501                         lilv_node_free(render);
1502                 }
1503         }
1504 }
1505
1506 static void
1507 load_parameter_descriptor(LV2World&            world,
1508                           ParameterDescriptor& desc,
1509                           Variant::Type        datatype,
1510                           const LilvNode*      subject)
1511 {
1512         LilvWorld* lworld  = _world.world;
1513         LilvNode*  label   = get_value(lworld, subject, _world.rdfs_label);
1514         LilvNode*  def     = get_value(lworld, subject, _world.lv2_default);
1515         LilvNode*  minimum = get_value(lworld, subject, _world.lv2_minimum);
1516         LilvNode*  maximum = get_value(lworld, subject, _world.lv2_maximum);
1517         LilvNodes* units   = lilv_world_find_nodes(lworld, subject, _world.units_unit, NULL);
1518         if (label) {
1519                 desc.label = lilv_node_as_string(label);
1520         }
1521         if (def && lilv_node_is_float(def)) {
1522                 desc.normal = lilv_node_as_float(def);
1523         }
1524         if (minimum && lilv_node_is_float(minimum)) {
1525                 desc.lower = lilv_node_as_float(minimum);
1526         }
1527         if (maximum && lilv_node_is_float(maximum)) {
1528                 desc.upper = lilv_node_as_float(maximum);
1529         }
1530         load_parameter_descriptor_units(lworld, desc, units);
1531         desc.datatype      = datatype;
1532         desc.toggled      |= datatype == Variant::BOOL;
1533         desc.integer_step |= datatype == Variant::INT || datatype == Variant::LONG;
1534         desc.update_steps();
1535
1536         lilv_nodes_free(units);
1537         lilv_node_free(label);
1538         lilv_node_free(def);
1539         lilv_node_free(minimum);
1540         lilv_node_free(maximum);
1541 }
1542
1543 void
1544 LV2Plugin::load_supported_properties(PropertyDescriptors& descs)
1545 {
1546         LilvWorld*       lworld     = _world.world;
1547         const LilvNode*  subject    = lilv_plugin_get_uri(_impl->plugin);
1548         LilvNodes*       properties = lilv_world_find_nodes(
1549                 lworld, subject, _world.patch_writable, NULL);
1550         LILV_FOREACH(nodes, p, properties) {
1551                 // Get label and range
1552                 const LilvNode* prop  = lilv_nodes_get(properties, p);
1553                 LilvNode*       range = get_value(lworld, prop, _world.rdfs_range);
1554                 if (!range) {
1555                         warning << string_compose(_("LV2: property <%1> has no range datatype, ignoring"),
1556                                                   lilv_node_as_uri(prop)) << endmsg;
1557                         continue;
1558                 }
1559
1560                 // Convert range to variant type (TODO: support for multiple range types)
1561                 Variant::Type datatype;
1562                 if (!uri_to_variant_type(lilv_node_as_uri(range), datatype)) {
1563                         error << string_compose(_("LV2: property <%1> has unsupported datatype <%1>"),
1564                                                 lilv_node_as_uri(prop), lilv_node_as_uri(range)) << endmsg;
1565                         continue;
1566                 }
1567
1568                 // Add description to result
1569                 ParameterDescriptor desc;
1570                 desc.key      = _uri_map.uri_to_id(lilv_node_as_uri(prop));
1571                 desc.datatype = datatype;
1572                 load_parameter_descriptor(_world, desc, datatype, prop);
1573                 descs.insert(std::make_pair(desc.key, desc));
1574
1575                 lilv_node_free(range);
1576         }
1577         lilv_nodes_free(properties);
1578 }
1579
1580 void
1581 LV2Plugin::announce_property_values()
1582 {
1583         if (_patch_port_in_index == (uint32_t)-1) {
1584                 return;
1585         }
1586
1587         // Set up forge to write to temporary buffer on the stack
1588         LV2_Atom_Forge*      forge = &_impl->ui_forge;
1589         LV2_Atom_Forge_Frame frame;
1590         uint8_t              buf[PATH_MAX];  // Ought to be enough for anyone...
1591
1592         lv2_atom_forge_set_buffer(forge, buf, sizeof(buf));
1593
1594         // Serialize patch:Get message with no subject (implicitly plugin instance)
1595 #ifdef HAVE_LV2_1_10_0
1596         lv2_atom_forge_object(forge, &frame, 1, _uri_map.urids.patch_Get);
1597 #else
1598         lv2_atom_forge_blank(forge, &frame, 1, _uri_map.urids.patch_Get);
1599 #endif
1600
1601         // Write message to UI=>Plugin ring
1602         const LV2_Atom* const atom = (const LV2_Atom*)buf;
1603         write_from_ui(_patch_port_in_index,
1604                       _uri_map.urids.atom_eventTransfer,
1605                       lv2_atom_total_size(atom),
1606                       (const uint8_t*)atom);
1607 }
1608
1609 void
1610 LV2Plugin::enable_ui_emission()
1611 {
1612         if (!_to_ui) {
1613                 /* see note in LV2Plugin::write_from_ui() */
1614                 uint32_t bufsiz = 32768;
1615                 if (_atom_ev_buffers && _atom_ev_buffers[0]) {
1616                         bufsiz =  lv2_evbuf_get_capacity(_atom_ev_buffers[0]);
1617                 }
1618                 size_t rbs = _session.engine().raw_buffer_size(DataType::MIDI) * NBUFS;
1619                 rbs = max((size_t) bufsiz * 8, rbs);
1620                 _to_ui = new RingBuffer<uint8_t>(rbs);
1621         }
1622 }
1623
1624 void
1625 LV2Plugin::emit_to_ui(void* controller, UIMessageSink sink)
1626 {
1627         if (!_to_ui) {
1628                 return;
1629         }
1630
1631         uint32_t read_space = _to_ui->read_space();
1632         while (read_space > sizeof(UIMessage)) {
1633                 UIMessage msg;
1634                 if (_to_ui->read((uint8_t*)&msg, sizeof(msg)) != sizeof(msg)) {
1635                         error << "Error reading from Plugin=>UI RingBuffer" << endmsg;
1636                         break;
1637                 }
1638                 vector<uint8_t> body(msg.size);
1639                 if (_to_ui->read(&body[0], msg.size) != msg.size) {
1640                         error << "Error reading from Plugin=>UI RingBuffer" << endmsg;
1641                         break;
1642                 }
1643
1644                 sink(controller, msg.index, msg.size, msg.protocol, &body[0]);
1645
1646                 read_space -= sizeof(msg) + msg.size;
1647         }
1648 }
1649
1650 int
1651 LV2Plugin::work(uint32_t size, const void* data)
1652 {
1653         return _impl->work_iface->work(
1654                 _impl->instance->lv2_handle, work_respond, this, size, data);
1655 }
1656
1657 int
1658 LV2Plugin::work_response(uint32_t size, const void* data)
1659 {
1660         return _impl->work_iface->work_response(
1661                 _impl->instance->lv2_handle, size, data);
1662 }
1663
1664 void
1665 LV2Plugin::set_insert_id(PBD::ID id)
1666 {
1667         _insert_id = id;
1668 }
1669
1670 int
1671 LV2Plugin::set_state(const XMLNode& node, int version)
1672 {
1673         XMLNodeList          nodes;
1674         const XMLProperty*   prop;
1675         XMLNodeConstIterator iter;
1676         XMLNode*             child;
1677         const char*          sym;
1678         const char*          value;
1679         uint32_t             port_id;
1680         LocaleGuard          lg(X_("C"));
1681
1682         if (node.name() != state_node_name()) {
1683                 error << _("Bad node sent to LV2Plugin::set_state") << endmsg;
1684                 return -1;
1685         }
1686
1687 #ifndef NO_PLUGIN_STATE
1688
1689         if (version < 3000) {
1690                 nodes = node.children("port");
1691         } else {
1692                 nodes = node.children("Port");
1693         }
1694
1695         for (iter = nodes.begin(); iter != nodes.end(); ++iter) {
1696
1697                 child = *iter;
1698
1699                 if ((prop = child->property("symbol")) != 0) {
1700                         sym = prop->value().c_str();
1701                 } else {
1702                         warning << _("LV2: port has no symbol, ignored") << endmsg;
1703                         continue;
1704                 }
1705
1706                 map<string, uint32_t>::iterator i = _port_indices.find(sym);
1707
1708                 if (i != _port_indices.end()) {
1709                         port_id = i->second;
1710                 } else {
1711                         warning << _("LV2: port has unknown index, ignored") << endmsg;
1712                         continue;
1713                 }
1714
1715                 if ((prop = child->property("value")) != 0) {
1716                         value = prop->value().c_str();
1717                 } else {
1718                         warning << _("LV2: port has no value, ignored") << endmsg;
1719                         continue;
1720                 }
1721
1722                 set_parameter(port_id, atof(value));
1723         }
1724
1725         _state_version = 0;
1726         if ((prop = node.property("state-dir")) != 0) {
1727                 if (sscanf(prop->value().c_str(), "state%u", &_state_version) != 1) {
1728                         error << string_compose(
1729                                 "LV2: failed to parse state version from \"%1\"",
1730                                 prop->value()) << endmsg;
1731                 }
1732
1733                 std::string state_file = Glib::build_filename(
1734                         plugin_dir(),
1735                         Glib::build_filename(prop->value(), "state.ttl"));
1736
1737                 LilvState* state = lilv_state_new_from_file(
1738                         _world.world, _uri_map.urid_map(), NULL, state_file.c_str());
1739
1740                 lilv_state_restore(state, _impl->instance, NULL, NULL, 0, NULL);
1741                 lilv_state_free(_impl->state);
1742                 _impl->state = state;
1743         }
1744
1745         latency_compute_run();
1746 #endif
1747
1748         return Plugin::set_state(node, version);
1749 }
1750
1751 int
1752 LV2Plugin::get_parameter_descriptor(uint32_t which, ParameterDescriptor& desc) const
1753 {
1754         const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, which);
1755         if (!port) {
1756                 error << string_compose("LV2: get descriptor of non-existent port %1", which)
1757                       << endmsg;
1758                 return 1;
1759         }
1760
1761         LilvNodes* portunits;
1762         LilvNode *def, *min, *max;
1763         lilv_port_get_range(_impl->plugin, port, &def, &min, &max);
1764         portunits = lilv_port_get_value(_impl->plugin, port, _world.units_unit);
1765
1766         // TODO: Once we can rely on lilv 0.18.0 being present,
1767         // load_parameter_descriptor() can be used for ports as well
1768         desc.integer_step = lilv_port_has_property(_impl->plugin, port, _world.lv2_integer);
1769         desc.toggled      = lilv_port_has_property(_impl->plugin, port, _world.lv2_toggled);
1770         desc.logarithmic  = lilv_port_has_property(_impl->plugin, port, _world.ext_logarithmic);
1771         desc.sr_dependent = lilv_port_has_property(_impl->plugin, port, _world.lv2_sampleRate);
1772         desc.label        = lilv_node_as_string(lilv_port_get_name(_impl->plugin, port));
1773         desc.normal       = def ? lilv_node_as_float(def) : 0.0f;
1774         desc.lower        = min ? lilv_node_as_float(min) : 0.0f;
1775         desc.upper        = max ? lilv_node_as_float(max) : 1.0f;
1776         load_parameter_descriptor_units(_world.world, desc, portunits);
1777
1778         if (desc.sr_dependent) {
1779                 desc.lower *= _session.frame_rate ();
1780                 desc.upper *= _session.frame_rate ();
1781         }
1782
1783         desc.min_unbound  = false; // TODO: LV2 extension required
1784         desc.max_unbound  = false; // TODO: LV2 extension required
1785
1786         desc.enumeration = lilv_port_has_property(_impl->plugin, port, _world.lv2_enumeration);
1787         desc.scale_points = get_scale_points(which);
1788
1789         desc.update_steps();
1790
1791         lilv_node_free(def);
1792         lilv_node_free(min);
1793         lilv_node_free(max);
1794         lilv_nodes_free(portunits);
1795
1796         return 0;
1797 }
1798
1799 string
1800 LV2Plugin::describe_parameter(Evoral::Parameter which)
1801 {
1802         if (( which.type() == PluginAutomation) && ( which.id() < parameter_count()) ) {
1803
1804                 if (lilv_port_has_property(_impl->plugin,
1805                                         lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.ext_notOnGUI)) {
1806                         return X_("hidden");
1807                 }
1808
1809                 if (lilv_port_has_property(_impl->plugin,
1810                                         lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.lv2_freewheeling)) {
1811                         return X_("hidden");
1812                 }
1813
1814                 if (lilv_port_has_property(_impl->plugin,
1815                                         lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.lv2_reportsLatency)) {
1816                         return X_("latency");
1817                 }
1818
1819                 LilvNode* name = lilv_port_get_name(_impl->plugin,
1820                                                     lilv_plugin_get_port_by_index(_impl->plugin, which.id()));
1821                 string ret(lilv_node_as_string(name));
1822                 lilv_node_free(name);
1823                 return ret;
1824         } else {
1825                 return "??";
1826         }
1827 }
1828
1829 framecnt_t
1830 LV2Plugin::signal_latency() const
1831 {
1832         if (_latency_control_port) {
1833                 return (framecnt_t)floor(*_latency_control_port);
1834         } else {
1835                 return 0;
1836         }
1837 }
1838
1839 set<Evoral::Parameter>
1840 LV2Plugin::automatable() const
1841 {
1842         set<Evoral::Parameter> ret;
1843
1844         for (uint32_t i = 0; i < parameter_count(); ++i) {
1845                 if (parameter_is_input(i) && parameter_is_control(i)) {
1846                         ret.insert(ret.end(), Evoral::Parameter(PluginAutomation, 0, i));
1847                 }
1848         }
1849
1850         for (PropertyDescriptors::const_iterator p = _property_descriptors.begin();
1851              p != _property_descriptors.end();
1852              ++p) {
1853                 ret.insert(ret.end(), Evoral::Parameter(PluginPropertyAutomation, 0, p->first));
1854         }
1855         return ret;
1856 }
1857
1858 void
1859 LV2Plugin::activate()
1860 {
1861         DEBUG_TRACE(DEBUG::LV2, string_compose("%1 activate\n", name()));
1862
1863         if (!_was_activated) {
1864                 lilv_instance_activate(_impl->instance);
1865                 _was_activated = true;
1866         }
1867 }
1868
1869 void
1870 LV2Plugin::deactivate()
1871 {
1872         DEBUG_TRACE(DEBUG::LV2, string_compose("%1 deactivate\n", name()));
1873
1874         if (_was_activated) {
1875                 lilv_instance_deactivate(_impl->instance);
1876                 _was_activated = false;
1877         }
1878 }
1879
1880 void
1881 LV2Plugin::cleanup()
1882 {
1883         DEBUG_TRACE(DEBUG::LV2, string_compose("%1 cleanup\n", name()));
1884
1885         activate();
1886         deactivate();
1887         lilv_instance_free(_impl->instance);
1888         _impl->instance = NULL;
1889 }
1890
1891 void
1892 LV2Plugin::allocate_atom_event_buffers()
1893 {
1894         /* reserve local scratch buffers for ATOM event-queues */
1895         const LilvPlugin* p = _impl->plugin;
1896
1897         /* count non-MIDI atom event-ports
1898          * TODO: nicely ask drobilla to make a lilv_ call for that
1899          */
1900         int count_atom_out = 0;
1901         int count_atom_in = 0;
1902         int minimumSize = 32768; // TODO use a per-port minimum-size
1903         for (uint32_t i = 0; i < lilv_plugin_get_num_ports(p); ++i) {
1904                 const LilvPort* port  = lilv_plugin_get_port_by_index(p, i);
1905                 if (lilv_port_is_a(p, port, _world.atom_AtomPort)) {
1906                         LilvNodes* buffer_types = lilv_port_get_value(
1907                                 p, port, _world.atom_bufferType);
1908                         LilvNodes* atom_supports = lilv_port_get_value(
1909                                 p, port, _world.atom_supports);
1910
1911                         if (!lilv_nodes_contains(buffer_types, _world.atom_Sequence)
1912                                         || !lilv_nodes_contains(atom_supports, _world.midi_MidiEvent)) {
1913                                 if (lilv_port_is_a(p, port, _world.lv2_InputPort)) {
1914                                         count_atom_in++;
1915                                 }
1916                                 if (lilv_port_is_a(p, port, _world.lv2_OutputPort)) {
1917                                         count_atom_out++;
1918                                 }
1919                                 LilvNodes* min_size_v = lilv_port_get_value(_impl->plugin, port, _world.rsz_minimumSize);
1920                                 LilvNode* min_size = min_size_v ? lilv_nodes_get_first(min_size_v) : NULL;
1921                                 if (min_size && lilv_node_is_int(min_size)) {
1922                                         minimumSize = std::max(minimumSize, lilv_node_as_int(min_size));
1923                                 }
1924                                 lilv_nodes_free(min_size_v);
1925                         }
1926                         lilv_nodes_free(buffer_types);
1927                         lilv_nodes_free(atom_supports);
1928                 }
1929         }
1930
1931         DEBUG_TRACE(DEBUG::LV2, string_compose("%1 need buffers for %2 atom-in and %3 atom-out event-ports\n",
1932                                 name(), count_atom_in, count_atom_out));
1933
1934         const int total_atom_buffers = (count_atom_in + count_atom_out);
1935         if (_atom_ev_buffers || total_atom_buffers == 0) {
1936                 return;
1937         }
1938
1939         DEBUG_TRACE(DEBUG::LV2, string_compose("allocate %1 atom_ev_buffers of %d bytes\n", total_atom_buffers, minimumSize));
1940         _atom_ev_buffers = (LV2_Evbuf**) malloc((total_atom_buffers + 1) * sizeof(LV2_Evbuf*));
1941         for (int i = 0; i < total_atom_buffers; ++i ) {
1942                 _atom_ev_buffers[i] = lv2_evbuf_new(minimumSize, LV2_EVBUF_ATOM,
1943                                 _uri_map.urids.atom_Chunk, _uri_map.urids.atom_Sequence);
1944         }
1945         _atom_ev_buffers[total_atom_buffers] = 0;
1946         return;
1947 }
1948
1949 /** Write an ardour position/time/tempo/meter as an LV2 event.
1950  * @return true on success.
1951  */
1952 static bool
1953 write_position(LV2_Atom_Forge*     forge,
1954                LV2_Evbuf*          buf,
1955                const TempoMetric&  t,
1956                Timecode::BBT_Time& bbt,
1957                double              speed,
1958                framepos_t          position,
1959                framecnt_t          offset)
1960 {
1961         const URIMap::URIDs& urids = URIMap::instance().urids;
1962
1963         uint8_t pos_buf[256];
1964         lv2_atom_forge_set_buffer(forge, pos_buf, sizeof(pos_buf));
1965         LV2_Atom_Forge_Frame frame;
1966 #ifdef HAVE_LV2_1_10_0
1967         lv2_atom_forge_object(forge, &frame, 1, urids.time_Position);
1968         lv2_atom_forge_key(forge, urids.time_frame);
1969         lv2_atom_forge_long(forge, position);
1970         lv2_atom_forge_key(forge, urids.time_speed);
1971         lv2_atom_forge_float(forge, speed);
1972         lv2_atom_forge_key(forge, urids.time_barBeat);
1973         lv2_atom_forge_float(forge, bbt.beats - 1 +
1974                              (bbt.ticks / Timecode::BBT_Time::ticks_per_beat));
1975         lv2_atom_forge_key(forge, urids.time_bar);
1976         lv2_atom_forge_long(forge, bbt.bars - 1);
1977         lv2_atom_forge_key(forge, urids.time_beatUnit);
1978         lv2_atom_forge_int(forge, t.meter().note_divisor());
1979         lv2_atom_forge_key(forge, urids.time_beatsPerBar);
1980         lv2_atom_forge_float(forge, t.meter().divisions_per_bar());
1981         lv2_atom_forge_key(forge, urids.time_beatsPerMinute);
1982         lv2_atom_forge_float(forge, t.tempo().beats_per_minute());
1983 #else
1984         lv2_atom_forge_blank(forge, &frame, 1, urids.time_Position);
1985         lv2_atom_forge_property_head(forge, urids.time_frame, 0);
1986         lv2_atom_forge_long(forge, position);
1987         lv2_atom_forge_property_head(forge, urids.time_speed, 0);
1988         lv2_atom_forge_float(forge, speed);
1989         lv2_atom_forge_property_head(forge, urids.time_barBeat, 0);
1990         lv2_atom_forge_float(forge, bbt.beats - 1 +
1991                              (bbt.ticks / Timecode::BBT_Time::ticks_per_beat));
1992         lv2_atom_forge_property_head(forge, urids.time_bar, 0);
1993         lv2_atom_forge_long(forge, bbt.bars - 1);
1994         lv2_atom_forge_property_head(forge, urids.time_beatUnit, 0);
1995         lv2_atom_forge_int(forge, t.meter().note_divisor());
1996         lv2_atom_forge_property_head(forge, urids.time_beatsPerBar, 0);
1997         lv2_atom_forge_float(forge, t.meter().divisions_per_bar());
1998         lv2_atom_forge_property_head(forge, urids.time_beatsPerMinute, 0);
1999         lv2_atom_forge_float(forge, t.tempo().beats_per_minute());
2000 #endif
2001
2002         LV2_Evbuf_Iterator    end  = lv2_evbuf_end(buf);
2003         const LV2_Atom* const atom = (const LV2_Atom*)pos_buf;
2004         return lv2_evbuf_write(&end, offset, 0, atom->type, atom->size,
2005                                (const uint8_t*)(atom + 1));
2006 }
2007
2008 int
2009 LV2Plugin::connect_and_run(BufferSet& bufs,
2010         ChanMapping in_map, ChanMapping out_map,
2011         pframes_t nframes, framecnt_t offset)
2012 {
2013         DEBUG_TRACE(DEBUG::LV2, string_compose("%1 run %2 offset %3\n", name(), nframes, offset));
2014         Plugin::connect_and_run(bufs, in_map, out_map, nframes, offset);
2015
2016         cycles_t then = get_cycles();
2017
2018         TempoMap&               tmap     = _session.tempo_map();
2019         Metrics::const_iterator metric_i = tmap.metrics_end();
2020         TempoMetric             tmetric  = tmap.metric_at(_session.transport_frame(), &metric_i);
2021
2022         if (_freewheel_control_port) {
2023                 *_freewheel_control_port = _session.engine().freewheeling() ? 1.f : 0.f;
2024         }
2025
2026         if (_bpm_control_port) {
2027                 *_bpm_control_port = tmetric.tempo().beats_per_minute();
2028         }
2029
2030         ChanCount bufs_count;
2031         bufs_count.set(DataType::AUDIO, 1);
2032         bufs_count.set(DataType::MIDI, 1);
2033         BufferSet& silent_bufs  = _session.get_silent_buffers(bufs_count);
2034         BufferSet& scratch_bufs = _session.get_scratch_buffers(bufs_count);
2035         uint32_t const num_ports = parameter_count();
2036         uint32_t const nil_index = std::numeric_limits<uint32_t>::max();
2037
2038         uint32_t audio_in_index  = 0;
2039         uint32_t audio_out_index = 0;
2040         uint32_t midi_in_index   = 0;
2041         uint32_t midi_out_index  = 0;
2042         uint32_t atom_port_index = 0;
2043         for (uint32_t port_index = 0; port_index < num_ports; ++port_index) {
2044                 void*     buf   = NULL;
2045                 uint32_t  index = nil_index;
2046                 PortFlags flags = _port_flags[port_index];
2047                 bool      valid = false;
2048                 if (flags & PORT_AUDIO) {
2049                         if (flags & PORT_INPUT) {
2050                                 index = in_map.get(DataType::AUDIO, audio_in_index++, &valid);
2051                                 buf = (valid)
2052                                         ? bufs.get_audio(index).data(offset)
2053                                         : silent_bufs.get_audio(0).data(offset);
2054                         } else {
2055                                 index = out_map.get(DataType::AUDIO, audio_out_index++, &valid);
2056                                 buf = (valid)
2057                                         ? bufs.get_audio(index).data(offset)
2058                                         : scratch_bufs.get_audio(0).data(offset);
2059                         }
2060                 } else if (flags & (PORT_EVENT|PORT_SEQUENCE)) {
2061                         /* FIXME: The checks here for bufs.count().n_midi() > index shouldn't
2062                            be necessary, but the mapping is illegal in some cases.  Ideally
2063                            that should be fixed, but this is easier...
2064                         */
2065                         if (flags & PORT_MIDI) {
2066                                 if (flags & PORT_INPUT) {
2067                                         index = in_map.get(DataType::MIDI, midi_in_index++, &valid);
2068                                 } else {
2069                                         index = out_map.get(DataType::MIDI, midi_out_index++, &valid);
2070                                 }
2071                                 if (valid && bufs.count().n_midi() > index) {
2072                                         /* Note, ensure_lv2_bufsize() is not RT safe!
2073                                          * However free()/alloc() is only called if a
2074                                          * plugin requires a rsz:minimumSize buffersize
2075                                          * and the existing buffer if smaller.
2076                                          */
2077                                         bufs.ensure_lv2_bufsize((flags & PORT_INPUT), index, _port_minimumSize[port_index]);
2078                                         _ev_buffers[port_index] = bufs.get_lv2_midi(
2079                                                 (flags & PORT_INPUT), index, (flags & PORT_EVENT));
2080                                 }
2081                         } else if ((flags & PORT_POSITION) && (flags & PORT_INPUT)) {
2082                                 lv2_evbuf_reset(_atom_ev_buffers[atom_port_index], true);
2083                                 _ev_buffers[port_index] = _atom_ev_buffers[atom_port_index++];
2084                                 valid                   = true;
2085                         }
2086
2087                         if (valid && (flags & PORT_INPUT)) {
2088                                 Timecode::BBT_Time bbt;
2089                                 if ((flags & PORT_POSITION)) {
2090                                         if (_session.transport_frame() != _next_cycle_start ||
2091                                             _session.transport_speed() != _next_cycle_speed) {
2092                                                 // Transport has changed, write position at cycle start
2093                                                 tmap.bbt_time(_session.transport_frame(), bbt);
2094                                                 write_position(&_impl->forge, _ev_buffers[port_index],
2095                                                                tmetric, bbt, _session.transport_speed(),
2096                                                                _session.transport_frame(), 0);
2097                                         }
2098                                 }
2099
2100                                 // Get MIDI iterator range (empty range if no MIDI)
2101                                 MidiBuffer::iterator m = (index != nil_index)
2102                                         ? bufs.get_midi(index).begin()
2103                                         : silent_bufs.get_midi(0).end();
2104                                 MidiBuffer::iterator m_end = (index != nil_index)
2105                                         ? bufs.get_midi(index).end()
2106                                         : m;
2107
2108                                 // Now merge MIDI and any transport events into the buffer
2109                                 const uint32_t     type = _uri_map.urids.midi_MidiEvent;
2110                                 const framepos_t   tend = _session.transport_frame() + nframes;
2111                                 ++metric_i;
2112                                 while (m != m_end || (metric_i != tmap.metrics_end() &&
2113                                                       (*metric_i)->frame() < tend)) {
2114                                         MetricSection* metric = (metric_i != tmap.metrics_end())
2115                                                 ? *metric_i : NULL;
2116                                         if (m != m_end && (!metric || metric->frame() > (*m).time())) {
2117                                                 const Evoral::MIDIEvent<framepos_t> ev(*m, false);
2118                                                 LV2_Evbuf_Iterator eend = lv2_evbuf_end(_ev_buffers[port_index]);
2119                                                 lv2_evbuf_write(&eend, ev.time(), 0, type, ev.size(), ev.buffer());
2120                                                 ++m;
2121                                         } else {
2122                                                 tmetric.set_metric(metric);
2123                                                 bbt = metric->start();
2124                                                 write_position(&_impl->forge, _ev_buffers[port_index],
2125                                                                tmetric, bbt, _session.transport_speed(),
2126                                                                metric->frame(),
2127                                                                metric->frame() - _session.transport_frame());
2128                                                 ++metric_i;
2129                                         }
2130                                 }
2131                         } else if (!valid) {
2132                                 // Nothing we understand or care about, connect to scratch
2133                                 // see note for midi-buffer size above
2134                                 scratch_bufs.ensure_lv2_bufsize((flags & PORT_INPUT),
2135                                                 0, _port_minimumSize[port_index]);
2136                                 _ev_buffers[port_index] = scratch_bufs.get_lv2_midi(
2137                                         (flags & PORT_INPUT), 0, (flags & PORT_EVENT));
2138                         }
2139
2140                         buf = lv2_evbuf_get_buffer(_ev_buffers[port_index]);
2141                 } else {
2142                         continue;  // Control port, leave buffer alone
2143                 }
2144                 lilv_instance_connect_port(_impl->instance, port_index, buf);
2145         }
2146
2147         // Read messages from UI and push into appropriate buffers
2148         if (_from_ui) {
2149                 uint32_t read_space = _from_ui->read_space();
2150                 while (read_space > sizeof(UIMessage)) {
2151                         UIMessage msg;
2152                         if (_from_ui->read((uint8_t*)&msg, sizeof(msg)) != sizeof(msg)) {
2153                                 error << "Error reading from UI=>Plugin RingBuffer" << endmsg;
2154                                 break;
2155                         }
2156                         vector<uint8_t> body(msg.size);
2157                         if (_from_ui->read(&body[0], msg.size) != msg.size) {
2158                                 error << "Error reading from UI=>Plugin RingBuffer" << endmsg;
2159                                 break;
2160                         }
2161                         if (msg.protocol == URIMap::instance().urids.atom_eventTransfer) {
2162                                 LV2_Evbuf*            buf  = _ev_buffers[msg.index];
2163                                 LV2_Evbuf_Iterator    i    = lv2_evbuf_end(buf);
2164                                 const LV2_Atom* const atom = (const LV2_Atom*)&body[0];
2165                                 if (!lv2_evbuf_write(&i, nframes - 1, 0, atom->type, atom->size,
2166                                                 (const uint8_t*)(atom + 1))) {
2167                                         error << "Failed to write data to LV2 event buffer\n";
2168                                 }
2169                         } else {
2170                                 error << "Received unknown message type from UI" << endmsg;
2171                         }
2172                         read_space -= sizeof(UIMessage) + msg.size;
2173                 }
2174         }
2175
2176         run(nframes);
2177
2178         midi_out_index = 0;
2179         for (uint32_t port_index = 0; port_index < num_ports; ++port_index) {
2180                 PortFlags flags = _port_flags[port_index];
2181                 bool      valid = false;
2182
2183                 /* TODO ask drobilla about comment
2184                  * "Make Ardour event buffers generic so plugins can communicate"
2185                  * in libs/ardour/buffer_set.cc:310
2186                  *
2187                  * ideally the user could choose which of the following two modes
2188                  * to use (e.g. instrument/effect chains  MIDI OUT vs MIDI TRHU).
2189                  *
2190                  * This implementation follows the discussion on IRC Mar 16 2013 16:47 UTC
2191                  * 16:51 < drobilla> rgareus: [..] i.e always replace with MIDI output [of LV2 plugin] if it's there
2192                  * 16:52 < drobilla> rgareus: That would probably be good enough [..] to make users not complain
2193                  *                            for quite a while at least ;)
2194                  */
2195                 // copy output of LV2 plugin's MIDI port to Ardour MIDI buffers -- MIDI OUT
2196                 if ((flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE|PORT_MIDI))) {
2197                         const uint32_t buf_index = out_map.get(
2198                                 DataType::MIDI, midi_out_index++, &valid);
2199                         if (valid) {
2200                                 bufs.forward_lv2_midi(_ev_buffers[port_index], buf_index);
2201                         }
2202                 }
2203                 // Flush MIDI (write back to Ardour MIDI buffers) -- MIDI THRU
2204                 else if ((flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE))) {
2205                         const uint32_t buf_index = out_map.get(
2206                                 DataType::MIDI, midi_out_index++, &valid);
2207                         if (valid) {
2208                                 bufs.flush_lv2_midi(true, buf_index);
2209                         }
2210                 }
2211
2212
2213                 // Write messages to UI
2214                 if ((_to_ui || _patch_port_out_index != (uint32_t)-1) &&
2215                     (flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE))) {
2216                         LV2_Evbuf* buf = _ev_buffers[port_index];
2217                         for (LV2_Evbuf_Iterator i = lv2_evbuf_begin(buf);
2218                              lv2_evbuf_is_valid(i);
2219                              i = lv2_evbuf_next(i)) {
2220                                 uint32_t frames, subframes, type, size;
2221                                 uint8_t* data;
2222                                 lv2_evbuf_get(i, &frames, &subframes, &type, &size, &data);
2223
2224                                 // Intercept patch change messages to emit PropertyChanged signal
2225                                 if ((flags & PORT_PATCHMSG)) {
2226                                         LV2_Atom* atom = (LV2_Atom*)(data - sizeof(LV2_Atom));
2227                                         if (atom->type == _uri_map.urids.atom_Blank ||
2228                                             atom->type == _uri_map.urids.atom_Object) {
2229                                                 LV2_Atom_Object* obj = (LV2_Atom_Object*)atom;
2230                                                 if (obj->body.otype == _uri_map.urids.patch_Set) {
2231                                                         const LV2_Atom* property = NULL;
2232                                                         const LV2_Atom* value    = NULL;
2233                                                         lv2_atom_object_get(obj,
2234                                                                             _uri_map.urids.patch_property, &property,
2235                                                                             _uri_map.urids.patch_value,    &value,
2236                                                                             0);
2237
2238                                                         if (!property || !value ||
2239                                                             property->type != _uri_map.urids.atom_URID ||
2240                                                             value->type    != _uri_map.urids.atom_Path) {
2241                                                                 std::cerr << "warning: patch:Set for unknown property" << std::endl;
2242                                                                 continue;
2243                                                         }
2244
2245                                                         const uint32_t prop_id = ((const LV2_Atom_URID*)property)->body;
2246                                                         const char*    path    = (const char*)LV2_ATOM_BODY_CONST(value);
2247
2248                                                         // Emit PropertyChanged signal for UI
2249                                                         // TODO: This should emit the control's Changed signal
2250                                                         PropertyChanged(prop_id, Variant(Variant::PATH, path));
2251                                                 }
2252                                         }
2253                                 }
2254
2255                                 if (!_to_ui) continue;
2256                                 write_to_ui(port_index, URIMap::instance().urids.atom_eventTransfer,
2257                                             size + sizeof(LV2_Atom),
2258                                             data - sizeof(LV2_Atom));
2259                         }
2260                 }
2261         }
2262
2263         cycles_t now = get_cycles();
2264         set_cycles((uint32_t)(now - then));
2265
2266         // Update expected transport information for next cycle so we can detect changes
2267         _next_cycle_speed = _session.transport_speed();
2268         _next_cycle_start = _session.transport_frame() + (nframes * _next_cycle_speed);
2269
2270         return 0;
2271 }
2272
2273 bool
2274 LV2Plugin::parameter_is_control(uint32_t param) const
2275 {
2276         assert(param < _port_flags.size());
2277         return _port_flags[param] & PORT_CONTROL;
2278 }
2279
2280 bool
2281 LV2Plugin::parameter_is_audio(uint32_t param) const
2282 {
2283         assert(param < _port_flags.size());
2284         return _port_flags[param] & PORT_AUDIO;
2285 }
2286
2287 bool
2288 LV2Plugin::parameter_is_event(uint32_t param) const
2289 {
2290         assert(param < _port_flags.size());
2291         return _port_flags[param] & PORT_EVENT;
2292 }
2293
2294 bool
2295 LV2Plugin::parameter_is_output(uint32_t param) const
2296 {
2297         assert(param < _port_flags.size());
2298         return _port_flags[param] & PORT_OUTPUT;
2299 }
2300
2301 bool
2302 LV2Plugin::parameter_is_input(uint32_t param) const
2303 {
2304         assert(param < _port_flags.size());
2305         return _port_flags[param] & PORT_INPUT;
2306 }
2307
2308 void
2309 LV2Plugin::print_parameter(uint32_t param, char* buf, uint32_t len) const
2310 {
2311         if (buf && len) {
2312                 if (param < parameter_count()) {
2313                         snprintf(buf, len, "%.3f", get_parameter(param));
2314                 } else {
2315                         strcat(buf, "0");
2316                 }
2317         }
2318 }
2319
2320 boost::shared_ptr<ScalePoints>
2321 LV2Plugin::get_scale_points(uint32_t port_index) const
2322 {
2323         const LilvPort*  port   = lilv_plugin_get_port_by_index(_impl->plugin, port_index);
2324         LilvScalePoints* points = lilv_port_get_scale_points(_impl->plugin, port);
2325
2326         boost::shared_ptr<ScalePoints> ret;
2327         if (!points) {
2328                 return ret;
2329         }
2330
2331         ret = boost::shared_ptr<ScalePoints>(new ScalePoints());
2332
2333         LILV_FOREACH(scale_points, i, points) {
2334                 const LilvScalePoint* p     = lilv_scale_points_get(points, i);
2335                 const LilvNode*       label = lilv_scale_point_get_label(p);
2336                 const LilvNode*       value = lilv_scale_point_get_value(p);
2337                 if (label && (lilv_node_is_float(value) || lilv_node_is_int(value))) {
2338                         ret->insert(make_pair(lilv_node_as_string(label),
2339                                               lilv_node_as_float(value)));
2340                 }
2341         }
2342
2343         lilv_scale_points_free(points);
2344         return ret;
2345 }
2346
2347 void
2348 LV2Plugin::run(pframes_t nframes)
2349 {
2350         uint32_t const N = parameter_count();
2351         for (uint32_t i = 0; i < N; ++i) {
2352                 if (parameter_is_control(i) && parameter_is_input(i)) {
2353                         _control_data[i] = _shadow_data[i];
2354                 }
2355         }
2356
2357         lilv_instance_run(_impl->instance, nframes);
2358
2359         if (_impl->work_iface) {
2360                 _worker->emit_responses();
2361                 if (_impl->work_iface->end_run) {
2362                         _impl->work_iface->end_run(_impl->instance->lv2_handle);
2363                 }
2364         }
2365 }
2366
2367 void
2368 LV2Plugin::latency_compute_run()
2369 {
2370         if (!_latency_control_port) {
2371                 return;
2372         }
2373
2374         // Run the plugin so that it can set its latency parameter
2375
2376         bool was_activated = _was_activated;
2377         activate();
2378
2379         uint32_t port_index = 0;
2380         uint32_t in_index   = 0;
2381         uint32_t out_index  = 0;
2382
2383         // this is done in the main thread. non realtime.
2384         const framecnt_t bufsize = _engine.samples_per_cycle();
2385         float            *buffer = (float*) malloc(_engine.samples_per_cycle() * sizeof(float));
2386
2387         memset(buffer, 0, sizeof(float) * bufsize);
2388
2389         // FIXME: Ensure plugins can handle in-place processing
2390
2391         port_index = 0;
2392
2393         while (port_index < parameter_count()) {
2394                 if (parameter_is_audio(port_index)) {
2395                         if (parameter_is_input(port_index)) {
2396                                 lilv_instance_connect_port(_impl->instance, port_index, buffer);
2397                                 in_index++;
2398                         } else if (parameter_is_output(port_index)) {
2399                                 lilv_instance_connect_port(_impl->instance, port_index, buffer);
2400                                 out_index++;
2401                         }
2402                 }
2403                 port_index++;
2404         }
2405
2406         run(bufsize);
2407         deactivate();
2408         if (was_activated) {
2409                 activate();
2410         }
2411         free(buffer);
2412 }
2413
2414 const LilvPort*
2415 LV2Plugin::Impl::designated_input (const char* uri, void** bufptrs[], void** bufptr)
2416 {
2417         const LilvPort* port = NULL;
2418         LilvNode* designation = lilv_new_uri(_world.world, uri);
2419         port = lilv_plugin_get_port_by_designation(
2420                 plugin, _world.lv2_InputPort, designation);
2421         lilv_node_free(designation);
2422         if (port) {
2423                 bufptrs[lilv_port_get_index(plugin, port)] = bufptr;
2424         }
2425         return port;
2426 }
2427
2428 static bool lv2_filter (const string& str, void* /*arg*/)
2429 {
2430         /* Not a dotfile, has a prefix before a period, suffix is "lv2" */
2431
2432         return str[0] != '.' && (str.length() > 3 && str.find (".lv2") == (str.length() - 4));
2433 }
2434
2435
2436 LV2World::LV2World()
2437         : world(lilv_world_new())
2438         , _bundle_checked(false)
2439 {
2440         atom_AtomPort      = lilv_new_uri(world, LV2_ATOM__AtomPort);
2441         atom_Chunk         = lilv_new_uri(world, LV2_ATOM__Chunk);
2442         atom_Sequence      = lilv_new_uri(world, LV2_ATOM__Sequence);
2443         atom_bufferType    = lilv_new_uri(world, LV2_ATOM__bufferType);
2444         atom_supports      = lilv_new_uri(world, LV2_ATOM__supports);
2445         atom_eventTransfer = lilv_new_uri(world, LV2_ATOM__eventTransfer);
2446         ev_EventPort       = lilv_new_uri(world, LILV_URI_EVENT_PORT);
2447         ext_logarithmic    = lilv_new_uri(world, LV2_PORT_PROPS__logarithmic);
2448         ext_notOnGUI       = lilv_new_uri(world, LV2_PORT_PROPS__notOnGUI);
2449         lv2_AudioPort      = lilv_new_uri(world, LILV_URI_AUDIO_PORT);
2450         lv2_ControlPort    = lilv_new_uri(world, LILV_URI_CONTROL_PORT);
2451         lv2_InputPort      = lilv_new_uri(world, LILV_URI_INPUT_PORT);
2452         lv2_OutputPort     = lilv_new_uri(world, LILV_URI_OUTPUT_PORT);
2453         lv2_inPlaceBroken  = lilv_new_uri(world, LV2_CORE__inPlaceBroken);
2454         lv2_integer        = lilv_new_uri(world, LV2_CORE__integer);
2455         lv2_default        = lilv_new_uri(world, LV2_CORE__default);
2456         lv2_minimum        = lilv_new_uri(world, LV2_CORE__minimum);
2457         lv2_maximum        = lilv_new_uri(world, LV2_CORE__maximum);
2458         lv2_reportsLatency = lilv_new_uri(world, LV2_CORE__reportsLatency);
2459         lv2_sampleRate     = lilv_new_uri(world, LV2_CORE__sampleRate);
2460         lv2_toggled        = lilv_new_uri(world, LV2_CORE__toggled);
2461         lv2_enumeration    = lilv_new_uri(world, LV2_CORE__enumeration);
2462         lv2_freewheeling   = lilv_new_uri(world, LV2_CORE__freeWheeling);
2463         midi_MidiEvent     = lilv_new_uri(world, LILV_URI_MIDI_EVENT);
2464         rdfs_comment       = lilv_new_uri(world, LILV_NS_RDFS "comment");
2465         rdfs_label         = lilv_new_uri(world, LILV_NS_RDFS "label");
2466         rdfs_range         = lilv_new_uri(world, LILV_NS_RDFS "range");
2467         rsz_minimumSize    = lilv_new_uri(world, LV2_RESIZE_PORT__minimumSize);
2468         time_Position      = lilv_new_uri(world, LV2_TIME__Position);
2469         ui_GtkUI           = lilv_new_uri(world, LV2_UI__GtkUI);
2470         ui_external        = lilv_new_uri(world, "http://lv2plug.in/ns/extensions/ui#external");
2471         ui_externalkx      = lilv_new_uri(world, "http://kxstudio.sf.net/ns/lv2ext/external-ui#Widget");
2472         units_unit         = lilv_new_uri(world, LV2_UNITS__unit);
2473         units_render       = lilv_new_uri(world, LV2_UNITS__render);
2474         units_hz           = lilv_new_uri(world, LV2_UNITS__hz);
2475         units_midiNote     = lilv_new_uri(world, LV2_UNITS__midiNote);
2476         units_db           = lilv_new_uri(world, LV2_UNITS__db);
2477         patch_writable     = lilv_new_uri(world, LV2_PATCH__writable);
2478         patch_Message      = lilv_new_uri(world, LV2_PATCH__Message);
2479         lv2_noSampleAccurateCtrl = lilv_new_uri(world, LV2_CORE_PREFIX "NoSampleAccurateCtrl"); // XXX
2480 #ifdef HAVE_LV2_1_2_0
2481         bufz_powerOf2BlockLength = lilv_new_uri(world, LV2_BUF_SIZE__powerOf2BlockLength);
2482         bufz_fixedBlockLength    = lilv_new_uri(world, LV2_BUF_SIZE__fixedBlockLength);
2483         bufz_nominalBlockLength  = lilv_new_uri(world, "http://lv2plug.in/ns/ext/buf-size#nominalBlockLength");
2484 #endif
2485
2486 }
2487
2488 LV2World::~LV2World()
2489 {
2490 #ifdef HAVE_LV2_1_2_0
2491         lilv_node_free(bufz_nominalBlockLength);
2492         lilv_node_free(bufz_fixedBlockLength);
2493         lilv_node_free(bufz_powerOf2BlockLength);
2494 #endif
2495         lilv_node_free(lv2_noSampleAccurateCtrl);
2496         lilv_node_free(patch_Message);
2497         lilv_node_free(patch_writable);
2498         lilv_node_free(units_hz);
2499         lilv_node_free(units_midiNote);
2500         lilv_node_free(units_db);
2501         lilv_node_free(units_unit);
2502         lilv_node_free(units_render);
2503         lilv_node_free(ui_externalkx);
2504         lilv_node_free(ui_external);
2505         lilv_node_free(ui_GtkUI);
2506         lilv_node_free(time_Position);
2507         lilv_node_free(rsz_minimumSize);
2508         lilv_node_free(rdfs_comment);
2509         lilv_node_free(rdfs_label);
2510         lilv_node_free(rdfs_range);
2511         lilv_node_free(midi_MidiEvent);
2512         lilv_node_free(lv2_enumeration);
2513         lilv_node_free(lv2_freewheeling);
2514         lilv_node_free(lv2_toggled);
2515         lilv_node_free(lv2_sampleRate);
2516         lilv_node_free(lv2_reportsLatency);
2517         lilv_node_free(lv2_integer);
2518         lilv_node_free(lv2_inPlaceBroken);
2519         lilv_node_free(lv2_OutputPort);
2520         lilv_node_free(lv2_InputPort);
2521         lilv_node_free(lv2_ControlPort);
2522         lilv_node_free(lv2_AudioPort);
2523         lilv_node_free(ext_notOnGUI);
2524         lilv_node_free(ext_logarithmic);
2525         lilv_node_free(ev_EventPort);
2526         lilv_node_free(atom_supports);
2527         lilv_node_free(atom_eventTransfer);
2528         lilv_node_free(atom_bufferType);
2529         lilv_node_free(atom_Sequence);
2530         lilv_node_free(atom_Chunk);
2531         lilv_node_free(atom_AtomPort);
2532         lilv_world_free(world);
2533 }
2534
2535 void
2536 LV2World::load_bundled_plugins(bool verbose)
2537 {
2538         if (!_bundle_checked) {
2539                 if (verbose) {
2540                         cout << "Scanning folders for bundled LV2s: " << ARDOUR::lv2_bundled_search_path().to_string() << endl;
2541                 }
2542
2543                 vector<string> plugin_objects;
2544                 find_paths_matching_filter (plugin_objects, ARDOUR::lv2_bundled_search_path(), lv2_filter, 0, true, true, true);
2545                 for ( vector<string>::iterator x = plugin_objects.begin(); x != plugin_objects.end (); ++x) {
2546 #ifdef PLATFORM_WINDOWS
2547                         string uri = "file:///" + *x + "/";
2548 #else
2549                         string uri = "file://" + *x + "/";
2550 #endif
2551                         LilvNode *node = lilv_new_uri(world, uri.c_str());
2552                         lilv_world_load_bundle(world, node);
2553                         lilv_node_free(node);
2554                 }
2555
2556                 lilv_world_load_all(world);
2557                 _bundle_checked = true;
2558         }
2559 }
2560
2561 LV2PluginInfo::LV2PluginInfo (const char* plugin_uri)
2562 {
2563         type = ARDOUR::LV2;
2564         _plugin_uri = strdup(plugin_uri);
2565 }
2566
2567 LV2PluginInfo::~LV2PluginInfo()
2568 {
2569         free(_plugin_uri);
2570         _plugin_uri = NULL;
2571 }
2572
2573 PluginPtr
2574 LV2PluginInfo::load(Session& session)
2575 {
2576         try {
2577                 PluginPtr plugin;
2578                 const LilvPlugins* plugins = lilv_world_get_all_plugins(_world.world);
2579                 LilvNode* uri = lilv_new_uri(_world.world, _plugin_uri);
2580                 if (!uri) { throw failed_constructor(); }
2581                 const LilvPlugin* lp = lilv_plugins_get_by_uri(plugins, uri);
2582                 if (!lp) { throw failed_constructor(); }
2583                 plugin.reset(new LV2Plugin(session.engine(), session, lp, session.frame_rate()));
2584                 lilv_node_free(uri);
2585                 plugin->set_info(PluginInfoPtr(shared_from_this ()));
2586                 return plugin;
2587         } catch (failed_constructor& err) {
2588                 return PluginPtr((Plugin*)0);
2589         }
2590
2591         return PluginPtr();
2592 }
2593
2594 bool
2595 LV2PluginInfo::in_category (const std::string &c) const
2596 {
2597         // TODO use untranslated lilv_plugin_get_class()
2598         // match gtk2_ardour/plugin_selector.cc
2599         if (category == c) {
2600                 return true;
2601         }
2602         return false;
2603 }
2604
2605 PluginInfoList*
2606 LV2PluginInfo::discover()
2607 {
2608         LV2World world;
2609         world.load_bundled_plugins();
2610         _world.load_bundled_plugins(true);
2611
2612         PluginInfoList*    plugs   = new PluginInfoList;
2613         const LilvPlugins* plugins = lilv_world_get_all_plugins(world.world);
2614
2615         LILV_FOREACH(plugins, i, plugins) {
2616                 const LilvPlugin* p = lilv_plugins_get(plugins, i);
2617                 const LilvNode* pun = lilv_plugin_get_uri(p);
2618                 if (!pun) continue;
2619                 LV2PluginInfoPtr info(new LV2PluginInfo(lilv_node_as_string(pun)));
2620
2621                 LilvNode* name = lilv_plugin_get_name(p);
2622                 if (!name || !lilv_plugin_get_port_by_index(p, 0)) {
2623                         warning << "Ignoring invalid LV2 plugin "
2624                                 << lilv_node_as_string(lilv_plugin_get_uri(p))
2625                                 << endmsg;
2626                         continue;
2627                 }
2628
2629                 if (lilv_plugin_has_feature(p, world.lv2_inPlaceBroken)) {
2630                         warning << string_compose(
2631                             _("Ignoring LV2 plugin \"%1\" since it cannot do inplace processing."),
2632                             lilv_node_as_string(name)) << endmsg;
2633                         lilv_node_free(name);
2634                         continue;
2635                 }
2636
2637 #ifdef HAVE_LV2_1_2_0
2638                 LilvNodes *required_features = lilv_plugin_get_required_features (p);
2639                 if (lilv_nodes_contains (required_features, world.bufz_powerOf2BlockLength) ||
2640                                 lilv_nodes_contains (required_features, world.bufz_fixedBlockLength)
2641                    ) {
2642                         warning << string_compose(
2643                             _("Ignoring LV2 plugin \"%1\" because its buffer-size requirements cannot be satisfied."),
2644                             lilv_node_as_string(name)) << endmsg;
2645                         lilv_nodes_free(required_features);
2646                         lilv_node_free(name);
2647                         continue;
2648                 }
2649                 lilv_nodes_free(required_features);
2650 #endif
2651
2652                 info->type = LV2;
2653
2654                 info->name = string(lilv_node_as_string(name));
2655                 lilv_node_free(name);
2656                 ARDOUR::PluginScanMessage(_("LV2"), info->name, false);
2657
2658                 const LilvPluginClass* pclass = lilv_plugin_get_class(p);
2659                 const LilvNode*        label  = lilv_plugin_class_get_label(pclass);
2660                 info->category = lilv_node_as_string(label);
2661
2662                 LilvNode* author_name = lilv_plugin_get_author_name(p);
2663                 info->creator = author_name ? string(lilv_node_as_string(author_name)) : "Unknown";
2664                 lilv_node_free(author_name);
2665
2666                 info->path = "/NOPATH"; // Meaningless for LV2
2667
2668                 /* count atom-event-ports that feature
2669                  * atom:supports <http://lv2plug.in/ns/ext/midi#MidiEvent>
2670                  *
2671                  * TODO: nicely ask drobilla to make a lilv_ call for that
2672                  */
2673                 int count_midi_out = 0;
2674                 int count_midi_in = 0;
2675                 for (uint32_t i = 0; i < lilv_plugin_get_num_ports(p); ++i) {
2676                         const LilvPort* port  = lilv_plugin_get_port_by_index(p, i);
2677                         if (lilv_port_is_a(p, port, world.atom_AtomPort)) {
2678                                 LilvNodes* buffer_types = lilv_port_get_value(
2679                                         p, port, world.atom_bufferType);
2680                                 LilvNodes* atom_supports = lilv_port_get_value(
2681                                         p, port, world.atom_supports);
2682
2683                                 if (lilv_nodes_contains(buffer_types, world.atom_Sequence)
2684                                                 && lilv_nodes_contains(atom_supports, world.midi_MidiEvent)) {
2685                                         if (lilv_port_is_a(p, port, world.lv2_InputPort)) {
2686                                                 count_midi_in++;
2687                                         }
2688                                         if (lilv_port_is_a(p, port, world.lv2_OutputPort)) {
2689                                                 count_midi_out++;
2690                                         }
2691                                 }
2692                                 lilv_nodes_free(buffer_types);
2693                                 lilv_nodes_free(atom_supports);
2694                         }
2695                 }
2696
2697                 info->n_inputs.set_audio(
2698                         lilv_plugin_get_num_ports_of_class(
2699                                 p, world.lv2_InputPort, world.lv2_AudioPort, NULL));
2700                 info->n_inputs.set_midi(
2701                         lilv_plugin_get_num_ports_of_class(
2702                                 p, world.lv2_InputPort, world.ev_EventPort, NULL)
2703                         + count_midi_in);
2704
2705                 info->n_outputs.set_audio(
2706                         lilv_plugin_get_num_ports_of_class(
2707                                 p, world.lv2_OutputPort, world.lv2_AudioPort, NULL));
2708                 info->n_outputs.set_midi(
2709                         lilv_plugin_get_num_ports_of_class(
2710                                 p, world.lv2_OutputPort, world.ev_EventPort, NULL)
2711                         + count_midi_out);
2712
2713                 info->unique_id = lilv_node_as_uri(lilv_plugin_get_uri(p));
2714                 info->index     = 0; // Meaningless for LV2
2715
2716                 plugs->push_back(info);
2717         }
2718
2719         return plugs;
2720 }