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.
28 #include "pbd/gstdio_compat.h"
29 #include <glib/gprintf.h>
32 #include <boost/utility.hpp>
34 #include "pbd/file_utils.h"
35 #include "pbd/stl_delete.h"
36 #include "pbd/compose.h"
37 #include "pbd/error.h"
38 #include "pbd/xml++.h"
40 #include "libardour-config.h"
42 #include "ardour/audio_buffer.h"
43 #include "ardour/audioengine.h"
44 #include "ardour/debug.h"
45 #include "ardour/lv2_plugin.h"
46 #include "ardour/session.h"
47 #include "ardour/tempo.h"
48 #include "ardour/types.h"
49 #include "ardour/utils.h"
50 #include "ardour/worker.h"
51 #include "ardour/search_paths.h"
56 #include <lilv/lilv.h>
58 #include "lv2/lv2plug.in/ns/ext/atom/atom.h"
59 #include "lv2/lv2plug.in/ns/ext/atom/forge.h"
60 #include "lv2/lv2plug.in/ns/ext/log/log.h"
61 #include "lv2/lv2plug.in/ns/ext/midi/midi.h"
62 #include "lv2/lv2plug.in/ns/ext/port-props/port-props.h"
63 #include "lv2/lv2plug.in/ns/ext/presets/presets.h"
64 #include "lv2/lv2plug.in/ns/ext/state/state.h"
65 #include "lv2/lv2plug.in/ns/ext/time/time.h"
66 #include "lv2/lv2plug.in/ns/ext/worker/worker.h"
67 #include "lv2/lv2plug.in/ns/ext/resize-port/resize-port.h"
68 #include "lv2/lv2plug.in/ns/extensions/ui/ui.h"
69 #include "lv2/lv2plug.in/ns/extensions/units/units.h"
70 #include "lv2/lv2plug.in/ns/ext/patch/patch.h"
72 #include "lv2/lv2plug.in/ns/ext/buf-size/buf-size.h"
73 #include "lv2/lv2plug.in/ns/ext/options/options.h"
76 #include "lv2_evbuf.h"
79 #include <suil/suil.h>
82 // Compatibility for old LV2
83 #ifndef LV2_ATOM_CONTENTS_CONST
84 #define LV2_ATOM_CONTENTS_CONST(type, atom) \
85 ((const void*)((const uint8_t*)(atom) + sizeof(type)))
87 #ifndef LV2_ATOM_BODY_CONST
88 #define LV2_ATOM_BODY_CONST(atom) LV2_ATOM_CONTENTS_CONST(LV2_Atom, atom)
90 #ifndef LV2_PATCH__property
91 #define LV2_PATCH__property LV2_PATCH_PREFIX "property"
93 #ifndef LV2_PATCH__value
94 #define LV2_PATCH__value LV2_PATCH_PREFIX "value"
96 #ifndef LV2_PATCH__writable
97 #define LV2_PATCH__writable LV2_PATCH_PREFIX "writable"
100 /** The number of MIDI buffers that will fit in a UI/worker comm buffer.
101 This needs to be roughly the number of cycles the UI will get around to
102 actually processing the traffic. Lower values are flakier but save memory.
104 static const size_t NBUFS = 4;
107 using namespace ARDOUR;
110 class LV2World : boost::noncopyable {
115 void load_bundled_plugins(bool verbose=false);
119 LilvNode* atom_AtomPort;
120 LilvNode* atom_Chunk;
121 LilvNode* atom_Sequence;
122 LilvNode* atom_bufferType;
123 LilvNode* atom_eventTransfer;
124 LilvNode* atom_supports;
125 LilvNode* ev_EventPort;
126 LilvNode* ext_logarithmic;
127 LilvNode* ext_notOnGUI;
128 LilvNode* lv2_AudioPort;
129 LilvNode* lv2_ControlPort;
130 LilvNode* lv2_InputPort;
131 LilvNode* lv2_OutputPort;
132 LilvNode* lv2_enumeration;
133 LilvNode* lv2_freewheeling;
134 LilvNode* lv2_inPlaceBroken;
135 LilvNode* lv2_integer;
136 LilvNode* lv2_default;
137 LilvNode* lv2_minimum;
138 LilvNode* lv2_maximum;
139 LilvNode* lv2_reportsLatency;
140 LilvNode* lv2_sampleRate;
141 LilvNode* lv2_toggled;
142 LilvNode* midi_MidiEvent;
143 LilvNode* rdfs_comment;
144 LilvNode* rdfs_label;
145 LilvNode* rdfs_range;
146 LilvNode* rsz_minimumSize;
147 LilvNode* time_Position;
149 LilvNode* ui_external;
150 LilvNode* ui_externalkx;
153 LilvNode* units_unit;
154 LilvNode* units_render;
155 LilvNode* units_midiNote;
156 LilvNode* patch_writable;
157 LilvNode* patch_Message;
158 LilvNode* lv2_noSampleAccurateCtrl;
159 #ifdef HAVE_LV2_1_2_0
160 LilvNode* bufz_powerOf2BlockLength;
161 LilvNode* bufz_fixedBlockLength;
162 LilvNode* bufz_nominalBlockLength;
166 bool _bundle_checked;
169 static LV2World _world;
171 /* worker extension */
173 /** Called by the plugin to schedule non-RT work. */
174 static LV2_Worker_Status
175 work_schedule(LV2_Worker_Schedule_Handle handle,
179 LV2Plugin* plugin = (LV2Plugin*)handle;
180 if (plugin->session().engine().freewheeling()) {
181 // Freewheeling, do the work immediately in this (audio) thread
182 return (LV2_Worker_Status)plugin->work(size, data);
184 // Enqueue message for the worker thread
185 return plugin->worker()->schedule(size, data) ?
186 LV2_WORKER_SUCCESS : LV2_WORKER_ERR_UNKNOWN;
190 /** Called by the plugin to respond to non-RT work. */
191 static LV2_Worker_Status
192 work_respond(LV2_Worker_Respond_Handle handle,
196 LV2Plugin* plugin = (LV2Plugin*)handle;
197 if (plugin->session().engine().freewheeling()) {
198 // Freewheeling, respond immediately in this (audio) thread
199 return (LV2_Worker_Status)plugin->work_response(size, data);
201 // Enqueue response for the worker
202 return plugin->worker()->respond(size, data) ?
203 LV2_WORKER_SUCCESS : LV2_WORKER_ERR_UNKNOWN;
210 log_vprintf(LV2_Log_Handle /*handle*/,
216 const int ret = g_vasprintf(&str, fmt, args);
217 if (type == URIMap::instance().urids.log_Error) {
218 error << str << endmsg;
219 } else if (type == URIMap::instance().urids.log_Warning) {
220 warning << str << endmsg;
221 } else if (type == URIMap::instance().urids.log_Note) {
222 info << str << endmsg;
224 // TODO: Toggleable log:Trace message support
229 log_printf(LV2_Log_Handle handle,
231 const char* fmt, ...)
235 const int ret = log_vprintf(handle, type, fmt, args);
240 struct LV2Plugin::Impl {
241 Impl() : plugin(0), ui(0), ui_type(0), name(0), author(0), instance(0)
243 #ifdef HAVE_LV2_1_2_0
248 #ifdef HAVE_LV2_1_2_0
253 /** Find the LV2 input port with the given designation.
254 * If found, bufptrs[port_index] will be set to bufptr.
256 const LilvPort* designated_input (const char* uri, void** bufptrs[], void** bufptr);
258 const LilvPlugin* plugin;
260 const LilvNode* ui_type;
263 LilvInstance* instance;
264 const LV2_Worker_Interface* work_iface;
265 #ifdef HAVE_LV2_1_2_0
266 const LV2_Options_Interface* opts_iface;
269 LV2_Atom_Forge forge;
270 LV2_Atom_Forge ui_forge;
271 int32_t block_length;
272 #ifdef HAVE_LV2_1_2_0
273 LV2_Options_Option* options;
277 LV2Plugin::LV2Plugin (AudioEngine& engine,
279 const void* c_plugin,
281 : Plugin (engine, session)
287 , _patch_port_in_index((uint32_t)-1)
288 , _patch_port_out_index((uint32_t)-1)
289 , _uri_map(URIMap::instance())
290 , _no_sample_accurate_ctrl (false)
292 init(c_plugin, rate);
295 LV2Plugin::LV2Plugin (const LV2Plugin& other)
301 , _insert_id(other._insert_id)
302 , _patch_port_in_index((uint32_t)-1)
303 , _patch_port_out_index((uint32_t)-1)
304 , _uri_map(URIMap::instance())
305 , _no_sample_accurate_ctrl (false)
307 init(other._impl->plugin, other._sample_rate);
309 for (uint32_t i = 0; i < parameter_count(); ++i) {
310 _control_data[i] = other._shadow_data[i];
311 _shadow_data[i] = other._shadow_data[i];
316 LV2Plugin::init(const void* c_plugin, framecnt_t rate)
318 DEBUG_TRACE(DEBUG::LV2, "init\n");
320 _impl->plugin = (const LilvPlugin*)c_plugin;
322 _impl->ui_type = NULL;
327 _atom_ev_buffers = 0;
329 _bpm_control_port = 0;
330 _freewheel_control_port = 0;
331 _latency_control_port = 0;
332 _next_cycle_start = std::numeric_limits<framepos_t>::max();
333 _next_cycle_speed = 1.0;
334 _seq_size = _engine.raw_buffer_size(DataType::MIDI);
336 _was_activated = false;
337 _has_state_interface = false;
338 _impl->block_length = _session.get_block_size();
340 _instance_access_feature.URI = "http://lv2plug.in/ns/ext/instance-access";
341 _data_access_feature.URI = "http://lv2plug.in/ns/ext/data-access";
342 _make_path_feature.URI = LV2_STATE__makePath;
343 _log_feature.URI = LV2_LOG__log;
344 _work_schedule_feature.URI = LV2_WORKER__schedule;
345 _work_schedule_feature.data = NULL;
346 _def_state_feature.URI = LV2_STATE_PREFIX "loadDefaultState"; // Post LV2-1.2.0
347 _def_state_feature.data = NULL;
349 const LilvPlugin* plugin = _impl->plugin;
351 LilvNode* state_iface_uri = lilv_new_uri(_world.world, LV2_STATE__interface);
352 LilvNode* state_uri = lilv_new_uri(_world.world, LV2_STATE_URI);
353 _has_state_interface =
354 // What plugins should have (lv2:extensionData state:Interface)
355 lilv_plugin_has_extension_data(plugin, state_iface_uri)
356 // What some outdated/incorrect ones have
357 || lilv_plugin_has_feature(plugin, state_uri);
358 lilv_node_free(state_uri);
359 lilv_node_free(state_iface_uri);
361 _features = (LV2_Feature**)calloc(11, sizeof(LV2_Feature*));
362 _features[0] = &_instance_access_feature;
363 _features[1] = &_data_access_feature;
364 _features[2] = &_make_path_feature;
365 _features[3] = _uri_map.uri_map_feature();
366 _features[4] = _uri_map.urid_map_feature();
367 _features[5] = _uri_map.urid_unmap_feature();
368 _features[6] = &_log_feature;
370 unsigned n_features = 7;
371 #ifdef HAVE_LV2_1_2_0
372 _features[n_features++] = &_def_state_feature;
375 lv2_atom_forge_init(&_impl->forge, _uri_map.urid_map());
376 lv2_atom_forge_init(&_impl->ui_forge, _uri_map.urid_map());
378 #ifdef HAVE_LV2_1_2_0
379 LV2_URID atom_Int = _uri_map.uri_to_id(LV2_ATOM__Int);
380 static const int32_t _min_block_length = 1; // may happen during split-cycles
381 static const int32_t _max_block_length = 8192; // max possible (with all engines and during export)
382 /* Consider updating max-block-size whenever the buffersize changes.
383 * It requires re-instantiating the plugin (which is a non-realtime operation),
384 * so it should be done lightly and only for plugins that require it.
386 * given that the block-size can change at any time (split-cycles) ardour currently
387 * does not support plugins that require bufz_fixedBlockLength.
389 LV2_Options_Option options[] = {
390 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id(LV2_BUF_SIZE__minBlockLength),
391 sizeof(int32_t), atom_Int, &_min_block_length },
392 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id(LV2_BUF_SIZE__maxBlockLength),
393 sizeof(int32_t), atom_Int, &_max_block_length },
394 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id(LV2_BUF_SIZE__sequenceSize),
395 sizeof(int32_t), atom_Int, &_seq_size },
396 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id("http://lv2plug.in/ns/ext/buf-size#nominalBlockLength"),
397 sizeof(int32_t), atom_Int, &_impl->block_length },
398 { LV2_OPTIONS_INSTANCE, 0, 0, 0, 0, NULL }
401 _impl->options = (LV2_Options_Option*) malloc (sizeof (options));
402 memcpy ((void*) _impl->options, (void*) options, sizeof (options));
404 _options_feature.URI = LV2_OPTIONS__options;
405 _options_feature.data = _impl->options;
406 _features[n_features++] = &_options_feature;
409 LV2_State_Make_Path* make_path = (LV2_State_Make_Path*)malloc(
410 sizeof(LV2_State_Make_Path));
411 make_path->handle = this;
412 make_path->path = &lv2_state_make_path;
413 _make_path_feature.data = make_path;
415 LV2_Log_Log* log = (LV2_Log_Log*)malloc(sizeof(LV2_Log_Log));
417 log->printf = &log_printf;
418 log->vprintf = &log_vprintf;
419 _log_feature.data = log;
421 LilvNode* worker_schedule = lilv_new_uri(_world.world, LV2_WORKER__schedule);
422 if (lilv_plugin_has_feature(plugin, worker_schedule)) {
423 LV2_Worker_Schedule* schedule = (LV2_Worker_Schedule*)malloc(
424 sizeof(LV2_Worker_Schedule));
425 size_t buf_size = _session.engine().raw_buffer_size(DataType::MIDI) * NBUFS;
426 _worker = new Worker(this, buf_size);
427 schedule->handle = this;
428 schedule->schedule_work = work_schedule;
429 _work_schedule_feature.data = schedule;
430 _features[n_features++] = &_work_schedule_feature;
432 lilv_node_free(worker_schedule);
434 _impl->instance = lilv_plugin_instantiate(plugin, rate, _features);
435 _impl->name = lilv_plugin_get_name(plugin);
436 _impl->author = lilv_plugin_get_author_name(plugin);
438 if (_impl->instance == 0) {
439 error << _("LV2: Failed to instantiate plugin ") << uri() << endmsg;
440 throw failed_constructor();
443 _instance_access_feature.data = (void*)_impl->instance->lv2_handle;
444 _data_access_extension_data.extension_data = _impl->instance->lv2_descriptor->extension_data;
445 _data_access_feature.data = &_data_access_extension_data;
447 LilvNode* worker_iface_uri = lilv_new_uri(_world.world, LV2_WORKER__interface);
448 if (lilv_plugin_has_extension_data(plugin, worker_iface_uri)) {
449 _impl->work_iface = (const LV2_Worker_Interface*)extension_data(
450 LV2_WORKER__interface);
452 lilv_node_free(worker_iface_uri);
455 #ifdef HAVE_LV2_1_2_0
456 LilvNode* options_iface_uri = lilv_new_uri(_world.world, LV2_OPTIONS__interface);
457 if (lilv_plugin_has_extension_data(plugin, options_iface_uri)) {
458 _impl->opts_iface = (const LV2_Options_Interface*)extension_data(
459 LV2_OPTIONS__interface);
461 lilv_node_free(options_iface_uri);
464 if (lilv_plugin_has_feature(plugin, _world.lv2_inPlaceBroken)) {
465 error << string_compose(
466 _("LV2: \"%1\" cannot be used, since it cannot do inplace processing."),
467 lilv_node_as_string(_impl->name)) << endmsg;
468 lilv_node_free(_impl->name);
469 lilv_node_free(_impl->author);
470 throw failed_constructor();
473 #ifdef HAVE_LV2_1_2_0
474 LilvNodes *required_features = lilv_plugin_get_required_features (plugin);
475 if (lilv_nodes_contains (required_features, _world.bufz_powerOf2BlockLength) ||
476 lilv_nodes_contains (required_features, _world.bufz_fixedBlockLength)
478 error << string_compose(
479 _("LV2: \"%1\" buffer-size requirements cannot be satisfied."),
480 lilv_node_as_string(_impl->name)) << endmsg;
481 lilv_node_free(_impl->name);
482 lilv_node_free(_impl->author);
483 lilv_nodes_free(required_features);
484 throw failed_constructor();
486 lilv_nodes_free(required_features);
488 LilvNodes* optional_features = lilv_plugin_get_optional_features (plugin);
489 if (lilv_nodes_contains (optional_features, _world.lv2_noSampleAccurateCtrl)) {
490 _no_sample_accurate_ctrl = true;
492 lilv_nodes_free(optional_features);
495 #ifdef HAVE_LILV_0_16_0
496 // Load default state
497 LilvState* state = lilv_state_new_from_world(
498 _world.world, _uri_map.urid_map(), lilv_plugin_get_uri(_impl->plugin));
499 if (state && _has_state_interface) {
500 lilv_state_restore(state, _impl->instance, NULL, NULL, 0, NULL);
502 lilv_state_free(state);
507 const uint32_t num_ports = this->num_ports();
508 for (uint32_t i = 0; i < num_ports; ++i) {
509 const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, i);
511 size_t minimumSize = 0;
513 if (lilv_port_is_a(_impl->plugin, port, _world.lv2_OutputPort)) {
514 flags |= PORT_OUTPUT;
515 } else if (lilv_port_is_a(_impl->plugin, port, _world.lv2_InputPort)) {
518 error << string_compose(
519 "LV2: \"%1\" port %2 is neither input nor output",
520 lilv_node_as_string(_impl->name), i) << endmsg;
521 throw failed_constructor();
524 if (lilv_port_is_a(_impl->plugin, port, _world.lv2_ControlPort)) {
525 flags |= PORT_CONTROL;
526 } else if (lilv_port_is_a(_impl->plugin, port, _world.lv2_AudioPort)) {
528 } else if (lilv_port_is_a(_impl->plugin, port, _world.ev_EventPort)) {
530 flags |= PORT_MIDI; // We assume old event API ports are for MIDI
531 } else if (lilv_port_is_a(_impl->plugin, port, _world.atom_AtomPort)) {
532 LilvNodes* buffer_types = lilv_port_get_value(
533 _impl->plugin, port, _world.atom_bufferType);
534 LilvNodes* atom_supports = lilv_port_get_value(
535 _impl->plugin, port, _world.atom_supports);
537 if (lilv_nodes_contains(buffer_types, _world.atom_Sequence)) {
538 flags |= PORT_SEQUENCE;
539 if (lilv_nodes_contains(atom_supports, _world.midi_MidiEvent)) {
542 if (lilv_nodes_contains(atom_supports, _world.time_Position)) {
543 flags |= PORT_POSITION;
545 if (lilv_nodes_contains(atom_supports, _world.patch_Message)) {
546 flags |= PORT_PATCHMSG;
547 if (flags & PORT_INPUT) {
548 _patch_port_in_index = i;
550 _patch_port_out_index = i;
554 LilvNodes* min_size_v = lilv_port_get_value(_impl->plugin, port, _world.rsz_minimumSize);
555 LilvNode* min_size = min_size_v ? lilv_nodes_get_first(min_size_v) : NULL;
556 if (min_size && lilv_node_is_int(min_size)) {
557 minimumSize = lilv_node_as_int(min_size);
559 lilv_nodes_free(min_size_v);
560 lilv_nodes_free(buffer_types);
561 lilv_nodes_free(atom_supports);
563 error << string_compose(
564 "LV2: \"%1\" port %2 has no known data type",
565 lilv_node_as_string(_impl->name), i) << endmsg;
566 throw failed_constructor();
569 _port_flags.push_back(flags);
570 _port_minimumSize.push_back(minimumSize);
573 _control_data = new float[num_ports];
574 _shadow_data = new float[num_ports];
575 _defaults = new float[num_ports];
576 _ev_buffers = new LV2_Evbuf*[num_ports];
577 memset(_ev_buffers, 0, sizeof(LV2_Evbuf*) * num_ports);
579 const bool latent = lilv_plugin_has_latency(plugin);
580 const uint32_t latency_index = (latent)
581 ? lilv_plugin_get_latency_port_index(plugin)
584 // Build an array of pointers to special parameter buffers
585 void*** params = new void**[num_ports];
586 for (uint32_t i = 0; i < num_ports; ++i) {
589 _impl->designated_input (LV2_TIME__beatsPerMinute, params, (void**)&_bpm_control_port);
590 _impl->designated_input (LV2_CORE__freeWheeling, params, (void**)&_freewheel_control_port);
592 for (uint32_t i = 0; i < num_ports; ++i) {
593 const LilvPort* port = lilv_plugin_get_port_by_index(plugin, i);
594 const LilvNode* sym = lilv_port_get_symbol(plugin, port);
596 // Store index in map so we can look up index by symbol
597 _port_indices.insert(std::make_pair(lilv_node_as_string(sym), i));
599 // Get range and default value if applicable
600 if (parameter_is_control(i)) {
602 lilv_port_get_range(plugin, port, &def, NULL, NULL);
603 _defaults[i] = def ? lilv_node_as_float(def) : 0.0f;
604 if (lilv_port_has_property (plugin, port, _world.lv2_sampleRate)) {
605 _defaults[i] *= _session.frame_rate ();
609 lilv_instance_connect_port(_impl->instance, i, &_control_data[i]);
611 if (latent && i == latency_index) {
612 _latency_control_port = &_control_data[i];
613 *_latency_control_port = 0;
616 if (parameter_is_input(i)) {
617 _shadow_data[i] = default_value(i);
619 *params[i] = (void*)&_shadow_data[i];
629 LilvUIs* uis = lilv_plugin_get_uis(plugin);
630 if (lilv_uis_size(uis) > 0) {
632 // Look for embeddable UI
633 LILV_FOREACH(uis, u, uis) {
634 const LilvUI* this_ui = lilv_uis_get(uis, u);
635 const LilvNode* this_ui_type = NULL;
636 if (lilv_ui_is_supported(this_ui,
640 // TODO: Multiple UI support
642 _impl->ui_type = this_ui_type;
647 // Look for Gtk native UI
648 LILV_FOREACH(uis, i, uis) {
649 const LilvUI* ui = lilv_uis_get(uis, i);
650 if (lilv_ui_is_a(ui, _world.ui_GtkUI)) {
652 _impl->ui_type = _world.ui_GtkUI;
658 // If Gtk UI is not available, try to find external UI
660 LILV_FOREACH(uis, i, uis) {
661 const LilvUI* ui = lilv_uis_get(uis, i);
662 if (lilv_ui_is_a(ui, _world.ui_externalkx)) {
664 _impl->ui_type = _world.ui_external;
667 if (lilv_ui_is_a(ui, _world.ui_external)) {
669 _impl->ui_type = _world.ui_external;
675 load_supported_properties(_property_descriptors);
676 allocate_atom_event_buffers();
677 latency_compute_run();
681 LV2Plugin::set_block_size (pframes_t nframes)
683 #ifdef HAVE_LV2_1_2_0
684 if (_impl->opts_iface) {
685 LV2_URID atom_Int = _uri_map.uri_to_id(LV2_ATOM__Int);
686 _impl->block_length = nframes;
687 LV2_Options_Option block_size_option = {
688 LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id ("http://lv2plug.in/ns/ext/buf-size#nominalBlockLength"),
689 sizeof(int32_t), atom_Int, (void*)&_impl->block_length
691 _impl->opts_iface->set (_impl->instance->lv2_handle, &block_size_option);
698 LV2Plugin::requires_fixed_sized_buffers () const
700 /* This controls if Ardour will split the plugin's run()
701 * on automation events in order to pass sample-accurate automation
702 * via standard control-ports.
704 * When returning true Ardour will *not* sub-divide the process-cycle.
705 * Automation events that happen between cycle-start and cycle-end will be
706 * ignored (ctrl values are interpolated to cycle-start).
707 * NB. Atom Sequences are still sample accurate.
709 * Note: This does not guarantee a fixed block-size.
710 * e.g The process cycle may be split when looping, also
711 * the period-size may change any time: see set_block_size()
713 if (get_info()->n_inputs.n_midi() > 0) {
714 /* we don't yet implement midi buffer offsets (for split cycles).
715 * Also connect_and_run() also uses _session.transport_frame() directly
716 * (for BBT) which is not offset for plugin cycle split.
720 return _no_sample_accurate_ctrl;
723 LV2Plugin::~LV2Plugin ()
725 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 destroy\n", name()));
730 lilv_instance_free(_impl->instance);
731 lilv_state_free(_impl->state);
732 lilv_node_free(_impl->name);
733 lilv_node_free(_impl->author);
734 #ifdef HAVE_LV2_1_2_0
735 free(_impl->options);
739 free(_make_path_feature.data);
740 free(_work_schedule_feature.data);
746 if (_atom_ev_buffers) {
747 LV2_Evbuf** b = _atom_ev_buffers;
752 free(_atom_ev_buffers);
755 delete [] _control_data;
756 delete [] _shadow_data;
758 delete [] _ev_buffers;
762 LV2Plugin::is_external_ui() const
767 return lilv_ui_is_a(_impl->ui, _world.ui_external) || lilv_ui_is_a(_impl->ui, _world.ui_externalkx);
771 LV2Plugin::is_external_kx() const
776 return lilv_ui_is_a(_impl->ui, _world.ui_externalkx);
780 LV2Plugin::ui_is_resizable () const
782 const LilvNode* s = lilv_ui_get_uri(_impl->ui);
783 LilvNode* p = lilv_new_uri(_world.world, LV2_CORE__optionalFeature);
784 LilvNode* fs = lilv_new_uri(_world.world, LV2_UI__fixedSize);
785 LilvNode* nrs = lilv_new_uri(_world.world, LV2_UI__noUserResize);
787 LilvNodes* fs_matches = lilv_world_find_nodes(_world.world, s, p, fs);
788 LilvNodes* nrs_matches = lilv_world_find_nodes(_world.world, s, p, nrs);
790 lilv_nodes_free(nrs_matches);
791 lilv_nodes_free(fs_matches);
796 return !fs_matches && !nrs_matches;
800 LV2Plugin::unique_id() const
802 return lilv_node_as_uri(lilv_plugin_get_uri(_impl->plugin));
806 LV2Plugin::uri() const
808 return lilv_node_as_uri(lilv_plugin_get_uri(_impl->plugin));
812 LV2Plugin::label() const
814 return lilv_node_as_string(_impl->name);
818 LV2Plugin::name() const
820 return lilv_node_as_string(_impl->name);
824 LV2Plugin::maker() const
826 return _impl->author ? lilv_node_as_string (_impl->author) : "Unknown";
830 LV2Plugin::num_ports() const
832 return lilv_plugin_get_num_ports(_impl->plugin);
836 LV2Plugin::parameter_count() const
838 return lilv_plugin_get_num_ports(_impl->plugin);
842 LV2Plugin::default_value(uint32_t port)
844 return _defaults[port];
848 LV2Plugin::port_symbol(uint32_t index) const
850 const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, index);
852 error << name() << ": Invalid port index " << index << endmsg;
855 const LilvNode* sym = lilv_port_get_symbol(_impl->plugin, port);
856 return lilv_node_as_string(sym);
860 LV2Plugin::port_index (const char* symbol) const
862 const map<string, uint32_t>::const_iterator i = _port_indices.find(symbol);
863 if (i != _port_indices.end()) {
866 warning << string_compose(_("LV2: Unknown port %1"), symbol) << endmsg;
872 LV2Plugin::set_parameter(uint32_t which, float val)
874 DEBUG_TRACE(DEBUG::LV2, string_compose(
875 "%1 set parameter %2 to %3\n", name(), which, val));
877 if (which < lilv_plugin_get_num_ports(_impl->plugin)) {
878 if (get_parameter (which) == val) {
882 _shadow_data[which] = val;
884 warning << string_compose(
885 _("Illegal parameter number used with plugin \"%1\". "
886 "This is a bug in either %2 or the LV2 plugin <%3>"),
887 name(), PROGRAM_NAME, unique_id()) << endmsg;
890 Plugin::set_parameter(which, val);
894 LV2Plugin::get_parameter(uint32_t which) const
896 if (parameter_is_input(which)) {
897 return (float)_shadow_data[which];
899 return (float)_control_data[which];
905 LV2Plugin::get_docs() const
907 LilvNodes* comments = lilv_plugin_get_value(_impl->plugin, _world.rdfs_comment);
909 const std::string docs(lilv_node_as_string(lilv_nodes_get_first(comments)));
910 lilv_nodes_free(comments);
918 LV2Plugin::get_parameter_docs(uint32_t which) const
920 LilvNodes* comments = lilv_port_get_value(
922 lilv_plugin_get_port_by_index(_impl->plugin, which),
923 _world.rdfs_comment);
926 const std::string docs(lilv_node_as_string(lilv_nodes_get_first(comments)));
927 lilv_nodes_free(comments);
935 LV2Plugin::nth_parameter(uint32_t n, bool& ok) const
938 for (uint32_t c = 0, x = 0; x < lilv_plugin_get_num_ports(_impl->plugin); ++x) {
939 if (parameter_is_control(x)) {
951 LV2Plugin::extension_data(const char* uri) const
953 return lilv_instance_get_extension_data(_impl->instance, uri);
957 LV2Plugin::c_plugin()
959 return _impl->plugin;
965 return (const void*)_impl->ui;
969 LV2Plugin::c_ui_type()
971 return (const void*)_impl->ui_type;
974 /** Directory for all plugin state. */
976 LV2Plugin::plugin_dir() const
978 if (!_plugin_state_dir.empty ()){
979 return Glib::build_filename(_plugin_state_dir, _insert_id.to_s());
981 return Glib::build_filename(_session.plugins_dir(), _insert_id.to_s());
985 /** Directory for files created by the plugin (except during save). */
987 LV2Plugin::scratch_dir() const
989 return Glib::build_filename(plugin_dir(), "scratch");
992 /** Directory for snapshots of files in the scratch directory. */
994 LV2Plugin::file_dir() const
996 return Glib::build_filename(plugin_dir(), "files");
999 /** Directory to save state snapshot version @c num into. */
1001 LV2Plugin::state_dir(unsigned num) const
1003 return Glib::build_filename(plugin_dir(), string_compose("state%1", num));
1006 /** Implementation of state:makePath for files created at instantiation time.
1007 * Note this is not used for files created at save time (Lilv deals with that).
1010 LV2Plugin::lv2_state_make_path(LV2_State_Make_Path_Handle handle,
1013 LV2Plugin* me = (LV2Plugin*)handle;
1014 if (me->_insert_id == PBD::ID("0")) {
1015 warning << string_compose(
1016 "File path \"%1\" requested but LV2 %2 has no insert ID",
1017 path, me->name()) << endmsg;
1018 return g_strdup(path);
1021 const std::string abs_path = Glib::build_filename(me->scratch_dir(), path);
1022 const std::string dirname = Glib::path_get_dirname(abs_path);
1023 g_mkdir_with_parents(dirname.c_str(), 0744);
1025 DEBUG_TRACE(DEBUG::LV2, string_compose("new file path %1 => %2\n",
1028 return g_strndup(abs_path.c_str(), abs_path.length());
1032 LV2Plugin::add_state(XMLNode* root) const
1034 assert(_insert_id != PBD::ID("0"));
1038 LocaleGuard lg(X_("C"));
1040 for (uint32_t i = 0; i < parameter_count(); ++i) {
1041 if (parameter_is_input(i) && parameter_is_control(i)) {
1042 child = new XMLNode("Port");
1043 child->add_property("symbol", port_symbol(i));
1044 snprintf(buf, sizeof(buf), "%+f", _shadow_data[i]);
1045 child->add_property("value", string(buf));
1046 root->add_child_nocopy(*child);
1050 if (!_plugin_state_dir.empty()) {
1051 root->add_property("template-dir", _plugin_state_dir);
1054 if (_has_state_interface) {
1055 // Provisionally increment state version and create directory
1056 const std::string new_dir = state_dir(++_state_version);
1057 g_mkdir_with_parents(new_dir.c_str(), 0744);
1059 LilvState* state = lilv_state_new_from_instance(
1062 _uri_map.urid_map(),
1063 scratch_dir().c_str(),
1065 _session.externals_dir().c_str(),
1068 const_cast<LV2Plugin*>(this),
1072 if (!_plugin_state_dir.empty()
1074 || !lilv_state_equals(state, _impl->state)) {
1075 lilv_state_save(_world.world,
1076 _uri_map.urid_map(),
1077 _uri_map.urid_unmap(),
1083 if (_plugin_state_dir.empty()) {
1084 // normal session save
1085 lilv_state_free(_impl->state);
1086 _impl->state = state;
1088 // template save (dedicated state-dir)
1089 lilv_state_free(state);
1092 // State is identical, decrement version and nuke directory
1093 lilv_state_free(state);
1094 PBD::remove_directory(new_dir);
1098 root->add_property("state-dir", string_compose("state%1", _state_version));
1102 // TODO: Once we can rely on lilv 0.16.0, lilv_world_get can replace this
1104 get_value(LilvWorld* world, const LilvNode* subject, const LilvNode* predicate)
1106 LilvNodes* vs = lilv_world_find_nodes(world, subject, predicate, NULL);
1108 LilvNode* node = lilv_node_duplicate(lilv_nodes_get_first(vs));
1109 lilv_nodes_free(vs);
1116 LV2Plugin::find_presets()
1118 LilvNode* lv2_appliesTo = lilv_new_uri(_world.world, LV2_CORE__appliesTo);
1119 LilvNode* pset_Preset = lilv_new_uri(_world.world, LV2_PRESETS__Preset);
1120 LilvNode* rdfs_label = lilv_new_uri(_world.world, LILV_NS_RDFS "label");
1122 LilvNodes* presets = lilv_plugin_get_related(_impl->plugin, pset_Preset);
1123 LILV_FOREACH(nodes, i, presets) {
1124 const LilvNode* preset = lilv_nodes_get(presets, i);
1125 lilv_world_load_resource(_world.world, preset);
1126 LilvNode* name = get_value(_world.world, preset, rdfs_label);
1127 bool userpreset = true; // TODO
1129 _presets.insert(std::make_pair(lilv_node_as_string(preset),
1130 Plugin::PresetRecord(
1131 lilv_node_as_string(preset),
1132 lilv_node_as_string(name),
1134 lilv_node_free(name);
1136 warning << string_compose(
1137 _("Plugin \"%1\" preset \"%2\" is missing a label\n"),
1138 lilv_node_as_string(lilv_plugin_get_uri(_impl->plugin)),
1139 lilv_node_as_string(preset)) << endmsg;
1142 lilv_nodes_free(presets);
1144 lilv_node_free(rdfs_label);
1145 lilv_node_free(pset_Preset);
1146 lilv_node_free(lv2_appliesTo);
1150 set_port_value(const char* port_symbol,
1156 LV2Plugin* self = (LV2Plugin*)user_data;
1157 if (type != 0 && type != URIMap::instance().urids.atom_Float) {
1158 return; // TODO: Support non-float ports
1161 const uint32_t port_index = self->port_index(port_symbol);
1162 if (port_index != (uint32_t)-1) {
1163 self->set_parameter(port_index, *(const float*)value);
1168 LV2Plugin::load_preset(PresetRecord r)
1170 LilvWorld* world = _world.world;
1171 LilvNode* pset = lilv_new_uri(world, r.uri.c_str());
1172 LilvState* state = lilv_state_new_from_world(world, _uri_map.urid_map(), pset);
1175 lilv_state_restore(state, _impl->instance, set_port_value, this, 0, NULL);
1176 lilv_state_free(state);
1177 Plugin::load_preset(r);
1180 lilv_node_free(pset);
1185 ARDOUR::lv2plugin_get_port_value(const char* port_symbol,
1190 LV2Plugin *plugin = (LV2Plugin *) user_data;
1192 uint32_t index = plugin->port_index(port_symbol);
1193 if (index != (uint32_t) -1) {
1194 if (plugin->parameter_is_input(index) && plugin->parameter_is_control(index)) {
1196 *size = sizeof(float);
1197 *type = plugin->_uri_map.uri_to_id(LV2_ATOM__Float);
1198 value = &plugin->_shadow_data[index];
1210 LV2Plugin::do_save_preset(string name)
1212 LilvNode* plug_name = lilv_plugin_get_name(_impl->plugin);
1213 const string prefix = legalize_for_uri(lilv_node_as_string(plug_name));
1214 const string base_name = legalize_for_uri(name);
1215 const string file_name = base_name + ".ttl";
1216 const string bundle = Glib::build_filename(
1217 Glib::get_home_dir(),
1218 Glib::build_filename(".lv2", prefix + "_" + base_name + ".lv2"));
1220 #ifdef HAVE_LILV_0_21_3
1221 /* delete reference to old preset (if any) */
1222 const PresetRecord* r = preset_by_label(name);
1224 LilvNode* pset = lilv_new_uri (_world.world, r->uri.c_str());
1226 lilv_world_unload_resource (_world.world, pset);
1227 lilv_node_free(pset);
1232 LilvState* state = lilv_state_new_from_instance(
1235 _uri_map.urid_map(),
1236 scratch_dir().c_str(), // file_dir
1237 bundle.c_str(), // copy_dir
1238 bundle.c_str(), // link_dir
1239 bundle.c_str(), // save_dir
1240 lv2plugin_get_port_value, // get_value
1241 (void*)this, // user_data
1242 LV2_STATE_IS_POD|LV2_STATE_IS_PORTABLE, // flags
1243 _features // features
1246 lilv_state_set_label(state, name.c_str());
1248 _world.world, // world
1249 _uri_map.urid_map(), // map
1250 _uri_map.urid_unmap(), // unmap
1252 NULL, // uri (NULL = use file URI)
1253 bundle.c_str(), // dir
1254 file_name.c_str() // filename
1257 lilv_state_free(state);
1259 std::string uri = Glib::filename_to_uri(Glib::build_filename(bundle, file_name));
1260 LilvNode *node_bundle = lilv_new_uri(_world.world, Glib::filename_to_uri(Glib::build_filename(bundle, "/")).c_str());
1261 LilvNode *node_preset = lilv_new_uri(_world.world, uri.c_str());
1262 #ifdef HAVE_LILV_0_21_3
1263 lilv_world_unload_resource(_world.world, node_preset);
1264 lilv_world_unload_bundle(_world.world, node_bundle);
1266 lilv_world_load_bundle(_world.world, node_bundle);
1267 lilv_world_load_resource(_world.world, node_preset);
1268 lilv_node_free(node_bundle);
1269 lilv_node_free(node_preset);
1270 lilv_node_free(plug_name);
1275 LV2Plugin::do_remove_preset(string name)
1277 #ifdef HAVE_LILV_0_21_3
1278 /* Look up preset record by label (FIXME: ick, label as ID) */
1279 const PresetRecord* r = preset_by_label(name);
1284 /* Load a LilvState for the preset. */
1285 LilvWorld* world = _world.world;
1286 LilvNode* pset = lilv_new_uri(world, r->uri.c_str());
1287 LilvState* state = lilv_state_new_from_world(world, _uri_map.urid_map(), pset);
1289 lilv_node_free(pset);
1293 /* Unload preset from world. */
1294 lilv_world_unload_resource(world, pset);
1296 /* Delete it from the file system. This will remove the preset file and the entry
1297 from the manifest. If this results in an empty manifest (i.e. the
1298 preset is the only thing in the bundle), then the bundle is removed. */
1299 lilv_state_delete(world, state);
1301 lilv_state_free(state);
1302 lilv_node_free(pset);
1304 /* Without lilv_state_delete(), we could delete the preset file, but this
1305 would leave a broken bundle/manifest around, so the preset would still
1306 be visible, but broken. Naively deleting a bundle is too dangerous, so
1307 we simply do not support preset deletion with older Lilv */
1311 LV2Plugin::has_editor() const
1313 return _impl->ui != NULL;
1317 LV2Plugin::has_message_output() const
1319 for (uint32_t i = 0; i < num_ports(); ++i) {
1320 if ((_port_flags[i] & PORT_SEQUENCE) &&
1321 (_port_flags[i] & PORT_OUTPUT)) {
1329 LV2Plugin::write_to(RingBuffer<uint8_t>* dest,
1333 const uint8_t* body)
1335 const uint32_t buf_size = sizeof(UIMessage) + size;
1336 vector<uint8_t> buf(buf_size);
1338 UIMessage* msg = (UIMessage*)&buf[0];
1340 msg->protocol = protocol;
1342 memcpy(msg + 1, body, size);
1344 return (dest->write(&buf[0], buf_size) == buf_size);
1348 LV2Plugin::write_from_ui(uint32_t index,
1351 const uint8_t* body)
1354 size_t rbs = _session.engine().raw_buffer_size(DataType::MIDI) * NBUFS;
1355 /* buffer data communication from plugin UI to plugin instance.
1356 * this buffer needs to potentially hold
1357 * (port's minimumSize) * (audio-periods) / (UI-periods)
1360 * e.g 48kSPS / 128fpp -> audio-periods = 375 Hz
1361 * ui-periods = 25 Hz (SuperRapidScreenUpdate)
1362 * default minimumSize = 32K (see LV2Plugin::allocate_atom_event_buffers()
1364 * it is NOT safe to overflow (msg.size will be misinterpreted)
1366 uint32_t bufsiz = 32768;
1367 if (_atom_ev_buffers && _atom_ev_buffers[0]) {
1368 bufsiz = lv2_evbuf_get_capacity(_atom_ev_buffers[0]);
1370 rbs = max((size_t) bufsiz * 8, rbs);
1371 _from_ui = new RingBuffer<uint8_t>(rbs);
1374 if (!write_to(_from_ui, index, protocol, size, body)) {
1375 error << "Error writing from UI to plugin" << endmsg;
1382 LV2Plugin::write_to_ui(uint32_t index,
1385 const uint8_t* body)
1387 if (!write_to(_to_ui, index, protocol, size, body)) {
1388 error << "Error writing from plugin to UI" << endmsg;
1395 forge_variant(LV2_Atom_Forge* forge, const Variant& value)
1397 switch (value.type()) {
1398 case Variant::NOTHING:
1400 case Variant::BEATS:
1401 // No atom type for this, just forge a double
1402 lv2_atom_forge_double(forge, value.get_beats().to_double());
1405 lv2_atom_forge_bool(forge, value.get_bool());
1407 case Variant::DOUBLE:
1408 lv2_atom_forge_double(forge, value.get_double());
1410 case Variant::FLOAT:
1411 lv2_atom_forge_float(forge, value.get_float());
1414 lv2_atom_forge_int(forge, value.get_int());
1417 lv2_atom_forge_long(forge, value.get_long());
1420 lv2_atom_forge_path(
1421 forge, value.get_path().c_str(), value.get_path().size());
1423 case Variant::STRING:
1424 lv2_atom_forge_string(
1425 forge, value.get_string().c_str(), value.get_string().size());
1429 forge, value.get_uri().c_str(), value.get_uri().size());
1434 /** Get a variant type from a URI, return false iff no match found. */
1436 uri_to_variant_type(const std::string& uri, Variant::Type& type)
1438 if (uri == LV2_ATOM__Bool) {
1439 type = Variant::BOOL;
1440 } else if (uri == LV2_ATOM__Double) {
1441 type = Variant::DOUBLE;
1442 } else if (uri == LV2_ATOM__Float) {
1443 type = Variant::FLOAT;
1444 } else if (uri == LV2_ATOM__Int) {
1445 type = Variant::INT;
1446 } else if (uri == LV2_ATOM__Long) {
1447 type = Variant::LONG;
1448 } else if (uri == LV2_ATOM__Path) {
1449 type = Variant::PATH;
1450 } else if (uri == LV2_ATOM__String) {
1451 type = Variant::STRING;
1452 } else if (uri == LV2_ATOM__URI) {
1453 type = Variant::URI;
1461 LV2Plugin::set_property(uint32_t key, const Variant& value)
1463 if (_patch_port_in_index == (uint32_t)-1) {
1464 error << "LV2: set_property called with unset patch_port_in_index" << endmsg;
1466 } else if (value.type() == Variant::NOTHING) {
1467 error << "LV2: set_property called with void value" << endmsg;
1471 // Set up forge to write to temporary buffer on the stack
1472 LV2_Atom_Forge* forge = &_impl->ui_forge;
1473 LV2_Atom_Forge_Frame frame;
1474 uint8_t buf[PATH_MAX]; // Ought to be enough for anyone...
1476 lv2_atom_forge_set_buffer(forge, buf, sizeof(buf));
1478 // Serialize patch:Set message to set property
1479 #ifdef HAVE_LV2_1_10_0
1480 lv2_atom_forge_object(forge, &frame, 1, _uri_map.urids.patch_Set);
1481 lv2_atom_forge_key(forge, _uri_map.urids.patch_property);
1482 lv2_atom_forge_urid(forge, key);
1483 lv2_atom_forge_key(forge, _uri_map.urids.patch_value);
1485 lv2_atom_forge_blank(forge, &frame, 1, _uri_map.urids.patch_Set);
1486 lv2_atom_forge_property_head(forge, _uri_map.urids.patch_property, 0);
1487 lv2_atom_forge_urid(forge, key);
1488 lv2_atom_forge_property_head(forge, _uri_map.urids.patch_value, 0);
1491 forge_variant(forge, value);
1493 // Write message to UI=>Plugin ring
1494 const LV2_Atom* const atom = (const LV2_Atom*)buf;
1495 write_from_ui(_patch_port_in_index,
1496 _uri_map.urids.atom_eventTransfer,
1497 lv2_atom_total_size(atom),
1498 (const uint8_t*)atom);
1501 const ParameterDescriptor&
1502 LV2Plugin::get_property_descriptor(uint32_t id) const
1504 PropertyDescriptors::const_iterator p = _property_descriptors.find(id);
1505 if (p != _property_descriptors.end()) {
1508 return Plugin::get_property_descriptor(id);
1512 load_parameter_descriptor_units(LilvWorld* lworld, ParameterDescriptor& desc, const LilvNodes* units)
1514 if (lilv_nodes_contains(units, _world.units_midiNote)) {
1515 desc.unit = ParameterDescriptor::MIDI_NOTE;
1516 } else if (lilv_nodes_contains(units, _world.units_db)) {
1517 desc.unit = ParameterDescriptor::DB;
1518 } else if (lilv_nodes_contains(units, _world.units_hz)) {
1519 desc.unit = ParameterDescriptor::HZ;
1521 if (lilv_nodes_size(units) > 0) {
1522 const LilvNode* unit = lilv_nodes_get_first(units);
1523 LilvNode* render = get_value(lworld, unit, _world.units_render);
1525 desc.print_fmt = lilv_node_as_string(render);
1526 lilv_node_free(render);
1532 load_parameter_descriptor(LV2World& world,
1533 ParameterDescriptor& desc,
1534 Variant::Type datatype,
1535 const LilvNode* subject)
1537 LilvWorld* lworld = _world.world;
1538 LilvNode* label = get_value(lworld, subject, _world.rdfs_label);
1539 LilvNode* def = get_value(lworld, subject, _world.lv2_default);
1540 LilvNode* minimum = get_value(lworld, subject, _world.lv2_minimum);
1541 LilvNode* maximum = get_value(lworld, subject, _world.lv2_maximum);
1542 LilvNodes* units = lilv_world_find_nodes(lworld, subject, _world.units_unit, NULL);
1544 desc.label = lilv_node_as_string(label);
1546 if (def && lilv_node_is_float(def)) {
1547 desc.normal = lilv_node_as_float(def);
1549 if (minimum && lilv_node_is_float(minimum)) {
1550 desc.lower = lilv_node_as_float(minimum);
1552 if (maximum && lilv_node_is_float(maximum)) {
1553 desc.upper = lilv_node_as_float(maximum);
1555 load_parameter_descriptor_units(lworld, desc, units);
1556 desc.datatype = datatype;
1557 desc.toggled |= datatype == Variant::BOOL;
1558 desc.integer_step |= datatype == Variant::INT || datatype == Variant::LONG;
1559 desc.update_steps();
1561 lilv_nodes_free(units);
1562 lilv_node_free(label);
1563 lilv_node_free(def);
1564 lilv_node_free(minimum);
1565 lilv_node_free(maximum);
1569 LV2Plugin::load_supported_properties(PropertyDescriptors& descs)
1571 LilvWorld* lworld = _world.world;
1572 const LilvNode* subject = lilv_plugin_get_uri(_impl->plugin);
1573 LilvNodes* properties = lilv_world_find_nodes(
1574 lworld, subject, _world.patch_writable, NULL);
1575 LILV_FOREACH(nodes, p, properties) {
1576 // Get label and range
1577 const LilvNode* prop = lilv_nodes_get(properties, p);
1578 LilvNode* range = get_value(lworld, prop, _world.rdfs_range);
1580 warning << string_compose(_("LV2: property <%1> has no range datatype, ignoring"),
1581 lilv_node_as_uri(prop)) << endmsg;
1585 // Convert range to variant type (TODO: support for multiple range types)
1586 Variant::Type datatype;
1587 if (!uri_to_variant_type(lilv_node_as_uri(range), datatype)) {
1588 error << string_compose(_("LV2: property <%1> has unsupported datatype <%1>"),
1589 lilv_node_as_uri(prop), lilv_node_as_uri(range)) << endmsg;
1593 // Add description to result
1594 ParameterDescriptor desc;
1595 desc.key = _uri_map.uri_to_id(lilv_node_as_uri(prop));
1596 desc.datatype = datatype;
1597 load_parameter_descriptor(_world, desc, datatype, prop);
1598 descs.insert(std::make_pair(desc.key, desc));
1600 lilv_node_free(range);
1602 lilv_nodes_free(properties);
1606 LV2Plugin::announce_property_values()
1608 if (_patch_port_in_index == (uint32_t)-1) {
1612 // Set up forge to write to temporary buffer on the stack
1613 LV2_Atom_Forge* forge = &_impl->ui_forge;
1614 LV2_Atom_Forge_Frame frame;
1615 uint8_t buf[PATH_MAX]; // Ought to be enough for anyone...
1617 lv2_atom_forge_set_buffer(forge, buf, sizeof(buf));
1619 // Serialize patch:Get message with no subject (implicitly plugin instance)
1620 #ifdef HAVE_LV2_1_10_0
1621 lv2_atom_forge_object(forge, &frame, 1, _uri_map.urids.patch_Get);
1623 lv2_atom_forge_blank(forge, &frame, 1, _uri_map.urids.patch_Get);
1626 // Write message to UI=>Plugin ring
1627 const LV2_Atom* const atom = (const LV2_Atom*)buf;
1628 write_from_ui(_patch_port_in_index,
1629 _uri_map.urids.atom_eventTransfer,
1630 lv2_atom_total_size(atom),
1631 (const uint8_t*)atom);
1635 LV2Plugin::enable_ui_emission()
1638 /* see note in LV2Plugin::write_from_ui() */
1639 uint32_t bufsiz = 32768;
1640 if (_atom_ev_buffers && _atom_ev_buffers[0]) {
1641 bufsiz = lv2_evbuf_get_capacity(_atom_ev_buffers[0]);
1643 size_t rbs = _session.engine().raw_buffer_size(DataType::MIDI) * NBUFS;
1644 rbs = max((size_t) bufsiz * 8, rbs);
1645 _to_ui = new RingBuffer<uint8_t>(rbs);
1650 LV2Plugin::emit_to_ui(void* controller, UIMessageSink sink)
1656 uint32_t read_space = _to_ui->read_space();
1657 while (read_space > sizeof(UIMessage)) {
1659 if (_to_ui->read((uint8_t*)&msg, sizeof(msg)) != sizeof(msg)) {
1660 error << "Error reading from Plugin=>UI RingBuffer" << endmsg;
1663 vector<uint8_t> body(msg.size);
1664 if (_to_ui->read(&body[0], msg.size) != msg.size) {
1665 error << "Error reading from Plugin=>UI RingBuffer" << endmsg;
1669 sink(controller, msg.index, msg.size, msg.protocol, &body[0]);
1671 read_space -= sizeof(msg) + msg.size;
1676 LV2Plugin::work(uint32_t size, const void* data)
1678 return _impl->work_iface->work(
1679 _impl->instance->lv2_handle, work_respond, this, size, data);
1683 LV2Plugin::work_response(uint32_t size, const void* data)
1685 return _impl->work_iface->work_response(
1686 _impl->instance->lv2_handle, size, data);
1690 LV2Plugin::set_insert_id(PBD::ID id)
1692 if (_insert_id == "0") {
1694 } else if (_insert_id != id) {
1695 lilv_state_free(_impl->state);
1696 _impl->state = NULL;
1702 LV2Plugin::set_state_dir (const std::string& d)
1704 _plugin_state_dir = d;
1708 LV2Plugin::set_state(const XMLNode& node, int version)
1711 const XMLProperty* prop;
1712 XMLNodeConstIterator iter;
1717 LocaleGuard lg(X_("C"));
1719 if (node.name() != state_node_name()) {
1720 error << _("Bad node sent to LV2Plugin::set_state") << endmsg;
1724 #ifndef NO_PLUGIN_STATE
1726 if (version < 3000) {
1727 nodes = node.children("port");
1729 nodes = node.children("Port");
1732 for (iter = nodes.begin(); iter != nodes.end(); ++iter) {
1736 if ((prop = child->property("symbol")) != 0) {
1737 sym = prop->value().c_str();
1739 warning << _("LV2: port has no symbol, ignored") << endmsg;
1743 map<string, uint32_t>::iterator i = _port_indices.find(sym);
1745 if (i != _port_indices.end()) {
1746 port_id = i->second;
1748 warning << _("LV2: port has unknown index, ignored") << endmsg;
1752 if ((prop = child->property("value")) != 0) {
1753 value = prop->value().c_str();
1755 warning << _("LV2: port has no value, ignored") << endmsg;
1759 set_parameter(port_id, atof(value));
1762 if ((prop = node.property("template-dir")) != 0) {
1763 set_state_dir (prop->value ());
1767 if ((prop = node.property("state-dir")) != 0) {
1768 if (sscanf(prop->value().c_str(), "state%u", &_state_version) != 1) {
1769 error << string_compose(
1770 "LV2: failed to parse state version from \"%1\"",
1771 prop->value()) << endmsg;
1774 std::string state_file = Glib::build_filename(
1776 Glib::build_filename(prop->value(), "state.ttl"));
1778 LilvState* state = lilv_state_new_from_file(
1779 _world.world, _uri_map.urid_map(), NULL, state_file.c_str());
1781 lilv_state_restore(state, _impl->instance, NULL, NULL, 0, NULL);
1782 lilv_state_free(_impl->state);
1783 _impl->state = state;
1786 if (!_plugin_state_dir.empty ()) {
1787 // force save with session, next time (increment counter)
1788 lilv_state_free (_impl->state);
1789 _impl->state = NULL;
1793 latency_compute_run();
1796 return Plugin::set_state(node, version);
1800 LV2Plugin::get_parameter_descriptor(uint32_t which, ParameterDescriptor& desc) const
1802 const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, which);
1804 error << string_compose("LV2: get descriptor of non-existent port %1", which)
1809 LilvNodes* portunits;
1810 LilvNode *def, *min, *max;
1811 lilv_port_get_range(_impl->plugin, port, &def, &min, &max);
1812 portunits = lilv_port_get_value(_impl->plugin, port, _world.units_unit);
1814 // TODO: Once we can rely on lilv 0.18.0 being present,
1815 // load_parameter_descriptor() can be used for ports as well
1816 desc.integer_step = lilv_port_has_property(_impl->plugin, port, _world.lv2_integer);
1817 desc.toggled = lilv_port_has_property(_impl->plugin, port, _world.lv2_toggled);
1818 desc.logarithmic = lilv_port_has_property(_impl->plugin, port, _world.ext_logarithmic);
1819 desc.sr_dependent = lilv_port_has_property(_impl->plugin, port, _world.lv2_sampleRate);
1820 desc.label = lilv_node_as_string(lilv_port_get_name(_impl->plugin, port));
1821 desc.normal = def ? lilv_node_as_float(def) : 0.0f;
1822 desc.lower = min ? lilv_node_as_float(min) : 0.0f;
1823 desc.upper = max ? lilv_node_as_float(max) : 1.0f;
1824 load_parameter_descriptor_units(_world.world, desc, portunits);
1826 if (desc.sr_dependent) {
1827 desc.lower *= _session.frame_rate ();
1828 desc.upper *= _session.frame_rate ();
1831 desc.min_unbound = false; // TODO: LV2 extension required
1832 desc.max_unbound = false; // TODO: LV2 extension required
1834 desc.enumeration = lilv_port_has_property(_impl->plugin, port, _world.lv2_enumeration);
1835 desc.scale_points = get_scale_points(which);
1837 desc.update_steps();
1839 lilv_node_free(def);
1840 lilv_node_free(min);
1841 lilv_node_free(max);
1842 lilv_nodes_free(portunits);
1848 LV2Plugin::describe_parameter(Evoral::Parameter which)
1850 if (( which.type() == PluginAutomation) && ( which.id() < parameter_count()) ) {
1852 if (lilv_port_has_property(_impl->plugin,
1853 lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.ext_notOnGUI)) {
1854 return X_("hidden");
1857 if (lilv_port_has_property(_impl->plugin,
1858 lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.lv2_freewheeling)) {
1859 return X_("hidden");
1862 if (lilv_port_has_property(_impl->plugin,
1863 lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.lv2_reportsLatency)) {
1864 return X_("latency");
1867 LilvNode* name = lilv_port_get_name(_impl->plugin,
1868 lilv_plugin_get_port_by_index(_impl->plugin, which.id()));
1869 string ret(lilv_node_as_string(name));
1870 lilv_node_free(name);
1878 LV2Plugin::signal_latency() const
1880 if (_latency_control_port) {
1881 return (framecnt_t)floor(*_latency_control_port);
1887 set<Evoral::Parameter>
1888 LV2Plugin::automatable() const
1890 set<Evoral::Parameter> ret;
1892 for (uint32_t i = 0; i < parameter_count(); ++i) {
1893 if (parameter_is_input(i) && parameter_is_control(i)) {
1894 ret.insert(ret.end(), Evoral::Parameter(PluginAutomation, 0, i));
1898 for (PropertyDescriptors::const_iterator p = _property_descriptors.begin();
1899 p != _property_descriptors.end();
1901 ret.insert(ret.end(), Evoral::Parameter(PluginPropertyAutomation, 0, p->first));
1907 LV2Plugin::activate()
1909 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 activate\n", name()));
1911 if (!_was_activated) {
1912 lilv_instance_activate(_impl->instance);
1913 _was_activated = true;
1918 LV2Plugin::deactivate()
1920 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 deactivate\n", name()));
1922 if (_was_activated) {
1923 lilv_instance_deactivate(_impl->instance);
1924 _was_activated = false;
1929 LV2Plugin::cleanup()
1931 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 cleanup\n", name()));
1934 lilv_instance_free(_impl->instance);
1935 _impl->instance = NULL;
1939 LV2Plugin::allocate_atom_event_buffers()
1941 /* reserve local scratch buffers for ATOM event-queues */
1942 const LilvPlugin* p = _impl->plugin;
1944 /* count non-MIDI atom event-ports
1945 * TODO: nicely ask drobilla to make a lilv_ call for that
1947 int count_atom_out = 0;
1948 int count_atom_in = 0;
1949 int minimumSize = 32768; // TODO use a per-port minimum-size
1950 for (uint32_t i = 0; i < lilv_plugin_get_num_ports(p); ++i) {
1951 const LilvPort* port = lilv_plugin_get_port_by_index(p, i);
1952 if (lilv_port_is_a(p, port, _world.atom_AtomPort)) {
1953 LilvNodes* buffer_types = lilv_port_get_value(
1954 p, port, _world.atom_bufferType);
1955 LilvNodes* atom_supports = lilv_port_get_value(
1956 p, port, _world.atom_supports);
1958 if (!lilv_nodes_contains(buffer_types, _world.atom_Sequence)
1959 || !lilv_nodes_contains(atom_supports, _world.midi_MidiEvent)) {
1960 if (lilv_port_is_a(p, port, _world.lv2_InputPort)) {
1963 if (lilv_port_is_a(p, port, _world.lv2_OutputPort)) {
1966 LilvNodes* min_size_v = lilv_port_get_value(_impl->plugin, port, _world.rsz_minimumSize);
1967 LilvNode* min_size = min_size_v ? lilv_nodes_get_first(min_size_v) : NULL;
1968 if (min_size && lilv_node_is_int(min_size)) {
1969 minimumSize = std::max(minimumSize, lilv_node_as_int(min_size));
1971 lilv_nodes_free(min_size_v);
1973 lilv_nodes_free(buffer_types);
1974 lilv_nodes_free(atom_supports);
1978 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 need buffers for %2 atom-in and %3 atom-out event-ports\n",
1979 name(), count_atom_in, count_atom_out));
1981 const int total_atom_buffers = (count_atom_in + count_atom_out);
1982 if (_atom_ev_buffers || total_atom_buffers == 0) {
1986 DEBUG_TRACE(DEBUG::LV2, string_compose("allocate %1 atom_ev_buffers of %d bytes\n", total_atom_buffers, minimumSize));
1987 _atom_ev_buffers = (LV2_Evbuf**) malloc((total_atom_buffers + 1) * sizeof(LV2_Evbuf*));
1988 for (int i = 0; i < total_atom_buffers; ++i ) {
1989 _atom_ev_buffers[i] = lv2_evbuf_new(minimumSize, LV2_EVBUF_ATOM,
1990 _uri_map.urids.atom_Chunk, _uri_map.urids.atom_Sequence);
1992 _atom_ev_buffers[total_atom_buffers] = 0;
1996 /** Write an ardour position/time/tempo/meter as an LV2 event.
1997 * @return true on success.
2000 write_position(LV2_Atom_Forge* forge,
2002 const TempoMetric& t,
2003 Timecode::BBT_Time& bbt,
2005 framepos_t position,
2008 const URIMap::URIDs& urids = URIMap::instance().urids;
2010 uint8_t pos_buf[256];
2011 lv2_atom_forge_set_buffer(forge, pos_buf, sizeof(pos_buf));
2012 LV2_Atom_Forge_Frame frame;
2013 #ifdef HAVE_LV2_1_10_0
2014 lv2_atom_forge_object(forge, &frame, 1, urids.time_Position);
2015 lv2_atom_forge_key(forge, urids.time_frame);
2016 lv2_atom_forge_long(forge, position);
2017 lv2_atom_forge_key(forge, urids.time_speed);
2018 lv2_atom_forge_float(forge, speed);
2019 lv2_atom_forge_key(forge, urids.time_barBeat);
2020 lv2_atom_forge_float(forge, bbt.beats - 1 +
2021 (bbt.ticks / Timecode::BBT_Time::ticks_per_beat));
2022 lv2_atom_forge_key(forge, urids.time_bar);
2023 lv2_atom_forge_long(forge, bbt.bars - 1);
2024 lv2_atom_forge_key(forge, urids.time_beatUnit);
2025 lv2_atom_forge_int(forge, t.meter().note_divisor());
2026 lv2_atom_forge_key(forge, urids.time_beatsPerBar);
2027 lv2_atom_forge_float(forge, t.meter().divisions_per_bar());
2028 lv2_atom_forge_key(forge, urids.time_beatsPerMinute);
2029 lv2_atom_forge_float(forge, t.tempo().beats_per_minute());
2031 lv2_atom_forge_blank(forge, &frame, 1, urids.time_Position);
2032 lv2_atom_forge_property_head(forge, urids.time_frame, 0);
2033 lv2_atom_forge_long(forge, position);
2034 lv2_atom_forge_property_head(forge, urids.time_speed, 0);
2035 lv2_atom_forge_float(forge, speed);
2036 lv2_atom_forge_property_head(forge, urids.time_barBeat, 0);
2037 lv2_atom_forge_float(forge, bbt.beats - 1 +
2038 (bbt.ticks / Timecode::BBT_Time::ticks_per_beat));
2039 lv2_atom_forge_property_head(forge, urids.time_bar, 0);
2040 lv2_atom_forge_long(forge, bbt.bars - 1);
2041 lv2_atom_forge_property_head(forge, urids.time_beatUnit, 0);
2042 lv2_atom_forge_int(forge, t.meter().note_divisor());
2043 lv2_atom_forge_property_head(forge, urids.time_beatsPerBar, 0);
2044 lv2_atom_forge_float(forge, t.meter().divisions_per_bar());
2045 lv2_atom_forge_property_head(forge, urids.time_beatsPerMinute, 0);
2046 lv2_atom_forge_float(forge, t.tempo().beats_per_minute());
2049 LV2_Evbuf_Iterator end = lv2_evbuf_end(buf);
2050 const LV2_Atom* const atom = (const LV2_Atom*)pos_buf;
2051 return lv2_evbuf_write(&end, offset, 0, atom->type, atom->size,
2052 (const uint8_t*)(atom + 1));
2056 LV2Plugin::connect_and_run(BufferSet& bufs,
2057 ChanMapping in_map, ChanMapping out_map,
2058 pframes_t nframes, framecnt_t offset)
2060 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 run %2 offset %3\n", name(), nframes, offset));
2061 Plugin::connect_and_run(bufs, in_map, out_map, nframes, offset);
2063 cycles_t then = get_cycles();
2065 TempoMap& tmap = _session.tempo_map();
2066 Metrics::const_iterator metric_i = tmap.metrics_end();
2067 TempoMetric tmetric = tmap.metric_at(_session.transport_frame(), &metric_i);
2069 if (_freewheel_control_port) {
2070 *_freewheel_control_port = _session.engine().freewheeling() ? 1.f : 0.f;
2073 if (_bpm_control_port) {
2074 *_bpm_control_port = tmetric.tempo().beats_per_minute();
2077 ChanCount bufs_count;
2078 bufs_count.set(DataType::AUDIO, 1);
2079 bufs_count.set(DataType::MIDI, 1);
2080 BufferSet& silent_bufs = _session.get_silent_buffers(bufs_count);
2081 BufferSet& scratch_bufs = _session.get_scratch_buffers(bufs_count);
2082 uint32_t const num_ports = parameter_count();
2083 uint32_t const nil_index = std::numeric_limits<uint32_t>::max();
2085 uint32_t audio_in_index = 0;
2086 uint32_t audio_out_index = 0;
2087 uint32_t midi_in_index = 0;
2088 uint32_t midi_out_index = 0;
2089 uint32_t atom_port_index = 0;
2090 for (uint32_t port_index = 0; port_index < num_ports; ++port_index) {
2092 uint32_t index = nil_index;
2093 PortFlags flags = _port_flags[port_index];
2095 if (flags & PORT_AUDIO) {
2096 if (flags & PORT_INPUT) {
2097 index = in_map.get(DataType::AUDIO, audio_in_index++, &valid);
2099 ? bufs.get_audio(index).data(offset)
2100 : silent_bufs.get_audio(0).data(offset);
2102 index = out_map.get(DataType::AUDIO, audio_out_index++, &valid);
2104 ? bufs.get_audio(index).data(offset)
2105 : scratch_bufs.get_audio(0).data(offset);
2107 } else if (flags & (PORT_EVENT|PORT_SEQUENCE)) {
2108 /* FIXME: The checks here for bufs.count().n_midi() > index shouldn't
2109 be necessary, but the mapping is illegal in some cases. Ideally
2110 that should be fixed, but this is easier...
2112 if (flags & PORT_MIDI) {
2113 if (flags & PORT_INPUT) {
2114 index = in_map.get(DataType::MIDI, midi_in_index++, &valid);
2116 index = out_map.get(DataType::MIDI, midi_out_index++, &valid);
2118 if (valid && bufs.count().n_midi() > index) {
2119 /* Note, ensure_lv2_bufsize() is not RT safe!
2120 * However free()/alloc() is only called if a
2121 * plugin requires a rsz:minimumSize buffersize
2122 * and the existing buffer if smaller.
2124 bufs.ensure_lv2_bufsize((flags & PORT_INPUT), index, _port_minimumSize[port_index]);
2125 _ev_buffers[port_index] = bufs.get_lv2_midi(
2126 (flags & PORT_INPUT), index, (flags & PORT_EVENT));
2128 } else if ((flags & PORT_POSITION) && (flags & PORT_INPUT)) {
2129 lv2_evbuf_reset(_atom_ev_buffers[atom_port_index], true);
2130 _ev_buffers[port_index] = _atom_ev_buffers[atom_port_index++];
2134 if (valid && (flags & PORT_INPUT)) {
2135 Timecode::BBT_Time bbt;
2136 if ((flags & PORT_POSITION)) {
2137 if (_session.transport_frame() != _next_cycle_start ||
2138 _session.transport_speed() != _next_cycle_speed) {
2139 // Transport has changed, write position at cycle start
2140 tmap.bbt_time(_session.transport_frame(), bbt);
2141 write_position(&_impl->forge, _ev_buffers[port_index],
2142 tmetric, bbt, _session.transport_speed(),
2143 _session.transport_frame(), 0);
2147 // Get MIDI iterator range (empty range if no MIDI)
2148 MidiBuffer::iterator m = (index != nil_index)
2149 ? bufs.get_midi(index).begin()
2150 : silent_bufs.get_midi(0).end();
2151 MidiBuffer::iterator m_end = (index != nil_index)
2152 ? bufs.get_midi(index).end()
2155 // Now merge MIDI and any transport events into the buffer
2156 const uint32_t type = _uri_map.urids.midi_MidiEvent;
2157 const framepos_t tend = _session.transport_frame() + nframes;
2159 while (m != m_end || (metric_i != tmap.metrics_end() &&
2160 (*metric_i)->frame() < tend)) {
2161 MetricSection* metric = (metric_i != tmap.metrics_end())
2163 if (m != m_end && (!metric || metric->frame() > (*m).time())) {
2164 const Evoral::MIDIEvent<framepos_t> ev(*m, false);
2165 if (ev.time() < nframes) {
2166 LV2_Evbuf_Iterator eend = lv2_evbuf_end(_ev_buffers[port_index]);
2167 lv2_evbuf_write(&eend, ev.time(), 0, type, ev.size(), ev.buffer());
2171 tmetric.set_metric(metric);
2172 bbt = metric->start();
2173 write_position(&_impl->forge, _ev_buffers[port_index],
2174 tmetric, bbt, _session.transport_speed(),
2176 metric->frame() - _session.transport_frame());
2180 } else if (!valid) {
2181 // Nothing we understand or care about, connect to scratch
2182 // see note for midi-buffer size above
2183 scratch_bufs.ensure_lv2_bufsize((flags & PORT_INPUT),
2184 0, _port_minimumSize[port_index]);
2185 _ev_buffers[port_index] = scratch_bufs.get_lv2_midi(
2186 (flags & PORT_INPUT), 0, (flags & PORT_EVENT));
2189 buf = lv2_evbuf_get_buffer(_ev_buffers[port_index]);
2191 continue; // Control port, leave buffer alone
2193 lilv_instance_connect_port(_impl->instance, port_index, buf);
2196 // Read messages from UI and push into appropriate buffers
2198 uint32_t read_space = _from_ui->read_space();
2199 while (read_space > sizeof(UIMessage)) {
2201 if (_from_ui->read((uint8_t*)&msg, sizeof(msg)) != sizeof(msg)) {
2202 error << "Error reading from UI=>Plugin RingBuffer" << endmsg;
2205 vector<uint8_t> body(msg.size);
2206 if (_from_ui->read(&body[0], msg.size) != msg.size) {
2207 error << "Error reading from UI=>Plugin RingBuffer" << endmsg;
2210 if (msg.protocol == URIMap::instance().urids.atom_eventTransfer) {
2211 LV2_Evbuf* buf = _ev_buffers[msg.index];
2212 LV2_Evbuf_Iterator i = lv2_evbuf_end(buf);
2213 const LV2_Atom* const atom = (const LV2_Atom*)&body[0];
2214 if (!lv2_evbuf_write(&i, nframes - 1, 0, atom->type, atom->size,
2215 (const uint8_t*)(atom + 1))) {
2216 error << "Failed to write data to LV2 event buffer\n";
2219 error << "Received unknown message type from UI" << endmsg;
2221 read_space -= sizeof(UIMessage) + msg.size;
2228 for (uint32_t port_index = 0; port_index < num_ports; ++port_index) {
2229 PortFlags flags = _port_flags[port_index];
2232 /* TODO ask drobilla about comment
2233 * "Make Ardour event buffers generic so plugins can communicate"
2234 * in libs/ardour/buffer_set.cc:310
2236 * ideally the user could choose which of the following two modes
2237 * to use (e.g. instrument/effect chains MIDI OUT vs MIDI TRHU).
2239 * This implementation follows the discussion on IRC Mar 16 2013 16:47 UTC
2240 * 16:51 < drobilla> rgareus: [..] i.e always replace with MIDI output [of LV2 plugin] if it's there
2241 * 16:52 < drobilla> rgareus: That would probably be good enough [..] to make users not complain
2242 * for quite a while at least ;)
2244 // copy output of LV2 plugin's MIDI port to Ardour MIDI buffers -- MIDI OUT
2245 if ((flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE|PORT_MIDI))) {
2246 const uint32_t buf_index = out_map.get(
2247 DataType::MIDI, midi_out_index++, &valid);
2249 bufs.forward_lv2_midi(_ev_buffers[port_index], buf_index);
2252 // Flush MIDI (write back to Ardour MIDI buffers) -- MIDI THRU
2253 else if ((flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE))) {
2254 const uint32_t buf_index = out_map.get(
2255 DataType::MIDI, midi_out_index++, &valid);
2257 bufs.flush_lv2_midi(true, buf_index);
2262 // Write messages to UI
2263 if ((_to_ui || _patch_port_out_index != (uint32_t)-1) &&
2264 (flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE))) {
2265 LV2_Evbuf* buf = _ev_buffers[port_index];
2266 for (LV2_Evbuf_Iterator i = lv2_evbuf_begin(buf);
2267 lv2_evbuf_is_valid(i);
2268 i = lv2_evbuf_next(i)) {
2269 uint32_t frames, subframes, type, size;
2271 lv2_evbuf_get(i, &frames, &subframes, &type, &size, &data);
2273 // Intercept patch change messages to emit PropertyChanged signal
2274 if ((flags & PORT_PATCHMSG)) {
2275 LV2_Atom* atom = (LV2_Atom*)(data - sizeof(LV2_Atom));
2276 if (atom->type == _uri_map.urids.atom_Blank ||
2277 atom->type == _uri_map.urids.atom_Object) {
2278 LV2_Atom_Object* obj = (LV2_Atom_Object*)atom;
2279 if (obj->body.otype == _uri_map.urids.patch_Set) {
2280 const LV2_Atom* property = NULL;
2281 const LV2_Atom* value = NULL;
2282 lv2_atom_object_get(obj,
2283 _uri_map.urids.patch_property, &property,
2284 _uri_map.urids.patch_value, &value,
2287 if (!property || !value ||
2288 property->type != _uri_map.urids.atom_URID ||
2289 value->type != _uri_map.urids.atom_Path) {
2290 std::cerr << "warning: patch:Set for unknown property" << std::endl;
2294 const uint32_t prop_id = ((const LV2_Atom_URID*)property)->body;
2295 const char* path = (const char*)LV2_ATOM_BODY_CONST(value);
2297 // Emit PropertyChanged signal for UI
2298 // TODO: This should emit the control's Changed signal
2299 PropertyChanged(prop_id, Variant(Variant::PATH, path));
2304 if (!_to_ui) continue;
2305 write_to_ui(port_index, URIMap::instance().urids.atom_eventTransfer,
2306 size + sizeof(LV2_Atom),
2307 data - sizeof(LV2_Atom));
2312 cycles_t now = get_cycles();
2313 set_cycles((uint32_t)(now - then));
2315 // Update expected transport information for next cycle so we can detect changes
2316 _next_cycle_speed = _session.transport_speed();
2317 _next_cycle_start = _session.transport_frame() + (nframes * _next_cycle_speed);
2323 LV2Plugin::parameter_is_control(uint32_t param) const
2325 assert(param < _port_flags.size());
2326 return _port_flags[param] & PORT_CONTROL;
2330 LV2Plugin::parameter_is_audio(uint32_t param) const
2332 assert(param < _port_flags.size());
2333 return _port_flags[param] & PORT_AUDIO;
2337 LV2Plugin::parameter_is_event(uint32_t param) const
2339 assert(param < _port_flags.size());
2340 return _port_flags[param] & PORT_EVENT;
2344 LV2Plugin::parameter_is_output(uint32_t param) const
2346 assert(param < _port_flags.size());
2347 return _port_flags[param] & PORT_OUTPUT;
2351 LV2Plugin::parameter_is_input(uint32_t param) const
2353 assert(param < _port_flags.size());
2354 return _port_flags[param] & PORT_INPUT;
2358 LV2Plugin::print_parameter(uint32_t param, char* buf, uint32_t len) const
2361 if (param < parameter_count()) {
2362 snprintf(buf, len, "%.3f", get_parameter(param));
2369 boost::shared_ptr<ScalePoints>
2370 LV2Plugin::get_scale_points(uint32_t port_index) const
2372 const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, port_index);
2373 LilvScalePoints* points = lilv_port_get_scale_points(_impl->plugin, port);
2375 boost::shared_ptr<ScalePoints> ret;
2380 ret = boost::shared_ptr<ScalePoints>(new ScalePoints());
2382 LILV_FOREACH(scale_points, i, points) {
2383 const LilvScalePoint* p = lilv_scale_points_get(points, i);
2384 const LilvNode* label = lilv_scale_point_get_label(p);
2385 const LilvNode* value = lilv_scale_point_get_value(p);
2386 if (label && (lilv_node_is_float(value) || lilv_node_is_int(value))) {
2387 ret->insert(make_pair(lilv_node_as_string(label),
2388 lilv_node_as_float(value)));
2392 lilv_scale_points_free(points);
2397 LV2Plugin::run(pframes_t nframes)
2399 uint32_t const N = parameter_count();
2400 for (uint32_t i = 0; i < N; ++i) {
2401 if (parameter_is_control(i) && parameter_is_input(i)) {
2402 _control_data[i] = _shadow_data[i];
2406 lilv_instance_run(_impl->instance, nframes);
2408 if (_impl->work_iface) {
2409 _worker->emit_responses();
2410 if (_impl->work_iface->end_run) {
2411 _impl->work_iface->end_run(_impl->instance->lv2_handle);
2417 LV2Plugin::latency_compute_run()
2419 if (!_latency_control_port) {
2423 // Run the plugin so that it can set its latency parameter
2425 bool was_activated = _was_activated;
2428 uint32_t port_index = 0;
2429 uint32_t in_index = 0;
2430 uint32_t out_index = 0;
2432 // this is done in the main thread. non realtime.
2433 const framecnt_t bufsize = _engine.samples_per_cycle();
2434 float *buffer = (float*) malloc(_engine.samples_per_cycle() * sizeof(float));
2436 memset(buffer, 0, sizeof(float) * bufsize);
2438 // FIXME: Ensure plugins can handle in-place processing
2442 while (port_index < parameter_count()) {
2443 if (parameter_is_audio(port_index)) {
2444 if (parameter_is_input(port_index)) {
2445 lilv_instance_connect_port(_impl->instance, port_index, buffer);
2447 } else if (parameter_is_output(port_index)) {
2448 lilv_instance_connect_port(_impl->instance, port_index, buffer);
2457 if (was_activated) {
2464 LV2Plugin::Impl::designated_input (const char* uri, void** bufptrs[], void** bufptr)
2466 const LilvPort* port = NULL;
2467 LilvNode* designation = lilv_new_uri(_world.world, uri);
2468 port = lilv_plugin_get_port_by_designation(
2469 plugin, _world.lv2_InputPort, designation);
2470 lilv_node_free(designation);
2472 bufptrs[lilv_port_get_index(plugin, port)] = bufptr;
2477 static bool lv2_filter (const string& str, void* /*arg*/)
2479 /* Not a dotfile, has a prefix before a period, suffix is "lv2" */
2481 return str[0] != '.' && (str.length() > 3 && str.find (".lv2") == (str.length() - 4));
2485 LV2World::LV2World()
2486 : world(lilv_world_new())
2487 , _bundle_checked(false)
2489 atom_AtomPort = lilv_new_uri(world, LV2_ATOM__AtomPort);
2490 atom_Chunk = lilv_new_uri(world, LV2_ATOM__Chunk);
2491 atom_Sequence = lilv_new_uri(world, LV2_ATOM__Sequence);
2492 atom_bufferType = lilv_new_uri(world, LV2_ATOM__bufferType);
2493 atom_supports = lilv_new_uri(world, LV2_ATOM__supports);
2494 atom_eventTransfer = lilv_new_uri(world, LV2_ATOM__eventTransfer);
2495 ev_EventPort = lilv_new_uri(world, LILV_URI_EVENT_PORT);
2496 ext_logarithmic = lilv_new_uri(world, LV2_PORT_PROPS__logarithmic);
2497 ext_notOnGUI = lilv_new_uri(world, LV2_PORT_PROPS__notOnGUI);
2498 lv2_AudioPort = lilv_new_uri(world, LILV_URI_AUDIO_PORT);
2499 lv2_ControlPort = lilv_new_uri(world, LILV_URI_CONTROL_PORT);
2500 lv2_InputPort = lilv_new_uri(world, LILV_URI_INPUT_PORT);
2501 lv2_OutputPort = lilv_new_uri(world, LILV_URI_OUTPUT_PORT);
2502 lv2_inPlaceBroken = lilv_new_uri(world, LV2_CORE__inPlaceBroken);
2503 lv2_integer = lilv_new_uri(world, LV2_CORE__integer);
2504 lv2_default = lilv_new_uri(world, LV2_CORE__default);
2505 lv2_minimum = lilv_new_uri(world, LV2_CORE__minimum);
2506 lv2_maximum = lilv_new_uri(world, LV2_CORE__maximum);
2507 lv2_reportsLatency = lilv_new_uri(world, LV2_CORE__reportsLatency);
2508 lv2_sampleRate = lilv_new_uri(world, LV2_CORE__sampleRate);
2509 lv2_toggled = lilv_new_uri(world, LV2_CORE__toggled);
2510 lv2_enumeration = lilv_new_uri(world, LV2_CORE__enumeration);
2511 lv2_freewheeling = lilv_new_uri(world, LV2_CORE__freeWheeling);
2512 midi_MidiEvent = lilv_new_uri(world, LILV_URI_MIDI_EVENT);
2513 rdfs_comment = lilv_new_uri(world, LILV_NS_RDFS "comment");
2514 rdfs_label = lilv_new_uri(world, LILV_NS_RDFS "label");
2515 rdfs_range = lilv_new_uri(world, LILV_NS_RDFS "range");
2516 rsz_minimumSize = lilv_new_uri(world, LV2_RESIZE_PORT__minimumSize);
2517 time_Position = lilv_new_uri(world, LV2_TIME__Position);
2518 ui_GtkUI = lilv_new_uri(world, LV2_UI__GtkUI);
2519 ui_external = lilv_new_uri(world, "http://lv2plug.in/ns/extensions/ui#external");
2520 ui_externalkx = lilv_new_uri(world, "http://kxstudio.sf.net/ns/lv2ext/external-ui#Widget");
2521 units_unit = lilv_new_uri(world, LV2_UNITS__unit);
2522 units_render = lilv_new_uri(world, LV2_UNITS__render);
2523 units_hz = lilv_new_uri(world, LV2_UNITS__hz);
2524 units_midiNote = lilv_new_uri(world, LV2_UNITS__midiNote);
2525 units_db = lilv_new_uri(world, LV2_UNITS__db);
2526 patch_writable = lilv_new_uri(world, LV2_PATCH__writable);
2527 patch_Message = lilv_new_uri(world, LV2_PATCH__Message);
2528 lv2_noSampleAccurateCtrl = lilv_new_uri(world, LV2_CORE_PREFIX "noSampleAccurateControls");
2529 #ifdef HAVE_LV2_1_2_0
2530 bufz_powerOf2BlockLength = lilv_new_uri(world, LV2_BUF_SIZE__powerOf2BlockLength);
2531 bufz_fixedBlockLength = lilv_new_uri(world, LV2_BUF_SIZE__fixedBlockLength);
2532 bufz_nominalBlockLength = lilv_new_uri(world, "http://lv2plug.in/ns/ext/buf-size#nominalBlockLength");
2537 LV2World::~LV2World()
2542 #ifdef HAVE_LV2_1_2_0
2543 lilv_node_free(bufz_nominalBlockLength);
2544 lilv_node_free(bufz_fixedBlockLength);
2545 lilv_node_free(bufz_powerOf2BlockLength);
2547 lilv_node_free(lv2_noSampleAccurateCtrl);
2548 lilv_node_free(patch_Message);
2549 lilv_node_free(patch_writable);
2550 lilv_node_free(units_hz);
2551 lilv_node_free(units_midiNote);
2552 lilv_node_free(units_db);
2553 lilv_node_free(units_unit);
2554 lilv_node_free(units_render);
2555 lilv_node_free(ui_externalkx);
2556 lilv_node_free(ui_external);
2557 lilv_node_free(ui_GtkUI);
2558 lilv_node_free(time_Position);
2559 lilv_node_free(rsz_minimumSize);
2560 lilv_node_free(rdfs_comment);
2561 lilv_node_free(rdfs_label);
2562 lilv_node_free(rdfs_range);
2563 lilv_node_free(midi_MidiEvent);
2564 lilv_node_free(lv2_enumeration);
2565 lilv_node_free(lv2_freewheeling);
2566 lilv_node_free(lv2_toggled);
2567 lilv_node_free(lv2_sampleRate);
2568 lilv_node_free(lv2_reportsLatency);
2569 lilv_node_free(lv2_integer);
2570 lilv_node_free(lv2_inPlaceBroken);
2571 lilv_node_free(lv2_OutputPort);
2572 lilv_node_free(lv2_InputPort);
2573 lilv_node_free(lv2_ControlPort);
2574 lilv_node_free(lv2_AudioPort);
2575 lilv_node_free(ext_notOnGUI);
2576 lilv_node_free(ext_logarithmic);
2577 lilv_node_free(ev_EventPort);
2578 lilv_node_free(atom_supports);
2579 lilv_node_free(atom_eventTransfer);
2580 lilv_node_free(atom_bufferType);
2581 lilv_node_free(atom_Sequence);
2582 lilv_node_free(atom_Chunk);
2583 lilv_node_free(atom_AtomPort);
2584 lilv_world_free(world);
2589 LV2World::load_bundled_plugins(bool verbose)
2591 if (!_bundle_checked) {
2593 cout << "Scanning folders for bundled LV2s: " << ARDOUR::lv2_bundled_search_path().to_string() << endl;
2596 vector<string> plugin_objects;
2597 find_paths_matching_filter (plugin_objects, ARDOUR::lv2_bundled_search_path(), lv2_filter, 0, true, true, true);
2598 for ( vector<string>::iterator x = plugin_objects.begin(); x != plugin_objects.end (); ++x) {
2599 #ifdef PLATFORM_WINDOWS
2600 string uri = "file:///" + *x + "/";
2602 string uri = "file://" + *x + "/";
2604 LilvNode *node = lilv_new_uri(world, uri.c_str());
2605 lilv_world_load_bundle(world, node);
2606 lilv_node_free(node);
2609 lilv_world_load_all(world);
2610 _bundle_checked = true;
2614 LV2PluginInfo::LV2PluginInfo (const char* plugin_uri)
2617 _plugin_uri = strdup(plugin_uri);
2620 LV2PluginInfo::~LV2PluginInfo()
2627 LV2PluginInfo::load(Session& session)
2631 const LilvPlugins* plugins = lilv_world_get_all_plugins(_world.world);
2632 LilvNode* uri = lilv_new_uri(_world.world, _plugin_uri);
2633 if (!uri) { throw failed_constructor(); }
2634 const LilvPlugin* lp = lilv_plugins_get_by_uri(plugins, uri);
2635 if (!lp) { throw failed_constructor(); }
2636 plugin.reset(new LV2Plugin(session.engine(), session, lp, session.frame_rate()));
2637 lilv_node_free(uri);
2638 plugin->set_info(PluginInfoPtr(shared_from_this ()));
2640 } catch (failed_constructor& err) {
2641 return PluginPtr((Plugin*)0);
2647 std::vector<Plugin::PresetRecord>
2648 LV2PluginInfo::get_presets (bool /*user_only*/) const
2650 std::vector<Plugin::PresetRecord> p;
2651 #ifndef NO_PLUGIN_STATE
2652 const LilvPlugin* lp = NULL;
2655 const LilvPlugins* plugins = lilv_world_get_all_plugins(_world.world);
2656 LilvNode* uri = lilv_new_uri(_world.world, _plugin_uri);
2657 if (!uri) { throw failed_constructor(); }
2658 lp = lilv_plugins_get_by_uri(plugins, uri);
2659 if (!lp) { throw failed_constructor(); }
2660 lilv_node_free(uri);
2661 } catch (failed_constructor& err) {
2665 // see LV2Plugin::find_presets
2666 LilvNode* lv2_appliesTo = lilv_new_uri(_world.world, LV2_CORE__appliesTo);
2667 LilvNode* pset_Preset = lilv_new_uri(_world.world, LV2_PRESETS__Preset);
2668 LilvNode* rdfs_label = lilv_new_uri(_world.world, LILV_NS_RDFS "label");
2670 LilvNodes* presets = lilv_plugin_get_related(lp, pset_Preset);
2671 LILV_FOREACH(nodes, i, presets) {
2672 const LilvNode* preset = lilv_nodes_get(presets, i);
2673 lilv_world_load_resource(_world.world, preset);
2674 LilvNode* name = get_value(_world.world, preset, rdfs_label);
2675 bool userpreset = true; // TODO
2677 p.push_back (Plugin::PresetRecord (lilv_node_as_string(preset), lilv_node_as_string(name), userpreset));
2678 lilv_node_free(name);
2681 lilv_nodes_free(presets);
2682 lilv_node_free(rdfs_label);
2683 lilv_node_free(pset_Preset);
2684 lilv_node_free(lv2_appliesTo);
2690 LV2PluginInfo::in_category (const std::string &c) const
2692 // TODO use untranslated lilv_plugin_get_class()
2693 // match gtk2_ardour/plugin_selector.cc
2694 if (category == c) {
2701 LV2PluginInfo::is_instrument () const
2703 if (category == "Instrument") {
2707 /* until we make sure that category remains untranslated in the lv2.ttl spec
2708 * and until most instruments also classify themselves as such, there's a 2nd check:
2710 if (n_inputs.n_midi() > 0 && n_inputs.n_audio() == 0 && n_outputs.n_audio() > 0) {
2718 LV2PluginInfo::discover()
2721 world.load_bundled_plugins();
2722 _world.load_bundled_plugins(true);
2724 PluginInfoList* plugs = new PluginInfoList;
2725 const LilvPlugins* plugins = lilv_world_get_all_plugins(world.world);
2727 LILV_FOREACH(plugins, i, plugins) {
2728 const LilvPlugin* p = lilv_plugins_get(plugins, i);
2729 const LilvNode* pun = lilv_plugin_get_uri(p);
2731 LV2PluginInfoPtr info(new LV2PluginInfo(lilv_node_as_string(pun)));
2733 LilvNode* name = lilv_plugin_get_name(p);
2734 if (!name || !lilv_plugin_get_port_by_index(p, 0)) {
2735 warning << "Ignoring invalid LV2 plugin "
2736 << lilv_node_as_string(lilv_plugin_get_uri(p))
2741 if (lilv_plugin_has_feature(p, world.lv2_inPlaceBroken)) {
2742 warning << string_compose(
2743 _("Ignoring LV2 plugin \"%1\" since it cannot do inplace processing."),
2744 lilv_node_as_string(name)) << endmsg;
2745 lilv_node_free(name);
2749 #ifdef HAVE_LV2_1_2_0
2750 LilvNodes *required_features = lilv_plugin_get_required_features (p);
2751 if (lilv_nodes_contains (required_features, world.bufz_powerOf2BlockLength) ||
2752 lilv_nodes_contains (required_features, world.bufz_fixedBlockLength)
2754 warning << string_compose(
2755 _("Ignoring LV2 plugin \"%1\" because its buffer-size requirements cannot be satisfied."),
2756 lilv_node_as_string(name)) << endmsg;
2757 lilv_nodes_free(required_features);
2758 lilv_node_free(name);
2761 lilv_nodes_free(required_features);
2766 info->name = string(lilv_node_as_string(name));
2767 lilv_node_free(name);
2768 ARDOUR::PluginScanMessage(_("LV2"), info->name, false);
2770 const LilvPluginClass* pclass = lilv_plugin_get_class(p);
2771 const LilvNode* label = lilv_plugin_class_get_label(pclass);
2772 info->category = lilv_node_as_string(label);
2774 LilvNode* author_name = lilv_plugin_get_author_name(p);
2775 info->creator = author_name ? string(lilv_node_as_string(author_name)) : "Unknown";
2776 lilv_node_free(author_name);
2778 info->path = "/NOPATH"; // Meaningless for LV2
2780 /* count atom-event-ports that feature
2781 * atom:supports <http://lv2plug.in/ns/ext/midi#MidiEvent>
2783 * TODO: nicely ask drobilla to make a lilv_ call for that
2785 int count_midi_out = 0;
2786 int count_midi_in = 0;
2787 for (uint32_t i = 0; i < lilv_plugin_get_num_ports(p); ++i) {
2788 const LilvPort* port = lilv_plugin_get_port_by_index(p, i);
2789 if (lilv_port_is_a(p, port, world.atom_AtomPort)) {
2790 LilvNodes* buffer_types = lilv_port_get_value(
2791 p, port, world.atom_bufferType);
2792 LilvNodes* atom_supports = lilv_port_get_value(
2793 p, port, world.atom_supports);
2795 if (lilv_nodes_contains(buffer_types, world.atom_Sequence)
2796 && lilv_nodes_contains(atom_supports, world.midi_MidiEvent)) {
2797 if (lilv_port_is_a(p, port, world.lv2_InputPort)) {
2800 if (lilv_port_is_a(p, port, world.lv2_OutputPort)) {
2804 lilv_nodes_free(buffer_types);
2805 lilv_nodes_free(atom_supports);
2809 info->n_inputs.set_audio(
2810 lilv_plugin_get_num_ports_of_class(
2811 p, world.lv2_InputPort, world.lv2_AudioPort, NULL));
2812 info->n_inputs.set_midi(
2813 lilv_plugin_get_num_ports_of_class(
2814 p, world.lv2_InputPort, world.ev_EventPort, NULL)
2817 info->n_outputs.set_audio(
2818 lilv_plugin_get_num_ports_of_class(
2819 p, world.lv2_OutputPort, world.lv2_AudioPort, NULL));
2820 info->n_outputs.set_midi(
2821 lilv_plugin_get_num_ports_of_class(
2822 p, world.lv2_OutputPort, world.ev_EventPort, NULL)
2825 info->unique_id = lilv_node_as_uri(lilv_plugin_get_uri(p));
2826 info->index = 0; // Meaningless for LV2
2828 plugs->push_back(info);