Full round-trip message communication between LV2 UIs and plugins.
[ardour.git] / libs / ardour / lv2_plugin.cc
1 /*
2     Copyright (C) 2008-2011 Paul Davis
3     Author: David Robillard
4
5     This program is free software; you can redistribute it and/or modify
6     it under the terms of the GNU General Public License as published by
7     the Free Software Foundation; either version 2 of the License, or
8     (at your option) any later version.
9
10     This program is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13     GNU General Public License for more details.
14
15     You should have received a copy of the GNU General Public License
16     along with this program; if not, write to the Free Software
17     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 */
19
20 #include <string>
21 #include <vector>
22
23 #include <cmath>
24 #include <cstdlib>
25 #include <cstring>
26
27 #include <glibmm.h>
28 #include <giomm/file.h>
29
30 #include <boost/utility.hpp>
31
32 #include "pbd/compose.h"
33 #include "pbd/error.h"
34 #include "pbd/pathscanner.h"
35 #include "pbd/stl_delete.h"
36 #include "pbd/xml++.h"
37
38 #include "libardour-config.h"
39
40 #include "ardour/ardour.h"
41 #include "ardour/audio_buffer.h"
42 #include "ardour/audioengine.h"
43 #include "ardour/debug.h"
44 #include "ardour/lv2_plugin.h"
45 #include "ardour/session.h"
46
47 #include "i18n.h"
48 #include <locale.h>
49
50 #include <lilv/lilv.h>
51
52 #include "lv2/lv2plug.in/ns/ext/atom/atom.h"
53 #include "lv2/lv2plug.in/ns/ext/state/state.h"
54
55 #include "lv2_evbuf.h"
56
57 #ifdef HAVE_SUIL
58 #include <suil/suil.h>
59 #endif
60
61 #define NS_DC      "http://dublincore.org/documents/dcmi-namespace/"
62 #define NS_OLDPSET "http://lv2plug.in/ns/dev/presets#"
63 #define NS_PSET    "http://lv2plug.in/ns/ext/presets#"
64 #define NS_UI      "http://lv2plug.in/ns/extensions/ui#"
65
66 using namespace std;
67 using namespace ARDOUR;
68 using namespace PBD;
69
70 URIMap LV2Plugin::_uri_map;
71 uint32_t LV2Plugin::_midi_event_type_ev = _uri_map.uri_to_id(
72         "http://lv2plug.in/ns/ext/event",
73         "http://lv2plug.in/ns/ext/midi#MidiEvent");
74 uint32_t LV2Plugin::_midi_event_type = _uri_map.uri_to_id(
75         NULL,
76         "http://lv2plug.in/ns/ext/midi#MidiEvent");
77 uint32_t LV2Plugin::_sequence_type = _uri_map.uri_to_id(
78         NULL, LV2_ATOM__Sequence);
79 uint32_t LV2Plugin::_event_transfer_type = _uri_map.uri_to_id(
80         NULL, LV2_ATOM__eventTransfer);
81 uint32_t LV2Plugin::_state_path_type = _uri_map.uri_to_id(
82         NULL, LV2_STATE_PATH_URI);
83
84 class LV2World : boost::noncopyable {
85 public:
86         LV2World ();
87         ~LV2World ();
88
89         LilvWorld* world;
90
91         LilvNode* atom_MessagePort;
92         LilvNode* atom_Sequence;
93         LilvNode* atom_bufferType;
94         LilvNode* atom_eventTransfer;
95         LilvNode* ev_EventPort;
96         LilvNode* ext_logarithmic;
97         LilvNode* lv2_AudioPort;
98         LilvNode* lv2_ControlPort;
99         LilvNode* lv2_InputPort;
100         LilvNode* lv2_OutputPort;
101         LilvNode* lv2_inPlaceBroken;
102         LilvNode* lv2_integer;
103         LilvNode* lv2_sampleRate;
104         LilvNode* lv2_toggled;
105         LilvNode* midi_MidiEvent;
106         LilvNode* ui_GtkUI;
107         LilvNode* ui_external;
108 };
109
110 static LV2World _world;
111
112 struct LV2Plugin::Impl {
113         Impl() : plugin(0), ui(0), ui_type(0), name(0), author(0), instance(0)
114 #ifdef HAVE_NEW_LILV
115                , state(0)
116 #endif
117         {}
118         LilvPlugin*     plugin;
119         const LilvUI*   ui;
120         const LilvNode* ui_type;
121         LilvNode*       name;
122         LilvNode*       author;
123         LilvInstance*   instance;
124 #ifdef HAVE_NEW_LILV
125         LilvState*      state;
126 #endif
127 };
128
129 LV2Plugin::LV2Plugin (AudioEngine& engine,
130                       Session&     session,
131                       void*        c_plugin,
132                       framecnt_t   rate)
133         : Plugin(engine, session)
134         , _impl(new Impl())
135         , _features(NULL)
136         , _insert_id("0")
137 {
138         init(c_plugin, rate);
139 }
140
141 LV2Plugin::LV2Plugin (const LV2Plugin& other)
142         : Plugin(other)
143         , _impl(new Impl())
144         , _features(NULL)
145         , _insert_id(other._insert_id)
146 {
147         init(other._impl->plugin, other._sample_rate);
148
149         for (uint32_t i = 0; i < parameter_count(); ++i) {
150                 _control_data[i] = other._shadow_data[i];
151                 _shadow_data[i]  = other._shadow_data[i];
152         }
153 }
154
155 void
156 LV2Plugin::init(void* c_plugin, framecnt_t rate)
157 {
158         DEBUG_TRACE(DEBUG::LV2, "init\n");
159
160         _impl->plugin         = (LilvPlugin*)c_plugin;
161         _impl->ui             = NULL;
162         _impl->ui_type        = NULL;
163         _to_ui                = NULL;
164         _from_ui              = NULL;
165         _control_data         = 0;
166         _shadow_data          = 0;
167         _ev_buffers           = 0;
168         _latency_control_port = 0;
169         _state_version        = 0;
170         _was_activated        = false;
171         _has_state_interface  = false;
172
173         _instance_access_feature.URI = "http://lv2plug.in/ns/ext/instance-access";
174         _data_access_feature.URI     = "http://lv2plug.in/ns/ext/data-access";
175         _make_path_feature.URI       = LV2_STATE_MAKE_PATH_URI;
176
177         LilvPlugin* plugin = _impl->plugin;
178
179 #ifdef HAVE_NEW_LILV
180         LilvNode* state_iface_uri = lilv_new_uri(_world.world, LV2_STATE_INTERFACE_URI);
181         LilvNode* state_uri       = lilv_new_uri(_world.world, LV2_STATE_URI);
182         _has_state_interface =
183                 // What plugins should have (lv2:extensionData state:Interface)
184                 lilv_plugin_has_extension_data(plugin, state_iface_uri)
185                 // What some outdated/incorrect ones have
186                 || lilv_plugin_has_feature(plugin, state_uri);
187         lilv_node_free(state_uri);
188         lilv_node_free(state_iface_uri);
189 #endif
190
191         _features    = (LV2_Feature**)malloc(sizeof(LV2_Feature*) * 7);
192         _features[0] = &_instance_access_feature;
193         _features[1] = &_data_access_feature;
194         _features[2] = &_make_path_feature;
195         _features[3] = _uri_map.uri_map_feature();
196         _features[4] = _uri_map.urid_map_feature();
197         _features[5] = _uri_map.urid_unmap_feature();
198         _features[6] = NULL;
199
200         LV2_State_Make_Path* make_path = (LV2_State_Make_Path*)malloc(
201                 sizeof(LV2_State_Make_Path));
202         make_path->handle = this;
203         make_path->path = &lv2_state_make_path;
204         _make_path_feature.data = make_path;
205
206         _impl->instance = lilv_plugin_instantiate(plugin, rate, _features);
207         _impl->name     = lilv_plugin_get_name(plugin);
208         _impl->author   = lilv_plugin_get_author_name(plugin);
209
210         if (_impl->instance == 0) {
211                 error << _("LV2: Failed to instantiate plugin ") << uri() << endmsg;
212                 throw failed_constructor();
213         }
214
215         _instance_access_feature.data              = (void*)_impl->instance->lv2_handle;
216         _data_access_extension_data.extension_data = _impl->instance->lv2_descriptor->extension_data;
217         _data_access_feature.data                  = &_data_access_extension_data;
218
219         if (lilv_plugin_has_feature(plugin, _world.lv2_inPlaceBroken)) {
220                 error << string_compose(
221                     _("LV2: \"%1\" cannot be used, since it cannot do inplace processing"),
222                     lilv_node_as_string(_impl->name)) << endmsg;
223                 lilv_node_free(_impl->name);
224                 lilv_node_free(_impl->author);
225                 throw failed_constructor();
226         }
227
228         _sample_rate = rate;
229
230         const uint32_t num_ports = this->num_ports();
231         for (uint32_t i = 0; i < num_ports; ++i) {
232                 const LilvPort* port  = lilv_plugin_get_port_by_index(_impl->plugin, i);
233                 PortFlags       flags = 0;
234                 if (lilv_port_is_a(_impl->plugin, port, _world.lv2_ControlPort)) {
235                         flags |= PORT_CONTROL;
236                 } else if (lilv_port_is_a(_impl->plugin, port, _world.lv2_AudioPort)) {
237                         flags |= PORT_AUDIO;
238                 } else if (lilv_port_is_a(_impl->plugin, port, _world.ev_EventPort)) {
239                         flags |= PORT_EVENT;
240                 } else if (lilv_port_is_a(_impl->plugin, port, _world.atom_MessagePort)) {
241                         LilvNodes* buffer_types = lilv_port_get_value(
242                                 _impl->plugin, port, _world.atom_bufferType);
243                         if (lilv_nodes_contains(buffer_types, _world.atom_Sequence)) {
244                                 flags |= PORT_MESSAGE;
245                         }
246                         lilv_nodes_free(buffer_types);
247                 } else {
248                         error << string_compose(
249                                 "LV2: \"%1\" port %2 has no known data type",
250                                 lilv_node_as_string(_impl->name), i) << endmsg;
251                         throw failed_constructor();
252                 }
253                 if (lilv_port_is_a(_impl->plugin, port, _world.lv2_OutputPort)) {
254                         flags |= PORT_OUTPUT;
255                 } else if (lilv_port_is_a(_impl->plugin, port, _world.lv2_InputPort)) {
256                         flags |= PORT_INPUT;
257                 } else {
258                         error << string_compose(
259                                 "LV2: \"%1\" port %2 is neither input nor output",
260                                 lilv_node_as_string(_impl->name), i) << endmsg;
261                         throw failed_constructor();
262                 }
263                 _port_flags.push_back(flags);
264         }
265
266         const bool     latent       = lilv_plugin_has_latency(plugin);
267         const uint32_t latency_port = (latent)
268             ? lilv_plugin_get_latency_port_index(plugin)
269                 : 0;
270
271         _control_data = new float[num_ports];
272         _shadow_data  = new float[num_ports];
273         _defaults     = new float[num_ports];
274         _ev_buffers   = new LV2_Evbuf*[num_ports];
275         memset(_ev_buffers, 0, sizeof(LV2_Evbuf*) * num_ports);
276
277         for (uint32_t i = 0; i < num_ports; ++i) {
278                 const LilvPort* port = lilv_plugin_get_port_by_index(plugin, i);
279                 const LilvNode* sym  = lilv_port_get_symbol(plugin, port);
280
281                 // Store index in map so we can look up index by symbol
282                 _port_indices.insert(std::make_pair(lilv_node_as_string(sym), i));
283
284                 // Get range and default value if applicable
285                 if (parameter_is_control(i)) {
286                         LilvNode* def;
287                         lilv_port_get_range(plugin, port, &def, NULL, NULL);
288                         _defaults[i] = def ? lilv_node_as_float(def) : 0.0f;
289                         if (lilv_port_has_property (plugin, port, _world.lv2_sampleRate)) {
290                                 _defaults[i] *= _session.frame_rate ();
291                         }
292                         lilv_node_free(def);
293
294                         lilv_instance_connect_port(_impl->instance, i, &_control_data[i]);
295
296                         if (latent && ( i == latency_port) ) {
297                                 _latency_control_port  = &_control_data[i];
298                                 *_latency_control_port = 0;
299                         }
300
301                         if (parameter_is_input(i)) {
302                                 _shadow_data[i] = default_value(i);
303                         }
304                 } else {
305                         _defaults[i] = 0.0f;
306                 }
307         }
308
309         LilvUIs* uis = lilv_plugin_get_uis(plugin);
310         if (lilv_uis_size(uis) > 0) {
311 #ifdef HAVE_SUIL
312                 // Look for embeddable UI
313                 LILV_FOREACH(uis, u, uis) {
314                         const LilvUI*   this_ui      = lilv_uis_get(uis, u);
315                         const LilvNode* this_ui_type = NULL;
316                         if (lilv_ui_is_supported(this_ui,
317                                                  suil_ui_supported,
318                                                  _world.ui_GtkUI,
319                                                  &this_ui_type)) {
320                                 // TODO: Multiple UI support
321                                 _impl->ui      = this_ui;
322                                 _impl->ui_type = this_ui_type;
323                                 break;
324                         }
325                 }
326 #else
327                 // Look for Gtk native UI
328                 LILV_FOREACH(uis, i, uis) {
329                         const LilvUI* ui = lilv_uis_get(uis, i);
330                         if (lilv_ui_is_a(ui, _world.gtk_gui)) {
331                                 _impl->ui      = ui;
332                                 _impl->ui_type = _world.gtk_gui;
333                                 break;
334                         }
335                 }
336 #endif
337
338                 // If Gtk UI is not available, try to find external UI
339                 if (!_impl->ui) {
340                         LILV_FOREACH(uis, i, uis) {
341                                 const LilvUI* ui = lilv_uis_get(uis, i);
342                                 if (lilv_ui_is_a(ui, _world.ui_external)) {
343                                         _impl->ui      = ui;
344                                         _impl->ui_type = _world.ui_external;
345                                         break;
346                                 }
347                         }
348                 }
349         }
350
351         latency_compute_run();
352 }
353
354 LV2Plugin::~LV2Plugin ()
355 {
356         DEBUG_TRACE(DEBUG::LV2, string_compose("%1 destroy\n", name()));
357
358         deactivate();
359         cleanup();
360
361         lilv_instance_free(_impl->instance);
362         lilv_node_free(_impl->name);
363         lilv_node_free(_impl->author);
364
365         delete _to_ui;
366         delete _from_ui;
367
368         delete [] _control_data;
369         delete [] _shadow_data;
370         delete [] _ev_buffers;
371 }
372
373 bool
374 LV2Plugin::is_external_ui() const
375 {
376         if (!_impl->ui) {
377                 return false;
378         }
379         return lilv_ui_is_a(_impl->ui, _world.ui_external);
380 }
381
382 string
383 LV2Plugin::unique_id() const
384 {
385         return lilv_node_as_uri(lilv_plugin_get_uri(_impl->plugin));
386 }
387
388 const char*
389 LV2Plugin::uri() const
390 {
391         return lilv_node_as_uri(lilv_plugin_get_uri(_impl->plugin));
392 }
393
394 const char*
395 LV2Plugin::label() const
396 {
397         return lilv_node_as_string(_impl->name);
398 }
399
400 const char*
401 LV2Plugin::name() const
402 {
403         return lilv_node_as_string(_impl->name);
404 }
405
406 const char*
407 LV2Plugin::maker() const
408 {
409         return _impl->author ? lilv_node_as_string (_impl->author) : "Unknown";
410 }
411
412 uint32_t
413 LV2Plugin::num_ports() const
414 {
415         return lilv_plugin_get_num_ports(_impl->plugin);
416 }
417
418 uint32_t
419 LV2Plugin::parameter_count() const
420 {
421         return lilv_plugin_get_num_ports(_impl->plugin);
422 }
423
424 float
425 LV2Plugin::default_value(uint32_t port)
426 {
427         return _defaults[port];
428 }
429
430 const char*
431 LV2Plugin::port_symbol(uint32_t index) const
432 {
433         const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, index);
434         if (!port) {
435                 error << name() << ": Invalid port index " << index << endmsg;
436         }
437
438         const LilvNode* sym = lilv_port_get_symbol(_impl->plugin, port);
439         return lilv_node_as_string(sym);
440 }
441
442 void
443 LV2Plugin::set_parameter(uint32_t which, float val)
444 {
445         DEBUG_TRACE(DEBUG::LV2, string_compose(
446                             "%1 set parameter %2 to %3\n", name(), which, val));
447
448         if (which < lilv_plugin_get_num_ports(_impl->plugin)) {
449                 _shadow_data[which] = val;
450         } else {
451                 warning << string_compose(
452                     _("Illegal parameter number used with plugin \"%1\". "
453                       "This is a bug in either %2 or the LV2 plugin <%3>"),
454                     name(), PROGRAM_NAME, unique_id()) << endmsg;
455         }
456
457         Plugin::set_parameter(which, val);
458 }
459
460 float
461 LV2Plugin::get_parameter(uint32_t which) const
462 {
463         if (parameter_is_input(which)) {
464                 return (float)_shadow_data[which];
465         } else {
466                 return (float)_control_data[which];
467         }
468         return 0.0f;
469 }
470
471 uint32_t
472 LV2Plugin::nth_parameter(uint32_t n, bool& ok) const
473 {
474         ok = false;
475         for (uint32_t c = 0, x = 0; x < lilv_plugin_get_num_ports(_impl->plugin); ++x) {
476                 if (parameter_is_control(x)) {
477                         if (c++ == n) {
478                                 ok = true;
479                                 return x;
480                         }
481                 }
482         }
483
484         return 0;
485 }
486
487 const void*
488 LV2Plugin::extension_data (const char* uri) const
489 {
490         return lilv_instance_get_extension_data(_impl->instance, uri);
491 }
492
493 void*
494 LV2Plugin::c_plugin ()
495 {
496         return _impl->plugin;
497 }
498
499 void*
500 LV2Plugin::c_ui ()
501 {
502         return (void*)_impl->ui;
503 }
504
505 void*
506 LV2Plugin::c_ui_type ()
507 {
508         return (void*)_impl->ui_type;
509 }
510
511 /** Directory for all plugin state. */
512 const std::string
513 LV2Plugin::plugin_dir() const
514 {
515         return Glib::build_filename(_session.plugins_dir(), _insert_id.to_s());
516 }
517
518 /** Directory for files created by the plugin (except during save). */
519 const std::string
520 LV2Plugin::scratch_dir() const
521 {
522         return Glib::build_filename(plugin_dir(), "scratch");
523 }
524
525 /** Directory for snapshots of files in the scratch directory. */
526 const std::string
527 LV2Plugin::file_dir() const
528 {
529         return Glib::build_filename(plugin_dir(), "files");
530 }
531
532 /** Directory to save state snapshot version @c num into. */
533 const std::string
534 LV2Plugin::state_dir(unsigned num) const
535 {
536         return Glib::build_filename(plugin_dir(), string_compose("state%1", num));
537 }
538
539 /** Implementation of state:makePath for files created at instantiation time.
540  * Note this is not used for files created at save time (Lilv deals with that).
541  */
542 char*
543 LV2Plugin::lv2_state_make_path(LV2_State_Make_Path_Handle handle,
544                                const char*                path)
545 {
546         LV2Plugin* me = (LV2Plugin*)handle;
547         if (me->_insert_id == PBD::ID("0")) {
548                 warning << string_compose(
549                         "File path \"%1\" requested but LV2 %2 has no insert ID",
550                         path, me->name()) << endmsg;
551                 return g_strdup(path);
552         }
553
554         const std::string abs_path = Glib::build_filename(me->scratch_dir(), path);
555         const std::string dirname  = Glib::path_get_dirname(abs_path);
556         g_mkdir_with_parents(dirname.c_str(), 0744);
557
558         DEBUG_TRACE(DEBUG::LV2, string_compose("new file path %1 => %2\n",
559                                                path, abs_path));
560
561         std::cerr << "MAKE PATH " << path
562                   << " => " << g_strndup(abs_path.c_str(), abs_path.length())
563                   << std::endl;
564         return g_strndup(abs_path.c_str(), abs_path.length());
565 }
566
567 static void
568 remove_directory(const std::string& path)
569 {
570         if (!Glib::file_test(path, Glib::FILE_TEST_IS_DIR)) {
571                 warning << string_compose("\"%1\" is not a directory", path) << endmsg;
572                 return;
573         }
574
575         Glib::RefPtr<Gio::File>           dir = Gio::File::create_for_path(path);
576         Glib::RefPtr<Gio::FileEnumerator> e   = dir->enumerate_children();
577         Glib::RefPtr<Gio::FileInfo>       fi;
578         while ((fi = e->next_file())) {
579                 if (fi->get_type() == Gio::FILE_TYPE_DIRECTORY) {
580                         remove_directory(fi->get_name());
581                 } else {
582                         dir->get_child(fi->get_name())->remove();
583                 }
584         }
585         dir->remove();
586 }
587
588 void
589 LV2Plugin::add_state(XMLNode* root) const
590 {
591         assert(_insert_id != PBD::ID("0"));
592
593         XMLNode*    child;
594         char        buf[16];
595         LocaleGuard lg(X_("POSIX"));
596
597         for (uint32_t i = 0; i < parameter_count(); ++i) {
598                 if (parameter_is_input(i) && parameter_is_control(i)) {
599                         child = new XMLNode("Port");
600                         child->add_property("symbol", port_symbol(i));
601                         snprintf(buf, sizeof(buf), "%+f", _shadow_data[i]);
602                         child->add_property("value", string(buf));
603                         root->add_child_nocopy(*child);
604                 }
605         }
606
607         if (_has_state_interface) {
608                 cout << "LV2 " << name() << " has state interface" << endl;
609 #ifdef HAVE_NEW_LILV
610                 // Provisionally increment state version and create directory
611                 const std::string new_dir = state_dir(++_state_version);
612                 g_mkdir_with_parents(new_dir.c_str(), 0744);
613
614                 cout << "NEW DIR: " << new_dir << endl;
615
616                 LilvState* state = lilv_state_new_from_instance(
617                         _impl->plugin,
618                         _impl->instance,
619                         _uri_map.urid_map(),
620                         scratch_dir().c_str(),
621                         file_dir().c_str(),
622                         _session.externals_dir().c_str(),
623                         new_dir.c_str(),
624                         NULL,
625                         (void*)this,
626                         0,
627                         NULL);
628
629                 if (!_impl->state || !lilv_state_equals(state, _impl->state)) {
630                         lilv_state_save(_world.world,
631                                         _uri_map.urid_unmap(),
632                                         state,
633                                         NULL,
634                                         new_dir.c_str(),
635                                         "state.ttl",
636                                         NULL);
637
638                         lilv_state_free(_impl->state);
639                         _impl->state = state;
640
641                         cout << "Saved LV2 state to " << state_dir(_state_version) << endl;
642                 } else {
643                         // State is identical, decrement version and nuke directory
644                         cout << "LV2 state identical, not saving" << endl;
645                         lilv_state_free(state);
646                         remove_directory(new_dir);
647                         --_state_version;
648                 }
649
650                 root->add_property("state-dir", string_compose("state%1", _state_version));
651
652 #else  /* !HAVE_NEW_LILV */
653                 warning << string_compose(
654                         _("Plugin \"%1\" has state, but Lilv is too old to save it"),
655                         unique_id()) << endmsg;
656 #endif  /* HAVE_NEW_LILV */
657         } else {
658                 cout << "LV2 " << name() << " has no state interface." << endl;
659         }
660 }
661
662 static inline const LilvNode*
663 get_value(LilvWorld* world, const LilvNode* subject, const LilvNode* predicate)
664 {
665         LilvNodes* vs = lilv_world_find_nodes(world, subject, predicate, NULL);
666         return vs ? lilv_nodes_get_first(vs) : NULL;
667 }
668
669 static void
670 find_presets_helper(LilvWorld*                                   world,
671                     LilvPlugin*                                  plugin,
672                     std::map<std::string, Plugin::PresetRecord>& out,
673                     LilvNode*                                    preset_pred,
674                     LilvNode*                                    title_pred)
675 {
676         LilvNodes* presets = lilv_plugin_get_value(plugin, preset_pred);
677         LILV_FOREACH(nodes, i, presets) {
678                 const LilvNode* preset = lilv_nodes_get(presets, i);
679                 const LilvNode* name   = get_value(world, preset, title_pred);
680                 if (name) {
681                         out.insert(std::make_pair(lilv_node_as_string(preset),
682                                                   Plugin::PresetRecord(
683                                                           lilv_node_as_string(preset),
684                                                           lilv_node_as_string(name))));
685                 } else {
686                         warning << string_compose(
687                             _("Plugin \"%1\% preset \"%2%\" is missing a label\n"),
688                             lilv_node_as_string(lilv_plugin_get_uri(plugin)),
689                             lilv_node_as_string(preset)) << endmsg;
690                 }
691         }
692         lilv_nodes_free(presets);
693 }
694
695 void
696 LV2Plugin::find_presets()
697 {
698         LilvNode* dc_title          = lilv_new_uri(_world.world, NS_DC   "title");
699         LilvNode* oldpset_hasPreset = lilv_new_uri(_world.world, NS_OLDPSET "hasPreset");
700         LilvNode* pset_hasPreset    = lilv_new_uri(_world.world, NS_PSET "hasPreset");
701         LilvNode* rdfs_label        = lilv_new_uri(_world.world, LILV_NS_RDFS "label");
702
703         find_presets_helper(_world.world, _impl->plugin, _presets,
704                             oldpset_hasPreset, dc_title);
705
706         find_presets_helper(_world.world, _impl->plugin, _presets,
707                             pset_hasPreset, rdfs_label);
708
709         lilv_node_free(rdfs_label);
710         lilv_node_free(pset_hasPreset);
711         lilv_node_free(oldpset_hasPreset);
712         lilv_node_free(dc_title);
713 }
714
715 bool
716 LV2Plugin::load_preset(PresetRecord r)
717 {
718         Plugin::load_preset(r);
719
720         LilvNode* lv2_port      = lilv_new_uri(_world.world, LILV_NS_LV2 "port");
721         LilvNode* lv2_symbol    = lilv_new_uri(_world.world, LILV_NS_LV2 "symbol");
722         LilvNode* oldpset_value = lilv_new_uri(_world.world, NS_OLDPSET "value");
723         LilvNode* preset        = lilv_new_uri(_world.world, r.uri.c_str());
724         LilvNode* pset_value    = lilv_new_uri(_world.world, NS_PSET "value");
725
726         LilvNodes* ports = lilv_world_find_nodes(_world.world, preset, lv2_port, NULL);
727         LILV_FOREACH(nodes, i, ports) {
728                 const LilvNode* port   = lilv_nodes_get(ports, i);
729                 const LilvNode* symbol = get_value(_world.world, port, lv2_symbol);
730                 const LilvNode* value  = get_value(_world.world, port, pset_value);
731                 if (!value) {
732                         value = get_value(_world.world, port, oldpset_value);
733                 }
734                 if (value && lilv_node_is_float(value)) {
735                         set_parameter(_port_indices[lilv_node_as_string(symbol)],
736                                       lilv_node_as_float(value));
737                 }
738         }
739         lilv_nodes_free(ports);
740
741         lilv_node_free(pset_value);
742         lilv_node_free(preset);
743         lilv_node_free(oldpset_value);
744         lilv_node_free(lv2_symbol);
745         lilv_node_free(lv2_port);
746
747         return true;
748 }
749
750 std::string
751 LV2Plugin::do_save_preset(string /*name*/)
752 {
753         return "";
754 }
755
756 void
757 LV2Plugin::do_remove_preset(string /*name*/)
758 {}
759
760 bool
761 LV2Plugin::has_editor() const
762 {
763         return _impl->ui != NULL;
764 }
765
766 uint32_t
767 LV2Plugin::atom_eventTransfer() const
768 {
769         return _event_transfer_type;
770 }
771
772 void
773 LV2Plugin::write_to(RingBuffer<uint8_t>* dest,
774                     uint32_t             index,
775                     uint32_t             protocol,
776                     uint32_t             size,
777                     uint8_t*             body)
778 {
779         const uint32_t buf_size = sizeof(UIMessage) + size;
780         uint8_t        buf[buf_size];
781
782         UIMessage* msg = (UIMessage*)buf;
783         msg->index    = index;
784         msg->protocol = protocol;
785         msg->size     = size;
786         memcpy(msg + 1, body, size);
787
788         if (dest->write(buf, buf_size) != buf_size) {
789                 error << "Error writing to UI=>Plugin RingBuffer" << endmsg;
790         }
791 }
792
793 void
794 LV2Plugin::write_from_ui(uint32_t index,
795                          uint32_t protocol,
796                          uint32_t size,
797                          uint8_t* body)
798 {
799         if (!_from_ui) {
800                 _from_ui = new RingBuffer<uint8_t>(4096);
801         }
802
803         write_to(_from_ui, index, protocol, size, body);
804 }
805
806 void
807 LV2Plugin::write_to_ui(uint32_t index,
808                        uint32_t protocol,
809                        uint32_t size,
810                        uint8_t* body)
811 {
812         if (!_to_ui) {
813                 _to_ui = new RingBuffer<uint8_t>(4096);
814         }
815
816         write_to(_to_ui, index, protocol, size, body);
817 }
818
819 void
820 LV2Plugin::emit_to_ui(void* controller, UIMessageSink sink)
821 {
822         if (!_to_ui) {
823                 return;
824         }
825
826         uint32_t read_space = _to_ui->read_space();
827         while (read_space > sizeof(UIMessage)) {
828                 UIMessage msg;
829                 if (_to_ui->read((uint8_t*)&msg, sizeof(msg)) != sizeof(msg)) {
830                         error << "Error reading from Plugin=>UI RingBuffer" << endmsg;
831                         break;
832                 }
833                 uint8_t body[msg.size];
834                 if (_to_ui->read(body, msg.size) != msg.size) {
835                         error << "Error reading from Plugin=>UI RingBuffer" << endmsg;
836                         break;
837                 }
838
839                 sink(controller, msg.index, msg.size, msg.protocol, body);
840
841                 read_space -= sizeof(msg) + msg.size;
842         }
843 }
844
845 void
846 LV2Plugin::set_insert_info(const PluginInsert* insert)
847 {
848         _insert_id = insert->id();
849 }
850
851 int
852 LV2Plugin::set_state(const XMLNode& node, int version)
853 {
854         XMLNodeList          nodes;
855         const XMLProperty*   prop;
856         XMLNodeConstIterator iter;
857         XMLNode*             child;
858         const char*          sym;
859         const char*          value;
860         uint32_t             port_id;
861         LocaleGuard          lg(X_("POSIX"));
862
863         if (node.name() != state_node_name()) {
864                 error << _("Bad node sent to LV2Plugin::set_state") << endmsg;
865                 return -1;
866         }
867
868         if (version < 3000) {
869                 nodes = node.children("port");
870         } else {
871                 nodes = node.children("Port");
872         }
873
874         for (iter = nodes.begin(); iter != nodes.end(); ++iter) {
875
876                 child = *iter;
877
878                 if ((prop = child->property("symbol")) != 0) {
879                         sym = prop->value().c_str();
880                 } else {
881                         warning << _("LV2: port has no symbol, ignored") << endmsg;
882                         continue;
883                 }
884
885                 map<string, uint32_t>::iterator i = _port_indices.find(sym);
886
887                 if (i != _port_indices.end()) {
888                         port_id = i->second;
889                 } else {
890                         warning << _("LV2: port has unknown index, ignored") << endmsg;
891                         continue;
892                 }
893
894                 if ((prop = child->property("value")) != 0) {
895                         value = prop->value().c_str();
896                 } else {
897                         warning << _("LV2: port has no value, ignored") << endmsg;
898                         continue;
899                 }
900
901                 set_parameter(port_id, atof(value));
902         }
903
904 #ifdef HAVE_NEW_LILV
905         _state_version = 0;
906         if ((prop = node.property("state-dir")) != 0) {
907                 if (sscanf(prop->value().c_str(), "state%u", &_state_version) != 1) {
908                         error << string_compose(
909                                 "LV2: failed to parse state version from \"%1\"",
910                                 prop->value()) << endmsg;
911                 }
912
913                 std::string state_file = Glib::build_filename(
914                         plugin_dir(),
915                         Glib::build_filename(prop->value(), "state.ttl"));
916
917                 cout << "Loading LV2 state from " << state_file << endl;
918                 LilvState* state = lilv_state_new_from_file(
919                         _world.world, _uri_map.urid_map(), NULL, state_file.c_str());
920
921                 lilv_state_restore(state, _impl->instance, NULL, NULL, 0, NULL);
922         }
923 #endif
924
925         latency_compute_run();
926
927         return Plugin::set_state(node, version);
928 }
929
930 int
931 LV2Plugin::get_parameter_descriptor(uint32_t which, ParameterDescriptor& desc) const
932 {
933         const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, which);
934
935         LilvNode *def, *min, *max;
936         lilv_port_get_range(_impl->plugin, port, &def, &min, &max);
937
938         desc.integer_step = lilv_port_has_property(_impl->plugin, port, _world.lv2_integer);
939         desc.toggled      = lilv_port_has_property(_impl->plugin, port, _world.lv2_toggled);
940         desc.logarithmic  = lilv_port_has_property(_impl->plugin, port, _world.ext_logarithmic);
941         desc.sr_dependent = lilv_port_has_property(_impl->plugin, port, _world.lv2_sampleRate);
942         desc.label        = lilv_node_as_string(lilv_port_get_name(_impl->plugin, port));
943         desc.lower        = min ? lilv_node_as_float(min) : 0.0f;
944         desc.upper        = max ? lilv_node_as_float(max) : 1.0f;
945         if (desc.sr_dependent) {
946                 desc.lower *= _session.frame_rate ();
947                 desc.upper *= _session.frame_rate ();
948         }
949
950         desc.min_unbound  = false; // TODO: LV2 extension required
951         desc.max_unbound  = false; // TODO: LV2 extension required
952
953         if (desc.integer_step) {
954                 desc.step      = 1.0;
955                 desc.smallstep = 0.1;
956                 desc.largestep = 10.0;
957         } else {
958                 const float delta = desc.upper - desc.lower;
959                 desc.step      = delta / 1000.0f;
960                 desc.smallstep = delta / 10000.0f;
961                 desc.largestep = delta / 10.0f;
962         }
963
964         lilv_node_free(def);
965         lilv_node_free(min);
966         lilv_node_free(max);
967
968         return 0;
969 }
970
971 string
972 LV2Plugin::describe_parameter(Evoral::Parameter which)
973 {
974         if (( which.type() == PluginAutomation) && ( which.id() < parameter_count()) ) {
975                 LilvNode* name = lilv_port_get_name(_impl->plugin,
976                                                     lilv_plugin_get_port_by_index(_impl->plugin, which.id()));
977                 string ret(lilv_node_as_string(name));
978                 lilv_node_free(name);
979                 return ret;
980         } else {
981                 return "??";
982         }
983 }
984
985 framecnt_t
986 LV2Plugin::signal_latency() const
987 {
988         if (_latency_control_port) {
989                 return (framecnt_t)floor(*_latency_control_port);
990         } else {
991                 return 0;
992         }
993 }
994
995 set<Evoral::Parameter>
996 LV2Plugin::automatable() const
997 {
998         set<Evoral::Parameter> ret;
999
1000         for (uint32_t i = 0; i < parameter_count(); ++i) {
1001                 if (parameter_is_input(i) && parameter_is_control(i)) {
1002                         ret.insert(ret.end(), Evoral::Parameter(PluginAutomation, 0, i));
1003                 }
1004         }
1005
1006         return ret;
1007 }
1008
1009 void
1010 LV2Plugin::activate()
1011 {
1012         DEBUG_TRACE(DEBUG::LV2, string_compose("%1 activate\n", name()));
1013
1014         if (!_was_activated) {
1015                 lilv_instance_activate(_impl->instance);
1016                 _was_activated = true;
1017         }
1018 }
1019
1020 void
1021 LV2Plugin::deactivate()
1022 {
1023         DEBUG_TRACE(DEBUG::LV2, string_compose("%1 deactivate\n", name()));
1024
1025         if (_was_activated) {
1026                 lilv_instance_deactivate(_impl->instance);
1027                 _was_activated = false;
1028         }
1029 }
1030
1031 void
1032 LV2Plugin::cleanup()
1033 {
1034         DEBUG_TRACE(DEBUG::LV2, string_compose("%1 cleanup\n", name()));
1035
1036         activate();
1037         deactivate();
1038         lilv_instance_free(_impl->instance);
1039         _impl->instance = NULL;
1040 }
1041
1042 int
1043 LV2Plugin::connect_and_run(BufferSet& bufs,
1044         ChanMapping in_map, ChanMapping out_map,
1045         pframes_t nframes, framecnt_t offset)
1046 {
1047         DEBUG_TRACE(DEBUG::LV2, string_compose("%1 run %2 offset %3\n", name(), nframes, offset));
1048         Plugin::connect_and_run(bufs, in_map, out_map, nframes, offset);
1049
1050         cycles_t then = get_cycles();
1051
1052         ChanCount bufs_count;
1053         bufs_count.set(DataType::AUDIO, 1);
1054         bufs_count.set(DataType::MIDI, 1);
1055         BufferSet& silent_bufs  = _session.get_silent_buffers(bufs_count);
1056         BufferSet& scratch_bufs = _session.get_silent_buffers(bufs_count);
1057         uint32_t const num_ports = parameter_count();
1058
1059         uint32_t audio_in_index  = 0;
1060         uint32_t audio_out_index = 0;
1061         uint32_t midi_in_index   = 0;
1062         uint32_t midi_out_index  = 0;
1063         bool valid;
1064         for (uint32_t port_index = 0; port_index < num_ports; ++port_index) {
1065                 void*     buf   = NULL;
1066                 uint32_t  index = 0;
1067                 PortFlags flags = _port_flags[port_index];
1068                 if (flags & PORT_AUDIO) {
1069                         if (flags & PORT_INPUT) {
1070                                 index = in_map.get(DataType::AUDIO, audio_in_index++, &valid);
1071                                 buf = (valid)
1072                                         ? bufs.get_audio(index).data(offset)
1073                                         : silent_bufs.get_audio(0).data(offset);
1074                         } else {
1075                                 index = out_map.get(DataType::AUDIO, audio_out_index++, &valid);
1076                                 buf = (valid)
1077                                         ? bufs.get_audio(index).data(offset)
1078                                         : scratch_bufs.get_audio(0).data(offset);
1079                         }
1080                 } else if (flags & (PORT_EVENT|PORT_MESSAGE)) {
1081                         /* FIXME: The checks here for bufs.count().n_midi() > index shouldn't
1082                            be necessary, but the mapping is illegal in some cases.  Ideally
1083                            that should be fixed, but this is easier...
1084                         */
1085                         const uint32_t atom_type = (flags & PORT_MESSAGE) ? _sequence_type : 0;
1086                         if (flags & PORT_INPUT) {
1087                                 index = in_map.get(DataType::MIDI, midi_in_index++, &valid);
1088                                 _ev_buffers[port_index] = (valid && bufs.count().n_midi() > index)
1089                                         ? bufs.get_lv2_midi(true, index, atom_type)
1090                                         : silent_bufs.get_lv2_midi(true, 0, atom_type);
1091                                 buf = lv2_evbuf_get_buffer(_ev_buffers[port_index]);
1092                         } else {
1093                                 index = out_map.get(DataType::MIDI, midi_out_index++, &valid);
1094                                 _ev_buffers[port_index] = (valid && bufs.count().n_midi() > index)
1095                                         ? bufs.get_lv2_midi(false, index, atom_type)
1096                                         : scratch_bufs.get_lv2_midi(false, 0, atom_type);
1097                                 buf = lv2_evbuf_get_buffer(_ev_buffers[port_index]);
1098                         }
1099                 } else {
1100                         continue;  // Control port, leave buffer alone
1101                 }
1102                 lilv_instance_connect_port(_impl->instance, port_index, buf);
1103         }
1104
1105         // Read messages from UI and push into appropriate buffers
1106         if (_from_ui) {
1107                 uint32_t read_space = _from_ui->read_space();
1108                 while (read_space > sizeof(UIMessage)) {
1109                         UIMessage msg;
1110                         if (_from_ui->read((uint8_t*)&msg, sizeof(msg)) != sizeof(msg)) {
1111                                 error << "Error reading from UI=>Plugin RingBuffer" << endmsg;
1112                                 break;
1113                         }
1114                         uint8_t body[msg.size];
1115                         if (_from_ui->read(body, msg.size) != msg.size) {
1116                                 error << "Error reading from UI=>Plugin RingBuffer" << endmsg;
1117                                 break;
1118                         }
1119                         if (msg.protocol == _event_transfer_type) {
1120                                 LV2_Evbuf*            buf = _ev_buffers[msg.index];
1121                                 LV2_Evbuf_Iterator    i    = lv2_evbuf_end(buf);
1122                                 const LV2_Atom* const atom = (const LV2_Atom*)body;
1123                                 lv2_evbuf_write(&i, nframes, 0, atom->type, atom->size,
1124                                                 (const uint8_t*)LV2_ATOM_BODY(atom));
1125                         } else {
1126                                 error << "Received unknown message type from UI" << endmsg;
1127                         }
1128                         read_space -= sizeof(UIMessage) + msg.size;
1129                 }
1130         }
1131
1132         run(nframes);
1133
1134         midi_out_index = 0;
1135         for (uint32_t port_index = 0; port_index < num_ports; ++port_index) {
1136                 PortFlags flags = _port_flags[port_index];
1137
1138                 // Flush MIDI (write back to Ardour MIDI buffers)
1139                 if ((flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_MESSAGE))) {
1140                         const uint32_t buf_index = out_map.get(
1141                                 DataType::MIDI, midi_out_index++, &valid);
1142                         if (valid) {
1143                                 bufs.flush_lv2_midi(true, buf_index);
1144                         }
1145                 }
1146
1147                 // Write messages to UI
1148                 if ((flags & PORT_OUTPUT) && (flags & PORT_MESSAGE)) {
1149                         LV2_Evbuf* buf = _ev_buffers[port_index];
1150                         for (LV2_Evbuf_Iterator i = lv2_evbuf_begin(buf);
1151                              lv2_evbuf_is_valid(i);
1152                              i = lv2_evbuf_next(i)) {
1153                                 uint32_t frames, subframes, type, size;
1154                                 uint8_t* data;
1155                                 lv2_evbuf_get(i, &frames, &subframes, &type, &size, &data);
1156                                 write_to_ui(port_index, _event_transfer_type,
1157                                             size + sizeof(LV2_Atom),
1158                                             data - sizeof(LV2_Atom));
1159                         }
1160                 }
1161         }
1162
1163         cycles_t now = get_cycles();
1164         set_cycles((uint32_t)(now - then));
1165
1166         return 0;
1167 }
1168
1169 bool
1170 LV2Plugin::parameter_is_control(uint32_t param) const
1171 {
1172         assert(param < _port_flags.size());
1173         return _port_flags[param] & PORT_CONTROL;
1174 }
1175
1176 bool
1177 LV2Plugin::parameter_is_audio(uint32_t param) const
1178 {
1179         assert(param < _port_flags.size());
1180         return _port_flags[param] & PORT_AUDIO;
1181 }
1182
1183 bool
1184 LV2Plugin::parameter_is_event(uint32_t param) const
1185 {
1186         assert(param < _port_flags.size());
1187         return _port_flags[param] & PORT_EVENT;
1188 }
1189
1190 bool
1191 LV2Plugin::parameter_is_output(uint32_t param) const
1192 {
1193         assert(param < _port_flags.size());
1194         return _port_flags[param] & PORT_OUTPUT;
1195 }
1196
1197 bool
1198 LV2Plugin::parameter_is_input(uint32_t param) const
1199 {
1200         assert(param < _port_flags.size());
1201         return _port_flags[param] & PORT_INPUT;
1202 }
1203
1204 void
1205 LV2Plugin::print_parameter(uint32_t param, char* buf, uint32_t len) const
1206 {
1207         if (buf && len) {
1208                 if (param < parameter_count()) {
1209                         snprintf(buf, len, "%.3f", get_parameter(param));
1210                 } else {
1211                         strcat(buf, "0");
1212                 }
1213         }
1214 }
1215
1216 boost::shared_ptr<Plugin::ScalePoints>
1217 LV2Plugin::get_scale_points(uint32_t port_index) const
1218 {
1219         const LilvPort*  port   = lilv_plugin_get_port_by_index(_impl->plugin, port_index);
1220         LilvScalePoints* points = lilv_port_get_scale_points(_impl->plugin, port);
1221
1222         boost::shared_ptr<Plugin::ScalePoints> ret;
1223         if (!points) {
1224                 return ret;
1225         }
1226
1227         ret = boost::shared_ptr<Plugin::ScalePoints>(new ScalePoints());
1228
1229         LILV_FOREACH(scale_points, i, points) {
1230                 const LilvScalePoint* p     = lilv_scale_points_get(points, i);
1231                 const LilvNode*       label = lilv_scale_point_get_label(p);
1232                 const LilvNode*       value = lilv_scale_point_get_value(p);
1233                 if (label && (lilv_node_is_float(value) || lilv_node_is_int(value))) {
1234                         ret->insert(make_pair(lilv_node_as_string(label),
1235                                               lilv_node_as_float(value)));
1236                 }
1237         }
1238
1239         lilv_scale_points_free(points);
1240         return ret;
1241 }
1242
1243 void
1244 LV2Plugin::run(pframes_t nframes)
1245 {
1246         uint32_t const N = parameter_count();
1247         for (uint32_t i = 0; i < N; ++i) {
1248                 if (parameter_is_control(i) && parameter_is_input(i)) {
1249                         _control_data[i] = _shadow_data[i];
1250                 }
1251         }
1252
1253         lilv_instance_run(_impl->instance, nframes);
1254 }
1255
1256 void
1257 LV2Plugin::latency_compute_run()
1258 {
1259         if (!_latency_control_port) {
1260                 return;
1261         }
1262
1263         // Run the plugin so that it can set its latency parameter
1264
1265         activate();
1266
1267         uint32_t port_index = 0;
1268         uint32_t in_index   = 0;
1269         uint32_t out_index  = 0;
1270
1271         const framecnt_t bufsize = 1024;
1272         float            buffer[bufsize];
1273
1274         memset(buffer, 0, sizeof(float) * bufsize);
1275
1276         // FIXME: Ensure plugins can handle in-place processing
1277
1278         port_index = 0;
1279
1280         while (port_index < parameter_count()) {
1281                 if (parameter_is_audio(port_index)) {
1282                         if (parameter_is_input(port_index)) {
1283                                 lilv_instance_connect_port(_impl->instance, port_index, buffer);
1284                                 in_index++;
1285                         } else if (parameter_is_output(port_index)) {
1286                                 lilv_instance_connect_port(_impl->instance, port_index, buffer);
1287                                 out_index++;
1288                         }
1289                 }
1290                 port_index++;
1291         }
1292
1293         run(bufsize);
1294         deactivate();
1295 }
1296
1297 LV2World::LV2World()
1298         : world(lilv_world_new())
1299 {
1300         lilv_world_load_all(world);
1301         atom_MessagePort   = lilv_new_uri(world, LV2_ATOM__MessagePort);
1302         atom_Sequence      = lilv_new_uri(world, LV2_ATOM__Sequence);
1303         atom_bufferType    = lilv_new_uri(world, LV2_ATOM__bufferType);
1304         atom_eventTransfer = lilv_new_uri(world, LV2_ATOM__eventTransfer);
1305         ev_EventPort       = lilv_new_uri(world, LILV_URI_EVENT_PORT);
1306         ext_logarithmic    = lilv_new_uri(world, "http://lv2plug.in/ns/dev/extportinfo#logarithmic");
1307         lv2_AudioPort      = lilv_new_uri(world, LILV_URI_AUDIO_PORT);
1308         lv2_ControlPort    = lilv_new_uri(world, LILV_URI_CONTROL_PORT);
1309         lv2_InputPort      = lilv_new_uri(world, LILV_URI_INPUT_PORT);
1310         lv2_OutputPort     = lilv_new_uri(world, LILV_URI_OUTPUT_PORT);
1311         lv2_inPlaceBroken  = lilv_new_uri(world, LILV_NS_LV2 "inPlaceBroken");
1312         lv2_integer        = lilv_new_uri(world, LILV_NS_LV2 "integer");
1313         lv2_sampleRate     = lilv_new_uri(world, LILV_NS_LV2 "sampleRate");
1314         lv2_toggled        = lilv_new_uri(world, LILV_NS_LV2 "toggled");
1315         midi_MidiEvent     = lilv_new_uri(world, LILV_URI_MIDI_EVENT);
1316         ui_GtkUI           = lilv_new_uri(world, NS_UI "GtkUI");
1317         ui_external        = lilv_new_uri(world, NS_UI "external");
1318 }
1319
1320 LV2World::~LV2World()
1321 {
1322         lilv_node_free(ui_external);
1323         lilv_node_free(ui_GtkUI);
1324         lilv_node_free(midi_MidiEvent);
1325         lilv_node_free(lv2_toggled);
1326         lilv_node_free(lv2_sampleRate);
1327         lilv_node_free(lv2_integer);
1328         lilv_node_free(lv2_inPlaceBroken);
1329         lilv_node_free(lv2_OutputPort);
1330         lilv_node_free(lv2_InputPort);
1331         lilv_node_free(lv2_ControlPort);
1332         lilv_node_free(lv2_AudioPort);
1333         lilv_node_free(ext_logarithmic);
1334         lilv_node_free(ev_EventPort);
1335         lilv_node_free(atom_eventTransfer);
1336         lilv_node_free(atom_bufferType);
1337         lilv_node_free(atom_Sequence);
1338         lilv_node_free(atom_MessagePort);
1339 }
1340
1341 LV2PluginInfo::LV2PluginInfo (void* c_plugin)
1342         : _c_plugin(c_plugin)
1343 {
1344         type = ARDOUR::LV2;
1345 }
1346
1347 LV2PluginInfo::~LV2PluginInfo()
1348 {}
1349
1350 PluginPtr
1351 LV2PluginInfo::load(Session& session)
1352 {
1353         try {
1354                 PluginPtr plugin;
1355
1356                 plugin.reset(new LV2Plugin(session.engine(), session,
1357                                            (LilvPlugin*)_c_plugin,
1358                                            session.frame_rate()));
1359
1360                 plugin->set_info(PluginInfoPtr(new LV2PluginInfo(*this)));
1361                 return plugin;
1362         } catch (failed_constructor& err) {
1363                 return PluginPtr((Plugin*)0);
1364         }
1365
1366         return PluginPtr();
1367 }
1368
1369 PluginInfoList*
1370 LV2PluginInfo::discover()
1371 {
1372         PluginInfoList*    plugs   = new PluginInfoList;
1373         const LilvPlugins* plugins = lilv_world_get_all_plugins(_world.world);
1374
1375         cerr << "LV2: Discovering " << lilv_plugins_size(plugins) << " plugins" << endl;
1376
1377         LILV_FOREACH(plugins, i, plugins) {
1378                 const LilvPlugin* p = lilv_plugins_get(plugins, i);
1379                 LV2PluginInfoPtr  info(new LV2PluginInfo((void*)p));
1380
1381                 LilvNode* name = lilv_plugin_get_name(p);
1382                 if (!name) {
1383                         cerr << "LV2: invalid plugin\n";
1384                         continue;
1385                 }
1386
1387                 info->type = LV2;
1388
1389                 info->name = string(lilv_node_as_string(name));
1390                 lilv_node_free(name);
1391
1392                 const LilvPluginClass* pclass = lilv_plugin_get_class(p);
1393                 const LilvNode*        label  = lilv_plugin_class_get_label(pclass);
1394                 info->category = lilv_node_as_string(label);
1395
1396                 LilvNode* author_name = lilv_plugin_get_author_name(p);
1397                 info->creator = author_name ? string(lilv_node_as_string(author_name)) : "Unknown";
1398                 lilv_node_free(author_name);
1399
1400                 info->path = "/NOPATH"; // Meaningless for LV2
1401
1402                 info->n_inputs.set_audio(
1403                         lilv_plugin_get_num_ports_of_class(
1404                                 p, _world.lv2_InputPort, _world.lv2_AudioPort, NULL));
1405                 info->n_inputs.set_midi(
1406                         lilv_plugin_get_num_ports_of_class(
1407                                 p, _world.lv2_InputPort, _world.ev_EventPort, NULL)
1408                         + lilv_plugin_get_num_ports_of_class(
1409                                 p, _world.lv2_InputPort, _world.atom_MessagePort, NULL));
1410
1411                 info->n_outputs.set_audio(
1412                         lilv_plugin_get_num_ports_of_class(
1413                                 p, _world.lv2_OutputPort, _world.lv2_AudioPort, NULL));
1414                 info->n_outputs.set_midi(
1415                         lilv_plugin_get_num_ports_of_class(
1416                                 p, _world.lv2_OutputPort, _world.ev_EventPort, NULL)
1417                         + lilv_plugin_get_num_ports_of_class(
1418                                 p, _world.lv2_OutputPort, _world.atom_MessagePort, NULL));
1419
1420                 info->unique_id = lilv_node_as_uri(lilv_plugin_get_uri(p));
1421                 info->index     = 0; // Meaningless for LV2
1422
1423                 plugs->push_back(info);
1424         }
1425
1426         cerr << "Done LV2 discovery" << endl;
1427
1428         return plugs;
1429 }