take reverse width into account when labelling signals in panner2d ; better way to...
[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
21 #include <string>
22 #include <vector>
23
24 #include <cmath>
25 #include <cstdlib>
26 #include <cstring>
27
28 #include <glibmm.h>
29
30 #include "pbd/compose.h"
31 #include "pbd/error.h"
32 #include "pbd/pathscanner.h"
33 #include "pbd/xml++.h"
34
35 #include "ardour/ardour.h"
36 #include "ardour/audio_buffer.h"
37 #include "ardour/audioengine.h"
38 #include "ardour/lv2_event_buffer.h"
39 #include "ardour/lv2_plugin.h"
40 #include "ardour/session.h"
41
42 #include "pbd/stl_delete.h"
43
44 #include "i18n.h"
45 #include <locale.h>
46
47 #include "lv2ext/lv2_persist.h"
48 #include "lv2_pfile.h"
49
50 #define NS_DC   "http://dublincore.org/documents/dcmi-namespace/"
51 #define NS_LV2  "http://lv2plug.in/ns/lv2core#"
52 #define NS_PSET "http://lv2plug.in/ns/dev/presets#"
53 #define NS_UI   "http://lv2plug.in/ns/extensions/ui#"
54
55 using namespace std;
56 using namespace ARDOUR;
57 using namespace PBD;
58
59 URIMap   LV2Plugin::_uri_map;
60 uint32_t LV2Plugin::_midi_event_type = _uri_map.uri_to_id (
61                 "http://lv2plug.in/ns/ext/event",
62                 "http://lv2plug.in/ns/ext/midi#MidiEvent");
63
64 LV2Plugin::LV2Plugin (AudioEngine& engine,
65                       Session&     session,
66                       LV2World&    world,
67                       SLV2Plugin   plugin,
68                       framecnt_t   rate)
69         : Plugin (engine, session)
70         , _world (world)
71         , _features (NULL)
72 {
73         init (world, plugin, rate);
74 }
75
76 LV2Plugin::LV2Plugin (const LV2Plugin &other)
77         : Plugin (other)
78         , _world(other._world)
79         , _features(NULL)
80 {
81         init (other._world, other._plugin, other._sample_rate);
82
83         for (uint32_t i = 0; i < parameter_count(); ++i) {
84                 _control_data[i] = other._shadow_data[i];
85                 _shadow_data[i] = other._shadow_data[i];
86         }
87 }
88
89 void
90 LV2Plugin::init (LV2World& world, SLV2Plugin plugin, framecnt_t rate)
91 {
92         _world                = world;
93         _plugin               = plugin;
94         _ui                   = NULL;
95         _control_data         = 0;
96         _shadow_data          = 0;
97         _latency_control_port = 0;
98         _was_activated        = false;
99
100         _instance_access_feature.URI = "http://lv2plug.in/ns/ext/instance-access";
101         _data_access_feature.URI     = "http://lv2plug.in/ns/ext/data-access";
102         _persist_feature.URI         = "http://lv2plug.in/ns/ext/persist";
103         _persist_feature.data        = NULL;
104
105         SLV2Value persist_uri = slv2_value_new_uri(_world.world, _persist_feature.URI);
106         _supports_persist = slv2_plugin_has_feature(plugin, persist_uri);
107         slv2_value_free(persist_uri);
108
109         _features    = (LV2_Feature**)malloc(sizeof(LV2_Feature*) * 5);
110         _features[0] = &_instance_access_feature;
111         _features[1] = &_data_access_feature;
112         _features[2] = &_persist_feature;
113         _features[3] = _uri_map.feature();
114         _features[4] = NULL;
115
116         _instance = slv2_plugin_instantiate(plugin, rate, _features);
117         _name     = slv2_plugin_get_name(plugin);
118         _author   = slv2_plugin_get_author_name(plugin);
119
120         if (_instance == 0) {
121                 error << _("LV2: Failed to instantiate plugin ")
122                       << slv2_value_as_string (slv2_plugin_get_uri(plugin)) << endmsg;
123                 throw failed_constructor();
124         }
125
126         _instance_access_feature.data              = (void*)_instance->lv2_handle;
127         _data_access_extension_data.extension_data = _instance->lv2_descriptor->extension_data;
128         _data_access_feature.data                  = &_data_access_extension_data;
129
130         if (slv2_plugin_has_feature(plugin, world.in_place_broken)) {
131                 error << string_compose(
132                                 _("LV2: \"%1\" cannot be used, since it cannot do inplace processing"),
133                                 slv2_value_as_string(_name)) << endmsg;
134                 slv2_value_free(_name);
135                 slv2_value_free(_author);
136                 throw failed_constructor();
137         }
138
139         _sample_rate = rate;
140
141         const uint32_t num_ports    = slv2_plugin_get_num_ports(plugin);
142         const bool     latent       = slv2_plugin_has_latency(plugin);
143         const uint32_t latency_port = (latent)
144                 ? slv2_plugin_get_latency_port_index(plugin)
145                 : 0;
146
147         _control_data = new float[num_ports];
148         _shadow_data  = new float[num_ports];
149         _defaults     = new float[num_ports];
150
151         for (uint32_t i = 0; i < num_ports; ++i) {
152                 SLV2Port  port = slv2_plugin_get_port_by_index(plugin, i);
153                 SLV2Value sym  = slv2_port_get_symbol(_plugin, port);
154                 _port_indices.insert(std::make_pair(slv2_value_as_string(sym), i));
155                 if (parameter_is_control(i)) {
156                         SLV2Value def;
157                         slv2_port_get_range(plugin, port, &def, NULL, NULL);
158                         _defaults[i] = def ? slv2_value_as_float(def) : 0.0f;
159                         slv2_value_free(def);
160
161                         slv2_instance_connect_port (_instance, i, &_control_data[i]);
162
163                         if (latent && i == latency_port) {
164                                 _latency_control_port = &_control_data[i];
165                                 *_latency_control_port = 0;
166                         }
167
168                         if (parameter_is_input(i)) {
169                                 _shadow_data[i] = default_value (i);
170                         }
171                 } else {
172                         _defaults[i] = 0.0f;
173                 }
174         }
175
176         SLV2UIs uis = slv2_plugin_get_uis(_plugin);
177         if (slv2_uis_size(uis) > 0) {
178                 for (unsigned i=0; i < slv2_uis_size(uis); ++i) {
179                         SLV2UI ui = slv2_uis_get_at(uis, i);
180                         if (slv2_ui_is_a(ui, _world.gtk_gui)) {
181                                 _ui = ui;
182                                 break;
183                         }
184                 }
185
186                 // if gtk gui is not available, try to find external gui
187                 if (!_ui) {
188                         for (unsigned i=0; i < slv2_uis_size(uis); ++i) {
189                                 SLV2UI ui = slv2_uis_get_at(uis, i);
190                                 if (slv2_ui_is_a(ui, _world.external_gui)) {
191                                         _ui = ui;
192                                         break;
193                                 }
194                         }
195                 }
196         }
197
198         latency_compute_run ();
199 }
200
201 LV2Plugin::~LV2Plugin ()
202 {
203         deactivate ();
204         cleanup ();
205
206         slv2_instance_free(_instance);
207         slv2_value_free(_name);
208         slv2_value_free(_author);
209
210         delete [] _control_data;
211         delete [] _shadow_data;
212 }
213
214 bool
215 LV2Plugin::is_external_ui() const
216 {
217         return slv2_ui_is_a(_ui, _world.external_gui);
218 }
219
220 string
221 LV2Plugin::unique_id() const
222 {
223         return slv2_value_as_uri(slv2_plugin_get_uri(_plugin));
224 }
225
226
227 float
228 LV2Plugin::default_value (uint32_t port)
229 {
230         return _defaults[port];
231 }
232
233 const char*
234 LV2Plugin::port_symbol (uint32_t index) const
235 {
236         SLV2Port port = slv2_plugin_get_port_by_index(_plugin, index);
237         if (!port) {
238                 error << name() << ": Invalid port index " << index << endmsg;
239         }
240
241         SLV2Value sym = slv2_port_get_symbol(_plugin, port);
242         return slv2_value_as_string(sym);
243 }
244
245
246 void
247 LV2Plugin::set_parameter (uint32_t which, float val)
248 {
249         if (which < slv2_plugin_get_num_ports(_plugin)) {
250                 _shadow_data[which] = val;
251         } else {
252                 warning << string_compose (
253                         _("Illegal parameter number used with plugin \"%1\". "
254                           "This is a bug in either %2 or the LV2 plugin (%3)"),
255                         name(), PROGRAM_NAME, unique_id()) << endmsg;
256         }
257         
258         Plugin::set_parameter (which, val);
259 }
260
261 float
262 LV2Plugin::get_parameter (uint32_t which) const
263 {
264         if (parameter_is_input(which)) {
265                 return (float) _shadow_data[which];
266         } else {
267                 return (float) _control_data[which];
268         }
269         return 0.0f;
270 }
271
272 uint32_t
273 LV2Plugin::nth_parameter (uint32_t n, bool& ok) const
274 {
275         ok = false;
276         for (uint32_t c = 0, x = 0; x < slv2_plugin_get_num_ports (_plugin); ++x) {
277                 if (parameter_is_control (x)) {
278                         if (c++ == n) {
279                                 ok = true;
280                                 return x;
281                         }
282                 }
283         }
284
285         return 0;
286 }
287
288 void
289 LV2Plugin::lv2_persist_store_callback(void*       callback_data,
290                                       const char* key,
291                                       const void* value,
292                                       size_t      size,
293                                       uint32_t    type)
294 {
295         LV2PFile file = (LV2PFile)callback_data;
296
297         // FIXME: assumes URIs are mapped in the default context (or not event, at least)
298         const char* type_uri = LV2Plugin::_uri_map.id_to_uri(NULL, type);
299         cout << "LV2 PERSIST STORE " << key << " = " << value << " :: " << type_uri << endl;
300         lv2_pfile_write(file, key, value, size, type_uri);
301 }
302
303 const void*
304 LV2Plugin::lv2_persist_retrieve_callback(void*       callback_data,
305                                          const char* key,
306                                          size_t*     size,
307                                          uint32_t*   type)
308 {
309         //LV2PFile file = (LV2PFile)callback_data;
310         cout << "LV2 PERSIST RETRIEVE " << key << endl;
311         return NULL;
312 }
313
314 void
315 LV2Plugin::add_state (XMLNode* root) const
316 {
317         XMLNode *child;
318         char buf[16];
319         LocaleGuard lg (X_("POSIX"));
320
321         for (uint32_t i = 0; i < parameter_count(); ++i){
322                 if (parameter_is_input(i) && parameter_is_control(i)) {
323                         child = new XMLNode("Port");
324                         child->add_property("symbol", port_symbol(i));
325                         snprintf(buf, sizeof(buf), "%+f", _shadow_data[i]);
326                         child->add_property("value", string(buf));
327                         root->add_child_nocopy (*child);
328                 }
329         }
330
331         if (_supports_persist) {
332                 // Create state directory for this plugin instance
333                 const std::string state_filename = _id.to_s() + ".lv2pfile";
334                 const std::string state_path     = Glib::build_filename(
335                         _session.plugins_dir(), state_filename);
336
337                 cout << "Saving LV2 plugin state to " << state_path << endl;
338
339                 // Get LV2 Persist extension data from plugin instance
340                 LV2_Persist* persist = (LV2_Persist*)slv2_instance_get_extension_data(
341                         _instance, "http://lv2plug.in/ns/ext/persist");
342                 if (!persist) {
343                         warning << string_compose(
344                                 _("Plugin \"%1\% failed to return LV2 persist data"),
345                                 unique_id());
346                         return;
347                 }
348
349                 LV2PFile file = lv2_pfile_open(state_path.c_str(), true);
350                 persist->save(_instance->lv2_handle, &LV2Plugin::lv2_persist_store_callback, file);
351                 lv2_pfile_close(file);
352
353                 root->add_property("state-file", state_filename);
354         }
355 }
356
357 static inline SLV2Value
358 get_value(SLV2Plugin p, SLV2Value subject, SLV2Value predicate)
359 {
360         SLV2Values vs = slv2_plugin_get_value_for_subject(p, subject, predicate);
361         return vs ? slv2_values_get_at(vs, 0) : NULL;
362 }
363
364 void
365 LV2Plugin::find_presets ()
366 {
367         SLV2Value dc_title       = slv2_value_new_uri(_world.world, NS_DC   "title");
368         SLV2Value pset_hasPreset = slv2_value_new_uri(_world.world, NS_PSET "hasPreset");
369
370         SLV2Values presets = slv2_plugin_get_value(_plugin, pset_hasPreset);
371         for (unsigned i = 0; i < slv2_values_size(presets); ++i) {
372                 SLV2Value preset = slv2_values_get_at(presets, i);
373                 SLV2Value name   = get_value(_plugin, preset, dc_title);
374                 if (name) {
375                         _presets.insert(std::make_pair(slv2_value_as_string(preset),
376                                                        PresetRecord(
377                                                                slv2_value_as_string(preset),
378                                                                slv2_value_as_string(name))));
379                 } else {
380                         warning << string_compose(
381                                 _("Plugin \"%1\% preset \"%2%\" is missing a dc:title\n"),
382                                 unique_id(), slv2_value_as_string(preset));
383                 }
384         }
385         slv2_values_free(presets);
386
387         slv2_value_free(pset_hasPreset);
388         slv2_value_free(dc_title);
389 }
390
391 bool
392 LV2Plugin::load_preset (PresetRecord r)
393 {
394         Plugin::load_preset (r);
395
396 #ifdef HAVE_NEW_SLV2
397         // New (>= 0.7.0) slv2 no longer supports SPARQL, but exposes blank nodes
398         // so querying ports is possible with the simple API
399         SLV2Value lv2_port   = slv2_value_new_uri(_world.world, NS_LV2 "port");
400         SLV2Value lv2_symbol = slv2_value_new_uri(_world.world, NS_LV2 "symbol");
401         SLV2Value pset_value = slv2_value_new_uri(_world.world, NS_PSET "value");
402         SLV2Value preset     = slv2_value_new_uri(_world.world, r.uri.c_str());
403
404         SLV2Values ports = slv2_plugin_get_value_for_subject(_plugin, preset, lv2_port);
405         for (unsigned i = 0; i < slv2_values_size(ports); ++i) {
406                 SLV2Value port   = slv2_values_get_at(ports, i);
407                 SLV2Value symbol = get_value(_plugin, port, lv2_symbol);
408                 SLV2Value value  = get_value(_plugin, port, pset_value);
409                 if (value && slv2_value_is_float(value)) {
410                         set_parameter(_port_indices[slv2_value_as_string(symbol)],
411                                       slv2_value_as_float(value));
412                 }
413         }
414         slv2_values_free(ports);
415
416         slv2_value_free(preset);
417         slv2_value_free(pset_value);
418         slv2_value_free(lv2_symbol);
419         slv2_value_free(lv2_port);
420 #else
421         const string query = string(
422                         "PREFIX lv2p: <http://lv2plug.in/ns/dev/presets#>\n"
423                         "PREFIX dc:  <http://dublincore.org/documents/dcmi-namespace/>\n"
424                         "SELECT ?sym ?val WHERE { <") + r.uri + "> lv2:port ?port . "
425                                 " ?port lv2:symbol ?sym ; lv2p:value ?val . }";
426         SLV2Results values = slv2_plugin_query_sparql(_plugin, query.c_str());
427         for (; !slv2_results_finished(values); slv2_results_next(values)) {
428                 SLV2Value sym = slv2_results_get_binding_value(values, 0);
429                 SLV2Value val = slv2_results_get_binding_value(values, 1);
430                 if (slv2_value_is_float(val)) {
431                         uint32_t index = _port_indices[slv2_value_as_string(sym)];
432                         set_parameter(index, slv2_value_as_float(val));
433                 }
434         }
435         slv2_results_free(values);
436 #endif
437         return true;
438 }
439
440 std::string
441 LV2Plugin::do_save_preset (string /*name*/)
442 {
443         return "";
444 }
445
446 void
447 LV2Plugin::do_remove_preset (string /*name*/)
448 {
449         return;
450 }
451
452 bool
453 LV2Plugin::has_editor() const
454 {
455         return (_ui != NULL);
456 }
457
458 int
459 LV2Plugin::set_state(const XMLNode& node, int version)
460 {
461         XMLNodeList          nodes;
462         const XMLProperty*   prop;
463         XMLNodeConstIterator iter;
464         XMLNode*             child;
465         const char*          sym;
466         const char*          value;
467         uint32_t             port_id;
468         LocaleGuard          lg(X_("POSIX"));
469
470         if (node.name() != state_node_name()) {
471                 error << _("Bad node sent to LV2Plugin::set_state") << endmsg;
472                 return -1;
473         }
474
475         if (version < 3000){
476                 nodes = node.children ("port");
477         } else {
478                 nodes = node.children ("Port");
479         }
480         
481         for (iter = nodes.begin(); iter != nodes.end(); ++iter){
482
483                 child = *iter;
484
485                 if ((prop = child->property("symbol")) != 0) {
486                         sym = prop->value().c_str();
487                 } else {
488                         warning << _("LV2: port has no symbol, ignored") << endmsg;
489                         continue;
490                 }
491
492                 map<string,uint32_t>::iterator i = _port_indices.find(sym);
493                 
494                 if (i != _port_indices.end()) {
495                         port_id = i->second;
496                 } else {
497                         warning << _("LV2: port has unknown index, ignored") << endmsg;
498                         continue;
499                 }
500
501                 if ((prop = child->property("value")) != 0) {
502                         value = prop->value().c_str();
503                 } else {
504                         warning << _("LV2: port has no value, ignored") << endmsg;
505                         continue;
506                 }
507
508                 set_parameter (port_id, atof(value));
509         }
510
511         if ((prop = node.property("state-file")) != 0) {
512                 std::string state_path = Glib::build_filename(_session.plugins_dir(),
513                                                               prop->value());
514
515                 // Get LV2 Persist extension data from plugin instance
516                 LV2_Persist* persist = (LV2_Persist*)slv2_instance_get_extension_data(
517                         _instance, "http://lv2plug.in/ns/ext/persist");
518                 if (persist) {
519                         cout << "Loading LV2 state from " << state_path << endl;
520                         LV2PFile file = lv2_pfile_open(state_path.c_str(), false);
521                         persist->restore(_instance->lv2_handle,
522                                          &LV2Plugin::lv2_persist_retrieve_callback,
523                                          file);
524                         lv2_pfile_close(file);
525                 } else {
526                         warning << string_compose(
527                                 _("Plugin \"%1\% failed to return LV2 persist data"),
528                                 unique_id());
529                 }
530         }
531
532         latency_compute_run ();
533
534         return Plugin::set_state (node, version);
535 }
536
537 int
538 LV2Plugin::get_parameter_descriptor (uint32_t which, ParameterDescriptor& desc) const
539 {
540         SLV2Port port = slv2_plugin_get_port_by_index(_plugin, which);
541
542         SLV2Value def, min, max;
543         slv2_port_get_range(_plugin, port, &def, &min, &max);
544
545     desc.integer_step = slv2_port_has_property(_plugin, port, _world.integer);
546     desc.toggled      = slv2_port_has_property(_plugin, port, _world.toggled);
547     desc.logarithmic  = slv2_port_has_property(_plugin, port, _world.logarithmic);
548     desc.sr_dependent = slv2_port_has_property(_plugin, port, _world.srate);
549     desc.label        = slv2_value_as_string(slv2_port_get_name(_plugin, port));
550     desc.lower        = min ? slv2_value_as_float(min) : 0.0f;
551     desc.upper        = max ? slv2_value_as_float(max) : 1.0f;
552     desc.min_unbound  = false; // TODO: LV2 extension required
553     desc.max_unbound  = false; // TODO: LV2 extension required
554
555         if (desc.integer_step) {
556                 desc.step      = 1.0;
557                 desc.smallstep = 0.1;
558                 desc.largestep = 10.0;
559         } else {
560                 const float delta = desc.upper - desc.lower;
561                 desc.step      = delta / 1000.0f;
562                 desc.smallstep = delta / 10000.0f;
563                 desc.largestep = delta/10.0f;
564         }
565
566         slv2_value_free(def);
567         slv2_value_free(min);
568         slv2_value_free(max);
569
570         return 0;
571 }
572
573
574 string
575 LV2Plugin::describe_parameter (Evoral::Parameter which)
576 {
577         if (which.type() == PluginAutomation && which.id() < parameter_count()) {
578                 SLV2Value name = slv2_port_get_name(_plugin,
579                                                     slv2_plugin_get_port_by_index(_plugin, which.id()));
580                 string ret(slv2_value_as_string(name));
581                 slv2_value_free(name);
582                 return ret;
583         } else {
584                 return "??";
585         }
586 }
587
588 framecnt_t
589 LV2Plugin::signal_latency () const
590 {
591         if (_latency_control_port) {
592                 return (framecnt_t) floor (*_latency_control_port);
593         } else {
594                 return 0;
595         }
596 }
597
598 set<Evoral::Parameter>
599 LV2Plugin::automatable () const
600 {
601         set<Evoral::Parameter> ret;
602
603         for (uint32_t i = 0; i < parameter_count(); ++i){
604                 if (parameter_is_input(i) && parameter_is_control(i)) {
605                         ret.insert (ret.end(), Evoral::Parameter(PluginAutomation, 0, i));
606                 }
607         }
608
609         return ret;
610 }
611
612 void
613 LV2Plugin::activate ()
614 {
615         if (!_was_activated) {
616                 slv2_instance_activate (_instance);
617                 _was_activated = true;
618         }
619 }
620
621 void
622 LV2Plugin::deactivate ()
623 {
624         if (_was_activated) {
625                 slv2_instance_deactivate (_instance);
626                 _was_activated = false;
627         }
628 }
629
630 void
631 LV2Plugin::cleanup ()
632 {
633         activate ();
634         deactivate ();
635         slv2_instance_free (_instance);
636         _instance = NULL;
637 }
638
639 int
640 LV2Plugin::connect_and_run (BufferSet& bufs,
641                 ChanMapping in_map, ChanMapping out_map,
642                 pframes_t nframes, framecnt_t offset)
643 {
644         Plugin::connect_and_run (bufs, in_map, out_map, nframes, offset);
645
646         cycles_t then = get_cycles ();
647
648         uint32_t audio_in_index  = 0;
649         uint32_t audio_out_index = 0;
650         uint32_t midi_in_index   = 0;
651         uint32_t midi_out_index  = 0;
652         for (uint32_t port_index = 0; port_index < parameter_count(); ++port_index) {
653                 if (parameter_is_audio(port_index)) {
654                         if (parameter_is_input(port_index)) {
655                                 const uint32_t buf_index = in_map.get(DataType::AUDIO, audio_in_index++);
656                                 //cerr << port_index << " : " << " AUDIO IN " << buf_index << endl;
657                                 slv2_instance_connect_port(_instance, port_index,
658                                                 bufs.get_audio(buf_index).data(offset));
659                         } else if (parameter_is_output(port_index)) {
660                                 const uint32_t buf_index = out_map.get(DataType::AUDIO, audio_out_index++);
661                                 //cerr << port_index << " : " << " AUDIO OUT " << buf_index << endl;
662                                 slv2_instance_connect_port(_instance, port_index,
663                                                 bufs.get_audio(buf_index).data(offset));
664                         }
665                 } else if (parameter_is_midi(port_index)) {
666                         if (parameter_is_input(port_index)) {
667                                 const uint32_t buf_index = in_map.get(DataType::MIDI, midi_in_index++);
668                                 //cerr << port_index << " : " << " MIDI IN " << buf_index << endl;
669                                 slv2_instance_connect_port(_instance, port_index,
670                                                 bufs.get_lv2_midi(true, buf_index).data());
671                         } else if (parameter_is_output(port_index)) {
672                                 const uint32_t buf_index = out_map.get(DataType::MIDI, midi_out_index++);
673                                 //cerr << port_index << " : " << " MIDI OUT " << buf_index << endl;
674                                 slv2_instance_connect_port(_instance, port_index,
675                                                 bufs.get_lv2_midi(false, buf_index).data());
676                         }
677                 } else if (!parameter_is_control(port_index)) {
678                         // Optional port (it'd better be if we've made it this far...)
679                         slv2_instance_connect_port(_instance, port_index, NULL);
680                 }
681         }
682
683         run (nframes);
684
685         midi_out_index = 0;
686         for (uint32_t port_index = 0; port_index < parameter_count(); ++port_index) {
687                 if (parameter_is_midi(port_index) && parameter_is_output(port_index)) {
688                         const uint32_t buf_index = out_map.get(DataType::MIDI, midi_out_index++);
689                         bufs.flush_lv2_midi(true, buf_index);
690                 }
691         }
692
693         cycles_t now = get_cycles ();
694         set_cycles ((uint32_t) (now - then));
695
696         return 0;
697 }
698
699 bool
700 LV2Plugin::parameter_is_control (uint32_t param) const
701 {
702         SLV2Port port = slv2_plugin_get_port_by_index(_plugin, param);
703         return slv2_port_is_a(_plugin, port, _world.control_class);
704 }
705
706 bool
707 LV2Plugin::parameter_is_audio (uint32_t param) const
708 {
709         SLV2Port port = slv2_plugin_get_port_by_index(_plugin, param);
710         return slv2_port_is_a(_plugin, port, _world.audio_class);
711 }
712
713 bool
714 LV2Plugin::parameter_is_midi (uint32_t param) const
715 {
716         SLV2Port port = slv2_plugin_get_port_by_index(_plugin, param);
717         return slv2_port_is_a(_plugin, port, _world.event_class);
718         //      && slv2_port_supports_event(_plugin, port, _world.midi_class);
719 }
720
721 bool
722 LV2Plugin::parameter_is_output (uint32_t param) const
723 {
724         SLV2Port port = slv2_plugin_get_port_by_index(_plugin, param);
725         return slv2_port_is_a(_plugin, port, _world.output_class);
726 }
727
728 bool
729 LV2Plugin::parameter_is_input (uint32_t param) const
730 {
731         SLV2Port port = slv2_plugin_get_port_by_index(_plugin, param);
732         return slv2_port_is_a(_plugin, port, _world.input_class);
733 }
734
735 void
736 LV2Plugin::print_parameter (uint32_t param, char* buf, uint32_t len) const
737 {
738         if (buf && len) {
739                 if (param < parameter_count()) {
740                         snprintf (buf, len, "%.3f", get_parameter (param));
741                 } else {
742                         strcat (buf, "0");
743                 }
744         }
745 }
746
747 void
748 LV2Plugin::run (pframes_t nframes)
749 {
750         for (uint32_t i = 0; i < parameter_count(); ++i) {
751                 if (parameter_is_control(i) && parameter_is_input(i))  {
752                         _control_data[i] = _shadow_data[i];
753                 }
754         }
755
756         slv2_instance_run(_instance, nframes);
757 }
758
759 void
760 LV2Plugin::latency_compute_run ()
761 {
762         if (!_latency_control_port) {
763                 return;
764         }
765
766         /* we need to run the plugin so that it can set its latency
767            parameter.
768         */
769
770         activate ();
771
772         uint32_t port_index = 0;
773         uint32_t in_index   = 0;
774         uint32_t out_index  = 0;
775
776         const framecnt_t bufsize = 1024;
777         float buffer[bufsize];
778
779         memset(buffer, 0, sizeof(float) * bufsize);
780
781         // FIXME: Ensure plugins can handle in-place processing
782
783         port_index = 0;
784
785         while (port_index < parameter_count()) {
786                 if (parameter_is_audio (port_index)) {
787                         if (parameter_is_input (port_index)) {
788                                 slv2_instance_connect_port (_instance, port_index, buffer);
789                                 in_index++;
790                         } else if (parameter_is_output (port_index)) {
791                                 slv2_instance_connect_port (_instance, port_index, buffer);
792                                 out_index++;
793                         }
794                 }
795                 port_index++;
796         }
797
798         run (bufsize);
799         deactivate ();
800 }
801
802 LV2World::LV2World()
803         : world(slv2_world_new())
804 {
805         slv2_world_load_all(world);
806         input_class     = slv2_value_new_uri(world, SLV2_PORT_CLASS_INPUT);
807         output_class    = slv2_value_new_uri(world, SLV2_PORT_CLASS_OUTPUT);
808         control_class   = slv2_value_new_uri(world, SLV2_PORT_CLASS_CONTROL);
809         audio_class     = slv2_value_new_uri(world, SLV2_PORT_CLASS_AUDIO);
810         event_class     = slv2_value_new_uri(world, SLV2_PORT_CLASS_EVENT);
811         midi_class      = slv2_value_new_uri(world, SLV2_EVENT_CLASS_MIDI);
812         in_place_broken = slv2_value_new_uri(world, SLV2_NAMESPACE_LV2 "inPlaceBroken");
813         integer         = slv2_value_new_uri(world, SLV2_NAMESPACE_LV2 "integer");
814         toggled         = slv2_value_new_uri(world, SLV2_NAMESPACE_LV2 "toggled");
815         srate           = slv2_value_new_uri(world, SLV2_NAMESPACE_LV2 "sampleRate");
816         gtk_gui         = slv2_value_new_uri(world, NS_UI "GtkUI");
817         external_gui    = slv2_value_new_uri(world, NS_UI "external");
818         logarithmic     = slv2_value_new_uri(world, "http://lv2plug.in/ns/dev/extportinfo#logarithmic");
819 }
820
821 LV2World::~LV2World()
822 {
823         slv2_value_free(input_class);
824         slv2_value_free(output_class);
825         slv2_value_free(control_class);
826         slv2_value_free(audio_class);
827         slv2_value_free(event_class);
828         slv2_value_free(midi_class);
829         slv2_value_free(in_place_broken);
830 }
831
832 LV2PluginInfo::LV2PluginInfo (void* lv2_world, void* slv2_plugin)
833         : _lv2_world(lv2_world)
834         , _slv2_plugin(slv2_plugin)
835 {
836         type = ARDOUR::LV2;
837 }
838
839 LV2PluginInfo::~LV2PluginInfo()
840 {
841 }
842
843 PluginPtr
844 LV2PluginInfo::load (Session& session)
845 {
846         try {
847                 PluginPtr plugin;
848
849                 plugin.reset (new LV2Plugin (session.engine(), session,
850                                 *(LV2World*)_lv2_world, (SLV2Plugin)_slv2_plugin, session.frame_rate()));
851
852                 plugin->set_info(PluginInfoPtr(new LV2PluginInfo(*this)));
853                 return plugin;
854         }
855
856         catch (failed_constructor &err) {
857                 return PluginPtr ((Plugin*) 0);
858         }
859
860         return PluginPtr();
861 }
862
863 PluginInfoList*
864 LV2PluginInfo::discover (void* lv2_world)
865 {
866         PluginInfoList* plugs   = new PluginInfoList;
867         LV2World*       world   = (LV2World*)lv2_world;
868         SLV2Plugins     plugins = slv2_world_get_all_plugins(world->world);
869
870         cerr << "LV2: Discovering " << slv2_plugins_size (plugins) << " plugins" << endl;
871
872         for (unsigned i=0; i < slv2_plugins_size(plugins); ++i) {
873                 SLV2Plugin p = slv2_plugins_get_at(plugins, i);
874                 LV2PluginInfoPtr info (new LV2PluginInfo(lv2_world, p));
875
876                 SLV2Value name = slv2_plugin_get_name(p);
877
878                 if (!name) {
879                         cerr << "LV2: invalid plugin\n";
880                         continue;
881                 }
882
883                 info->type = LV2;
884
885                 info->name = string(slv2_value_as_string(name));
886                 slv2_value_free(name);
887
888                 SLV2PluginClass pclass = slv2_plugin_get_class(p);
889                 SLV2Value label = slv2_plugin_class_get_label(pclass);
890                 info->category = slv2_value_as_string(label);
891
892                 SLV2Value author_name = slv2_plugin_get_author_name(p);
893                 info->creator = author_name ? string(slv2_value_as_string(author_name)) : "Unknown";
894                 slv2_value_free(author_name);
895
896                 info->path = "/NOPATH"; // Meaningless for LV2
897
898                 info->n_inputs.set_audio(slv2_plugin_get_num_ports_of_class(p,
899                                 world->input_class, world->audio_class, NULL));
900                 info->n_inputs.set_midi(slv2_plugin_get_num_ports_of_class(p,
901                                 world->input_class, world->event_class, NULL));
902
903                 info->n_outputs.set_audio(slv2_plugin_get_num_ports_of_class(p,
904                                 world->output_class, world->audio_class, NULL));
905                 info->n_outputs.set_midi(slv2_plugin_get_num_ports_of_class(p,
906                                 world->output_class, world->event_class, NULL));
907
908                 info->unique_id = slv2_value_as_uri(slv2_plugin_get_uri(p));
909                 info->index = 0; // Meaningless for LV2
910
911                 plugs->push_back (info);
912         }
913
914         cerr << "Done LV2 discovery" << endl;
915
916         return plugs;
917 }
918