2 Copyright (C) 2008-2012 Paul Davis
3 Author: David Robillard
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.
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.
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.
29 #include "pbd/gstdio_compat.h"
30 #include <glib/gprintf.h>
33 #include <boost/utility.hpp>
35 #include "pbd/file_utils.h"
36 #include "pbd/stl_delete.h"
37 #include "pbd/compose.h"
38 #include "pbd/error.h"
39 #include "pbd/locale_guard.h"
40 #include "pbd/replace_all.h"
41 #include "pbd/xml++.h"
43 #ifdef PLATFORM_WINDOWS
44 #include <shlobj.h> // CSIDL_*
45 #include "pbd/windows_special_dirs.h"
48 #include "libardour-config.h"
50 #include "ardour/audio_buffer.h"
51 #include "ardour/audioengine.h"
52 #include "ardour/debug.h"
53 #include "ardour/lv2_plugin.h"
54 #include "ardour/midi_patch_manager.h"
55 #include "ardour/session.h"
56 #include "ardour/tempo.h"
57 #include "ardour/types.h"
58 #include "ardour/utils.h"
59 #include "ardour/worker.h"
60 #include "ardour/search_paths.h"
65 #include <lilv/lilv.h>
67 #include "lv2/lv2plug.in/ns/ext/atom/atom.h"
68 #include "lv2/lv2plug.in/ns/ext/atom/forge.h"
69 #include "lv2/lv2plug.in/ns/ext/log/log.h"
70 #include "lv2/lv2plug.in/ns/ext/midi/midi.h"
71 #include "lv2/lv2plug.in/ns/ext/port-props/port-props.h"
72 #include "lv2/lv2plug.in/ns/ext/presets/presets.h"
73 #include "lv2/lv2plug.in/ns/ext/state/state.h"
74 #include "lv2/lv2plug.in/ns/ext/time/time.h"
75 #include "lv2/lv2plug.in/ns/ext/worker/worker.h"
76 #include "lv2/lv2plug.in/ns/ext/resize-port/resize-port.h"
77 #include "lv2/lv2plug.in/ns/extensions/ui/ui.h"
78 #include "lv2/lv2plug.in/ns/extensions/units/units.h"
79 #include "lv2/lv2plug.in/ns/ext/patch/patch.h"
80 #include "lv2/lv2plug.in/ns/ext/port-groups/port-groups.h"
82 #include "lv2/lv2plug.in/ns/ext/buf-size/buf-size.h"
83 #include "lv2/lv2plug.in/ns/ext/options/options.h"
86 #include "lv2_evbuf.h"
89 #include <suil/suil.h>
92 // Compatibility for old LV2
93 #ifndef LV2_ATOM_CONTENTS_CONST
94 #define LV2_ATOM_CONTENTS_CONST(type, atom) \
95 ((const void*)((const uint8_t*)(atom) + sizeof(type)))
97 #ifndef LV2_ATOM_BODY_CONST
98 #define LV2_ATOM_BODY_CONST(atom) LV2_ATOM_CONTENTS_CONST(LV2_Atom, atom)
100 #ifndef LV2_PATCH__property
101 #define LV2_PATCH__property LV2_PATCH_PREFIX "property"
103 #ifndef LV2_PATCH__value
104 #define LV2_PATCH__value LV2_PATCH_PREFIX "value"
106 #ifndef LV2_PATCH__writable
107 #define LV2_PATCH__writable LV2_PATCH_PREFIX "writable"
110 /** The number of MIDI buffers that will fit in a UI/worker comm buffer.
111 This needs to be roughly the number of cycles the UI will get around to
112 actually processing the traffic. Lower values are flakier but save memory.
114 static const size_t NBUFS = 4;
117 using namespace ARDOUR;
120 bool LV2Plugin::force_state_save = false;
122 class LV2World : boost::noncopyable {
127 void load_bundled_plugins(bool verbose=false);
131 LilvNode* atom_AtomPort;
132 LilvNode* atom_Chunk;
133 LilvNode* atom_Sequence;
134 LilvNode* atom_bufferType;
135 LilvNode* atom_eventTransfer;
136 LilvNode* atom_supports;
137 LilvNode* ev_EventPort;
138 LilvNode* ext_logarithmic;
139 LilvNode* ext_notOnGUI;
140 LilvNode* ext_expensive;
141 LilvNode* ext_causesArtifacts;
142 LilvNode* ext_notAutomatic;
143 LilvNode* ext_rangeSteps;
144 LilvNode* groups_group;
145 LilvNode* groups_element;
146 LilvNode* lv2_AudioPort;
147 LilvNode* lv2_ControlPort;
148 LilvNode* lv2_InputPort;
149 LilvNode* lv2_OutputPort;
150 LilvNode* lv2_designation;
151 LilvNode* lv2_enumeration;
152 LilvNode* lv2_freewheeling;
153 LilvNode* lv2_inPlaceBroken;
154 LilvNode* lv2_isSideChain;
156 LilvNode* lv2_integer;
157 LilvNode* lv2_default;
158 LilvNode* lv2_minimum;
159 LilvNode* lv2_maximum;
160 LilvNode* lv2_reportsLatency;
161 LilvNode* lv2_sampleRate;
162 LilvNode* lv2_toggled;
163 LilvNode* midi_MidiEvent;
164 LilvNode* rdfs_comment;
165 LilvNode* rdfs_label;
166 LilvNode* rdfs_range;
167 LilvNode* rsz_minimumSize;
168 LilvNode* time_Position;
170 LilvNode* ui_external;
171 LilvNode* ui_externalkx;
174 LilvNode* units_unit;
175 LilvNode* units_render;
176 LilvNode* units_midiNote;
177 LilvNode* patch_writable;
178 LilvNode* patch_Message;
179 #ifdef HAVE_LV2_1_2_0
180 LilvNode* bufz_powerOf2BlockLength;
181 LilvNode* bufz_fixedBlockLength;
182 LilvNode* bufz_nominalBlockLength;
183 LilvNode* bufz_coarseBlockLength;
186 #ifdef HAVE_LV2_1_10_0
188 LilvNode* atom_float;
189 LilvNode* atom_object; // new in 1.8
190 LilvNode* atom_vector;
193 LilvNode* lv2_noSampleAccurateCtrl;
194 LilvNode* auto_can_write_automatation; // lv2:optionalFeature
195 LilvNode* auto_automation_control; // atom:supports
196 LilvNode* auto_automation_controlled; // lv2:portProperty
197 LilvNode* auto_automation_controller; // lv2:portProperty
198 LilvNode* inline_display_in_gui; // lv2:optionalFeature
202 bool _bundle_checked;
205 static LV2World _world;
207 /* worker extension */
209 /** Called by the plugin to schedule non-RT work. */
210 static LV2_Worker_Status
211 work_schedule(LV2_Worker_Schedule_Handle handle,
215 return (((Worker*)handle)->schedule(size, data)
217 : LV2_WORKER_ERR_UNKNOWN);
220 /** Called by the plugin to respond to non-RT work. */
221 static LV2_Worker_Status
222 work_respond(LV2_Worker_Respond_Handle handle,
226 return (((Worker*)handle)->respond(size, data)
228 : LV2_WORKER_ERR_UNKNOWN);
232 /* inline display extension */
234 LV2Plugin::queue_draw (LV2_Inline_Display_Handle handle)
236 LV2Plugin* plugin = (LV2Plugin*)handle;
237 plugin->QueueDraw(); /* EMIT SIGNAL */
241 LV2Plugin::midnam_update (LV2_Midnam_Handle handle)
243 LV2Plugin* plugin = (LV2Plugin*)handle;
244 plugin->_midnam_dirty = true;
245 plugin->UpdateMidnam (); /* EMIT SIGNAL */
249 LV2Plugin::bankpatch_notify (LV2_BankPatch_Handle handle, uint8_t chn, uint32_t bank, uint8_t pgm)
251 LV2Plugin* plugin = (LV2Plugin*)handle;
255 plugin->seen_bankpatch = true;
256 if (pgm > 127 || bank > 16383) {
257 plugin->_bankpatch[chn] = UINT32_MAX;
259 plugin->_bankpatch[chn] = (bank << 7) | pgm;
261 plugin->BankPatchChange (chn); /* EMIT SIGNAL */
268 log_vprintf(LV2_Log_Handle /*handle*/,
274 const int ret = g_vasprintf(&str, fmt, args);
275 /* strip trailing whitespace */
276 while (strlen (str) > 0 && isspace (str[strlen (str) - 1])) {
277 str[strlen (str) - 1] = '\0';
279 if (strlen (str) == 0) {
283 if (type == URIMap::instance().urids.log_Error) {
284 error << str << endmsg;
285 } else if (type == URIMap::instance().urids.log_Warning) {
286 warning << str << endmsg;
287 } else if (type == URIMap::instance().urids.log_Note) {
288 info << str << endmsg;
289 } else if (type == URIMap::instance().urids.log_Trace) {
290 DEBUG_TRACE(DEBUG::LV2, str);
296 log_printf(LV2_Log_Handle handle,
298 const char* fmt, ...)
302 const int ret = log_vprintf(handle, type, fmt, args);
307 struct LV2Plugin::Impl {
308 Impl() : plugin(0), ui(0), ui_type(0), name(0), author(0), instance(0)
310 #ifdef HAVE_LV2_1_2_0
315 #ifdef HAVE_LV2_1_2_0
324 /** Find the LV2 input port with the given designation.
325 * If found, bufptrs[port_index] will be set to bufptr.
327 const LilvPort* designated_input (const char* uri, void** bufptrs[], void** bufptr);
329 const LilvPlugin* plugin;
331 const LilvNode* ui_type;
334 LilvInstance* instance;
335 const LV2_Worker_Interface* work_iface;
336 #ifdef HAVE_LV2_1_2_0
337 const LV2_Options_Interface* opts_iface;
340 LV2_Atom_Forge forge;
341 LV2_Atom_Forge ui_forge;
342 int32_t block_length;
343 #ifdef HAVE_LV2_1_2_0
344 LV2_Options_Option* options;
347 LV2_Inline_Display* queue_draw;
349 LV2_BankPatch* bankpatch;
353 LV2Plugin::LV2Plugin (AudioEngine& engine,
355 const void* c_plugin,
357 : Plugin (engine, session)
362 , _state_worker(NULL)
364 , _patch_port_in_index((uint32_t)-1)
365 , _patch_port_out_index((uint32_t)-1)
366 , _uri_map(URIMap::instance())
367 , _no_sample_accurate_ctrl (false)
369 init(c_plugin, rate);
372 LV2Plugin::LV2Plugin (const LV2Plugin& other)
378 , _state_worker(NULL)
379 , _insert_id(other._insert_id)
380 , _patch_port_in_index((uint32_t)-1)
381 , _patch_port_out_index((uint32_t)-1)
382 , _uri_map(URIMap::instance())
383 , _no_sample_accurate_ctrl (false)
385 init(other._impl->plugin, other._sample_rate);
387 for (uint32_t i = 0; i < parameter_count(); ++i) {
388 _control_data[i] = other._shadow_data[i];
389 _shadow_data[i] = other._shadow_data[i];
394 LV2Plugin::init(const void* c_plugin, samplecnt_t rate)
396 DEBUG_TRACE(DEBUG::LV2, "init\n");
398 _impl->plugin = (const LilvPlugin*)c_plugin;
400 _impl->ui_type = NULL;
405 _atom_ev_buffers = 0;
407 _bpm_control_port = 0;
408 _freewheel_control_port = 0;
409 _latency_control_port = 0;
410 _next_cycle_start = std::numeric_limits<samplepos_t>::max();
411 _next_cycle_speed = 1.0;
412 _seq_size = _engine.raw_buffer_size(DataType::MIDI);
414 _was_activated = false;
415 _has_state_interface = false;
416 _can_write_automation = false;
418 _inline_display_in_gui = false;
421 _current_latency = 0;
422 _impl->block_length = _session.get_block_size();
424 _instance_access_feature.URI = "http://lv2plug.in/ns/ext/instance-access";
425 _data_access_feature.URI = "http://lv2plug.in/ns/ext/data-access";
426 _make_path_feature.URI = LV2_STATE__makePath;
427 _log_feature.URI = LV2_LOG__log;
428 _work_schedule_feature.URI = LV2_WORKER__schedule;
429 _work_schedule_feature.data = NULL;
430 _def_state_feature.URI = LV2_STATE_PREFIX "loadDefaultState"; // Post LV2-1.2.0
431 _def_state_feature.data = NULL;
433 const LilvPlugin* plugin = _impl->plugin;
435 LilvNode* state_iface_uri = lilv_new_uri(_world.world, LV2_STATE__interface);
436 LilvNode* state_uri = lilv_new_uri(_world.world, LV2_STATE_URI);
437 _has_state_interface =
438 // What plugins should have (lv2:extensionData state:Interface)
439 lilv_plugin_has_extension_data(plugin, state_iface_uri)
440 // What some outdated/incorrect ones have
441 || lilv_plugin_has_feature(plugin, state_uri);
442 lilv_node_free(state_uri);
443 lilv_node_free(state_iface_uri);
445 _features = (LV2_Feature**)calloc(14, sizeof(LV2_Feature*));
446 _features[0] = &_instance_access_feature;
447 _features[1] = &_data_access_feature;
448 _features[2] = &_make_path_feature;
449 _features[3] = _uri_map.uri_map_feature();
450 _features[4] = _uri_map.urid_map_feature();
451 _features[5] = _uri_map.urid_unmap_feature();
452 _features[6] = &_log_feature;
454 unsigned n_features = 7;
455 #ifdef HAVE_LV2_1_2_0
456 _features[n_features++] = &_def_state_feature;
459 lv2_atom_forge_init(&_impl->forge, _uri_map.urid_map());
460 lv2_atom_forge_init(&_impl->ui_forge, _uri_map.urid_map());
463 _impl->queue_draw = (LV2_Inline_Display*)
464 malloc (sizeof(LV2_Inline_Display));
465 _impl->queue_draw->handle = this;
466 _impl->queue_draw->queue_draw = queue_draw;
468 _queue_draw_feature.URI = LV2_INLINEDISPLAY__queue_draw;
469 _queue_draw_feature.data = _impl->queue_draw;
470 _features[n_features++] = &_queue_draw_feature;
472 _impl->midnam = (LV2_Midnam*)
473 malloc (sizeof(LV2_Midnam));
474 _impl->midnam->handle = this;
475 _impl->midnam->update = midnam_update;
477 _midnam_feature.URI = LV2_MIDNAM__update;
478 _midnam_feature.data = _impl->midnam;
479 _features[n_features++] = &_midnam_feature;
481 _impl->bankpatch = (LV2_BankPatch*)
482 malloc (sizeof(LV2_BankPatch));
483 _impl->bankpatch->handle = this;
484 _impl->bankpatch->notify = bankpatch_notify;
486 _bankpatch_feature.URI = LV2_BANKPATCH__notify;
487 _bankpatch_feature.data = _impl->bankpatch;
488 _features[n_features++] = &_bankpatch_feature;
491 #ifdef HAVE_LV2_1_2_0
492 LV2_URID atom_Int = _uri_map.uri_to_id(LV2_ATOM__Int);
493 static const int32_t _min_block_length = 1; // may happen during split-cycles
494 static const int32_t _max_block_length = 8192; // max possible (with all engines and during export)
495 /* Consider updating max-block-size whenever the buffersize changes.
496 * It requires re-instantiating the plugin (which is a non-realtime operation),
497 * so it should be done lightly and only for plugins that require it.
499 * given that the block-size can change at any time (split-cycles) ardour currently
500 * does not support plugins that require bufz_fixedBlockLength.
502 LV2_Options_Option options[] = {
503 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id(LV2_BUF_SIZE__minBlockLength),
504 sizeof(int32_t), atom_Int, &_min_block_length },
505 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id(LV2_BUF_SIZE__maxBlockLength),
506 sizeof(int32_t), atom_Int, &_max_block_length },
507 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id(LV2_BUF_SIZE__sequenceSize),
508 sizeof(int32_t), atom_Int, &_seq_size },
509 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id("http://lv2plug.in/ns/ext/buf-size#nominalBlockLength"),
510 sizeof(int32_t), atom_Int, &_impl->block_length },
511 { LV2_OPTIONS_INSTANCE, 0, 0, 0, 0, NULL }
514 _impl->options = (LV2_Options_Option*) malloc (sizeof (options));
515 memcpy ((void*) _impl->options, (void*) options, sizeof (options));
517 _options_feature.URI = LV2_OPTIONS__options;
518 _options_feature.data = _impl->options;
519 _features[n_features++] = &_options_feature;
523 seen_bankpatch = false;
524 for (uint32_t chn = 0; chn < 16; ++chn) {
525 _bankpatch[chn] = UINT32_MAX;
529 LV2_State_Make_Path* make_path = (LV2_State_Make_Path*)malloc(
530 sizeof(LV2_State_Make_Path));
531 make_path->handle = this;
532 make_path->path = &lv2_state_make_path;
533 _make_path_feature.data = make_path;
535 LV2_Log_Log* log = (LV2_Log_Log*)malloc(sizeof(LV2_Log_Log));
537 log->printf = &log_printf;
538 log->vprintf = &log_vprintf;
539 _log_feature.data = log;
541 const size_t ring_size = _session.engine().raw_buffer_size(DataType::MIDI) * NBUFS;
542 LilvNode* worker_schedule = lilv_new_uri(_world.world, LV2_WORKER__schedule);
543 if (lilv_plugin_has_feature(plugin, worker_schedule)) {
544 LV2_Worker_Schedule* schedule = (LV2_Worker_Schedule*)malloc(
545 sizeof(LV2_Worker_Schedule));
546 _worker = new Worker(this, ring_size);
547 schedule->handle = _worker;
548 schedule->schedule_work = work_schedule;
549 _work_schedule_feature.data = schedule;
550 _features[n_features++] = &_work_schedule_feature;
552 lilv_node_free(worker_schedule);
554 if (_has_state_interface) {
555 // Create a non-threaded worker for use by state restore
556 _state_worker = new Worker(this, ring_size, false);
559 _impl->instance = lilv_plugin_instantiate(plugin, rate, _features);
560 _impl->name = lilv_plugin_get_name(plugin);
561 _impl->author = lilv_plugin_get_author_name(plugin);
563 if (_impl->instance == 0) {
564 error << _("LV2: Failed to instantiate plugin ") << uri() << endmsg;
565 throw failed_constructor();
568 _instance_access_feature.data = (void*)_impl->instance->lv2_handle;
569 _data_access_extension_data.extension_data = _impl->instance->lv2_descriptor->extension_data;
570 _data_access_feature.data = &_data_access_extension_data;
572 LilvNode* worker_iface_uri = lilv_new_uri(_world.world, LV2_WORKER__interface);
573 if (lilv_plugin_has_extension_data(plugin, worker_iface_uri)) {
574 _impl->work_iface = (const LV2_Worker_Interface*)extension_data(
575 LV2_WORKER__interface);
577 lilv_node_free(worker_iface_uri);
580 #ifdef HAVE_LV2_1_2_0
581 LilvNode* options_iface_uri = lilv_new_uri(_world.world, LV2_OPTIONS__interface);
582 if (lilv_plugin_has_extension_data(plugin, options_iface_uri)) {
583 _impl->opts_iface = (const LV2_Options_Interface*)extension_data(
584 LV2_OPTIONS__interface);
586 lilv_node_free(options_iface_uri);
590 _display_interface = (const LV2_Inline_Display_Interface*)
591 extension_data (LV2_INLINEDISPLAY__interface);
593 _midname_interface = (const LV2_Midnam_Interface*)
594 extension_data (LV2_MIDNAM__interface);
595 if (_midname_interface) {
596 _midnam_dirty = true;
601 if (lilv_plugin_has_feature(plugin, _world.lv2_inPlaceBroken)) {
602 error << string_compose(
603 _("LV2: \"%1\" cannot be used, since it cannot do inplace processing."),
604 lilv_node_as_string(_impl->name)) << endmsg;
605 lilv_node_free(_impl->name);
606 lilv_node_free(_impl->author);
607 throw failed_constructor();
610 #ifdef HAVE_LV2_1_2_0
611 LilvNodes *required_features = lilv_plugin_get_required_features (plugin);
612 if (lilv_nodes_contains (required_features, _world.bufz_powerOf2BlockLength) ||
613 lilv_nodes_contains (required_features, _world.bufz_fixedBlockLength)
615 error << string_compose(
616 _("LV2: \"%1\" buffer-size requirements cannot be satisfied."),
617 lilv_node_as_string(_impl->name)) << endmsg;
618 lilv_node_free(_impl->name);
619 lilv_node_free(_impl->author);
620 lilv_nodes_free(required_features);
621 throw failed_constructor();
623 lilv_nodes_free(required_features);
626 LilvNodes* optional_features = lilv_plugin_get_optional_features (plugin);
627 #ifdef HAVE_LV2_1_2_0
628 if (lilv_nodes_contains (optional_features, _world.bufz_coarseBlockLength)) {
629 _no_sample_accurate_ctrl = true;
633 if (lilv_nodes_contains (optional_features, _world.lv2_noSampleAccurateCtrl)) {
634 /* deprecated 2016-Sep-18 in favor of bufz_coarseBlockLength */
635 _no_sample_accurate_ctrl = true;
637 if (lilv_nodes_contains (optional_features, _world.auto_can_write_automatation)) {
638 _can_write_automation = true;
640 if (lilv_nodes_contains (optional_features, _world.inline_display_in_gui)) {
641 _inline_display_in_gui = true;
643 lilv_nodes_free(optional_features);
646 #ifdef HAVE_LILV_0_16_0
647 // Load default state
649 /* immediately schedule any work,
650 * so that state restore later will not find a busy
651 * worker. latency_compute_run() flushes any replies
653 _worker->set_synchronous(true);
655 LilvState* state = lilv_state_new_from_world(
656 _world.world, _uri_map.urid_map(), lilv_plugin_get_uri(_impl->plugin));
657 if (state && _has_state_interface) {
658 lilv_state_restore(state, _impl->instance, NULL, NULL, 0, NULL);
660 lilv_state_free(state);
665 const uint32_t num_ports = this->num_ports();
666 for (uint32_t i = 0; i < num_ports; ++i) {
667 const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, i);
669 size_t minimumSize = 0;
671 if (lilv_port_is_a(_impl->plugin, port, _world.lv2_OutputPort)) {
672 flags |= PORT_OUTPUT;
673 } else if (lilv_port_is_a(_impl->plugin, port, _world.lv2_InputPort)) {
676 error << string_compose(
677 "LV2: \"%1\" port %2 is neither input nor output",
678 lilv_node_as_string(_impl->name), i) << endmsg;
679 throw failed_constructor();
682 if (lilv_port_is_a(_impl->plugin, port, _world.lv2_ControlPort)) {
683 flags |= PORT_CONTROL;
684 } else if (lilv_port_is_a(_impl->plugin, port, _world.lv2_AudioPort)) {
686 } else if (lilv_port_is_a(_impl->plugin, port, _world.ev_EventPort)) {
688 flags |= PORT_MIDI; // We assume old event API ports are for MIDI
689 } else if (lilv_port_is_a(_impl->plugin, port, _world.atom_AtomPort)) {
690 LilvNodes* buffer_types = lilv_port_get_value(
691 _impl->plugin, port, _world.atom_bufferType);
692 LilvNodes* atom_supports = lilv_port_get_value(
693 _impl->plugin, port, _world.atom_supports);
695 if (lilv_nodes_contains(buffer_types, _world.atom_Sequence)) {
696 flags |= PORT_SEQUENCE;
697 if (lilv_nodes_contains(atom_supports, _world.midi_MidiEvent)) {
700 if (lilv_nodes_contains(atom_supports, _world.time_Position)) {
701 flags |= PORT_POSITION;
704 if (lilv_nodes_contains(atom_supports, _world.auto_automation_control)) {
705 flags |= PORT_AUTOCTRL;
708 if (lilv_nodes_contains(atom_supports, _world.patch_Message)) {
709 flags |= PORT_PATCHMSG;
710 if (flags & PORT_INPUT) {
711 _patch_port_in_index = i;
713 _patch_port_out_index = i;
717 LilvNodes* min_size_v = lilv_port_get_value(_impl->plugin, port, _world.rsz_minimumSize);
718 LilvNode* min_size = min_size_v ? lilv_nodes_get_first(min_size_v) : NULL;
719 if (min_size && lilv_node_is_int(min_size)) {
720 minimumSize = lilv_node_as_int(min_size);
722 lilv_nodes_free(min_size_v);
723 lilv_nodes_free(buffer_types);
724 lilv_nodes_free(atom_supports);
726 error << string_compose(
727 "LV2: \"%1\" port %2 has no known data type",
728 lilv_node_as_string(_impl->name), i) << endmsg;
729 throw failed_constructor();
732 if ((flags & PORT_INPUT) && (flags & PORT_CONTROL)) {
733 if (lilv_port_has_property(_impl->plugin, port, _world.ext_causesArtifacts)) {
734 flags |= PORT_NOAUTO;
736 if (lilv_port_has_property(_impl->plugin, port, _world.ext_notAutomatic)) {
737 flags |= PORT_NOAUTO;
739 if (lilv_port_has_property(_impl->plugin, port, _world.ext_expensive)) {
740 flags |= PORT_NOAUTO;
744 if (lilv_port_has_property(_impl->plugin, port, _world.auto_automation_controlled)) {
745 if ((flags & PORT_INPUT) && (flags & PORT_CONTROL)) {
746 flags |= PORT_CTRLED;
749 if (lilv_port_has_property(_impl->plugin, port, _world.auto_automation_controller)) {
750 if ((flags & PORT_INPUT) && (flags & PORT_CONTROL)) {
751 flags |= PORT_CTRLER;
756 _port_flags.push_back(flags);
757 _port_minimumSize.push_back(minimumSize);
758 DEBUG_TRACE(DEBUG::LV2, string_compose("port %1 buffer %2 bytes\n", i, minimumSize));
761 _control_data = new float[num_ports];
762 _shadow_data = new float[num_ports];
763 _defaults = new float[num_ports];
764 _ev_buffers = new LV2_Evbuf*[num_ports];
765 memset(_ev_buffers, 0, sizeof(LV2_Evbuf*) * num_ports);
767 const bool latent = lilv_plugin_has_latency(plugin);
768 const uint32_t latency_index = (latent)
769 ? lilv_plugin_get_latency_port_index(plugin)
772 // Build an array of pointers to special parameter buffers
773 void*** params = new void**[num_ports];
774 for (uint32_t i = 0; i < num_ports; ++i) {
777 _impl->designated_input (LV2_TIME__beatsPerMinute, params, (void**)&_bpm_control_port);
778 _impl->designated_input (LV2_CORE__freeWheeling, params, (void**)&_freewheel_control_port);
780 for (uint32_t i = 0; i < num_ports; ++i) {
781 const LilvPort* port = lilv_plugin_get_port_by_index(plugin, i);
782 const LilvNode* sym = lilv_port_get_symbol(plugin, port);
784 // Store index in map so we can look up index by symbol
785 _port_indices.insert(std::make_pair(lilv_node_as_string(sym), i));
787 // Get range and default value if applicable
788 if (parameter_is_control(i)) {
790 lilv_port_get_range(plugin, port, &def, NULL, NULL);
791 _defaults[i] = def ? lilv_node_as_float(def) : 0.0f;
792 if (lilv_port_has_property (plugin, port, _world.lv2_sampleRate)) {
793 _defaults[i] *= _session.sample_rate ();
797 lilv_instance_connect_port(_impl->instance, i, &_control_data[i]);
799 if (latent && i == latency_index) {
801 lilv_port_get_range(_impl->plugin, port, NULL, NULL, &max);
802 _max_latency = max ? lilv_node_as_float(max) : .02 * _sample_rate;
803 _latency_control_port = &_control_data[i];
804 *_latency_control_port = 0;
807 if (parameter_is_input(i)) {
808 _shadow_data[i] = default_value(i);
810 *params[i] = (void*)&_shadow_data[i];
820 LilvUIs* uis = lilv_plugin_get_uis(plugin);
821 if (lilv_uis_size(uis) > 0) {
823 // Look for embeddable UI
824 LILV_FOREACH(uis, u, uis) {
825 const LilvUI* this_ui = lilv_uis_get(uis, u);
826 const LilvNode* this_ui_type = NULL;
827 if (lilv_ui_is_supported(this_ui,
831 // TODO: Multiple UI support
833 _impl->ui_type = this_ui_type;
838 // Look for Gtk native UI
839 LILV_FOREACH(uis, i, uis) {
840 const LilvUI* ui = lilv_uis_get(uis, i);
841 if (lilv_ui_is_a(ui, _world.ui_GtkUI)) {
843 _impl->ui_type = _world.ui_GtkUI;
849 // If Gtk UI is not available, try to find external UI
851 LILV_FOREACH(uis, i, uis) {
852 const LilvUI* ui = lilv_uis_get(uis, i);
853 if (lilv_ui_is_a(ui, _world.ui_externalkx)) {
855 _impl->ui_type = _world.ui_external;
858 if (lilv_ui_is_a(ui, _world.ui_external)) {
860 _impl->ui_type = _world.ui_external;
866 load_supported_properties(_property_descriptors);
867 allocate_atom_event_buffers();
868 latency_compute_run();
872 LV2Plugin::set_block_size (pframes_t nframes)
874 #ifdef HAVE_LV2_1_2_0
875 if (_impl->opts_iface) {
876 LV2_URID atom_Int = _uri_map.uri_to_id(LV2_ATOM__Int);
877 _impl->block_length = nframes;
878 LV2_Options_Option block_size_option = {
879 LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id ("http://lv2plug.in/ns/ext/buf-size#nominalBlockLength"),
880 sizeof(int32_t), atom_Int, (void*)&_impl->block_length
882 _impl->opts_iface->set (_impl->instance->lv2_handle, &block_size_option);
889 LV2Plugin::requires_fixed_sized_buffers () const
891 /* This controls if Ardour will split the plugin's run()
892 * on automation events in order to pass sample-accurate automation
893 * via standard control-ports.
895 * When returning true Ardour will *not* sub-divide the process-cycle.
896 * Automation events that happen between cycle-start and cycle-end will be
897 * ignored (ctrl values are interpolated to cycle-start).
898 * NB. Atom Sequences are still sample accurate.
900 * Note: This does not guarantee a fixed block-size.
901 * e.g The process cycle may be split when looping, also
902 * the period-size may change any time: see set_block_size()
904 if (get_info()->n_inputs.n_midi() > 0) {
905 /* we don't yet implement midi buffer offsets (for split cycles).
906 * Also connect_and_run() also uses _session.transport_sample() directly
907 * (for BBT) which is not offset for plugin cycle split.
911 return _no_sample_accurate_ctrl;
914 LV2Plugin::~LV2Plugin ()
916 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 destroy\n", name()));
923 std::stringstream ss;
926 MIDI::Name::MidiPatchManager::instance().remove_custom_midnam (ss.str());
930 lilv_instance_free(_impl->instance);
931 lilv_state_free(_impl->state);
932 lilv_node_free(_impl->name);
933 lilv_node_free(_impl->author);
934 #ifdef HAVE_LV2_1_2_0
935 free(_impl->options);
938 free(_impl->queue_draw);
940 free(_impl->bankpatch);
944 free(_log_feature.data);
945 free(_make_path_feature.data);
946 free(_work_schedule_feature.data);
951 delete _state_worker;
953 if (_atom_ev_buffers) {
954 LV2_Evbuf** b = _atom_ev_buffers;
959 free(_atom_ev_buffers);
962 delete [] _control_data;
963 delete [] _shadow_data;
965 delete [] _ev_buffers;
970 LV2Plugin::is_external_ui() const
975 return lilv_ui_is_a(_impl->ui, _world.ui_external) || lilv_ui_is_a(_impl->ui, _world.ui_externalkx);
979 LV2Plugin::is_external_kx() const
984 return lilv_ui_is_a(_impl->ui, _world.ui_externalkx);
988 LV2Plugin::ui_is_resizable () const
990 const LilvNode* s = lilv_ui_get_uri(_impl->ui);
991 LilvNode* p = lilv_new_uri(_world.world, LV2_CORE__optionalFeature);
992 LilvNode* fs = lilv_new_uri(_world.world, LV2_UI__fixedSize);
993 LilvNode* nrs = lilv_new_uri(_world.world, LV2_UI__noUserResize);
995 LilvNodes* fs_matches = lilv_world_find_nodes(_world.world, s, p, fs);
996 LilvNodes* nrs_matches = lilv_world_find_nodes(_world.world, s, p, nrs);
998 lilv_nodes_free(nrs_matches);
999 lilv_nodes_free(fs_matches);
1000 lilv_node_free(nrs);
1004 return !fs_matches && !nrs_matches;
1009 LV2Plugin::has_inline_display () {
1010 return _display_interface ? true : false;
1014 LV2Plugin::inline_display_in_gui () {
1015 return _inline_display_in_gui;
1018 Plugin::Display_Image_Surface*
1019 LV2Plugin::render_inline_display (uint32_t w, uint32_t h) {
1020 if (_display_interface) {
1021 /* Plugin::Display_Image_Surface is identical to
1022 * LV2_Inline_Display_Image_Surface */
1023 return (Plugin::Display_Image_Surface*) _display_interface->render ((void*)_impl->instance->lv2_handle, w, h);
1029 LV2Plugin::has_midnam () {
1030 return _midname_interface ? true : false;
1034 LV2Plugin::read_midnam () {
1036 if (!_midname_interface || !_midnam_dirty) {
1039 char* midnam = _midname_interface->midnam ((void*)_impl->instance->lv2_handle);
1041 std::stringstream ss;
1044 rv = MIDI::Name::MidiPatchManager::instance().update_custom_midnam (ss.str(), midnam);
1048 info << string_compose(_("LV2: update midnam for plugin '%1'"), name ()) << endmsg;
1050 warning << string_compose(_("LV2: Failed to parse midnam of plugin '%1'"), name ()) << endmsg;
1053 _midname_interface->free (midnam);
1056 _midnam_dirty = false;
1062 LV2Plugin::midnam_model () {
1064 if (!_midname_interface) {
1067 char* model = _midname_interface->model ((void*)_impl->instance->lv2_handle);
1071 _midname_interface->free (model);
1077 LV2Plugin::unique_id() const
1079 return lilv_node_as_uri(lilv_plugin_get_uri(_impl->plugin));
1083 LV2Plugin::uri() const
1085 return lilv_node_as_uri(lilv_plugin_get_uri(_impl->plugin));
1089 LV2Plugin::label() const
1091 return lilv_node_as_string(_impl->name);
1095 LV2Plugin::name() const
1097 return lilv_node_as_string(_impl->name);
1101 LV2Plugin::maker() const
1103 return _impl->author ? lilv_node_as_string (_impl->author) : "Unknown";
1107 LV2Plugin::num_ports() const
1109 return lilv_plugin_get_num_ports(_impl->plugin);
1113 LV2Plugin::parameter_count() const
1115 return lilv_plugin_get_num_ports(_impl->plugin);
1119 LV2Plugin::default_value(uint32_t port)
1121 return _defaults[port];
1125 LV2Plugin::port_symbol(uint32_t index) const
1127 const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, index);
1129 error << name() << ": Invalid port index " << index << endmsg;
1132 const LilvNode* sym = lilv_port_get_symbol(_impl->plugin, port);
1133 return lilv_node_as_string(sym);
1137 LV2Plugin::port_index (const char* symbol) const
1139 const map<string, uint32_t>::const_iterator i = _port_indices.find(symbol);
1140 if (i != _port_indices.end()) {
1143 warning << string_compose(_("LV2: Unknown port %1"), symbol) << endmsg;
1144 return (uint32_t)-1;
1149 LV2Plugin::set_parameter(uint32_t which, float val)
1151 DEBUG_TRACE(DEBUG::LV2, string_compose(
1152 "%1 set parameter %2 to %3\n", name(), which, val));
1154 if (which < lilv_plugin_get_num_ports(_impl->plugin)) {
1155 if (get_parameter (which) == val) {
1159 _shadow_data[which] = val;
1161 warning << string_compose(
1162 _("Illegal parameter number used with plugin \"%1\". "
1163 "This is a bug in either %2 or the LV2 plugin <%3>"),
1164 name(), PROGRAM_NAME, unique_id()) << endmsg;
1167 Plugin::set_parameter(which, val);
1171 LV2Plugin::get_parameter(uint32_t which) const
1173 if (parameter_is_input(which)) {
1174 return (float)_shadow_data[which];
1176 return (float)_control_data[which];
1182 LV2Plugin::get_docs() const
1184 LilvNodes* comments = lilv_plugin_get_value(_impl->plugin, _world.rdfs_comment);
1186 const std::string docs(lilv_node_as_string(lilv_nodes_get_first(comments)));
1187 lilv_nodes_free(comments);
1195 LV2Plugin::get_parameter_docs(uint32_t which) const
1197 LilvNodes* comments = lilv_port_get_value(
1199 lilv_plugin_get_port_by_index(_impl->plugin, which),
1200 _world.rdfs_comment);
1203 const std::string docs(lilv_node_as_string(lilv_nodes_get_first(comments)));
1204 lilv_nodes_free(comments);
1212 LV2Plugin::get_layout (uint32_t which, UILayoutHint& h) const
1214 /// TODO lookup port-properties
1215 if (unique_id () != "urn:ardour:a-eq") {
1220 case 0: h.x0 = 0; h.x1 = 1; h.y0 = 2; h.y1 = 3; break; // Frequency L
1221 case 1: h.x0 = 0; h.x1 = 1; h.y0 = 0; h.y1 = 1; break; // Gain L
1222 case 17: h.x0 = 0; h.x1 = 1; h.y0 = 5; h.y1 = 6; break; // enable L
1224 case 2: h.x0 = 1; h.x1 = 3; h.y0 = 2; h.y1 = 3; break; // Frequency 1
1225 case 3: h.x0 = 1; h.x1 = 3; h.y0 = 0; h.y1 = 1; break; // Gain 1
1226 case 4: h.x0 = 1; h.x1 = 3; h.y0 = 1; h.y1 = 2; break; // Bandwidth 1
1227 case 18: h.x0 = 1; h.x1 = 4; h.y0 = 5; h.y1 = 6; break; // enable 1
1229 case 5: h.x0 = 4; h.x1 = 6; h.y0 = 2; h.y1 = 3; break; // Frequency 2
1230 case 6: h.x0 = 4; h.x1 = 6; h.y0 = 0; h.y1 = 1; break; // Gain 2
1231 case 7: h.x0 = 4; h.x1 = 6; h.y0 = 1; h.y1 = 2; break; // Bandwidth 2
1232 case 19: h.x0 = 4; h.x1 = 7; h.y0 = 5; h.y1 = 6; break; // enable 2
1234 case 8: h.x0 = 7; h.x1 = 9; h.y0 = 2; h.y1 = 3; break; // Frequency 3
1235 case 9: h.x0 = 7; h.x1 = 9; h.y0 = 0; h.y1 = 1; break; // Gain 3
1236 case 10: h.x0 = 7; h.x1 = 9; h.y0 = 1; h.y1 = 2; break; // Bandwidth 3
1237 case 20: h.x0 = 7; h.x1 = 10; h.y0 = 5; h.y1 = 6; break; // enable 3
1239 case 11: h.x0 = 10; h.x1 = 12; h.y0 = 2; h.y1 = 3; break; // Frequency 4
1240 case 12: h.x0 = 10; h.x1 = 12; h.y0 = 0; h.y1 = 1; break; // Gain 4
1241 case 13: h.x0 = 10; h.x1 = 12; h.y0 = 1; h.y1 = 2; break; // Bandwidth 4
1242 case 21: h.x0 = 10; h.x1 = 13; h.y0 = 5; h.y1 = 6; break; // enable 4
1244 case 14: h.x0 = 13; h.x1 = 14; h.y0 = 2; h.y1 = 3; break; // Frequency H
1245 case 15: h.x0 = 13; h.x1 = 14; h.y0 = 0; h.y1 = 1; break; // Gain H
1246 case 22: h.x0 = 13; h.x1 = 14; h.y0 = 5; h.y1 = 6; break; // enable H
1248 case 16: h.x0 = 14; h.x1 = 15; h.y0 = 1; h.y1 = 3; break; // Master Gain
1249 case 23: h.x0 = 14; h.x1 = 15; h.y0 = 5; h.y1 = 6; break; // Master Enable
1257 LV2Plugin::nth_parameter(uint32_t n, bool& ok) const
1260 for (uint32_t c = 0, x = 0; x < lilv_plugin_get_num_ports(_impl->plugin); ++x) {
1261 if (parameter_is_control(x)) {
1273 LV2Plugin::extension_data(const char* uri) const
1275 return lilv_instance_get_extension_data(_impl->instance, uri);
1279 LV2Plugin::c_plugin()
1281 return _impl->plugin;
1287 return (const void*)_impl->ui;
1291 LV2Plugin::c_ui_type()
1293 return (const void*)_impl->ui_type;
1296 /** Directory for all plugin state. */
1298 LV2Plugin::plugin_dir() const
1300 if (!_plugin_state_dir.empty ()){
1301 return Glib::build_filename(_plugin_state_dir, _insert_id.to_s());
1303 return Glib::build_filename(_session.plugins_dir(), _insert_id.to_s());
1307 /** Directory for files created by the plugin (except during save). */
1309 LV2Plugin::scratch_dir() const
1311 return Glib::build_filename(plugin_dir(), "scratch");
1314 /** Directory for snapshots of files in the scratch directory. */
1316 LV2Plugin::file_dir() const
1318 return Glib::build_filename(plugin_dir(), "files");
1321 /** Directory to save state snapshot version @c num into. */
1323 LV2Plugin::state_dir(unsigned num) const
1325 return Glib::build_filename(plugin_dir(), string("state") + PBD::to_string (num));
1328 /** Implementation of state:makePath for files created at instantiation time.
1329 * Note this is not used for files created at save time (Lilv deals with that).
1332 LV2Plugin::lv2_state_make_path(LV2_State_Make_Path_Handle handle,
1335 LV2Plugin* me = (LV2Plugin*)handle;
1336 if (me->_insert_id == PBD::ID("0")) {
1337 warning << string_compose(
1338 "File path \"%1\" requested but LV2 %2 has no insert ID",
1339 path, me->name()) << endmsg;
1340 return g_strdup(path);
1343 const std::string abs_path = Glib::build_filename(me->scratch_dir(), path);
1344 const std::string dirname = Glib::path_get_dirname(abs_path);
1345 g_mkdir_with_parents(dirname.c_str(), 0744);
1347 DEBUG_TRACE(DEBUG::LV2, string_compose("new file path %1 => %2\n",
1350 return g_strndup(abs_path.c_str(), abs_path.length());
1354 LV2Plugin::add_state(XMLNode* root) const
1356 assert(_insert_id != PBD::ID("0"));
1361 for (uint32_t i = 0; i < parameter_count(); ++i) {
1362 if (parameter_is_input(i) && parameter_is_control(i)) {
1363 child = new XMLNode("Port");
1364 child->set_property("symbol", port_symbol(i));
1365 child->set_property("value", _shadow_data[i]);
1366 root->add_child_nocopy(*child);
1370 if (!_plugin_state_dir.empty()) {
1371 root->set_property("template-dir", _plugin_state_dir);
1374 if (_has_state_interface) {
1375 // Provisionally increment state version and create directory
1376 const std::string new_dir = state_dir(++_state_version);
1377 // and keep track of it (for templates & archive)
1378 unsigned int saved_state = _state_version;;
1379 g_mkdir_with_parents(new_dir.c_str(), 0744);
1381 LilvState* state = lilv_state_new_from_instance(
1384 _uri_map.urid_map(),
1385 scratch_dir().c_str(),
1387 _session.externals_dir().c_str(),
1390 const_cast<LV2Plugin*>(this),
1394 if (!_plugin_state_dir.empty() || force_state_save
1396 || !lilv_state_equals(state, _impl->state)) {
1397 lilv_state_save(_world.world,
1398 _uri_map.urid_map(),
1399 _uri_map.urid_unmap(),
1405 if (force_state_save) {
1406 // archive or save-as
1407 lilv_state_free(state);
1410 else if (_plugin_state_dir.empty()) {
1411 // normal session save
1412 lilv_state_free(_impl->state);
1413 _impl->state = state;
1415 // template save (dedicated state-dir)
1416 lilv_state_free(state);
1420 // State is identical, decrement version and nuke directory
1421 lilv_state_free(state);
1422 PBD::remove_directory(new_dir);
1424 saved_state = _state_version;
1427 root->set_property("state-dir", string("state") + PBD::to_string (saved_state));
1431 // TODO: Once we can rely on lilv 0.16.0, lilv_world_get can replace this
1433 get_value(LilvWorld* world, const LilvNode* subject, const LilvNode* predicate)
1435 LilvNodes* vs = lilv_world_find_nodes(world, subject, predicate, NULL);
1437 LilvNode* node = lilv_node_duplicate(lilv_nodes_get_first(vs));
1438 lilv_nodes_free(vs);
1445 LV2Plugin::find_presets()
1447 LilvNode* lv2_appliesTo = lilv_new_uri(_world.world, LV2_CORE__appliesTo);
1448 LilvNode* pset_Preset = lilv_new_uri(_world.world, LV2_PRESETS__Preset);
1449 LilvNode* rdfs_label = lilv_new_uri(_world.world, LILV_NS_RDFS "label");
1451 LilvNodes* presets = lilv_plugin_get_related(_impl->plugin, pset_Preset);
1452 LILV_FOREACH(nodes, i, presets) {
1453 const LilvNode* preset = lilv_nodes_get(presets, i);
1454 lilv_world_load_resource(_world.world, preset);
1455 LilvNode* name = get_value(_world.world, preset, rdfs_label);
1456 bool userpreset = true; // TODO
1458 _presets.insert(std::make_pair(lilv_node_as_string(preset),
1459 Plugin::PresetRecord(
1460 lilv_node_as_string(preset),
1461 lilv_node_as_string(name),
1463 lilv_node_free(name);
1465 warning << string_compose(
1466 _("Plugin \"%1\" preset \"%2\" is missing a label\n"),
1467 lilv_node_as_string(lilv_plugin_get_uri(_impl->plugin)),
1468 lilv_node_as_string(preset)) << endmsg;
1471 lilv_nodes_free(presets);
1473 lilv_node_free(rdfs_label);
1474 lilv_node_free(pset_Preset);
1475 lilv_node_free(lv2_appliesTo);
1479 set_port_value(const char* port_symbol,
1485 LV2Plugin* self = (LV2Plugin*)user_data;
1486 if (type != 0 && type != URIMap::instance().urids.atom_Float) {
1487 return; // TODO: Support non-float ports
1490 const uint32_t port_index = self->port_index(port_symbol);
1491 if (port_index != (uint32_t)-1) {
1492 self->set_parameter(port_index, *(const float*)value);
1493 self->PresetPortSetValue (port_index, *(const float*)value); /* EMIT SIGNAL */
1498 LV2Plugin::load_preset(PresetRecord r)
1500 LilvWorld* world = _world.world;
1501 LilvNode* pset = lilv_new_uri(world, r.uri.c_str());
1502 LilvState* state = lilv_state_new_from_world(world, _uri_map.urid_map(), pset);
1504 const LV2_Feature* state_features[2] = { NULL, NULL };
1505 LV2_Worker_Schedule schedule = { _state_worker, work_schedule };
1506 const LV2_Feature state_sched_feature = { LV2_WORKER__schedule, &schedule };
1507 if (_state_worker) {
1508 state_features[0] = &state_sched_feature;
1512 lilv_state_restore(state, _impl->instance, set_port_value, this, 0, state_features);
1513 lilv_state_free(state);
1514 Plugin::load_preset(r);
1517 lilv_node_free(pset);
1522 ARDOUR::lv2plugin_get_port_value(const char* port_symbol,
1527 LV2Plugin *plugin = (LV2Plugin *) user_data;
1529 uint32_t index = plugin->port_index(port_symbol);
1530 if (index != (uint32_t) -1) {
1531 if (plugin->parameter_is_input(index) && plugin->parameter_is_control(index)) {
1533 *size = sizeof(float);
1534 *type = plugin->_uri_map.uri_to_id(LV2_ATOM__Float);
1535 value = &plugin->_shadow_data[index];
1547 LV2Plugin::do_save_preset(string name)
1549 LilvNode* plug_name = lilv_plugin_get_name(_impl->plugin);
1550 const string prefix = legalize_for_uri(lilv_node_as_string(plug_name));
1551 const string base_name = legalize_for_uri(name);
1552 const string file_name = base_name + ".ttl";
1553 #ifdef PLATFORM_WINDOWS
1554 /* http://lv2plug.in/pages/filesystem-hierarchy-standard.html */
1555 std::string appdata = PBD::get_win_special_folder_path (CSIDL_APPDATA);
1556 if (appdata.empty ()) {
1557 // TODO consider a fallback location
1560 const string bundle = Glib::build_filename (
1561 appdata, "LV2", prefix + "_" + base_name + ".lv2");
1563 /* while macOS/OSX user-specific path is
1565 * $HOME/Library/Audio/Plug-Ins/LV2/
1567 * liblilv's LV2 search path on all unices does include ~/.lv2/
1568 * Ardour has been saving lv2 presets to ~/.lv2 for along time,
1569 * so just keep them there.
1571 const string bundle = Glib::build_filename(
1572 Glib::get_home_dir(),
1573 Glib::build_filename(".lv2", prefix + "_" + base_name + ".lv2"));
1576 #ifdef HAVE_LILV_0_21_3
1577 /* delete reference to old preset (if any) */
1578 const PresetRecord* r = preset_by_label(name);
1580 LilvNode* pset = lilv_new_uri (_world.world, r->uri.c_str());
1582 lilv_world_unload_resource (_world.world, pset);
1583 lilv_node_free(pset);
1588 LilvState* state = lilv_state_new_from_instance(
1591 _uri_map.urid_map(),
1592 scratch_dir().c_str(), // file_dir
1593 bundle.c_str(), // copy_dir
1594 bundle.c_str(), // link_dir
1595 bundle.c_str(), // save_dir
1596 lv2plugin_get_port_value, // get_value
1597 (void*)this, // user_data
1598 LV2_STATE_IS_POD|LV2_STATE_IS_PORTABLE, // flags
1599 _features // features
1602 lilv_state_set_label(state, name.c_str());
1604 _world.world, // world
1605 _uri_map.urid_map(), // map
1606 _uri_map.urid_unmap(), // unmap
1608 NULL, // uri (NULL = use file URI)
1609 bundle.c_str(), // dir
1610 file_name.c_str() // filename
1613 lilv_state_free(state);
1615 std::string uri = Glib::filename_to_uri(Glib::build_filename(bundle, file_name));
1616 LilvNode *node_bundle = lilv_new_uri(_world.world, Glib::filename_to_uri(Glib::build_filename(bundle, "/")).c_str());
1617 LilvNode *node_preset = lilv_new_uri(_world.world, uri.c_str());
1618 #ifdef HAVE_LILV_0_21_3
1619 lilv_world_unload_resource(_world.world, node_preset);
1620 lilv_world_unload_bundle(_world.world, node_bundle);
1622 lilv_world_load_bundle(_world.world, node_bundle);
1623 lilv_world_load_resource(_world.world, node_preset);
1624 lilv_node_free(node_bundle);
1625 lilv_node_free(node_preset);
1626 lilv_node_free(plug_name);
1631 LV2Plugin::do_remove_preset(string name)
1633 #ifdef HAVE_LILV_0_21_3
1634 /* Look up preset record by label (FIXME: ick, label as ID) */
1635 const PresetRecord* r = preset_by_label(name);
1640 /* Load a LilvState for the preset. */
1641 LilvWorld* world = _world.world;
1642 LilvNode* pset = lilv_new_uri(world, r->uri.c_str());
1643 LilvState* state = lilv_state_new_from_world(world, _uri_map.urid_map(), pset);
1645 lilv_node_free(pset);
1649 /* Unload preset from world. */
1650 lilv_world_unload_resource(world, pset);
1652 /* Delete it from the file system. This will remove the preset file and the entry
1653 from the manifest. If this results in an empty manifest (i.e. the
1654 preset is the only thing in the bundle), then the bundle is removed. */
1655 lilv_state_delete(world, state);
1657 lilv_state_free(state);
1658 lilv_node_free(pset);
1660 /* Without lilv_state_delete(), we could delete the preset file, but this
1661 would leave a broken bundle/manifest around, so the preset would still
1662 be visible, but broken. Naively deleting a bundle is too dangerous, so
1663 we simply do not support preset deletion with older Lilv */
1667 LV2Plugin::has_editor() const
1669 return _impl->ui != NULL;
1673 LV2Plugin::has_message_output() const
1675 for (uint32_t i = 0; i < num_ports(); ++i) {
1676 if ((_port_flags[i] & PORT_SEQUENCE) &&
1677 (_port_flags[i] & PORT_OUTPUT)) {
1685 LV2Plugin::write_to(RingBuffer<uint8_t>* dest,
1689 const uint8_t* body)
1691 const uint32_t buf_size = sizeof(UIMessage) + size;
1692 vector<uint8_t> buf(buf_size);
1694 UIMessage* msg = (UIMessage*)&buf[0];
1696 msg->protocol = protocol;
1698 memcpy(msg + 1, body, size);
1700 return (dest->write(&buf[0], buf_size) == buf_size);
1704 LV2Plugin::write_from_ui(uint32_t index,
1707 const uint8_t* body)
1710 size_t rbs = _session.engine().raw_buffer_size(DataType::MIDI) * NBUFS;
1711 /* buffer data communication from plugin UI to plugin instance.
1712 * this buffer needs to potentially hold
1713 * (port's minimumSize) * (audio-periods) / (UI-periods)
1716 * e.g 48kSPS / 128fpp -> audio-periods = 375 Hz
1717 * ui-periods = 25 Hz (SuperRapidScreenUpdate)
1718 * default minimumSize = 32K (see LV2Plugin::allocate_atom_event_buffers()
1720 * it is NOT safe to overflow (msg.size will be misinterpreted)
1722 uint32_t bufsiz = 32768;
1723 if (_atom_ev_buffers && _atom_ev_buffers[0]) {
1724 bufsiz = lv2_evbuf_get_capacity(_atom_ev_buffers[0]);
1726 int fact = ceilf(_session.sample_rate () / 3000.f);
1727 rbs = max((size_t) bufsiz * std::max (8, fact), rbs);
1728 _from_ui = new RingBuffer<uint8_t>(rbs);
1731 if (!write_to(_from_ui, index, protocol, size, body)) {
1732 error << "Error writing from UI to plugin" << endmsg;
1739 LV2Plugin::write_to_ui(uint32_t index,
1742 const uint8_t* body)
1744 if (!write_to(_to_ui, index, protocol, size, body)) {
1745 error << "Error writing from plugin to UI" << endmsg;
1752 forge_variant(LV2_Atom_Forge* forge, const Variant& value)
1754 switch (value.type()) {
1755 case Variant::NOTHING:
1757 case Variant::BEATS:
1758 // No atom type for this, just forge a double
1759 lv2_atom_forge_double(forge, value.get_beats().to_double());
1762 lv2_atom_forge_bool(forge, value.get_bool());
1764 case Variant::DOUBLE:
1765 lv2_atom_forge_double(forge, value.get_double());
1767 case Variant::FLOAT:
1768 lv2_atom_forge_float(forge, value.get_float());
1771 lv2_atom_forge_int(forge, value.get_int());
1774 lv2_atom_forge_long(forge, value.get_long());
1777 lv2_atom_forge_path(
1778 forge, value.get_path().c_str(), value.get_path().size());
1780 case Variant::STRING:
1781 lv2_atom_forge_string(
1782 forge, value.get_string().c_str(), value.get_string().size());
1786 forge, value.get_uri().c_str(), value.get_uri().size());
1791 /** Get a variant type from a URI, return false iff no match found. */
1793 uri_to_variant_type(const std::string& uri, Variant::Type& type)
1795 if (uri == LV2_ATOM__Bool) {
1796 type = Variant::BOOL;
1797 } else if (uri == LV2_ATOM__Double) {
1798 type = Variant::DOUBLE;
1799 } else if (uri == LV2_ATOM__Float) {
1800 type = Variant::FLOAT;
1801 } else if (uri == LV2_ATOM__Int) {
1802 type = Variant::INT;
1803 } else if (uri == LV2_ATOM__Long) {
1804 type = Variant::LONG;
1805 } else if (uri == LV2_ATOM__Path) {
1806 type = Variant::PATH;
1807 } else if (uri == LV2_ATOM__String) {
1808 type = Variant::STRING;
1809 } else if (uri == LV2_ATOM__URI) {
1810 type = Variant::URI;
1818 LV2Plugin::set_property(uint32_t key, const Variant& value)
1820 if (_patch_port_in_index == (uint32_t)-1) {
1821 error << "LV2: set_property called with unset patch_port_in_index" << endmsg;
1823 } else if (value.type() == Variant::NOTHING) {
1824 error << "LV2: set_property called with void value" << endmsg;
1828 // Set up forge to write to temporary buffer on the stack
1829 LV2_Atom_Forge* forge = &_impl->ui_forge;
1830 LV2_Atom_Forge_Frame sample;
1831 uint8_t buf[PATH_MAX]; // Ought to be enough for anyone...
1833 lv2_atom_forge_set_buffer(forge, buf, sizeof(buf));
1835 // Serialize patch:Set message to set property
1836 #ifdef HAVE_LV2_1_10_0
1837 lv2_atom_forge_object(forge, &sample, 0, _uri_map.urids.patch_Set);
1838 lv2_atom_forge_key(forge, _uri_map.urids.patch_property);
1839 lv2_atom_forge_urid(forge, key);
1840 lv2_atom_forge_key(forge, _uri_map.urids.patch_value);
1842 lv2_atom_forge_blank(forge, &sample, 0, _uri_map.urids.patch_Set);
1843 lv2_atom_forge_property_head(forge, _uri_map.urids.patch_property, 0);
1844 lv2_atom_forge_urid(forge, key);
1845 lv2_atom_forge_property_head(forge, _uri_map.urids.patch_value, 0);
1848 forge_variant(forge, value);
1850 // Write message to UI=>Plugin ring
1851 const LV2_Atom* const atom = (const LV2_Atom*)buf;
1852 write_from_ui(_patch_port_in_index,
1853 _uri_map.urids.atom_eventTransfer,
1854 lv2_atom_total_size(atom),
1855 (const uint8_t*)atom);
1858 const ParameterDescriptor&
1859 LV2Plugin::get_property_descriptor(uint32_t id) const
1861 PropertyDescriptors::const_iterator p = _property_descriptors.find(id);
1862 if (p != _property_descriptors.end()) {
1865 return Plugin::get_property_descriptor(id);
1869 load_parameter_descriptor_units(LilvWorld* lworld, ParameterDescriptor& desc, const LilvNodes* units)
1871 if (lilv_nodes_contains(units, _world.units_midiNote)) {
1872 desc.unit = ParameterDescriptor::MIDI_NOTE;
1873 } else if (lilv_nodes_contains(units, _world.units_db)) {
1874 desc.unit = ParameterDescriptor::DB;
1875 } else if (lilv_nodes_contains(units, _world.units_hz)) {
1876 desc.unit = ParameterDescriptor::HZ;
1878 if (lilv_nodes_size(units) > 0) {
1879 const LilvNode* unit = lilv_nodes_get_first(units);
1880 LilvNode* render = get_value(lworld, unit, _world.units_render);
1882 desc.print_fmt = lilv_node_as_string(render);
1883 /* override lilv's default "%f" format */
1884 if (desc.integer_step) {
1885 replace_all (desc.print_fmt, "%f", "%.0f");
1886 } else if (desc.upper - desc.lower >= 1000) {
1887 replace_all (desc.print_fmt, "%f", "%.1f");
1888 } else if (desc.upper - desc.lower >= 100) {
1889 replace_all (desc.print_fmt, "%f", "%.2f");
1891 replace_all (desc.print_fmt, "%f", "%.3f");
1893 lilv_node_free(render);
1899 load_parameter_descriptor(LV2World& world,
1900 ParameterDescriptor& desc,
1901 Variant::Type datatype,
1902 const LilvNode* subject)
1904 LilvWorld* lworld = _world.world;
1905 LilvNode* label = get_value(lworld, subject, _world.rdfs_label);
1906 LilvNode* def = get_value(lworld, subject, _world.lv2_default);
1907 LilvNode* minimum = get_value(lworld, subject, _world.lv2_minimum);
1908 LilvNode* maximum = get_value(lworld, subject, _world.lv2_maximum);
1909 LilvNodes* units = lilv_world_find_nodes(lworld, subject, _world.units_unit, NULL);
1911 desc.label = lilv_node_as_string(label);
1914 if (lilv_node_is_float(def)) {
1915 desc.normal = lilv_node_as_float(def);
1916 } else if (lilv_node_is_int(def)) {
1917 desc.normal = lilv_node_as_int(def);
1921 if (lilv_node_is_float(minimum)) {
1922 desc.lower = lilv_node_as_float(minimum);
1923 } else if (lilv_node_is_int(minimum)) {
1924 desc.lower = lilv_node_as_int(minimum);
1928 if (lilv_node_is_float(maximum)) {
1929 desc.upper = lilv_node_as_float(maximum);
1930 } else if (lilv_node_is_int(maximum)) {
1931 desc.upper = lilv_node_as_int(maximum);
1934 load_parameter_descriptor_units(lworld, desc, units);
1935 desc.datatype = datatype;
1936 desc.toggled |= datatype == Variant::BOOL;
1937 desc.integer_step |= datatype == Variant::INT || datatype == Variant::LONG;
1938 desc.update_steps();
1940 lilv_nodes_free(units);
1941 lilv_node_free(label);
1942 lilv_node_free(def);
1943 lilv_node_free(minimum);
1944 lilv_node_free(maximum);
1948 LV2Plugin::load_supported_properties(PropertyDescriptors& descs)
1950 LilvWorld* lworld = _world.world;
1951 const LilvNode* subject = lilv_plugin_get_uri(_impl->plugin);
1952 LilvNodes* properties = lilv_world_find_nodes(
1953 lworld, subject, _world.patch_writable, NULL);
1954 LILV_FOREACH(nodes, p, properties) {
1955 // Get label and range
1956 const LilvNode* prop = lilv_nodes_get(properties, p);
1957 LilvNode* range = get_value(lworld, prop, _world.rdfs_range);
1959 warning << string_compose(_("LV2: property <%1> has no range datatype, ignoring"),
1960 lilv_node_as_uri(prop)) << endmsg;
1964 // Convert range to variant type (TODO: support for multiple range types)
1965 Variant::Type datatype;
1966 if (!uri_to_variant_type(lilv_node_as_uri(range), datatype)) {
1967 error << string_compose(_("LV2: property <%1> has unsupported datatype <%1>"),
1968 lilv_node_as_uri(prop), lilv_node_as_uri(range)) << endmsg;
1972 // Add description to result
1973 ParameterDescriptor desc;
1974 desc.key = _uri_map.uri_to_id(lilv_node_as_uri(prop));
1975 desc.datatype = datatype;
1976 load_parameter_descriptor(_world, desc, datatype, prop);
1977 descs.insert(std::make_pair(desc.key, desc));
1979 lilv_node_free(range);
1981 lilv_nodes_free(properties);
1985 LV2Plugin::announce_property_values()
1987 if (_patch_port_in_index == (uint32_t)-1) {
1991 // Set up forge to write to temporary buffer on the stack
1992 LV2_Atom_Forge* forge = &_impl->ui_forge;
1993 LV2_Atom_Forge_Frame sample;
1994 uint8_t buf[PATH_MAX]; // Ought to be enough for anyone...
1996 lv2_atom_forge_set_buffer(forge, buf, sizeof(buf));
1998 // Serialize patch:Get message with no subject (implicitly plugin instance)
1999 #ifdef HAVE_LV2_1_10_0
2000 lv2_atom_forge_object(forge, &sample, 0, _uri_map.urids.patch_Get);
2002 lv2_atom_forge_blank(forge, &sample, 0, _uri_map.urids.patch_Get);
2005 // Write message to UI=>Plugin ring
2006 const LV2_Atom* const atom = (const LV2_Atom*)buf;
2007 write_from_ui(_patch_port_in_index,
2008 _uri_map.urids.atom_eventTransfer,
2009 lv2_atom_total_size(atom),
2010 (const uint8_t*)atom);
2014 LV2Plugin::enable_ui_emission()
2017 /* see note in LV2Plugin::write_from_ui() */
2018 uint32_t bufsiz = 32768;
2019 if (_atom_ev_buffers && _atom_ev_buffers[0]) {
2020 bufsiz = lv2_evbuf_get_capacity(_atom_ev_buffers[0]);
2022 size_t rbs = _session.engine().raw_buffer_size(DataType::MIDI) * NBUFS;
2023 rbs = max((size_t) bufsiz * 8, rbs);
2024 _to_ui = new RingBuffer<uint8_t>(rbs);
2029 LV2Plugin::emit_to_ui(void* controller, UIMessageSink sink)
2035 uint32_t read_space = _to_ui->read_space();
2036 while (read_space > sizeof(UIMessage)) {
2038 if (_to_ui->read((uint8_t*)&msg, sizeof(msg)) != sizeof(msg)) {
2039 error << "Error reading from Plugin=>UI RingBuffer" << endmsg;
2042 vector<uint8_t> body(msg.size);
2043 if (_to_ui->read(&body[0], msg.size) != msg.size) {
2044 error << "Error reading from Plugin=>UI RingBuffer" << endmsg;
2048 sink(controller, msg.index, msg.size, msg.protocol, &body[0]);
2050 read_space -= sizeof(msg) + msg.size;
2055 LV2Plugin::work(Worker& worker, uint32_t size, const void* data)
2057 Glib::Threads::Mutex::Lock lm(_work_mutex);
2058 return _impl->work_iface->work(
2059 _impl->instance->lv2_handle, work_respond, &worker, size, data);
2063 LV2Plugin::work_response(uint32_t size, const void* data)
2065 return _impl->work_iface->work_response(
2066 _impl->instance->lv2_handle, size, data);
2070 LV2Plugin::set_insert_id(PBD::ID id)
2072 if (_insert_id == "0") {
2074 } else if (_insert_id != id) {
2075 lilv_state_free(_impl->state);
2076 _impl->state = NULL;
2082 LV2Plugin::set_state_dir (const std::string& d)
2084 _plugin_state_dir = d;
2088 LV2Plugin::set_state(const XMLNode& node, int version)
2091 XMLNodeConstIterator iter;
2095 if (node.name() != state_node_name()) {
2096 error << _("Bad node sent to LV2Plugin::set_state") << endmsg;
2100 #ifndef NO_PLUGIN_STATE
2102 if (version < 3000) {
2103 nodes = node.children("port");
2105 nodes = node.children("Port");
2108 for (iter = nodes.begin(); iter != nodes.end(); ++iter) {
2113 if (!child->get_property("symbol", sym)) {
2114 warning << _("LV2: port has no symbol, ignored") << endmsg;
2118 map<string, uint32_t>::iterator i = _port_indices.find(sym);
2122 if (i != _port_indices.end()) {
2123 port_id = i->second;
2125 warning << _("LV2: port has unknown index, ignored") << endmsg;
2130 if (!child->get_property("value", val)) {
2131 warning << _("LV2: port has no value, ignored") << endmsg;
2135 set_parameter(port_id, val);
2138 std::string template_dir;
2139 if (node.get_property("template-dir", template_dir)) {
2140 set_state_dir (template_dir);
2144 std::string state_dir;
2145 if (node.get_property("state-dir", state_dir) != 0) {
2146 if (sscanf(state_dir.c_str(), "state%u", &_state_version) != 1) {
2147 error << string_compose(
2148 "LV2: failed to parse state version from \"%1\"",
2149 state_dir) << endmsg;
2152 std::string state_file = Glib::build_filename(
2154 Glib::build_filename(state_dir, "state.ttl"));
2156 LilvState* state = lilv_state_new_from_file(
2157 _world.world, _uri_map.urid_map(), NULL, state_file.c_str());
2159 lilv_state_restore(state, _impl->instance, NULL, NULL, 0, NULL);
2160 lilv_state_free(_impl->state);
2161 _impl->state = state;
2164 if (!_plugin_state_dir.empty ()) {
2165 // force save with session, next time (increment counter)
2166 lilv_state_free (_impl->state);
2167 _impl->state = NULL;
2171 latency_compute_run();
2174 return Plugin::set_state(node, version);
2178 LV2Plugin::get_parameter_descriptor(uint32_t which, ParameterDescriptor& desc) const
2180 const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, which);
2182 error << string_compose("LV2: get descriptor of non-existent port %1", which)
2187 LilvNodes* portunits;
2188 LilvNode *def, *min, *max;
2189 lilv_port_get_range(_impl->plugin, port, &def, &min, &max);
2190 portunits = lilv_port_get_value(_impl->plugin, port, _world.units_unit);
2192 LilvNode* steps = lilv_port_get(_impl->plugin, port, _world.ext_rangeSteps);
2194 // TODO: Once we can rely on lilv 0.18.0 being present,
2195 // load_parameter_descriptor() can be used for ports as well
2196 desc.integer_step = lilv_port_has_property(_impl->plugin, port, _world.lv2_integer);
2197 desc.toggled = lilv_port_has_property(_impl->plugin, port, _world.lv2_toggled);
2198 desc.logarithmic = lilv_port_has_property(_impl->plugin, port, _world.ext_logarithmic);
2199 desc.sr_dependent = lilv_port_has_property(_impl->plugin, port, _world.lv2_sampleRate);
2200 desc.label = lilv_node_as_string(lilv_port_get_name(_impl->plugin, port));
2201 desc.normal = def ? lilv_node_as_float(def) : 0.0f;
2202 desc.lower = min ? lilv_node_as_float(min) : 0.0f;
2203 desc.upper = max ? lilv_node_as_float(max) : 1.0f;
2204 load_parameter_descriptor_units(_world.world, desc, portunits);
2206 if (desc.sr_dependent) {
2207 desc.lower *= _session.sample_rate ();
2208 desc.upper *= _session.sample_rate ();
2211 desc.enumeration = lilv_port_has_property(_impl->plugin, port, _world.lv2_enumeration);
2212 desc.scale_points = get_scale_points(which);
2215 desc.rangesteps = lilv_node_as_float (steps);
2218 desc.update_steps();
2220 lilv_node_free(def);
2221 lilv_node_free(min);
2222 lilv_node_free(max);
2223 lilv_node_free(steps);
2224 lilv_nodes_free(portunits);
2229 Plugin::IOPortDescription
2230 LV2Plugin::describe_io_port (ARDOUR::DataType dt, bool input, uint32_t id) const
2232 PortFlags match = 0;
2234 case DataType::AUDIO:
2237 case DataType::MIDI:
2238 match = PORT_SEQUENCE | PORT_MIDI; // ignore old PORT_EVENT
2241 return Plugin::IOPortDescription ("?");
2245 match |= PORT_INPUT;
2247 match |= PORT_OUTPUT;
2251 uint32_t idx = UINT32_MAX;
2253 uint32_t const num_ports = parameter_count();
2254 for (uint32_t port_index = 0; port_index < num_ports; ++port_index) {
2255 PortFlags flags = _port_flags[port_index];
2256 if ((flags & match) == match) {
2263 if (idx == UINT32_MAX) {
2264 return Plugin::IOPortDescription ("?");
2267 const LilvPort* pport = lilv_plugin_get_port_by_index (_impl->plugin, idx);
2269 LilvNode* name = lilv_port_get_name(_impl->plugin, pport);
2270 Plugin::IOPortDescription iod (lilv_node_as_string (name));
2271 lilv_node_free(name);
2273 /* get the port's pg:group */
2274 LilvNodes* groups = lilv_port_get_value (_impl->plugin, pport, _world.groups_group);
2275 if (lilv_nodes_size (groups) > 0) {
2276 const LilvNode* group = lilv_nodes_get_first (groups);
2277 LilvNodes* grouplabel = lilv_world_find_nodes (_world.world, group, _world.rdfs_label, NULL);
2279 /* get the name of the port-group */
2280 if (lilv_nodes_size (grouplabel) > 0) {
2281 const LilvNode* grpname = lilv_nodes_get_first (grouplabel);
2282 iod.group_name = lilv_node_as_string (grpname);
2284 lilv_nodes_free (grouplabel);
2286 /* get all port designations.
2287 * we're interested in e.g. lv2:designation pg:right */
2288 LilvNodes* designations = lilv_port_get_value (_impl->plugin, pport, _world.lv2_designation);
2289 if (lilv_nodes_size (designations) > 0) {
2290 /* get all pg:elements of the pg:group */
2291 LilvNodes* group_childs = lilv_world_find_nodes (_world.world, group, _world.groups_element, NULL);
2292 if (lilv_nodes_size (group_childs) > 0) {
2293 /* iterate over all port designations .. */
2294 LILV_FOREACH (nodes, i, designations) {
2295 const LilvNode* designation = lilv_nodes_get (designations, i);
2296 /* match the lv2:designation's element against the port-group's element */
2297 LILV_FOREACH (nodes, j, group_childs) {
2298 const LilvNode* group_element = lilv_nodes_get (group_childs, j);
2299 LilvNodes* elem = lilv_world_find_nodes (_world.world, group_element, _world.lv2_designation, designation);
2300 /* found it. Now look up the index (channel-number) of the pg:Element */
2301 if (lilv_nodes_size (elem) > 0) {
2302 LilvNodes* idx = lilv_world_find_nodes (_world.world, lilv_nodes_get_first (elem), _world.lv2_index, NULL);
2303 if (lilv_node_is_int (lilv_nodes_get_first (idx))) {
2304 iod.group_channel = lilv_node_as_int(lilv_nodes_get_first (idx));
2311 lilv_nodes_free (groups);
2312 lilv_nodes_free (designations);
2315 if (lilv_port_has_property(_impl->plugin, pport, _world.lv2_isSideChain)) {
2316 iod.is_sidechain = true;
2322 LV2Plugin::describe_parameter(Evoral::Parameter which)
2324 if (( which.type() == PluginAutomation) && ( which.id() < parameter_count()) ) {
2326 if (lilv_port_has_property(_impl->plugin,
2327 lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.ext_notOnGUI)) {
2328 return X_("hidden");
2331 if (lilv_port_has_property(_impl->plugin,
2332 lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.lv2_freewheeling)) {
2333 return X_("hidden");
2336 if (lilv_port_has_property(_impl->plugin,
2337 lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.lv2_reportsLatency)) {
2338 return X_("latency");
2341 LilvNode* name = lilv_port_get_name(_impl->plugin,
2342 lilv_plugin_get_port_by_index(_impl->plugin, which.id()));
2343 string ret(lilv_node_as_string(name));
2344 lilv_node_free(name);
2352 LV2Plugin::max_latency () const
2354 return _max_latency;
2358 LV2Plugin::signal_latency() const
2360 if (_latency_control_port) {
2361 return (samplecnt_t)floor(*_latency_control_port);
2367 set<Evoral::Parameter>
2368 LV2Plugin::automatable() const
2370 set<Evoral::Parameter> ret;
2372 for (uint32_t i = 0; i < parameter_count(); ++i) {
2373 if (parameter_is_input(i) && parameter_is_control(i) && !(_port_flags[i] & PORT_NOAUTO)) {
2374 ret.insert(ret.end(), Evoral::Parameter(PluginAutomation, 0, i));
2378 for (PropertyDescriptors::const_iterator p = _property_descriptors.begin();
2379 p != _property_descriptors.end();
2381 ret.insert(ret.end(), Evoral::Parameter(PluginPropertyAutomation, 0, p->first));
2387 LV2Plugin::set_automation_control (uint32_t i, boost::shared_ptr<AutomationControl> c)
2389 if ((_port_flags[i] & (PORT_CTRLED | PORT_CTRLER))) {
2390 DEBUG_TRACE(DEBUG::LV2Automate, string_compose ("Ctrl Port %1\n", i));
2391 _ctrl_map [i] = AutomationCtrlPtr (new AutomationCtrl(c));
2395 LV2Plugin::AutomationCtrlPtr
2396 LV2Plugin::get_automation_control (uint32_t i)
2398 if (_ctrl_map.find (i) == _ctrl_map.end()) {
2399 return AutomationCtrlPtr ();
2401 return _ctrl_map[i];
2405 LV2Plugin::activate()
2407 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 activate\n", name()));
2409 if (!_was_activated) {
2410 lilv_instance_activate(_impl->instance);
2411 _was_activated = true;
2416 LV2Plugin::deactivate()
2418 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 deactivate\n", name()));
2420 if (_was_activated) {
2421 lilv_instance_deactivate(_impl->instance);
2422 _was_activated = false;
2427 LV2Plugin::cleanup()
2429 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 cleanup\n", name()));
2432 lilv_instance_free(_impl->instance);
2433 _impl->instance = NULL;
2437 LV2Plugin::allocate_atom_event_buffers()
2439 /* reserve local scratch buffers for ATOM event-queues */
2440 const LilvPlugin* p = _impl->plugin;
2442 /* count non-MIDI atom event-ports
2443 * TODO: nicely ask drobilla to make a lilv_ call for that
2445 int count_atom_out = 0;
2446 int count_atom_in = 0;
2447 int minimumSize = 32768; // TODO use a per-port minimum-size
2448 for (uint32_t i = 0; i < lilv_plugin_get_num_ports(p); ++i) {
2449 const LilvPort* port = lilv_plugin_get_port_by_index(p, i);
2450 if (lilv_port_is_a(p, port, _world.atom_AtomPort)) {
2451 LilvNodes* buffer_types = lilv_port_get_value(
2452 p, port, _world.atom_bufferType);
2453 LilvNodes* atom_supports = lilv_port_get_value(
2454 p, port, _world.atom_supports);
2456 if (lilv_nodes_contains(buffer_types, _world.atom_Sequence)) {
2457 if (lilv_port_is_a(p, port, _world.lv2_InputPort)) {
2460 if (lilv_port_is_a(p, port, _world.lv2_OutputPort)) {
2463 LilvNodes* min_size_v = lilv_port_get_value(_impl->plugin, port, _world.rsz_minimumSize);
2464 LilvNode* min_size = min_size_v ? lilv_nodes_get_first(min_size_v) : NULL;
2465 if (min_size && lilv_node_is_int(min_size)) {
2466 minimumSize = std::max(minimumSize, lilv_node_as_int(min_size));
2468 lilv_nodes_free(min_size_v);
2470 lilv_nodes_free(buffer_types);
2471 lilv_nodes_free(atom_supports);
2475 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 need buffers for %2 atom-in and %3 atom-out event-ports\n",
2476 name(), count_atom_in, count_atom_out));
2478 const int total_atom_buffers = (count_atom_in + count_atom_out);
2479 if (_atom_ev_buffers || total_atom_buffers == 0) {
2483 DEBUG_TRACE(DEBUG::LV2, string_compose("allocate %1 atom_ev_buffers of %2 bytes\n", total_atom_buffers, minimumSize));
2484 _atom_ev_buffers = (LV2_Evbuf**) malloc((total_atom_buffers + 1) * sizeof(LV2_Evbuf*));
2485 for (int i = 0; i < total_atom_buffers; ++i ) {
2486 _atom_ev_buffers[i] = lv2_evbuf_new(minimumSize, LV2_EVBUF_ATOM,
2487 _uri_map.urids.atom_Chunk, _uri_map.urids.atom_Sequence);
2489 _atom_ev_buffers[total_atom_buffers] = 0;
2493 /** Write an ardour position/time/tempo/meter as an LV2 event.
2494 * @return true on success.
2497 write_position(LV2_Atom_Forge* forge,
2499 const TempoMetric& t,
2500 Timecode::BBT_Time& bbt,
2503 samplepos_t position,
2506 const URIMap::URIDs& urids = URIMap::instance().urids;
2508 uint8_t pos_buf[256];
2509 lv2_atom_forge_set_buffer(forge, pos_buf, sizeof(pos_buf));
2510 LV2_Atom_Forge_Frame sample;
2511 #ifdef HAVE_LV2_1_10_0
2512 lv2_atom_forge_object(forge, &sample, 0, urids.time_Position);
2513 lv2_atom_forge_key(forge, urids.time_sample);
2514 lv2_atom_forge_long(forge, position);
2515 lv2_atom_forge_key(forge, urids.time_speed);
2516 lv2_atom_forge_float(forge, speed);
2517 lv2_atom_forge_key(forge, urids.time_barBeat);
2518 lv2_atom_forge_float(forge, bbt.beats - 1 +
2519 (bbt.ticks / Timecode::BBT_Time::ticks_per_beat));
2520 lv2_atom_forge_key(forge, urids.time_bar);
2521 lv2_atom_forge_long(forge, bbt.bars - 1);
2522 lv2_atom_forge_key(forge, urids.time_beatUnit);
2523 lv2_atom_forge_int(forge, t.meter().note_divisor());
2524 lv2_atom_forge_key(forge, urids.time_beatsPerBar);
2525 lv2_atom_forge_float(forge, t.meter().divisions_per_bar());
2526 lv2_atom_forge_key(forge, urids.time_beatsPerMinute);
2527 lv2_atom_forge_float(forge, bpm);
2529 lv2_atom_forge_blank(forge, &sample, 1, urids.time_Position);
2530 lv2_atom_forge_property_head(forge, urids.time_sample, 0);
2531 lv2_atom_forge_long(forge, position);
2532 lv2_atom_forge_property_head(forge, urids.time_speed, 0);
2533 lv2_atom_forge_float(forge, speed);
2534 lv2_atom_forge_property_head(forge, urids.time_barBeat, 0);
2535 lv2_atom_forge_float(forge, bbt.beats - 1 +
2536 (bbt.ticks / Timecode::BBT_Time::ticks_per_beat));
2537 lv2_atom_forge_property_head(forge, urids.time_bar, 0);
2538 lv2_atom_forge_long(forge, bbt.bars - 1);
2539 lv2_atom_forge_property_head(forge, urids.time_beatUnit, 0);
2540 lv2_atom_forge_int(forge, t.meter().note_divisor());
2541 lv2_atom_forge_property_head(forge, urids.time_beatsPerBar, 0);
2542 lv2_atom_forge_float(forge, t.meter().divisions_per_bar());
2543 lv2_atom_forge_property_head(forge, urids.time_beatsPerMinute, 0);
2544 lv2_atom_forge_float(forge, bpm);
2547 LV2_Evbuf_Iterator end = lv2_evbuf_end(buf);
2548 const LV2_Atom* const atom = (const LV2_Atom*)pos_buf;
2549 return lv2_evbuf_write(&end, offset, 0, atom->type, atom->size,
2550 (const uint8_t*)(atom + 1));
2554 LV2Plugin::connect_and_run(BufferSet& bufs,
2555 samplepos_t start, samplepos_t end, double speed,
2556 ChanMapping in_map, ChanMapping out_map,
2557 pframes_t nframes, samplecnt_t offset)
2559 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 run %2 offset %3\n", name(), nframes, offset));
2560 Plugin::connect_and_run(bufs, start, end, speed, in_map, out_map, nframes, offset);
2562 cycles_t then = get_cycles();
2564 TempoMap& tmap = _session.tempo_map();
2565 Metrics::const_iterator metric_i = tmap.metrics_end();
2566 TempoMetric tmetric = tmap.metric_at(start, &metric_i);
2568 if (_freewheel_control_port) {
2569 *_freewheel_control_port = _session.engine().freewheeling() ? 1.f : 0.f;
2572 if (_bpm_control_port) {
2573 *_bpm_control_port = tmap.tempo_at_sample (start).note_types_per_minute();
2577 if (_can_write_automation && start != _next_cycle_start) {
2578 // add guard-points after locating
2579 for (AutomationCtrlMap::iterator i = _ctrl_map.begin(); i != _ctrl_map.end(); ++i) {
2580 i->second->guard = true;
2585 ChanCount bufs_count;
2586 bufs_count.set(DataType::AUDIO, 1);
2587 bufs_count.set(DataType::MIDI, 1);
2588 BufferSet& silent_bufs = _session.get_silent_buffers(bufs_count);
2589 BufferSet& scratch_bufs = _session.get_scratch_buffers(bufs_count);
2590 uint32_t const num_ports = parameter_count();
2591 uint32_t const nil_index = std::numeric_limits<uint32_t>::max();
2593 uint32_t audio_in_index = 0;
2594 uint32_t audio_out_index = 0;
2595 uint32_t midi_in_index = 0;
2596 uint32_t midi_out_index = 0;
2597 uint32_t atom_port_index = 0;
2598 for (uint32_t port_index = 0; port_index < num_ports; ++port_index) {
2600 uint32_t index = nil_index;
2601 PortFlags flags = _port_flags[port_index];
2603 if (flags & PORT_AUDIO) {
2604 if (flags & PORT_INPUT) {
2605 index = in_map.get(DataType::AUDIO, audio_in_index++, &valid);
2607 ? bufs.get_audio(index).data(offset)
2608 : silent_bufs.get_audio(0).data(offset);
2610 index = out_map.get(DataType::AUDIO, audio_out_index++, &valid);
2612 ? bufs.get_audio(index).data(offset)
2613 : scratch_bufs.get_audio(0).data(offset);
2615 } else if (flags & (PORT_EVENT|PORT_SEQUENCE)) {
2616 /* FIXME: The checks here for bufs.count().n_midi() > index shouldn't
2617 be necessary, but the mapping is illegal in some cases. Ideally
2618 that should be fixed, but this is easier...
2620 if (flags & PORT_MIDI) {
2621 if (flags & PORT_INPUT) {
2622 index = in_map.get(DataType::MIDI, midi_in_index++, &valid);
2624 index = out_map.get(DataType::MIDI, midi_out_index++, &valid);
2626 if (valid && bufs.count().n_midi() > index) {
2627 /* Note, ensure_lv2_bufsize() is not RT safe!
2628 * However free()/alloc() is only called if a
2629 * plugin requires a rsz:minimumSize buffersize
2630 * and the existing buffer if smaller.
2632 bufs.ensure_lv2_bufsize((flags & PORT_INPUT), index, _port_minimumSize[port_index]);
2633 _ev_buffers[port_index] = bufs.get_lv2_midi(
2634 (flags & PORT_INPUT), index, (flags & PORT_EVENT));
2636 } else if ((flags & PORT_POSITION) && (flags & PORT_INPUT)) {
2637 lv2_evbuf_reset(_atom_ev_buffers[atom_port_index], true);
2638 _ev_buffers[port_index] = _atom_ev_buffers[atom_port_index++];
2642 if (valid && (flags & PORT_INPUT)) {
2643 if ((flags & PORT_POSITION)) {
2644 Timecode::BBT_Time bbt (tmap.bbt_at_sample (start));
2645 double bpm = tmap.tempo_at_sample (start).note_types_per_minute();
2646 double beatpos = (bbt.bars - 1) * tmetric.meter().divisions_per_bar()
2648 + (bbt.ticks / Timecode::BBT_Time::ticks_per_beat);
2649 beatpos *= tmetric.meter().note_divisor() / 4.0;
2650 if (start != _next_cycle_start ||
2651 speed != _next_cycle_speed ||
2652 rint (1000 * beatpos) != rint(1000 * _next_cycle_beat) ||
2653 bpm != _current_bpm) {
2654 // Transport or Tempo has changed, write position at cycle start
2655 write_position(&_impl->forge, _ev_buffers[port_index],
2656 tmetric, bbt, speed, bpm, start, 0);
2660 // Get MIDI iterator range (empty range if no MIDI)
2661 MidiBuffer::iterator m = (index != nil_index)
2662 ? bufs.get_midi(index).begin()
2663 : silent_bufs.get_midi(0).end();
2664 MidiBuffer::iterator m_end = (index != nil_index)
2665 ? bufs.get_midi(index).end()
2668 // Now merge MIDI and any transport events into the buffer
2669 const uint32_t type = _uri_map.urids.midi_MidiEvent;
2670 const samplepos_t tend = end;
2672 while (m != m_end || (metric_i != tmap.metrics_end() &&
2673 (*metric_i)->sample() < tend)) {
2674 MetricSection* metric = (metric_i != tmap.metrics_end())
2676 if (m != m_end && (!metric || metric->sample() > (*m).time())) {
2677 const Evoral::Event<samplepos_t> ev(*m, false);
2678 if (ev.time() < nframes) {
2679 LV2_Evbuf_Iterator eend = lv2_evbuf_end(_ev_buffers[port_index]);
2680 lv2_evbuf_write(&eend, ev.time(), 0, type, ev.size(), ev.buffer());
2684 tmetric.set_metric(metric);
2685 Timecode::BBT_Time bbt;
2686 bbt = tmap.bbt_at_sample (metric->sample());
2687 double bpm = tmap.tempo_at_sample (start/*XXX*/).note_types_per_minute();
2688 write_position(&_impl->forge, _ev_buffers[port_index],
2689 tmetric, bbt, speed, bpm,
2691 metric->sample() - start);
2695 } else if (!valid) {
2696 // Nothing we understand or care about, connect to scratch
2697 // see note for midi-buffer size above
2698 scratch_bufs.ensure_lv2_bufsize((flags & PORT_INPUT),
2699 0, _port_minimumSize[port_index]);
2700 _ev_buffers[port_index] = scratch_bufs.get_lv2_midi(
2701 (flags & PORT_INPUT), 0, (flags & PORT_EVENT));
2704 buf = lv2_evbuf_get_buffer(_ev_buffers[port_index]);
2706 continue; // Control port, leave buffer alone
2708 lilv_instance_connect_port(_impl->instance, port_index, buf);
2711 // Read messages from UI and push into appropriate buffers
2713 uint32_t read_space = _from_ui->read_space();
2714 while (read_space > sizeof(UIMessage)) {
2716 if (_from_ui->read((uint8_t*)&msg, sizeof(msg)) != sizeof(msg)) {
2717 error << "Error reading from UI=>Plugin RingBuffer" << endmsg;
2720 vector<uint8_t> body(msg.size);
2721 if (_from_ui->read(&body[0], msg.size) != msg.size) {
2722 error << "Error reading from UI=>Plugin RingBuffer" << endmsg;
2725 if (msg.protocol == URIMap::instance().urids.atom_eventTransfer) {
2726 LV2_Evbuf* buf = _ev_buffers[msg.index];
2727 LV2_Evbuf_Iterator i = lv2_evbuf_end(buf);
2728 const LV2_Atom* const atom = (const LV2_Atom*)&body[0];
2729 if (!lv2_evbuf_write(&i, nframes - 1, 0, atom->type, atom->size,
2730 (const uint8_t*)(atom + 1))) {
2731 error << "Failed to write data to LV2 event buffer\n";
2734 error << "Received unknown message type from UI" << endmsg;
2736 read_space -= sizeof(UIMessage) + msg.size;
2743 for (uint32_t port_index = 0; port_index < num_ports; ++port_index) {
2744 PortFlags flags = _port_flags[port_index];
2747 /* TODO ask drobilla about comment
2748 * "Make Ardour event buffers generic so plugins can communicate"
2749 * in libs/ardour/buffer_set.cc:310
2751 * ideally the user could choose which of the following two modes
2752 * to use (e.g. instrument/effect chains MIDI OUT vs MIDI TRHU).
2754 * This implementation follows the discussion on IRC Mar 16 2013 16:47 UTC
2755 * 16:51 < drobilla> rgareus: [..] i.e always replace with MIDI output [of LV2 plugin] if it's there
2756 * 16:52 < drobilla> rgareus: That would probably be good enough [..] to make users not complain
2757 * for quite a while at least ;)
2759 // copy output of LV2 plugin's MIDI port to Ardour MIDI buffers -- MIDI OUT
2760 if ((flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE|PORT_MIDI))) {
2761 const uint32_t buf_index = out_map.get(
2762 DataType::MIDI, midi_out_index++, &valid);
2764 bufs.forward_lv2_midi(_ev_buffers[port_index], buf_index);
2767 // Flush MIDI (write back to Ardour MIDI buffers) -- MIDI THRU
2768 else if ((flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE))) {
2769 const uint32_t buf_index = out_map.get(
2770 DataType::MIDI, midi_out_index++, &valid);
2772 bufs.flush_lv2_midi(true, buf_index);
2776 // Write messages to UI
2777 if ((_to_ui || _can_write_automation || _patch_port_out_index != (uint32_t)-1) &&
2778 (flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE))) {
2779 LV2_Evbuf* buf = _ev_buffers[port_index];
2780 for (LV2_Evbuf_Iterator i = lv2_evbuf_begin(buf);
2781 lv2_evbuf_is_valid(i);
2782 i = lv2_evbuf_next(i)) {
2783 uint32_t samples, subframes, type, size;
2785 lv2_evbuf_get(i, &samples, &subframes, &type, &size, &data);
2788 // Intercept Automation Write Events
2789 if ((flags & PORT_AUTOCTRL)) {
2790 LV2_Atom* atom = (LV2_Atom*)(data - sizeof(LV2_Atom));
2791 if (atom->type == _uri_map.urids.atom_Blank ||
2792 atom->type == _uri_map.urids.atom_Object) {
2793 LV2_Atom_Object* obj = (LV2_Atom_Object*)atom;
2794 if (obj->body.otype == _uri_map.urids.auto_event) {
2795 // only if transport_rolling ??
2796 const LV2_Atom* parameter = NULL;
2797 const LV2_Atom* value = NULL;
2798 lv2_atom_object_get(obj,
2799 _uri_map.urids.auto_parameter, ¶meter,
2800 _uri_map.urids.auto_value, &value,
2802 if (parameter && value) {
2803 const uint32_t p = ((const LV2_Atom_Int*)parameter)->body;
2804 const float v = ((const LV2_Atom_Float*)value)->body;
2805 // -> add automation event..
2806 DEBUG_TRACE(DEBUG::LV2Automate,
2807 string_compose ("Event p: %1 t: %2 v: %3\n", p, samples, v));
2808 AutomationCtrlPtr c = get_automation_control (p);
2810 (c->ac->automation_state() == Touch || c->ac->automation_state() == Write)
2812 samplepos_t when = std::max ((samplepos_t) 0, start + samples - _current_latency);
2813 assert (start + samples - _current_latency >= 0);
2816 c->ac->list()->add (when, v, true, true);
2818 c->ac->set_double (v, when, true);
2823 else if (obj->body.otype == _uri_map.urids.auto_setup) {
2824 // TODO optional arguments, for now we assume the plugin
2825 // writes automation for its own inputs
2826 // -> put them in "touch" mode (preferably "exclusive plugin touch(TM)"
2827 for (AutomationCtrlMap::iterator i = _ctrl_map.begin(); i != _ctrl_map.end(); ++i) {
2828 if (_port_flags[i->first] & PORT_CTRLED) {
2829 DEBUG_TRACE(DEBUG::LV2Automate,
2830 string_compose ("Setup p: %1\n", i->first));
2831 i->second->ac->set_automation_state (Touch);
2835 else if (obj->body.otype == _uri_map.urids.auto_finalize) {
2836 // set [touched] parameters to "play" ??
2837 // allow plugin to change its mode (from analyze to apply)
2838 const LV2_Atom* parameter = NULL;
2839 const LV2_Atom* value = NULL;
2840 lv2_atom_object_get(obj,
2841 _uri_map.urids.auto_parameter, ¶meter,
2842 _uri_map.urids.auto_value, &value,
2844 if (parameter && value) {
2845 const uint32_t p = ((const LV2_Atom_Int*)parameter)->body;
2846 const float v = ((const LV2_Atom_Float*)value)->body;
2847 AutomationCtrlPtr c = get_automation_control (p);
2848 DEBUG_TRACE(DEBUG::LV2Automate,
2849 string_compose ("Finalize p: %1 v: %2\n", p, v));
2850 if (c && _port_flags[p] & PORT_CTRLER) {
2851 c->ac->set_value(v, Controllable::NoGroup);
2854 DEBUG_TRACE(DEBUG::LV2Automate, "Finalize\n");
2856 for (AutomationCtrlMap::iterator i = _ctrl_map.begin(); i != _ctrl_map.end(); ++i) {
2857 // guard will be false if an event was written
2858 if ((_port_flags[i->first] & PORT_CTRLED) && !i->second->guard) {
2859 DEBUG_TRACE(DEBUG::LV2Automate,
2860 string_compose ("Thin p: %1\n", i->first));
2861 i->second->ac->alist ()->thin (20);
2865 else if (obj->body.otype == _uri_map.urids.auto_start) {
2866 const LV2_Atom* parameter = NULL;
2867 lv2_atom_object_get(obj,
2868 _uri_map.urids.auto_parameter, ¶meter,
2871 const uint32_t p = ((const LV2_Atom_Int*)parameter)->body;
2872 AutomationCtrlPtr c = get_automation_control (p);
2873 DEBUG_TRACE(DEBUG::LV2Automate, string_compose ("Start Touch p: %1\n", p));
2875 c->ac->start_touch (std::max ((samplepos_t)0, start - _current_latency));
2880 else if (obj->body.otype == _uri_map.urids.auto_end) {
2881 const LV2_Atom* parameter = NULL;
2882 lv2_atom_object_get(obj,
2883 _uri_map.urids.auto_parameter, ¶meter,
2886 const uint32_t p = ((const LV2_Atom_Int*)parameter)->body;
2887 AutomationCtrlPtr c = get_automation_control (p);
2888 DEBUG_TRACE(DEBUG::LV2Automate, string_compose ("End Touch p: %1\n", p));
2890 c->ac->stop_touch (std::max ((samplepos_t)0, start - _current_latency));
2897 // Intercept state dirty message
2898 if (_has_state_interface /* && (flags & PORT_DIRTYMSG)*/) {
2899 LV2_Atom* atom = (LV2_Atom*)(data - sizeof(LV2_Atom));
2900 if (atom->type == _uri_map.urids.atom_Blank ||
2901 atom->type == _uri_map.urids.atom_Object) {
2902 LV2_Atom_Object* obj = (LV2_Atom_Object*)atom;
2903 if (obj->body.otype == _uri_map.urids.state_StateChanged) {
2904 _session.set_dirty ();
2909 // Intercept patch change messages to emit PropertyChanged signal
2910 if ((flags & PORT_PATCHMSG)) {
2911 LV2_Atom* atom = (LV2_Atom*)(data - sizeof(LV2_Atom));
2912 if (atom->type == _uri_map.urids.atom_Blank ||
2913 atom->type == _uri_map.urids.atom_Object) {
2914 LV2_Atom_Object* obj = (LV2_Atom_Object*)atom;
2915 if (obj->body.otype == _uri_map.urids.patch_Set) {
2916 const LV2_Atom* property = NULL;
2917 const LV2_Atom* value = NULL;
2918 lv2_atom_object_get(obj,
2919 _uri_map.urids.patch_property, &property,
2920 _uri_map.urids.patch_value, &value,
2923 if (property && value &&
2924 property->type == _uri_map.urids.atom_URID &&
2925 value->type == _uri_map.urids.atom_Path) {
2926 const uint32_t prop_id = ((const LV2_Atom_URID*)property)->body;
2927 const char* path = (const char*)LV2_ATOM_BODY_CONST(value);
2929 // Emit PropertyChanged signal for UI
2930 // TODO: This should emit the control's Changed signal
2931 PropertyChanged(prop_id, Variant(Variant::PATH, path));
2933 std::cerr << "warning: patch:Set for unknown property" << std::endl;
2939 if (!_to_ui) continue;
2940 write_to_ui(port_index, URIMap::instance().urids.atom_eventTransfer,
2941 size + sizeof(LV2_Atom),
2942 data - sizeof(LV2_Atom));
2947 cycles_t now = get_cycles();
2948 set_cycles((uint32_t)(now - then));
2950 // Update expected transport information for next cycle so we can detect changes
2951 _next_cycle_speed = speed;
2952 _next_cycle_start = end;
2955 /* keep track of lv2:timePosition like plugins can do.
2956 * Note: for no-midi plugins, we only ever send information at cycle-start,
2957 * so it needs to be realative to that.
2959 TempoMetric t = tmap.metric_at(start);
2960 _current_bpm = tmap.tempo_at_sample (start).note_types_per_minute();
2961 Timecode::BBT_Time bbt (tmap.bbt_at_sample (start));
2962 double beatpos = (bbt.bars - 1) * t.meter().divisions_per_bar()
2964 + (bbt.ticks / Timecode::BBT_Time::ticks_per_beat);
2965 beatpos *= tmetric.meter().note_divisor() / 4.0;
2966 _next_cycle_beat = beatpos + nframes * speed * _current_bpm / (60.f * _session.sample_rate());
2969 if (_latency_control_port) {
2970 samplecnt_t new_latency = signal_latency ();
2971 _current_latency = new_latency;
2977 LV2Plugin::parameter_is_control(uint32_t param) const
2979 assert(param < _port_flags.size());
2980 return _port_flags[param] & PORT_CONTROL;
2984 LV2Plugin::parameter_is_audio(uint32_t param) const
2986 assert(param < _port_flags.size());
2987 return _port_flags[param] & PORT_AUDIO;
2991 LV2Plugin::parameter_is_event(uint32_t param) const
2993 assert(param < _port_flags.size());
2994 return _port_flags[param] & PORT_EVENT;
2998 LV2Plugin::parameter_is_output(uint32_t param) const
3000 assert(param < _port_flags.size());
3001 return _port_flags[param] & PORT_OUTPUT;
3005 LV2Plugin::parameter_is_input(uint32_t param) const
3007 assert(param < _port_flags.size());
3008 return _port_flags[param] & PORT_INPUT;
3012 LV2Plugin::designated_bypass_port ()
3014 const LilvPort* port = NULL;
3015 LilvNode* designation = lilv_new_uri (_world.world, LV2_CORE_PREFIX "enabled");
3016 port = lilv_plugin_get_port_by_designation (
3017 _impl->plugin, _world.lv2_InputPort, designation);
3018 lilv_node_free(designation);
3020 return lilv_port_get_index (_impl->plugin, port);
3023 /* deprecated on 2016-Sep-18 in favor of lv2:enabled */
3024 designation = lilv_new_uri (_world.world, LV2_PROCESSING_URI__enable);
3025 port = lilv_plugin_get_port_by_designation (
3026 _impl->plugin, _world.lv2_InputPort, designation);
3027 lilv_node_free(designation);
3029 return lilv_port_get_index (_impl->plugin, port);
3036 LV2Plugin::print_parameter(uint32_t param, char* buf, uint32_t len) const
3039 if (param < parameter_count()) {
3040 snprintf(buf, len, "%.3f", get_parameter(param));
3047 boost::shared_ptr<ScalePoints>
3048 LV2Plugin::get_scale_points(uint32_t port_index) const
3050 const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, port_index);
3051 LilvScalePoints* points = lilv_port_get_scale_points(_impl->plugin, port);
3053 boost::shared_ptr<ScalePoints> ret;
3058 ret = boost::shared_ptr<ScalePoints>(new ScalePoints());
3060 LILV_FOREACH(scale_points, i, points) {
3061 const LilvScalePoint* p = lilv_scale_points_get(points, i);
3062 const LilvNode* label = lilv_scale_point_get_label(p);
3063 const LilvNode* value = lilv_scale_point_get_value(p);
3064 if (label && (lilv_node_is_float(value) || lilv_node_is_int(value))) {
3065 ret->insert(make_pair(lilv_node_as_string(label),
3066 lilv_node_as_float(value)));
3070 lilv_scale_points_free(points);
3075 LV2Plugin::run(pframes_t nframes, bool sync_work)
3077 uint32_t const N = parameter_count();
3078 for (uint32_t i = 0; i < N; ++i) {
3079 if (parameter_is_control(i) && parameter_is_input(i)) {
3080 _control_data[i] = _shadow_data[i];
3085 // Execute work synchronously if we're freewheeling (export)
3086 _worker->set_synchronous(sync_work || session().engine().freewheeling());
3089 // Run the plugin for this cycle
3090 lilv_instance_run(_impl->instance, nframes);
3092 // Emit any queued worker responses (calls a plugin callback)
3093 if (_state_worker) {
3094 _state_worker->emit_responses();
3097 _worker->emit_responses();
3100 // Notify the plugin that a work run cycle is complete
3101 if (_impl->work_iface) {
3102 if (_impl->work_iface->end_run) {
3103 _impl->work_iface->end_run(_impl->instance->lv2_handle);
3109 LV2Plugin::latency_compute_run()
3111 if (!_latency_control_port) {
3115 // Run the plugin so that it can set its latency parameter
3117 bool was_activated = _was_activated;
3120 uint32_t port_index = 0;
3121 uint32_t in_index = 0;
3122 uint32_t out_index = 0;
3124 // this is done in the main thread. non realtime.
3125 const samplecnt_t bufsize = _engine.samples_per_cycle();
3126 float *buffer = (float*) malloc(_engine.samples_per_cycle() * sizeof(float));
3128 memset(buffer, 0, sizeof(float) * bufsize);
3130 // FIXME: Ensure plugins can handle in-place processing
3134 while (port_index < parameter_count()) {
3135 if (parameter_is_audio(port_index)) {
3136 if (parameter_is_input(port_index)) {
3137 lilv_instance_connect_port(_impl->instance, port_index, buffer);
3139 } else if (parameter_is_output(port_index)) {
3140 lilv_instance_connect_port(_impl->instance, port_index, buffer);
3149 if (was_activated) {
3156 LV2Plugin::Impl::designated_input (const char* uri, void** bufptrs[], void** bufptr)
3158 const LilvPort* port = NULL;
3159 LilvNode* designation = lilv_new_uri(_world.world, uri);
3160 port = lilv_plugin_get_port_by_designation(
3161 plugin, _world.lv2_InputPort, designation);
3162 lilv_node_free(designation);
3164 bufptrs[lilv_port_get_index(plugin, port)] = bufptr;
3169 static bool lv2_filter (const string& str, void* /*arg*/)
3171 /* Not a dotfile, has a prefix before a period, suffix is "lv2" */
3173 return str[0] != '.' && (str.length() > 3 && str.find (".lv2") == (str.length() - 4));
3177 LV2World::LV2World()
3178 : world(lilv_world_new())
3179 , _bundle_checked(false)
3181 atom_AtomPort = lilv_new_uri(world, LV2_ATOM__AtomPort);
3182 atom_Chunk = lilv_new_uri(world, LV2_ATOM__Chunk);
3183 atom_Sequence = lilv_new_uri(world, LV2_ATOM__Sequence);
3184 atom_bufferType = lilv_new_uri(world, LV2_ATOM__bufferType);
3185 atom_supports = lilv_new_uri(world, LV2_ATOM__supports);
3186 atom_eventTransfer = lilv_new_uri(world, LV2_ATOM__eventTransfer);
3187 ev_EventPort = lilv_new_uri(world, LILV_URI_EVENT_PORT);
3188 ext_logarithmic = lilv_new_uri(world, LV2_PORT_PROPS__logarithmic);
3189 ext_notOnGUI = lilv_new_uri(world, LV2_PORT_PROPS__notOnGUI);
3190 ext_expensive = lilv_new_uri(world, LV2_PORT_PROPS__expensive);
3191 ext_causesArtifacts= lilv_new_uri(world, LV2_PORT_PROPS__causesArtifacts);
3192 ext_notAutomatic = lilv_new_uri(world, LV2_PORT_PROPS__notAutomatic);
3193 ext_rangeSteps = lilv_new_uri(world, LV2_PORT_PROPS__rangeSteps);
3194 groups_group = lilv_new_uri(world, LV2_PORT_GROUPS__group);
3195 groups_element = lilv_new_uri(world, LV2_PORT_GROUPS__element);
3196 lv2_AudioPort = lilv_new_uri(world, LILV_URI_AUDIO_PORT);
3197 lv2_ControlPort = lilv_new_uri(world, LILV_URI_CONTROL_PORT);
3198 lv2_InputPort = lilv_new_uri(world, LILV_URI_INPUT_PORT);
3199 lv2_OutputPort = lilv_new_uri(world, LILV_URI_OUTPUT_PORT);
3200 lv2_inPlaceBroken = lilv_new_uri(world, LV2_CORE__inPlaceBroken);
3201 lv2_isSideChain = lilv_new_uri(world, LV2_CORE_PREFIX "isSideChain");
3202 lv2_index = lilv_new_uri(world, LV2_CORE__index);
3203 lv2_integer = lilv_new_uri(world, LV2_CORE__integer);
3204 lv2_default = lilv_new_uri(world, LV2_CORE__default);
3205 lv2_minimum = lilv_new_uri(world, LV2_CORE__minimum);
3206 lv2_maximum = lilv_new_uri(world, LV2_CORE__maximum);
3207 lv2_reportsLatency = lilv_new_uri(world, LV2_CORE__reportsLatency);
3208 lv2_sampleRate = lilv_new_uri(world, LV2_CORE__sampleRate);
3209 lv2_toggled = lilv_new_uri(world, LV2_CORE__toggled);
3210 lv2_designation = lilv_new_uri(world, LV2_CORE__designation);
3211 lv2_enumeration = lilv_new_uri(world, LV2_CORE__enumeration);
3212 lv2_freewheeling = lilv_new_uri(world, LV2_CORE__freeWheeling);
3213 midi_MidiEvent = lilv_new_uri(world, LILV_URI_MIDI_EVENT);
3214 rdfs_comment = lilv_new_uri(world, LILV_NS_RDFS "comment");
3215 rdfs_label = lilv_new_uri(world, LILV_NS_RDFS "label");
3216 rdfs_range = lilv_new_uri(world, LILV_NS_RDFS "range");
3217 rsz_minimumSize = lilv_new_uri(world, LV2_RESIZE_PORT__minimumSize);
3218 time_Position = lilv_new_uri(world, LV2_TIME__Position);
3219 ui_GtkUI = lilv_new_uri(world, LV2_UI__GtkUI);
3220 ui_external = lilv_new_uri(world, "http://lv2plug.in/ns/extensions/ui#external");
3221 ui_externalkx = lilv_new_uri(world, "http://kxstudio.sf.net/ns/lv2ext/external-ui#Widget");
3222 units_unit = lilv_new_uri(world, LV2_UNITS__unit);
3223 units_render = lilv_new_uri(world, LV2_UNITS__render);
3224 units_hz = lilv_new_uri(world, LV2_UNITS__hz);
3225 units_midiNote = lilv_new_uri(world, LV2_UNITS__midiNote);
3226 units_db = lilv_new_uri(world, LV2_UNITS__db);
3227 patch_writable = lilv_new_uri(world, LV2_PATCH__writable);
3228 patch_Message = lilv_new_uri(world, LV2_PATCH__Message);
3230 lv2_noSampleAccurateCtrl = lilv_new_uri(world, "http://ardour.org/lv2/ext#noSampleAccurateControls"); // deprecated 2016-09-18
3231 auto_can_write_automatation = lilv_new_uri(world, LV2_AUTOMATE_URI__can_write);
3232 auto_automation_control = lilv_new_uri(world, LV2_AUTOMATE_URI__control);
3233 auto_automation_controlled = lilv_new_uri(world, LV2_AUTOMATE_URI__controlled);
3234 auto_automation_controller = lilv_new_uri(world, LV2_AUTOMATE_URI__controller);
3235 inline_display_in_gui = lilv_new_uri(world, LV2_INLINEDISPLAY__in_gui);
3237 #ifdef HAVE_LV2_1_2_0
3238 bufz_powerOf2BlockLength = lilv_new_uri(world, LV2_BUF_SIZE__powerOf2BlockLength);
3239 bufz_fixedBlockLength = lilv_new_uri(world, LV2_BUF_SIZE__fixedBlockLength);
3240 bufz_nominalBlockLength = lilv_new_uri(world, "http://lv2plug.in/ns/ext/buf-size#nominalBlockLength");
3241 bufz_coarseBlockLength = lilv_new_uri(world, "http://lv2plug.in/ns/ext/buf-size#coarseBlockLength");
3246 LV2World::~LV2World()
3251 #ifdef HAVE_LV2_1_2_0
3252 lilv_node_free(bufz_coarseBlockLength);
3253 lilv_node_free(bufz_nominalBlockLength);
3254 lilv_node_free(bufz_fixedBlockLength);
3255 lilv_node_free(bufz_powerOf2BlockLength);
3258 lilv_node_free(lv2_noSampleAccurateCtrl);
3259 lilv_node_free(auto_can_write_automatation);
3260 lilv_node_free(auto_automation_control);
3261 lilv_node_free(auto_automation_controlled);
3262 lilv_node_free(auto_automation_controller);
3264 lilv_node_free(patch_Message);
3265 lilv_node_free(patch_writable);
3266 lilv_node_free(units_hz);
3267 lilv_node_free(units_midiNote);
3268 lilv_node_free(units_db);
3269 lilv_node_free(units_unit);
3270 lilv_node_free(units_render);
3271 lilv_node_free(ui_externalkx);
3272 lilv_node_free(ui_external);
3273 lilv_node_free(ui_GtkUI);
3274 lilv_node_free(time_Position);
3275 lilv_node_free(rsz_minimumSize);
3276 lilv_node_free(rdfs_comment);
3277 lilv_node_free(rdfs_label);
3278 lilv_node_free(rdfs_range);
3279 lilv_node_free(midi_MidiEvent);
3280 lilv_node_free(lv2_designation);
3281 lilv_node_free(lv2_enumeration);
3282 lilv_node_free(lv2_freewheeling);
3283 lilv_node_free(lv2_toggled);
3284 lilv_node_free(lv2_sampleRate);
3285 lilv_node_free(lv2_reportsLatency);
3286 lilv_node_free(lv2_index);
3287 lilv_node_free(lv2_integer);
3288 lilv_node_free(lv2_isSideChain);
3289 lilv_node_free(lv2_inPlaceBroken);
3290 lilv_node_free(lv2_OutputPort);
3291 lilv_node_free(lv2_InputPort);
3292 lilv_node_free(lv2_ControlPort);
3293 lilv_node_free(lv2_AudioPort);
3294 lilv_node_free(groups_group);
3295 lilv_node_free(groups_element);
3296 lilv_node_free(ext_rangeSteps);
3297 lilv_node_free(ext_notAutomatic);
3298 lilv_node_free(ext_causesArtifacts);
3299 lilv_node_free(ext_expensive);
3300 lilv_node_free(ext_notOnGUI);
3301 lilv_node_free(ext_logarithmic);
3302 lilv_node_free(ev_EventPort);
3303 lilv_node_free(atom_supports);
3304 lilv_node_free(atom_eventTransfer);
3305 lilv_node_free(atom_bufferType);
3306 lilv_node_free(atom_Sequence);
3307 lilv_node_free(atom_Chunk);
3308 lilv_node_free(atom_AtomPort);
3309 lilv_world_free(world);
3314 LV2World::load_bundled_plugins(bool verbose)
3316 if (!_bundle_checked) {
3318 cout << "Scanning folders for bundled LV2s: " << ARDOUR::lv2_bundled_search_path().to_string() << endl;
3321 vector<string> plugin_objects;
3322 find_paths_matching_filter (plugin_objects, ARDOUR::lv2_bundled_search_path(), lv2_filter, 0, true, true, true);
3323 for ( vector<string>::iterator x = plugin_objects.begin(); x != plugin_objects.end (); ++x) {
3324 #ifdef PLATFORM_WINDOWS
3325 string uri = "file:///" + *x + "/";
3327 string uri = "file://" + *x + "/";
3329 LilvNode *node = lilv_new_uri(world, uri.c_str());
3330 lilv_world_load_bundle(world, node);
3331 lilv_node_free(node);
3334 lilv_world_load_all(world);
3335 _bundle_checked = true;
3339 LV2PluginInfo::LV2PluginInfo (const char* plugin_uri)
3342 _plugin_uri = strdup(plugin_uri);
3345 LV2PluginInfo::~LV2PluginInfo()
3352 LV2PluginInfo::load(Session& session)
3356 const LilvPlugins* plugins = lilv_world_get_all_plugins(_world.world);
3357 LilvNode* uri = lilv_new_uri(_world.world, _plugin_uri);
3358 if (!uri) { throw failed_constructor(); }
3359 const LilvPlugin* lp = lilv_plugins_get_by_uri(plugins, uri);
3360 if (!lp) { throw failed_constructor(); }
3361 plugin.reset(new LV2Plugin(session.engine(), session, lp, session.sample_rate()));
3362 lilv_node_free(uri);
3363 plugin->set_info(PluginInfoPtr(shared_from_this ()));
3365 } catch (failed_constructor& err) {
3366 return PluginPtr((Plugin*)0);
3372 std::vector<Plugin::PresetRecord>
3373 LV2PluginInfo::get_presets (bool /*user_only*/) const
3375 std::vector<Plugin::PresetRecord> p;
3376 #ifndef NO_PLUGIN_STATE
3377 const LilvPlugin* lp = NULL;
3380 const LilvPlugins* plugins = lilv_world_get_all_plugins(_world.world);
3381 LilvNode* uri = lilv_new_uri(_world.world, _plugin_uri);
3382 if (!uri) { throw failed_constructor(); }
3383 lp = lilv_plugins_get_by_uri(plugins, uri);
3384 if (!lp) { throw failed_constructor(); }
3385 lilv_node_free(uri);
3386 } catch (failed_constructor& err) {
3390 // see LV2Plugin::find_presets
3391 LilvNode* lv2_appliesTo = lilv_new_uri(_world.world, LV2_CORE__appliesTo);
3392 LilvNode* pset_Preset = lilv_new_uri(_world.world, LV2_PRESETS__Preset);
3393 LilvNode* rdfs_label = lilv_new_uri(_world.world, LILV_NS_RDFS "label");
3395 LilvNodes* presets = lilv_plugin_get_related(lp, pset_Preset);
3396 LILV_FOREACH(nodes, i, presets) {
3397 const LilvNode* preset = lilv_nodes_get(presets, i);
3398 lilv_world_load_resource(_world.world, preset);
3399 LilvNode* name = get_value(_world.world, preset, rdfs_label);
3400 bool userpreset = true; // TODO
3402 p.push_back (Plugin::PresetRecord (lilv_node_as_string(preset), lilv_node_as_string(name), userpreset));
3403 lilv_node_free(name);
3406 lilv_nodes_free(presets);
3407 lilv_node_free(rdfs_label);
3408 lilv_node_free(pset_Preset);
3409 lilv_node_free(lv2_appliesTo);
3415 LV2PluginInfo::discover()
3418 world.load_bundled_plugins();
3419 _world.load_bundled_plugins(true);
3421 PluginInfoList* plugs = new PluginInfoList;
3422 const LilvPlugins* plugins = lilv_world_get_all_plugins(world.world);
3424 LILV_FOREACH(plugins, i, plugins) {
3425 const LilvPlugin* p = lilv_plugins_get(plugins, i);
3426 const LilvNode* pun = lilv_plugin_get_uri(p);
3428 LV2PluginInfoPtr info(new LV2PluginInfo(lilv_node_as_string(pun)));
3430 LilvNode* name = lilv_plugin_get_name(p);
3431 if (!name || !lilv_plugin_get_port_by_index(p, 0)) {
3432 warning << "Ignoring invalid LV2 plugin "
3433 << lilv_node_as_string(lilv_plugin_get_uri(p))
3438 if (lilv_plugin_has_feature(p, world.lv2_inPlaceBroken)) {
3439 warning << string_compose(
3440 _("Ignoring LV2 plugin \"%1\" since it cannot do inplace processing."),
3441 lilv_node_as_string(name)) << endmsg;
3442 lilv_node_free(name);
3446 #ifdef HAVE_LV2_1_2_0
3447 LilvNodes *required_features = lilv_plugin_get_required_features (p);
3448 if (lilv_nodes_contains (required_features, world.bufz_powerOf2BlockLength) ||
3449 lilv_nodes_contains (required_features, world.bufz_fixedBlockLength)
3451 warning << string_compose(
3452 _("Ignoring LV2 plugin \"%1\" because its buffer-size requirements cannot be satisfied."),
3453 lilv_node_as_string(name)) << endmsg;
3454 lilv_nodes_free(required_features);
3455 lilv_node_free(name);
3458 lilv_nodes_free(required_features);
3463 info->name = string(lilv_node_as_string(name));
3464 lilv_node_free(name);
3465 ARDOUR::PluginScanMessage(_("LV2"), info->name, false);
3467 const LilvPluginClass* pclass = lilv_plugin_get_class(p);
3468 const LilvNode* label = lilv_plugin_class_get_label(pclass);
3469 info->category = lilv_node_as_string(label);
3471 LilvNode* author_name = lilv_plugin_get_author_name(p);
3472 info->creator = author_name ? string(lilv_node_as_string(author_name)) : "Unknown";
3473 lilv_node_free(author_name);
3475 info->path = "/NOPATH"; // Meaningless for LV2
3477 /* count atom-event-ports that feature
3478 * atom:supports <http://lv2plug.in/ns/ext/midi#MidiEvent>
3480 * TODO: nicely ask drobilla to make a lilv_ call for that
3482 int count_midi_out = 0;
3483 int count_midi_in = 0;
3484 for (uint32_t i = 0; i < lilv_plugin_get_num_ports(p); ++i) {
3485 const LilvPort* port = lilv_plugin_get_port_by_index(p, i);
3486 if (lilv_port_is_a(p, port, world.atom_AtomPort)) {
3487 LilvNodes* buffer_types = lilv_port_get_value(
3488 p, port, world.atom_bufferType);
3489 LilvNodes* atom_supports = lilv_port_get_value(
3490 p, port, world.atom_supports);
3492 if (lilv_nodes_contains(buffer_types, world.atom_Sequence)
3493 && lilv_nodes_contains(atom_supports, world.midi_MidiEvent)) {
3494 if (lilv_port_is_a(p, port, world.lv2_InputPort)) {
3497 if (lilv_port_is_a(p, port, world.lv2_OutputPort)) {
3501 lilv_nodes_free(buffer_types);
3502 lilv_nodes_free(atom_supports);
3506 info->n_inputs.set_audio(
3507 lilv_plugin_get_num_ports_of_class(
3508 p, world.lv2_InputPort, world.lv2_AudioPort, NULL));
3509 info->n_inputs.set_midi(
3510 lilv_plugin_get_num_ports_of_class(
3511 p, world.lv2_InputPort, world.ev_EventPort, NULL)
3514 info->n_outputs.set_audio(
3515 lilv_plugin_get_num_ports_of_class(
3516 p, world.lv2_OutputPort, world.lv2_AudioPort, NULL));
3517 info->n_outputs.set_midi(
3518 lilv_plugin_get_num_ports_of_class(
3519 p, world.lv2_OutputPort, world.ev_EventPort, NULL)
3522 info->unique_id = lilv_node_as_uri(lilv_plugin_get_uri(p));
3523 info->index = 0; // Meaningless for LV2
3525 plugs->push_back(info);