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/pthread_utils.h"
41 #include "pbd/replace_all.h"
42 #include "pbd/xml++.h"
44 #ifdef PLATFORM_WINDOWS
45 #include <shlobj.h> // CSIDL_*
46 #include "pbd/windows_special_dirs.h"
50 #include "libardour-config.h"
53 #include "ardour/audio_buffer.h"
54 #include "ardour/audioengine.h"
55 #include "ardour/directory_names.h"
56 #include "ardour/debug.h"
57 #include "ardour/lv2_plugin.h"
58 #include "ardour/midi_patch_manager.h"
59 #include "ardour/session.h"
60 #include "ardour/tempo.h"
61 #include "ardour/types.h"
62 #include "ardour/utils.h"
63 #include "ardour/worker.h"
64 #include "ardour/search_paths.h"
69 #include <lilv/lilv.h>
71 #include "lv2/lv2plug.in/ns/ext/atom/atom.h"
72 #include "lv2/lv2plug.in/ns/ext/atom/forge.h"
73 #include "lv2/lv2plug.in/ns/ext/log/log.h"
74 #include "lv2/lv2plug.in/ns/ext/midi/midi.h"
75 #include "lv2/lv2plug.in/ns/ext/port-props/port-props.h"
76 #include "lv2/lv2plug.in/ns/ext/presets/presets.h"
77 #include "lv2/lv2plug.in/ns/ext/state/state.h"
78 #include "lv2/lv2plug.in/ns/ext/time/time.h"
79 #include "lv2/lv2plug.in/ns/ext/worker/worker.h"
80 #include "lv2/lv2plug.in/ns/ext/resize-port/resize-port.h"
81 #include "lv2/lv2plug.in/ns/extensions/ui/ui.h"
82 #include "lv2/lv2plug.in/ns/extensions/units/units.h"
83 #include "lv2/lv2plug.in/ns/ext/patch/patch.h"
84 #include "lv2/lv2plug.in/ns/ext/port-groups/port-groups.h"
86 #include "lv2/lv2plug.in/ns/ext/buf-size/buf-size.h"
87 #include "lv2/lv2plug.in/ns/ext/options/options.h"
90 #include "lv2_evbuf.h"
93 #include <suil/suil.h>
96 // Compatibility for old LV2
97 #ifndef LV2_ATOM_CONTENTS_CONST
98 #define LV2_ATOM_CONTENTS_CONST(type, atom) \
99 ((const void*)((const uint8_t*)(atom) + sizeof(type)))
101 #ifndef LV2_ATOM_BODY_CONST
102 #define LV2_ATOM_BODY_CONST(atom) LV2_ATOM_CONTENTS_CONST(LV2_Atom, atom)
104 #ifndef LV2_PATCH__property
105 #define LV2_PATCH__property LV2_PATCH_PREFIX "property"
107 #ifndef LV2_PATCH__value
108 #define LV2_PATCH__value LV2_PATCH_PREFIX "value"
110 #ifndef LV2_PATCH__writable
111 #define LV2_PATCH__writable LV2_PATCH_PREFIX "writable"
114 /** The number of MIDI buffers that will fit in a UI/worker comm buffer.
115 This needs to be roughly the number of cycles the UI will get around to
116 actually processing the traffic. Lower values are flakier but save memory.
118 static const size_t NBUFS = 4;
121 using namespace ARDOUR;
124 bool LV2Plugin::force_state_save = false;
126 class LV2World : boost::noncopyable {
131 void load_bundled_plugins(bool verbose=false);
135 LilvNode* atom_AtomPort;
136 LilvNode* atom_Chunk;
137 LilvNode* atom_Sequence;
138 LilvNode* atom_bufferType;
139 LilvNode* atom_eventTransfer;
140 LilvNode* atom_supports;
141 LilvNode* ev_EventPort;
142 LilvNode* ext_logarithmic;
143 LilvNode* ext_notOnGUI;
144 LilvNode* ext_expensive;
145 LilvNode* ext_causesArtifacts;
146 LilvNode* ext_notAutomatic;
147 LilvNode* ext_rangeSteps;
148 LilvNode* groups_group;
149 LilvNode* groups_element;
150 LilvNode* lv2_AudioPort;
151 LilvNode* lv2_ControlPort;
152 LilvNode* lv2_InputPort;
153 LilvNode* lv2_OutputPort;
154 LilvNode* lv2_designation;
155 LilvNode* lv2_enumeration;
156 LilvNode* lv2_freewheeling;
157 LilvNode* lv2_inPlaceBroken;
158 LilvNode* lv2_isSideChain;
160 LilvNode* lv2_integer;
161 LilvNode* lv2_default;
162 LilvNode* lv2_minimum;
163 LilvNode* lv2_maximum;
164 LilvNode* lv2_reportsLatency;
165 LilvNode* lv2_sampleRate;
166 LilvNode* lv2_toggled;
167 LilvNode* midi_MidiEvent;
168 LilvNode* rdfs_comment;
169 LilvNode* rdfs_label;
170 LilvNode* rdfs_range;
171 LilvNode* rsz_minimumSize;
172 LilvNode* time_Position;
174 LilvNode* ui_external;
175 LilvNode* ui_externalkx;
178 LilvNode* units_unit;
179 LilvNode* units_render;
180 LilvNode* units_midiNote;
181 LilvNode* patch_writable;
182 LilvNode* patch_Message;
183 #ifdef HAVE_LV2_1_2_0
184 LilvNode* bufz_powerOf2BlockLength;
185 LilvNode* bufz_fixedBlockLength;
186 LilvNode* bufz_nominalBlockLength;
187 LilvNode* bufz_coarseBlockLength;
190 #ifdef HAVE_LV2_1_10_0
192 LilvNode* atom_float;
193 LilvNode* atom_object; // new in 1.8
194 LilvNode* atom_vector;
197 LilvNode* lv2_noSampleAccurateCtrl;
198 LilvNode* auto_can_write_automatation; // lv2:optionalFeature
199 LilvNode* auto_automation_control; // atom:supports
200 LilvNode* auto_automation_controlled; // lv2:portProperty
201 LilvNode* auto_automation_controller; // lv2:portProperty
202 LilvNode* inline_display_in_gui; // lv2:optionalFeature
206 bool _bundle_checked;
209 static LV2World _world;
211 /* worker extension */
213 /** Called by the plugin to schedule non-RT work. */
214 static LV2_Worker_Status
215 work_schedule(LV2_Worker_Schedule_Handle handle,
219 return (((Worker*)handle)->schedule(size, data)
221 : LV2_WORKER_ERR_UNKNOWN);
224 /** Called by the plugin to respond to non-RT work. */
225 static LV2_Worker_Status
226 work_respond(LV2_Worker_Respond_Handle handle,
230 return (((Worker*)handle)->respond(size, data)
232 : LV2_WORKER_ERR_UNKNOWN);
236 /* inline display extension */
238 LV2Plugin::queue_draw (LV2_Inline_Display_Handle handle)
240 LV2Plugin* plugin = (LV2Plugin*)handle;
241 plugin->QueueDraw(); /* EMIT SIGNAL */
245 LV2Plugin::midnam_update (LV2_Midnam_Handle handle)
247 LV2Plugin* plugin = (LV2Plugin*)handle;
248 plugin->_midnam_dirty = true;
249 plugin->UpdateMidnam (); /* EMIT SIGNAL */
253 LV2Plugin::bankpatch_notify (LV2_BankPatch_Handle handle, uint8_t chn, uint32_t bank, uint8_t pgm)
255 LV2Plugin* plugin = (LV2Plugin*)handle;
259 plugin->seen_bankpatch = true;
260 if (pgm > 127 || bank > 16383) {
261 plugin->_bankpatch[chn] = UINT32_MAX;
263 plugin->_bankpatch[chn] = (bank << 7) | pgm;
265 plugin->BankPatchChange (chn); /* EMIT SIGNAL */
272 log_vprintf(LV2_Log_Handle /*handle*/,
278 const int ret = g_vasprintf(&str, fmt, args);
279 /* strip trailing whitespace */
280 while (strlen (str) > 0 && isspace (str[strlen (str) - 1])) {
281 str[strlen (str) - 1] = '\0';
283 if (strlen (str) == 0) {
287 if (type == URIMap::instance().urids.log_Error) {
288 error << str << endmsg;
289 } else if (type == URIMap::instance().urids.log_Warning) {
290 warning << str << endmsg;
291 } else if (type == URIMap::instance().urids.log_Note) {
292 info << str << endmsg;
293 } else if (type == URIMap::instance().urids.log_Trace) {
294 DEBUG_TRACE(DEBUG::LV2, str);
300 log_printf(LV2_Log_Handle handle,
302 const char* fmt, ...)
306 const int ret = log_vprintf(handle, type, fmt, args);
311 struct LV2Plugin::Impl {
312 Impl() : plugin(0), ui(0), ui_type(0), name(0), author(0), instance(0)
314 #ifdef HAVE_LV2_1_2_0
319 #ifdef HAVE_LV2_1_2_0
328 /** Find the LV2 input port with the given designation.
329 * If found, bufptrs[port_index] will be set to bufptr.
331 const LilvPort* designated_input (const char* uri, void** bufptrs[], void** bufptr);
333 const LilvPlugin* plugin;
335 const LilvNode* ui_type;
338 LilvInstance* instance;
339 const LV2_Worker_Interface* work_iface;
340 #ifdef HAVE_LV2_1_2_0
341 const LV2_Options_Interface* opts_iface;
344 LV2_Atom_Forge forge;
345 LV2_Atom_Forge ui_forge;
346 int32_t block_length;
347 #ifdef HAVE_LV2_1_2_0
348 LV2_Options_Option* options;
351 LV2_Inline_Display* queue_draw;
353 LV2_BankPatch* bankpatch;
357 LV2Plugin::LV2Plugin (AudioEngine& engine,
359 const void* c_plugin,
361 : Plugin (engine, session)
366 , _state_worker(NULL)
368 , _patch_port_in_index((uint32_t)-1)
369 , _patch_port_out_index((uint32_t)-1)
370 , _uri_map(URIMap::instance())
371 , _no_sample_accurate_ctrl (false)
373 init(c_plugin, rate);
374 latency_compute_run();
377 LV2Plugin::LV2Plugin (const LV2Plugin& other)
383 , _state_worker(NULL)
384 , _insert_id(other._insert_id)
385 , _patch_port_in_index((uint32_t)-1)
386 , _patch_port_out_index((uint32_t)-1)
387 , _uri_map(URIMap::instance())
388 , _no_sample_accurate_ctrl (false)
390 init(other._impl->plugin, other._sample_rate);
392 XMLNode root (other.state_node_name ());
393 other.add_state (&root);
394 set_state (root, Stateful::loading_state_version);
396 for (uint32_t i = 0; i < parameter_count(); ++i) {
397 _control_data[i] = other._shadow_data[i];
398 _shadow_data[i] = other._shadow_data[i];
401 latency_compute_run();
405 LV2Plugin::init(const void* c_plugin, samplecnt_t rate)
407 DEBUG_TRACE(DEBUG::LV2, "init\n");
409 _impl->plugin = (const LilvPlugin*)c_plugin;
411 _impl->ui_type = NULL;
416 _atom_ev_buffers = 0;
418 _bpm_control_port = 0;
419 _freewheel_control_port = 0;
420 _latency_control_port = 0;
421 _next_cycle_start = std::numeric_limits<samplepos_t>::max();
422 _next_cycle_speed = 1.0;
423 _seq_size = _engine.raw_buffer_size(DataType::MIDI);
425 _was_activated = false;
426 _has_state_interface = false;
427 _can_write_automation = false;
429 _inline_display_in_gui = false;
432 _current_latency = 0;
433 _impl->block_length = _session.get_block_size();
435 _instance_access_feature.URI = "http://lv2plug.in/ns/ext/instance-access";
436 _data_access_feature.URI = "http://lv2plug.in/ns/ext/data-access";
437 _make_path_feature.URI = LV2_STATE__makePath;
438 _log_feature.URI = LV2_LOG__log;
439 _work_schedule_feature.URI = LV2_WORKER__schedule;
440 _work_schedule_feature.data = NULL;
441 _def_state_feature.URI = LV2_STATE_PREFIX "loadDefaultState"; // Post LV2-1.2.0
442 _def_state_feature.data = NULL;
444 const LilvPlugin* plugin = _impl->plugin;
446 LilvNode* state_iface_uri = lilv_new_uri(_world.world, LV2_STATE__interface);
447 LilvNode* state_uri = lilv_new_uri(_world.world, LV2_STATE_URI);
448 _has_state_interface =
449 // What plugins should have (lv2:extensionData state:Interface)
450 lilv_plugin_has_extension_data(plugin, state_iface_uri)
451 // What some outdated/incorrect ones have
452 || lilv_plugin_has_feature(plugin, state_uri);
453 lilv_node_free(state_uri);
454 lilv_node_free(state_iface_uri);
456 _features = (LV2_Feature**)calloc(14, sizeof(LV2_Feature*));
457 _features[0] = &_instance_access_feature;
458 _features[1] = &_data_access_feature;
459 _features[2] = &_make_path_feature;
460 _features[3] = _uri_map.uri_map_feature();
461 _features[4] = _uri_map.urid_map_feature();
462 _features[5] = _uri_map.urid_unmap_feature();
463 _features[6] = &_log_feature;
465 unsigned n_features = 7;
466 #ifdef HAVE_LV2_1_2_0
467 _features[n_features++] = &_def_state_feature;
470 lv2_atom_forge_init(&_impl->forge, _uri_map.urid_map());
471 lv2_atom_forge_init(&_impl->ui_forge, _uri_map.urid_map());
474 _impl->queue_draw = (LV2_Inline_Display*)
475 malloc (sizeof(LV2_Inline_Display));
476 _impl->queue_draw->handle = this;
477 _impl->queue_draw->queue_draw = queue_draw;
479 _queue_draw_feature.URI = LV2_INLINEDISPLAY__queue_draw;
480 _queue_draw_feature.data = _impl->queue_draw;
481 _features[n_features++] = &_queue_draw_feature;
483 _impl->midnam = (LV2_Midnam*)
484 malloc (sizeof(LV2_Midnam));
485 _impl->midnam->handle = this;
486 _impl->midnam->update = midnam_update;
488 _midnam_feature.URI = LV2_MIDNAM__update;
489 _midnam_feature.data = _impl->midnam;
490 _features[n_features++] = &_midnam_feature;
492 _impl->bankpatch = (LV2_BankPatch*)
493 malloc (sizeof(LV2_BankPatch));
494 _impl->bankpatch->handle = this;
495 _impl->bankpatch->notify = bankpatch_notify;
497 _bankpatch_feature.URI = LV2_BANKPATCH__notify;
498 _bankpatch_feature.data = _impl->bankpatch;
499 _features[n_features++] = &_bankpatch_feature;
502 #ifdef HAVE_LV2_1_2_0
503 LV2_URID atom_Int = _uri_map.uri_to_id(LV2_ATOM__Int);
504 static const int32_t _min_block_length = 1; // may happen during split-cycles
505 static const int32_t _max_block_length = 8192; // max possible (with all engines and during export)
506 static const int32_t rt_policy = PBD_SCHED_FIFO;
507 static const int32_t rt_priority = pbd_absolute_rt_priority (PBD_SCHED_FIFO, AudioEngine::instance()->client_real_time_priority () - 2);
508 /* Consider updating max-block-size whenever the buffersize changes.
509 * It requires re-instantiating the plugin (which is a non-realtime operation),
510 * so it should be done lightly and only for plugins that require it.
512 * given that the block-size can change at any time (split-cycles) ardour currently
513 * does not support plugins that require bufz_fixedBlockLength.
515 LV2_Options_Option options[] = {
516 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id(LV2_BUF_SIZE__minBlockLength),
517 sizeof(int32_t), atom_Int, &_min_block_length },
518 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id(LV2_BUF_SIZE__maxBlockLength),
519 sizeof(int32_t), atom_Int, &_max_block_length },
520 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id(LV2_BUF_SIZE__sequenceSize),
521 sizeof(int32_t), atom_Int, &_seq_size },
522 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id("http://lv2plug.in/ns/ext/buf-size#nominalBlockLength"),
523 sizeof(int32_t), atom_Int, &_impl->block_length },
524 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id("http://ardour.org/lv2/threads/#schedPolicy"),
525 sizeof(int32_t), atom_Int, &rt_policy },
526 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id("http://ardour.org/lv2/threads/#schedPriority"),
527 sizeof(int32_t), atom_Int, &rt_priority },
528 { LV2_OPTIONS_INSTANCE, 0, 0, 0, 0, NULL }
531 _impl->options = (LV2_Options_Option*) malloc (sizeof (options));
532 memcpy ((void*) _impl->options, (void*) options, sizeof (options));
534 _options_feature.URI = LV2_OPTIONS__options;
535 _options_feature.data = _impl->options;
536 _features[n_features++] = &_options_feature;
540 seen_bankpatch = false;
541 for (uint32_t chn = 0; chn < 16; ++chn) {
542 _bankpatch[chn] = UINT32_MAX;
546 LV2_State_Make_Path* make_path = (LV2_State_Make_Path*)malloc(
547 sizeof(LV2_State_Make_Path));
548 make_path->handle = this;
549 make_path->path = &lv2_state_make_path;
550 _make_path_feature.data = make_path;
552 LV2_Log_Log* log = (LV2_Log_Log*)malloc(sizeof(LV2_Log_Log));
554 log->printf = &log_printf;
555 log->vprintf = &log_vprintf;
556 _log_feature.data = log;
558 const size_t ring_size = _session.engine().raw_buffer_size(DataType::MIDI) * NBUFS;
559 LilvNode* worker_schedule = lilv_new_uri(_world.world, LV2_WORKER__schedule);
560 if (lilv_plugin_has_feature(plugin, worker_schedule)) {
561 LV2_Worker_Schedule* schedule = (LV2_Worker_Schedule*)malloc(
562 sizeof(LV2_Worker_Schedule));
563 _worker = new Worker(this, ring_size);
564 schedule->handle = _worker;
565 schedule->schedule_work = work_schedule;
566 _work_schedule_feature.data = schedule;
567 _features[n_features++] = &_work_schedule_feature;
569 lilv_node_free(worker_schedule);
571 if (_has_state_interface) {
572 // Create a non-threaded worker for use by state restore
573 _state_worker = new Worker(this, ring_size, false);
576 _impl->instance = lilv_plugin_instantiate(plugin, rate, _features);
577 _impl->name = lilv_plugin_get_name(plugin);
578 _impl->author = lilv_plugin_get_author_name(plugin);
580 if (_impl->instance == 0) {
581 error << _("LV2: Failed to instantiate plugin ") << uri() << endmsg;
582 throw failed_constructor();
585 _instance_access_feature.data = (void*)_impl->instance->lv2_handle;
586 _data_access_extension_data.extension_data = _impl->instance->lv2_descriptor->extension_data;
587 _data_access_feature.data = &_data_access_extension_data;
589 LilvNode* worker_iface_uri = lilv_new_uri(_world.world, LV2_WORKER__interface);
590 if (lilv_plugin_has_extension_data(plugin, worker_iface_uri)) {
591 _impl->work_iface = (const LV2_Worker_Interface*)extension_data(
592 LV2_WORKER__interface);
594 lilv_node_free(worker_iface_uri);
597 #ifdef HAVE_LV2_1_2_0
598 LilvNode* options_iface_uri = lilv_new_uri(_world.world, LV2_OPTIONS__interface);
599 if (lilv_plugin_has_extension_data(plugin, options_iface_uri)) {
600 _impl->opts_iface = (const LV2_Options_Interface*)extension_data(
601 LV2_OPTIONS__interface);
603 lilv_node_free(options_iface_uri);
607 _display_interface = (const LV2_Inline_Display_Interface*)
608 extension_data (LV2_INLINEDISPLAY__interface);
610 _midname_interface = (const LV2_Midnam_Interface*)
611 extension_data (LV2_MIDNAM__interface);
612 if (_midname_interface) {
613 _midnam_dirty = true;
618 if (lilv_plugin_has_feature(plugin, _world.lv2_inPlaceBroken)) {
619 error << string_compose(
620 _("LV2: \"%1\" cannot be used, since it cannot do inplace processing."),
621 lilv_node_as_string(_impl->name)) << endmsg;
622 lilv_node_free(_impl->name);
623 lilv_node_free(_impl->author);
624 throw failed_constructor();
627 #ifdef HAVE_LV2_1_2_0
628 LilvNodes *required_features = lilv_plugin_get_required_features (plugin);
629 if (lilv_nodes_contains (required_features, _world.bufz_powerOf2BlockLength) ||
630 lilv_nodes_contains (required_features, _world.bufz_fixedBlockLength)
632 error << string_compose(
633 _("LV2: \"%1\" buffer-size requirements cannot be satisfied."),
634 lilv_node_as_string(_impl->name)) << endmsg;
635 lilv_node_free(_impl->name);
636 lilv_node_free(_impl->author);
637 lilv_nodes_free(required_features);
638 throw failed_constructor();
640 lilv_nodes_free(required_features);
643 LilvNodes* optional_features = lilv_plugin_get_optional_features (plugin);
644 #ifdef HAVE_LV2_1_2_0
645 if (lilv_nodes_contains (optional_features, _world.bufz_coarseBlockLength)) {
646 _no_sample_accurate_ctrl = true;
650 if (lilv_nodes_contains (optional_features, _world.lv2_noSampleAccurateCtrl)) {
651 /* deprecated 2016-Sep-18 in favor of bufz_coarseBlockLength */
652 _no_sample_accurate_ctrl = true;
654 if (lilv_nodes_contains (optional_features, _world.auto_can_write_automatation)) {
655 _can_write_automation = true;
657 if (lilv_nodes_contains (optional_features, _world.inline_display_in_gui)) {
658 _inline_display_in_gui = true;
660 lilv_nodes_free(optional_features);
663 // Load default state
665 /* immediately schedule any work,
666 * so that state restore later will not find a busy
667 * worker. latency_compute_run() flushes any replies
669 _worker->set_synchronous(true);
671 LilvState* state = lilv_state_new_from_world(
672 _world.world, _uri_map.urid_map(), lilv_plugin_get_uri(_impl->plugin));
673 if (state && _has_state_interface) {
674 lilv_state_restore(state, _impl->instance, NULL, NULL, 0, NULL);
676 lilv_state_free(state);
680 const uint32_t num_ports = this->num_ports();
681 for (uint32_t i = 0; i < num_ports; ++i) {
682 const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, i);
684 size_t minimumSize = 0;
686 if (lilv_port_is_a(_impl->plugin, port, _world.lv2_OutputPort)) {
687 flags |= PORT_OUTPUT;
688 } else if (lilv_port_is_a(_impl->plugin, port, _world.lv2_InputPort)) {
691 error << string_compose(
692 "LV2: \"%1\" port %2 is neither input nor output",
693 lilv_node_as_string(_impl->name), i) << endmsg;
694 throw failed_constructor();
697 if (lilv_port_is_a(_impl->plugin, port, _world.lv2_ControlPort)) {
698 flags |= PORT_CONTROL;
699 } else if (lilv_port_is_a(_impl->plugin, port, _world.lv2_AudioPort)) {
701 } else if (lilv_port_is_a(_impl->plugin, port, _world.ev_EventPort)) {
703 flags |= PORT_MIDI; // We assume old event API ports are for MIDI
704 } else if (lilv_port_is_a(_impl->plugin, port, _world.atom_AtomPort)) {
705 LilvNodes* buffer_types = lilv_port_get_value(
706 _impl->plugin, port, _world.atom_bufferType);
707 LilvNodes* atom_supports = lilv_port_get_value(
708 _impl->plugin, port, _world.atom_supports);
710 if (lilv_nodes_contains(buffer_types, _world.atom_Sequence)) {
711 flags |= PORT_SEQUENCE;
712 if (lilv_nodes_contains(atom_supports, _world.midi_MidiEvent)) {
715 if (lilv_nodes_contains(atom_supports, _world.time_Position)) {
716 flags |= PORT_POSITION;
719 if (lilv_nodes_contains(atom_supports, _world.auto_automation_control)) {
720 flags |= PORT_AUTOCTRL;
723 if (lilv_nodes_contains(atom_supports, _world.patch_Message)) {
724 flags |= PORT_PATCHMSG;
725 if (flags & PORT_INPUT) {
726 _patch_port_in_index = i;
728 _patch_port_out_index = i;
732 LilvNodes* min_size_v = lilv_port_get_value(_impl->plugin, port, _world.rsz_minimumSize);
733 LilvNode* min_size = min_size_v ? lilv_nodes_get_first(min_size_v) : NULL;
734 if (min_size && lilv_node_is_int(min_size)) {
735 minimumSize = lilv_node_as_int(min_size);
737 lilv_nodes_free(min_size_v);
738 lilv_nodes_free(buffer_types);
739 lilv_nodes_free(atom_supports);
741 error << string_compose(
742 "LV2: \"%1\" port %2 has no known data type",
743 lilv_node_as_string(_impl->name), i) << endmsg;
744 throw failed_constructor();
747 if ((flags & PORT_INPUT) && (flags & PORT_CONTROL)) {
748 if (lilv_port_has_property(_impl->plugin, port, _world.ext_causesArtifacts)) {
749 flags |= PORT_NOAUTO;
751 if (lilv_port_has_property(_impl->plugin, port, _world.ext_notAutomatic)) {
752 flags |= PORT_NOAUTO;
754 if (lilv_port_has_property(_impl->plugin, port, _world.ext_expensive)) {
755 flags |= PORT_NOAUTO;
759 if (lilv_port_has_property(_impl->plugin, port, _world.auto_automation_controlled)) {
760 if ((flags & PORT_INPUT) && (flags & PORT_CONTROL)) {
761 flags |= PORT_CTRLED;
764 if (lilv_port_has_property(_impl->plugin, port, _world.auto_automation_controller)) {
765 if ((flags & PORT_INPUT) && (flags & PORT_CONTROL)) {
766 flags |= PORT_CTRLER;
771 _port_flags.push_back(flags);
772 _port_minimumSize.push_back(minimumSize);
773 DEBUG_TRACE(DEBUG::LV2, string_compose("port %1 buffer %2 bytes\n", i, minimumSize));
776 _control_data = new float[num_ports];
777 _shadow_data = new float[num_ports];
778 _defaults = new float[num_ports];
779 _ev_buffers = new LV2_Evbuf*[num_ports];
780 memset(_ev_buffers, 0, sizeof(LV2_Evbuf*) * num_ports);
782 const bool latent = lilv_plugin_has_latency(plugin);
783 const uint32_t latency_index = (latent)
784 ? lilv_plugin_get_latency_port_index(plugin)
787 // Build an array of pointers to special parameter buffers
788 void*** params = new void**[num_ports];
789 for (uint32_t i = 0; i < num_ports; ++i) {
792 _impl->designated_input (LV2_TIME__beatsPerMinute, params, (void**)&_bpm_control_port);
793 _impl->designated_input (LV2_CORE__freeWheeling, params, (void**)&_freewheel_control_port);
795 for (uint32_t i = 0; i < num_ports; ++i) {
796 const LilvPort* port = lilv_plugin_get_port_by_index(plugin, i);
797 const LilvNode* sym = lilv_port_get_symbol(plugin, port);
799 // Store index in map so we can look up index by symbol
800 _port_indices.insert(std::make_pair(lilv_node_as_string(sym), i));
802 // Get range and default value if applicable
803 if (parameter_is_control(i)) {
805 lilv_port_get_range(plugin, port, &def, NULL, NULL);
806 _defaults[i] = def ? lilv_node_as_float(def) : 0.0f;
807 if (lilv_port_has_property (plugin, port, _world.lv2_sampleRate)) {
808 _defaults[i] *= _session.sample_rate ();
812 lilv_instance_connect_port(_impl->instance, i, &_control_data[i]);
814 if (latent && i == latency_index) {
816 lilv_port_get_range(_impl->plugin, port, NULL, NULL, &max);
817 _max_latency = max ? lilv_node_as_float(max) : .02 * _sample_rate;
818 _latency_control_port = &_control_data[i];
819 *_latency_control_port = 0;
822 if (parameter_is_input(i)) {
823 _shadow_data[i] = default_value(i);
825 *params[i] = (void*)&_shadow_data[i];
837 LilvUIs* uis = lilv_plugin_get_uis(plugin);
838 if (lilv_uis_size(uis) > 0) {
840 // Look for embeddable UI
841 LILV_FOREACH(uis, u, uis) {
842 const LilvUI* this_ui = lilv_uis_get(uis, u);
843 const LilvNode* this_ui_type = NULL;
844 if (lilv_ui_is_supported(this_ui,
848 // TODO: Multiple UI support
850 _impl->ui_type = this_ui_type;
855 // Look for Gtk native UI
856 LILV_FOREACH(uis, i, uis) {
857 const LilvUI* ui = lilv_uis_get(uis, i);
858 if (lilv_ui_is_a(ui, _world.ui_GtkUI)) {
860 _impl->ui_type = _world.ui_GtkUI;
866 // If Gtk UI is not available, try to find external UI
868 LILV_FOREACH(uis, i, uis) {
869 const LilvUI* ui = lilv_uis_get(uis, i);
870 if (lilv_ui_is_a(ui, _world.ui_externalkx)) {
872 _impl->ui_type = _world.ui_external;
875 if (lilv_ui_is_a(ui, _world.ui_external)) {
877 _impl->ui_type = _world.ui_external;
883 load_supported_properties(_property_descriptors);
884 allocate_atom_event_buffers();
888 LV2Plugin::set_block_size (pframes_t nframes)
890 #ifdef HAVE_LV2_1_2_0
891 if (_impl->opts_iface) {
892 LV2_URID atom_Int = _uri_map.uri_to_id(LV2_ATOM__Int);
893 _impl->block_length = nframes;
894 LV2_Options_Option block_size_option = {
895 LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id ("http://lv2plug.in/ns/ext/buf-size#nominalBlockLength"),
896 sizeof(int32_t), atom_Int, (void*)&_impl->block_length
898 _impl->opts_iface->set (_impl->instance->lv2_handle, &block_size_option);
905 LV2Plugin::requires_fixed_sized_buffers () const
907 /* This controls if Ardour will split the plugin's run()
908 * on automation events in order to pass sample-accurate automation
909 * via standard control-ports.
911 * When returning true Ardour will *not* sub-divide the process-cycle.
912 * Automation events that happen between cycle-start and cycle-end will be
913 * ignored (ctrl values are interpolated to cycle-start).
914 * NB. Atom Sequences are still sample accurate.
916 * Note: This does not guarantee a fixed block-size.
917 * e.g The process cycle may be split when looping, also
918 * the period-size may change any time: see set_block_size()
920 if (get_info()->n_inputs.n_midi() > 0) {
921 /* we don't yet implement midi buffer offsets (for split cycles).
922 * Also connect_and_run() also uses _session.transport_sample() directly
923 * (for BBT) which is not offset for plugin cycle split.
927 return _no_sample_accurate_ctrl;
930 LV2Plugin::~LV2Plugin ()
932 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 destroy\n", name()));
939 std::stringstream ss;
942 MIDI::Name::MidiPatchManager::instance().remove_custom_midnam (ss.str());
946 lilv_instance_free(_impl->instance);
947 lilv_state_free(_impl->state);
948 lilv_node_free(_impl->name);
949 lilv_node_free(_impl->author);
950 #ifdef HAVE_LV2_1_2_0
951 free(_impl->options);
954 free(_impl->queue_draw);
956 free(_impl->bankpatch);
960 free(_log_feature.data);
961 free(_make_path_feature.data);
962 free(_work_schedule_feature.data);
967 delete _state_worker;
969 if (_atom_ev_buffers) {
970 LV2_Evbuf** b = _atom_ev_buffers;
975 free(_atom_ev_buffers);
978 delete [] _control_data;
979 delete [] _shadow_data;
981 delete [] _ev_buffers;
986 LV2Plugin::is_external_ui() const
991 return lilv_ui_is_a(_impl->ui, _world.ui_external) || lilv_ui_is_a(_impl->ui, _world.ui_externalkx);
995 LV2Plugin::is_external_kx() const
1000 return lilv_ui_is_a(_impl->ui, _world.ui_externalkx);
1004 LV2Plugin::ui_is_resizable () const
1006 const LilvNode* s = lilv_ui_get_uri(_impl->ui);
1007 LilvNode* p = lilv_new_uri(_world.world, LV2_CORE__optionalFeature);
1008 LilvNode* fs = lilv_new_uri(_world.world, LV2_UI__fixedSize);
1009 LilvNode* nrs = lilv_new_uri(_world.world, LV2_UI__noUserResize);
1011 LilvNodes* fs_matches = lilv_world_find_nodes(_world.world, s, p, fs);
1012 LilvNodes* nrs_matches = lilv_world_find_nodes(_world.world, s, p, nrs);
1014 lilv_nodes_free(nrs_matches);
1015 lilv_nodes_free(fs_matches);
1016 lilv_node_free(nrs);
1020 return !fs_matches && !nrs_matches;
1025 LV2Plugin::has_inline_display () {
1026 return _display_interface ? true : false;
1030 LV2Plugin::inline_display_in_gui () {
1031 return _inline_display_in_gui;
1034 Plugin::Display_Image_Surface*
1035 LV2Plugin::render_inline_display (uint32_t w, uint32_t h) {
1036 if (_display_interface) {
1037 /* Plugin::Display_Image_Surface is identical to
1038 * LV2_Inline_Display_Image_Surface */
1039 return (Plugin::Display_Image_Surface*) _display_interface->render ((void*)_impl->instance->lv2_handle, w, h);
1045 LV2Plugin::has_midnam () {
1046 return _midname_interface ? true : false;
1050 LV2Plugin::read_midnam () {
1052 if (!_midname_interface || !_midnam_dirty) {
1055 char* midnam = _midname_interface->midnam ((void*)_impl->instance->lv2_handle);
1057 std::stringstream ss;
1060 rv = MIDI::Name::MidiPatchManager::instance().update_custom_midnam (ss.str(), midnam);
1064 info << string_compose(_("LV2: update midnam for plugin '%1'"), name ()) << endmsg;
1066 warning << string_compose(_("LV2: Failed to parse midnam of plugin '%1'"), name ()) << endmsg;
1069 _midname_interface->free (midnam);
1072 _midnam_dirty = false;
1078 LV2Plugin::midnam_model () {
1080 if (!_midname_interface) {
1083 char* model = _midname_interface->model ((void*)_impl->instance->lv2_handle);
1087 _midname_interface->free (model);
1093 LV2Plugin::unique_id() const
1095 return lilv_node_as_uri(lilv_plugin_get_uri(_impl->plugin));
1099 LV2Plugin::uri() const
1101 return lilv_node_as_uri(lilv_plugin_get_uri(_impl->plugin));
1105 LV2Plugin::label() const
1107 return lilv_node_as_string(_impl->name);
1111 LV2Plugin::name() const
1113 return lilv_node_as_string(_impl->name);
1117 LV2Plugin::maker() const
1119 return _impl->author ? lilv_node_as_string (_impl->author) : "Unknown";
1123 LV2Plugin::num_ports() const
1125 return lilv_plugin_get_num_ports(_impl->plugin);
1129 LV2Plugin::parameter_count() const
1131 return lilv_plugin_get_num_ports(_impl->plugin);
1135 LV2Plugin::default_value(uint32_t port)
1137 return _defaults[port];
1141 LV2Plugin::port_symbol(uint32_t index) const
1143 const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, index);
1145 error << name() << ": Invalid port index " << index << endmsg;
1148 const LilvNode* sym = lilv_port_get_symbol(_impl->plugin, port);
1149 return lilv_node_as_string(sym);
1153 LV2Plugin::port_index (const char* symbol) const
1155 const map<string, uint32_t>::const_iterator i = _port_indices.find(symbol);
1156 if (i != _port_indices.end()) {
1159 warning << string_compose(_("LV2: Unknown port %1"), symbol) << endmsg;
1160 return (uint32_t)-1;
1165 LV2Plugin::set_parameter(uint32_t which, float val)
1167 DEBUG_TRACE(DEBUG::LV2, string_compose(
1168 "%1 set parameter %2 to %3\n", name(), which, val));
1170 if (which < lilv_plugin_get_num_ports(_impl->plugin)) {
1171 if (get_parameter (which) == val) {
1175 _shadow_data[which] = val;
1177 warning << string_compose(
1178 _("Illegal parameter number used with plugin \"%1\". "
1179 "This is a bug in either %2 or the LV2 plugin <%3>"),
1180 name(), PROGRAM_NAME, unique_id()) << endmsg;
1183 Plugin::set_parameter(which, val);
1187 LV2Plugin::get_parameter(uint32_t which) const
1189 if (parameter_is_input(which)) {
1190 return (float)_shadow_data[which];
1192 return (float)_control_data[which];
1198 LV2Plugin::get_docs() const
1200 LilvNodes* comments = lilv_plugin_get_value(_impl->plugin, _world.rdfs_comment);
1202 const std::string docs(lilv_node_as_string(lilv_nodes_get_first(comments)));
1203 lilv_nodes_free(comments);
1211 LV2Plugin::get_parameter_docs(uint32_t which) const
1213 LilvNodes* comments = lilv_port_get_value(
1215 lilv_plugin_get_port_by_index(_impl->plugin, which),
1216 _world.rdfs_comment);
1219 const std::string docs(lilv_node_as_string(lilv_nodes_get_first(comments)));
1220 lilv_nodes_free(comments);
1228 LV2Plugin::get_layout (uint32_t which, UILayoutHint& h) const
1230 /// TODO lookup port-properties
1231 if (unique_id () != "urn:ardour:a-eq") {
1236 case 0: h.x0 = 0; h.x1 = 1; h.y0 = 2; h.y1 = 3; break; // Frequency L
1237 case 1: h.x0 = 0; h.x1 = 1; h.y0 = 0; h.y1 = 1; break; // Gain L
1238 case 17: h.x0 = 0; h.x1 = 1; h.y0 = 5; h.y1 = 6; break; // enable L
1240 case 2: h.x0 = 1; h.x1 = 3; h.y0 = 2; h.y1 = 3; break; // Frequency 1
1241 case 3: h.x0 = 1; h.x1 = 3; h.y0 = 0; h.y1 = 1; break; // Gain 1
1242 case 4: h.x0 = 1; h.x1 = 3; h.y0 = 1; h.y1 = 2; break; // Bandwidth 1
1243 case 18: h.x0 = 1; h.x1 = 4; h.y0 = 5; h.y1 = 6; break; // enable 1
1245 case 5: h.x0 = 4; h.x1 = 6; h.y0 = 2; h.y1 = 3; break; // Frequency 2
1246 case 6: h.x0 = 4; h.x1 = 6; h.y0 = 0; h.y1 = 1; break; // Gain 2
1247 case 7: h.x0 = 4; h.x1 = 6; h.y0 = 1; h.y1 = 2; break; // Bandwidth 2
1248 case 19: h.x0 = 4; h.x1 = 7; h.y0 = 5; h.y1 = 6; break; // enable 2
1250 case 8: h.x0 = 7; h.x1 = 9; h.y0 = 2; h.y1 = 3; break; // Frequency 3
1251 case 9: h.x0 = 7; h.x1 = 9; h.y0 = 0; h.y1 = 1; break; // Gain 3
1252 case 10: h.x0 = 7; h.x1 = 9; h.y0 = 1; h.y1 = 2; break; // Bandwidth 3
1253 case 20: h.x0 = 7; h.x1 = 10; h.y0 = 5; h.y1 = 6; break; // enable 3
1255 case 11: h.x0 = 10; h.x1 = 12; h.y0 = 2; h.y1 = 3; break; // Frequency 4
1256 case 12: h.x0 = 10; h.x1 = 12; h.y0 = 0; h.y1 = 1; break; // Gain 4
1257 case 13: h.x0 = 10; h.x1 = 12; h.y0 = 1; h.y1 = 2; break; // Bandwidth 4
1258 case 21: h.x0 = 10; h.x1 = 13; h.y0 = 5; h.y1 = 6; break; // enable 4
1260 case 14: h.x0 = 13; h.x1 = 14; h.y0 = 2; h.y1 = 3; break; // Frequency H
1261 case 15: h.x0 = 13; h.x1 = 14; h.y0 = 0; h.y1 = 1; break; // Gain H
1262 case 22: h.x0 = 13; h.x1 = 14; h.y0 = 5; h.y1 = 6; break; // enable H
1264 case 16: h.x0 = 14; h.x1 = 15; h.y0 = 1; h.y1 = 3; break; // Master Gain
1265 case 23: h.x0 = 14; h.x1 = 15; h.y0 = 5; h.y1 = 6; break; // Master Enable
1273 LV2Plugin::nth_parameter(uint32_t n, bool& ok) const
1276 for (uint32_t c = 0, x = 0; x < lilv_plugin_get_num_ports(_impl->plugin); ++x) {
1277 if (parameter_is_control(x)) {
1289 LV2Plugin::extension_data(const char* uri) const
1291 return lilv_instance_get_extension_data(_impl->instance, uri);
1295 LV2Plugin::c_plugin()
1297 return _impl->plugin;
1303 return (const void*)_impl->ui;
1307 LV2Plugin::c_ui_type()
1309 return (const void*)_impl->ui_type;
1312 /** Directory for all plugin state. */
1314 LV2Plugin::plugin_dir() const
1316 if (!_plugin_state_dir.empty ()){
1317 return Glib::build_filename(_plugin_state_dir, _insert_id.to_s());
1319 return Glib::build_filename(_session.plugins_dir(), _insert_id.to_s());
1323 /** Directory for files created by the plugin (except during save). */
1325 LV2Plugin::scratch_dir() const
1327 return Glib::build_filename(plugin_dir(), "scratch");
1330 /** Directory for snapshots of files in the scratch directory. */
1332 LV2Plugin::file_dir() const
1334 return Glib::build_filename(plugin_dir(), "files");
1337 /** Directory to save state snapshot version @c num into. */
1339 LV2Plugin::state_dir(unsigned num) const
1341 return Glib::build_filename(plugin_dir(), string("state") + PBD::to_string (num));
1344 /** Implementation of state:makePath for files created at instantiation time.
1345 * Note this is not used for files created at save time (Lilv deals with that).
1348 LV2Plugin::lv2_state_make_path(LV2_State_Make_Path_Handle handle,
1351 LV2Plugin* me = (LV2Plugin*)handle;
1352 if (me->_insert_id == PBD::ID("0")) {
1353 warning << string_compose(
1354 "File path \"%1\" requested but LV2 %2 has no insert ID",
1355 path, me->name()) << endmsg;
1356 return g_strdup(path);
1359 const std::string abs_path = Glib::build_filename(me->scratch_dir(), path);
1360 const std::string dirname = Glib::path_get_dirname(abs_path);
1361 g_mkdir_with_parents(dirname.c_str(), 0744);
1363 DEBUG_TRACE(DEBUG::LV2, string_compose("new file path %1 => %2\n",
1366 return g_strndup(abs_path.c_str(), abs_path.length());
1370 LV2Plugin::add_state(XMLNode* root) const
1372 assert(_insert_id != PBD::ID("0"));
1377 for (uint32_t i = 0; i < parameter_count(); ++i) {
1378 if (parameter_is_input(i) && parameter_is_control(i)) {
1379 child = new XMLNode("Port");
1380 child->set_property("symbol", port_symbol(i));
1381 child->set_property("value", _shadow_data[i]);
1382 root->add_child_nocopy(*child);
1386 if (!_plugin_state_dir.empty()) {
1387 root->set_property("template-dir", _plugin_state_dir);
1390 if (_has_state_interface) {
1391 // Provisionally increment state version and create directory
1392 const std::string new_dir = state_dir(++_state_version);
1393 // and keep track of it (for templates & archive)
1394 unsigned int saved_state = _state_version;;
1395 g_mkdir_with_parents(new_dir.c_str(), 0744);
1397 std::string xternal_dir = _session.externals_dir ();
1399 if (!_plugin_state_dir.empty()) {
1400 xternal_dir = Glib::build_filename (_plugin_state_dir, externals_dir_name);
1401 g_mkdir_with_parents(xternal_dir.c_str(), 0744);
1404 LilvState* state = lilv_state_new_from_instance(
1407 _uri_map.urid_map(),
1408 scratch_dir().c_str(),
1410 xternal_dir.c_str(),
1413 const_cast<LV2Plugin*>(this),
1417 if (!_plugin_state_dir.empty() || force_state_save
1419 || !lilv_state_equals(state, _impl->state)) {
1420 lilv_state_save(_world.world,
1421 _uri_map.urid_map(),
1422 _uri_map.urid_unmap(),
1428 if (force_state_save) {
1429 // archive or save-as
1430 lilv_state_free(state);
1433 else if (_plugin_state_dir.empty()) {
1434 // normal session save
1435 lilv_state_free(_impl->state);
1436 _impl->state = state;
1438 // template save (dedicated state-dir)
1439 lilv_state_free(state);
1440 g_rmdir (xternal_dir.c_str()); // try remove unused dir
1444 // State is identical, decrement version and nuke directory
1445 lilv_state_free(state);
1446 PBD::remove_directory(new_dir);
1448 saved_state = _state_version;
1451 root->set_property("state-dir", string("state") + PBD::to_string (saved_state));
1456 get_value(LilvWorld* world, const LilvNode* subject, const LilvNode* predicate)
1458 return lilv_world_get(world, subject, predicate, NULL);
1462 LV2Plugin::find_presets()
1464 /* see also LV2PluginInfo::get_presets */
1465 LilvNode* lv2_appliesTo = lilv_new_uri(_world.world, LV2_CORE__appliesTo);
1466 LilvNode* pset_Preset = lilv_new_uri(_world.world, LV2_PRESETS__Preset);
1467 LilvNode* rdfs_label = lilv_new_uri(_world.world, LILV_NS_RDFS "label");
1468 LilvNode* rdfs_comment = lilv_new_uri(_world.world, LILV_NS_RDFS "comment");
1470 LilvNodes* presets = lilv_plugin_get_related(_impl->plugin, pset_Preset);
1471 LILV_FOREACH(nodes, i, presets) {
1472 const LilvNode* preset = lilv_nodes_get(presets, i);
1473 lilv_world_load_resource(_world.world, preset);
1474 LilvNode* name = get_value(_world.world, preset, rdfs_label);
1475 LilvNode* comment = get_value(_world.world, preset, rdfs_comment);
1476 /* TODO properly identify user vs factory presets.
1477 * here's an indirect condition: only factory presets can have comments
1479 bool userpreset = comment ? false : true;
1481 _presets.insert(std::make_pair(lilv_node_as_string(preset),
1482 Plugin::PresetRecord(
1483 lilv_node_as_string(preset),
1484 lilv_node_as_string(name),
1486 comment ? lilv_node_as_string (comment) : ""
1488 lilv_node_free(name);
1490 warning << string_compose(
1491 _("Plugin \"%1\" preset \"%2\" is missing a label\n"),
1492 lilv_node_as_string(lilv_plugin_get_uri(_impl->plugin)),
1493 lilv_node_as_string(preset)) << endmsg;
1496 lilv_node_free(comment);
1499 lilv_nodes_free(presets);
1501 lilv_node_free(rdfs_comment);
1502 lilv_node_free(rdfs_label);
1503 lilv_node_free(pset_Preset);
1504 lilv_node_free(lv2_appliesTo);
1508 set_port_value(const char* port_symbol,
1514 LV2Plugin* self = (LV2Plugin*)user_data;
1515 if (type != 0 && type != URIMap::instance().urids.atom_Float) {
1516 return; // TODO: Support non-float ports
1519 const uint32_t port_index = self->port_index(port_symbol);
1520 if (port_index != (uint32_t)-1) {
1521 self->set_parameter(port_index, *(const float*)value);
1522 self->PresetPortSetValue (port_index, *(const float*)value); /* EMIT SIGNAL */
1527 LV2Plugin::load_preset(PresetRecord r)
1529 LilvWorld* world = _world.world;
1530 LilvNode* pset = lilv_new_uri(world, r.uri.c_str());
1531 LilvState* state = lilv_state_new_from_world(world, _uri_map.urid_map(), pset);
1533 const LV2_Feature* state_features[2] = { NULL, NULL };
1534 LV2_Worker_Schedule schedule = { _state_worker, work_schedule };
1535 const LV2_Feature state_sched_feature = { LV2_WORKER__schedule, &schedule };
1536 if (_state_worker) {
1537 state_features[0] = &state_sched_feature;
1541 lilv_state_restore(state, _impl->instance, set_port_value, this, 0, state_features);
1542 lilv_state_free(state);
1543 Plugin::load_preset(r);
1546 lilv_node_free(pset);
1551 ARDOUR::lv2plugin_get_port_value(const char* port_symbol,
1556 LV2Plugin *plugin = (LV2Plugin *) user_data;
1558 uint32_t index = plugin->port_index(port_symbol);
1559 if (index != (uint32_t) -1) {
1560 if (plugin->parameter_is_input(index) && plugin->parameter_is_control(index)) {
1562 *size = sizeof(float);
1563 *type = plugin->_uri_map.uri_to_id(LV2_ATOM__Float);
1564 value = &plugin->_shadow_data[index];
1576 LV2Plugin::do_save_preset(string name)
1578 LilvNode* plug_name = lilv_plugin_get_name(_impl->plugin);
1579 const string prefix = legalize_for_uri(lilv_node_as_string(plug_name));
1580 const string base_name = legalize_for_uri(name);
1581 const string file_name = base_name + ".ttl";
1582 #ifdef PLATFORM_WINDOWS
1583 /* http://lv2plug.in/pages/filesystem-hierarchy-standard.html */
1584 std::string appdata = PBD::get_win_special_folder_path (CSIDL_APPDATA);
1585 if (appdata.empty ()) {
1586 // TODO consider a fallback location
1589 const string bundle = Glib::build_filename (
1590 appdata, "LV2", prefix + "_" + base_name + ".lv2");
1592 /* while macOS/OSX user-specific path is
1594 * $HOME/Library/Audio/Plug-Ins/LV2/
1596 * liblilv's LV2 search path on all unices does include ~/.lv2/
1597 * Ardour has been saving lv2 presets to ~/.lv2 for along time,
1598 * so just keep them there.
1600 const string bundle = Glib::build_filename(
1601 Glib::get_home_dir(),
1602 Glib::build_filename(".lv2", prefix + "_" + base_name + ".lv2"));
1605 /* delete reference to old preset (if any) */
1606 const PresetRecord* r = preset_by_label(name);
1608 LilvNode* pset = lilv_new_uri (_world.world, r->uri.c_str());
1610 lilv_world_unload_resource (_world.world, pset);
1611 lilv_node_free(pset);
1615 LilvState* state = lilv_state_new_from_instance(
1618 _uri_map.urid_map(),
1619 scratch_dir().c_str(), // file_dir
1620 bundle.c_str(), // copy_dir
1621 bundle.c_str(), // link_dir
1622 bundle.c_str(), // save_dir
1623 lv2plugin_get_port_value, // get_value
1624 (void*)this, // user_data
1625 LV2_STATE_IS_POD|LV2_STATE_IS_PORTABLE, // flags
1626 _features // features
1629 lilv_state_set_label(state, name.c_str());
1631 _world.world, // world
1632 _uri_map.urid_map(), // map
1633 _uri_map.urid_unmap(), // unmap
1635 NULL, // uri (NULL = use file URI)
1636 bundle.c_str(), // dir
1637 file_name.c_str() // filename
1640 lilv_state_free(state);
1642 std::string uri = Glib::filename_to_uri(Glib::build_filename(bundle, file_name));
1643 LilvNode *node_bundle = lilv_new_uri(_world.world, Glib::filename_to_uri(Glib::build_filename(bundle, "/")).c_str());
1644 LilvNode *node_preset = lilv_new_uri(_world.world, uri.c_str());
1645 lilv_world_unload_resource(_world.world, node_preset);
1646 lilv_world_unload_bundle(_world.world, node_bundle);
1647 lilv_world_load_bundle(_world.world, node_bundle);
1648 lilv_world_load_resource(_world.world, node_preset);
1649 lilv_node_free(node_bundle);
1650 lilv_node_free(node_preset);
1651 lilv_node_free(plug_name);
1656 LV2Plugin::do_remove_preset(string name)
1658 /* Look up preset record by label (FIXME: ick, label as ID) */
1659 const PresetRecord* r = preset_by_label(name);
1664 /* Load a LilvState for the preset. */
1665 LilvWorld* world = _world.world;
1666 LilvNode* pset = lilv_new_uri(world, r->uri.c_str());
1667 LilvState* state = lilv_state_new_from_world(world, _uri_map.urid_map(), pset);
1669 lilv_node_free(pset);
1673 /* Unload preset from world. */
1674 lilv_world_unload_resource(world, pset);
1676 /* Delete it from the file system. This will remove the preset file and the entry
1677 from the manifest. If this results in an empty manifest (i.e. the
1678 preset is the only thing in the bundle), then the bundle is removed. */
1679 lilv_state_delete(world, state);
1681 lilv_state_free(state);
1682 lilv_node_free(pset);
1686 LV2Plugin::has_editor() const
1688 return _impl->ui != NULL;
1692 LV2Plugin::has_message_output() const
1694 for (uint32_t i = 0; i < num_ports(); ++i) {
1695 if ((_port_flags[i] & PORT_SEQUENCE) &&
1696 (_port_flags[i] & PORT_OUTPUT)) {
1704 LV2Plugin::write_to(RingBuffer<uint8_t>* dest,
1708 const uint8_t* body)
1710 const uint32_t buf_size = sizeof(UIMessage) + size;
1711 vector<uint8_t> buf(buf_size);
1713 UIMessage* msg = (UIMessage*)&buf[0];
1715 msg->protocol = protocol;
1717 memcpy(msg + 1, body, size);
1719 return (dest->write(&buf[0], buf_size) == buf_size);
1723 LV2Plugin::write_from_ui(uint32_t index,
1726 const uint8_t* body)
1729 size_t rbs = _session.engine().raw_buffer_size(DataType::MIDI) * NBUFS;
1730 /* buffer data communication from plugin UI to plugin instance.
1731 * this buffer needs to potentially hold
1732 * (port's minimumSize) * (audio-periods) / (UI-periods)
1735 * e.g 48kSPS / 128fpp -> audio-periods = 375 Hz
1736 * ui-periods = 25 Hz (SuperRapidScreenUpdate)
1737 * default minimumSize = 32K (see LV2Plugin::allocate_atom_event_buffers()
1739 * it is NOT safe to overflow (msg.size will be misinterpreted)
1741 uint32_t bufsiz = 32768;
1742 if (_atom_ev_buffers && _atom_ev_buffers[0]) {
1743 bufsiz = lv2_evbuf_get_capacity(_atom_ev_buffers[0]);
1745 int fact = ceilf(_session.sample_rate () / 3000.f);
1746 rbs = max((size_t) bufsiz * std::max (8, fact), rbs);
1747 _from_ui = new RingBuffer<uint8_t>(rbs);
1750 if (!write_to(_from_ui, index, protocol, size, body)) {
1751 error << "Error writing from UI to plugin" << endmsg;
1758 LV2Plugin::write_to_ui(uint32_t index,
1761 const uint8_t* body)
1763 if (!write_to(_to_ui, index, protocol, size, body)) {
1764 error << "Error writing from plugin to UI" << endmsg;
1771 forge_variant(LV2_Atom_Forge* forge, const Variant& value)
1773 switch (value.type()) {
1774 case Variant::NOTHING:
1776 case Variant::BEATS:
1777 // No atom type for this, just forge a double
1778 lv2_atom_forge_double(forge, value.get_beats().to_double());
1781 lv2_atom_forge_bool(forge, value.get_bool());
1783 case Variant::DOUBLE:
1784 lv2_atom_forge_double(forge, value.get_double());
1786 case Variant::FLOAT:
1787 lv2_atom_forge_float(forge, value.get_float());
1790 lv2_atom_forge_int(forge, value.get_int());
1793 lv2_atom_forge_long(forge, value.get_long());
1796 lv2_atom_forge_path(
1797 forge, value.get_path().c_str(), value.get_path().size());
1799 case Variant::STRING:
1800 lv2_atom_forge_string(
1801 forge, value.get_string().c_str(), value.get_string().size());
1805 forge, value.get_uri().c_str(), value.get_uri().size());
1810 /** Get a variant type from a URI, return false iff no match found. */
1812 uri_to_variant_type(const std::string& uri, Variant::Type& type)
1814 if (uri == LV2_ATOM__Bool) {
1815 type = Variant::BOOL;
1816 } else if (uri == LV2_ATOM__Double) {
1817 type = Variant::DOUBLE;
1818 } else if (uri == LV2_ATOM__Float) {
1819 type = Variant::FLOAT;
1820 } else if (uri == LV2_ATOM__Int) {
1821 type = Variant::INT;
1822 } else if (uri == LV2_ATOM__Long) {
1823 type = Variant::LONG;
1824 } else if (uri == LV2_ATOM__Path) {
1825 type = Variant::PATH;
1826 } else if (uri == LV2_ATOM__String) {
1827 type = Variant::STRING;
1828 } else if (uri == LV2_ATOM__URI) {
1829 type = Variant::URI;
1837 LV2Plugin::set_property(uint32_t key, const Variant& value)
1839 if (_patch_port_in_index == (uint32_t)-1) {
1840 error << "LV2: set_property called with unset patch_port_in_index" << endmsg;
1842 } else if (value.type() == Variant::NOTHING) {
1843 error << "LV2: set_property called with void value" << endmsg;
1847 // Set up forge to write to temporary buffer on the stack
1848 LV2_Atom_Forge* forge = &_impl->ui_forge;
1849 LV2_Atom_Forge_Frame sample;
1850 uint8_t buf[PATH_MAX]; // Ought to be enough for anyone...
1852 lv2_atom_forge_set_buffer(forge, buf, sizeof(buf));
1854 // Serialize patch:Set message to set property
1855 #ifdef HAVE_LV2_1_10_0
1856 lv2_atom_forge_object(forge, &sample, 0, _uri_map.urids.patch_Set);
1857 lv2_atom_forge_key(forge, _uri_map.urids.patch_property);
1858 lv2_atom_forge_urid(forge, key);
1859 lv2_atom_forge_key(forge, _uri_map.urids.patch_value);
1861 lv2_atom_forge_blank(forge, &sample, 0, _uri_map.urids.patch_Set);
1862 lv2_atom_forge_property_head(forge, _uri_map.urids.patch_property, 0);
1863 lv2_atom_forge_urid(forge, key);
1864 lv2_atom_forge_property_head(forge, _uri_map.urids.patch_value, 0);
1867 forge_variant(forge, value);
1869 // Write message to UI=>Plugin ring
1870 const LV2_Atom* const atom = (const LV2_Atom*)buf;
1871 write_from_ui(_patch_port_in_index,
1872 _uri_map.urids.atom_eventTransfer,
1873 lv2_atom_total_size(atom),
1874 (const uint8_t*)atom);
1877 const ParameterDescriptor&
1878 LV2Plugin::get_property_descriptor(uint32_t id) const
1880 PropertyDescriptors::const_iterator p = _property_descriptors.find(id);
1881 if (p != _property_descriptors.end()) {
1884 return Plugin::get_property_descriptor(id);
1888 load_parameter_descriptor_units(LilvWorld* lworld, ParameterDescriptor& desc, const LilvNodes* units)
1890 if (lilv_nodes_contains(units, _world.units_midiNote)) {
1891 desc.unit = ParameterDescriptor::MIDI_NOTE;
1892 } else if (lilv_nodes_contains(units, _world.units_db)) {
1893 desc.unit = ParameterDescriptor::DB;
1894 } else if (lilv_nodes_contains(units, _world.units_hz)) {
1895 desc.unit = ParameterDescriptor::HZ;
1897 if (lilv_nodes_size(units) > 0) {
1898 const LilvNode* unit = lilv_nodes_get_first(units);
1899 LilvNode* render = get_value(lworld, unit, _world.units_render);
1901 desc.print_fmt = lilv_node_as_string(render);
1902 /* override lilv's default "%f" format */
1903 if (desc.integer_step) {
1904 replace_all (desc.print_fmt, "%f", "%.0f");
1905 } else if (desc.upper - desc.lower >= 1000) {
1906 replace_all (desc.print_fmt, "%f", "%.1f");
1907 } else if (desc.upper - desc.lower >= 100) {
1908 replace_all (desc.print_fmt, "%f", "%.2f");
1910 replace_all (desc.print_fmt, "%f", "%.3f");
1912 lilv_node_free(render);
1918 load_parameter_descriptor(LV2World& world,
1919 ParameterDescriptor& desc,
1920 Variant::Type datatype,
1921 const LilvNode* subject)
1923 LilvWorld* lworld = _world.world;
1924 LilvNode* label = get_value(lworld, subject, _world.rdfs_label);
1925 LilvNode* def = get_value(lworld, subject, _world.lv2_default);
1926 LilvNode* minimum = get_value(lworld, subject, _world.lv2_minimum);
1927 LilvNode* maximum = get_value(lworld, subject, _world.lv2_maximum);
1928 LilvNodes* units = lilv_world_find_nodes(lworld, subject, _world.units_unit, NULL);
1930 desc.label = lilv_node_as_string(label);
1933 if (lilv_node_is_float(def)) {
1934 desc.normal = lilv_node_as_float(def);
1935 } else if (lilv_node_is_int(def)) {
1936 desc.normal = lilv_node_as_int(def);
1940 if (lilv_node_is_float(minimum)) {
1941 desc.lower = lilv_node_as_float(minimum);
1942 } else if (lilv_node_is_int(minimum)) {
1943 desc.lower = lilv_node_as_int(minimum);
1947 if (lilv_node_is_float(maximum)) {
1948 desc.upper = lilv_node_as_float(maximum);
1949 } else if (lilv_node_is_int(maximum)) {
1950 desc.upper = lilv_node_as_int(maximum);
1953 load_parameter_descriptor_units(lworld, desc, units);
1954 desc.datatype = datatype;
1955 desc.toggled |= datatype == Variant::BOOL;
1956 desc.integer_step |= datatype == Variant::INT || datatype == Variant::LONG;
1957 desc.update_steps();
1959 lilv_nodes_free(units);
1960 lilv_node_free(label);
1961 lilv_node_free(def);
1962 lilv_node_free(minimum);
1963 lilv_node_free(maximum);
1967 LV2Plugin::load_supported_properties(PropertyDescriptors& descs)
1969 LilvWorld* lworld = _world.world;
1970 const LilvNode* subject = lilv_plugin_get_uri(_impl->plugin);
1971 LilvNodes* properties = lilv_world_find_nodes(
1972 lworld, subject, _world.patch_writable, NULL);
1973 LILV_FOREACH(nodes, p, properties) {
1974 // Get label and range
1975 const LilvNode* prop = lilv_nodes_get(properties, p);
1976 LilvNode* range = get_value(lworld, prop, _world.rdfs_range);
1978 warning << string_compose(_("LV2: property <%1> has no range datatype, ignoring"),
1979 lilv_node_as_uri(prop)) << endmsg;
1983 // Convert range to variant type (TODO: support for multiple range types)
1984 Variant::Type datatype;
1985 if (!uri_to_variant_type(lilv_node_as_uri(range), datatype)) {
1986 error << string_compose(_("LV2: property <%1> has unsupported datatype <%1>"),
1987 lilv_node_as_uri(prop), lilv_node_as_uri(range)) << endmsg;
1991 // Add description to result
1992 ParameterDescriptor desc;
1993 desc.key = _uri_map.uri_to_id(lilv_node_as_uri(prop));
1994 desc.datatype = datatype;
1995 load_parameter_descriptor(_world, desc, datatype, prop);
1996 descs.insert(std::make_pair(desc.key, desc));
1998 lilv_node_free(range);
2000 lilv_nodes_free(properties);
2004 LV2Plugin::get_property_value (uint32_t prop_id) const
2006 std::map<uint32_t, Variant>::const_iterator it;
2007 if ((it = _property_values.find (prop_id)) == _property_values.end()) {
2014 LV2Plugin::announce_property_values()
2016 if (_patch_port_in_index == (uint32_t)-1) {
2020 // Set up forge to write to temporary buffer on the stack
2021 LV2_Atom_Forge* forge = &_impl->ui_forge;
2022 LV2_Atom_Forge_Frame sample;
2023 uint8_t buf[PATH_MAX]; // Ought to be enough for anyone...
2025 lv2_atom_forge_set_buffer(forge, buf, sizeof(buf));
2027 // Serialize patch:Get message with no subject (implicitly plugin instance)
2028 #ifdef HAVE_LV2_1_10_0
2029 lv2_atom_forge_object(forge, &sample, 0, _uri_map.urids.patch_Get);
2031 lv2_atom_forge_blank(forge, &sample, 0, _uri_map.urids.patch_Get);
2034 // Write message to UI=>Plugin ring
2035 const LV2_Atom* const atom = (const LV2_Atom*)buf;
2036 write_from_ui(_patch_port_in_index,
2037 _uri_map.urids.atom_eventTransfer,
2038 lv2_atom_total_size(atom),
2039 (const uint8_t*)atom);
2043 LV2Plugin::enable_ui_emission()
2046 /* see note in LV2Plugin::write_from_ui() */
2047 uint32_t bufsiz = 32768;
2048 if (_atom_ev_buffers && _atom_ev_buffers[0]) {
2049 bufsiz = lv2_evbuf_get_capacity(_atom_ev_buffers[0]);
2051 size_t rbs = _session.engine().raw_buffer_size(DataType::MIDI) * NBUFS;
2052 rbs = max((size_t) bufsiz * 8, rbs);
2053 _to_ui = new RingBuffer<uint8_t>(rbs);
2058 LV2Plugin::emit_to_ui(void* controller, UIMessageSink sink)
2064 uint32_t read_space = _to_ui->read_space();
2065 while (read_space > sizeof(UIMessage)) {
2067 if (_to_ui->read((uint8_t*)&msg, sizeof(msg)) != sizeof(msg)) {
2068 error << "Error reading from Plugin=>UI RingBuffer" << endmsg;
2071 vector<uint8_t> body(msg.size);
2072 if (_to_ui->read(&body[0], msg.size) != msg.size) {
2073 error << "Error reading from Plugin=>UI RingBuffer" << endmsg;
2077 sink(controller, msg.index, msg.size, msg.protocol, &body[0]);
2079 read_space -= sizeof(msg) + msg.size;
2084 LV2Plugin::work(Worker& worker, uint32_t size, const void* data)
2086 Glib::Threads::Mutex::Lock lm(_work_mutex);
2087 return _impl->work_iface->work(
2088 _impl->instance->lv2_handle, work_respond, &worker, size, data);
2092 LV2Plugin::work_response(uint32_t size, const void* data)
2094 return _impl->work_iface->work_response(
2095 _impl->instance->lv2_handle, size, data);
2099 LV2Plugin::set_insert_id(PBD::ID id)
2101 if (_insert_id == "0") {
2103 } else if (_insert_id != id) {
2104 lilv_state_free(_impl->state);
2105 _impl->state = NULL;
2111 LV2Plugin::set_state_dir (const std::string& d)
2113 _plugin_state_dir = d;
2117 LV2Plugin::set_state(const XMLNode& node, int version)
2120 XMLNodeConstIterator iter;
2124 if (node.name() != state_node_name()) {
2125 error << _("Bad node sent to LV2Plugin::set_state") << endmsg;
2129 #ifndef NO_PLUGIN_STATE
2131 if (version < 3000) {
2132 nodes = node.children("port");
2134 nodes = node.children("Port");
2137 for (iter = nodes.begin(); iter != nodes.end(); ++iter) {
2142 if (!child->get_property("symbol", sym)) {
2143 warning << _("LV2: port has no symbol, ignored") << endmsg;
2147 map<string, uint32_t>::iterator i = _port_indices.find(sym);
2151 if (i != _port_indices.end()) {
2152 port_id = i->second;
2154 warning << _("LV2: port has unknown index, ignored") << endmsg;
2159 if (!child->get_property("value", val)) {
2160 warning << _("LV2: port has no value, ignored") << endmsg;
2164 set_parameter(port_id, val);
2167 std::string template_dir;
2168 if (node.get_property("template-dir", template_dir)) {
2169 set_state_dir (template_dir);
2173 std::string state_dir;
2174 if (node.get_property("state-dir", state_dir) != 0) {
2175 if (sscanf(state_dir.c_str(), "state%u", &_state_version) != 1) {
2176 error << string_compose(
2177 "LV2: failed to parse state version from \"%1\"",
2178 state_dir) << endmsg;
2181 std::string state_file = Glib::build_filename(
2183 Glib::build_filename(state_dir, "state.ttl"));
2185 LilvState* state = lilv_state_new_from_file(
2186 _world.world, _uri_map.urid_map(), NULL, state_file.c_str());
2188 lilv_state_restore(state, _impl->instance, NULL, NULL, 0, NULL);
2189 lilv_state_free(_impl->state);
2190 _impl->state = state;
2193 if (!_plugin_state_dir.empty ()) {
2194 // force save with session, next time (increment counter)
2195 lilv_state_free (_impl->state);
2196 _impl->state = NULL;
2200 /* Do not call latency_compute_run() concurrently with connect_and_run().
2201 * So far this can only guarnteed when the session is loading,
2202 * and the plugin has not been added to the processor chain.
2204 * Ideally this would clso be called when copying a plugin from another track,
2205 * but NOT when copying the state from a plugin to another (active) plugin
2208 if (_session.loading ()) {
2209 latency_compute_run();
2213 return Plugin::set_state(node, version);
2217 LV2Plugin::get_parameter_descriptor(uint32_t which, ParameterDescriptor& desc) const
2219 const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, which);
2221 error << string_compose("LV2: get descriptor of non-existent port %1", which)
2226 LilvNodes* portunits;
2227 LilvNode *def, *min, *max;
2228 lilv_port_get_range(_impl->plugin, port, &def, &min, &max);
2229 portunits = lilv_port_get_value(_impl->plugin, port, _world.units_unit);
2231 LilvNode* steps = lilv_port_get(_impl->plugin, port, _world.ext_rangeSteps);
2233 // TODO: Once we can rely on lilv 0.18.0 being present,
2234 // load_parameter_descriptor() can be used for ports as well
2235 desc.integer_step = lilv_port_has_property(_impl->plugin, port, _world.lv2_integer);
2236 desc.toggled = lilv_port_has_property(_impl->plugin, port, _world.lv2_toggled);
2237 desc.logarithmic = lilv_port_has_property(_impl->plugin, port, _world.ext_logarithmic);
2238 desc.sr_dependent = lilv_port_has_property(_impl->plugin, port, _world.lv2_sampleRate);
2239 desc.label = lilv_node_as_string(lilv_port_get_name(_impl->plugin, port));
2240 desc.normal = def ? lilv_node_as_float(def) : 0.0f;
2241 desc.lower = min ? lilv_node_as_float(min) : 0.0f;
2242 desc.upper = max ? lilv_node_as_float(max) : 1.0f;
2243 load_parameter_descriptor_units(_world.world, desc, portunits);
2245 if (desc.sr_dependent) {
2246 desc.lower *= _session.sample_rate ();
2247 desc.upper *= _session.sample_rate ();
2250 desc.enumeration = lilv_port_has_property(_impl->plugin, port, _world.lv2_enumeration);
2251 desc.scale_points = get_scale_points(which);
2254 desc.rangesteps = lilv_node_as_float (steps);
2257 desc.update_steps();
2259 lilv_node_free(def);
2260 lilv_node_free(min);
2261 lilv_node_free(max);
2262 lilv_node_free(steps);
2263 lilv_nodes_free(portunits);
2268 Plugin::IOPortDescription
2269 LV2Plugin::describe_io_port (ARDOUR::DataType dt, bool input, uint32_t id) const
2271 PortFlags match = 0;
2273 case DataType::AUDIO:
2276 case DataType::MIDI:
2277 match = PORT_SEQUENCE | PORT_MIDI; // ignore old PORT_EVENT
2280 return Plugin::IOPortDescription ("?");
2284 match |= PORT_INPUT;
2286 match |= PORT_OUTPUT;
2290 uint32_t idx = UINT32_MAX;
2292 uint32_t const num_ports = parameter_count();
2293 for (uint32_t port_index = 0; port_index < num_ports; ++port_index) {
2294 PortFlags flags = _port_flags[port_index];
2295 if ((flags & match) == match) {
2302 if (idx == UINT32_MAX) {
2303 return Plugin::IOPortDescription ("?");
2306 const LilvPort* pport = lilv_plugin_get_port_by_index (_impl->plugin, idx);
2308 LilvNode* name = lilv_port_get_name(_impl->plugin, pport);
2309 Plugin::IOPortDescription iod (lilv_node_as_string (name));
2310 lilv_node_free(name);
2312 /* get the port's pg:group */
2313 LilvNodes* groups = lilv_port_get_value (_impl->plugin, pport, _world.groups_group);
2314 if (lilv_nodes_size (groups) > 0) {
2315 const LilvNode* group = lilv_nodes_get_first (groups);
2316 LilvNodes* grouplabel = lilv_world_find_nodes (_world.world, group, _world.rdfs_label, NULL);
2318 /* get the name of the port-group */
2319 if (lilv_nodes_size (grouplabel) > 0) {
2320 const LilvNode* grpname = lilv_nodes_get_first (grouplabel);
2321 iod.group_name = lilv_node_as_string (grpname);
2323 lilv_nodes_free (grouplabel);
2325 /* get all port designations.
2326 * we're interested in e.g. lv2:designation pg:right */
2327 LilvNodes* designations = lilv_port_get_value (_impl->plugin, pport, _world.lv2_designation);
2328 if (lilv_nodes_size (designations) > 0) {
2329 /* get all pg:elements of the pg:group */
2330 LilvNodes* group_childs = lilv_world_find_nodes (_world.world, group, _world.groups_element, NULL);
2331 if (lilv_nodes_size (group_childs) > 0) {
2332 /* iterate over all port designations .. */
2333 LILV_FOREACH (nodes, i, designations) {
2334 const LilvNode* designation = lilv_nodes_get (designations, i);
2335 /* match the lv2:designation's element against the port-group's element */
2336 LILV_FOREACH (nodes, j, group_childs) {
2337 const LilvNode* group_element = lilv_nodes_get (group_childs, j);
2338 LilvNodes* elem = lilv_world_find_nodes (_world.world, group_element, _world.lv2_designation, designation);
2339 /* found it. Now look up the index (channel-number) of the pg:Element */
2340 if (lilv_nodes_size (elem) > 0) {
2341 LilvNodes* idx = lilv_world_find_nodes (_world.world, lilv_nodes_get_first (elem), _world.lv2_index, NULL);
2342 if (lilv_node_is_int (lilv_nodes_get_first (idx))) {
2343 iod.group_channel = lilv_node_as_int(lilv_nodes_get_first (idx));
2350 lilv_nodes_free (groups);
2351 lilv_nodes_free (designations);
2354 if (lilv_port_has_property(_impl->plugin, pport, _world.lv2_isSideChain)) {
2355 iod.is_sidechain = true;
2361 LV2Plugin::describe_parameter(Evoral::Parameter which)
2363 if (( which.type() == PluginAutomation) && ( which.id() < parameter_count()) ) {
2365 const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, which.id());
2367 if (lilv_port_has_property(_impl->plugin, port, _world.ext_notOnGUI)) {
2368 return X_("hidden");
2371 const LilvPort* fwport = lilv_plugin_get_port_by_designation(_impl->plugin, _world.lv2_InputPort, _world.lv2_freewheeling);
2372 if (fwport && fwport == port) {
2373 return X_("hidden");
2376 if (lilv_port_has_property(_impl->plugin, port, _world.lv2_freewheeling)) {
2377 return X_("hidden");
2380 if (lilv_port_has_property(_impl->plugin, port, _world.lv2_reportsLatency)) {
2381 return X_("latency");
2384 LilvNode* name = lilv_port_get_name(_impl->plugin,
2385 lilv_plugin_get_port_by_index(_impl->plugin, which.id()));
2386 string ret(lilv_node_as_string(name));
2387 lilv_node_free(name);
2395 LV2Plugin::max_latency () const
2397 return _max_latency;
2401 LV2Plugin::plugin_latency() const
2403 if (_latency_control_port) {
2404 return (samplecnt_t)floor(*_latency_control_port);
2410 set<Evoral::Parameter>
2411 LV2Plugin::automatable() const
2413 set<Evoral::Parameter> ret;
2415 for (uint32_t i = 0; i < parameter_count(); ++i) {
2416 if (parameter_is_input(i) && parameter_is_control(i) && !(_port_flags[i] & PORT_NOAUTO)) {
2417 ret.insert(ret.end(), Evoral::Parameter(PluginAutomation, 0, i));
2421 for (PropertyDescriptors::const_iterator p = _property_descriptors.begin();
2422 p != _property_descriptors.end();
2424 ret.insert(ret.end(), Evoral::Parameter(PluginPropertyAutomation, 0, p->first));
2430 LV2Plugin::set_automation_control (uint32_t i, boost::shared_ptr<AutomationControl> c)
2432 if ((_port_flags[i] & (PORT_CTRLED | PORT_CTRLER))) {
2433 DEBUG_TRACE(DEBUG::LV2Automate, string_compose ("Ctrl Port %1\n", i));
2434 _ctrl_map [i] = AutomationCtrlPtr (new AutomationCtrl(c));
2438 LV2Plugin::AutomationCtrlPtr
2439 LV2Plugin::get_automation_control (uint32_t i)
2441 if (_ctrl_map.find (i) == _ctrl_map.end()) {
2442 return AutomationCtrlPtr ();
2444 return _ctrl_map[i];
2448 LV2Plugin::activate()
2450 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 activate\n", name()));
2452 if (!_was_activated) {
2453 lilv_instance_activate(_impl->instance);
2454 _was_activated = true;
2459 LV2Plugin::deactivate()
2461 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 deactivate\n", name()));
2463 if (_was_activated) {
2464 lilv_instance_deactivate(_impl->instance);
2465 _was_activated = false;
2470 LV2Plugin::cleanup()
2472 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 cleanup\n", name()));
2475 lilv_instance_free(_impl->instance);
2476 _impl->instance = NULL;
2480 LV2Plugin::allocate_atom_event_buffers()
2482 /* reserve local scratch buffers for ATOM event-queues */
2483 const LilvPlugin* p = _impl->plugin;
2485 /* count non-MIDI atom event-ports
2486 * TODO: nicely ask drobilla to make a lilv_ call for that
2488 int count_atom_out = 0;
2489 int count_atom_in = 0;
2490 int minimumSize = 32768; // TODO use a per-port minimum-size
2491 for (uint32_t i = 0; i < lilv_plugin_get_num_ports(p); ++i) {
2492 const LilvPort* port = lilv_plugin_get_port_by_index(p, i);
2493 if (lilv_port_is_a(p, port, _world.atom_AtomPort)) {
2494 LilvNodes* buffer_types = lilv_port_get_value(
2495 p, port, _world.atom_bufferType);
2496 LilvNodes* atom_supports = lilv_port_get_value(
2497 p, port, _world.atom_supports);
2499 if (lilv_nodes_contains(buffer_types, _world.atom_Sequence)) {
2500 if (lilv_port_is_a(p, port, _world.lv2_InputPort)) {
2503 if (lilv_port_is_a(p, port, _world.lv2_OutputPort)) {
2506 LilvNodes* min_size_v = lilv_port_get_value(_impl->plugin, port, _world.rsz_minimumSize);
2507 LilvNode* min_size = min_size_v ? lilv_nodes_get_first(min_size_v) : NULL;
2508 if (min_size && lilv_node_is_int(min_size)) {
2509 minimumSize = std::max(minimumSize, lilv_node_as_int(min_size));
2511 lilv_nodes_free(min_size_v);
2513 lilv_nodes_free(buffer_types);
2514 lilv_nodes_free(atom_supports);
2518 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 need buffers for %2 atom-in and %3 atom-out event-ports\n",
2519 name(), count_atom_in, count_atom_out));
2521 const int total_atom_buffers = (count_atom_in + count_atom_out);
2522 if (_atom_ev_buffers || total_atom_buffers == 0) {
2526 DEBUG_TRACE(DEBUG::LV2, string_compose("allocate %1 atom_ev_buffers of %2 bytes\n", total_atom_buffers, minimumSize));
2527 _atom_ev_buffers = (LV2_Evbuf**) malloc((total_atom_buffers + 1) * sizeof(LV2_Evbuf*));
2528 for (int i = 0; i < total_atom_buffers; ++i ) {
2529 _atom_ev_buffers[i] = lv2_evbuf_new(minimumSize, LV2_EVBUF_ATOM,
2530 _uri_map.urids.atom_Chunk, _uri_map.urids.atom_Sequence);
2532 _atom_ev_buffers[total_atom_buffers] = 0;
2536 /** Write an ardour position/time/tempo/meter as an LV2 event.
2537 * @return true on success.
2540 write_position(LV2_Atom_Forge* forge,
2542 const TempoMetric& t,
2543 Timecode::BBT_Time& bbt,
2546 samplepos_t position,
2549 const URIMap::URIDs& urids = URIMap::instance().urids;
2551 uint8_t pos_buf[256];
2552 lv2_atom_forge_set_buffer(forge, pos_buf, sizeof(pos_buf));
2553 LV2_Atom_Forge_Frame sample;
2554 #ifdef HAVE_LV2_1_10_0
2555 lv2_atom_forge_object(forge, &sample, 0, urids.time_Position);
2556 lv2_atom_forge_key(forge, urids.time_frame);
2557 lv2_atom_forge_long(forge, position);
2558 lv2_atom_forge_key(forge, urids.time_speed);
2559 lv2_atom_forge_float(forge, speed);
2560 lv2_atom_forge_key(forge, urids.time_barBeat);
2561 lv2_atom_forge_float(forge, bbt.beats - 1 +
2562 (bbt.ticks / Timecode::BBT_Time::ticks_per_beat));
2563 lv2_atom_forge_key(forge, urids.time_bar);
2564 lv2_atom_forge_long(forge, bbt.bars - 1);
2565 lv2_atom_forge_key(forge, urids.time_beatUnit);
2566 lv2_atom_forge_int(forge, t.meter().note_divisor());
2567 lv2_atom_forge_key(forge, urids.time_beatsPerBar);
2568 lv2_atom_forge_float(forge, t.meter().divisions_per_bar());
2569 lv2_atom_forge_key(forge, urids.time_beatsPerMinute);
2570 lv2_atom_forge_float(forge, bpm);
2572 lv2_atom_forge_blank(forge, &sample, 1, urids.time_Position);
2573 lv2_atom_forge_property_head(forge, urids.time_frame, 0);
2574 lv2_atom_forge_long(forge, position);
2575 lv2_atom_forge_property_head(forge, urids.time_speed, 0);
2576 lv2_atom_forge_float(forge, speed);
2577 lv2_atom_forge_property_head(forge, urids.time_barBeat, 0);
2578 lv2_atom_forge_float(forge, bbt.beats - 1 +
2579 (bbt.ticks / Timecode::BBT_Time::ticks_per_beat));
2580 lv2_atom_forge_property_head(forge, urids.time_bar, 0);
2581 lv2_atom_forge_long(forge, bbt.bars - 1);
2582 lv2_atom_forge_property_head(forge, urids.time_beatUnit, 0);
2583 lv2_atom_forge_int(forge, t.meter().note_divisor());
2584 lv2_atom_forge_property_head(forge, urids.time_beatsPerBar, 0);
2585 lv2_atom_forge_float(forge, t.meter().divisions_per_bar());
2586 lv2_atom_forge_property_head(forge, urids.time_beatsPerMinute, 0);
2587 lv2_atom_forge_float(forge, bpm);
2590 LV2_Evbuf_Iterator end = lv2_evbuf_end(buf);
2591 const LV2_Atom* const atom = (const LV2_Atom*)pos_buf;
2592 return lv2_evbuf_write(&end, offset, 0, atom->type, atom->size,
2593 (const uint8_t*)(atom + 1));
2597 LV2Plugin::connect_and_run(BufferSet& bufs,
2598 samplepos_t start, samplepos_t end, double speed,
2599 ChanMapping const& in_map, ChanMapping const& out_map,
2600 pframes_t nframes, samplecnt_t offset)
2602 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 run %2 offset %3\n", name(), nframes, offset));
2603 Plugin::connect_and_run(bufs, start, end, speed, in_map, out_map, nframes, offset);
2605 cycles_t then = get_cycles();
2607 TempoMap& tmap = _session.tempo_map();
2608 Metrics::const_iterator metric_i = tmap.metrics_end();
2609 TempoMetric tmetric = tmap.metric_at(start, &metric_i);
2611 if (_freewheel_control_port) {
2612 *_freewheel_control_port = _session.engine().freewheeling() ? 1.f : 0.f;
2615 if (_bpm_control_port) {
2616 *_bpm_control_port = tmap.tempo_at_sample (start).note_types_per_minute();
2620 if (_can_write_automation && start != _next_cycle_start) {
2621 // add guard-points after locating
2622 for (AutomationCtrlMap::iterator i = _ctrl_map.begin(); i != _ctrl_map.end(); ++i) {
2623 i->second->guard = true;
2628 ChanCount bufs_count;
2629 bufs_count.set(DataType::AUDIO, 1);
2630 bufs_count.set(DataType::MIDI, 1);
2631 BufferSet& silent_bufs = _session.get_silent_buffers(bufs_count);
2632 BufferSet& scratch_bufs = _session.get_scratch_buffers(bufs_count);
2633 uint32_t const num_ports = parameter_count();
2634 uint32_t const nil_index = std::numeric_limits<uint32_t>::max();
2636 uint32_t audio_in_index = 0;
2637 uint32_t audio_out_index = 0;
2638 uint32_t midi_in_index = 0;
2639 uint32_t midi_out_index = 0;
2640 uint32_t atom_port_index = 0;
2641 for (uint32_t port_index = 0; port_index < num_ports; ++port_index) {
2643 uint32_t index = nil_index;
2644 PortFlags flags = _port_flags[port_index];
2646 if (flags & PORT_AUDIO) {
2647 if (flags & PORT_INPUT) {
2648 index = in_map.get(DataType::AUDIO, audio_in_index++, &valid);
2650 ? bufs.get_audio(index).data(offset)
2651 : silent_bufs.get_audio(0).data(offset);
2653 index = out_map.get(DataType::AUDIO, audio_out_index++, &valid);
2655 ? bufs.get_audio(index).data(offset)
2656 : scratch_bufs.get_audio(0).data(offset);
2658 } else if (flags & (PORT_EVENT|PORT_SEQUENCE)) {
2659 /* FIXME: The checks here for bufs.count().n_midi() > index shouldn't
2660 be necessary, but the mapping is illegal in some cases. Ideally
2661 that should be fixed, but this is easier...
2663 if (flags & PORT_MIDI) {
2664 if (flags & PORT_INPUT) {
2665 index = in_map.get(DataType::MIDI, midi_in_index++, &valid);
2667 index = out_map.get(DataType::MIDI, midi_out_index++, &valid);
2669 if (valid && bufs.count().n_midi() > index) {
2670 /* Note, ensure_lv2_bufsize() is not RT safe!
2671 * However free()/alloc() is only called if a
2672 * plugin requires a rsz:minimumSize buffersize
2673 * and the existing buffer if smaller.
2675 bufs.ensure_lv2_bufsize((flags & PORT_INPUT), index, _port_minimumSize[port_index]);
2676 _ev_buffers[port_index] = bufs.get_lv2_midi(
2677 (flags & PORT_INPUT), index, (flags & PORT_EVENT));
2679 } else if ((flags & PORT_POSITION) && (flags & PORT_INPUT)) {
2680 lv2_evbuf_reset(_atom_ev_buffers[atom_port_index], true);
2681 _ev_buffers[port_index] = _atom_ev_buffers[atom_port_index++];
2685 if (valid && (flags & PORT_INPUT)) {
2686 if ((flags & PORT_POSITION)) {
2687 Timecode::BBT_Time bbt (tmap.bbt_at_sample (start));
2688 double bpm = tmap.tempo_at_sample (start).note_types_per_minute();
2689 double beatpos = (bbt.bars - 1) * tmetric.meter().divisions_per_bar()
2691 + (bbt.ticks / Timecode::BBT_Time::ticks_per_beat);
2692 beatpos *= tmetric.meter().note_divisor() / 4.0;
2693 if (start != _next_cycle_start ||
2694 speed != _next_cycle_speed ||
2695 rint (1000 * beatpos) != rint(1000 * _next_cycle_beat) ||
2696 bpm != _current_bpm) {
2697 // Transport or Tempo has changed, write position at cycle start
2698 write_position(&_impl->forge, _ev_buffers[port_index],
2699 tmetric, bbt, speed, bpm, start, 0);
2703 // Get MIDI iterator range (empty range if no MIDI)
2704 MidiBuffer::iterator m = (index != nil_index)
2705 ? bufs.get_midi(index).begin()
2706 : silent_bufs.get_midi(0).end();
2707 MidiBuffer::iterator m_end = (index != nil_index)
2708 ? bufs.get_midi(index).end()
2711 // Now merge MIDI and any transport events into the buffer
2712 const uint32_t type = _uri_map.urids.midi_MidiEvent;
2713 const samplepos_t tend = end;
2715 while (m != m_end || (metric_i != tmap.metrics_end() &&
2716 (*metric_i)->sample() < tend)) {
2717 MetricSection* metric = (metric_i != tmap.metrics_end())
2719 if (m != m_end && (!metric || metric->sample() > (*m).time())) {
2720 const Evoral::Event<samplepos_t> ev(*m, false);
2721 if (ev.time() < nframes) {
2722 LV2_Evbuf_Iterator eend = lv2_evbuf_end(_ev_buffers[port_index]);
2723 lv2_evbuf_write(&eend, ev.time(), 0, type, ev.size(), ev.buffer());
2727 tmetric.set_metric(metric);
2728 Timecode::BBT_Time bbt;
2729 bbt = tmap.bbt_at_sample (metric->sample());
2730 double bpm = tmap.tempo_at_sample (start/*XXX*/).note_types_per_minute();
2731 write_position(&_impl->forge, _ev_buffers[port_index],
2732 tmetric, bbt, speed, bpm,
2734 metric->sample() - start);
2738 } else if (!valid) {
2739 // Nothing we understand or care about, connect to scratch
2740 // see note for midi-buffer size above
2741 scratch_bufs.ensure_lv2_bufsize((flags & PORT_INPUT),
2742 0, _port_minimumSize[port_index]);
2743 _ev_buffers[port_index] = scratch_bufs.get_lv2_midi(
2744 (flags & PORT_INPUT), 0, (flags & PORT_EVENT));
2747 buf = lv2_evbuf_get_buffer(_ev_buffers[port_index]);
2749 continue; // Control port, leave buffer alone
2751 lilv_instance_connect_port(_impl->instance, port_index, buf);
2754 // Read messages from UI and push into appropriate buffers
2756 uint32_t read_space = _from_ui->read_space();
2757 while (read_space > sizeof(UIMessage)) {
2759 if (_from_ui->read((uint8_t*)&msg, sizeof(msg)) != sizeof(msg)) {
2760 error << "Error reading from UI=>Plugin RingBuffer" << endmsg;
2763 vector<uint8_t> body(msg.size);
2764 if (_from_ui->read(&body[0], msg.size) != msg.size) {
2765 error << "Error reading from UI=>Plugin RingBuffer" << endmsg;
2768 if (msg.protocol == URIMap::instance().urids.atom_eventTransfer) {
2769 LV2_Evbuf* buf = _ev_buffers[msg.index];
2770 LV2_Evbuf_Iterator i = lv2_evbuf_end(buf);
2771 const LV2_Atom* const atom = (const LV2_Atom*)&body[0];
2772 if (!lv2_evbuf_write(&i, nframes - 1, 0, atom->type, atom->size,
2773 (const uint8_t*)(atom + 1))) {
2774 error << "Failed to write data to LV2 event buffer\n";
2777 error << "Received unknown message type from UI" << endmsg;
2779 read_space -= sizeof(UIMessage) + msg.size;
2786 for (uint32_t port_index = 0; port_index < num_ports; ++port_index) {
2787 PortFlags flags = _port_flags[port_index];
2790 /* TODO ask drobilla about comment
2791 * "Make Ardour event buffers generic so plugins can communicate"
2792 * in libs/ardour/buffer_set.cc:310
2794 * ideally the user could choose which of the following two modes
2795 * to use (e.g. instrument/effect chains MIDI OUT vs MIDI TRHU).
2797 * This implementation follows the discussion on IRC Mar 16 2013 16:47 UTC
2798 * 16:51 < drobilla> rgareus: [..] i.e always replace with MIDI output [of LV2 plugin] if it's there
2799 * 16:52 < drobilla> rgareus: That would probably be good enough [..] to make users not complain
2800 * for quite a while at least ;)
2802 // copy output of LV2 plugin's MIDI port to Ardour MIDI buffers -- MIDI OUT
2803 if ((flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE|PORT_MIDI))) {
2804 const uint32_t buf_index = out_map.get(
2805 DataType::MIDI, midi_out_index++, &valid);
2807 bufs.forward_lv2_midi(_ev_buffers[port_index], buf_index);
2810 // Flush MIDI (write back to Ardour MIDI buffers) -- MIDI THRU
2811 else if ((flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE))) {
2812 const uint32_t buf_index = out_map.get(
2813 DataType::MIDI, midi_out_index++, &valid);
2815 bufs.flush_lv2_midi(true, buf_index);
2819 // Write messages to UI
2820 if ((_to_ui || _can_write_automation || _patch_port_out_index != (uint32_t)-1) &&
2821 (flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE))) {
2822 LV2_Evbuf* buf = _ev_buffers[port_index];
2823 for (LV2_Evbuf_Iterator i = lv2_evbuf_begin(buf);
2824 lv2_evbuf_is_valid(i);
2825 i = lv2_evbuf_next(i)) {
2826 uint32_t samples, subframes, type, size;
2828 lv2_evbuf_get(i, &samples, &subframes, &type, &size, &data);
2831 // Intercept Automation Write Events
2832 if ((flags & PORT_AUTOCTRL)) {
2833 LV2_Atom* atom = (LV2_Atom*)(data - sizeof(LV2_Atom));
2834 if (atom->type == _uri_map.urids.atom_Blank ||
2835 atom->type == _uri_map.urids.atom_Object) {
2836 LV2_Atom_Object* obj = (LV2_Atom_Object*)atom;
2837 if (obj->body.otype == _uri_map.urids.auto_event) {
2838 // only if transport_rolling ??
2839 const LV2_Atom* parameter = NULL;
2840 const LV2_Atom* value = NULL;
2841 lv2_atom_object_get(obj,
2842 _uri_map.urids.auto_parameter, ¶meter,
2843 _uri_map.urids.auto_value, &value,
2845 if (parameter && value) {
2846 const uint32_t p = ((const LV2_Atom_Int*)parameter)->body;
2847 const float v = ((const LV2_Atom_Float*)value)->body;
2848 // -> add automation event..
2849 DEBUG_TRACE(DEBUG::LV2Automate,
2850 string_compose ("Event p: %1 t: %2 v: %3\n", p, samples, v));
2851 AutomationCtrlPtr c = get_automation_control (p);
2853 (c->ac->automation_state() == Touch || c->ac->automation_state() == Write)
2855 samplepos_t when = std::max ((samplepos_t) 0, start + samples - _current_latency);
2856 assert (start + samples - _current_latency >= 0);
2859 c->ac->list()->add (when, v, true, true);
2861 c->ac->set_double (v, when, true);
2866 else if (obj->body.otype == _uri_map.urids.auto_setup) {
2867 // TODO optional arguments, for now we assume the plugin
2868 // writes automation for its own inputs
2869 // -> put them in "touch" mode (preferably "exclusive plugin touch(TM)"
2870 for (AutomationCtrlMap::iterator i = _ctrl_map.begin(); i != _ctrl_map.end(); ++i) {
2871 if (_port_flags[i->first] & PORT_CTRLED) {
2872 DEBUG_TRACE(DEBUG::LV2Automate,
2873 string_compose ("Setup p: %1\n", i->first));
2874 i->second->ac->set_automation_state (Touch);
2878 else if (obj->body.otype == _uri_map.urids.auto_finalize) {
2879 // set [touched] parameters to "play" ??
2880 // allow plugin to change its mode (from analyze to apply)
2881 const LV2_Atom* parameter = NULL;
2882 const LV2_Atom* value = NULL;
2883 lv2_atom_object_get(obj,
2884 _uri_map.urids.auto_parameter, ¶meter,
2885 _uri_map.urids.auto_value, &value,
2887 if (parameter && value) {
2888 const uint32_t p = ((const LV2_Atom_Int*)parameter)->body;
2889 const float v = ((const LV2_Atom_Float*)value)->body;
2890 AutomationCtrlPtr c = get_automation_control (p);
2891 DEBUG_TRACE(DEBUG::LV2Automate,
2892 string_compose ("Finalize p: %1 v: %2\n", p, v));
2893 if (c && _port_flags[p] & PORT_CTRLER) {
2894 c->ac->set_value(v, Controllable::NoGroup);
2897 DEBUG_TRACE(DEBUG::LV2Automate, "Finalize\n");
2899 for (AutomationCtrlMap::iterator i = _ctrl_map.begin(); i != _ctrl_map.end(); ++i) {
2900 // guard will be false if an event was written
2901 if ((_port_flags[i->first] & PORT_CTRLED) && !i->second->guard) {
2902 DEBUG_TRACE(DEBUG::LV2Automate,
2903 string_compose ("Thin p: %1\n", i->first));
2904 i->second->ac->alist ()->thin (20);
2908 else if (obj->body.otype == _uri_map.urids.auto_start) {
2909 const LV2_Atom* parameter = NULL;
2910 lv2_atom_object_get(obj,
2911 _uri_map.urids.auto_parameter, ¶meter,
2914 const uint32_t p = ((const LV2_Atom_Int*)parameter)->body;
2915 AutomationCtrlPtr c = get_automation_control (p);
2916 DEBUG_TRACE(DEBUG::LV2Automate, string_compose ("Start Touch p: %1\n", p));
2918 c->ac->start_touch (std::max ((samplepos_t)0, start - _current_latency));
2923 else if (obj->body.otype == _uri_map.urids.auto_end) {
2924 const LV2_Atom* parameter = NULL;
2925 lv2_atom_object_get(obj,
2926 _uri_map.urids.auto_parameter, ¶meter,
2929 const uint32_t p = ((const LV2_Atom_Int*)parameter)->body;
2930 AutomationCtrlPtr c = get_automation_control (p);
2931 DEBUG_TRACE(DEBUG::LV2Automate, string_compose ("End Touch p: %1\n", p));
2933 c->ac->stop_touch (std::max ((samplepos_t)0, start - _current_latency));
2940 // Intercept state dirty message
2941 if (_has_state_interface /* && (flags & PORT_DIRTYMSG)*/) {
2942 LV2_Atom* atom = (LV2_Atom*)(data - sizeof(LV2_Atom));
2943 if (atom->type == _uri_map.urids.atom_Blank ||
2944 atom->type == _uri_map.urids.atom_Object) {
2945 LV2_Atom_Object* obj = (LV2_Atom_Object*)atom;
2946 if (obj->body.otype == _uri_map.urids.state_StateChanged) {
2947 _session.set_dirty ();
2952 // Intercept patch change messages to emit PropertyChanged signal
2953 if ((flags & PORT_PATCHMSG)) {
2954 LV2_Atom* atom = (LV2_Atom*)(data - sizeof(LV2_Atom));
2955 if (atom->type == _uri_map.urids.atom_Blank ||
2956 atom->type == _uri_map.urids.atom_Object) {
2957 LV2_Atom_Object* obj = (LV2_Atom_Object*)atom;
2958 if (obj->body.otype == _uri_map.urids.patch_Set) {
2959 const LV2_Atom* property = NULL;
2960 const LV2_Atom* value = NULL;
2961 lv2_atom_object_get(obj,
2962 _uri_map.urids.patch_property, &property,
2963 _uri_map.urids.patch_value, &value,
2966 if (property && value &&
2967 property->type == _uri_map.urids.atom_URID &&
2968 value->type == _uri_map.urids.atom_Path) {
2969 const uint32_t prop_id = ((const LV2_Atom_URID*)property)->body;
2970 const char* path = (const char*)LV2_ATOM_BODY_CONST(value);
2972 // Emit PropertyChanged signal for UI
2973 // TODO: This should emit the control's Changed signal
2974 PropertyChanged(prop_id, Variant(Variant::PATH, path));
2975 _property_values[prop_id] = Variant(Variant::PATH, path);
2977 std::cerr << "warning: patch:Set for unknown property" << std::endl;
2983 if (!_to_ui) continue;
2984 write_to_ui(port_index, URIMap::instance().urids.atom_eventTransfer,
2985 size + sizeof(LV2_Atom),
2986 data - sizeof(LV2_Atom));
2991 cycles_t now = get_cycles();
2992 set_cycles((uint32_t)(now - then));
2994 // Update expected transport information for next cycle so we can detect changes
2995 _next_cycle_speed = speed;
2996 _next_cycle_start = end;
2999 /* keep track of lv2:timePosition like plugins can do.
3000 * Note: for no-midi plugins, we only ever send information at cycle-start,
3001 * so it needs to be realative to that.
3003 TempoMetric t = tmap.metric_at(start);
3004 _current_bpm = tmap.tempo_at_sample (start).note_types_per_minute();
3005 Timecode::BBT_Time bbt (tmap.bbt_at_sample (start));
3006 double beatpos = (bbt.bars - 1) * t.meter().divisions_per_bar()
3008 + (bbt.ticks / Timecode::BBT_Time::ticks_per_beat);
3009 beatpos *= tmetric.meter().note_divisor() / 4.0;
3010 _next_cycle_beat = beatpos + nframes * speed * _current_bpm / (60.f * _session.sample_rate());
3013 if (_latency_control_port) {
3014 samplecnt_t new_latency = signal_latency ();
3015 _current_latency = new_latency;
3021 LV2Plugin::parameter_is_control(uint32_t param) const
3023 assert(param < _port_flags.size());
3024 return _port_flags[param] & PORT_CONTROL;
3028 LV2Plugin::parameter_is_audio(uint32_t param) const
3030 assert(param < _port_flags.size());
3031 return _port_flags[param] & PORT_AUDIO;
3035 LV2Plugin::parameter_is_event(uint32_t param) const
3037 assert(param < _port_flags.size());
3038 return _port_flags[param] & PORT_EVENT;
3042 LV2Plugin::parameter_is_output(uint32_t param) const
3044 assert(param < _port_flags.size());
3045 return _port_flags[param] & PORT_OUTPUT;
3049 LV2Plugin::parameter_is_input(uint32_t param) const
3051 assert(param < _port_flags.size());
3052 return _port_flags[param] & PORT_INPUT;
3056 LV2Plugin::designated_bypass_port ()
3058 const LilvPort* port = NULL;
3059 LilvNode* designation = lilv_new_uri (_world.world, LV2_CORE_PREFIX "enabled");
3060 port = lilv_plugin_get_port_by_designation (
3061 _impl->plugin, _world.lv2_InputPort, designation);
3062 lilv_node_free(designation);
3064 return lilv_port_get_index (_impl->plugin, port);
3067 /* deprecated on 2016-Sep-18 in favor of lv2:enabled */
3068 designation = lilv_new_uri (_world.world, LV2_PROCESSING_URI__enable);
3069 port = lilv_plugin_get_port_by_designation (
3070 _impl->plugin, _world.lv2_InputPort, designation);
3071 lilv_node_free(designation);
3073 return lilv_port_get_index (_impl->plugin, port);
3079 boost::shared_ptr<ScalePoints>
3080 LV2Plugin::get_scale_points(uint32_t port_index) const
3082 const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, port_index);
3083 LilvScalePoints* points = lilv_port_get_scale_points(_impl->plugin, port);
3085 boost::shared_ptr<ScalePoints> ret;
3090 ret = boost::shared_ptr<ScalePoints>(new ScalePoints());
3092 LILV_FOREACH(scale_points, i, points) {
3093 const LilvScalePoint* p = lilv_scale_points_get(points, i);
3094 const LilvNode* label = lilv_scale_point_get_label(p);
3095 const LilvNode* value = lilv_scale_point_get_value(p);
3096 if (label && (lilv_node_is_float(value) || lilv_node_is_int(value))) {
3097 ret->insert(make_pair(lilv_node_as_string(label),
3098 lilv_node_as_float(value)));
3102 lilv_scale_points_free(points);
3107 LV2Plugin::run(pframes_t nframes, bool sync_work)
3109 uint32_t const N = parameter_count();
3110 for (uint32_t i = 0; i < N; ++i) {
3111 if (parameter_is_control(i) && parameter_is_input(i)) {
3112 _control_data[i] = _shadow_data[i];
3117 // Execute work synchronously if we're freewheeling (export)
3118 _worker->set_synchronous(sync_work || session().engine().freewheeling());
3121 // Run the plugin for this cycle
3122 lilv_instance_run(_impl->instance, nframes);
3124 // Emit any queued worker responses (calls a plugin callback)
3125 if (_state_worker) {
3126 _state_worker->emit_responses();
3129 _worker->emit_responses();
3132 // Notify the plugin that a work run cycle is complete
3133 if (_impl->work_iface) {
3134 if (_impl->work_iface->end_run) {
3135 _impl->work_iface->end_run(_impl->instance->lv2_handle);
3141 LV2Plugin::latency_compute_run()
3143 if (!_latency_control_port) {
3147 // Run the plugin so that it can set its latency parameter
3149 bool was_activated = _was_activated;
3152 uint32_t port_index = 0;
3153 uint32_t in_index = 0;
3154 uint32_t out_index = 0;
3156 // this is done in the main thread. non realtime.
3157 const samplecnt_t bufsize = _engine.samples_per_cycle();
3158 float *buffer = (float*) malloc(_engine.samples_per_cycle() * sizeof(float));
3160 memset(buffer, 0, sizeof(float) * bufsize);
3162 // FIXME: Ensure plugins can handle in-place processing
3166 while (port_index < parameter_count()) {
3167 if (parameter_is_audio(port_index)) {
3168 if (parameter_is_input(port_index)) {
3169 lilv_instance_connect_port(_impl->instance, port_index, buffer);
3171 } else if (parameter_is_output(port_index)) {
3172 lilv_instance_connect_port(_impl->instance, port_index, buffer);
3181 if (was_activated) {
3188 LV2Plugin::Impl::designated_input (const char* uri, void** bufptrs[], void** bufptr)
3190 const LilvPort* port = NULL;
3191 LilvNode* designation = lilv_new_uri(_world.world, uri);
3192 port = lilv_plugin_get_port_by_designation(
3193 plugin, _world.lv2_InputPort, designation);
3194 lilv_node_free(designation);
3196 bufptrs[lilv_port_get_index(plugin, port)] = bufptr;
3201 static bool lv2_filter (const string& str, void* /*arg*/)
3203 /* Not a dotfile, has a prefix before a period, suffix is "lv2" */
3205 return str[0] != '.' && (str.length() > 3 && str.find (".lv2") == (str.length() - 4));
3209 LV2World::LV2World()
3210 : world(lilv_world_new())
3211 , _bundle_checked(false)
3213 atom_AtomPort = lilv_new_uri(world, LV2_ATOM__AtomPort);
3214 atom_Chunk = lilv_new_uri(world, LV2_ATOM__Chunk);
3215 atom_Sequence = lilv_new_uri(world, LV2_ATOM__Sequence);
3216 atom_bufferType = lilv_new_uri(world, LV2_ATOM__bufferType);
3217 atom_supports = lilv_new_uri(world, LV2_ATOM__supports);
3218 atom_eventTransfer = lilv_new_uri(world, LV2_ATOM__eventTransfer);
3219 ev_EventPort = lilv_new_uri(world, LILV_URI_EVENT_PORT);
3220 ext_logarithmic = lilv_new_uri(world, LV2_PORT_PROPS__logarithmic);
3221 ext_notOnGUI = lilv_new_uri(world, LV2_PORT_PROPS__notOnGUI);
3222 ext_expensive = lilv_new_uri(world, LV2_PORT_PROPS__expensive);
3223 ext_causesArtifacts= lilv_new_uri(world, LV2_PORT_PROPS__causesArtifacts);
3224 ext_notAutomatic = lilv_new_uri(world, LV2_PORT_PROPS__notAutomatic);
3225 ext_rangeSteps = lilv_new_uri(world, LV2_PORT_PROPS__rangeSteps);
3226 groups_group = lilv_new_uri(world, LV2_PORT_GROUPS__group);
3227 groups_element = lilv_new_uri(world, LV2_PORT_GROUPS__element);
3228 lv2_AudioPort = lilv_new_uri(world, LILV_URI_AUDIO_PORT);
3229 lv2_ControlPort = lilv_new_uri(world, LILV_URI_CONTROL_PORT);
3230 lv2_InputPort = lilv_new_uri(world, LILV_URI_INPUT_PORT);
3231 lv2_OutputPort = lilv_new_uri(world, LILV_URI_OUTPUT_PORT);
3232 lv2_inPlaceBroken = lilv_new_uri(world, LV2_CORE__inPlaceBroken);
3233 lv2_isSideChain = lilv_new_uri(world, LV2_CORE_PREFIX "isSideChain");
3234 lv2_index = lilv_new_uri(world, LV2_CORE__index);
3235 lv2_integer = lilv_new_uri(world, LV2_CORE__integer);
3236 lv2_default = lilv_new_uri(world, LV2_CORE__default);
3237 lv2_minimum = lilv_new_uri(world, LV2_CORE__minimum);
3238 lv2_maximum = lilv_new_uri(world, LV2_CORE__maximum);
3239 lv2_reportsLatency = lilv_new_uri(world, LV2_CORE__reportsLatency);
3240 lv2_sampleRate = lilv_new_uri(world, LV2_CORE__sampleRate);
3241 lv2_toggled = lilv_new_uri(world, LV2_CORE__toggled);
3242 lv2_designation = lilv_new_uri(world, LV2_CORE__designation);
3243 lv2_enumeration = lilv_new_uri(world, LV2_CORE__enumeration);
3244 lv2_freewheeling = lilv_new_uri(world, LV2_CORE__freeWheeling);
3245 midi_MidiEvent = lilv_new_uri(world, LILV_URI_MIDI_EVENT);
3246 rdfs_comment = lilv_new_uri(world, LILV_NS_RDFS "comment");
3247 rdfs_label = lilv_new_uri(world, LILV_NS_RDFS "label");
3248 rdfs_range = lilv_new_uri(world, LILV_NS_RDFS "range");
3249 rsz_minimumSize = lilv_new_uri(world, LV2_RESIZE_PORT__minimumSize);
3250 time_Position = lilv_new_uri(world, LV2_TIME__Position);
3251 ui_GtkUI = lilv_new_uri(world, LV2_UI__GtkUI);
3252 ui_external = lilv_new_uri(world, "http://lv2plug.in/ns/extensions/ui#external");
3253 ui_externalkx = lilv_new_uri(world, "http://kxstudio.sf.net/ns/lv2ext/external-ui#Widget");
3254 units_unit = lilv_new_uri(world, LV2_UNITS__unit);
3255 units_render = lilv_new_uri(world, LV2_UNITS__render);
3256 units_hz = lilv_new_uri(world, LV2_UNITS__hz);
3257 units_midiNote = lilv_new_uri(world, LV2_UNITS__midiNote);
3258 units_db = lilv_new_uri(world, LV2_UNITS__db);
3259 patch_writable = lilv_new_uri(world, LV2_PATCH__writable);
3260 patch_Message = lilv_new_uri(world, LV2_PATCH__Message);
3262 lv2_noSampleAccurateCtrl = lilv_new_uri(world, "http://ardour.org/lv2/ext#noSampleAccurateControls"); // deprecated 2016-09-18
3263 auto_can_write_automatation = lilv_new_uri(world, LV2_AUTOMATE_URI__can_write);
3264 auto_automation_control = lilv_new_uri(world, LV2_AUTOMATE_URI__control);
3265 auto_automation_controlled = lilv_new_uri(world, LV2_AUTOMATE_URI__controlled);
3266 auto_automation_controller = lilv_new_uri(world, LV2_AUTOMATE_URI__controller);
3267 inline_display_in_gui = lilv_new_uri(world, LV2_INLINEDISPLAY__in_gui);
3269 #ifdef HAVE_LV2_1_2_0
3270 bufz_powerOf2BlockLength = lilv_new_uri(world, LV2_BUF_SIZE__powerOf2BlockLength);
3271 bufz_fixedBlockLength = lilv_new_uri(world, LV2_BUF_SIZE__fixedBlockLength);
3272 bufz_nominalBlockLength = lilv_new_uri(world, "http://lv2plug.in/ns/ext/buf-size#nominalBlockLength");
3273 bufz_coarseBlockLength = lilv_new_uri(world, "http://lv2plug.in/ns/ext/buf-size#coarseBlockLength");
3278 LV2World::~LV2World()
3283 #ifdef HAVE_LV2_1_2_0
3284 lilv_node_free(bufz_coarseBlockLength);
3285 lilv_node_free(bufz_nominalBlockLength);
3286 lilv_node_free(bufz_fixedBlockLength);
3287 lilv_node_free(bufz_powerOf2BlockLength);
3290 lilv_node_free(lv2_noSampleAccurateCtrl);
3291 lilv_node_free(auto_can_write_automatation);
3292 lilv_node_free(auto_automation_control);
3293 lilv_node_free(auto_automation_controlled);
3294 lilv_node_free(auto_automation_controller);
3296 lilv_node_free(patch_Message);
3297 lilv_node_free(patch_writable);
3298 lilv_node_free(units_hz);
3299 lilv_node_free(units_midiNote);
3300 lilv_node_free(units_db);
3301 lilv_node_free(units_unit);
3302 lilv_node_free(units_render);
3303 lilv_node_free(ui_externalkx);
3304 lilv_node_free(ui_external);
3305 lilv_node_free(ui_GtkUI);
3306 lilv_node_free(time_Position);
3307 lilv_node_free(rsz_minimumSize);
3308 lilv_node_free(rdfs_comment);
3309 lilv_node_free(rdfs_label);
3310 lilv_node_free(rdfs_range);
3311 lilv_node_free(midi_MidiEvent);
3312 lilv_node_free(lv2_designation);
3313 lilv_node_free(lv2_enumeration);
3314 lilv_node_free(lv2_freewheeling);
3315 lilv_node_free(lv2_toggled);
3316 lilv_node_free(lv2_sampleRate);
3317 lilv_node_free(lv2_reportsLatency);
3318 lilv_node_free(lv2_index);
3319 lilv_node_free(lv2_integer);
3320 lilv_node_free(lv2_isSideChain);
3321 lilv_node_free(lv2_inPlaceBroken);
3322 lilv_node_free(lv2_OutputPort);
3323 lilv_node_free(lv2_InputPort);
3324 lilv_node_free(lv2_ControlPort);
3325 lilv_node_free(lv2_AudioPort);
3326 lilv_node_free(groups_group);
3327 lilv_node_free(groups_element);
3328 lilv_node_free(ext_rangeSteps);
3329 lilv_node_free(ext_notAutomatic);
3330 lilv_node_free(ext_causesArtifacts);
3331 lilv_node_free(ext_expensive);
3332 lilv_node_free(ext_notOnGUI);
3333 lilv_node_free(ext_logarithmic);
3334 lilv_node_free(ev_EventPort);
3335 lilv_node_free(atom_supports);
3336 lilv_node_free(atom_eventTransfer);
3337 lilv_node_free(atom_bufferType);
3338 lilv_node_free(atom_Sequence);
3339 lilv_node_free(atom_Chunk);
3340 lilv_node_free(atom_AtomPort);
3341 lilv_world_free(world);
3346 LV2World::load_bundled_plugins(bool verbose)
3348 if (!_bundle_checked) {
3350 cout << "Scanning folders for bundled LV2s: " << ARDOUR::lv2_bundled_search_path().to_string() << endl;
3353 vector<string> plugin_objects;
3354 find_paths_matching_filter (plugin_objects, ARDOUR::lv2_bundled_search_path(), lv2_filter, 0, true, true, true);
3355 for ( vector<string>::iterator x = plugin_objects.begin(); x != plugin_objects.end (); ++x) {
3356 #ifdef PLATFORM_WINDOWS
3357 string uri = "file:///" + *x + "/";
3359 string uri = "file://" + *x + "/";
3361 LilvNode *node = lilv_new_uri(world, uri.c_str());
3362 lilv_world_load_bundle(world, node);
3363 lilv_node_free(node);
3366 lilv_world_load_all(world);
3367 _bundle_checked = true;
3371 LV2PluginInfo::LV2PluginInfo (const char* plugin_uri)
3374 _plugin_uri = strdup(plugin_uri);
3377 LV2PluginInfo::~LV2PluginInfo()
3384 LV2PluginInfo::load(Session& session)
3388 const LilvPlugins* plugins = lilv_world_get_all_plugins(_world.world);
3389 LilvNode* uri = lilv_new_uri(_world.world, _plugin_uri);
3390 if (!uri) { throw failed_constructor(); }
3391 const LilvPlugin* lp = lilv_plugins_get_by_uri(plugins, uri);
3392 if (!lp) { throw failed_constructor(); }
3393 plugin.reset(new LV2Plugin(session.engine(), session, lp, session.sample_rate()));
3394 lilv_node_free(uri);
3395 plugin->set_info(PluginInfoPtr(shared_from_this ()));
3397 } catch (failed_constructor& err) {
3398 return PluginPtr((Plugin*)0);
3404 std::vector<Plugin::PresetRecord>
3405 LV2PluginInfo::get_presets (bool /*user_only*/) const
3407 std::vector<Plugin::PresetRecord> p;
3408 #ifndef NO_PLUGIN_STATE
3409 const LilvPlugin* lp = NULL;
3412 const LilvPlugins* plugins = lilv_world_get_all_plugins(_world.world);
3413 LilvNode* uri = lilv_new_uri(_world.world, _plugin_uri);
3414 if (!uri) { throw failed_constructor(); }
3415 lp = lilv_plugins_get_by_uri(plugins, uri);
3416 if (!lp) { throw failed_constructor(); }
3417 lilv_node_free(uri);
3418 } catch (failed_constructor& err) {
3422 // see LV2Plugin::find_presets
3423 LilvNode* lv2_appliesTo = lilv_new_uri(_world.world, LV2_CORE__appliesTo);
3424 LilvNode* pset_Preset = lilv_new_uri(_world.world, LV2_PRESETS__Preset);
3425 LilvNode* rdfs_label = lilv_new_uri(_world.world, LILV_NS_RDFS "label");
3426 LilvNode* rdfs_comment = lilv_new_uri(_world.world, LILV_NS_RDFS "comment");
3428 LilvNodes* presets = lilv_plugin_get_related(lp, pset_Preset);
3429 LILV_FOREACH(nodes, i, presets) {
3430 const LilvNode* preset = lilv_nodes_get(presets, i);
3431 lilv_world_load_resource(_world.world, preset);
3432 LilvNode* name = get_value(_world.world, preset, rdfs_label);
3433 LilvNode* comment = get_value(_world.world, preset, rdfs_comment);
3434 /* TODO properly identify user vs factory presets.
3435 * here's an indirect condition: only factory presets can have comments
3437 bool userpreset = comment ? false : true;
3439 p.push_back (Plugin::PresetRecord (lilv_node_as_string(preset), lilv_node_as_string(name), userpreset, comment ? lilv_node_as_string (comment) : ""));
3440 lilv_node_free(name);
3443 lilv_node_free(comment);
3446 lilv_nodes_free(presets);
3447 lilv_node_free(rdfs_comment);
3448 lilv_node_free(rdfs_label);
3449 lilv_node_free(pset_Preset);
3450 lilv_node_free(lv2_appliesTo);
3456 LV2PluginInfo::discover()
3459 world.load_bundled_plugins();
3460 _world.load_bundled_plugins(true);
3462 PluginInfoList* plugs = new PluginInfoList;
3463 const LilvPlugins* plugins = lilv_world_get_all_plugins(world.world);
3465 LILV_FOREACH(plugins, i, plugins) {
3466 const LilvPlugin* p = lilv_plugins_get(plugins, i);
3467 const LilvNode* pun = lilv_plugin_get_uri(p);
3469 LV2PluginInfoPtr info(new LV2PluginInfo(lilv_node_as_string(pun)));
3471 LilvNode* name = lilv_plugin_get_name(p);
3472 if (!name || !lilv_plugin_get_port_by_index(p, 0)) {
3473 warning << "Ignoring invalid LV2 plugin "
3474 << lilv_node_as_string(lilv_plugin_get_uri(p))
3479 if (lilv_plugin_has_feature(p, world.lv2_inPlaceBroken)) {
3480 warning << string_compose(
3481 _("Ignoring LV2 plugin \"%1\" since it cannot do inplace processing."),
3482 lilv_node_as_string(name)) << endmsg;
3483 lilv_node_free(name);
3487 #ifdef HAVE_LV2_1_2_0
3488 LilvNodes *required_features = lilv_plugin_get_required_features (p);
3489 if (lilv_nodes_contains (required_features, world.bufz_powerOf2BlockLength) ||
3490 lilv_nodes_contains (required_features, world.bufz_fixedBlockLength)
3492 warning << string_compose(
3493 _("Ignoring LV2 plugin \"%1\" because its buffer-size requirements cannot be satisfied."),
3494 lilv_node_as_string(name)) << endmsg;
3495 lilv_nodes_free(required_features);
3496 lilv_node_free(name);
3499 lilv_nodes_free(required_features);
3504 info->name = string(lilv_node_as_string(name));
3505 lilv_node_free(name);
3506 ARDOUR::PluginScanMessage(_("LV2"), info->name, false);
3508 const LilvPluginClass* pclass = lilv_plugin_get_class(p);
3509 const LilvNode* label = lilv_plugin_class_get_label(pclass);
3510 info->category = lilv_node_as_string(label);
3512 LilvNode* author_name = lilv_plugin_get_author_name(p);
3513 info->creator = author_name ? string(lilv_node_as_string(author_name)) : "Unknown";
3514 lilv_node_free(author_name);
3516 info->path = "/NOPATH"; // Meaningless for LV2
3518 /* count atom-event-ports that feature
3519 * atom:supports <http://lv2plug.in/ns/ext/midi#MidiEvent>
3521 * TODO: nicely ask drobilla to make a lilv_ call for that
3523 int count_midi_out = 0;
3524 int count_midi_in = 0;
3525 for (uint32_t i = 0; i < lilv_plugin_get_num_ports(p); ++i) {
3526 const LilvPort* port = lilv_plugin_get_port_by_index(p, i);
3527 if (lilv_port_is_a(p, port, world.atom_AtomPort)) {
3528 LilvNodes* buffer_types = lilv_port_get_value(
3529 p, port, world.atom_bufferType);
3530 LilvNodes* atom_supports = lilv_port_get_value(
3531 p, port, world.atom_supports);
3533 if (lilv_nodes_contains(buffer_types, world.atom_Sequence)
3534 && lilv_nodes_contains(atom_supports, world.midi_MidiEvent)) {
3535 if (lilv_port_is_a(p, port, world.lv2_InputPort)) {
3538 if (lilv_port_is_a(p, port, world.lv2_OutputPort)) {
3542 lilv_nodes_free(buffer_types);
3543 lilv_nodes_free(atom_supports);
3547 info->n_inputs.set_audio(
3548 lilv_plugin_get_num_ports_of_class(
3549 p, world.lv2_InputPort, world.lv2_AudioPort, NULL));
3550 info->n_inputs.set_midi(
3551 lilv_plugin_get_num_ports_of_class(
3552 p, world.lv2_InputPort, world.ev_EventPort, NULL)
3555 info->n_outputs.set_audio(
3556 lilv_plugin_get_num_ports_of_class(
3557 p, world.lv2_OutputPort, world.lv2_AudioPort, NULL));
3558 info->n_outputs.set_midi(
3559 lilv_plugin_get_num_ports_of_class(
3560 p, world.lv2_OutputPort, world.ev_EventPort, NULL)
3563 info->unique_id = lilv_node_as_uri(lilv_plugin_get_uri(p));
3564 info->index = 0; // Meaningless for LV2
3566 plugs->push_back(info);