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