LV2 - query presets without instantiating the plugin
[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         if (!_plugin_state_dir.empty ()){
972                 return Glib::build_filename(_plugin_state_dir, _insert_id.to_s());
973         } else {
974                 return Glib::build_filename(_session.plugins_dir(), _insert_id.to_s());
975         }
976 }
977
978 /** Directory for files created by the plugin (except during save). */
979 const std::string
980 LV2Plugin::scratch_dir() const
981 {
982         return Glib::build_filename(plugin_dir(), "scratch");
983 }
984
985 /** Directory for snapshots of files in the scratch directory. */
986 const std::string
987 LV2Plugin::file_dir() const
988 {
989         return Glib::build_filename(plugin_dir(), "files");
990 }
991
992 /** Directory to save state snapshot version @c num into. */
993 const std::string
994 LV2Plugin::state_dir(unsigned num) const
995 {
996         return Glib::build_filename(plugin_dir(), string_compose("state%1", num));
997 }
998
999 /** Implementation of state:makePath for files created at instantiation time.
1000  * Note this is not used for files created at save time (Lilv deals with that).
1001  */
1002 char*
1003 LV2Plugin::lv2_state_make_path(LV2_State_Make_Path_Handle handle,
1004                                const char*                path)
1005 {
1006         LV2Plugin* me = (LV2Plugin*)handle;
1007         if (me->_insert_id == PBD::ID("0")) {
1008                 warning << string_compose(
1009                         "File path \"%1\" requested but LV2 %2 has no insert ID",
1010                         path, me->name()) << endmsg;
1011                 return g_strdup(path);
1012         }
1013
1014         const std::string abs_path = Glib::build_filename(me->scratch_dir(), path);
1015         const std::string dirname  = Glib::path_get_dirname(abs_path);
1016         g_mkdir_with_parents(dirname.c_str(), 0744);
1017
1018         DEBUG_TRACE(DEBUG::LV2, string_compose("new file path %1 => %2\n",
1019                                                path, abs_path));
1020
1021         return g_strndup(abs_path.c_str(), abs_path.length());
1022 }
1023
1024 void
1025 LV2Plugin::add_state(XMLNode* root) const
1026 {
1027         assert(_insert_id != PBD::ID("0"));
1028
1029         XMLNode*    child;
1030         char        buf[32];
1031         LocaleGuard lg(X_("C"));
1032
1033         for (uint32_t i = 0; i < parameter_count(); ++i) {
1034                 if (parameter_is_input(i) && parameter_is_control(i)) {
1035                         child = new XMLNode("Port");
1036                         child->add_property("symbol", port_symbol(i));
1037                         snprintf(buf, sizeof(buf), "%+f", _shadow_data[i]);
1038                         child->add_property("value", string(buf));
1039                         root->add_child_nocopy(*child);
1040                 }
1041         }
1042
1043         if (!_plugin_state_dir.empty()) {
1044                 root->add_property("template-dir", _plugin_state_dir);
1045         }
1046
1047         if (_has_state_interface) {
1048                 // Provisionally increment state version and create directory
1049                 const std::string new_dir = state_dir(++_state_version);
1050                 g_mkdir_with_parents(new_dir.c_str(), 0744);
1051
1052                 LilvState* state = lilv_state_new_from_instance(
1053                         _impl->plugin,
1054                         _impl->instance,
1055                         _uri_map.urid_map(),
1056                         scratch_dir().c_str(),
1057                         file_dir().c_str(),
1058                         _session.externals_dir().c_str(),
1059                         new_dir.c_str(),
1060                         NULL,
1061                         const_cast<LV2Plugin*>(this),
1062                         0,
1063                         NULL);
1064
1065                 if (!_impl->state || !lilv_state_equals(state, _impl->state)) {
1066                         lilv_state_save(_world.world,
1067                                         _uri_map.urid_map(),
1068                                         _uri_map.urid_unmap(),
1069                                         state,
1070                                         NULL,
1071                                         new_dir.c_str(),
1072                                         "state.ttl");
1073
1074                         lilv_state_free(_impl->state);
1075                         _impl->state = state;
1076                 } else {
1077                         // State is identical, decrement version and nuke directory
1078                         lilv_state_free(state);
1079                         PBD::remove_directory(new_dir);
1080                         --_state_version;
1081                 }
1082
1083                 root->add_property("state-dir", string_compose("state%1", _state_version));
1084         }
1085 }
1086
1087 // TODO: Once we can rely on lilv 0.16.0, lilv_world_get can replace this
1088 static LilvNode*
1089 get_value(LilvWorld* world, const LilvNode* subject, const LilvNode* predicate)
1090 {
1091         LilvNodes* vs = lilv_world_find_nodes(world, subject, predicate, NULL);
1092         if (vs) {
1093                 LilvNode* node = lilv_node_duplicate(lilv_nodes_get_first(vs));
1094                 lilv_nodes_free(vs);
1095                 return node;
1096         }
1097         return NULL;
1098 }
1099
1100 void
1101 LV2Plugin::find_presets()
1102 {
1103         LilvNode* lv2_appliesTo = lilv_new_uri(_world.world, LV2_CORE__appliesTo);
1104         LilvNode* pset_Preset   = lilv_new_uri(_world.world, LV2_PRESETS__Preset);
1105         LilvNode* rdfs_label    = lilv_new_uri(_world.world, LILV_NS_RDFS "label");
1106
1107         LilvNodes* presets = lilv_plugin_get_related(_impl->plugin, pset_Preset);
1108         LILV_FOREACH(nodes, i, presets) {
1109                 const LilvNode* preset = lilv_nodes_get(presets, i);
1110                 lilv_world_load_resource(_world.world, preset);
1111                 LilvNode* name = get_value(_world.world, preset, rdfs_label);
1112                 if (name) {
1113                         _presets.insert(std::make_pair(lilv_node_as_string(preset),
1114                                                        Plugin::PresetRecord(
1115                                                                lilv_node_as_string(preset),
1116                                                                lilv_node_as_string(name))));
1117                         lilv_node_free(name);
1118                 } else {
1119                         warning << string_compose(
1120                             _("Plugin \"%1\" preset \"%2\" is missing a label\n"),
1121                             lilv_node_as_string(lilv_plugin_get_uri(_impl->plugin)),
1122                             lilv_node_as_string(preset)) << endmsg;
1123                 }
1124         }
1125         lilv_nodes_free(presets);
1126
1127         lilv_node_free(rdfs_label);
1128         lilv_node_free(pset_Preset);
1129         lilv_node_free(lv2_appliesTo);
1130 }
1131
1132 static void
1133 set_port_value(const char* port_symbol,
1134                void*       user_data,
1135                const void* value,
1136                uint32_t    /*size*/,
1137                uint32_t    type)
1138 {
1139         LV2Plugin* self = (LV2Plugin*)user_data;
1140         if (type != 0 && type != URIMap::instance().urids.atom_Float) {
1141                 return;  // TODO: Support non-float ports
1142         }
1143
1144         const uint32_t port_index = self->port_index(port_symbol);
1145         if (port_index != (uint32_t)-1) {
1146                 self->set_parameter(port_index, *(const float*)value);
1147         }
1148 }
1149
1150 bool
1151 LV2Plugin::load_preset(PresetRecord r)
1152 {
1153         LilvWorld* world = _world.world;
1154         LilvNode*  pset  = lilv_new_uri(world, r.uri.c_str());
1155         LilvState* state = lilv_state_new_from_world(world, _uri_map.urid_map(), pset);
1156
1157         if (state) {
1158                 lilv_state_restore(state, _impl->instance, set_port_value, this, 0, NULL);
1159                 lilv_state_free(state);
1160                 Plugin::load_preset(r);
1161         }
1162
1163         lilv_node_free(pset);
1164         return state;
1165 }
1166
1167 const void*
1168 ARDOUR::lv2plugin_get_port_value(const char* port_symbol,
1169                                  void*       user_data,
1170                                  uint32_t*   size,
1171                                  uint32_t*   type)
1172 {
1173         LV2Plugin *plugin = (LV2Plugin *) user_data;
1174
1175         uint32_t index = plugin->port_index(port_symbol);
1176         if (index != (uint32_t) -1) {
1177                 if (plugin->parameter_is_input(index) && plugin->parameter_is_control(index)) {
1178                         float *value;
1179                         *size = sizeof(float);
1180                         *type = plugin->_uri_map.uri_to_id(LV2_ATOM__Float);
1181                         value = &plugin->_shadow_data[index];
1182
1183                         return value;
1184                 }
1185         }
1186
1187         *size = *type = 0;
1188         return NULL;
1189 }
1190
1191
1192 std::string
1193 LV2Plugin::do_save_preset(string name)
1194 {
1195         LilvNode*    plug_name = lilv_plugin_get_name(_impl->plugin);
1196         const string prefix    = legalize_for_uri(lilv_node_as_string(plug_name));
1197         const string base_name = legalize_for_uri(name);
1198         const string file_name = base_name + ".ttl";
1199         const string bundle    = Glib::build_filename(
1200                 Glib::get_home_dir(),
1201                 Glib::build_filename(".lv2", prefix + "_" + base_name + ".lv2"));
1202
1203 #ifdef HAVE_LILV_0_21_3
1204         /* delete reference to old preset (if any) */
1205         const PresetRecord* r = preset_by_label(name);
1206         if (r) {
1207                 LilvNode*  pset  = lilv_new_uri (_world.world, r->uri.c_str());
1208                 if (pset) {
1209                         lilv_world_unload_resource (_world.world, pset);
1210                         lilv_node_free(pset);
1211                 }
1212         }
1213 #endif
1214
1215         LilvState* state = lilv_state_new_from_instance(
1216                 _impl->plugin,
1217                 _impl->instance,
1218                 _uri_map.urid_map(),
1219                 scratch_dir().c_str(),                   // file_dir
1220                 bundle.c_str(),                          // copy_dir
1221                 bundle.c_str(),                          // link_dir
1222                 bundle.c_str(),                          // save_dir
1223                 lv2plugin_get_port_value,                // get_value
1224                 (void*)this,                             // user_data
1225                 LV2_STATE_IS_POD|LV2_STATE_IS_PORTABLE,  // flags
1226                 _features                                // features
1227         );
1228
1229         lilv_state_set_label(state, name.c_str());
1230         lilv_state_save(
1231                 _world.world,           // world
1232                 _uri_map.urid_map(),    // map
1233                 _uri_map.urid_unmap(),  // unmap
1234                 state,                  // state
1235                 NULL,                   // uri (NULL = use file URI)
1236                 bundle.c_str(),         // dir
1237                 file_name.c_str()       // filename
1238         );
1239
1240         lilv_state_free(state);
1241
1242         std::string uri = Glib::filename_to_uri(Glib::build_filename(bundle, file_name));
1243         LilvNode *node_bundle = lilv_new_uri(_world.world, Glib::filename_to_uri(Glib::build_filename(bundle, "/")).c_str());
1244         LilvNode *node_preset = lilv_new_uri(_world.world, uri.c_str());
1245 #ifdef HAVE_LILV_0_21_3
1246         lilv_world_unload_resource(_world.world, node_preset);
1247         lilv_world_unload_bundle(_world.world, node_bundle);
1248 #endif
1249         lilv_world_load_bundle(_world.world, node_bundle);
1250         lilv_world_load_resource(_world.world, node_preset);
1251         lilv_node_free(node_bundle);
1252         lilv_node_free(node_preset);
1253         lilv_node_free(plug_name);
1254         return uri;
1255 }
1256
1257 void
1258 LV2Plugin::do_remove_preset(string name)
1259 {
1260 #ifdef HAVE_LILV_0_21_3
1261         /* Look up preset record by label (FIXME: ick, label as ID) */
1262         const PresetRecord* r = preset_by_label(name);
1263         if (!r) {
1264                 return;
1265         }
1266
1267         /* Load a LilvState for the preset. */
1268         LilvWorld* world = _world.world;
1269         LilvNode*  pset  = lilv_new_uri(world, r->uri.c_str());
1270         LilvState* state = lilv_state_new_from_world(world, _uri_map.urid_map(), pset);
1271         if (!state) {
1272                 lilv_node_free(pset);
1273                 return;
1274         }
1275
1276         /* Unload preset from world. */
1277         lilv_world_unload_resource(world, pset);
1278
1279         /* Delete it from the file system.  This will remove the preset file and the entry
1280            from the manifest.  If this results in an empty manifest (i.e. the
1281            preset is the only thing in the bundle), then the bundle is removed. */
1282         lilv_state_delete(world, state);
1283
1284         lilv_state_free(state);
1285         lilv_node_free(pset);
1286 #endif
1287         /* Without lilv_state_delete(), we could delete the preset file, but this
1288            would leave a broken bundle/manifest around, so the preset would still
1289            be visible, but broken.  Naively deleting a bundle is too dangerous, so
1290            we simply do not support preset deletion with older Lilv */
1291 }
1292
1293 bool
1294 LV2Plugin::has_editor() const
1295 {
1296         return _impl->ui != NULL;
1297 }
1298
1299 bool
1300 LV2Plugin::has_message_output() const
1301 {
1302         for (uint32_t i = 0; i < num_ports(); ++i) {
1303                 if ((_port_flags[i] & PORT_SEQUENCE) &&
1304                     (_port_flags[i] & PORT_OUTPUT)) {
1305                         return true;
1306                 }
1307         }
1308         return false;
1309 }
1310
1311 bool
1312 LV2Plugin::write_to(RingBuffer<uint8_t>* dest,
1313                     uint32_t             index,
1314                     uint32_t             protocol,
1315                     uint32_t             size,
1316                     const uint8_t*       body)
1317 {
1318         const uint32_t  buf_size = sizeof(UIMessage) + size;
1319         vector<uint8_t> buf(buf_size);
1320
1321         UIMessage* msg = (UIMessage*)&buf[0];
1322         msg->index    = index;
1323         msg->protocol = protocol;
1324         msg->size     = size;
1325         memcpy(msg + 1, body, size);
1326
1327         return (dest->write(&buf[0], buf_size) == buf_size);
1328 }
1329
1330 bool
1331 LV2Plugin::write_from_ui(uint32_t       index,
1332                          uint32_t       protocol,
1333                          uint32_t       size,
1334                          const uint8_t* body)
1335 {
1336         if (!_from_ui) {
1337                 size_t rbs = _session.engine().raw_buffer_size(DataType::MIDI) * NBUFS;
1338                 /* buffer data communication from plugin UI to plugin instance.
1339                  * this buffer needs to potentially hold
1340                  *   (port's minimumSize) * (audio-periods) / (UI-periods)
1341                  * bytes.
1342                  *
1343                  *  e.g 48kSPS / 128fpp -> audio-periods = 375 Hz
1344                  *  ui-periods = 25 Hz (SuperRapidScreenUpdate)
1345                  *  default minimumSize = 32K (see LV2Plugin::allocate_atom_event_buffers()
1346                  *
1347                  * it is NOT safe to overflow (msg.size will be misinterpreted)
1348                  */
1349                 uint32_t bufsiz = 32768;
1350                 if (_atom_ev_buffers && _atom_ev_buffers[0]) {
1351                         bufsiz =  lv2_evbuf_get_capacity(_atom_ev_buffers[0]);
1352                 }
1353                 rbs = max((size_t) bufsiz * 8, rbs);
1354                 _from_ui = new RingBuffer<uint8_t>(rbs);
1355         }
1356
1357         if (!write_to(_from_ui, index, protocol, size, body)) {
1358                 error << "Error writing from UI to plugin" << endmsg;
1359                 return false;
1360         }
1361         return true;
1362 }
1363
1364 bool
1365 LV2Plugin::write_to_ui(uint32_t       index,
1366                        uint32_t       protocol,
1367                        uint32_t       size,
1368                        const uint8_t* body)
1369 {
1370         if (!write_to(_to_ui, index, protocol, size, body)) {
1371                 error << "Error writing from plugin to UI" << endmsg;
1372                 return false;
1373         }
1374         return true;
1375 }
1376
1377 static void
1378 forge_variant(LV2_Atom_Forge* forge, const Variant& value)
1379 {
1380         switch (value.type()) {
1381         case Variant::NOTHING:
1382                 break;
1383         case Variant::BEATS:
1384                 // No atom type for this, just forge a double
1385                 lv2_atom_forge_double(forge, value.get_beats().to_double());
1386                 break;
1387         case Variant::BOOL:
1388                 lv2_atom_forge_bool(forge, value.get_bool());
1389                 break;
1390         case Variant::DOUBLE:
1391                 lv2_atom_forge_double(forge, value.get_double());
1392                 break;
1393         case Variant::FLOAT:
1394                 lv2_atom_forge_float(forge, value.get_float());
1395                 break;
1396         case Variant::INT:
1397                 lv2_atom_forge_int(forge, value.get_int());
1398                 break;
1399         case Variant::LONG:
1400                 lv2_atom_forge_long(forge, value.get_long());
1401                 break;
1402         case Variant::PATH:
1403                 lv2_atom_forge_path(
1404                         forge, value.get_path().c_str(), value.get_path().size());
1405                 break;
1406         case Variant::STRING:
1407                 lv2_atom_forge_string(
1408                         forge, value.get_string().c_str(), value.get_string().size());
1409                 break;
1410         case Variant::URI:
1411                 lv2_atom_forge_uri(
1412                         forge, value.get_uri().c_str(), value.get_uri().size());
1413                 break;
1414         }
1415 }
1416
1417 /** Get a variant type from a URI, return false iff no match found. */
1418 static bool
1419 uri_to_variant_type(const std::string& uri, Variant::Type& type)
1420 {
1421         if (uri == LV2_ATOM__Bool) {
1422                 type = Variant::BOOL;
1423         } else if (uri == LV2_ATOM__Double) {
1424                 type = Variant::DOUBLE;
1425         } else if (uri == LV2_ATOM__Float) {
1426                 type = Variant::FLOAT;
1427         } else if (uri == LV2_ATOM__Int) {
1428                 type = Variant::INT;
1429         } else if (uri == LV2_ATOM__Long) {
1430                 type = Variant::LONG;
1431         } else if (uri == LV2_ATOM__Path) {
1432                 type = Variant::PATH;
1433         } else if (uri == LV2_ATOM__String) {
1434                 type = Variant::STRING;
1435         } else if (uri == LV2_ATOM__URI) {
1436                 type = Variant::URI;
1437         } else {
1438                 return false;
1439         }
1440         return true;
1441 }
1442
1443 void
1444 LV2Plugin::set_property(uint32_t key, const Variant& value)
1445 {
1446         if (_patch_port_in_index == (uint32_t)-1) {
1447                 error << "LV2: set_property called with unset patch_port_in_index" << endmsg;
1448                 return;
1449         } else if (value.type() == Variant::NOTHING) {
1450                 error << "LV2: set_property called with void value" << endmsg;
1451                 return;
1452         }
1453
1454         // Set up forge to write to temporary buffer on the stack
1455         LV2_Atom_Forge*      forge = &_impl->ui_forge;
1456         LV2_Atom_Forge_Frame frame;
1457         uint8_t              buf[PATH_MAX];  // Ought to be enough for anyone...
1458
1459         lv2_atom_forge_set_buffer(forge, buf, sizeof(buf));
1460
1461         // Serialize patch:Set message to set property
1462 #ifdef HAVE_LV2_1_10_0
1463         lv2_atom_forge_object(forge, &frame, 1, _uri_map.urids.patch_Set);
1464         lv2_atom_forge_key(forge, _uri_map.urids.patch_property);
1465         lv2_atom_forge_urid(forge, key);
1466         lv2_atom_forge_key(forge, _uri_map.urids.patch_value);
1467 #else
1468         lv2_atom_forge_blank(forge, &frame, 1, _uri_map.urids.patch_Set);
1469         lv2_atom_forge_property_head(forge, _uri_map.urids.patch_property, 0);
1470         lv2_atom_forge_urid(forge, key);
1471         lv2_atom_forge_property_head(forge, _uri_map.urids.patch_value, 0);
1472 #endif
1473
1474         forge_variant(forge, value);
1475
1476         // Write message to UI=>Plugin ring
1477         const LV2_Atom* const atom = (const LV2_Atom*)buf;
1478         write_from_ui(_patch_port_in_index,
1479                       _uri_map.urids.atom_eventTransfer,
1480                       lv2_atom_total_size(atom),
1481                       (const uint8_t*)atom);
1482 }
1483
1484 const ParameterDescriptor&
1485 LV2Plugin::get_property_descriptor(uint32_t id) const
1486 {
1487         PropertyDescriptors::const_iterator p = _property_descriptors.find(id);
1488         if (p != _property_descriptors.end()) {
1489                 return p->second;
1490         }
1491         return Plugin::get_property_descriptor(id);
1492 }
1493
1494 static void
1495 load_parameter_descriptor_units(LilvWorld* lworld, ParameterDescriptor& desc, const LilvNodes* units)
1496 {
1497         if (lilv_nodes_contains(units, _world.units_midiNote)) {
1498                 desc.unit = ParameterDescriptor::MIDI_NOTE;
1499         } else if (lilv_nodes_contains(units, _world.units_db)) {
1500                 desc.unit = ParameterDescriptor::DB;
1501         } else if (lilv_nodes_contains(units, _world.units_hz)) {
1502                 desc.unit = ParameterDescriptor::HZ;
1503         }
1504         if (lilv_nodes_size(units) > 0) {
1505                 const LilvNode* unit = lilv_nodes_get_first(units);
1506                 LilvNode* render = get_value(lworld, unit, _world.units_render);
1507                 if (render) {
1508                         desc.print_fmt = lilv_node_as_string(render);
1509                         lilv_node_free(render);
1510                 }
1511         }
1512 }
1513
1514 static void
1515 load_parameter_descriptor(LV2World&            world,
1516                           ParameterDescriptor& desc,
1517                           Variant::Type        datatype,
1518                           const LilvNode*      subject)
1519 {
1520         LilvWorld* lworld  = _world.world;
1521         LilvNode*  label   = get_value(lworld, subject, _world.rdfs_label);
1522         LilvNode*  def     = get_value(lworld, subject, _world.lv2_default);
1523         LilvNode*  minimum = get_value(lworld, subject, _world.lv2_minimum);
1524         LilvNode*  maximum = get_value(lworld, subject, _world.lv2_maximum);
1525         LilvNodes* units   = lilv_world_find_nodes(lworld, subject, _world.units_unit, NULL);
1526         if (label) {
1527                 desc.label = lilv_node_as_string(label);
1528         }
1529         if (def && lilv_node_is_float(def)) {
1530                 desc.normal = lilv_node_as_float(def);
1531         }
1532         if (minimum && lilv_node_is_float(minimum)) {
1533                 desc.lower = lilv_node_as_float(minimum);
1534         }
1535         if (maximum && lilv_node_is_float(maximum)) {
1536                 desc.upper = lilv_node_as_float(maximum);
1537         }
1538         load_parameter_descriptor_units(lworld, desc, units);
1539         desc.datatype      = datatype;
1540         desc.toggled      |= datatype == Variant::BOOL;
1541         desc.integer_step |= datatype == Variant::INT || datatype == Variant::LONG;
1542         desc.update_steps();
1543
1544         lilv_nodes_free(units);
1545         lilv_node_free(label);
1546         lilv_node_free(def);
1547         lilv_node_free(minimum);
1548         lilv_node_free(maximum);
1549 }
1550
1551 void
1552 LV2Plugin::load_supported_properties(PropertyDescriptors& descs)
1553 {
1554         LilvWorld*       lworld     = _world.world;
1555         const LilvNode*  subject    = lilv_plugin_get_uri(_impl->plugin);
1556         LilvNodes*       properties = lilv_world_find_nodes(
1557                 lworld, subject, _world.patch_writable, NULL);
1558         LILV_FOREACH(nodes, p, properties) {
1559                 // Get label and range
1560                 const LilvNode* prop  = lilv_nodes_get(properties, p);
1561                 LilvNode*       range = get_value(lworld, prop, _world.rdfs_range);
1562                 if (!range) {
1563                         warning << string_compose(_("LV2: property <%1> has no range datatype, ignoring"),
1564                                                   lilv_node_as_uri(prop)) << endmsg;
1565                         continue;
1566                 }
1567
1568                 // Convert range to variant type (TODO: support for multiple range types)
1569                 Variant::Type datatype;
1570                 if (!uri_to_variant_type(lilv_node_as_uri(range), datatype)) {
1571                         error << string_compose(_("LV2: property <%1> has unsupported datatype <%1>"),
1572                                                 lilv_node_as_uri(prop), lilv_node_as_uri(range)) << endmsg;
1573                         continue;
1574                 }
1575
1576                 // Add description to result
1577                 ParameterDescriptor desc;
1578                 desc.key      = _uri_map.uri_to_id(lilv_node_as_uri(prop));
1579                 desc.datatype = datatype;
1580                 load_parameter_descriptor(_world, desc, datatype, prop);
1581                 descs.insert(std::make_pair(desc.key, desc));
1582
1583                 lilv_node_free(range);
1584         }
1585         lilv_nodes_free(properties);
1586 }
1587
1588 void
1589 LV2Plugin::announce_property_values()
1590 {
1591         if (_patch_port_in_index == (uint32_t)-1) {
1592                 return;
1593         }
1594
1595         // Set up forge to write to temporary buffer on the stack
1596         LV2_Atom_Forge*      forge = &_impl->ui_forge;
1597         LV2_Atom_Forge_Frame frame;
1598         uint8_t              buf[PATH_MAX];  // Ought to be enough for anyone...
1599
1600         lv2_atom_forge_set_buffer(forge, buf, sizeof(buf));
1601
1602         // Serialize patch:Get message with no subject (implicitly plugin instance)
1603 #ifdef HAVE_LV2_1_10_0
1604         lv2_atom_forge_object(forge, &frame, 1, _uri_map.urids.patch_Get);
1605 #else
1606         lv2_atom_forge_blank(forge, &frame, 1, _uri_map.urids.patch_Get);
1607 #endif
1608
1609         // Write message to UI=>Plugin ring
1610         const LV2_Atom* const atom = (const LV2_Atom*)buf;
1611         write_from_ui(_patch_port_in_index,
1612                       _uri_map.urids.atom_eventTransfer,
1613                       lv2_atom_total_size(atom),
1614                       (const uint8_t*)atom);
1615 }
1616
1617 void
1618 LV2Plugin::enable_ui_emission()
1619 {
1620         if (!_to_ui) {
1621                 /* see note in LV2Plugin::write_from_ui() */
1622                 uint32_t bufsiz = 32768;
1623                 if (_atom_ev_buffers && _atom_ev_buffers[0]) {
1624                         bufsiz =  lv2_evbuf_get_capacity(_atom_ev_buffers[0]);
1625                 }
1626                 size_t rbs = _session.engine().raw_buffer_size(DataType::MIDI) * NBUFS;
1627                 rbs = max((size_t) bufsiz * 8, rbs);
1628                 _to_ui = new RingBuffer<uint8_t>(rbs);
1629         }
1630 }
1631
1632 void
1633 LV2Plugin::emit_to_ui(void* controller, UIMessageSink sink)
1634 {
1635         if (!_to_ui) {
1636                 return;
1637         }
1638
1639         uint32_t read_space = _to_ui->read_space();
1640         while (read_space > sizeof(UIMessage)) {
1641                 UIMessage msg;
1642                 if (_to_ui->read((uint8_t*)&msg, sizeof(msg)) != sizeof(msg)) {
1643                         error << "Error reading from Plugin=>UI RingBuffer" << endmsg;
1644                         break;
1645                 }
1646                 vector<uint8_t> body(msg.size);
1647                 if (_to_ui->read(&body[0], msg.size) != msg.size) {
1648                         error << "Error reading from Plugin=>UI RingBuffer" << endmsg;
1649                         break;
1650                 }
1651
1652                 sink(controller, msg.index, msg.size, msg.protocol, &body[0]);
1653
1654                 read_space -= sizeof(msg) + msg.size;
1655         }
1656 }
1657
1658 int
1659 LV2Plugin::work(uint32_t size, const void* data)
1660 {
1661         return _impl->work_iface->work(
1662                 _impl->instance->lv2_handle, work_respond, this, size, data);
1663 }
1664
1665 int
1666 LV2Plugin::work_response(uint32_t size, const void* data)
1667 {
1668         return _impl->work_iface->work_response(
1669                 _impl->instance->lv2_handle, size, data);
1670 }
1671
1672 void
1673 LV2Plugin::set_insert_id(PBD::ID id)
1674 {
1675         if (_insert_id == "0") {
1676                 _insert_id = id;
1677         } else if (_insert_id != id) {
1678                 lilv_state_free(_impl->state);
1679                 _impl->state = NULL;
1680                 _insert_id   = id;
1681         }
1682 }
1683
1684 void
1685 LV2Plugin::set_state_dir (const std::string& d)
1686 {
1687         _plugin_state_dir = d;
1688 }
1689
1690 int
1691 LV2Plugin::set_state(const XMLNode& node, int version)
1692 {
1693         XMLNodeList          nodes;
1694         const XMLProperty*   prop;
1695         XMLNodeConstIterator iter;
1696         XMLNode*             child;
1697         const char*          sym;
1698         const char*          value;
1699         uint32_t             port_id;
1700         LocaleGuard          lg(X_("C"));
1701
1702         if (node.name() != state_node_name()) {
1703                 error << _("Bad node sent to LV2Plugin::set_state") << endmsg;
1704                 return -1;
1705         }
1706
1707 #ifndef NO_PLUGIN_STATE
1708
1709         if (version < 3000) {
1710                 nodes = node.children("port");
1711         } else {
1712                 nodes = node.children("Port");
1713         }
1714
1715         for (iter = nodes.begin(); iter != nodes.end(); ++iter) {
1716
1717                 child = *iter;
1718
1719                 if ((prop = child->property("symbol")) != 0) {
1720                         sym = prop->value().c_str();
1721                 } else {
1722                         warning << _("LV2: port has no symbol, ignored") << endmsg;
1723                         continue;
1724                 }
1725
1726                 map<string, uint32_t>::iterator i = _port_indices.find(sym);
1727
1728                 if (i != _port_indices.end()) {
1729                         port_id = i->second;
1730                 } else {
1731                         warning << _("LV2: port has unknown index, ignored") << endmsg;
1732                         continue;
1733                 }
1734
1735                 if ((prop = child->property("value")) != 0) {
1736                         value = prop->value().c_str();
1737                 } else {
1738                         warning << _("LV2: port has no value, ignored") << endmsg;
1739                         continue;
1740                 }
1741
1742                 set_parameter(port_id, atof(value));
1743         }
1744
1745         if ((prop = node.property("template-dir")) != 0) {
1746                 set_state_dir (prop->value ());
1747         }
1748
1749         _state_version = 0;
1750         if ((prop = node.property("state-dir")) != 0) {
1751                 if (sscanf(prop->value().c_str(), "state%u", &_state_version) != 1) {
1752                         error << string_compose(
1753                                 "LV2: failed to parse state version from \"%1\"",
1754                                 prop->value()) << endmsg;
1755                 }
1756
1757                 std::string state_file = Glib::build_filename(
1758                         plugin_dir(),
1759                         Glib::build_filename(prop->value(), "state.ttl"));
1760
1761                 LilvState* state = lilv_state_new_from_file(
1762                         _world.world, _uri_map.urid_map(), NULL, state_file.c_str());
1763
1764                 lilv_state_restore(state, _impl->instance, NULL, NULL, 0, NULL);
1765                 lilv_state_free(_impl->state);
1766                 _impl->state = state;
1767         }
1768
1769         if (!_plugin_state_dir.empty ()) {
1770                 // force save with session, next time (increment counter)
1771                 lilv_state_free (_impl->state);
1772                 _impl->state = NULL;
1773                 set_state_dir ("");
1774         }
1775
1776         latency_compute_run();
1777 #endif
1778
1779         return Plugin::set_state(node, version);
1780 }
1781
1782 int
1783 LV2Plugin::get_parameter_descriptor(uint32_t which, ParameterDescriptor& desc) const
1784 {
1785         const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, which);
1786         if (!port) {
1787                 error << string_compose("LV2: get descriptor of non-existent port %1", which)
1788                       << endmsg;
1789                 return 1;
1790         }
1791
1792         LilvNodes* portunits;
1793         LilvNode *def, *min, *max;
1794         lilv_port_get_range(_impl->plugin, port, &def, &min, &max);
1795         portunits = lilv_port_get_value(_impl->plugin, port, _world.units_unit);
1796
1797         // TODO: Once we can rely on lilv 0.18.0 being present,
1798         // load_parameter_descriptor() can be used for ports as well
1799         desc.integer_step = lilv_port_has_property(_impl->plugin, port, _world.lv2_integer);
1800         desc.toggled      = lilv_port_has_property(_impl->plugin, port, _world.lv2_toggled);
1801         desc.logarithmic  = lilv_port_has_property(_impl->plugin, port, _world.ext_logarithmic);
1802         desc.sr_dependent = lilv_port_has_property(_impl->plugin, port, _world.lv2_sampleRate);
1803         desc.label        = lilv_node_as_string(lilv_port_get_name(_impl->plugin, port));
1804         desc.normal       = def ? lilv_node_as_float(def) : 0.0f;
1805         desc.lower        = min ? lilv_node_as_float(min) : 0.0f;
1806         desc.upper        = max ? lilv_node_as_float(max) : 1.0f;
1807         load_parameter_descriptor_units(_world.world, desc, portunits);
1808
1809         if (desc.sr_dependent) {
1810                 desc.lower *= _session.frame_rate ();
1811                 desc.upper *= _session.frame_rate ();
1812         }
1813
1814         desc.min_unbound  = false; // TODO: LV2 extension required
1815         desc.max_unbound  = false; // TODO: LV2 extension required
1816
1817         desc.enumeration = lilv_port_has_property(_impl->plugin, port, _world.lv2_enumeration);
1818         desc.scale_points = get_scale_points(which);
1819
1820         desc.update_steps();
1821
1822         lilv_node_free(def);
1823         lilv_node_free(min);
1824         lilv_node_free(max);
1825         lilv_nodes_free(portunits);
1826
1827         return 0;
1828 }
1829
1830 string
1831 LV2Plugin::describe_parameter(Evoral::Parameter which)
1832 {
1833         if (( which.type() == PluginAutomation) && ( which.id() < parameter_count()) ) {
1834
1835                 if (lilv_port_has_property(_impl->plugin,
1836                                         lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.ext_notOnGUI)) {
1837                         return X_("hidden");
1838                 }
1839
1840                 if (lilv_port_has_property(_impl->plugin,
1841                                         lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.lv2_freewheeling)) {
1842                         return X_("hidden");
1843                 }
1844
1845                 if (lilv_port_has_property(_impl->plugin,
1846                                         lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.lv2_reportsLatency)) {
1847                         return X_("latency");
1848                 }
1849
1850                 LilvNode* name = lilv_port_get_name(_impl->plugin,
1851                                                     lilv_plugin_get_port_by_index(_impl->plugin, which.id()));
1852                 string ret(lilv_node_as_string(name));
1853                 lilv_node_free(name);
1854                 return ret;
1855         } else {
1856                 return "??";
1857         }
1858 }
1859
1860 framecnt_t
1861 LV2Plugin::signal_latency() const
1862 {
1863         if (_latency_control_port) {
1864                 return (framecnt_t)floor(*_latency_control_port);
1865         } else {
1866                 return 0;
1867         }
1868 }
1869
1870 set<Evoral::Parameter>
1871 LV2Plugin::automatable() const
1872 {
1873         set<Evoral::Parameter> ret;
1874
1875         for (uint32_t i = 0; i < parameter_count(); ++i) {
1876                 if (parameter_is_input(i) && parameter_is_control(i)) {
1877                         ret.insert(ret.end(), Evoral::Parameter(PluginAutomation, 0, i));
1878                 }
1879         }
1880
1881         for (PropertyDescriptors::const_iterator p = _property_descriptors.begin();
1882              p != _property_descriptors.end();
1883              ++p) {
1884                 ret.insert(ret.end(), Evoral::Parameter(PluginPropertyAutomation, 0, p->first));
1885         }
1886         return ret;
1887 }
1888
1889 void
1890 LV2Plugin::activate()
1891 {
1892         DEBUG_TRACE(DEBUG::LV2, string_compose("%1 activate\n", name()));
1893
1894         if (!_was_activated) {
1895                 lilv_instance_activate(_impl->instance);
1896                 _was_activated = true;
1897         }
1898 }
1899
1900 void
1901 LV2Plugin::deactivate()
1902 {
1903         DEBUG_TRACE(DEBUG::LV2, string_compose("%1 deactivate\n", name()));
1904
1905         if (_was_activated) {
1906                 lilv_instance_deactivate(_impl->instance);
1907                 _was_activated = false;
1908         }
1909 }
1910
1911 void
1912 LV2Plugin::cleanup()
1913 {
1914         DEBUG_TRACE(DEBUG::LV2, string_compose("%1 cleanup\n", name()));
1915
1916         activate();
1917         deactivate();
1918         lilv_instance_free(_impl->instance);
1919         _impl->instance = NULL;
1920 }
1921
1922 void
1923 LV2Plugin::allocate_atom_event_buffers()
1924 {
1925         /* reserve local scratch buffers for ATOM event-queues */
1926         const LilvPlugin* p = _impl->plugin;
1927
1928         /* count non-MIDI atom event-ports
1929          * TODO: nicely ask drobilla to make a lilv_ call for that
1930          */
1931         int count_atom_out = 0;
1932         int count_atom_in = 0;
1933         int minimumSize = 32768; // TODO use a per-port minimum-size
1934         for (uint32_t i = 0; i < lilv_plugin_get_num_ports(p); ++i) {
1935                 const LilvPort* port  = lilv_plugin_get_port_by_index(p, i);
1936                 if (lilv_port_is_a(p, port, _world.atom_AtomPort)) {
1937                         LilvNodes* buffer_types = lilv_port_get_value(
1938                                 p, port, _world.atom_bufferType);
1939                         LilvNodes* atom_supports = lilv_port_get_value(
1940                                 p, port, _world.atom_supports);
1941
1942                         if (!lilv_nodes_contains(buffer_types, _world.atom_Sequence)
1943                                         || !lilv_nodes_contains(atom_supports, _world.midi_MidiEvent)) {
1944                                 if (lilv_port_is_a(p, port, _world.lv2_InputPort)) {
1945                                         count_atom_in++;
1946                                 }
1947                                 if (lilv_port_is_a(p, port, _world.lv2_OutputPort)) {
1948                                         count_atom_out++;
1949                                 }
1950                                 LilvNodes* min_size_v = lilv_port_get_value(_impl->plugin, port, _world.rsz_minimumSize);
1951                                 LilvNode* min_size = min_size_v ? lilv_nodes_get_first(min_size_v) : NULL;
1952                                 if (min_size && lilv_node_is_int(min_size)) {
1953                                         minimumSize = std::max(minimumSize, lilv_node_as_int(min_size));
1954                                 }
1955                                 lilv_nodes_free(min_size_v);
1956                         }
1957                         lilv_nodes_free(buffer_types);
1958                         lilv_nodes_free(atom_supports);
1959                 }
1960         }
1961
1962         DEBUG_TRACE(DEBUG::LV2, string_compose("%1 need buffers for %2 atom-in and %3 atom-out event-ports\n",
1963                                 name(), count_atom_in, count_atom_out));
1964
1965         const int total_atom_buffers = (count_atom_in + count_atom_out);
1966         if (_atom_ev_buffers || total_atom_buffers == 0) {
1967                 return;
1968         }
1969
1970         DEBUG_TRACE(DEBUG::LV2, string_compose("allocate %1 atom_ev_buffers of %d bytes\n", total_atom_buffers, minimumSize));
1971         _atom_ev_buffers = (LV2_Evbuf**) malloc((total_atom_buffers + 1) * sizeof(LV2_Evbuf*));
1972         for (int i = 0; i < total_atom_buffers; ++i ) {
1973                 _atom_ev_buffers[i] = lv2_evbuf_new(minimumSize, LV2_EVBUF_ATOM,
1974                                 _uri_map.urids.atom_Chunk, _uri_map.urids.atom_Sequence);
1975         }
1976         _atom_ev_buffers[total_atom_buffers] = 0;
1977         return;
1978 }
1979
1980 /** Write an ardour position/time/tempo/meter as an LV2 event.
1981  * @return true on success.
1982  */
1983 static bool
1984 write_position(LV2_Atom_Forge*     forge,
1985                LV2_Evbuf*          buf,
1986                const TempoMetric&  t,
1987                Timecode::BBT_Time& bbt,
1988                double              speed,
1989                framepos_t          position,
1990                framecnt_t          offset)
1991 {
1992         const URIMap::URIDs& urids = URIMap::instance().urids;
1993
1994         uint8_t pos_buf[256];
1995         lv2_atom_forge_set_buffer(forge, pos_buf, sizeof(pos_buf));
1996         LV2_Atom_Forge_Frame frame;
1997 #ifdef HAVE_LV2_1_10_0
1998         lv2_atom_forge_object(forge, &frame, 1, urids.time_Position);
1999         lv2_atom_forge_key(forge, urids.time_frame);
2000         lv2_atom_forge_long(forge, position);
2001         lv2_atom_forge_key(forge, urids.time_speed);
2002         lv2_atom_forge_float(forge, speed);
2003         lv2_atom_forge_key(forge, urids.time_barBeat);
2004         lv2_atom_forge_float(forge, bbt.beats - 1 +
2005                              (bbt.ticks / Timecode::BBT_Time::ticks_per_beat));
2006         lv2_atom_forge_key(forge, urids.time_bar);
2007         lv2_atom_forge_long(forge, bbt.bars - 1);
2008         lv2_atom_forge_key(forge, urids.time_beatUnit);
2009         lv2_atom_forge_int(forge, t.meter().note_divisor());
2010         lv2_atom_forge_key(forge, urids.time_beatsPerBar);
2011         lv2_atom_forge_float(forge, t.meter().divisions_per_bar());
2012         lv2_atom_forge_key(forge, urids.time_beatsPerMinute);
2013         lv2_atom_forge_float(forge, t.tempo().beats_per_minute());
2014 #else
2015         lv2_atom_forge_blank(forge, &frame, 1, urids.time_Position);
2016         lv2_atom_forge_property_head(forge, urids.time_frame, 0);
2017         lv2_atom_forge_long(forge, position);
2018         lv2_atom_forge_property_head(forge, urids.time_speed, 0);
2019         lv2_atom_forge_float(forge, speed);
2020         lv2_atom_forge_property_head(forge, urids.time_barBeat, 0);
2021         lv2_atom_forge_float(forge, bbt.beats - 1 +
2022                              (bbt.ticks / Timecode::BBT_Time::ticks_per_beat));
2023         lv2_atom_forge_property_head(forge, urids.time_bar, 0);
2024         lv2_atom_forge_long(forge, bbt.bars - 1);
2025         lv2_atom_forge_property_head(forge, urids.time_beatUnit, 0);
2026         lv2_atom_forge_int(forge, t.meter().note_divisor());
2027         lv2_atom_forge_property_head(forge, urids.time_beatsPerBar, 0);
2028         lv2_atom_forge_float(forge, t.meter().divisions_per_bar());
2029         lv2_atom_forge_property_head(forge, urids.time_beatsPerMinute, 0);
2030         lv2_atom_forge_float(forge, t.tempo().beats_per_minute());
2031 #endif
2032
2033         LV2_Evbuf_Iterator    end  = lv2_evbuf_end(buf);
2034         const LV2_Atom* const atom = (const LV2_Atom*)pos_buf;
2035         return lv2_evbuf_write(&end, offset, 0, atom->type, atom->size,
2036                                (const uint8_t*)(atom + 1));
2037 }
2038
2039 int
2040 LV2Plugin::connect_and_run(BufferSet& bufs,
2041         ChanMapping in_map, ChanMapping out_map,
2042         pframes_t nframes, framecnt_t offset)
2043 {
2044         DEBUG_TRACE(DEBUG::LV2, string_compose("%1 run %2 offset %3\n", name(), nframes, offset));
2045         Plugin::connect_and_run(bufs, in_map, out_map, nframes, offset);
2046
2047         cycles_t then = get_cycles();
2048
2049         TempoMap&               tmap     = _session.tempo_map();
2050         Metrics::const_iterator metric_i = tmap.metrics_end();
2051         TempoMetric             tmetric  = tmap.metric_at(_session.transport_frame(), &metric_i);
2052
2053         if (_freewheel_control_port) {
2054                 *_freewheel_control_port = _session.engine().freewheeling() ? 1.f : 0.f;
2055         }
2056
2057         if (_bpm_control_port) {
2058                 *_bpm_control_port = tmetric.tempo().beats_per_minute();
2059         }
2060
2061         ChanCount bufs_count;
2062         bufs_count.set(DataType::AUDIO, 1);
2063         bufs_count.set(DataType::MIDI, 1);
2064         BufferSet& silent_bufs  = _session.get_silent_buffers(bufs_count);
2065         BufferSet& scratch_bufs = _session.get_scratch_buffers(bufs_count);
2066         uint32_t const num_ports = parameter_count();
2067         uint32_t const nil_index = std::numeric_limits<uint32_t>::max();
2068
2069         uint32_t audio_in_index  = 0;
2070         uint32_t audio_out_index = 0;
2071         uint32_t midi_in_index   = 0;
2072         uint32_t midi_out_index  = 0;
2073         uint32_t atom_port_index = 0;
2074         for (uint32_t port_index = 0; port_index < num_ports; ++port_index) {
2075                 void*     buf   = NULL;
2076                 uint32_t  index = nil_index;
2077                 PortFlags flags = _port_flags[port_index];
2078                 bool      valid = false;
2079                 if (flags & PORT_AUDIO) {
2080                         if (flags & PORT_INPUT) {
2081                                 index = in_map.get(DataType::AUDIO, audio_in_index++, &valid);
2082                                 buf = (valid)
2083                                         ? bufs.get_audio(index).data(offset)
2084                                         : silent_bufs.get_audio(0).data(offset);
2085                         } else {
2086                                 index = out_map.get(DataType::AUDIO, audio_out_index++, &valid);
2087                                 buf = (valid)
2088                                         ? bufs.get_audio(index).data(offset)
2089                                         : scratch_bufs.get_audio(0).data(offset);
2090                         }
2091                 } else if (flags & (PORT_EVENT|PORT_SEQUENCE)) {
2092                         /* FIXME: The checks here for bufs.count().n_midi() > index shouldn't
2093                            be necessary, but the mapping is illegal in some cases.  Ideally
2094                            that should be fixed, but this is easier...
2095                         */
2096                         if (flags & PORT_MIDI) {
2097                                 if (flags & PORT_INPUT) {
2098                                         index = in_map.get(DataType::MIDI, midi_in_index++, &valid);
2099                                 } else {
2100                                         index = out_map.get(DataType::MIDI, midi_out_index++, &valid);
2101                                 }
2102                                 if (valid && bufs.count().n_midi() > index) {
2103                                         /* Note, ensure_lv2_bufsize() is not RT safe!
2104                                          * However free()/alloc() is only called if a
2105                                          * plugin requires a rsz:minimumSize buffersize
2106                                          * and the existing buffer if smaller.
2107                                          */
2108                                         bufs.ensure_lv2_bufsize((flags & PORT_INPUT), index, _port_minimumSize[port_index]);
2109                                         _ev_buffers[port_index] = bufs.get_lv2_midi(
2110                                                 (flags & PORT_INPUT), index, (flags & PORT_EVENT));
2111                                 }
2112                         } else if ((flags & PORT_POSITION) && (flags & PORT_INPUT)) {
2113                                 lv2_evbuf_reset(_atom_ev_buffers[atom_port_index], true);
2114                                 _ev_buffers[port_index] = _atom_ev_buffers[atom_port_index++];
2115                                 valid                   = true;
2116                         }
2117
2118                         if (valid && (flags & PORT_INPUT)) {
2119                                 Timecode::BBT_Time bbt;
2120                                 if ((flags & PORT_POSITION)) {
2121                                         if (_session.transport_frame() != _next_cycle_start ||
2122                                             _session.transport_speed() != _next_cycle_speed) {
2123                                                 // Transport has changed, write position at cycle start
2124                                                 tmap.bbt_time(_session.transport_frame(), bbt);
2125                                                 write_position(&_impl->forge, _ev_buffers[port_index],
2126                                                                tmetric, bbt, _session.transport_speed(),
2127                                                                _session.transport_frame(), 0);
2128                                         }
2129                                 }
2130
2131                                 // Get MIDI iterator range (empty range if no MIDI)
2132                                 MidiBuffer::iterator m = (index != nil_index)
2133                                         ? bufs.get_midi(index).begin()
2134                                         : silent_bufs.get_midi(0).end();
2135                                 MidiBuffer::iterator m_end = (index != nil_index)
2136                                         ? bufs.get_midi(index).end()
2137                                         : m;
2138
2139                                 // Now merge MIDI and any transport events into the buffer
2140                                 const uint32_t     type = _uri_map.urids.midi_MidiEvent;
2141                                 const framepos_t   tend = _session.transport_frame() + nframes;
2142                                 ++metric_i;
2143                                 while (m != m_end || (metric_i != tmap.metrics_end() &&
2144                                                       (*metric_i)->frame() < tend)) {
2145                                         MetricSection* metric = (metric_i != tmap.metrics_end())
2146                                                 ? *metric_i : NULL;
2147                                         if (m != m_end && (!metric || metric->frame() > (*m).time())) {
2148                                                 const Evoral::MIDIEvent<framepos_t> ev(*m, false);
2149                                                 LV2_Evbuf_Iterator eend = lv2_evbuf_end(_ev_buffers[port_index]);
2150                                                 lv2_evbuf_write(&eend, ev.time(), 0, type, ev.size(), ev.buffer());
2151                                                 ++m;
2152                                         } else {
2153                                                 tmetric.set_metric(metric);
2154                                                 bbt = metric->start();
2155                                                 write_position(&_impl->forge, _ev_buffers[port_index],
2156                                                                tmetric, bbt, _session.transport_speed(),
2157                                                                metric->frame(),
2158                                                                metric->frame() - _session.transport_frame());
2159                                                 ++metric_i;
2160                                         }
2161                                 }
2162                         } else if (!valid) {
2163                                 // Nothing we understand or care about, connect to scratch
2164                                 // see note for midi-buffer size above
2165                                 scratch_bufs.ensure_lv2_bufsize((flags & PORT_INPUT),
2166                                                 0, _port_minimumSize[port_index]);
2167                                 _ev_buffers[port_index] = scratch_bufs.get_lv2_midi(
2168                                         (flags & PORT_INPUT), 0, (flags & PORT_EVENT));
2169                         }
2170
2171                         buf = lv2_evbuf_get_buffer(_ev_buffers[port_index]);
2172                 } else {
2173                         continue;  // Control port, leave buffer alone
2174                 }
2175                 lilv_instance_connect_port(_impl->instance, port_index, buf);
2176         }
2177
2178         // Read messages from UI and push into appropriate buffers
2179         if (_from_ui) {
2180                 uint32_t read_space = _from_ui->read_space();
2181                 while (read_space > sizeof(UIMessage)) {
2182                         UIMessage msg;
2183                         if (_from_ui->read((uint8_t*)&msg, sizeof(msg)) != sizeof(msg)) {
2184                                 error << "Error reading from UI=>Plugin RingBuffer" << endmsg;
2185                                 break;
2186                         }
2187                         vector<uint8_t> body(msg.size);
2188                         if (_from_ui->read(&body[0], msg.size) != msg.size) {
2189                                 error << "Error reading from UI=>Plugin RingBuffer" << endmsg;
2190                                 break;
2191                         }
2192                         if (msg.protocol == URIMap::instance().urids.atom_eventTransfer) {
2193                                 LV2_Evbuf*            buf  = _ev_buffers[msg.index];
2194                                 LV2_Evbuf_Iterator    i    = lv2_evbuf_end(buf);
2195                                 const LV2_Atom* const atom = (const LV2_Atom*)&body[0];
2196                                 if (!lv2_evbuf_write(&i, nframes - 1, 0, atom->type, atom->size,
2197                                                 (const uint8_t*)(atom + 1))) {
2198                                         error << "Failed to write data to LV2 event buffer\n";
2199                                 }
2200                         } else {
2201                                 error << "Received unknown message type from UI" << endmsg;
2202                         }
2203                         read_space -= sizeof(UIMessage) + msg.size;
2204                 }
2205         }
2206
2207         run(nframes);
2208
2209         midi_out_index = 0;
2210         for (uint32_t port_index = 0; port_index < num_ports; ++port_index) {
2211                 PortFlags flags = _port_flags[port_index];
2212                 bool      valid = false;
2213
2214                 /* TODO ask drobilla about comment
2215                  * "Make Ardour event buffers generic so plugins can communicate"
2216                  * in libs/ardour/buffer_set.cc:310
2217                  *
2218                  * ideally the user could choose which of the following two modes
2219                  * to use (e.g. instrument/effect chains  MIDI OUT vs MIDI TRHU).
2220                  *
2221                  * This implementation follows the discussion on IRC Mar 16 2013 16:47 UTC
2222                  * 16:51 < drobilla> rgareus: [..] i.e always replace with MIDI output [of LV2 plugin] if it's there
2223                  * 16:52 < drobilla> rgareus: That would probably be good enough [..] to make users not complain
2224                  *                            for quite a while at least ;)
2225                  */
2226                 // copy output of LV2 plugin's MIDI port to Ardour MIDI buffers -- MIDI OUT
2227                 if ((flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE|PORT_MIDI))) {
2228                         const uint32_t buf_index = out_map.get(
2229                                 DataType::MIDI, midi_out_index++, &valid);
2230                         if (valid) {
2231                                 bufs.forward_lv2_midi(_ev_buffers[port_index], buf_index);
2232                         }
2233                 }
2234                 // Flush MIDI (write back to Ardour MIDI buffers) -- MIDI THRU
2235                 else if ((flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE))) {
2236                         const uint32_t buf_index = out_map.get(
2237                                 DataType::MIDI, midi_out_index++, &valid);
2238                         if (valid) {
2239                                 bufs.flush_lv2_midi(true, buf_index);
2240                         }
2241                 }
2242
2243
2244                 // Write messages to UI
2245                 if ((_to_ui || _patch_port_out_index != (uint32_t)-1) &&
2246                     (flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE))) {
2247                         LV2_Evbuf* buf = _ev_buffers[port_index];
2248                         for (LV2_Evbuf_Iterator i = lv2_evbuf_begin(buf);
2249                              lv2_evbuf_is_valid(i);
2250                              i = lv2_evbuf_next(i)) {
2251                                 uint32_t frames, subframes, type, size;
2252                                 uint8_t* data;
2253                                 lv2_evbuf_get(i, &frames, &subframes, &type, &size, &data);
2254
2255                                 // Intercept patch change messages to emit PropertyChanged signal
2256                                 if ((flags & PORT_PATCHMSG)) {
2257                                         LV2_Atom* atom = (LV2_Atom*)(data - sizeof(LV2_Atom));
2258                                         if (atom->type == _uri_map.urids.atom_Blank ||
2259                                             atom->type == _uri_map.urids.atom_Object) {
2260                                                 LV2_Atom_Object* obj = (LV2_Atom_Object*)atom;
2261                                                 if (obj->body.otype == _uri_map.urids.patch_Set) {
2262                                                         const LV2_Atom* property = NULL;
2263                                                         const LV2_Atom* value    = NULL;
2264                                                         lv2_atom_object_get(obj,
2265                                                                             _uri_map.urids.patch_property, &property,
2266                                                                             _uri_map.urids.patch_value,    &value,
2267                                                                             0);
2268
2269                                                         if (!property || !value ||
2270                                                             property->type != _uri_map.urids.atom_URID ||
2271                                                             value->type    != _uri_map.urids.atom_Path) {
2272                                                                 std::cerr << "warning: patch:Set for unknown property" << std::endl;
2273                                                                 continue;
2274                                                         }
2275
2276                                                         const uint32_t prop_id = ((const LV2_Atom_URID*)property)->body;
2277                                                         const char*    path    = (const char*)LV2_ATOM_BODY_CONST(value);
2278
2279                                                         // Emit PropertyChanged signal for UI
2280                                                         // TODO: This should emit the control's Changed signal
2281                                                         PropertyChanged(prop_id, Variant(Variant::PATH, path));
2282                                                 }
2283                                         }
2284                                 }
2285
2286                                 if (!_to_ui) continue;
2287                                 write_to_ui(port_index, URIMap::instance().urids.atom_eventTransfer,
2288                                             size + sizeof(LV2_Atom),
2289                                             data - sizeof(LV2_Atom));
2290                         }
2291                 }
2292         }
2293
2294         cycles_t now = get_cycles();
2295         set_cycles((uint32_t)(now - then));
2296
2297         // Update expected transport information for next cycle so we can detect changes
2298         _next_cycle_speed = _session.transport_speed();
2299         _next_cycle_start = _session.transport_frame() + (nframes * _next_cycle_speed);
2300
2301         return 0;
2302 }
2303
2304 bool
2305 LV2Plugin::parameter_is_control(uint32_t param) const
2306 {
2307         assert(param < _port_flags.size());
2308         return _port_flags[param] & PORT_CONTROL;
2309 }
2310
2311 bool
2312 LV2Plugin::parameter_is_audio(uint32_t param) const
2313 {
2314         assert(param < _port_flags.size());
2315         return _port_flags[param] & PORT_AUDIO;
2316 }
2317
2318 bool
2319 LV2Plugin::parameter_is_event(uint32_t param) const
2320 {
2321         assert(param < _port_flags.size());
2322         return _port_flags[param] & PORT_EVENT;
2323 }
2324
2325 bool
2326 LV2Plugin::parameter_is_output(uint32_t param) const
2327 {
2328         assert(param < _port_flags.size());
2329         return _port_flags[param] & PORT_OUTPUT;
2330 }
2331
2332 bool
2333 LV2Plugin::parameter_is_input(uint32_t param) const
2334 {
2335         assert(param < _port_flags.size());
2336         return _port_flags[param] & PORT_INPUT;
2337 }
2338
2339 void
2340 LV2Plugin::print_parameter(uint32_t param, char* buf, uint32_t len) const
2341 {
2342         if (buf && len) {
2343                 if (param < parameter_count()) {
2344                         snprintf(buf, len, "%.3f", get_parameter(param));
2345                 } else {
2346                         strcat(buf, "0");
2347                 }
2348         }
2349 }
2350
2351 boost::shared_ptr<ScalePoints>
2352 LV2Plugin::get_scale_points(uint32_t port_index) const
2353 {
2354         const LilvPort*  port   = lilv_plugin_get_port_by_index(_impl->plugin, port_index);
2355         LilvScalePoints* points = lilv_port_get_scale_points(_impl->plugin, port);
2356
2357         boost::shared_ptr<ScalePoints> ret;
2358         if (!points) {
2359                 return ret;
2360         }
2361
2362         ret = boost::shared_ptr<ScalePoints>(new ScalePoints());
2363
2364         LILV_FOREACH(scale_points, i, points) {
2365                 const LilvScalePoint* p     = lilv_scale_points_get(points, i);
2366                 const LilvNode*       label = lilv_scale_point_get_label(p);
2367                 const LilvNode*       value = lilv_scale_point_get_value(p);
2368                 if (label && (lilv_node_is_float(value) || lilv_node_is_int(value))) {
2369                         ret->insert(make_pair(lilv_node_as_string(label),
2370                                               lilv_node_as_float(value)));
2371                 }
2372         }
2373
2374         lilv_scale_points_free(points);
2375         return ret;
2376 }
2377
2378 void
2379 LV2Plugin::run(pframes_t nframes)
2380 {
2381         uint32_t const N = parameter_count();
2382         for (uint32_t i = 0; i < N; ++i) {
2383                 if (parameter_is_control(i) && parameter_is_input(i)) {
2384                         _control_data[i] = _shadow_data[i];
2385                 }
2386         }
2387
2388         lilv_instance_run(_impl->instance, nframes);
2389
2390         if (_impl->work_iface) {
2391                 _worker->emit_responses();
2392                 if (_impl->work_iface->end_run) {
2393                         _impl->work_iface->end_run(_impl->instance->lv2_handle);
2394                 }
2395         }
2396 }
2397
2398 void
2399 LV2Plugin::latency_compute_run()
2400 {
2401         if (!_latency_control_port) {
2402                 return;
2403         }
2404
2405         // Run the plugin so that it can set its latency parameter
2406
2407         bool was_activated = _was_activated;
2408         activate();
2409
2410         uint32_t port_index = 0;
2411         uint32_t in_index   = 0;
2412         uint32_t out_index  = 0;
2413
2414         // this is done in the main thread. non realtime.
2415         const framecnt_t bufsize = _engine.samples_per_cycle();
2416         float            *buffer = (float*) malloc(_engine.samples_per_cycle() * sizeof(float));
2417
2418         memset(buffer, 0, sizeof(float) * bufsize);
2419
2420         // FIXME: Ensure plugins can handle in-place processing
2421
2422         port_index = 0;
2423
2424         while (port_index < parameter_count()) {
2425                 if (parameter_is_audio(port_index)) {
2426                         if (parameter_is_input(port_index)) {
2427                                 lilv_instance_connect_port(_impl->instance, port_index, buffer);
2428                                 in_index++;
2429                         } else if (parameter_is_output(port_index)) {
2430                                 lilv_instance_connect_port(_impl->instance, port_index, buffer);
2431                                 out_index++;
2432                         }
2433                 }
2434                 port_index++;
2435         }
2436
2437         run(bufsize);
2438         deactivate();
2439         if (was_activated) {
2440                 activate();
2441         }
2442         free(buffer);
2443 }
2444
2445 const LilvPort*
2446 LV2Plugin::Impl::designated_input (const char* uri, void** bufptrs[], void** bufptr)
2447 {
2448         const LilvPort* port = NULL;
2449         LilvNode* designation = lilv_new_uri(_world.world, uri);
2450         port = lilv_plugin_get_port_by_designation(
2451                 plugin, _world.lv2_InputPort, designation);
2452         lilv_node_free(designation);
2453         if (port) {
2454                 bufptrs[lilv_port_get_index(plugin, port)] = bufptr;
2455         }
2456         return port;
2457 }
2458
2459 static bool lv2_filter (const string& str, void* /*arg*/)
2460 {
2461         /* Not a dotfile, has a prefix before a period, suffix is "lv2" */
2462
2463         return str[0] != '.' && (str.length() > 3 && str.find (".lv2") == (str.length() - 4));
2464 }
2465
2466
2467 LV2World::LV2World()
2468         : world(lilv_world_new())
2469         , _bundle_checked(false)
2470 {
2471         atom_AtomPort      = lilv_new_uri(world, LV2_ATOM__AtomPort);
2472         atom_Chunk         = lilv_new_uri(world, LV2_ATOM__Chunk);
2473         atom_Sequence      = lilv_new_uri(world, LV2_ATOM__Sequence);
2474         atom_bufferType    = lilv_new_uri(world, LV2_ATOM__bufferType);
2475         atom_supports      = lilv_new_uri(world, LV2_ATOM__supports);
2476         atom_eventTransfer = lilv_new_uri(world, LV2_ATOM__eventTransfer);
2477         ev_EventPort       = lilv_new_uri(world, LILV_URI_EVENT_PORT);
2478         ext_logarithmic    = lilv_new_uri(world, LV2_PORT_PROPS__logarithmic);
2479         ext_notOnGUI       = lilv_new_uri(world, LV2_PORT_PROPS__notOnGUI);
2480         lv2_AudioPort      = lilv_new_uri(world, LILV_URI_AUDIO_PORT);
2481         lv2_ControlPort    = lilv_new_uri(world, LILV_URI_CONTROL_PORT);
2482         lv2_InputPort      = lilv_new_uri(world, LILV_URI_INPUT_PORT);
2483         lv2_OutputPort     = lilv_new_uri(world, LILV_URI_OUTPUT_PORT);
2484         lv2_inPlaceBroken  = lilv_new_uri(world, LV2_CORE__inPlaceBroken);
2485         lv2_integer        = lilv_new_uri(world, LV2_CORE__integer);
2486         lv2_default        = lilv_new_uri(world, LV2_CORE__default);
2487         lv2_minimum        = lilv_new_uri(world, LV2_CORE__minimum);
2488         lv2_maximum        = lilv_new_uri(world, LV2_CORE__maximum);
2489         lv2_reportsLatency = lilv_new_uri(world, LV2_CORE__reportsLatency);
2490         lv2_sampleRate     = lilv_new_uri(world, LV2_CORE__sampleRate);
2491         lv2_toggled        = lilv_new_uri(world, LV2_CORE__toggled);
2492         lv2_enumeration    = lilv_new_uri(world, LV2_CORE__enumeration);
2493         lv2_freewheeling   = lilv_new_uri(world, LV2_CORE__freeWheeling);
2494         midi_MidiEvent     = lilv_new_uri(world, LILV_URI_MIDI_EVENT);
2495         rdfs_comment       = lilv_new_uri(world, LILV_NS_RDFS "comment");
2496         rdfs_label         = lilv_new_uri(world, LILV_NS_RDFS "label");
2497         rdfs_range         = lilv_new_uri(world, LILV_NS_RDFS "range");
2498         rsz_minimumSize    = lilv_new_uri(world, LV2_RESIZE_PORT__minimumSize);
2499         time_Position      = lilv_new_uri(world, LV2_TIME__Position);
2500         ui_GtkUI           = lilv_new_uri(world, LV2_UI__GtkUI);
2501         ui_external        = lilv_new_uri(world, "http://lv2plug.in/ns/extensions/ui#external");
2502         ui_externalkx      = lilv_new_uri(world, "http://kxstudio.sf.net/ns/lv2ext/external-ui#Widget");
2503         units_unit         = lilv_new_uri(world, LV2_UNITS__unit);
2504         units_render       = lilv_new_uri(world, LV2_UNITS__render);
2505         units_hz           = lilv_new_uri(world, LV2_UNITS__hz);
2506         units_midiNote     = lilv_new_uri(world, LV2_UNITS__midiNote);
2507         units_db           = lilv_new_uri(world, LV2_UNITS__db);
2508         patch_writable     = lilv_new_uri(world, LV2_PATCH__writable);
2509         patch_Message      = lilv_new_uri(world, LV2_PATCH__Message);
2510         lv2_noSampleAccurateCtrl = lilv_new_uri(world, LV2_CORE_PREFIX "noSampleAccurateControls");
2511 #ifdef HAVE_LV2_1_2_0
2512         bufz_powerOf2BlockLength = lilv_new_uri(world, LV2_BUF_SIZE__powerOf2BlockLength);
2513         bufz_fixedBlockLength    = lilv_new_uri(world, LV2_BUF_SIZE__fixedBlockLength);
2514         bufz_nominalBlockLength  = lilv_new_uri(world, "http://lv2plug.in/ns/ext/buf-size#nominalBlockLength");
2515 #endif
2516
2517 }
2518
2519 LV2World::~LV2World()
2520 {
2521 #ifdef HAVE_LV2_1_2_0
2522         lilv_node_free(bufz_nominalBlockLength);
2523         lilv_node_free(bufz_fixedBlockLength);
2524         lilv_node_free(bufz_powerOf2BlockLength);
2525 #endif
2526         lilv_node_free(lv2_noSampleAccurateCtrl);
2527         lilv_node_free(patch_Message);
2528         lilv_node_free(patch_writable);
2529         lilv_node_free(units_hz);
2530         lilv_node_free(units_midiNote);
2531         lilv_node_free(units_db);
2532         lilv_node_free(units_unit);
2533         lilv_node_free(units_render);
2534         lilv_node_free(ui_externalkx);
2535         lilv_node_free(ui_external);
2536         lilv_node_free(ui_GtkUI);
2537         lilv_node_free(time_Position);
2538         lilv_node_free(rsz_minimumSize);
2539         lilv_node_free(rdfs_comment);
2540         lilv_node_free(rdfs_label);
2541         lilv_node_free(rdfs_range);
2542         lilv_node_free(midi_MidiEvent);
2543         lilv_node_free(lv2_enumeration);
2544         lilv_node_free(lv2_freewheeling);
2545         lilv_node_free(lv2_toggled);
2546         lilv_node_free(lv2_sampleRate);
2547         lilv_node_free(lv2_reportsLatency);
2548         lilv_node_free(lv2_integer);
2549         lilv_node_free(lv2_inPlaceBroken);
2550         lilv_node_free(lv2_OutputPort);
2551         lilv_node_free(lv2_InputPort);
2552         lilv_node_free(lv2_ControlPort);
2553         lilv_node_free(lv2_AudioPort);
2554         lilv_node_free(ext_notOnGUI);
2555         lilv_node_free(ext_logarithmic);
2556         lilv_node_free(ev_EventPort);
2557         lilv_node_free(atom_supports);
2558         lilv_node_free(atom_eventTransfer);
2559         lilv_node_free(atom_bufferType);
2560         lilv_node_free(atom_Sequence);
2561         lilv_node_free(atom_Chunk);
2562         lilv_node_free(atom_AtomPort);
2563         lilv_world_free(world);
2564 }
2565
2566 void
2567 LV2World::load_bundled_plugins(bool verbose)
2568 {
2569         if (!_bundle_checked) {
2570                 if (verbose) {
2571                         cout << "Scanning folders for bundled LV2s: " << ARDOUR::lv2_bundled_search_path().to_string() << endl;
2572                 }
2573
2574                 vector<string> plugin_objects;
2575                 find_paths_matching_filter (plugin_objects, ARDOUR::lv2_bundled_search_path(), lv2_filter, 0, true, true, true);
2576                 for ( vector<string>::iterator x = plugin_objects.begin(); x != plugin_objects.end (); ++x) {
2577 #ifdef PLATFORM_WINDOWS
2578                         string uri = "file:///" + *x + "/";
2579 #else
2580                         string uri = "file://" + *x + "/";
2581 #endif
2582                         LilvNode *node = lilv_new_uri(world, uri.c_str());
2583                         lilv_world_load_bundle(world, node);
2584                         lilv_node_free(node);
2585                 }
2586
2587                 lilv_world_load_all(world);
2588                 _bundle_checked = true;
2589         }
2590 }
2591
2592 LV2PluginInfo::LV2PluginInfo (const char* plugin_uri)
2593 {
2594         type = ARDOUR::LV2;
2595         _plugin_uri = strdup(plugin_uri);
2596 }
2597
2598 LV2PluginInfo::~LV2PluginInfo()
2599 {
2600         free(_plugin_uri);
2601         _plugin_uri = NULL;
2602 }
2603
2604 PluginPtr
2605 LV2PluginInfo::load(Session& session)
2606 {
2607         try {
2608                 PluginPtr plugin;
2609                 const LilvPlugins* plugins = lilv_world_get_all_plugins(_world.world);
2610                 LilvNode* uri = lilv_new_uri(_world.world, _plugin_uri);
2611                 if (!uri) { throw failed_constructor(); }
2612                 const LilvPlugin* lp = lilv_plugins_get_by_uri(plugins, uri);
2613                 if (!lp) { throw failed_constructor(); }
2614                 plugin.reset(new LV2Plugin(session.engine(), session, lp, session.frame_rate()));
2615                 lilv_node_free(uri);
2616                 plugin->set_info(PluginInfoPtr(shared_from_this ()));
2617                 return plugin;
2618         } catch (failed_constructor& err) {
2619                 return PluginPtr((Plugin*)0);
2620         }
2621
2622         return PluginPtr();
2623 }
2624
2625 std::vector<Plugin::PresetRecord>
2626 LV2PluginInfo::get_presets(Session&)
2627 {
2628         std::vector<Plugin::PresetRecord> p;
2629 #ifndef NO_PLUGIN_STATE
2630         const LilvPlugin* lp = NULL;
2631         try {
2632                 PluginPtr plugin;
2633                 const LilvPlugins* plugins = lilv_world_get_all_plugins(_world.world);
2634                 LilvNode* uri = lilv_new_uri(_world.world, _plugin_uri);
2635                 if (!uri) { throw failed_constructor(); }
2636                 lp = lilv_plugins_get_by_uri(plugins, uri);
2637                 if (!lp) { throw failed_constructor(); }
2638                 lilv_node_free(uri);
2639         } catch (failed_constructor& err) {
2640                 return p;
2641         }
2642         assert (lp);
2643         // see LV2Plugin::find_presets
2644         LilvNode* lv2_appliesTo = lilv_new_uri(_world.world, LV2_CORE__appliesTo);
2645         LilvNode* pset_Preset   = lilv_new_uri(_world.world, LV2_PRESETS__Preset);
2646         LilvNode* rdfs_label    = lilv_new_uri(_world.world, LILV_NS_RDFS "label");
2647
2648         LilvNodes* presets = lilv_plugin_get_related(lp, pset_Preset);
2649         LILV_FOREACH(nodes, i, presets) {
2650                 const LilvNode* preset = lilv_nodes_get(presets, i);
2651                 lilv_world_load_resource(_world.world, preset);
2652                 LilvNode* name = get_value(_world.world, preset, rdfs_label);
2653                 if (name) {
2654                         p.push_back (Plugin::PresetRecord(lilv_node_as_string(preset), lilv_node_as_string(name)));
2655                         lilv_node_free(name);
2656                 }
2657         }
2658         lilv_nodes_free(presets);
2659         lilv_node_free(rdfs_label);
2660         lilv_node_free(pset_Preset);
2661         lilv_node_free(lv2_appliesTo);
2662 #endif
2663         return p;
2664 }
2665
2666 bool
2667 LV2PluginInfo::in_category (const std::string &c) const
2668 {
2669         // TODO use untranslated lilv_plugin_get_class()
2670         // match gtk2_ardour/plugin_selector.cc
2671         if (category == c) {
2672                 return true;
2673         }
2674         return false;
2675 }
2676
2677 bool
2678 LV2PluginInfo::is_instrument () const
2679 {
2680         if (category == "Instrument") {
2681                 return true;
2682         }
2683 #if 1
2684         /* until we make sure that category remains untranslated in the lv2.ttl spec
2685          * and until most instruments also classify themselves as such, there's a 2nd check:
2686          */
2687         if (n_inputs.n_midi() > 0 && n_inputs.n_audio() == 0 && n_outputs.n_audio() > 0) {
2688                 return true;
2689         }
2690 #endif
2691         return false;
2692 }
2693
2694 PluginInfoList*
2695 LV2PluginInfo::discover()
2696 {
2697         LV2World world;
2698         world.load_bundled_plugins();
2699         _world.load_bundled_plugins(true);
2700
2701         PluginInfoList*    plugs   = new PluginInfoList;
2702         const LilvPlugins* plugins = lilv_world_get_all_plugins(world.world);
2703
2704         LILV_FOREACH(plugins, i, plugins) {
2705                 const LilvPlugin* p = lilv_plugins_get(plugins, i);
2706                 const LilvNode* pun = lilv_plugin_get_uri(p);
2707                 if (!pun) continue;
2708                 LV2PluginInfoPtr info(new LV2PluginInfo(lilv_node_as_string(pun)));
2709
2710                 LilvNode* name = lilv_plugin_get_name(p);
2711                 if (!name || !lilv_plugin_get_port_by_index(p, 0)) {
2712                         warning << "Ignoring invalid LV2 plugin "
2713                                 << lilv_node_as_string(lilv_plugin_get_uri(p))
2714                                 << endmsg;
2715                         continue;
2716                 }
2717
2718                 if (lilv_plugin_has_feature(p, world.lv2_inPlaceBroken)) {
2719                         warning << string_compose(
2720                             _("Ignoring LV2 plugin \"%1\" since it cannot do inplace processing."),
2721                             lilv_node_as_string(name)) << endmsg;
2722                         lilv_node_free(name);
2723                         continue;
2724                 }
2725
2726 #ifdef HAVE_LV2_1_2_0
2727                 LilvNodes *required_features = lilv_plugin_get_required_features (p);
2728                 if (lilv_nodes_contains (required_features, world.bufz_powerOf2BlockLength) ||
2729                                 lilv_nodes_contains (required_features, world.bufz_fixedBlockLength)
2730                    ) {
2731                         warning << string_compose(
2732                             _("Ignoring LV2 plugin \"%1\" because its buffer-size requirements cannot be satisfied."),
2733                             lilv_node_as_string(name)) << endmsg;
2734                         lilv_nodes_free(required_features);
2735                         lilv_node_free(name);
2736                         continue;
2737                 }
2738                 lilv_nodes_free(required_features);
2739 #endif
2740
2741                 info->type = LV2;
2742
2743                 info->name = string(lilv_node_as_string(name));
2744                 lilv_node_free(name);
2745                 ARDOUR::PluginScanMessage(_("LV2"), info->name, false);
2746
2747                 const LilvPluginClass* pclass = lilv_plugin_get_class(p);
2748                 const LilvNode*        label  = lilv_plugin_class_get_label(pclass);
2749                 info->category = lilv_node_as_string(label);
2750
2751                 LilvNode* author_name = lilv_plugin_get_author_name(p);
2752                 info->creator = author_name ? string(lilv_node_as_string(author_name)) : "Unknown";
2753                 lilv_node_free(author_name);
2754
2755                 info->path = "/NOPATH"; // Meaningless for LV2
2756
2757                 /* count atom-event-ports that feature
2758                  * atom:supports <http://lv2plug.in/ns/ext/midi#MidiEvent>
2759                  *
2760                  * TODO: nicely ask drobilla to make a lilv_ call for that
2761                  */
2762                 int count_midi_out = 0;
2763                 int count_midi_in = 0;
2764                 for (uint32_t i = 0; i < lilv_plugin_get_num_ports(p); ++i) {
2765                         const LilvPort* port  = lilv_plugin_get_port_by_index(p, i);
2766                         if (lilv_port_is_a(p, port, world.atom_AtomPort)) {
2767                                 LilvNodes* buffer_types = lilv_port_get_value(
2768                                         p, port, world.atom_bufferType);
2769                                 LilvNodes* atom_supports = lilv_port_get_value(
2770                                         p, port, world.atom_supports);
2771
2772                                 if (lilv_nodes_contains(buffer_types, world.atom_Sequence)
2773                                                 && lilv_nodes_contains(atom_supports, world.midi_MidiEvent)) {
2774                                         if (lilv_port_is_a(p, port, world.lv2_InputPort)) {
2775                                                 count_midi_in++;
2776                                         }
2777                                         if (lilv_port_is_a(p, port, world.lv2_OutputPort)) {
2778                                                 count_midi_out++;
2779                                         }
2780                                 }
2781                                 lilv_nodes_free(buffer_types);
2782                                 lilv_nodes_free(atom_supports);
2783                         }
2784                 }
2785
2786                 info->n_inputs.set_audio(
2787                         lilv_plugin_get_num_ports_of_class(
2788                                 p, world.lv2_InputPort, world.lv2_AudioPort, NULL));
2789                 info->n_inputs.set_midi(
2790                         lilv_plugin_get_num_ports_of_class(
2791                                 p, world.lv2_InputPort, world.ev_EventPort, NULL)
2792                         + count_midi_in);
2793
2794                 info->n_outputs.set_audio(
2795                         lilv_plugin_get_num_ports_of_class(
2796                                 p, world.lv2_OutputPort, world.lv2_AudioPort, NULL));
2797                 info->n_outputs.set_midi(
2798                         lilv_plugin_get_num_ports_of_class(
2799                                 p, world.lv2_OutputPort, world.ev_EventPort, NULL)
2800                         + count_midi_out);
2801
2802                 info->unique_id = lilv_node_as_uri(lilv_plugin_get_uri(p));
2803                 info->index     = 0; // Meaningless for LV2
2804
2805                 plugs->push_back(info);
2806         }
2807
2808         return plugs;
2809 }