a-EQ: Tweak knob layout to be less confusing
[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 <cctype>
21 #include <string>
22 #include <vector>
23 #include <limits>
24
25 #include <cmath>
26 #include <cstdlib>
27 #include <cstring>
28
29 #include "pbd/gstdio_compat.h"
30 #include <glib/gprintf.h>
31 #include <glibmm.h>
32
33 #include <boost/utility.hpp>
34
35 #include "pbd/file_utils.h"
36 #include "pbd/stl_delete.h"
37 #include "pbd/compose.h"
38 #include "pbd/error.h"
39 #include "pbd/replace_all.h"
40 #include "pbd/xml++.h"
41
42 #include "libardour-config.h"
43
44 #include "ardour/audio_buffer.h"
45 #include "ardour/audioengine.h"
46 #include "ardour/debug.h"
47 #include "ardour/lv2_plugin.h"
48 #include "ardour/midi_patch_manager.h"
49 #include "ardour/session.h"
50 #include "ardour/tempo.h"
51 #include "ardour/types.h"
52 #include "ardour/utils.h"
53 #include "ardour/worker.h"
54 #include "ardour/search_paths.h"
55
56 #include "pbd/i18n.h"
57 #include <locale.h>
58
59 #include <lilv/lilv.h>
60
61 #include "lv2/lv2plug.in/ns/ext/atom/atom.h"
62 #include "lv2/lv2plug.in/ns/ext/atom/forge.h"
63 #include "lv2/lv2plug.in/ns/ext/log/log.h"
64 #include "lv2/lv2plug.in/ns/ext/midi/midi.h"
65 #include "lv2/lv2plug.in/ns/ext/port-props/port-props.h"
66 #include "lv2/lv2plug.in/ns/ext/presets/presets.h"
67 #include "lv2/lv2plug.in/ns/ext/state/state.h"
68 #include "lv2/lv2plug.in/ns/ext/time/time.h"
69 #include "lv2/lv2plug.in/ns/ext/worker/worker.h"
70 #include "lv2/lv2plug.in/ns/ext/resize-port/resize-port.h"
71 #include "lv2/lv2plug.in/ns/extensions/ui/ui.h"
72 #include "lv2/lv2plug.in/ns/extensions/units/units.h"
73 #include "lv2/lv2plug.in/ns/ext/patch/patch.h"
74 #include "lv2/lv2plug.in/ns/ext/port-groups/port-groups.h"
75 #ifdef HAVE_LV2_1_2_0
76 #include "lv2/lv2plug.in/ns/ext/buf-size/buf-size.h"
77 #include "lv2/lv2plug.in/ns/ext/options/options.h"
78 #endif
79
80 #include "lv2_evbuf.h"
81
82 #ifdef HAVE_SUIL
83 #include <suil/suil.h>
84 #endif
85
86 // Compatibility for old LV2
87 #ifndef LV2_ATOM_CONTENTS_CONST
88 #define LV2_ATOM_CONTENTS_CONST(type, atom) \
89         ((const void*)((const uint8_t*)(atom) + sizeof(type)))
90 #endif
91 #ifndef LV2_ATOM_BODY_CONST
92 #define LV2_ATOM_BODY_CONST(atom) LV2_ATOM_CONTENTS_CONST(LV2_Atom, atom)
93 #endif
94 #ifndef LV2_PATCH__property
95 #define LV2_PATCH__property LV2_PATCH_PREFIX "property"
96 #endif
97 #ifndef LV2_PATCH__value
98 #define LV2_PATCH__value LV2_PATCH_PREFIX "value"
99 #endif
100 #ifndef LV2_PATCH__writable
101 #define LV2_PATCH__writable LV2_PATCH_PREFIX "writable"
102 #endif
103
104 /** The number of MIDI buffers that will fit in a UI/worker comm buffer.
105     This needs to be roughly the number of cycles the UI will get around to
106     actually processing the traffic.  Lower values are flakier but save memory.
107 */
108 static const size_t NBUFS = 4;
109
110 using namespace std;
111 using namespace ARDOUR;
112 using namespace PBD;
113
114 bool LV2Plugin::force_state_save = false;
115
116 class LV2World : boost::noncopyable {
117 public:
118         LV2World ();
119         ~LV2World ();
120
121         void load_bundled_plugins(bool verbose=false);
122
123         LilvWorld* world;
124
125         LilvNode* atom_AtomPort;
126         LilvNode* atom_Chunk;
127         LilvNode* atom_Sequence;
128         LilvNode* atom_bufferType;
129         LilvNode* atom_eventTransfer;
130         LilvNode* atom_supports;
131         LilvNode* ev_EventPort;
132         LilvNode* ext_logarithmic;
133         LilvNode* ext_notOnGUI;
134         LilvNode* ext_expensive;
135         LilvNode* ext_causesArtifacts;
136         LilvNode* ext_notAutomatic;
137         LilvNode* ext_rangeSteps;
138         LilvNode* groups_group;
139         LilvNode* groups_element;
140         LilvNode* lv2_AudioPort;
141         LilvNode* lv2_ControlPort;
142         LilvNode* lv2_InputPort;
143         LilvNode* lv2_OutputPort;
144         LilvNode* lv2_designation;
145         LilvNode* lv2_enumeration;
146         LilvNode* lv2_freewheeling;
147         LilvNode* lv2_inPlaceBroken;
148         LilvNode* lv2_isSideChain;
149         LilvNode* lv2_index;
150         LilvNode* lv2_integer;
151         LilvNode* lv2_default;
152         LilvNode* lv2_minimum;
153         LilvNode* lv2_maximum;
154         LilvNode* lv2_reportsLatency;
155         LilvNode* lv2_sampleRate;
156         LilvNode* lv2_toggled;
157         LilvNode* midi_MidiEvent;
158         LilvNode* rdfs_comment;
159         LilvNode* rdfs_label;
160         LilvNode* rdfs_range;
161         LilvNode* rsz_minimumSize;
162         LilvNode* time_Position;
163         LilvNode* ui_GtkUI;
164         LilvNode* ui_external;
165         LilvNode* ui_externalkx;
166         LilvNode* units_hz;
167         LilvNode* units_db;
168         LilvNode* units_unit;
169         LilvNode* units_render;
170         LilvNode* units_midiNote;
171         LilvNode* patch_writable;
172         LilvNode* patch_Message;
173 #ifdef HAVE_LV2_1_2_0
174         LilvNode* bufz_powerOf2BlockLength;
175         LilvNode* bufz_fixedBlockLength;
176         LilvNode* bufz_nominalBlockLength;
177         LilvNode* bufz_coarseBlockLength;
178 #endif
179
180 #ifdef HAVE_LV2_1_10_0
181         LilvNode* atom_int;
182         LilvNode* atom_float;
183         LilvNode* atom_object; // new in 1.8
184         LilvNode* atom_vector;
185 #endif
186 #ifdef LV2_EXTENDED
187         LilvNode* lv2_noSampleAccurateCtrl;
188         LilvNode* auto_can_write_automatation; // lv2:optionalFeature
189         LilvNode* auto_automation_control; // atom:supports
190         LilvNode* auto_automation_controlled; // lv2:portProperty
191         LilvNode* auto_automation_controller; // lv2:portProperty
192 #endif
193
194 private:
195         bool _bundle_checked;
196 };
197
198 static LV2World _world;
199
200 /* worker extension */
201
202 /** Called by the plugin to schedule non-RT work. */
203 static LV2_Worker_Status
204 work_schedule(LV2_Worker_Schedule_Handle handle,
205               uint32_t                   size,
206               const void*                data)
207 {
208         return (((Worker*)handle)->schedule(size, data)
209                 ? LV2_WORKER_SUCCESS
210                 : LV2_WORKER_ERR_UNKNOWN);
211 }
212
213 /** Called by the plugin to respond to non-RT work. */
214 static LV2_Worker_Status
215 work_respond(LV2_Worker_Respond_Handle handle,
216              uint32_t                  size,
217              const void*               data)
218 {
219         return (((Worker*)handle)->respond(size, data)
220                 ? LV2_WORKER_SUCCESS
221                 : LV2_WORKER_ERR_UNKNOWN);
222 }
223
224 #ifdef LV2_EXTENDED
225 /* inline display extension */
226 static void
227 queue_draw (LV2_Inline_Display_Handle handle)
228 {
229         LV2Plugin* plugin = (LV2Plugin*)handle;
230         plugin->QueueDraw(); /* EMIT SIGNAL */
231 }
232
233 static void
234 midnam_update (LV2_Midnam_Handle handle)
235 {
236         LV2Plugin* plugin = (LV2Plugin*)handle;
237         plugin->UpdateMidnam (); /* EMIT SIGNAL */
238 }
239 #endif
240
241 /* log extension */
242
243 static int
244 log_vprintf(LV2_Log_Handle /*handle*/,
245             LV2_URID       type,
246             const char*    fmt,
247             va_list        args)
248 {
249         char* str = NULL;
250         const int ret = g_vasprintf(&str, fmt, args);
251         /* strip trailing whitespace */
252         while (strlen (str) > 0 && isspace (str[strlen (str) - 1])) {
253                 str[strlen (str) - 1] = '\0';
254         }
255         if (strlen (str) == 0) {
256                 return 0;
257         }
258
259         if (type == URIMap::instance().urids.log_Error) {
260                 error << str << endmsg;
261         } else if (type == URIMap::instance().urids.log_Warning) {
262                 warning << str << endmsg;
263         } else if (type == URIMap::instance().urids.log_Note) {
264                 info << str << endmsg;
265         } else if (type == URIMap::instance().urids.log_Trace) {
266                 DEBUG_TRACE(DEBUG::LV2, str);
267         }
268         return ret;
269 }
270
271 static int
272 log_printf(LV2_Log_Handle handle,
273            LV2_URID       type,
274            const char*    fmt, ...)
275 {
276         va_list args;
277         va_start(args, fmt);
278         const int ret = log_vprintf(handle, type, fmt, args);
279         va_end(args);
280         return ret;
281 }
282
283 struct LV2Plugin::Impl {
284         Impl() : plugin(0), ui(0), ui_type(0), name(0), author(0), instance(0)
285                , work_iface(0)
286 #ifdef HAVE_LV2_1_2_0
287                , opts_iface(0)
288 #endif
289                , state(0)
290                , block_length(0)
291 #ifdef HAVE_LV2_1_2_0
292                , options(0)
293 #endif
294 #ifdef LV2_EXTENDED
295                , queue_draw(0)
296                , midnam(0)
297 #endif
298         {}
299
300         /** Find the LV2 input port with the given designation.
301          * If found, bufptrs[port_index] will be set to bufptr.
302          */
303         const LilvPort* designated_input (const char* uri, void** bufptrs[], void** bufptr);
304
305         const LilvPlugin*            plugin;
306         const LilvUI*                ui;
307         const LilvNode*              ui_type;
308         LilvNode*                    name;
309         LilvNode*                    author;
310         LilvInstance*                instance;
311         const LV2_Worker_Interface*  work_iface;
312 #ifdef HAVE_LV2_1_2_0
313         const LV2_Options_Interface* opts_iface;
314 #endif
315         LilvState*                   state;
316         LV2_Atom_Forge               forge;
317         LV2_Atom_Forge               ui_forge;
318         int32_t                      block_length;
319 #ifdef HAVE_LV2_1_2_0
320         LV2_Options_Option*          options;
321 #endif
322 #ifdef LV2_EXTENDED
323         LV2_Inline_Display*          queue_draw;
324         LV2_Midnam*                  midnam;
325 #endif
326 };
327
328 LV2Plugin::LV2Plugin (AudioEngine& engine,
329                       Session&     session,
330                       const void*  c_plugin,
331                       framecnt_t   rate)
332         : Plugin (engine, session)
333         , Workee ()
334         , _impl(new Impl())
335         , _features(NULL)
336         , _worker(NULL)
337         , _state_worker(NULL)
338         , _insert_id("0")
339         , _patch_port_in_index((uint32_t)-1)
340         , _patch_port_out_index((uint32_t)-1)
341         , _uri_map(URIMap::instance())
342         , _no_sample_accurate_ctrl (false)
343 {
344         init(c_plugin, rate);
345 }
346
347 LV2Plugin::LV2Plugin (const LV2Plugin& other)
348         : Plugin (other)
349         , Workee ()
350         , _impl(new Impl())
351         , _features(NULL)
352         , _worker(NULL)
353         , _state_worker(NULL)
354         , _insert_id(other._insert_id)
355         , _patch_port_in_index((uint32_t)-1)
356         , _patch_port_out_index((uint32_t)-1)
357         , _uri_map(URIMap::instance())
358         , _no_sample_accurate_ctrl (false)
359 {
360         init(other._impl->plugin, other._sample_rate);
361
362         for (uint32_t i = 0; i < parameter_count(); ++i) {
363                 _control_data[i] = other._shadow_data[i];
364                 _shadow_data[i]  = other._shadow_data[i];
365         }
366 }
367
368 void
369 LV2Plugin::init(const void* c_plugin, framecnt_t rate)
370 {
371         DEBUG_TRACE(DEBUG::LV2, "init\n");
372
373         _impl->plugin           = (const LilvPlugin*)c_plugin;
374         _impl->ui               = NULL;
375         _impl->ui_type          = NULL;
376         _to_ui                  = NULL;
377         _from_ui                = NULL;
378         _control_data           = 0;
379         _shadow_data            = 0;
380         _atom_ev_buffers        = 0;
381         _ev_buffers             = 0;
382         _bpm_control_port       = 0;
383         _freewheel_control_port = 0;
384         _latency_control_port   = 0;
385         _next_cycle_start       = std::numeric_limits<framepos_t>::max();
386         _next_cycle_speed       = 1.0;
387         _seq_size               = _engine.raw_buffer_size(DataType::MIDI);
388         _state_version          = 0;
389         _was_activated          = false;
390         _has_state_interface    = false;
391         _can_write_automation   = false;
392         _max_latency            = 0;
393         _current_latency        = 0;
394         _impl->block_length     = _session.get_block_size();
395
396         _instance_access_feature.URI = "http://lv2plug.in/ns/ext/instance-access";
397         _data_access_feature.URI     = "http://lv2plug.in/ns/ext/data-access";
398         _make_path_feature.URI       = LV2_STATE__makePath;
399         _log_feature.URI             = LV2_LOG__log;
400         _work_schedule_feature.URI   = LV2_WORKER__schedule;
401         _work_schedule_feature.data  = NULL;
402         _def_state_feature.URI       = LV2_STATE_PREFIX "loadDefaultState";  // Post LV2-1.2.0
403         _def_state_feature.data      = NULL;
404
405         const LilvPlugin* plugin = _impl->plugin;
406
407         LilvNode* state_iface_uri = lilv_new_uri(_world.world, LV2_STATE__interface);
408         LilvNode* state_uri       = lilv_new_uri(_world.world, LV2_STATE_URI);
409         _has_state_interface =
410                 // What plugins should have (lv2:extensionData state:Interface)
411                 lilv_plugin_has_extension_data(plugin, state_iface_uri)
412                 // What some outdated/incorrect ones have
413                 || lilv_plugin_has_feature(plugin, state_uri);
414         lilv_node_free(state_uri);
415         lilv_node_free(state_iface_uri);
416
417         _features    = (LV2_Feature**)calloc(13, sizeof(LV2_Feature*));
418         _features[0] = &_instance_access_feature;
419         _features[1] = &_data_access_feature;
420         _features[2] = &_make_path_feature;
421         _features[3] = _uri_map.uri_map_feature();
422         _features[4] = _uri_map.urid_map_feature();
423         _features[5] = _uri_map.urid_unmap_feature();
424         _features[6] = &_log_feature;
425
426         unsigned n_features = 7;
427 #ifdef HAVE_LV2_1_2_0
428         _features[n_features++] = &_def_state_feature;
429 #endif
430
431         lv2_atom_forge_init(&_impl->forge, _uri_map.urid_map());
432         lv2_atom_forge_init(&_impl->ui_forge, _uri_map.urid_map());
433
434 #ifdef LV2_EXTENDED
435         _impl->queue_draw = (LV2_Inline_Display*)
436                 malloc (sizeof(LV2_Inline_Display));
437         _impl->queue_draw->handle     = this;
438         _impl->queue_draw->queue_draw = queue_draw;
439
440         _queue_draw_feature.URI  = LV2_INLINEDISPLAY__queue_draw;
441         _queue_draw_feature.data = _impl->queue_draw;
442         _features[n_features++]  = &_queue_draw_feature;
443
444         _impl->midnam = (LV2_Midnam*)
445                 malloc (sizeof(LV2_Midnam));
446         _impl->midnam->handle = this;
447         _impl->midnam->update = midnam_update;
448
449         _midnam_feature.URI  = LV2_MIDNAM__update;
450         _midnam_feature.data = _impl->midnam;
451         _features[n_features++]  = &_midnam_feature;
452 #endif
453
454 #ifdef HAVE_LV2_1_2_0
455         LV2_URID atom_Int = _uri_map.uri_to_id(LV2_ATOM__Int);
456         static const int32_t _min_block_length = 1;   // may happen during split-cycles
457         static const int32_t _max_block_length = 8192; // max possible (with all engines and during export)
458         /* Consider updating max-block-size whenever the buffersize changes.
459          * It requires re-instantiating the plugin (which is a non-realtime operation),
460          * so it should be done lightly and only for plugins that require it.
461          *
462          * given that the block-size can change at any time (split-cycles) ardour currently
463          * does not support plugins that require bufz_fixedBlockLength.
464          */
465         LV2_Options_Option options[] = {
466                 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id(LV2_BUF_SIZE__minBlockLength),
467                   sizeof(int32_t), atom_Int, &_min_block_length },
468                 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id(LV2_BUF_SIZE__maxBlockLength),
469                   sizeof(int32_t), atom_Int, &_max_block_length },
470                 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id(LV2_BUF_SIZE__sequenceSize),
471                   sizeof(int32_t), atom_Int, &_seq_size },
472                 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id("http://lv2plug.in/ns/ext/buf-size#nominalBlockLength"),
473                   sizeof(int32_t), atom_Int, &_impl->block_length },
474                 { LV2_OPTIONS_INSTANCE, 0, 0, 0, 0, NULL }
475         };
476
477         _impl->options = (LV2_Options_Option*) malloc (sizeof (options));
478         memcpy ((void*) _impl->options, (void*) options, sizeof (options));
479
480         _options_feature.URI    = LV2_OPTIONS__options;
481         _options_feature.data   = _impl->options;
482         _features[n_features++] = &_options_feature;
483 #endif
484
485         LV2_State_Make_Path* make_path = (LV2_State_Make_Path*)malloc(
486                 sizeof(LV2_State_Make_Path));
487         make_path->handle = this;
488         make_path->path = &lv2_state_make_path;
489         _make_path_feature.data = make_path;
490
491         LV2_Log_Log* log = (LV2_Log_Log*)malloc(sizeof(LV2_Log_Log));
492         log->handle  = this;
493         log->printf  = &log_printf;
494         log->vprintf = &log_vprintf;
495         _log_feature.data = log;
496
497         const size_t ring_size = _session.engine().raw_buffer_size(DataType::MIDI) * NBUFS;
498         LilvNode* worker_schedule = lilv_new_uri(_world.world, LV2_WORKER__schedule);
499         if (lilv_plugin_has_feature(plugin, worker_schedule)) {
500                 LV2_Worker_Schedule* schedule = (LV2_Worker_Schedule*)malloc(
501                         sizeof(LV2_Worker_Schedule));
502                 _worker                     = new Worker(this, ring_size);
503                 schedule->handle            = _worker;
504                 schedule->schedule_work     = work_schedule;
505                 _work_schedule_feature.data = schedule;
506                 _features[n_features++]     = &_work_schedule_feature;
507         }
508         lilv_node_free(worker_schedule);
509
510         if (_has_state_interface) {
511                 // Create a non-threaded worker for use by state restore
512                 _state_worker = new Worker(this, ring_size, false);
513         }
514
515         _impl->instance = lilv_plugin_instantiate(plugin, rate, _features);
516         _impl->name     = lilv_plugin_get_name(plugin);
517         _impl->author   = lilv_plugin_get_author_name(plugin);
518
519         if (_impl->instance == 0) {
520                 error << _("LV2: Failed to instantiate plugin ") << uri() << endmsg;
521                 throw failed_constructor();
522         }
523
524         _instance_access_feature.data              = (void*)_impl->instance->lv2_handle;
525         _data_access_extension_data.extension_data = _impl->instance->lv2_descriptor->extension_data;
526         _data_access_feature.data                  = &_data_access_extension_data;
527
528         LilvNode* worker_iface_uri = lilv_new_uri(_world.world, LV2_WORKER__interface);
529         if (lilv_plugin_has_extension_data(plugin, worker_iface_uri)) {
530                 _impl->work_iface = (const LV2_Worker_Interface*)extension_data(
531                         LV2_WORKER__interface);
532         }
533         lilv_node_free(worker_iface_uri);
534
535
536 #ifdef HAVE_LV2_1_2_0
537         LilvNode* options_iface_uri = lilv_new_uri(_world.world, LV2_OPTIONS__interface);
538         if (lilv_plugin_has_extension_data(plugin, options_iface_uri)) {
539                 _impl->opts_iface = (const LV2_Options_Interface*)extension_data(
540                         LV2_OPTIONS__interface);
541         }
542         lilv_node_free(options_iface_uri);
543 #endif
544
545 #ifdef LV2_EXTENDED
546         _display_interface = (const LV2_Inline_Display_Interface*)
547                 extension_data (LV2_INLINEDISPLAY__interface);
548
549         _midname_interface = (const LV2_Midnam_Interface*)
550                 extension_data (LV2_MIDNAM__interface);
551         if (_midname_interface) {
552                 read_midnam ();
553         }
554 #endif
555
556         if (lilv_plugin_has_feature(plugin, _world.lv2_inPlaceBroken)) {
557                 error << string_compose(
558                     _("LV2: \"%1\" cannot be used, since it cannot do inplace processing."),
559                     lilv_node_as_string(_impl->name)) << endmsg;
560                 lilv_node_free(_impl->name);
561                 lilv_node_free(_impl->author);
562                 throw failed_constructor();
563         }
564
565 #ifdef HAVE_LV2_1_2_0
566         LilvNodes *required_features = lilv_plugin_get_required_features (plugin);
567         if (lilv_nodes_contains (required_features, _world.bufz_powerOf2BlockLength) ||
568                         lilv_nodes_contains (required_features, _world.bufz_fixedBlockLength)
569            ) {
570                 error << string_compose(
571                     _("LV2: \"%1\" buffer-size requirements cannot be satisfied."),
572                     lilv_node_as_string(_impl->name)) << endmsg;
573                 lilv_node_free(_impl->name);
574                 lilv_node_free(_impl->author);
575                 lilv_nodes_free(required_features);
576                 throw failed_constructor();
577         }
578         lilv_nodes_free(required_features);
579 #endif
580
581         LilvNodes* optional_features = lilv_plugin_get_optional_features (plugin);
582 #ifdef HAVE_LV2_1_2_0
583         if (lilv_nodes_contains (optional_features, _world.bufz_coarseBlockLength)) {
584                 _no_sample_accurate_ctrl = true;
585         }
586 #endif
587 #ifdef LV2_EXTENDED
588         if (lilv_nodes_contains (optional_features, _world.lv2_noSampleAccurateCtrl)) {
589                 /* deprecated 2016-Sep-18 in favor of bufz_coarseBlockLength */
590                 _no_sample_accurate_ctrl = true;
591         }
592         if (lilv_nodes_contains (optional_features, _world.auto_can_write_automatation)) {
593                 _can_write_automation = true;
594         }
595         lilv_nodes_free(optional_features);
596 #endif
597
598 #ifdef HAVE_LILV_0_16_0
599         // Load default state
600         if (_worker) {
601                 /* immediately schedule any work,
602                  * so that state restore later will not find a busy
603                  * worker.  latency_compute_run() flushes any replies
604                  */
605                 _worker->set_synchronous(true);
606         }
607         LilvState* state = lilv_state_new_from_world(
608                 _world.world, _uri_map.urid_map(), lilv_plugin_get_uri(_impl->plugin));
609         if (state && _has_state_interface) {
610                 lilv_state_restore(state, _impl->instance, NULL, NULL, 0, NULL);
611         }
612         lilv_state_free(state);
613 #endif
614
615         _sample_rate = rate;
616
617         const uint32_t num_ports = this->num_ports();
618         for (uint32_t i = 0; i < num_ports; ++i) {
619                 const LilvPort* port  = lilv_plugin_get_port_by_index(_impl->plugin, i);
620                 PortFlags       flags = 0;
621                 size_t          minimumSize = 0;
622
623                 if (lilv_port_is_a(_impl->plugin, port, _world.lv2_OutputPort)) {
624                         flags |= PORT_OUTPUT;
625                 } else if (lilv_port_is_a(_impl->plugin, port, _world.lv2_InputPort)) {
626                         flags |= PORT_INPUT;
627                 } else {
628                         error << string_compose(
629                                 "LV2: \"%1\" port %2 is neither input nor output",
630                                 lilv_node_as_string(_impl->name), i) << endmsg;
631                         throw failed_constructor();
632                 }
633
634                 if (lilv_port_is_a(_impl->plugin, port, _world.lv2_ControlPort)) {
635                         flags |= PORT_CONTROL;
636                 } else if (lilv_port_is_a(_impl->plugin, port, _world.lv2_AudioPort)) {
637                         flags |= PORT_AUDIO;
638                 } else if (lilv_port_is_a(_impl->plugin, port, _world.ev_EventPort)) {
639                         flags |= PORT_EVENT;
640                         flags |= PORT_MIDI;  // We assume old event API ports are for MIDI
641                 } else if (lilv_port_is_a(_impl->plugin, port, _world.atom_AtomPort)) {
642                         LilvNodes* buffer_types = lilv_port_get_value(
643                                 _impl->plugin, port, _world.atom_bufferType);
644                         LilvNodes* atom_supports = lilv_port_get_value(
645                                 _impl->plugin, port, _world.atom_supports);
646
647                         if (lilv_nodes_contains(buffer_types, _world.atom_Sequence)) {
648                                 flags |= PORT_SEQUENCE;
649                                 if (lilv_nodes_contains(atom_supports, _world.midi_MidiEvent)) {
650                                         flags |= PORT_MIDI;
651                                 }
652                                 if (lilv_nodes_contains(atom_supports, _world.time_Position)) {
653                                         flags |= PORT_POSITION;
654                                 }
655 #ifdef LV2_EXTENDED
656                                 if (lilv_nodes_contains(atom_supports, _world.auto_automation_control)) {
657                                         flags |= PORT_AUTOCTRL;
658                                 }
659 #endif
660                                 if (lilv_nodes_contains(atom_supports, _world.patch_Message)) {
661                                         flags |= PORT_PATCHMSG;
662                                         if (flags & PORT_INPUT) {
663                                                 _patch_port_in_index = i;
664                                         } else {
665                                                 _patch_port_out_index = i;
666                                         }
667                                 }
668                         }
669                         LilvNodes* min_size_v = lilv_port_get_value(_impl->plugin, port, _world.rsz_minimumSize);
670                         LilvNode* min_size = min_size_v ? lilv_nodes_get_first(min_size_v) : NULL;
671                         if (min_size && lilv_node_is_int(min_size)) {
672                                 minimumSize = lilv_node_as_int(min_size);
673                         }
674                         lilv_nodes_free(min_size_v);
675                         lilv_nodes_free(buffer_types);
676                         lilv_nodes_free(atom_supports);
677                 } else {
678                         error << string_compose(
679                                 "LV2: \"%1\" port %2 has no known data type",
680                                 lilv_node_as_string(_impl->name), i) << endmsg;
681                         throw failed_constructor();
682                 }
683
684                 if ((flags & PORT_INPUT) && (flags & PORT_CONTROL)) {
685                         if (lilv_port_has_property(_impl->plugin, port, _world.ext_causesArtifacts)) {
686                                 flags |= PORT_NOAUTO;
687                         }
688                         if (lilv_port_has_property(_impl->plugin, port, _world.ext_notAutomatic)) {
689                                 flags |= PORT_NOAUTO;
690                         }
691                         if (lilv_port_has_property(_impl->plugin, port, _world.ext_expensive)) {
692                                 flags |= PORT_NOAUTO;
693                         }
694                 }
695 #ifdef LV2_EXTENDED
696                 if (lilv_port_has_property(_impl->plugin, port, _world.auto_automation_controlled)) {
697                         if ((flags & PORT_INPUT) && (flags & PORT_CONTROL)) {
698                                 flags |= PORT_CTRLED;
699                         }
700                 }
701                 if (lilv_port_has_property(_impl->plugin, port, _world.auto_automation_controller)) {
702                         if ((flags & PORT_INPUT) && (flags & PORT_CONTROL)) {
703                                 flags |= PORT_CTRLER;
704                         }
705                 }
706 #endif
707
708                 _port_flags.push_back(flags);
709                 _port_minimumSize.push_back(minimumSize);
710                 DEBUG_TRACE(DEBUG::LV2, string_compose("port %1 buffer %2 bytes\n", i, minimumSize));
711         }
712
713         _control_data = new float[num_ports];
714         _shadow_data  = new float[num_ports];
715         _defaults     = new float[num_ports];
716         _ev_buffers   = new LV2_Evbuf*[num_ports];
717         memset(_ev_buffers, 0, sizeof(LV2_Evbuf*) * num_ports);
718
719         const bool     latent        = lilv_plugin_has_latency(plugin);
720         const uint32_t latency_index = (latent)
721                 ? lilv_plugin_get_latency_port_index(plugin)
722                 : 0;
723
724         // Build an array of pointers to special parameter buffers
725         void*** params = new void**[num_ports];
726         for (uint32_t i = 0; i < num_ports; ++i) {
727                 params[i] = NULL;
728         }
729         _impl->designated_input (LV2_TIME__beatsPerMinute, params, (void**)&_bpm_control_port);
730         _impl->designated_input (LV2_CORE__freeWheeling, params, (void**)&_freewheel_control_port);
731
732         for (uint32_t i = 0; i < num_ports; ++i) {
733                 const LilvPort* port = lilv_plugin_get_port_by_index(plugin, i);
734                 const LilvNode* sym  = lilv_port_get_symbol(plugin, port);
735
736                 // Store index in map so we can look up index by symbol
737                 _port_indices.insert(std::make_pair(lilv_node_as_string(sym), i));
738
739                 // Get range and default value if applicable
740                 if (parameter_is_control(i)) {
741                         LilvNode* def;
742                         lilv_port_get_range(plugin, port, &def, NULL, NULL);
743                         _defaults[i] = def ? lilv_node_as_float(def) : 0.0f;
744                         if (lilv_port_has_property (plugin, port, _world.lv2_sampleRate)) {
745                                 _defaults[i] *= _session.frame_rate ();
746                         }
747                         lilv_node_free(def);
748
749                         lilv_instance_connect_port(_impl->instance, i, &_control_data[i]);
750
751                         if (latent && i == latency_index) {
752                                 LilvNode *max;
753                                 lilv_port_get_range(_impl->plugin, port, NULL, NULL, &max);
754                                 _max_latency = max ? lilv_node_as_float(max) : .02 * _sample_rate;
755                                 _latency_control_port  = &_control_data[i];
756                                 *_latency_control_port = 0;
757                         }
758
759                         if (parameter_is_input(i)) {
760                                 _shadow_data[i] = default_value(i);
761                                 if (params[i]) {
762                                         *params[i] = (void*)&_shadow_data[i];
763                                 }
764                         }
765                 } else {
766                         _defaults[i] = 0.0f;
767                 }
768         }
769
770         delete[] params;
771
772         LilvUIs* uis = lilv_plugin_get_uis(plugin);
773         if (lilv_uis_size(uis) > 0) {
774 #ifdef HAVE_SUIL
775                 // Look for embeddable UI
776                 LILV_FOREACH(uis, u, uis) {
777                         const LilvUI*   this_ui      = lilv_uis_get(uis, u);
778                         const LilvNode* this_ui_type = NULL;
779                         if (lilv_ui_is_supported(this_ui,
780                                                  suil_ui_supported,
781                                                  _world.ui_GtkUI,
782                                                  &this_ui_type)) {
783                                 // TODO: Multiple UI support
784                                 _impl->ui      = this_ui;
785                                 _impl->ui_type = this_ui_type;
786                                 break;
787                         }
788                 }
789 #else
790                 // Look for Gtk native UI
791                 LILV_FOREACH(uis, i, uis) {
792                         const LilvUI* ui = lilv_uis_get(uis, i);
793                         if (lilv_ui_is_a(ui, _world.ui_GtkUI)) {
794                                 _impl->ui      = ui;
795                                 _impl->ui_type = _world.ui_GtkUI;
796                                 break;
797                         }
798                 }
799 #endif
800
801                 // If Gtk UI is not available, try to find external UI
802                 if (!_impl->ui) {
803                         LILV_FOREACH(uis, i, uis) {
804                                 const LilvUI* ui = lilv_uis_get(uis, i);
805                                 if (lilv_ui_is_a(ui, _world.ui_externalkx)) {
806                                         _impl->ui      = ui;
807                                         _impl->ui_type = _world.ui_external;
808                                         break;
809                                 }
810                                 if (lilv_ui_is_a(ui, _world.ui_external)) {
811                                         _impl->ui      = ui;
812                                         _impl->ui_type = _world.ui_external;
813                                 }
814                         }
815                 }
816         }
817
818         load_supported_properties(_property_descriptors);
819         allocate_atom_event_buffers();
820         latency_compute_run();
821 }
822
823 int
824 LV2Plugin::set_block_size (pframes_t nframes)
825 {
826 #ifdef HAVE_LV2_1_2_0
827         if (_impl->opts_iface) {
828                 LV2_URID atom_Int = _uri_map.uri_to_id(LV2_ATOM__Int);
829                 _impl->block_length = nframes;
830                 LV2_Options_Option block_size_option = {
831                         LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id ("http://lv2plug.in/ns/ext/buf-size#nominalBlockLength"),
832                         sizeof(int32_t), atom_Int, (void*)&_impl->block_length
833                 };
834                 _impl->opts_iface->set (_impl->instance->lv2_handle, &block_size_option);
835         }
836 #endif
837         return 0;
838 }
839
840 bool
841 LV2Plugin::requires_fixed_sized_buffers () const
842 {
843         /* This controls if Ardour will split the plugin's run()
844          * on automation events in order to pass sample-accurate automation
845          * via standard control-ports.
846          *
847          * When returning true Ardour will *not* sub-divide the process-cycle.
848          * Automation events that happen between cycle-start and cycle-end will be
849          * ignored (ctrl values are interpolated to cycle-start).
850          * NB. Atom Sequences are still sample accurate.
851          *
852          * Note: This does not guarantee a fixed block-size.
853          * e.g The process cycle may be split when looping, also
854          * the period-size may change any time: see set_block_size()
855          */
856         if (get_info()->n_inputs.n_midi() > 0) {
857                 /* we don't yet implement midi buffer offsets (for split cycles).
858                  * Also connect_and_run() also uses _session.transport_frame() directly
859                  * (for BBT) which is not offset for plugin cycle split.
860                  */
861                 return true;
862         }
863         return _no_sample_accurate_ctrl;
864 }
865
866 LV2Plugin::~LV2Plugin ()
867 {
868         DEBUG_TRACE(DEBUG::LV2, string_compose("%1 destroy\n", name()));
869
870         deactivate();
871         cleanup();
872
873 #ifdef LV2_EXTENDED
874         if (has_midnam ()) {
875                 std::stringstream ss;
876                 ss << (void*)this;
877                 ss << unique_id();
878                 MIDI::Name::MidiPatchManager::instance().remove_custom_midnam (ss.str());
879         }
880 #endif
881
882         lilv_instance_free(_impl->instance);
883         lilv_state_free(_impl->state);
884         lilv_node_free(_impl->name);
885         lilv_node_free(_impl->author);
886 #ifdef HAVE_LV2_1_2_0
887         free(_impl->options);
888 #endif
889 #ifdef LV2_EXTENDED
890         free(_impl->queue_draw);
891         free(_impl->midnam);
892 #endif
893
894         free(_features);
895         free(_log_feature.data);
896         free(_make_path_feature.data);
897         free(_work_schedule_feature.data);
898
899         delete _to_ui;
900         delete _from_ui;
901         delete _worker;
902         delete _state_worker;
903
904         if (_atom_ev_buffers) {
905                 LV2_Evbuf**  b = _atom_ev_buffers;
906                 while (*b) {
907                         free(*b);
908                         b++;
909                 }
910                 free(_atom_ev_buffers);
911         }
912
913         delete [] _control_data;
914         delete [] _shadow_data;
915         delete [] _defaults;
916         delete [] _ev_buffers;
917         delete _impl;
918 }
919
920 bool
921 LV2Plugin::is_external_ui() const
922 {
923         if (!_impl->ui) {
924                 return false;
925         }
926         return lilv_ui_is_a(_impl->ui, _world.ui_external) || lilv_ui_is_a(_impl->ui, _world.ui_externalkx);
927 }
928
929 bool
930 LV2Plugin::is_external_kx() const
931 {
932         if (!_impl->ui) {
933                 return false;
934         }
935         return lilv_ui_is_a(_impl->ui, _world.ui_externalkx);
936 }
937
938 bool
939 LV2Plugin::ui_is_resizable () const
940 {
941         const LilvNode* s   = lilv_ui_get_uri(_impl->ui);
942         LilvNode*       p   = lilv_new_uri(_world.world, LV2_CORE__optionalFeature);
943         LilvNode*       fs  = lilv_new_uri(_world.world, LV2_UI__fixedSize);
944         LilvNode*       nrs = lilv_new_uri(_world.world, LV2_UI__noUserResize);
945
946         LilvNodes* fs_matches = lilv_world_find_nodes(_world.world, s, p, fs);
947         LilvNodes* nrs_matches = lilv_world_find_nodes(_world.world, s, p, nrs);
948
949         lilv_nodes_free(nrs_matches);
950         lilv_nodes_free(fs_matches);
951         lilv_node_free(nrs);
952         lilv_node_free(fs);
953         lilv_node_free(p);
954
955         return !fs_matches && !nrs_matches;
956 }
957
958 #ifdef LV2_EXTENDED
959 bool
960 LV2Plugin::has_inline_display () {
961         return _display_interface ? true : false;
962 }
963
964 Plugin::Display_Image_Surface*
965 LV2Plugin::render_inline_display (uint32_t w, uint32_t h) {
966         if (_display_interface) {
967                 /* Plugin::Display_Image_Surface is identical to
968                  * LV2_Inline_Display_Image_Surface */
969                 return (Plugin::Display_Image_Surface*) _display_interface->render ((void*)_impl->instance->lv2_handle, w, h);
970         }
971         return NULL;
972 }
973
974 bool
975 LV2Plugin::has_midnam () {
976         return _midname_interface ? true : false;
977 }
978
979 bool
980 LV2Plugin::read_midnam () {
981         bool rv = false;
982         if (!_midname_interface) {
983                 return rv;
984         }
985         char* midnam = _midname_interface->midnam ((void*)_impl->instance->lv2_handle);
986         if (midnam) {
987                 std::stringstream ss;
988                 ss << (void*)this;
989                 ss << unique_id();
990                 rv = MIDI::Name::MidiPatchManager::instance().update_custom_midnam (ss.str(), midnam);
991         }
992 #ifndef NDEBUG
993         if (rv) {
994                 info << string_compose(_("LV2: update midnam for plugin '%1'"), name ()) << endmsg;
995         } else {
996                 warning << string_compose(_("LV2: Failed to parse midnam of plugin '%1'"), name ()) << endmsg;
997         }
998 #endif
999         _midname_interface->free (midnam);
1000         return rv;
1001 }
1002
1003 std::string
1004 LV2Plugin::midnam_model () {
1005         std::string rv;
1006         if (!_midname_interface) {
1007                 return rv;
1008         }
1009         char* model = _midname_interface->model ((void*)_impl->instance->lv2_handle);
1010         if (model) {
1011                 rv = model;
1012         }
1013         _midname_interface->free (model);
1014         return rv;
1015 }
1016 #endif
1017
1018 string
1019 LV2Plugin::unique_id() const
1020 {
1021         return lilv_node_as_uri(lilv_plugin_get_uri(_impl->plugin));
1022 }
1023
1024 const char*
1025 LV2Plugin::uri() const
1026 {
1027         return lilv_node_as_uri(lilv_plugin_get_uri(_impl->plugin));
1028 }
1029
1030 const char*
1031 LV2Plugin::label() const
1032 {
1033         return lilv_node_as_string(_impl->name);
1034 }
1035
1036 const char*
1037 LV2Plugin::name() const
1038 {
1039         return lilv_node_as_string(_impl->name);
1040 }
1041
1042 const char*
1043 LV2Plugin::maker() const
1044 {
1045         return _impl->author ? lilv_node_as_string (_impl->author) : "Unknown";
1046 }
1047
1048 uint32_t
1049 LV2Plugin::num_ports() const
1050 {
1051         return lilv_plugin_get_num_ports(_impl->plugin);
1052 }
1053
1054 uint32_t
1055 LV2Plugin::parameter_count() const
1056 {
1057         return lilv_plugin_get_num_ports(_impl->plugin);
1058 }
1059
1060 float
1061 LV2Plugin::default_value(uint32_t port)
1062 {
1063         return _defaults[port];
1064 }
1065
1066 const char*
1067 LV2Plugin::port_symbol(uint32_t index) const
1068 {
1069         const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, index);
1070         if (!port) {
1071                 error << name() << ": Invalid port index " << index << endmsg;
1072         }
1073
1074         const LilvNode* sym = lilv_port_get_symbol(_impl->plugin, port);
1075         return lilv_node_as_string(sym);
1076 }
1077
1078 uint32_t
1079 LV2Plugin::port_index (const char* symbol) const
1080 {
1081         const map<string, uint32_t>::const_iterator i = _port_indices.find(symbol);
1082         if (i != _port_indices.end()) {
1083                 return  i->second;
1084         } else {
1085                 warning << string_compose(_("LV2: Unknown port %1"), symbol) << endmsg;
1086                 return (uint32_t)-1;
1087         }
1088 }
1089
1090 void
1091 LV2Plugin::set_parameter(uint32_t which, float val)
1092 {
1093         DEBUG_TRACE(DEBUG::LV2, string_compose(
1094                             "%1 set parameter %2 to %3\n", name(), which, val));
1095
1096         if (which < lilv_plugin_get_num_ports(_impl->plugin)) {
1097                 if (get_parameter (which) == val) {
1098                         return;
1099                 }
1100
1101                 _shadow_data[which] = val;
1102         } else {
1103                 warning << string_compose(
1104                     _("Illegal parameter number used with plugin \"%1\". "
1105                       "This is a bug in either %2 or the LV2 plugin <%3>"),
1106                     name(), PROGRAM_NAME, unique_id()) << endmsg;
1107         }
1108
1109         Plugin::set_parameter(which, val);
1110 }
1111
1112 float
1113 LV2Plugin::get_parameter(uint32_t which) const
1114 {
1115         if (parameter_is_input(which)) {
1116                 return (float)_shadow_data[which];
1117         } else {
1118                 return (float)_control_data[which];
1119         }
1120         return 0.0f;
1121 }
1122
1123 std::string
1124 LV2Plugin::get_docs() const
1125 {
1126         LilvNodes* comments = lilv_plugin_get_value(_impl->plugin, _world.rdfs_comment);
1127         if (comments) {
1128                 const std::string docs(lilv_node_as_string(lilv_nodes_get_first(comments)));
1129                 lilv_nodes_free(comments);
1130                 return docs;
1131         }
1132
1133         return "";
1134 }
1135
1136 std::string
1137 LV2Plugin::get_parameter_docs(uint32_t which) const
1138 {
1139         LilvNodes* comments = lilv_port_get_value(
1140                 _impl->plugin,
1141                 lilv_plugin_get_port_by_index(_impl->plugin, which),
1142                 _world.rdfs_comment);
1143
1144         if (comments) {
1145                 const std::string docs(lilv_node_as_string(lilv_nodes_get_first(comments)));
1146                 lilv_nodes_free(comments);
1147                 return docs;
1148         }
1149
1150         return "";
1151 }
1152
1153 bool
1154 LV2Plugin::get_layout (uint32_t which, UILayoutHint& h) const
1155 {
1156         /// TODO lookup port-properties
1157         if (unique_id () != "urn:ardour:a-eq") {
1158                 return false;
1159         }
1160         h.knob = true;
1161         switch (which) {
1162                 case  0: h.x0 = 0; h.x1 = 1; h.y0 = 2; h.y1 = 3; break; // Frequency L
1163                 case  1: h.x0 = 0; h.x1 = 1; h.y0 = 0; h.y1 = 1; break; // Gain L
1164                 case 17: h.x0 = 0; h.x1 = 1; h.y0 = 5; h.y1 = 6; break; // enable L
1165
1166                 case  2: h.x0 = 1; h.x1 = 3; h.y0 = 2; h.y1 = 3; break; // Frequency 1
1167                 case  3: h.x0 = 1; h.x1 = 3; h.y0 = 0; h.y1 = 1; break; // Gain 1
1168                 case  4: h.x0 = 1; h.x1 = 3; h.y0 = 1; h.y1 = 2; break; // Bandwidth 1
1169                 case 18: h.x0 = 1; h.x1 = 4; h.y0 = 5; h.y1 = 6; break; // enable 1
1170
1171                 case  5: h.x0 = 4; h.x1 = 6; h.y0 = 2; h.y1 = 3; break; // Frequency 2
1172                 case  6: h.x0 = 4; h.x1 = 6; h.y0 = 0; h.y1 = 1; break; // Gain 2
1173                 case  7: h.x0 = 4; h.x1 = 6; h.y0 = 1; h.y1 = 2; break; // Bandwidth 2
1174                 case 19: h.x0 = 4; h.x1 = 7; h.y0 = 5; h.y1 = 6; break; // enable 2
1175
1176                 case  8: h.x0 = 7; h.x1 =  9; h.y0 = 2; h.y1 = 3; break; // Frequency 3
1177                 case  9: h.x0 = 7; h.x1 =  9; h.y0 = 0; h.y1 = 1; break; // Gain 3
1178                 case 10: h.x0 = 7; h.x1 =  9; h.y0 = 1; h.y1 = 2; break; // Bandwidth 3
1179                 case 20: h.x0 = 7; h.x1 = 10; h.y0 = 5; h.y1 = 6; break; // enable 3
1180
1181                 case 11: h.x0 = 10; h.x1 = 12; h.y0 = 2; h.y1 = 3; break; // Frequency 4
1182                 case 12: h.x0 = 10; h.x1 = 12; h.y0 = 0; h.y1 = 1; break; // Gain 4
1183                 case 13: h.x0 = 10; h.x1 = 12; h.y0 = 1; h.y1 = 2; break; // Bandwidth 4
1184                 case 21: h.x0 = 10; h.x1 = 13; h.y0 = 5; h.y1 = 6; break; // enable 4
1185
1186                 case 14: h.x0 = 13; h.x1 = 14; h.y0 = 2; h.y1 = 3; break; // Frequency H
1187                 case 15: h.x0 = 13; h.x1 = 14; h.y0 = 0; h.y1 = 1; break; // Gain H
1188                 case 22: h.x0 = 13; h.x1 = 14; h.y0 = 5; h.y1 = 6; break; // enable H
1189
1190                 case 16: h.x0 = 14; h.x1 = 15; h.y0 = 1; h.y1 = 3; break; // Master Gain
1191                 case 23: h.x0 = 14; h.x1 = 15; h.y0 = 5; h.y1 = 6; break; // Master Enable
1192                 default:
1193                         return false;
1194         }
1195         return true;
1196 }
1197
1198 uint32_t
1199 LV2Plugin::nth_parameter(uint32_t n, bool& ok) const
1200 {
1201         ok = false;
1202         for (uint32_t c = 0, x = 0; x < lilv_plugin_get_num_ports(_impl->plugin); ++x) {
1203                 if (parameter_is_control(x)) {
1204                         if (c++ == n) {
1205                                 ok = true;
1206                                 return x;
1207                         }
1208                 }
1209         }
1210
1211         return 0;
1212 }
1213
1214 const void*
1215 LV2Plugin::extension_data(const char* uri) const
1216 {
1217         return lilv_instance_get_extension_data(_impl->instance, uri);
1218 }
1219
1220 const void*
1221 LV2Plugin::c_plugin()
1222 {
1223         return _impl->plugin;
1224 }
1225
1226 const void*
1227 LV2Plugin::c_ui()
1228 {
1229         return (const void*)_impl->ui;
1230 }
1231
1232 const void*
1233 LV2Plugin::c_ui_type()
1234 {
1235         return (const void*)_impl->ui_type;
1236 }
1237
1238 /** Directory for all plugin state. */
1239 const std::string
1240 LV2Plugin::plugin_dir() const
1241 {
1242         if (!_plugin_state_dir.empty ()){
1243                 return Glib::build_filename(_plugin_state_dir, _insert_id.to_s());
1244         } else {
1245                 return Glib::build_filename(_session.plugins_dir(), _insert_id.to_s());
1246         }
1247 }
1248
1249 /** Directory for files created by the plugin (except during save). */
1250 const std::string
1251 LV2Plugin::scratch_dir() const
1252 {
1253         return Glib::build_filename(plugin_dir(), "scratch");
1254 }
1255
1256 /** Directory for snapshots of files in the scratch directory. */
1257 const std::string
1258 LV2Plugin::file_dir() const
1259 {
1260         return Glib::build_filename(plugin_dir(), "files");
1261 }
1262
1263 /** Directory to save state snapshot version @c num into. */
1264 const std::string
1265 LV2Plugin::state_dir(unsigned num) const
1266 {
1267         return Glib::build_filename(plugin_dir(), string("state") + PBD::to_string (num));
1268 }
1269
1270 /** Implementation of state:makePath for files created at instantiation time.
1271  * Note this is not used for files created at save time (Lilv deals with that).
1272  */
1273 char*
1274 LV2Plugin::lv2_state_make_path(LV2_State_Make_Path_Handle handle,
1275                                const char*                path)
1276 {
1277         LV2Plugin* me = (LV2Plugin*)handle;
1278         if (me->_insert_id == PBD::ID("0")) {
1279                 warning << string_compose(
1280                         "File path \"%1\" requested but LV2 %2 has no insert ID",
1281                         path, me->name()) << endmsg;
1282                 return g_strdup(path);
1283         }
1284
1285         const std::string abs_path = Glib::build_filename(me->scratch_dir(), path);
1286         const std::string dirname  = Glib::path_get_dirname(abs_path);
1287         g_mkdir_with_parents(dirname.c_str(), 0744);
1288
1289         DEBUG_TRACE(DEBUG::LV2, string_compose("new file path %1 => %2\n",
1290                                                path, abs_path));
1291
1292         return g_strndup(abs_path.c_str(), abs_path.length());
1293 }
1294
1295 void
1296 LV2Plugin::add_state(XMLNode* root) const
1297 {
1298         assert(_insert_id != PBD::ID("0"));
1299
1300         XMLNode*    child;
1301         LocaleGuard lg;
1302
1303         for (uint32_t i = 0; i < parameter_count(); ++i) {
1304                 if (parameter_is_input(i) && parameter_is_control(i)) {
1305                         child = new XMLNode("Port");
1306                         child->set_property("symbol", port_symbol(i));
1307                         child->set_property("value", _shadow_data[i]);
1308                         root->add_child_nocopy(*child);
1309                 }
1310         }
1311
1312         if (!_plugin_state_dir.empty()) {
1313                 root->set_property("template-dir", _plugin_state_dir);
1314         }
1315
1316         if (_has_state_interface) {
1317                 // Provisionally increment state version and create directory
1318                 const std::string new_dir = state_dir(++_state_version);
1319                 // and keep track of it (for templates & archive)
1320                 unsigned int saved_state = _state_version;;
1321                 g_mkdir_with_parents(new_dir.c_str(), 0744);
1322
1323                 LilvState* state = lilv_state_new_from_instance(
1324                         _impl->plugin,
1325                         _impl->instance,
1326                         _uri_map.urid_map(),
1327                         scratch_dir().c_str(),
1328                         file_dir().c_str(),
1329                         _session.externals_dir().c_str(),
1330                         new_dir.c_str(),
1331                         NULL,
1332                         const_cast<LV2Plugin*>(this),
1333                         0,
1334                         NULL);
1335
1336                 if (!_plugin_state_dir.empty() || force_state_save
1337                     || !_impl->state
1338                     || !lilv_state_equals(state, _impl->state)) {
1339                         lilv_state_save(_world.world,
1340                                         _uri_map.urid_map(),
1341                                         _uri_map.urid_unmap(),
1342                                         state,
1343                                         NULL,
1344                                         new_dir.c_str(),
1345                                         "state.ttl");
1346
1347                         if (force_state_save) {
1348                                 // archive or save-as
1349                                 lilv_state_free(state);
1350                                 --_state_version;
1351                         }
1352                         else if (_plugin_state_dir.empty()) {
1353                                 // normal session save
1354                                 lilv_state_free(_impl->state);
1355                                 _impl->state = state;
1356                         } else {
1357                                 // template save (dedicated state-dir)
1358                                 lilv_state_free(state);
1359                                 --_state_version;
1360                         }
1361                 } else {
1362                         // State is identical, decrement version and nuke directory
1363                         lilv_state_free(state);
1364                         PBD::remove_directory(new_dir);
1365                         --_state_version;
1366                         saved_state = _state_version;
1367                 }
1368
1369                 root->set_property("state-dir", string("state") + PBD::to_string (saved_state));
1370         }
1371 }
1372
1373 // TODO: Once we can rely on lilv 0.16.0, lilv_world_get can replace this
1374 static LilvNode*
1375 get_value(LilvWorld* world, const LilvNode* subject, const LilvNode* predicate)
1376 {
1377         LilvNodes* vs = lilv_world_find_nodes(world, subject, predicate, NULL);
1378         if (vs) {
1379                 LilvNode* node = lilv_node_duplicate(lilv_nodes_get_first(vs));
1380                 lilv_nodes_free(vs);
1381                 return node;
1382         }
1383         return NULL;
1384 }
1385
1386 void
1387 LV2Plugin::find_presets()
1388 {
1389         LilvNode* lv2_appliesTo = lilv_new_uri(_world.world, LV2_CORE__appliesTo);
1390         LilvNode* pset_Preset   = lilv_new_uri(_world.world, LV2_PRESETS__Preset);
1391         LilvNode* rdfs_label    = lilv_new_uri(_world.world, LILV_NS_RDFS "label");
1392
1393         LilvNodes* presets = lilv_plugin_get_related(_impl->plugin, pset_Preset);
1394         LILV_FOREACH(nodes, i, presets) {
1395                 const LilvNode* preset = lilv_nodes_get(presets, i);
1396                 lilv_world_load_resource(_world.world, preset);
1397                 LilvNode* name = get_value(_world.world, preset, rdfs_label);
1398                 bool userpreset = true; // TODO
1399                 if (name) {
1400                         _presets.insert(std::make_pair(lilv_node_as_string(preset),
1401                                                        Plugin::PresetRecord(
1402                                                                lilv_node_as_string(preset),
1403                                                                lilv_node_as_string(name),
1404                                                                userpreset)));
1405                         lilv_node_free(name);
1406                 } else {
1407                         warning << string_compose(
1408                             _("Plugin \"%1\" preset \"%2\" is missing a label\n"),
1409                             lilv_node_as_string(lilv_plugin_get_uri(_impl->plugin)),
1410                             lilv_node_as_string(preset)) << endmsg;
1411                 }
1412         }
1413         lilv_nodes_free(presets);
1414
1415         lilv_node_free(rdfs_label);
1416         lilv_node_free(pset_Preset);
1417         lilv_node_free(lv2_appliesTo);
1418 }
1419
1420 static void
1421 set_port_value(const char* port_symbol,
1422                void*       user_data,
1423                const void* value,
1424                uint32_t    /*size*/,
1425                uint32_t    type)
1426 {
1427         LV2Plugin* self = (LV2Plugin*)user_data;
1428         if (type != 0 && type != URIMap::instance().urids.atom_Float) {
1429                 return;  // TODO: Support non-float ports
1430         }
1431
1432         const uint32_t port_index = self->port_index(port_symbol);
1433         if (port_index != (uint32_t)-1) {
1434                 self->set_parameter(port_index, *(const float*)value);
1435                 self->PresetPortSetValue (port_index, *(const float*)value); /* EMIT SIGNAL */
1436         }
1437 }
1438
1439 bool
1440 LV2Plugin::load_preset(PresetRecord r)
1441 {
1442         LilvWorld* world = _world.world;
1443         LilvNode*  pset  = lilv_new_uri(world, r.uri.c_str());
1444         LilvState* state = lilv_state_new_from_world(world, _uri_map.urid_map(), pset);
1445
1446         const LV2_Feature*  state_features[2]   = { NULL, NULL };
1447         LV2_Worker_Schedule schedule            = { _state_worker, work_schedule };
1448         const LV2_Feature   state_sched_feature = { LV2_WORKER__schedule, &schedule };
1449         if (_state_worker) {
1450                 state_features[0] = &state_sched_feature;
1451         }
1452
1453         if (state) {
1454                 lilv_state_restore(state, _impl->instance, set_port_value, this, 0, state_features);
1455                 lilv_state_free(state);
1456                 Plugin::load_preset(r);
1457         }
1458
1459         lilv_node_free(pset);
1460         return state;
1461 }
1462
1463 const void*
1464 ARDOUR::lv2plugin_get_port_value(const char* port_symbol,
1465                                  void*       user_data,
1466                                  uint32_t*   size,
1467                                  uint32_t*   type)
1468 {
1469         LV2Plugin *plugin = (LV2Plugin *) user_data;
1470
1471         uint32_t index = plugin->port_index(port_symbol);
1472         if (index != (uint32_t) -1) {
1473                 if (plugin->parameter_is_input(index) && plugin->parameter_is_control(index)) {
1474                         float *value;
1475                         *size = sizeof(float);
1476                         *type = plugin->_uri_map.uri_to_id(LV2_ATOM__Float);
1477                         value = &plugin->_shadow_data[index];
1478
1479                         return value;
1480                 }
1481         }
1482
1483         *size = *type = 0;
1484         return NULL;
1485 }
1486
1487
1488 std::string
1489 LV2Plugin::do_save_preset(string name)
1490 {
1491         LilvNode*    plug_name = lilv_plugin_get_name(_impl->plugin);
1492         const string prefix    = legalize_for_uri(lilv_node_as_string(plug_name));
1493         const string base_name = legalize_for_uri(name);
1494         const string file_name = base_name + ".ttl";
1495         const string bundle    = Glib::build_filename(
1496                 Glib::get_home_dir(),
1497                 Glib::build_filename(".lv2", prefix + "_" + base_name + ".lv2"));
1498
1499 #ifdef HAVE_LILV_0_21_3
1500         /* delete reference to old preset (if any) */
1501         const PresetRecord* r = preset_by_label(name);
1502         if (r) {
1503                 LilvNode*  pset  = lilv_new_uri (_world.world, r->uri.c_str());
1504                 if (pset) {
1505                         lilv_world_unload_resource (_world.world, pset);
1506                         lilv_node_free(pset);
1507                 }
1508         }
1509 #endif
1510
1511         LilvState* state = lilv_state_new_from_instance(
1512                 _impl->plugin,
1513                 _impl->instance,
1514                 _uri_map.urid_map(),
1515                 scratch_dir().c_str(),                   // file_dir
1516                 bundle.c_str(),                          // copy_dir
1517                 bundle.c_str(),                          // link_dir
1518                 bundle.c_str(),                          // save_dir
1519                 lv2plugin_get_port_value,                // get_value
1520                 (void*)this,                             // user_data
1521                 LV2_STATE_IS_POD|LV2_STATE_IS_PORTABLE,  // flags
1522                 _features                                // features
1523         );
1524
1525         lilv_state_set_label(state, name.c_str());
1526         lilv_state_save(
1527                 _world.world,           // world
1528                 _uri_map.urid_map(),    // map
1529                 _uri_map.urid_unmap(),  // unmap
1530                 state,                  // state
1531                 NULL,                   // uri (NULL = use file URI)
1532                 bundle.c_str(),         // dir
1533                 file_name.c_str()       // filename
1534         );
1535
1536         lilv_state_free(state);
1537
1538         std::string uri = Glib::filename_to_uri(Glib::build_filename(bundle, file_name));
1539         LilvNode *node_bundle = lilv_new_uri(_world.world, Glib::filename_to_uri(Glib::build_filename(bundle, "/")).c_str());
1540         LilvNode *node_preset = lilv_new_uri(_world.world, uri.c_str());
1541 #ifdef HAVE_LILV_0_21_3
1542         lilv_world_unload_resource(_world.world, node_preset);
1543         lilv_world_unload_bundle(_world.world, node_bundle);
1544 #endif
1545         lilv_world_load_bundle(_world.world, node_bundle);
1546         lilv_world_load_resource(_world.world, node_preset);
1547         lilv_node_free(node_bundle);
1548         lilv_node_free(node_preset);
1549         lilv_node_free(plug_name);
1550         return uri;
1551 }
1552
1553 void
1554 LV2Plugin::do_remove_preset(string name)
1555 {
1556 #ifdef HAVE_LILV_0_21_3
1557         /* Look up preset record by label (FIXME: ick, label as ID) */
1558         const PresetRecord* r = preset_by_label(name);
1559         if (!r) {
1560                 return;
1561         }
1562
1563         /* Load a LilvState for the preset. */
1564         LilvWorld* world = _world.world;
1565         LilvNode*  pset  = lilv_new_uri(world, r->uri.c_str());
1566         LilvState* state = lilv_state_new_from_world(world, _uri_map.urid_map(), pset);
1567         if (!state) {
1568                 lilv_node_free(pset);
1569                 return;
1570         }
1571
1572         /* Unload preset from world. */
1573         lilv_world_unload_resource(world, pset);
1574
1575         /* Delete it from the file system.  This will remove the preset file and the entry
1576            from the manifest.  If this results in an empty manifest (i.e. the
1577            preset is the only thing in the bundle), then the bundle is removed. */
1578         lilv_state_delete(world, state);
1579
1580         lilv_state_free(state);
1581         lilv_node_free(pset);
1582 #endif
1583         /* Without lilv_state_delete(), we could delete the preset file, but this
1584            would leave a broken bundle/manifest around, so the preset would still
1585            be visible, but broken.  Naively deleting a bundle is too dangerous, so
1586            we simply do not support preset deletion with older Lilv */
1587 }
1588
1589 bool
1590 LV2Plugin::has_editor() const
1591 {
1592         return _impl->ui != NULL;
1593 }
1594
1595 bool
1596 LV2Plugin::has_message_output() const
1597 {
1598         for (uint32_t i = 0; i < num_ports(); ++i) {
1599                 if ((_port_flags[i] & PORT_SEQUENCE) &&
1600                     (_port_flags[i] & PORT_OUTPUT)) {
1601                         return true;
1602                 }
1603         }
1604         return false;
1605 }
1606
1607 bool
1608 LV2Plugin::write_to(RingBuffer<uint8_t>* dest,
1609                     uint32_t             index,
1610                     uint32_t             protocol,
1611                     uint32_t             size,
1612                     const uint8_t*       body)
1613 {
1614         const uint32_t  buf_size = sizeof(UIMessage) + size;
1615         vector<uint8_t> buf(buf_size);
1616
1617         UIMessage* msg = (UIMessage*)&buf[0];
1618         msg->index    = index;
1619         msg->protocol = protocol;
1620         msg->size     = size;
1621         memcpy(msg + 1, body, size);
1622
1623         return (dest->write(&buf[0], buf_size) == buf_size);
1624 }
1625
1626 bool
1627 LV2Plugin::write_from_ui(uint32_t       index,
1628                          uint32_t       protocol,
1629                          uint32_t       size,
1630                          const uint8_t* body)
1631 {
1632         if (!_from_ui) {
1633                 size_t rbs = _session.engine().raw_buffer_size(DataType::MIDI) * NBUFS;
1634                 /* buffer data communication from plugin UI to plugin instance.
1635                  * this buffer needs to potentially hold
1636                  *   (port's minimumSize) * (audio-periods) / (UI-periods)
1637                  * bytes.
1638                  *
1639                  *  e.g 48kSPS / 128fpp -> audio-periods = 375 Hz
1640                  *  ui-periods = 25 Hz (SuperRapidScreenUpdate)
1641                  *  default minimumSize = 32K (see LV2Plugin::allocate_atom_event_buffers()
1642                  *
1643                  * it is NOT safe to overflow (msg.size will be misinterpreted)
1644                  */
1645                 uint32_t bufsiz = 32768;
1646                 if (_atom_ev_buffers && _atom_ev_buffers[0]) {
1647                         bufsiz =  lv2_evbuf_get_capacity(_atom_ev_buffers[0]);
1648                 }
1649                 int fact = ceilf(_session.frame_rate () / 3000.f);
1650                 rbs = max((size_t) bufsiz * std::max (8, fact), rbs);
1651                 _from_ui = new RingBuffer<uint8_t>(rbs);
1652         }
1653
1654         if (!write_to(_from_ui, index, protocol, size, body)) {
1655                 error << "Error writing from UI to plugin" << endmsg;
1656                 return false;
1657         }
1658         return true;
1659 }
1660
1661 bool
1662 LV2Plugin::write_to_ui(uint32_t       index,
1663                        uint32_t       protocol,
1664                        uint32_t       size,
1665                        const uint8_t* body)
1666 {
1667         if (!write_to(_to_ui, index, protocol, size, body)) {
1668                 error << "Error writing from plugin to UI" << endmsg;
1669                 return false;
1670         }
1671         return true;
1672 }
1673
1674 static void
1675 forge_variant(LV2_Atom_Forge* forge, const Variant& value)
1676 {
1677         switch (value.type()) {
1678         case Variant::NOTHING:
1679                 break;
1680         case Variant::BEATS:
1681                 // No atom type for this, just forge a double
1682                 lv2_atom_forge_double(forge, value.get_beats().to_double());
1683                 break;
1684         case Variant::BOOL:
1685                 lv2_atom_forge_bool(forge, value.get_bool());
1686                 break;
1687         case Variant::DOUBLE:
1688                 lv2_atom_forge_double(forge, value.get_double());
1689                 break;
1690         case Variant::FLOAT:
1691                 lv2_atom_forge_float(forge, value.get_float());
1692                 break;
1693         case Variant::INT:
1694                 lv2_atom_forge_int(forge, value.get_int());
1695                 break;
1696         case Variant::LONG:
1697                 lv2_atom_forge_long(forge, value.get_long());
1698                 break;
1699         case Variant::PATH:
1700                 lv2_atom_forge_path(
1701                         forge, value.get_path().c_str(), value.get_path().size());
1702                 break;
1703         case Variant::STRING:
1704                 lv2_atom_forge_string(
1705                         forge, value.get_string().c_str(), value.get_string().size());
1706                 break;
1707         case Variant::URI:
1708                 lv2_atom_forge_uri(
1709                         forge, value.get_uri().c_str(), value.get_uri().size());
1710                 break;
1711         }
1712 }
1713
1714 /** Get a variant type from a URI, return false iff no match found. */
1715 static bool
1716 uri_to_variant_type(const std::string& uri, Variant::Type& type)
1717 {
1718         if (uri == LV2_ATOM__Bool) {
1719                 type = Variant::BOOL;
1720         } else if (uri == LV2_ATOM__Double) {
1721                 type = Variant::DOUBLE;
1722         } else if (uri == LV2_ATOM__Float) {
1723                 type = Variant::FLOAT;
1724         } else if (uri == LV2_ATOM__Int) {
1725                 type = Variant::INT;
1726         } else if (uri == LV2_ATOM__Long) {
1727                 type = Variant::LONG;
1728         } else if (uri == LV2_ATOM__Path) {
1729                 type = Variant::PATH;
1730         } else if (uri == LV2_ATOM__String) {
1731                 type = Variant::STRING;
1732         } else if (uri == LV2_ATOM__URI) {
1733                 type = Variant::URI;
1734         } else {
1735                 return false;
1736         }
1737         return true;
1738 }
1739
1740 void
1741 LV2Plugin::set_property(uint32_t key, const Variant& value)
1742 {
1743         if (_patch_port_in_index == (uint32_t)-1) {
1744                 error << "LV2: set_property called with unset patch_port_in_index" << endmsg;
1745                 return;
1746         } else if (value.type() == Variant::NOTHING) {
1747                 error << "LV2: set_property called with void value" << endmsg;
1748                 return;
1749         }
1750
1751         // Set up forge to write to temporary buffer on the stack
1752         LV2_Atom_Forge*      forge = &_impl->ui_forge;
1753         LV2_Atom_Forge_Frame frame;
1754         uint8_t              buf[PATH_MAX];  // Ought to be enough for anyone...
1755
1756         lv2_atom_forge_set_buffer(forge, buf, sizeof(buf));
1757
1758         // Serialize patch:Set message to set property
1759 #ifdef HAVE_LV2_1_10_0
1760         lv2_atom_forge_object(forge, &frame, 0, _uri_map.urids.patch_Set);
1761         lv2_atom_forge_key(forge, _uri_map.urids.patch_property);
1762         lv2_atom_forge_urid(forge, key);
1763         lv2_atom_forge_key(forge, _uri_map.urids.patch_value);
1764 #else
1765         lv2_atom_forge_blank(forge, &frame, 0, _uri_map.urids.patch_Set);
1766         lv2_atom_forge_property_head(forge, _uri_map.urids.patch_property, 0);
1767         lv2_atom_forge_urid(forge, key);
1768         lv2_atom_forge_property_head(forge, _uri_map.urids.patch_value, 0);
1769 #endif
1770
1771         forge_variant(forge, value);
1772
1773         // Write message to UI=>Plugin ring
1774         const LV2_Atom* const atom = (const LV2_Atom*)buf;
1775         write_from_ui(_patch_port_in_index,
1776                       _uri_map.urids.atom_eventTransfer,
1777                       lv2_atom_total_size(atom),
1778                       (const uint8_t*)atom);
1779 }
1780
1781 const ParameterDescriptor&
1782 LV2Plugin::get_property_descriptor(uint32_t id) const
1783 {
1784         PropertyDescriptors::const_iterator p = _property_descriptors.find(id);
1785         if (p != _property_descriptors.end()) {
1786                 return p->second;
1787         }
1788         return Plugin::get_property_descriptor(id);
1789 }
1790
1791 static void
1792 load_parameter_descriptor_units(LilvWorld* lworld, ParameterDescriptor& desc, const LilvNodes* units)
1793 {
1794         if (lilv_nodes_contains(units, _world.units_midiNote)) {
1795                 desc.unit = ParameterDescriptor::MIDI_NOTE;
1796         } else if (lilv_nodes_contains(units, _world.units_db)) {
1797                 desc.unit = ParameterDescriptor::DB;
1798         } else if (lilv_nodes_contains(units, _world.units_hz)) {
1799                 desc.unit = ParameterDescriptor::HZ;
1800         }
1801         if (lilv_nodes_size(units) > 0) {
1802                 const LilvNode* unit = lilv_nodes_get_first(units);
1803                 LilvNode* render = get_value(lworld, unit, _world.units_render);
1804                 if (render) {
1805                         desc.print_fmt = lilv_node_as_string(render);
1806                         replace_all (desc.print_fmt, "%f", "%.2f");
1807                         lilv_node_free(render);
1808                 }
1809         }
1810 }
1811
1812 static void
1813 load_parameter_descriptor(LV2World&            world,
1814                           ParameterDescriptor& desc,
1815                           Variant::Type        datatype,
1816                           const LilvNode*      subject)
1817 {
1818         LilvWorld* lworld  = _world.world;
1819         LilvNode*  label   = get_value(lworld, subject, _world.rdfs_label);
1820         LilvNode*  def     = get_value(lworld, subject, _world.lv2_default);
1821         LilvNode*  minimum = get_value(lworld, subject, _world.lv2_minimum);
1822         LilvNode*  maximum = get_value(lworld, subject, _world.lv2_maximum);
1823         LilvNodes* units   = lilv_world_find_nodes(lworld, subject, _world.units_unit, NULL);
1824         if (label) {
1825                 desc.label = lilv_node_as_string(label);
1826         }
1827         if (def) {
1828                 if (lilv_node_is_float(def)) {
1829                         desc.normal = lilv_node_as_float(def);
1830                 } else if (lilv_node_is_int(def)) {
1831                         desc.normal = lilv_node_as_int(def);
1832                 }
1833         }
1834         if (minimum) {
1835                 if (lilv_node_is_float(minimum)) {
1836                         desc.lower = lilv_node_as_float(minimum);
1837                 } else if (lilv_node_is_int(minimum)) {
1838                         desc.lower = lilv_node_as_int(minimum);
1839                 }
1840         }
1841         if (maximum) {
1842                 if (lilv_node_is_float(maximum)) {
1843                         desc.upper = lilv_node_as_float(maximum);
1844                 } else if (lilv_node_is_int(maximum)) {
1845                         desc.upper = lilv_node_as_int(maximum);
1846                 }
1847         }
1848         load_parameter_descriptor_units(lworld, desc, units);
1849         desc.datatype      = datatype;
1850         desc.toggled      |= datatype == Variant::BOOL;
1851         desc.integer_step |= datatype == Variant::INT || datatype == Variant::LONG;
1852         desc.update_steps();
1853
1854         lilv_nodes_free(units);
1855         lilv_node_free(label);
1856         lilv_node_free(def);
1857         lilv_node_free(minimum);
1858         lilv_node_free(maximum);
1859 }
1860
1861 void
1862 LV2Plugin::load_supported_properties(PropertyDescriptors& descs)
1863 {
1864         LilvWorld*       lworld     = _world.world;
1865         const LilvNode*  subject    = lilv_plugin_get_uri(_impl->plugin);
1866         LilvNodes*       properties = lilv_world_find_nodes(
1867                 lworld, subject, _world.patch_writable, NULL);
1868         LILV_FOREACH(nodes, p, properties) {
1869                 // Get label and range
1870                 const LilvNode* prop  = lilv_nodes_get(properties, p);
1871                 LilvNode*       range = get_value(lworld, prop, _world.rdfs_range);
1872                 if (!range) {
1873                         warning << string_compose(_("LV2: property <%1> has no range datatype, ignoring"),
1874                                                   lilv_node_as_uri(prop)) << endmsg;
1875                         continue;
1876                 }
1877
1878                 // Convert range to variant type (TODO: support for multiple range types)
1879                 Variant::Type datatype;
1880                 if (!uri_to_variant_type(lilv_node_as_uri(range), datatype)) {
1881                         error << string_compose(_("LV2: property <%1> has unsupported datatype <%1>"),
1882                                                 lilv_node_as_uri(prop), lilv_node_as_uri(range)) << endmsg;
1883                         continue;
1884                 }
1885
1886                 // Add description to result
1887                 ParameterDescriptor desc;
1888                 desc.key      = _uri_map.uri_to_id(lilv_node_as_uri(prop));
1889                 desc.datatype = datatype;
1890                 load_parameter_descriptor(_world, desc, datatype, prop);
1891                 descs.insert(std::make_pair(desc.key, desc));
1892
1893                 lilv_node_free(range);
1894         }
1895         lilv_nodes_free(properties);
1896 }
1897
1898 void
1899 LV2Plugin::announce_property_values()
1900 {
1901         if (_patch_port_in_index == (uint32_t)-1) {
1902                 return;
1903         }
1904
1905         // Set up forge to write to temporary buffer on the stack
1906         LV2_Atom_Forge*      forge = &_impl->ui_forge;
1907         LV2_Atom_Forge_Frame frame;
1908         uint8_t              buf[PATH_MAX];  // Ought to be enough for anyone...
1909
1910         lv2_atom_forge_set_buffer(forge, buf, sizeof(buf));
1911
1912         // Serialize patch:Get message with no subject (implicitly plugin instance)
1913 #ifdef HAVE_LV2_1_10_0
1914         lv2_atom_forge_object(forge, &frame, 0, _uri_map.urids.patch_Get);
1915 #else
1916         lv2_atom_forge_blank(forge, &frame, 0, _uri_map.urids.patch_Get);
1917 #endif
1918
1919         // Write message to UI=>Plugin ring
1920         const LV2_Atom* const atom = (const LV2_Atom*)buf;
1921         write_from_ui(_patch_port_in_index,
1922                       _uri_map.urids.atom_eventTransfer,
1923                       lv2_atom_total_size(atom),
1924                       (const uint8_t*)atom);
1925 }
1926
1927 void
1928 LV2Plugin::enable_ui_emission()
1929 {
1930         if (!_to_ui) {
1931                 /* see note in LV2Plugin::write_from_ui() */
1932                 uint32_t bufsiz = 32768;
1933                 if (_atom_ev_buffers && _atom_ev_buffers[0]) {
1934                         bufsiz =  lv2_evbuf_get_capacity(_atom_ev_buffers[0]);
1935                 }
1936                 size_t rbs = _session.engine().raw_buffer_size(DataType::MIDI) * NBUFS;
1937                 rbs = max((size_t) bufsiz * 8, rbs);
1938                 _to_ui = new RingBuffer<uint8_t>(rbs);
1939         }
1940 }
1941
1942 void
1943 LV2Plugin::emit_to_ui(void* controller, UIMessageSink sink)
1944 {
1945         if (!_to_ui) {
1946                 return;
1947         }
1948
1949         uint32_t read_space = _to_ui->read_space();
1950         while (read_space > sizeof(UIMessage)) {
1951                 UIMessage msg;
1952                 if (_to_ui->read((uint8_t*)&msg, sizeof(msg)) != sizeof(msg)) {
1953                         error << "Error reading from Plugin=>UI RingBuffer" << endmsg;
1954                         break;
1955                 }
1956                 vector<uint8_t> body(msg.size);
1957                 if (_to_ui->read(&body[0], msg.size) != msg.size) {
1958                         error << "Error reading from Plugin=>UI RingBuffer" << endmsg;
1959                         break;
1960                 }
1961
1962                 sink(controller, msg.index, msg.size, msg.protocol, &body[0]);
1963
1964                 read_space -= sizeof(msg) + msg.size;
1965         }
1966 }
1967
1968 int
1969 LV2Plugin::work(Worker& worker, uint32_t size, const void* data)
1970 {
1971         Glib::Threads::Mutex::Lock lm(_work_mutex);
1972         return _impl->work_iface->work(
1973                 _impl->instance->lv2_handle, work_respond, &worker, size, data);
1974 }
1975
1976 int
1977 LV2Plugin::work_response(uint32_t size, const void* data)
1978 {
1979         return _impl->work_iface->work_response(
1980                 _impl->instance->lv2_handle, size, data);
1981 }
1982
1983 void
1984 LV2Plugin::set_insert_id(PBD::ID id)
1985 {
1986         if (_insert_id == "0") {
1987                 _insert_id = id;
1988         } else if (_insert_id != id) {
1989                 lilv_state_free(_impl->state);
1990                 _impl->state = NULL;
1991                 _insert_id   = id;
1992         }
1993 }
1994
1995 void
1996 LV2Plugin::set_state_dir (const std::string& d)
1997 {
1998         _plugin_state_dir = d;
1999 }
2000
2001 int
2002 LV2Plugin::set_state(const XMLNode& node, int version)
2003 {
2004         XMLNodeList          nodes;
2005         XMLNodeConstIterator iter;
2006         XMLNode*             child;
2007         LocaleGuard          lg;
2008
2009         if (node.name() != state_node_name()) {
2010                 error << _("Bad node sent to LV2Plugin::set_state") << endmsg;
2011                 return -1;
2012         }
2013
2014 #ifndef NO_PLUGIN_STATE
2015
2016         if (version < 3000) {
2017                 nodes = node.children("port");
2018         } else {
2019                 nodes = node.children("Port");
2020         }
2021
2022         for (iter = nodes.begin(); iter != nodes.end(); ++iter) {
2023
2024                 child = *iter;
2025
2026                 std::string sym;
2027                 if (!child->get_property("symbol", sym)) {
2028                         warning << _("LV2: port has no symbol, ignored") << endmsg;
2029                         continue;
2030                 }
2031
2032                 map<string, uint32_t>::iterator i = _port_indices.find(sym);
2033
2034                 uint32_t port_id;
2035
2036                 if (i != _port_indices.end()) {
2037                         port_id = i->second;
2038                 } else {
2039                         warning << _("LV2: port has unknown index, ignored") << endmsg;
2040                         continue;
2041                 }
2042
2043                 float val;
2044                 if (!child->get_property("value", val)) {
2045                         warning << _("LV2: port has no value, ignored") << endmsg;
2046                         continue;
2047                 }
2048
2049                 set_parameter(port_id, val);
2050         }
2051
2052         std::string template_dir;
2053         if (node.get_property("template-dir", template_dir)) {
2054                 set_state_dir (template_dir);
2055         }
2056
2057         _state_version = 0;
2058         std::string state_dir;
2059         if (node.get_property("state-dir", state_dir) != 0) {
2060                 if (sscanf(state_dir.c_str(), "state%u", &_state_version) != 1) {
2061                         error << string_compose(
2062                                 "LV2: failed to parse state version from \"%1\"",
2063                                 state_dir) << endmsg;
2064                 }
2065
2066                 std::string state_file = Glib::build_filename(
2067                         plugin_dir(),
2068                         Glib::build_filename(state_dir, "state.ttl"));
2069
2070                 LilvState* state = lilv_state_new_from_file(
2071                         _world.world, _uri_map.urid_map(), NULL, state_file.c_str());
2072
2073                 lilv_state_restore(state, _impl->instance, NULL, NULL, 0, NULL);
2074                 lilv_state_free(_impl->state);
2075                 _impl->state = state;
2076         }
2077
2078         if (!_plugin_state_dir.empty ()) {
2079                 // force save with session, next time (increment counter)
2080                 lilv_state_free (_impl->state);
2081                 _impl->state = NULL;
2082                 set_state_dir ("");
2083         }
2084
2085         latency_compute_run();
2086 #endif
2087
2088         return Plugin::set_state(node, version);
2089 }
2090
2091 int
2092 LV2Plugin::get_parameter_descriptor(uint32_t which, ParameterDescriptor& desc) const
2093 {
2094         const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, which);
2095         if (!port) {
2096                 error << string_compose("LV2: get descriptor of non-existent port %1", which)
2097                       << endmsg;
2098                 return 1;
2099         }
2100
2101         LilvNodes* portunits;
2102         LilvNode *def, *min, *max;
2103         lilv_port_get_range(_impl->plugin, port, &def, &min, &max);
2104         portunits = lilv_port_get_value(_impl->plugin, port, _world.units_unit);
2105
2106         LilvNode* steps   = lilv_port_get(_impl->plugin, port, _world.ext_rangeSteps);
2107
2108         // TODO: Once we can rely on lilv 0.18.0 being present,
2109         // load_parameter_descriptor() can be used for ports as well
2110         desc.integer_step = lilv_port_has_property(_impl->plugin, port, _world.lv2_integer);
2111         desc.toggled      = lilv_port_has_property(_impl->plugin, port, _world.lv2_toggled);
2112         desc.logarithmic  = lilv_port_has_property(_impl->plugin, port, _world.ext_logarithmic);
2113         desc.sr_dependent = lilv_port_has_property(_impl->plugin, port, _world.lv2_sampleRate);
2114         desc.label        = lilv_node_as_string(lilv_port_get_name(_impl->plugin, port));
2115         desc.normal       = def ? lilv_node_as_float(def) : 0.0f;
2116         desc.lower        = min ? lilv_node_as_float(min) : 0.0f;
2117         desc.upper        = max ? lilv_node_as_float(max) : 1.0f;
2118         load_parameter_descriptor_units(_world.world, desc, portunits);
2119
2120         if (desc.sr_dependent) {
2121                 desc.lower *= _session.frame_rate ();
2122                 desc.upper *= _session.frame_rate ();
2123         }
2124
2125         desc.min_unbound  = false; // TODO: LV2 extension required
2126         desc.max_unbound  = false; // TODO: LV2 extension required
2127
2128         desc.enumeration = lilv_port_has_property(_impl->plugin, port, _world.lv2_enumeration);
2129         desc.scale_points = get_scale_points(which);
2130
2131         desc.update_steps();
2132
2133         if (steps) {
2134                 //override auto-calculated steps in update_steps()
2135                 float s = lilv_node_as_float (steps);
2136                 const float delta = desc.upper - desc.lower;
2137
2138                 desc.step = desc.smallstep = (delta / s);
2139                 desc.largestep = std::min ((delta / 5.0f), 10.f * desc.smallstep);
2140
2141                 if (desc.logarithmic) {
2142                         // TODO marry AutomationControl::internal_to_interface () with
2143                         // http://lv2plug.in/ns/ext/port-props/#rangeSteps
2144                         desc.smallstep = desc.smallstep / logf(s);
2145                         desc.step      = desc.step      / logf(s);
2146                         desc.largestep = desc.largestep / logf(s);
2147                 } else if (desc.integer_step) {
2148                         desc.smallstep = 1.0;
2149                         desc.step      = std::max(1.f, rintf (desc.step));
2150                         desc.largestep = std::max(1.f, rintf (desc.largestep));
2151                 }
2152                 DEBUG_TRACE(DEBUG::LV2, string_compose("parameter %1 small: %2, step: %3 largestep: %4\n",
2153                                         which, desc.smallstep, desc.step, desc.largestep));
2154         }
2155
2156
2157         lilv_node_free(def);
2158         lilv_node_free(min);
2159         lilv_node_free(max);
2160         lilv_node_free(steps);
2161         lilv_nodes_free(portunits);
2162
2163         return 0;
2164 }
2165
2166 Plugin::IOPortDescription
2167 LV2Plugin::describe_io_port (ARDOUR::DataType dt, bool input, uint32_t id) const
2168 {
2169         PortFlags match = 0;
2170         switch (dt) {
2171                 case DataType::AUDIO:
2172                         match = PORT_AUDIO;
2173                         break;
2174                 case DataType::MIDI:
2175                         match = PORT_SEQUENCE | PORT_MIDI; // ignore old PORT_EVENT
2176                         break;
2177                 default:
2178                         return Plugin::IOPortDescription ("?");
2179                         break;
2180         }
2181         if (input) {
2182                 match |= PORT_INPUT;
2183         } else {
2184                 match |= PORT_OUTPUT;
2185         }
2186
2187         uint32_t p = 0;
2188         uint32_t idx = UINT32_MAX;
2189
2190         uint32_t const num_ports = parameter_count();
2191         for (uint32_t port_index = 0; port_index < num_ports; ++port_index) {
2192                 PortFlags flags = _port_flags[port_index];
2193                 if ((flags & match) == match) {
2194                         if (p == id) {
2195                                 idx = port_index;
2196                         }
2197                         ++p;
2198                 }
2199         }
2200         if (idx == UINT32_MAX) {
2201                 return Plugin::IOPortDescription ("?");
2202         }
2203
2204         const LilvPort* pport = lilv_plugin_get_port_by_index (_impl->plugin, idx);
2205
2206         LilvNode* name = lilv_port_get_name(_impl->plugin, pport);
2207         Plugin::IOPortDescription iod (lilv_node_as_string (name));
2208         lilv_node_free(name);
2209
2210         /* get the port's pg:group */
2211         LilvNodes* groups = lilv_port_get_value (_impl->plugin, pport, _world.groups_group);
2212         if (lilv_nodes_size (groups) > 0) {
2213                 const LilvNode* group = lilv_nodes_get_first (groups);
2214                 LilvNodes* grouplabel = lilv_world_find_nodes (_world.world, group, _world.rdfs_label, NULL);
2215
2216                 /* get the name of the port-group */
2217                 if (lilv_nodes_size (grouplabel) > 0) {
2218                         const LilvNode* grpname = lilv_nodes_get_first (grouplabel);
2219                         iod.group_name = lilv_node_as_string (grpname);
2220                 }
2221                 lilv_nodes_free (grouplabel);
2222
2223                 /* get all port designations.
2224                  * we're interested in e.g. lv2:designation pg:right */
2225                 LilvNodes* designations = lilv_port_get_value (_impl->plugin, pport, _world.lv2_designation);
2226                 if (lilv_nodes_size (designations) > 0) {
2227                         /* get all pg:elements of the pg:group */
2228                         LilvNodes* group_childs = lilv_world_find_nodes (_world.world, group, _world.groups_element, NULL);
2229                         if (lilv_nodes_size (group_childs) > 0) {
2230                                 /* iterate over all port designations .. */
2231                                 LILV_FOREACH (nodes, i, designations) {
2232                                         const LilvNode* designation = lilv_nodes_get (designations, i);
2233                                         /* match the lv2:designation's element against the port-group's element */
2234                                         LILV_FOREACH (nodes, j, group_childs) {
2235                                                 const LilvNode* group_element = lilv_nodes_get (group_childs, j);
2236                                                 LilvNodes* elem = lilv_world_find_nodes (_world.world, group_element, _world.lv2_designation, designation);
2237                                                 /* found it. Now look up the index (channel-number) of the pg:Element */
2238                                                 if (lilv_nodes_size (elem) > 0) {
2239                                                         LilvNodes* idx = lilv_world_find_nodes (_world.world, lilv_nodes_get_first (elem), _world.lv2_index, NULL);
2240                                                         if (lilv_node_is_int (lilv_nodes_get_first (idx))) {
2241                                                                 iod.group_channel = lilv_node_as_int(lilv_nodes_get_first (idx));
2242                                                         }
2243                                                 }
2244                                         }
2245                                 }
2246                         }
2247                 }
2248                 lilv_nodes_free (groups);
2249                 lilv_nodes_free (designations);
2250         }
2251
2252         if (lilv_port_has_property(_impl->plugin, pport, _world.lv2_isSideChain)) {
2253                 iod.is_sidechain = true;
2254         }
2255         return iod;
2256 }
2257
2258 string
2259 LV2Plugin::describe_parameter(Evoral::Parameter which)
2260 {
2261         if (( which.type() == PluginAutomation) && ( which.id() < parameter_count()) ) {
2262
2263                 if (lilv_port_has_property(_impl->plugin,
2264                                         lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.ext_notOnGUI)) {
2265                         return X_("hidden");
2266                 }
2267
2268                 if (lilv_port_has_property(_impl->plugin,
2269                                         lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.lv2_freewheeling)) {
2270                         return X_("hidden");
2271                 }
2272
2273                 if (lilv_port_has_property(_impl->plugin,
2274                                         lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.lv2_reportsLatency)) {
2275                         return X_("latency");
2276                 }
2277
2278                 LilvNode* name = lilv_port_get_name(_impl->plugin,
2279                                                     lilv_plugin_get_port_by_index(_impl->plugin, which.id()));
2280                 string ret(lilv_node_as_string(name));
2281                 lilv_node_free(name);
2282                 return ret;
2283         } else {
2284                 return "??";
2285         }
2286 }
2287
2288 framecnt_t
2289 LV2Plugin::max_latency () const
2290 {
2291         return _max_latency;
2292 }
2293
2294 framecnt_t
2295 LV2Plugin::signal_latency() const
2296 {
2297         if (_latency_control_port) {
2298                 return (framecnt_t)floor(*_latency_control_port);
2299         } else {
2300                 return 0;
2301         }
2302 }
2303
2304 set<Evoral::Parameter>
2305 LV2Plugin::automatable() const
2306 {
2307         set<Evoral::Parameter> ret;
2308
2309         for (uint32_t i = 0; i < parameter_count(); ++i) {
2310                 if (parameter_is_input(i) && parameter_is_control(i) && !(_port_flags[i] & PORT_NOAUTO)) {
2311                         ret.insert(ret.end(), Evoral::Parameter(PluginAutomation, 0, i));
2312                 }
2313         }
2314
2315         for (PropertyDescriptors::const_iterator p = _property_descriptors.begin();
2316              p != _property_descriptors.end();
2317              ++p) {
2318                 ret.insert(ret.end(), Evoral::Parameter(PluginPropertyAutomation, 0, p->first));
2319         }
2320         return ret;
2321 }
2322
2323 void
2324 LV2Plugin::set_automation_control (uint32_t i, boost::shared_ptr<AutomationControl> c)
2325 {
2326         if ((_port_flags[i] & (PORT_CTRLED | PORT_CTRLER))) {
2327                 DEBUG_TRACE(DEBUG::LV2Automate, string_compose ("Ctrl Port %1\n", i));
2328                 _ctrl_map [i] = AutomationCtrlPtr (new AutomationCtrl(c));
2329         }
2330 }
2331
2332 LV2Plugin::AutomationCtrlPtr
2333 LV2Plugin::get_automation_control (uint32_t i)
2334 {
2335         if (_ctrl_map.find (i) == _ctrl_map.end()) {
2336                 return AutomationCtrlPtr ();
2337         }
2338         return _ctrl_map[i];
2339 }
2340
2341 void
2342 LV2Plugin::activate()
2343 {
2344         DEBUG_TRACE(DEBUG::LV2, string_compose("%1 activate\n", name()));
2345
2346         if (!_was_activated) {
2347                 lilv_instance_activate(_impl->instance);
2348                 _was_activated = true;
2349         }
2350 }
2351
2352 void
2353 LV2Plugin::deactivate()
2354 {
2355         DEBUG_TRACE(DEBUG::LV2, string_compose("%1 deactivate\n", name()));
2356
2357         if (_was_activated) {
2358                 lilv_instance_deactivate(_impl->instance);
2359                 _was_activated = false;
2360         }
2361 }
2362
2363 void
2364 LV2Plugin::cleanup()
2365 {
2366         DEBUG_TRACE(DEBUG::LV2, string_compose("%1 cleanup\n", name()));
2367
2368         deactivate();
2369         lilv_instance_free(_impl->instance);
2370         _impl->instance = NULL;
2371 }
2372
2373 void
2374 LV2Plugin::allocate_atom_event_buffers()
2375 {
2376         /* reserve local scratch buffers for ATOM event-queues */
2377         const LilvPlugin* p = _impl->plugin;
2378
2379         /* count non-MIDI atom event-ports
2380          * TODO: nicely ask drobilla to make a lilv_ call for that
2381          */
2382         int count_atom_out = 0;
2383         int count_atom_in = 0;
2384         int minimumSize = 32768; // TODO use a per-port minimum-size
2385         for (uint32_t i = 0; i < lilv_plugin_get_num_ports(p); ++i) {
2386                 const LilvPort* port  = lilv_plugin_get_port_by_index(p, i);
2387                 if (lilv_port_is_a(p, port, _world.atom_AtomPort)) {
2388                         LilvNodes* buffer_types = lilv_port_get_value(
2389                                 p, port, _world.atom_bufferType);
2390                         LilvNodes* atom_supports = lilv_port_get_value(
2391                                 p, port, _world.atom_supports);
2392
2393                         if (lilv_nodes_contains(buffer_types, _world.atom_Sequence)) {
2394                                 if (lilv_port_is_a(p, port, _world.lv2_InputPort)) {
2395                                         count_atom_in++;
2396                                 }
2397                                 if (lilv_port_is_a(p, port, _world.lv2_OutputPort)) {
2398                                         count_atom_out++;
2399                                 }
2400                                 LilvNodes* min_size_v = lilv_port_get_value(_impl->plugin, port, _world.rsz_minimumSize);
2401                                 LilvNode* min_size = min_size_v ? lilv_nodes_get_first(min_size_v) : NULL;
2402                                 if (min_size && lilv_node_is_int(min_size)) {
2403                                         minimumSize = std::max(minimumSize, lilv_node_as_int(min_size));
2404                                 }
2405                                 lilv_nodes_free(min_size_v);
2406                         }
2407                         lilv_nodes_free(buffer_types);
2408                         lilv_nodes_free(atom_supports);
2409                 }
2410         }
2411
2412         DEBUG_TRACE(DEBUG::LV2, string_compose("%1 need buffers for %2 atom-in and %3 atom-out event-ports\n",
2413                                 name(), count_atom_in, count_atom_out));
2414
2415         const int total_atom_buffers = (count_atom_in + count_atom_out);
2416         if (_atom_ev_buffers || total_atom_buffers == 0) {
2417                 return;
2418         }
2419
2420         DEBUG_TRACE(DEBUG::LV2, string_compose("allocate %1 atom_ev_buffers of %2 bytes\n", total_atom_buffers, minimumSize));
2421         _atom_ev_buffers = (LV2_Evbuf**) malloc((total_atom_buffers + 1) * sizeof(LV2_Evbuf*));
2422         for (int i = 0; i < total_atom_buffers; ++i ) {
2423                 _atom_ev_buffers[i] = lv2_evbuf_new(minimumSize, LV2_EVBUF_ATOM,
2424                                 _uri_map.urids.atom_Chunk, _uri_map.urids.atom_Sequence);
2425         }
2426         _atom_ev_buffers[total_atom_buffers] = 0;
2427         return;
2428 }
2429
2430 /** Write an ardour position/time/tempo/meter as an LV2 event.
2431  * @return true on success.
2432  */
2433 static bool
2434 write_position(LV2_Atom_Forge*     forge,
2435                LV2_Evbuf*          buf,
2436                const TempoMetric&  t,
2437                Timecode::BBT_Time& bbt,
2438                double              speed,
2439                double              bpm,
2440                framepos_t          position,
2441                framecnt_t          offset)
2442 {
2443         const URIMap::URIDs& urids = URIMap::instance().urids;
2444
2445         uint8_t pos_buf[256];
2446         lv2_atom_forge_set_buffer(forge, pos_buf, sizeof(pos_buf));
2447         LV2_Atom_Forge_Frame frame;
2448 #ifdef HAVE_LV2_1_10_0
2449         lv2_atom_forge_object(forge, &frame, 0, urids.time_Position);
2450         lv2_atom_forge_key(forge, urids.time_frame);
2451         lv2_atom_forge_long(forge, position);
2452         lv2_atom_forge_key(forge, urids.time_speed);
2453         lv2_atom_forge_float(forge, speed);
2454         lv2_atom_forge_key(forge, urids.time_barBeat);
2455         lv2_atom_forge_float(forge, bbt.beats - 1 +
2456                              (bbt.ticks / Timecode::BBT_Time::ticks_per_beat));
2457         lv2_atom_forge_key(forge, urids.time_bar);
2458         lv2_atom_forge_long(forge, bbt.bars - 1);
2459         lv2_atom_forge_key(forge, urids.time_beatUnit);
2460         lv2_atom_forge_int(forge, t.meter().note_divisor());
2461         lv2_atom_forge_key(forge, urids.time_beatsPerBar);
2462         lv2_atom_forge_float(forge, t.meter().divisions_per_bar());
2463         lv2_atom_forge_key(forge, urids.time_beatsPerMinute);
2464         lv2_atom_forge_float(forge, bpm);
2465 #else
2466         lv2_atom_forge_blank(forge, &frame, 1, urids.time_Position);
2467         lv2_atom_forge_property_head(forge, urids.time_frame, 0);
2468         lv2_atom_forge_long(forge, position);
2469         lv2_atom_forge_property_head(forge, urids.time_speed, 0);
2470         lv2_atom_forge_float(forge, speed);
2471         lv2_atom_forge_property_head(forge, urids.time_barBeat, 0);
2472         lv2_atom_forge_float(forge, bbt.beats - 1 +
2473                              (bbt.ticks / Timecode::BBT_Time::ticks_per_beat));
2474         lv2_atom_forge_property_head(forge, urids.time_bar, 0);
2475         lv2_atom_forge_long(forge, bbt.bars - 1);
2476         lv2_atom_forge_property_head(forge, urids.time_beatUnit, 0);
2477         lv2_atom_forge_int(forge, t.meter().note_divisor());
2478         lv2_atom_forge_property_head(forge, urids.time_beatsPerBar, 0);
2479         lv2_atom_forge_float(forge, t.meter().divisions_per_bar());
2480         lv2_atom_forge_property_head(forge, urids.time_beatsPerMinute, 0);
2481         lv2_atom_forge_float(forge, bpm);
2482 #endif
2483
2484         LV2_Evbuf_Iterator    end  = lv2_evbuf_end(buf);
2485         const LV2_Atom* const atom = (const LV2_Atom*)pos_buf;
2486         return lv2_evbuf_write(&end, offset, 0, atom->type, atom->size,
2487                                (const uint8_t*)(atom + 1));
2488 }
2489
2490 int
2491 LV2Plugin::connect_and_run(BufferSet& bufs,
2492                 framepos_t start, framepos_t end, double speed,
2493                 ChanMapping in_map, ChanMapping out_map,
2494                 pframes_t nframes, framecnt_t offset)
2495 {
2496         DEBUG_TRACE(DEBUG::LV2, string_compose("%1 run %2 offset %3\n", name(), nframes, offset));
2497         Plugin::connect_and_run(bufs, start, end, speed, in_map, out_map, nframes, offset);
2498
2499         cycles_t then = get_cycles();
2500
2501         TempoMap&               tmap     = _session.tempo_map();
2502         Metrics::const_iterator metric_i = tmap.metrics_end();
2503         TempoMetric             tmetric  = tmap.metric_at(start, &metric_i);
2504
2505         if (_freewheel_control_port) {
2506                 *_freewheel_control_port = _session.engine().freewheeling() ? 1.f : 0.f;
2507         }
2508
2509         if (_bpm_control_port) {
2510                 *_bpm_control_port = tmap.tempo_at_frame (start).note_types_per_minute();
2511         }
2512
2513 #ifdef LV2_EXTENDED
2514         if (_can_write_automation && start != _next_cycle_start) {
2515                 // add guard-points after locating
2516                 for (AutomationCtrlMap::iterator i = _ctrl_map.begin(); i != _ctrl_map.end(); ++i) {
2517                         i->second->guard = true;
2518                 }
2519         }
2520 #endif
2521
2522         ChanCount bufs_count;
2523         bufs_count.set(DataType::AUDIO, 1);
2524         bufs_count.set(DataType::MIDI, 1);
2525         BufferSet& silent_bufs  = _session.get_silent_buffers(bufs_count);
2526         BufferSet& scratch_bufs = _session.get_scratch_buffers(bufs_count);
2527         uint32_t const num_ports = parameter_count();
2528         uint32_t const nil_index = std::numeric_limits<uint32_t>::max();
2529
2530         uint32_t audio_in_index  = 0;
2531         uint32_t audio_out_index = 0;
2532         uint32_t midi_in_index   = 0;
2533         uint32_t midi_out_index  = 0;
2534         uint32_t atom_port_index = 0;
2535         for (uint32_t port_index = 0; port_index < num_ports; ++port_index) {
2536                 void*     buf   = NULL;
2537                 uint32_t  index = nil_index;
2538                 PortFlags flags = _port_flags[port_index];
2539                 bool      valid = false;
2540                 if (flags & PORT_AUDIO) {
2541                         if (flags & PORT_INPUT) {
2542                                 index = in_map.get(DataType::AUDIO, audio_in_index++, &valid);
2543                                 buf = (valid)
2544                                         ? bufs.get_audio(index).data(offset)
2545                                         : silent_bufs.get_audio(0).data(offset);
2546                         } else {
2547                                 index = out_map.get(DataType::AUDIO, audio_out_index++, &valid);
2548                                 buf = (valid)
2549                                         ? bufs.get_audio(index).data(offset)
2550                                         : scratch_bufs.get_audio(0).data(offset);
2551                         }
2552                 } else if (flags & (PORT_EVENT|PORT_SEQUENCE)) {
2553                         /* FIXME: The checks here for bufs.count().n_midi() > index shouldn't
2554                            be necessary, but the mapping is illegal in some cases.  Ideally
2555                            that should be fixed, but this is easier...
2556                         */
2557                         if (flags & PORT_MIDI) {
2558                                 if (flags & PORT_INPUT) {
2559                                         index = in_map.get(DataType::MIDI, midi_in_index++, &valid);
2560                                 } else {
2561                                         index = out_map.get(DataType::MIDI, midi_out_index++, &valid);
2562                                 }
2563                                 if (valid && bufs.count().n_midi() > index) {
2564                                         /* Note, ensure_lv2_bufsize() is not RT safe!
2565                                          * However free()/alloc() is only called if a
2566                                          * plugin requires a rsz:minimumSize buffersize
2567                                          * and the existing buffer if smaller.
2568                                          */
2569                                         bufs.ensure_lv2_bufsize((flags & PORT_INPUT), index, _port_minimumSize[port_index]);
2570                                         _ev_buffers[port_index] = bufs.get_lv2_midi(
2571                                                 (flags & PORT_INPUT), index, (flags & PORT_EVENT));
2572                                 }
2573                         } else if ((flags & PORT_POSITION) && (flags & PORT_INPUT)) {
2574                                 lv2_evbuf_reset(_atom_ev_buffers[atom_port_index], true);
2575                                 _ev_buffers[port_index] = _atom_ev_buffers[atom_port_index++];
2576                                 valid                   = true;
2577                         }
2578
2579                         if (valid && (flags & PORT_INPUT)) {
2580                                 if ((flags & PORT_POSITION)) {
2581                                         Timecode::BBT_Time bbt (tmap.bbt_at_frame (start));
2582                                         double bpm = tmap.tempo_at_frame (start).note_types_per_minute();
2583                                         double beatpos = (bbt.bars - 1) * tmetric.meter().divisions_per_bar()
2584                                                        + (bbt.beats - 1)
2585                                                        + (bbt.ticks / Timecode::BBT_Time::ticks_per_beat);
2586                                         beatpos *= tmetric.meter().note_divisor() / 4.0;
2587                                         if (start != _next_cycle_start ||
2588                                                         speed != _next_cycle_speed ||
2589                                                         rint (1000 * beatpos) != rint(1000 * _next_cycle_beat) ||
2590                                                         bpm != _current_bpm) {
2591                                                 // Transport or Tempo has changed, write position at cycle start
2592                                                 write_position(&_impl->forge, _ev_buffers[port_index],
2593                                                                 tmetric, bbt, speed, bpm, start, 0);
2594                                         }
2595                                 }
2596
2597                                 // Get MIDI iterator range (empty range if no MIDI)
2598                                 MidiBuffer::iterator m = (index != nil_index)
2599                                         ? bufs.get_midi(index).begin()
2600                                         : silent_bufs.get_midi(0).end();
2601                                 MidiBuffer::iterator m_end = (index != nil_index)
2602                                         ? bufs.get_midi(index).end()
2603                                         : m;
2604
2605                                 // Now merge MIDI and any transport events into the buffer
2606                                 const uint32_t     type = _uri_map.urids.midi_MidiEvent;
2607                                 const framepos_t   tend = end;
2608                                 ++metric_i;
2609                                 while (m != m_end || (metric_i != tmap.metrics_end() &&
2610                                                       (*metric_i)->frame() < tend)) {
2611                                         MetricSection* metric = (metric_i != tmap.metrics_end())
2612                                                 ? *metric_i : NULL;
2613                                         if (m != m_end && (!metric || metric->frame() > (*m).time())) {
2614                                                 const Evoral::Event<framepos_t> ev(*m, false);
2615                                                 if (ev.time() < nframes) {
2616                                                         LV2_Evbuf_Iterator eend = lv2_evbuf_end(_ev_buffers[port_index]);
2617                                                         lv2_evbuf_write(&eend, ev.time(), 0, type, ev.size(), ev.buffer());
2618                                                 }
2619                                                 ++m;
2620                                         } else {
2621                                                 tmetric.set_metric(metric);
2622                                                 Timecode::BBT_Time bbt;
2623                                                 bbt = tmap.bbt_at_frame (metric->frame());
2624                                                 double bpm = tmap.tempo_at_frame (start/*XXX*/).note_types_per_minute();
2625                                                 write_position(&_impl->forge, _ev_buffers[port_index],
2626                                                                tmetric, bbt, speed, bpm,
2627                                                                metric->frame(),
2628                                                                metric->frame() - start);
2629                                                 ++metric_i;
2630                                         }
2631                                 }
2632                         } else if (!valid) {
2633                                 // Nothing we understand or care about, connect to scratch
2634                                 // see note for midi-buffer size above
2635                                 scratch_bufs.ensure_lv2_bufsize((flags & PORT_INPUT),
2636                                                 0, _port_minimumSize[port_index]);
2637                                 _ev_buffers[port_index] = scratch_bufs.get_lv2_midi(
2638                                         (flags & PORT_INPUT), 0, (flags & PORT_EVENT));
2639                         }
2640
2641                         buf = lv2_evbuf_get_buffer(_ev_buffers[port_index]);
2642                 } else {
2643                         continue;  // Control port, leave buffer alone
2644                 }
2645                 lilv_instance_connect_port(_impl->instance, port_index, buf);
2646         }
2647
2648         // Read messages from UI and push into appropriate buffers
2649         if (_from_ui) {
2650                 uint32_t read_space = _from_ui->read_space();
2651                 while (read_space > sizeof(UIMessage)) {
2652                         UIMessage msg;
2653                         if (_from_ui->read((uint8_t*)&msg, sizeof(msg)) != sizeof(msg)) {
2654                                 error << "Error reading from UI=>Plugin RingBuffer" << endmsg;
2655                                 break;
2656                         }
2657                         vector<uint8_t> body(msg.size);
2658                         if (_from_ui->read(&body[0], msg.size) != msg.size) {
2659                                 error << "Error reading from UI=>Plugin RingBuffer" << endmsg;
2660                                 break;
2661                         }
2662                         if (msg.protocol == URIMap::instance().urids.atom_eventTransfer) {
2663                                 LV2_Evbuf*            buf  = _ev_buffers[msg.index];
2664                                 LV2_Evbuf_Iterator    i    = lv2_evbuf_end(buf);
2665                                 const LV2_Atom* const atom = (const LV2_Atom*)&body[0];
2666                                 if (!lv2_evbuf_write(&i, nframes - 1, 0, atom->type, atom->size,
2667                                                 (const uint8_t*)(atom + 1))) {
2668                                         error << "Failed to write data to LV2 event buffer\n";
2669                                 }
2670                         } else {
2671                                 error << "Received unknown message type from UI" << endmsg;
2672                         }
2673                         read_space -= sizeof(UIMessage) + msg.size;
2674                 }
2675         }
2676
2677         run(nframes);
2678
2679         midi_out_index = 0;
2680         for (uint32_t port_index = 0; port_index < num_ports; ++port_index) {
2681                 PortFlags flags = _port_flags[port_index];
2682                 bool      valid = false;
2683
2684                 /* TODO ask drobilla about comment
2685                  * "Make Ardour event buffers generic so plugins can communicate"
2686                  * in libs/ardour/buffer_set.cc:310
2687                  *
2688                  * ideally the user could choose which of the following two modes
2689                  * to use (e.g. instrument/effect chains  MIDI OUT vs MIDI TRHU).
2690                  *
2691                  * This implementation follows the discussion on IRC Mar 16 2013 16:47 UTC
2692                  * 16:51 < drobilla> rgareus: [..] i.e always replace with MIDI output [of LV2 plugin] if it's there
2693                  * 16:52 < drobilla> rgareus: That would probably be good enough [..] to make users not complain
2694                  *                            for quite a while at least ;)
2695                  */
2696                 // copy output of LV2 plugin's MIDI port to Ardour MIDI buffers -- MIDI OUT
2697                 if ((flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE|PORT_MIDI))) {
2698                         const uint32_t buf_index = out_map.get(
2699                                 DataType::MIDI, midi_out_index++, &valid);
2700                         if (valid) {
2701                                 bufs.forward_lv2_midi(_ev_buffers[port_index], buf_index);
2702                         }
2703                 }
2704                 // Flush MIDI (write back to Ardour MIDI buffers) -- MIDI THRU
2705                 else if ((flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE))) {
2706                         const uint32_t buf_index = out_map.get(
2707                                 DataType::MIDI, midi_out_index++, &valid);
2708                         if (valid) {
2709                                 bufs.flush_lv2_midi(true, buf_index);
2710                         }
2711                 }
2712
2713                 // Write messages to UI
2714                 if ((_to_ui || _can_write_automation || _patch_port_out_index != (uint32_t)-1) &&
2715                     (flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE))) {
2716                         LV2_Evbuf* buf = _ev_buffers[port_index];
2717                         for (LV2_Evbuf_Iterator i = lv2_evbuf_begin(buf);
2718                              lv2_evbuf_is_valid(i);
2719                              i = lv2_evbuf_next(i)) {
2720                                 uint32_t frames, subframes, type, size;
2721                                 uint8_t* data;
2722                                 lv2_evbuf_get(i, &frames, &subframes, &type, &size, &data);
2723
2724 #ifdef LV2_EXTENDED
2725                                 // Intercept Automation Write Events
2726                                 if ((flags & PORT_AUTOCTRL)) {
2727                                         LV2_Atom* atom = (LV2_Atom*)(data - sizeof(LV2_Atom));
2728                                         if (atom->type == _uri_map.urids.atom_Blank ||
2729                                                         atom->type == _uri_map.urids.atom_Object) {
2730                                                 LV2_Atom_Object* obj = (LV2_Atom_Object*)atom;
2731                                                 if (obj->body.otype == _uri_map.urids.auto_event) {
2732                                                         // only if transport_rolling ??
2733                                                         const LV2_Atom* parameter = NULL;
2734                                                         const LV2_Atom* value    = NULL;
2735                                                         lv2_atom_object_get(obj,
2736                                                                             _uri_map.urids.auto_parameter, &parameter,
2737                                                                             _uri_map.urids.auto_value,     &value,
2738                                                                             0);
2739                                                         if (parameter && value) {
2740                                                                 const uint32_t p = ((const LV2_Atom_Int*)parameter)->body;
2741                                                                 const float v = ((const LV2_Atom_Float*)value)->body;
2742                                                                 // -> add automation event..
2743                                                                 DEBUG_TRACE(DEBUG::LV2Automate,
2744                                                                                 string_compose ("Event p: %1 t: %2 v: %3\n", p, frames, v));
2745                                                                 AutomationCtrlPtr c = get_automation_control (p);
2746                                                                 if (c &&
2747                                                                      (c->ac->automation_state() == Touch || c->ac->automation_state() == Write)
2748                                                                    ) {
2749                                                                         framepos_t when = std::max ((framepos_t) 0, start + frames - _current_latency);
2750                                                                         assert (start + frames - _current_latency >= 0);
2751                                                                         if (c->guard) {
2752                                                                                 c->guard = false;
2753                                                                                 c->ac->list()->add (when, v, true, true);
2754                                                                         } else {
2755                                                                                 c->ac->set_double (v, when, true);
2756                                                                         }
2757                                                                 }
2758                                                         }
2759                                                 }
2760                                                 else if (obj->body.otype == _uri_map.urids.auto_setup) {
2761                                                         // TODO optional arguments, for now we assume the plugin
2762                                                         // writes automation for its own inputs
2763                                                         // -> put them in "touch" mode (preferably "exclusive plugin touch(TM)"
2764                                                         for (AutomationCtrlMap::iterator i = _ctrl_map.begin(); i != _ctrl_map.end(); ++i) {
2765                                                                 if (_port_flags[i->first] & PORT_CTRLED) {
2766                                                                         DEBUG_TRACE(DEBUG::LV2Automate,
2767                                                                                 string_compose ("Setup p: %1\n", i->first));
2768                                                                         i->second->ac->set_automation_state (Touch);
2769                                                                 }
2770                                                         }
2771                                                 }
2772                                                 else if (obj->body.otype == _uri_map.urids.auto_finalize) {
2773                                                         // set [touched] parameters to "play" ??
2774                                                         // allow plugin to change its mode (from analyze to apply)
2775                                                         const LV2_Atom* parameter = NULL;
2776                                                         const LV2_Atom* value    = NULL;
2777                                                         lv2_atom_object_get(obj,
2778                                                                             _uri_map.urids.auto_parameter, &parameter,
2779                                                                             _uri_map.urids.auto_value,     &value,
2780                                                                             0);
2781                                                         if (parameter && value) {
2782                                                                 const uint32_t p = ((const LV2_Atom_Int*)parameter)->body;
2783                                                                 const float v = ((const LV2_Atom_Float*)value)->body;
2784                                                                 AutomationCtrlPtr c = get_automation_control (p);
2785                                                                 DEBUG_TRACE(DEBUG::LV2Automate,
2786                                                                                 string_compose ("Finalize p: %1 v: %2\n", p, v));
2787                                                                 if (c && _port_flags[p] & PORT_CTRLER) {
2788                                                                         c->ac->set_value(v, Controllable::NoGroup);
2789                                                                 }
2790                                                         } else {
2791                                                                 DEBUG_TRACE(DEBUG::LV2Automate, "Finalize\n");
2792                                                         }
2793                                                         for (AutomationCtrlMap::iterator i = _ctrl_map.begin(); i != _ctrl_map.end(); ++i) {
2794                                                                 // guard will be false if an event was written
2795                                                                 if ((_port_flags[i->first] & PORT_CTRLED) && !i->second->guard) {
2796                                                                         DEBUG_TRACE(DEBUG::LV2Automate,
2797                                                                                 string_compose ("Thin p: %1\n", i->first));
2798                                                                         i->second->ac->alist ()->thin (20);
2799                                                                 }
2800                                                         }
2801                                                 }
2802                                                 else if (obj->body.otype == _uri_map.urids.auto_start) {
2803                                                         const LV2_Atom* parameter = NULL;
2804                                                         lv2_atom_object_get(obj,
2805                                                                             _uri_map.urids.auto_parameter, &parameter,
2806                                                                             0);
2807                                                         if (parameter) {
2808                                                                 const uint32_t p = ((const LV2_Atom_Int*)parameter)->body;
2809                                                                 AutomationCtrlPtr c = get_automation_control (p);
2810                                                                 DEBUG_TRACE(DEBUG::LV2Automate, string_compose ("Start Touch p: %1\n", p));
2811                                                                 if (c) {
2812                                                                         c->ac->start_touch (std::max ((framepos_t)0, start - _current_latency));
2813                                                                         c->guard = true;
2814                                                                 }
2815                                                         }
2816                                                 }
2817                                                 else if (obj->body.otype == _uri_map.urids.auto_end) {
2818                                                         const LV2_Atom* parameter = NULL;
2819                                                         lv2_atom_object_get(obj,
2820                                                                             _uri_map.urids.auto_parameter, &parameter,
2821                                                                             0);
2822                                                         if (parameter) {
2823                                                                 const uint32_t p = ((const LV2_Atom_Int*)parameter)->body;
2824                                                                 AutomationCtrlPtr c = get_automation_control (p);
2825                                                                 DEBUG_TRACE(DEBUG::LV2Automate, string_compose ("End Touch p: %1\n", p));
2826                                                                 if (c) {
2827                                                                         c->ac->stop_touch (true, std::max ((framepos_t)0, start - _current_latency));
2828                                                                 }
2829                                                         }
2830                                                 }
2831                                         }
2832                                 }
2833 #endif
2834                                 // Intercept state dirty message
2835                                 if (_has_state_interface /* && (flags & PORT_DIRTYMSG)*/) {
2836                                         LV2_Atom* atom = (LV2_Atom*)(data - sizeof(LV2_Atom));
2837                                         if (atom->type == _uri_map.urids.atom_Blank ||
2838                                             atom->type == _uri_map.urids.atom_Object) {
2839                                                 LV2_Atom_Object* obj = (LV2_Atom_Object*)atom;
2840                                                 if (obj->body.otype == _uri_map.urids.state_StateChanged) {
2841                                                         _session.set_dirty ();
2842                                                 }
2843                                         }
2844                                 }
2845
2846                                 // Intercept patch change messages to emit PropertyChanged signal
2847                                 if ((flags & PORT_PATCHMSG)) {
2848                                         LV2_Atom* atom = (LV2_Atom*)(data - sizeof(LV2_Atom));
2849                                         if (atom->type == _uri_map.urids.atom_Blank ||
2850                                             atom->type == _uri_map.urids.atom_Object) {
2851                                                 LV2_Atom_Object* obj = (LV2_Atom_Object*)atom;
2852                                                 if (obj->body.otype == _uri_map.urids.patch_Set) {
2853                                                         const LV2_Atom* property = NULL;
2854                                                         const LV2_Atom* value    = NULL;
2855                                                         lv2_atom_object_get(obj,
2856                                                                             _uri_map.urids.patch_property, &property,
2857                                                                             _uri_map.urids.patch_value,    &value,
2858                                                                             0);
2859
2860                                                         if (property && value &&
2861                                                             property->type == _uri_map.urids.atom_URID &&
2862                                                             value->type    == _uri_map.urids.atom_Path) {
2863                                                                 const uint32_t prop_id = ((const LV2_Atom_URID*)property)->body;
2864                                                                 const char*    path    = (const char*)LV2_ATOM_BODY_CONST(value);
2865
2866                                                                 // Emit PropertyChanged signal for UI
2867                                                                 // TODO: This should emit the control's Changed signal
2868                                                                 PropertyChanged(prop_id, Variant(Variant::PATH, path));
2869                                                         } else {
2870                                                                 std::cerr << "warning: patch:Set for unknown property" << std::endl;
2871                                                         }
2872                                                 }
2873                                         }
2874                                 }
2875
2876                                 if (!_to_ui) continue;
2877                                 write_to_ui(port_index, URIMap::instance().urids.atom_eventTransfer,
2878                                             size + sizeof(LV2_Atom),
2879                                             data - sizeof(LV2_Atom));
2880                         }
2881                 }
2882         }
2883
2884         cycles_t now = get_cycles();
2885         set_cycles((uint32_t)(now - then));
2886
2887         // Update expected transport information for next cycle so we can detect changes
2888         _next_cycle_speed = speed;
2889         _next_cycle_start = end;
2890
2891         {
2892                 /* keep track of lv2:timePosition like plugins can do.
2893                  * Note: for no-midi plugins, we only ever send information at cycle-start,
2894                  * so it needs to be realative to that.
2895                  */
2896                 TempoMetric t = tmap.metric_at(start);
2897                 _current_bpm = tmap.tempo_at_frame (start).note_types_per_minute();
2898                 Timecode::BBT_Time bbt (tmap.bbt_at_frame (start));
2899                 double beatpos = (bbt.bars - 1) * t.meter().divisions_per_bar()
2900                                + (bbt.beats - 1)
2901                                + (bbt.ticks / Timecode::BBT_Time::ticks_per_beat);
2902                 beatpos *= tmetric.meter().note_divisor() / 4.0;
2903                 _next_cycle_beat = beatpos + nframes * speed * _current_bpm / (60.f * _session.frame_rate());
2904         }
2905
2906         if (_latency_control_port) {
2907                 framecnt_t new_latency = signal_latency ();
2908                 _current_latency = new_latency;
2909         }
2910         return 0;
2911 }
2912
2913 bool
2914 LV2Plugin::parameter_is_control(uint32_t param) const
2915 {
2916         assert(param < _port_flags.size());
2917         return _port_flags[param] & PORT_CONTROL;
2918 }
2919
2920 bool
2921 LV2Plugin::parameter_is_audio(uint32_t param) const
2922 {
2923         assert(param < _port_flags.size());
2924         return _port_flags[param] & PORT_AUDIO;
2925 }
2926
2927 bool
2928 LV2Plugin::parameter_is_event(uint32_t param) const
2929 {
2930         assert(param < _port_flags.size());
2931         return _port_flags[param] & PORT_EVENT;
2932 }
2933
2934 bool
2935 LV2Plugin::parameter_is_output(uint32_t param) const
2936 {
2937         assert(param < _port_flags.size());
2938         return _port_flags[param] & PORT_OUTPUT;
2939 }
2940
2941 bool
2942 LV2Plugin::parameter_is_input(uint32_t param) const
2943 {
2944         assert(param < _port_flags.size());
2945         return _port_flags[param] & PORT_INPUT;
2946 }
2947
2948 uint32_t
2949 LV2Plugin::designated_bypass_port ()
2950 {
2951         const LilvPort* port = NULL;
2952         LilvNode* designation = lilv_new_uri (_world.world, LV2_CORE_PREFIX "enabled");
2953         port = lilv_plugin_get_port_by_designation (
2954                         _impl->plugin, _world.lv2_InputPort, designation);
2955         lilv_node_free(designation);
2956         if (port) {
2957                 return lilv_port_get_index (_impl->plugin, port);
2958         }
2959 #ifdef LV2_EXTENDED
2960         /* deprecated on 2016-Sep-18 in favor of lv2:enabled */
2961         designation = lilv_new_uri (_world.world, LV2_PROCESSING_URI__enable);
2962         port = lilv_plugin_get_port_by_designation (
2963                         _impl->plugin, _world.lv2_InputPort, designation);
2964         lilv_node_free(designation);
2965         if (port) {
2966                 return lilv_port_get_index (_impl->plugin, port);
2967         }
2968 #endif
2969         return UINT32_MAX;
2970 }
2971
2972 void
2973 LV2Plugin::print_parameter(uint32_t param, char* buf, uint32_t len) const
2974 {
2975         if (buf && len) {
2976                 if (param < parameter_count()) {
2977                         snprintf(buf, len, "%.3f", get_parameter(param));
2978                 } else {
2979                         strcat(buf, "0");
2980                 }
2981         }
2982 }
2983
2984 boost::shared_ptr<ScalePoints>
2985 LV2Plugin::get_scale_points(uint32_t port_index) const
2986 {
2987         const LilvPort*  port   = lilv_plugin_get_port_by_index(_impl->plugin, port_index);
2988         LilvScalePoints* points = lilv_port_get_scale_points(_impl->plugin, port);
2989
2990         boost::shared_ptr<ScalePoints> ret;
2991         if (!points) {
2992                 return ret;
2993         }
2994
2995         ret = boost::shared_ptr<ScalePoints>(new ScalePoints());
2996
2997         LILV_FOREACH(scale_points, i, points) {
2998                 const LilvScalePoint* p     = lilv_scale_points_get(points, i);
2999                 const LilvNode*       label = lilv_scale_point_get_label(p);
3000                 const LilvNode*       value = lilv_scale_point_get_value(p);
3001                 if (label && (lilv_node_is_float(value) || lilv_node_is_int(value))) {
3002                         ret->insert(make_pair(lilv_node_as_string(label),
3003                                               lilv_node_as_float(value)));
3004                 }
3005         }
3006
3007         lilv_scale_points_free(points);
3008         return ret;
3009 }
3010
3011 void
3012 LV2Plugin::run(pframes_t nframes, bool sync_work)
3013 {
3014         uint32_t const N = parameter_count();
3015         for (uint32_t i = 0; i < N; ++i) {
3016                 if (parameter_is_control(i) && parameter_is_input(i)) {
3017                         _control_data[i] = _shadow_data[i];
3018                 }
3019         }
3020
3021         if (_worker) {
3022                 // Execute work synchronously if we're freewheeling (export)
3023                 _worker->set_synchronous(sync_work || session().engine().freewheeling());
3024         }
3025
3026         // Run the plugin for this cycle
3027         lilv_instance_run(_impl->instance, nframes);
3028
3029         // Emit any queued worker responses (calls a plugin callback)
3030         if (_state_worker) {
3031                 _state_worker->emit_responses();
3032         }
3033         if (_worker) {
3034                 _worker->emit_responses();
3035         }
3036
3037         // Notify the plugin that a work run cycle is complete
3038         if (_impl->work_iface) {
3039                 if (_impl->work_iface->end_run) {
3040                         _impl->work_iface->end_run(_impl->instance->lv2_handle);
3041                 }
3042         }
3043 }
3044
3045 void
3046 LV2Plugin::latency_compute_run()
3047 {
3048         if (!_latency_control_port) {
3049                 return;
3050         }
3051
3052         // Run the plugin so that it can set its latency parameter
3053
3054         bool was_activated = _was_activated;
3055         activate();
3056
3057         uint32_t port_index = 0;
3058         uint32_t in_index   = 0;
3059         uint32_t out_index  = 0;
3060
3061         // this is done in the main thread. non realtime.
3062         const framecnt_t bufsize = _engine.samples_per_cycle();
3063         float            *buffer = (float*) malloc(_engine.samples_per_cycle() * sizeof(float));
3064
3065         memset(buffer, 0, sizeof(float) * bufsize);
3066
3067         // FIXME: Ensure plugins can handle in-place processing
3068
3069         port_index = 0;
3070
3071         while (port_index < parameter_count()) {
3072                 if (parameter_is_audio(port_index)) {
3073                         if (parameter_is_input(port_index)) {
3074                                 lilv_instance_connect_port(_impl->instance, port_index, buffer);
3075                                 in_index++;
3076                         } else if (parameter_is_output(port_index)) {
3077                                 lilv_instance_connect_port(_impl->instance, port_index, buffer);
3078                                 out_index++;
3079                         }
3080                 }
3081                 port_index++;
3082         }
3083
3084         run(bufsize, true);
3085         deactivate();
3086         if (was_activated) {
3087                 activate();
3088         }
3089         free(buffer);
3090 }
3091
3092 const LilvPort*
3093 LV2Plugin::Impl::designated_input (const char* uri, void** bufptrs[], void** bufptr)
3094 {
3095         const LilvPort* port = NULL;
3096         LilvNode* designation = lilv_new_uri(_world.world, uri);
3097         port = lilv_plugin_get_port_by_designation(
3098                 plugin, _world.lv2_InputPort, designation);
3099         lilv_node_free(designation);
3100         if (port) {
3101                 bufptrs[lilv_port_get_index(plugin, port)] = bufptr;
3102         }
3103         return port;
3104 }
3105
3106 static bool lv2_filter (const string& str, void* /*arg*/)
3107 {
3108         /* Not a dotfile, has a prefix before a period, suffix is "lv2" */
3109
3110         return str[0] != '.' && (str.length() > 3 && str.find (".lv2") == (str.length() - 4));
3111 }
3112
3113
3114 LV2World::LV2World()
3115         : world(lilv_world_new())
3116         , _bundle_checked(false)
3117 {
3118         atom_AtomPort      = lilv_new_uri(world, LV2_ATOM__AtomPort);
3119         atom_Chunk         = lilv_new_uri(world, LV2_ATOM__Chunk);
3120         atom_Sequence      = lilv_new_uri(world, LV2_ATOM__Sequence);
3121         atom_bufferType    = lilv_new_uri(world, LV2_ATOM__bufferType);
3122         atom_supports      = lilv_new_uri(world, LV2_ATOM__supports);
3123         atom_eventTransfer = lilv_new_uri(world, LV2_ATOM__eventTransfer);
3124         ev_EventPort       = lilv_new_uri(world, LILV_URI_EVENT_PORT);
3125         ext_logarithmic    = lilv_new_uri(world, LV2_PORT_PROPS__logarithmic);
3126         ext_notOnGUI       = lilv_new_uri(world, LV2_PORT_PROPS__notOnGUI);
3127         ext_expensive      = lilv_new_uri(world, LV2_PORT_PROPS__expensive);
3128         ext_causesArtifacts= lilv_new_uri(world, LV2_PORT_PROPS__causesArtifacts);
3129         ext_notAutomatic   = lilv_new_uri(world, LV2_PORT_PROPS__notAutomatic);
3130         ext_rangeSteps     = lilv_new_uri(world, LV2_PORT_PROPS__rangeSteps);
3131         groups_group       = lilv_new_uri(world, LV2_PORT_GROUPS__group);
3132         groups_element     = lilv_new_uri(world, LV2_PORT_GROUPS__element);
3133         lv2_AudioPort      = lilv_new_uri(world, LILV_URI_AUDIO_PORT);
3134         lv2_ControlPort    = lilv_new_uri(world, LILV_URI_CONTROL_PORT);
3135         lv2_InputPort      = lilv_new_uri(world, LILV_URI_INPUT_PORT);
3136         lv2_OutputPort     = lilv_new_uri(world, LILV_URI_OUTPUT_PORT);
3137         lv2_inPlaceBroken  = lilv_new_uri(world, LV2_CORE__inPlaceBroken);
3138         lv2_isSideChain    = lilv_new_uri(world, LV2_CORE_PREFIX "isSideChain");
3139         lv2_index          = lilv_new_uri(world, LV2_CORE__index);
3140         lv2_integer        = lilv_new_uri(world, LV2_CORE__integer);
3141         lv2_default        = lilv_new_uri(world, LV2_CORE__default);
3142         lv2_minimum        = lilv_new_uri(world, LV2_CORE__minimum);
3143         lv2_maximum        = lilv_new_uri(world, LV2_CORE__maximum);
3144         lv2_reportsLatency = lilv_new_uri(world, LV2_CORE__reportsLatency);
3145         lv2_sampleRate     = lilv_new_uri(world, LV2_CORE__sampleRate);
3146         lv2_toggled        = lilv_new_uri(world, LV2_CORE__toggled);
3147         lv2_designation    = lilv_new_uri(world, LV2_CORE__designation);
3148         lv2_enumeration    = lilv_new_uri(world, LV2_CORE__enumeration);
3149         lv2_freewheeling   = lilv_new_uri(world, LV2_CORE__freeWheeling);
3150         midi_MidiEvent     = lilv_new_uri(world, LILV_URI_MIDI_EVENT);
3151         rdfs_comment       = lilv_new_uri(world, LILV_NS_RDFS "comment");
3152         rdfs_label         = lilv_new_uri(world, LILV_NS_RDFS "label");
3153         rdfs_range         = lilv_new_uri(world, LILV_NS_RDFS "range");
3154         rsz_minimumSize    = lilv_new_uri(world, LV2_RESIZE_PORT__minimumSize);
3155         time_Position      = lilv_new_uri(world, LV2_TIME__Position);
3156         ui_GtkUI           = lilv_new_uri(world, LV2_UI__GtkUI);
3157         ui_external        = lilv_new_uri(world, "http://lv2plug.in/ns/extensions/ui#external");
3158         ui_externalkx      = lilv_new_uri(world, "http://kxstudio.sf.net/ns/lv2ext/external-ui#Widget");
3159         units_unit         = lilv_new_uri(world, LV2_UNITS__unit);
3160         units_render       = lilv_new_uri(world, LV2_UNITS__render);
3161         units_hz           = lilv_new_uri(world, LV2_UNITS__hz);
3162         units_midiNote     = lilv_new_uri(world, LV2_UNITS__midiNote);
3163         units_db           = lilv_new_uri(world, LV2_UNITS__db);
3164         patch_writable     = lilv_new_uri(world, LV2_PATCH__writable);
3165         patch_Message      = lilv_new_uri(world, LV2_PATCH__Message);
3166 #ifdef LV2_EXTENDED
3167         lv2_noSampleAccurateCtrl    = lilv_new_uri(world, "http://ardour.org/lv2/ext#noSampleAccurateControls"); // deprecated 2016-09-18
3168         auto_can_write_automatation = lilv_new_uri(world, LV2_AUTOMATE_URI__can_write);
3169         auto_automation_control     = lilv_new_uri(world, LV2_AUTOMATE_URI__control);
3170         auto_automation_controlled  = lilv_new_uri(world, LV2_AUTOMATE_URI__controlled);
3171         auto_automation_controller  = lilv_new_uri(world, LV2_AUTOMATE_URI__controller);
3172 #endif
3173 #ifdef HAVE_LV2_1_2_0
3174         bufz_powerOf2BlockLength = lilv_new_uri(world, LV2_BUF_SIZE__powerOf2BlockLength);
3175         bufz_fixedBlockLength    = lilv_new_uri(world, LV2_BUF_SIZE__fixedBlockLength);
3176         bufz_nominalBlockLength  = lilv_new_uri(world, "http://lv2plug.in/ns/ext/buf-size#nominalBlockLength");
3177         bufz_coarseBlockLength   = lilv_new_uri(world, "http://lv2plug.in/ns/ext/buf-size#coarseBlockLength");
3178 #endif
3179
3180 }
3181
3182 LV2World::~LV2World()
3183 {
3184         if (!world) {
3185                 return;
3186         }
3187 #ifdef HAVE_LV2_1_2_0
3188         lilv_node_free(bufz_coarseBlockLength);
3189         lilv_node_free(bufz_nominalBlockLength);
3190         lilv_node_free(bufz_fixedBlockLength);
3191         lilv_node_free(bufz_powerOf2BlockLength);
3192 #endif
3193 #ifdef LV2_EXTENDED
3194         lilv_node_free(lv2_noSampleAccurateCtrl);
3195         lilv_node_free(auto_can_write_automatation);
3196         lilv_node_free(auto_automation_control);
3197         lilv_node_free(auto_automation_controlled);
3198         lilv_node_free(auto_automation_controller);
3199 #endif
3200         lilv_node_free(patch_Message);
3201         lilv_node_free(patch_writable);
3202         lilv_node_free(units_hz);
3203         lilv_node_free(units_midiNote);
3204         lilv_node_free(units_db);
3205         lilv_node_free(units_unit);
3206         lilv_node_free(units_render);
3207         lilv_node_free(ui_externalkx);
3208         lilv_node_free(ui_external);
3209         lilv_node_free(ui_GtkUI);
3210         lilv_node_free(time_Position);
3211         lilv_node_free(rsz_minimumSize);
3212         lilv_node_free(rdfs_comment);
3213         lilv_node_free(rdfs_label);
3214         lilv_node_free(rdfs_range);
3215         lilv_node_free(midi_MidiEvent);
3216         lilv_node_free(lv2_designation);
3217         lilv_node_free(lv2_enumeration);
3218         lilv_node_free(lv2_freewheeling);
3219         lilv_node_free(lv2_toggled);
3220         lilv_node_free(lv2_sampleRate);
3221         lilv_node_free(lv2_reportsLatency);
3222         lilv_node_free(lv2_index);
3223         lilv_node_free(lv2_integer);
3224         lilv_node_free(lv2_isSideChain);
3225         lilv_node_free(lv2_inPlaceBroken);
3226         lilv_node_free(lv2_OutputPort);
3227         lilv_node_free(lv2_InputPort);
3228         lilv_node_free(lv2_ControlPort);
3229         lilv_node_free(lv2_AudioPort);
3230         lilv_node_free(groups_group);
3231         lilv_node_free(groups_element);
3232         lilv_node_free(ext_rangeSteps);
3233         lilv_node_free(ext_notAutomatic);
3234         lilv_node_free(ext_causesArtifacts);
3235         lilv_node_free(ext_expensive);
3236         lilv_node_free(ext_notOnGUI);
3237         lilv_node_free(ext_logarithmic);
3238         lilv_node_free(ev_EventPort);
3239         lilv_node_free(atom_supports);
3240         lilv_node_free(atom_eventTransfer);
3241         lilv_node_free(atom_bufferType);
3242         lilv_node_free(atom_Sequence);
3243         lilv_node_free(atom_Chunk);
3244         lilv_node_free(atom_AtomPort);
3245         lilv_world_free(world);
3246         world = NULL;
3247 }
3248
3249 void
3250 LV2World::load_bundled_plugins(bool verbose)
3251 {
3252         if (!_bundle_checked) {
3253                 if (verbose) {
3254                         cout << "Scanning folders for bundled LV2s: " << ARDOUR::lv2_bundled_search_path().to_string() << endl;
3255                 }
3256
3257                 vector<string> plugin_objects;
3258                 find_paths_matching_filter (plugin_objects, ARDOUR::lv2_bundled_search_path(), lv2_filter, 0, true, true, true);
3259                 for ( vector<string>::iterator x = plugin_objects.begin(); x != plugin_objects.end (); ++x) {
3260 #ifdef PLATFORM_WINDOWS
3261                         string uri = "file:///" + *x + "/";
3262 #else
3263                         string uri = "file://" + *x + "/";
3264 #endif
3265                         LilvNode *node = lilv_new_uri(world, uri.c_str());
3266                         lilv_world_load_bundle(world, node);
3267                         lilv_node_free(node);
3268                 }
3269
3270                 lilv_world_load_all(world);
3271                 _bundle_checked = true;
3272         }
3273 }
3274
3275 LV2PluginInfo::LV2PluginInfo (const char* plugin_uri)
3276 {
3277         type = ARDOUR::LV2;
3278         _plugin_uri = strdup(plugin_uri);
3279 }
3280
3281 LV2PluginInfo::~LV2PluginInfo()
3282 {
3283         free(_plugin_uri);
3284         _plugin_uri = NULL;
3285 }
3286
3287 PluginPtr
3288 LV2PluginInfo::load(Session& session)
3289 {
3290         try {
3291                 PluginPtr plugin;
3292                 const LilvPlugins* plugins = lilv_world_get_all_plugins(_world.world);
3293                 LilvNode* uri = lilv_new_uri(_world.world, _plugin_uri);
3294                 if (!uri) { throw failed_constructor(); }
3295                 const LilvPlugin* lp = lilv_plugins_get_by_uri(plugins, uri);
3296                 if (!lp) { throw failed_constructor(); }
3297                 plugin.reset(new LV2Plugin(session.engine(), session, lp, session.frame_rate()));
3298                 lilv_node_free(uri);
3299                 plugin->set_info(PluginInfoPtr(shared_from_this ()));
3300                 return plugin;
3301         } catch (failed_constructor& err) {
3302                 return PluginPtr((Plugin*)0);
3303         }
3304
3305         return PluginPtr();
3306 }
3307
3308 std::vector<Plugin::PresetRecord>
3309 LV2PluginInfo::get_presets (bool /*user_only*/) const
3310 {
3311         std::vector<Plugin::PresetRecord> p;
3312 #ifndef NO_PLUGIN_STATE
3313         const LilvPlugin* lp = NULL;
3314         try {
3315                 PluginPtr plugin;
3316                 const LilvPlugins* plugins = lilv_world_get_all_plugins(_world.world);
3317                 LilvNode* uri = lilv_new_uri(_world.world, _plugin_uri);
3318                 if (!uri) { throw failed_constructor(); }
3319                 lp = lilv_plugins_get_by_uri(plugins, uri);
3320                 if (!lp) { throw failed_constructor(); }
3321                 lilv_node_free(uri);
3322         } catch (failed_constructor& err) {
3323                 return p;
3324         }
3325         assert (lp);
3326         // see LV2Plugin::find_presets
3327         LilvNode* lv2_appliesTo = lilv_new_uri(_world.world, LV2_CORE__appliesTo);
3328         LilvNode* pset_Preset   = lilv_new_uri(_world.world, LV2_PRESETS__Preset);
3329         LilvNode* rdfs_label    = lilv_new_uri(_world.world, LILV_NS_RDFS "label");
3330
3331         LilvNodes* presets = lilv_plugin_get_related(lp, pset_Preset);
3332         LILV_FOREACH(nodes, i, presets) {
3333                 const LilvNode* preset = lilv_nodes_get(presets, i);
3334                 lilv_world_load_resource(_world.world, preset);
3335                 LilvNode* name = get_value(_world.world, preset, rdfs_label);
3336                 bool userpreset = true; // TODO
3337                 if (name) {
3338                         p.push_back (Plugin::PresetRecord (lilv_node_as_string(preset), lilv_node_as_string(name), userpreset));
3339                         lilv_node_free(name);
3340                 }
3341         }
3342         lilv_nodes_free(presets);
3343         lilv_node_free(rdfs_label);
3344         lilv_node_free(pset_Preset);
3345         lilv_node_free(lv2_appliesTo);
3346 #endif
3347         return p;
3348 }
3349
3350 bool
3351 LV2PluginInfo::in_category (const std::string &c) const
3352 {
3353         // TODO use untranslated lilv_plugin_get_class()
3354         // match gtk2_ardour/plugin_selector.cc
3355         return category == c;
3356 }
3357
3358 bool
3359 LV2PluginInfo::is_instrument () const
3360 {
3361         if (category == "Instrument") {
3362                 return true;
3363         }
3364 #if 1
3365         /* until we make sure that category remains untranslated in the lv2.ttl spec
3366          * and until most instruments also classify themselves as such, there's a 2nd check:
3367          */
3368         if (n_inputs.n_midi() > 0 && n_inputs.n_audio() == 0 && n_outputs.n_audio() > 0) {
3369                 return true;
3370         }
3371 #endif
3372         return false;
3373 }
3374
3375 PluginInfoList*
3376 LV2PluginInfo::discover()
3377 {
3378         LV2World world;
3379         world.load_bundled_plugins();
3380         _world.load_bundled_plugins(true);
3381
3382         PluginInfoList*    plugs   = new PluginInfoList;
3383         const LilvPlugins* plugins = lilv_world_get_all_plugins(world.world);
3384
3385         LILV_FOREACH(plugins, i, plugins) {
3386                 const LilvPlugin* p = lilv_plugins_get(plugins, i);
3387                 const LilvNode* pun = lilv_plugin_get_uri(p);
3388                 if (!pun) continue;
3389                 LV2PluginInfoPtr info(new LV2PluginInfo(lilv_node_as_string(pun)));
3390
3391                 LilvNode* name = lilv_plugin_get_name(p);
3392                 if (!name || !lilv_plugin_get_port_by_index(p, 0)) {
3393                         warning << "Ignoring invalid LV2 plugin "
3394                                 << lilv_node_as_string(lilv_plugin_get_uri(p))
3395                                 << endmsg;
3396                         continue;
3397                 }
3398
3399                 if (lilv_plugin_has_feature(p, world.lv2_inPlaceBroken)) {
3400                         warning << string_compose(
3401                             _("Ignoring LV2 plugin \"%1\" since it cannot do inplace processing."),
3402                             lilv_node_as_string(name)) << endmsg;
3403                         lilv_node_free(name);
3404                         continue;
3405                 }
3406
3407 #ifdef HAVE_LV2_1_2_0
3408                 LilvNodes *required_features = lilv_plugin_get_required_features (p);
3409                 if (lilv_nodes_contains (required_features, world.bufz_powerOf2BlockLength) ||
3410                                 lilv_nodes_contains (required_features, world.bufz_fixedBlockLength)
3411                    ) {
3412                         warning << string_compose(
3413                             _("Ignoring LV2 plugin \"%1\" because its buffer-size requirements cannot be satisfied."),
3414                             lilv_node_as_string(name)) << endmsg;
3415                         lilv_nodes_free(required_features);
3416                         lilv_node_free(name);
3417                         continue;
3418                 }
3419                 lilv_nodes_free(required_features);
3420 #endif
3421
3422                 info->type = LV2;
3423
3424                 info->name = string(lilv_node_as_string(name));
3425                 lilv_node_free(name);
3426                 ARDOUR::PluginScanMessage(_("LV2"), info->name, false);
3427
3428                 const LilvPluginClass* pclass = lilv_plugin_get_class(p);
3429                 const LilvNode*        label  = lilv_plugin_class_get_label(pclass);
3430                 info->category = lilv_node_as_string(label);
3431
3432                 LilvNode* author_name = lilv_plugin_get_author_name(p);
3433                 info->creator = author_name ? string(lilv_node_as_string(author_name)) : "Unknown";
3434                 lilv_node_free(author_name);
3435
3436                 info->path = "/NOPATH"; // Meaningless for LV2
3437
3438                 /* count atom-event-ports that feature
3439                  * atom:supports <http://lv2plug.in/ns/ext/midi#MidiEvent>
3440                  *
3441                  * TODO: nicely ask drobilla to make a lilv_ call for that
3442                  */
3443                 int count_midi_out = 0;
3444                 int count_midi_in = 0;
3445                 for (uint32_t i = 0; i < lilv_plugin_get_num_ports(p); ++i) {
3446                         const LilvPort* port  = lilv_plugin_get_port_by_index(p, i);
3447                         if (lilv_port_is_a(p, port, world.atom_AtomPort)) {
3448                                 LilvNodes* buffer_types = lilv_port_get_value(
3449                                         p, port, world.atom_bufferType);
3450                                 LilvNodes* atom_supports = lilv_port_get_value(
3451                                         p, port, world.atom_supports);
3452
3453                                 if (lilv_nodes_contains(buffer_types, world.atom_Sequence)
3454                                                 && lilv_nodes_contains(atom_supports, world.midi_MidiEvent)) {
3455                                         if (lilv_port_is_a(p, port, world.lv2_InputPort)) {
3456                                                 count_midi_in++;
3457                                         }
3458                                         if (lilv_port_is_a(p, port, world.lv2_OutputPort)) {
3459                                                 count_midi_out++;
3460                                         }
3461                                 }
3462                                 lilv_nodes_free(buffer_types);
3463                                 lilv_nodes_free(atom_supports);
3464                         }
3465                 }
3466
3467                 info->n_inputs.set_audio(
3468                         lilv_plugin_get_num_ports_of_class(
3469                                 p, world.lv2_InputPort, world.lv2_AudioPort, NULL));
3470                 info->n_inputs.set_midi(
3471                         lilv_plugin_get_num_ports_of_class(
3472                                 p, world.lv2_InputPort, world.ev_EventPort, NULL)
3473                         + count_midi_in);
3474
3475                 info->n_outputs.set_audio(
3476                         lilv_plugin_get_num_ports_of_class(
3477                                 p, world.lv2_OutputPort, world.lv2_AudioPort, NULL));
3478                 info->n_outputs.set_midi(
3479                         lilv_plugin_get_num_ports_of_class(
3480                                 p, world.lv2_OutputPort, world.ev_EventPort, NULL)
3481                         + count_midi_out);
3482
3483                 info->unique_id = lilv_node_as_uri(lilv_plugin_get_uri(p));
3484                 info->index     = 0; // Meaningless for LV2
3485
3486                 plugs->push_back(info);
3487         }
3488
3489         return plugs;
3490 }