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/template_utils.h"
48 #include "ardour/tempo.h"
49 #include "ardour/types.h"
50 #include "ardour/utils.h"
51 #include "ardour/worker.h"
52 #include "ardour/search_paths.h"
57 #include <lilv/lilv.h>
59 #include "lv2/lv2plug.in/ns/ext/atom/atom.h"
60 #include "lv2/lv2plug.in/ns/ext/atom/forge.h"
61 #include "lv2/lv2plug.in/ns/ext/log/log.h"
62 #include "lv2/lv2plug.in/ns/ext/midi/midi.h"
63 #include "lv2/lv2plug.in/ns/ext/port-props/port-props.h"
64 #include "lv2/lv2plug.in/ns/ext/presets/presets.h"
65 #include "lv2/lv2plug.in/ns/ext/state/state.h"
66 #include "lv2/lv2plug.in/ns/ext/time/time.h"
67 #include "lv2/lv2plug.in/ns/ext/worker/worker.h"
68 #include "lv2/lv2plug.in/ns/ext/resize-port/resize-port.h"
69 #include "lv2/lv2plug.in/ns/extensions/ui/ui.h"
70 #include "lv2/lv2plug.in/ns/extensions/units/units.h"
71 #include "lv2/lv2plug.in/ns/ext/patch/patch.h"
73 #include "lv2/lv2plug.in/ns/ext/buf-size/buf-size.h"
74 #include "lv2/lv2plug.in/ns/ext/options/options.h"
77 #include "lv2_evbuf.h"
80 #include <suil/suil.h>
83 // Compatibility for old LV2
84 #ifndef LV2_ATOM_CONTENTS_CONST
85 #define LV2_ATOM_CONTENTS_CONST(type, atom) \
86 ((const void*)((const uint8_t*)(atom) + sizeof(type)))
88 #ifndef LV2_ATOM_BODY_CONST
89 #define LV2_ATOM_BODY_CONST(atom) LV2_ATOM_CONTENTS_CONST(LV2_Atom, atom)
91 #ifndef LV2_PATCH__property
92 #define LV2_PATCH__property LV2_PATCH_PREFIX "property"
94 #ifndef LV2_PATCH__value
95 #define LV2_PATCH__value LV2_PATCH_PREFIX "value"
97 #ifndef LV2_PATCH__writable
98 #define LV2_PATCH__writable LV2_PATCH_PREFIX "writable"
101 /** The number of MIDI buffers that will fit in a UI/worker comm buffer.
102 This needs to be roughly the number of cycles the UI will get around to
103 actually processing the traffic. Lower values are flakier but save memory.
105 static const size_t NBUFS = 4;
108 using namespace ARDOUR;
111 class LV2World : boost::noncopyable {
116 void load_bundled_plugins(bool verbose=false);
120 LilvNode* atom_AtomPort;
121 LilvNode* atom_Chunk;
122 LilvNode* atom_Sequence;
123 LilvNode* atom_bufferType;
124 LilvNode* atom_eventTransfer;
125 LilvNode* atom_supports;
126 LilvNode* ev_EventPort;
127 LilvNode* ext_logarithmic;
128 LilvNode* ext_notOnGUI;
129 LilvNode* lv2_AudioPort;
130 LilvNode* lv2_ControlPort;
131 LilvNode* lv2_InputPort;
132 LilvNode* lv2_OutputPort;
133 LilvNode* lv2_enumeration;
134 LilvNode* lv2_freewheeling;
135 LilvNode* lv2_inPlaceBroken;
136 LilvNode* lv2_integer;
137 LilvNode* lv2_default;
138 LilvNode* lv2_minimum;
139 LilvNode* lv2_maximum;
140 LilvNode* lv2_reportsLatency;
141 LilvNode* lv2_sampleRate;
142 LilvNode* lv2_toggled;
143 LilvNode* midi_MidiEvent;
144 LilvNode* rdfs_comment;
145 LilvNode* rdfs_label;
146 LilvNode* rdfs_range;
147 LilvNode* rsz_minimumSize;
148 LilvNode* time_Position;
150 LilvNode* ui_external;
151 LilvNode* ui_externalkx;
154 LilvNode* units_unit;
155 LilvNode* units_render;
156 LilvNode* units_midiNote;
157 LilvNode* patch_writable;
158 LilvNode* patch_Message;
159 LilvNode* lv2_noSampleAccurateCtrl;
160 #ifdef HAVE_LV2_1_2_0
161 LilvNode* bufz_powerOf2BlockLength;
162 LilvNode* bufz_fixedBlockLength;
163 LilvNode* bufz_nominalBlockLength;
167 bool _bundle_checked;
170 static LV2World _world;
172 /* worker extension */
174 /** Called by the plugin to schedule non-RT work. */
175 static LV2_Worker_Status
176 work_schedule(LV2_Worker_Schedule_Handle handle,
180 LV2Plugin* plugin = (LV2Plugin*)handle;
181 if (plugin->session().engine().freewheeling()) {
182 // Freewheeling, do the work immediately in this (audio) thread
183 return (LV2_Worker_Status)plugin->work(size, data);
185 // Enqueue message for the worker thread
186 return plugin->worker()->schedule(size, data) ?
187 LV2_WORKER_SUCCESS : LV2_WORKER_ERR_UNKNOWN;
191 /** Called by the plugin to respond to non-RT work. */
192 static LV2_Worker_Status
193 work_respond(LV2_Worker_Respond_Handle handle,
197 LV2Plugin* plugin = (LV2Plugin*)handle;
198 if (plugin->session().engine().freewheeling()) {
199 // Freewheeling, respond immediately in this (audio) thread
200 return (LV2_Worker_Status)plugin->work_response(size, data);
202 // Enqueue response for the worker
203 return plugin->worker()->respond(size, data) ?
204 LV2_WORKER_SUCCESS : LV2_WORKER_ERR_UNKNOWN;
211 log_vprintf(LV2_Log_Handle /*handle*/,
217 const int ret = g_vasprintf(&str, fmt, args);
218 if (type == URIMap::instance().urids.log_Error) {
219 error << str << endmsg;
220 } else if (type == URIMap::instance().urids.log_Warning) {
221 warning << str << endmsg;
222 } else if (type == URIMap::instance().urids.log_Note) {
223 info << str << endmsg;
225 // TODO: Toggleable log:Trace message support
230 log_printf(LV2_Log_Handle handle,
232 const char* fmt, ...)
236 const int ret = log_vprintf(handle, type, fmt, args);
241 struct LV2Plugin::Impl {
242 Impl() : plugin(0), ui(0), ui_type(0), name(0), author(0), instance(0)
244 #ifdef HAVE_LV2_1_2_0
249 #ifdef HAVE_LV2_1_2_0
254 /** Find the LV2 input port with the given designation.
255 * If found, bufptrs[port_index] will be set to bufptr.
257 const LilvPort* designated_input (const char* uri, void** bufptrs[], void** bufptr);
259 const LilvPlugin* plugin;
261 const LilvNode* ui_type;
264 LilvInstance* instance;
265 const LV2_Worker_Interface* work_iface;
266 #ifdef HAVE_LV2_1_2_0
267 const LV2_Options_Interface* opts_iface;
270 LV2_Atom_Forge forge;
271 LV2_Atom_Forge ui_forge;
272 int32_t block_length;
273 #ifdef HAVE_LV2_1_2_0
274 LV2_Options_Option* options;
278 LV2Plugin::LV2Plugin (AudioEngine& engine,
280 const void* c_plugin,
282 : Plugin (engine, session)
288 , _patch_port_in_index((uint32_t)-1)
289 , _patch_port_out_index((uint32_t)-1)
290 , _uri_map(URIMap::instance())
291 , _no_sample_accurate_ctrl (false)
293 init(c_plugin, rate);
296 LV2Plugin::LV2Plugin (const LV2Plugin& other)
302 , _insert_id(other._insert_id)
303 , _patch_port_in_index((uint32_t)-1)
304 , _patch_port_out_index((uint32_t)-1)
305 , _uri_map(URIMap::instance())
306 , _no_sample_accurate_ctrl (false)
308 init(other._impl->plugin, other._sample_rate);
310 for (uint32_t i = 0; i < parameter_count(); ++i) {
311 _control_data[i] = other._shadow_data[i];
312 _shadow_data[i] = other._shadow_data[i];
317 LV2Plugin::init(const void* c_plugin, framecnt_t rate)
319 DEBUG_TRACE(DEBUG::LV2, "init\n");
321 _impl->plugin = (const LilvPlugin*)c_plugin;
323 _impl->ui_type = NULL;
328 _atom_ev_buffers = 0;
330 _bpm_control_port = 0;
331 _freewheel_control_port = 0;
332 _latency_control_port = 0;
333 _next_cycle_start = std::numeric_limits<framepos_t>::max();
334 _next_cycle_speed = 1.0;
335 _seq_size = _engine.raw_buffer_size(DataType::MIDI);
337 _was_activated = false;
338 _has_state_interface = false;
339 _impl->block_length = _session.get_block_size();
341 _instance_access_feature.URI = "http://lv2plug.in/ns/ext/instance-access";
342 _data_access_feature.URI = "http://lv2plug.in/ns/ext/data-access";
343 _make_path_feature.URI = LV2_STATE__makePath;
344 _log_feature.URI = LV2_LOG__log;
345 _work_schedule_feature.URI = LV2_WORKER__schedule;
346 _work_schedule_feature.data = NULL;
347 _def_state_feature.URI = LV2_STATE_PREFIX "loadDefaultState"; // Post LV2-1.2.0
348 _def_state_feature.data = NULL;
350 const LilvPlugin* plugin = _impl->plugin;
352 LilvNode* state_iface_uri = lilv_new_uri(_world.world, LV2_STATE__interface);
353 LilvNode* state_uri = lilv_new_uri(_world.world, LV2_STATE_URI);
354 _has_state_interface =
355 // What plugins should have (lv2:extensionData state:Interface)
356 lilv_plugin_has_extension_data(plugin, state_iface_uri)
357 // What some outdated/incorrect ones have
358 || lilv_plugin_has_feature(plugin, state_uri);
359 lilv_node_free(state_uri);
360 lilv_node_free(state_iface_uri);
362 _features = (LV2_Feature**)calloc(11, sizeof(LV2_Feature*));
363 _features[0] = &_instance_access_feature;
364 _features[1] = &_data_access_feature;
365 _features[2] = &_make_path_feature;
366 _features[3] = _uri_map.uri_map_feature();
367 _features[4] = _uri_map.urid_map_feature();
368 _features[5] = _uri_map.urid_unmap_feature();
369 _features[6] = &_log_feature;
371 unsigned n_features = 7;
372 #ifdef HAVE_LV2_1_2_0
373 _features[n_features++] = &_def_state_feature;
376 lv2_atom_forge_init(&_impl->forge, _uri_map.urid_map());
377 lv2_atom_forge_init(&_impl->ui_forge, _uri_map.urid_map());
379 #ifdef HAVE_LV2_1_2_0
380 LV2_URID atom_Int = _uri_map.uri_to_id(LV2_ATOM__Int);
381 static const int32_t _min_block_length = 1; // may happen during split-cycles
382 static const int32_t _max_block_length = 8192; // max possible (with all engines and during export)
383 /* Consider updating max-block-size whenever the buffersize changes.
384 * It requires re-instantiating the plugin (which is a non-realtime operation),
385 * so it should be done lightly and only for plugins that require it.
387 * given that the block-size can change at any time (split-cycles) ardour currently
388 * does not support plugins that require bufz_fixedBlockLength.
390 LV2_Options_Option options[] = {
391 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id(LV2_BUF_SIZE__minBlockLength),
392 sizeof(int32_t), atom_Int, &_min_block_length },
393 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id(LV2_BUF_SIZE__maxBlockLength),
394 sizeof(int32_t), atom_Int, &_max_block_length },
395 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id(LV2_BUF_SIZE__sequenceSize),
396 sizeof(int32_t), atom_Int, &_seq_size },
397 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id("http://lv2plug.in/ns/ext/buf-size#nominalBlockLength"),
398 sizeof(int32_t), atom_Int, &_impl->block_length },
399 { LV2_OPTIONS_INSTANCE, 0, 0, 0, 0, NULL }
402 _impl->options = (LV2_Options_Option*) malloc (sizeof (options));
403 memcpy ((void*) _impl->options, (void*) options, sizeof (options));
405 _options_feature.URI = LV2_OPTIONS__options;
406 _options_feature.data = _impl->options;
407 _features[n_features++] = &_options_feature;
410 LV2_State_Make_Path* make_path = (LV2_State_Make_Path*)malloc(
411 sizeof(LV2_State_Make_Path));
412 make_path->handle = this;
413 make_path->path = &lv2_state_make_path;
414 _make_path_feature.data = make_path;
416 LV2_Log_Log* log = (LV2_Log_Log*)malloc(sizeof(LV2_Log_Log));
418 log->printf = &log_printf;
419 log->vprintf = &log_vprintf;
420 _log_feature.data = log;
422 LilvNode* worker_schedule = lilv_new_uri(_world.world, LV2_WORKER__schedule);
423 if (lilv_plugin_has_feature(plugin, worker_schedule)) {
424 LV2_Worker_Schedule* schedule = (LV2_Worker_Schedule*)malloc(
425 sizeof(LV2_Worker_Schedule));
426 size_t buf_size = _session.engine().raw_buffer_size(DataType::MIDI) * NBUFS;
427 _worker = new Worker(this, buf_size);
428 schedule->handle = this;
429 schedule->schedule_work = work_schedule;
430 _work_schedule_feature.data = schedule;
431 _features[n_features++] = &_work_schedule_feature;
433 lilv_node_free(worker_schedule);
435 _impl->instance = lilv_plugin_instantiate(plugin, rate, _features);
436 _impl->name = lilv_plugin_get_name(plugin);
437 _impl->author = lilv_plugin_get_author_name(plugin);
439 if (_impl->instance == 0) {
440 error << _("LV2: Failed to instantiate plugin ") << uri() << endmsg;
441 throw failed_constructor();
444 _instance_access_feature.data = (void*)_impl->instance->lv2_handle;
445 _data_access_extension_data.extension_data = _impl->instance->lv2_descriptor->extension_data;
446 _data_access_feature.data = &_data_access_extension_data;
448 LilvNode* worker_iface_uri = lilv_new_uri(_world.world, LV2_WORKER__interface);
449 if (lilv_plugin_has_extension_data(plugin, worker_iface_uri)) {
450 _impl->work_iface = (const LV2_Worker_Interface*)extension_data(
451 LV2_WORKER__interface);
453 lilv_node_free(worker_iface_uri);
456 #ifdef HAVE_LV2_1_2_0
457 LilvNode* options_iface_uri = lilv_new_uri(_world.world, LV2_OPTIONS__interface);
458 if (lilv_plugin_has_extension_data(plugin, options_iface_uri)) {
459 _impl->opts_iface = (const LV2_Options_Interface*)extension_data(
460 LV2_OPTIONS__interface);
462 lilv_node_free(options_iface_uri);
465 if (lilv_plugin_has_feature(plugin, _world.lv2_inPlaceBroken)) {
466 error << string_compose(
467 _("LV2: \"%1\" cannot be used, since it cannot do inplace processing."),
468 lilv_node_as_string(_impl->name)) << endmsg;
469 lilv_node_free(_impl->name);
470 lilv_node_free(_impl->author);
471 throw failed_constructor();
474 #ifdef HAVE_LV2_1_2_0
475 LilvNodes *required_features = lilv_plugin_get_required_features (plugin);
476 if (lilv_nodes_contains (required_features, _world.bufz_powerOf2BlockLength) ||
477 lilv_nodes_contains (required_features, _world.bufz_fixedBlockLength)
479 error << string_compose(
480 _("LV2: \"%1\" buffer-size requirements cannot be satisfied."),
481 lilv_node_as_string(_impl->name)) << endmsg;
482 lilv_node_free(_impl->name);
483 lilv_node_free(_impl->author);
484 lilv_nodes_free(required_features);
485 throw failed_constructor();
487 lilv_nodes_free(required_features);
489 LilvNodes* optional_features = lilv_plugin_get_optional_features (plugin);
490 if (lilv_nodes_contains (optional_features, _world.lv2_noSampleAccurateCtrl)) {
491 _no_sample_accurate_ctrl = true;
493 lilv_nodes_free(optional_features);
496 #ifdef HAVE_LILV_0_16_0
497 // Load default state
498 LilvState* state = lilv_state_new_from_world(
499 _world.world, _uri_map.urid_map(), lilv_plugin_get_uri(_impl->plugin));
500 if (state && _has_state_interface) {
501 lilv_state_restore(state, _impl->instance, NULL, NULL, 0, NULL);
503 lilv_state_free(state);
508 const uint32_t num_ports = this->num_ports();
509 for (uint32_t i = 0; i < num_ports; ++i) {
510 const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, i);
512 size_t minimumSize = 0;
514 if (lilv_port_is_a(_impl->plugin, port, _world.lv2_OutputPort)) {
515 flags |= PORT_OUTPUT;
516 } else if (lilv_port_is_a(_impl->plugin, port, _world.lv2_InputPort)) {
519 error << string_compose(
520 "LV2: \"%1\" port %2 is neither input nor output",
521 lilv_node_as_string(_impl->name), i) << endmsg;
522 throw failed_constructor();
525 if (lilv_port_is_a(_impl->plugin, port, _world.lv2_ControlPort)) {
526 flags |= PORT_CONTROL;
527 } else if (lilv_port_is_a(_impl->plugin, port, _world.lv2_AudioPort)) {
529 } else if (lilv_port_is_a(_impl->plugin, port, _world.ev_EventPort)) {
531 flags |= PORT_MIDI; // We assume old event API ports are for MIDI
532 } else if (lilv_port_is_a(_impl->plugin, port, _world.atom_AtomPort)) {
533 LilvNodes* buffer_types = lilv_port_get_value(
534 _impl->plugin, port, _world.atom_bufferType);
535 LilvNodes* atom_supports = lilv_port_get_value(
536 _impl->plugin, port, _world.atom_supports);
538 if (lilv_nodes_contains(buffer_types, _world.atom_Sequence)) {
539 flags |= PORT_SEQUENCE;
540 if (lilv_nodes_contains(atom_supports, _world.midi_MidiEvent)) {
543 if (lilv_nodes_contains(atom_supports, _world.time_Position)) {
544 flags |= PORT_POSITION;
546 if (lilv_nodes_contains(atom_supports, _world.patch_Message)) {
547 flags |= PORT_PATCHMSG;
548 if (flags & PORT_INPUT) {
549 _patch_port_in_index = i;
551 _patch_port_out_index = i;
555 LilvNodes* min_size_v = lilv_port_get_value(_impl->plugin, port, _world.rsz_minimumSize);
556 LilvNode* min_size = min_size_v ? lilv_nodes_get_first(min_size_v) : NULL;
557 if (min_size && lilv_node_is_int(min_size)) {
558 minimumSize = lilv_node_as_int(min_size);
560 lilv_nodes_free(min_size_v);
561 lilv_nodes_free(buffer_types);
562 lilv_nodes_free(atom_supports);
564 error << string_compose(
565 "LV2: \"%1\" port %2 has no known data type",
566 lilv_node_as_string(_impl->name), i) << endmsg;
567 throw failed_constructor();
570 _port_flags.push_back(flags);
571 _port_minimumSize.push_back(minimumSize);
574 _control_data = new float[num_ports];
575 _shadow_data = new float[num_ports];
576 _defaults = new float[num_ports];
577 _ev_buffers = new LV2_Evbuf*[num_ports];
578 memset(_ev_buffers, 0, sizeof(LV2_Evbuf*) * num_ports);
580 const bool latent = lilv_plugin_has_latency(plugin);
581 const uint32_t latency_index = (latent)
582 ? lilv_plugin_get_latency_port_index(plugin)
585 // Build an array of pointers to special parameter buffers
586 void*** params = new void**[num_ports];
587 for (uint32_t i = 0; i < num_ports; ++i) {
590 _impl->designated_input (LV2_TIME__beatsPerMinute, params, (void**)&_bpm_control_port);
591 _impl->designated_input (LV2_CORE__freeWheeling, params, (void**)&_freewheel_control_port);
593 for (uint32_t i = 0; i < num_ports; ++i) {
594 const LilvPort* port = lilv_plugin_get_port_by_index(plugin, i);
595 const LilvNode* sym = lilv_port_get_symbol(plugin, port);
597 // Store index in map so we can look up index by symbol
598 _port_indices.insert(std::make_pair(lilv_node_as_string(sym), i));
600 // Get range and default value if applicable
601 if (parameter_is_control(i)) {
603 lilv_port_get_range(plugin, port, &def, NULL, NULL);
604 _defaults[i] = def ? lilv_node_as_float(def) : 0.0f;
605 if (lilv_port_has_property (plugin, port, _world.lv2_sampleRate)) {
606 _defaults[i] *= _session.frame_rate ();
610 lilv_instance_connect_port(_impl->instance, i, &_control_data[i]);
612 if (latent && i == latency_index) {
613 _latency_control_port = &_control_data[i];
614 *_latency_control_port = 0;
617 if (parameter_is_input(i)) {
618 _shadow_data[i] = default_value(i);
620 *params[i] = (void*)&_shadow_data[i];
630 LilvUIs* uis = lilv_plugin_get_uis(plugin);
631 if (lilv_uis_size(uis) > 0) {
633 // Look for embeddable UI
634 LILV_FOREACH(uis, u, uis) {
635 const LilvUI* this_ui = lilv_uis_get(uis, u);
636 const LilvNode* this_ui_type = NULL;
637 if (lilv_ui_is_supported(this_ui,
641 // TODO: Multiple UI support
643 _impl->ui_type = this_ui_type;
648 // Look for Gtk native UI
649 LILV_FOREACH(uis, i, uis) {
650 const LilvUI* ui = lilv_uis_get(uis, i);
651 if (lilv_ui_is_a(ui, _world.ui_GtkUI)) {
653 _impl->ui_type = _world.ui_GtkUI;
659 // If Gtk UI is not available, try to find external UI
661 LILV_FOREACH(uis, i, uis) {
662 const LilvUI* ui = lilv_uis_get(uis, i);
663 if (lilv_ui_is_a(ui, _world.ui_externalkx)) {
665 _impl->ui_type = _world.ui_external;
668 if (lilv_ui_is_a(ui, _world.ui_external)) {
670 _impl->ui_type = _world.ui_external;
676 load_supported_properties(_property_descriptors);
677 allocate_atom_event_buffers();
678 latency_compute_run();
682 LV2Plugin::set_block_size (pframes_t nframes)
684 #ifdef HAVE_LV2_1_2_0
685 if (_impl->opts_iface) {
686 LV2_URID atom_Int = _uri_map.uri_to_id(LV2_ATOM__Int);
687 _impl->block_length = nframes;
688 LV2_Options_Option block_size_option = {
689 LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id ("http://lv2plug.in/ns/ext/buf-size#nominalBlockLength"),
690 sizeof(int32_t), atom_Int, (void*)&_impl->block_length
692 _impl->opts_iface->set (_impl->instance->lv2_handle, &block_size_option);
699 LV2Plugin::requires_fixed_sized_buffers () const
701 /* This controls if Ardour will split the plugin's run()
702 * on automation events in order to pass sample-accurate automation
703 * via standard control-ports.
705 * When returning true Ardour will *not* sub-divide the process-cycle.
706 * Automation events that happen between cycle-start and cycle-end will be
707 * ignored (ctrl values are interpolated to cycle-start).
708 * NB. Atom Sequences are still sample accurate.
710 * Note: This does not guarantee a fixed block-size.
711 * e.g The process cycle may be split when looping, also
712 * the period-size may change any time: see set_block_size()
714 return _no_sample_accurate_ctrl;
717 LV2Plugin::~LV2Plugin ()
719 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 destroy\n", name()));
724 lilv_instance_free(_impl->instance);
725 lilv_state_free(_impl->state);
726 lilv_node_free(_impl->name);
727 lilv_node_free(_impl->author);
728 #ifdef HAVE_LV2_1_2_0
729 free(_impl->options);
733 free(_make_path_feature.data);
734 free(_work_schedule_feature.data);
740 if (_atom_ev_buffers) {
741 LV2_Evbuf** b = _atom_ev_buffers;
746 free(_atom_ev_buffers);
749 delete [] _control_data;
750 delete [] _shadow_data;
752 delete [] _ev_buffers;
756 LV2Plugin::is_external_ui() const
761 return lilv_ui_is_a(_impl->ui, _world.ui_external) || lilv_ui_is_a(_impl->ui, _world.ui_externalkx);
765 LV2Plugin::is_external_kx() const
770 return lilv_ui_is_a(_impl->ui, _world.ui_externalkx);
774 LV2Plugin::ui_is_resizable () const
776 const LilvNode* s = lilv_ui_get_uri(_impl->ui);
777 LilvNode* p = lilv_new_uri(_world.world, LV2_CORE__optionalFeature);
778 LilvNode* fs = lilv_new_uri(_world.world, LV2_UI__fixedSize);
779 LilvNode* nrs = lilv_new_uri(_world.world, LV2_UI__noUserResize);
781 LilvNodes* fs_matches = lilv_world_find_nodes(_world.world, s, p, fs);
782 LilvNodes* nrs_matches = lilv_world_find_nodes(_world.world, s, p, nrs);
784 lilv_nodes_free(nrs_matches);
785 lilv_nodes_free(fs_matches);
790 return !fs_matches && !nrs_matches;
794 LV2Plugin::unique_id() const
796 return lilv_node_as_uri(lilv_plugin_get_uri(_impl->plugin));
800 LV2Plugin::uri() const
802 return lilv_node_as_uri(lilv_plugin_get_uri(_impl->plugin));
806 LV2Plugin::label() const
808 return lilv_node_as_string(_impl->name);
812 LV2Plugin::name() const
814 return lilv_node_as_string(_impl->name);
818 LV2Plugin::maker() const
820 return _impl->author ? lilv_node_as_string (_impl->author) : "Unknown";
824 LV2Plugin::num_ports() const
826 return lilv_plugin_get_num_ports(_impl->plugin);
830 LV2Plugin::parameter_count() const
832 return lilv_plugin_get_num_ports(_impl->plugin);
836 LV2Plugin::default_value(uint32_t port)
838 return _defaults[port];
842 LV2Plugin::port_symbol(uint32_t index) const
844 const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, index);
846 error << name() << ": Invalid port index " << index << endmsg;
849 const LilvNode* sym = lilv_port_get_symbol(_impl->plugin, port);
850 return lilv_node_as_string(sym);
854 LV2Plugin::port_index (const char* symbol) const
856 const map<string, uint32_t>::const_iterator i = _port_indices.find(symbol);
857 if (i != _port_indices.end()) {
860 warning << string_compose(_("LV2: Unknown port %1"), symbol) << endmsg;
866 LV2Plugin::set_parameter(uint32_t which, float val)
868 DEBUG_TRACE(DEBUG::LV2, string_compose(
869 "%1 set parameter %2 to %3\n", name(), which, val));
871 if (which < lilv_plugin_get_num_ports(_impl->plugin)) {
872 if (get_parameter (which) == val) {
876 _shadow_data[which] = val;
878 warning << string_compose(
879 _("Illegal parameter number used with plugin \"%1\". "
880 "This is a bug in either %2 or the LV2 plugin <%3>"),
881 name(), PROGRAM_NAME, unique_id()) << endmsg;
884 Plugin::set_parameter(which, val);
888 LV2Plugin::get_parameter(uint32_t which) const
890 if (parameter_is_input(which)) {
891 return (float)_shadow_data[which];
893 return (float)_control_data[which];
899 LV2Plugin::get_docs() const
901 LilvNodes* comments = lilv_plugin_get_value(_impl->plugin, _world.rdfs_comment);
903 const std::string docs(lilv_node_as_string(lilv_nodes_get_first(comments)));
904 lilv_nodes_free(comments);
912 LV2Plugin::get_parameter_docs(uint32_t which) const
914 LilvNodes* comments = lilv_port_get_value(
916 lilv_plugin_get_port_by_index(_impl->plugin, which),
917 _world.rdfs_comment);
920 const std::string docs(lilv_node_as_string(lilv_nodes_get_first(comments)));
921 lilv_nodes_free(comments);
929 LV2Plugin::nth_parameter(uint32_t n, bool& ok) const
932 for (uint32_t c = 0, x = 0; x < lilv_plugin_get_num_ports(_impl->plugin); ++x) {
933 if (parameter_is_control(x)) {
945 LV2Plugin::extension_data(const char* uri) const
947 return lilv_instance_get_extension_data(_impl->instance, uri);
951 LV2Plugin::c_plugin()
953 return _impl->plugin;
959 return (const void*)_impl->ui;
963 LV2Plugin::c_ui_type()
965 return (const void*)_impl->ui_type;
968 /** Directory for all plugin state. */
970 LV2Plugin::plugin_dir() const
972 if (!_plugin_state_dir.empty ()){
973 return Glib::build_filename(_plugin_state_dir, _insert_id.to_s());
975 return Glib::build_filename(_session.plugins_dir(), _insert_id.to_s());
979 /** Directory for files created by the plugin (except during save). */
981 LV2Plugin::scratch_dir() const
983 return Glib::build_filename(plugin_dir(), "scratch");
986 /** Directory for snapshots of files in the scratch directory. */
988 LV2Plugin::file_dir() const
990 return Glib::build_filename(plugin_dir(), "files");
993 /** Directory to save state snapshot version @c num into. */
995 LV2Plugin::state_dir(unsigned num) const
997 return Glib::build_filename(plugin_dir(), string_compose("state%1", num));
1000 /** Implementation of state:makePath for files created at instantiation time.
1001 * Note this is not used for files created at save time (Lilv deals with that).
1004 LV2Plugin::lv2_state_make_path(LV2_State_Make_Path_Handle handle,
1007 LV2Plugin* me = (LV2Plugin*)handle;
1008 if (me->_insert_id == PBD::ID("0")) {
1009 warning << string_compose(
1010 "File path \"%1\" requested but LV2 %2 has no insert ID",
1011 path, me->name()) << endmsg;
1012 return g_strdup(path);
1015 const std::string abs_path = Glib::build_filename(me->scratch_dir(), path);
1016 const std::string dirname = Glib::path_get_dirname(abs_path);
1017 g_mkdir_with_parents(dirname.c_str(), 0744);
1019 DEBUG_TRACE(DEBUG::LV2, string_compose("new file path %1 => %2\n",
1022 return g_strndup(abs_path.c_str(), abs_path.length());
1026 LV2Plugin::add_state(XMLNode* root) const
1028 assert(_insert_id != PBD::ID("0"));
1032 LocaleGuard lg(X_("C"));
1034 for (uint32_t i = 0; i < parameter_count(); ++i) {
1035 if (parameter_is_input(i) && parameter_is_control(i)) {
1036 child = new XMLNode("Port");
1037 child->add_property("symbol", port_symbol(i));
1038 snprintf(buf, sizeof(buf), "%+f", _shadow_data[i]);
1039 child->add_property("value", string(buf));
1040 root->add_child_nocopy(*child);
1044 if (!_plugin_state_dir.empty()) {
1045 root->add_property("template-dir", _plugin_state_dir);
1048 if (_has_state_interface) {
1049 // Provisionally increment state version and create directory
1050 const std::string new_dir = state_dir(++_state_version);
1051 g_mkdir_with_parents(new_dir.c_str(), 0744);
1053 LilvState* state = lilv_state_new_from_instance(
1056 _uri_map.urid_map(),
1057 scratch_dir().c_str(),
1059 _session.externals_dir().c_str(),
1062 const_cast<LV2Plugin*>(this),
1066 if (!_impl->state || !lilv_state_equals(state, _impl->state)) {
1067 lilv_state_save(_world.world,
1068 _uri_map.urid_map(),
1069 _uri_map.urid_unmap(),
1075 lilv_state_free(_impl->state);
1076 _impl->state = state;
1078 // State is identical, decrement version and nuke directory
1079 lilv_state_free(state);
1080 PBD::remove_directory(new_dir);
1084 root->add_property("state-dir", string_compose("state%1", _state_version));
1088 // TODO: Once we can rely on lilv 0.16.0, lilv_world_get can replace this
1090 get_value(LilvWorld* world, const LilvNode* subject, const LilvNode* predicate)
1092 LilvNodes* vs = lilv_world_find_nodes(world, subject, predicate, NULL);
1094 LilvNode* node = lilv_node_duplicate(lilv_nodes_get_first(vs));
1095 lilv_nodes_free(vs);
1102 LV2Plugin::find_presets()
1104 LilvNode* lv2_appliesTo = lilv_new_uri(_world.world, LV2_CORE__appliesTo);
1105 LilvNode* pset_Preset = lilv_new_uri(_world.world, LV2_PRESETS__Preset);
1106 LilvNode* rdfs_label = lilv_new_uri(_world.world, LILV_NS_RDFS "label");
1108 LilvNodes* presets = lilv_plugin_get_related(_impl->plugin, pset_Preset);
1109 LILV_FOREACH(nodes, i, presets) {
1110 const LilvNode* preset = lilv_nodes_get(presets, i);
1111 lilv_world_load_resource(_world.world, preset);
1112 LilvNode* name = get_value(_world.world, preset, rdfs_label);
1114 _presets.insert(std::make_pair(lilv_node_as_string(preset),
1115 Plugin::PresetRecord(
1116 lilv_node_as_string(preset),
1117 lilv_node_as_string(name))));
1118 lilv_node_free(name);
1120 warning << string_compose(
1121 _("Plugin \"%1\" preset \"%2\" is missing a label\n"),
1122 lilv_node_as_string(lilv_plugin_get_uri(_impl->plugin)),
1123 lilv_node_as_string(preset)) << endmsg;
1126 lilv_nodes_free(presets);
1128 lilv_node_free(rdfs_label);
1129 lilv_node_free(pset_Preset);
1130 lilv_node_free(lv2_appliesTo);
1134 set_port_value(const char* port_symbol,
1140 LV2Plugin* self = (LV2Plugin*)user_data;
1141 if (type != 0 && type != URIMap::instance().urids.atom_Float) {
1142 return; // TODO: Support non-float ports
1145 const uint32_t port_index = self->port_index(port_symbol);
1146 if (port_index != (uint32_t)-1) {
1147 self->set_parameter(port_index, *(const float*)value);
1152 LV2Plugin::load_preset(PresetRecord r)
1154 LilvWorld* world = _world.world;
1155 LilvNode* pset = lilv_new_uri(world, r.uri.c_str());
1156 LilvState* state = lilv_state_new_from_world(world, _uri_map.urid_map(), pset);
1159 lilv_state_restore(state, _impl->instance, set_port_value, this, 0, NULL);
1160 lilv_state_free(state);
1161 Plugin::load_preset(r);
1164 lilv_node_free(pset);
1169 ARDOUR::lv2plugin_get_port_value(const char* port_symbol,
1174 LV2Plugin *plugin = (LV2Plugin *) user_data;
1176 uint32_t index = plugin->port_index(port_symbol);
1177 if (index != (uint32_t) -1) {
1178 if (plugin->parameter_is_input(index) && plugin->parameter_is_control(index)) {
1180 *size = sizeof(float);
1181 *type = plugin->_uri_map.uri_to_id(LV2_ATOM__Float);
1182 value = &plugin->_shadow_data[index];
1194 LV2Plugin::do_save_preset(string name)
1196 LilvNode* plug_name = lilv_plugin_get_name(_impl->plugin);
1197 const string prefix = legalize_for_uri(lilv_node_as_string(plug_name));
1198 const string base_name = legalize_for_uri(name);
1199 const string file_name = base_name + ".ttl";
1200 const string bundle = Glib::build_filename(
1201 Glib::get_home_dir(),
1202 Glib::build_filename(".lv2", prefix + "_" + base_name + ".lv2"));
1204 #ifdef HAVE_LILV_0_21_3
1205 /* delete reference to old preset (if any) */
1206 const PresetRecord* r = preset_by_label(name);
1208 LilvNode* pset = lilv_new_uri (_world.world, r->uri.c_str());
1210 lilv_world_unload_resource (_world.world, pset);
1211 lilv_node_free(pset);
1216 LilvState* state = lilv_state_new_from_instance(
1219 _uri_map.urid_map(),
1220 scratch_dir().c_str(), // file_dir
1221 bundle.c_str(), // copy_dir
1222 bundle.c_str(), // link_dir
1223 bundle.c_str(), // save_dir
1224 lv2plugin_get_port_value, // get_value
1225 (void*)this, // user_data
1226 LV2_STATE_IS_POD|LV2_STATE_IS_PORTABLE, // flags
1227 _features // features
1230 lilv_state_set_label(state, name.c_str());
1232 _world.world, // world
1233 _uri_map.urid_map(), // map
1234 _uri_map.urid_unmap(), // unmap
1236 NULL, // uri (NULL = use file URI)
1237 bundle.c_str(), // dir
1238 file_name.c_str() // filename
1241 lilv_state_free(state);
1243 std::string uri = Glib::filename_to_uri(Glib::build_filename(bundle, file_name));
1244 LilvNode *node_bundle = lilv_new_uri(_world.world, Glib::filename_to_uri(Glib::build_filename(bundle, "/")).c_str());
1245 LilvNode *node_preset = lilv_new_uri(_world.world, uri.c_str());
1246 #ifdef HAVE_LILV_0_21_3
1247 lilv_world_unload_resource(_world.world, node_preset);
1248 lilv_world_unload_bundle(_world.world, node_bundle);
1250 lilv_world_load_bundle(_world.world, node_bundle);
1251 lilv_world_load_resource(_world.world, node_preset);
1252 lilv_node_free(node_bundle);
1253 lilv_node_free(node_preset);
1254 lilv_node_free(plug_name);
1259 LV2Plugin::do_remove_preset(string name)
1261 #ifdef HAVE_LILV_0_21_3
1262 /* Look up preset record by label (FIXME: ick, label as ID) */
1263 const PresetRecord* r = preset_by_label(name);
1268 /* Load a LilvState for the preset. */
1269 LilvWorld* world = _world.world;
1270 LilvNode* pset = lilv_new_uri(world, r->uri.c_str());
1271 LilvState* state = lilv_state_new_from_world(world, _uri_map.urid_map(), pset);
1273 lilv_node_free(pset);
1277 /* Unload preset from world. */
1278 lilv_world_unload_resource(world, pset);
1280 /* Delete it from the file system. This will remove the preset file and the entry
1281 from the manifest. If this results in an empty manifest (i.e. the
1282 preset is the only thing in the bundle), then the bundle is removed. */
1283 lilv_state_delete(world, state);
1285 lilv_state_free(state);
1286 lilv_node_free(pset);
1288 /* Without lilv_state_delete(), we could delete the preset file, but this
1289 would leave a broken bundle/manifest around, so the preset would still
1290 be visible, but broken. Naively deleting a bundle is too dangerous, so
1291 we simply do not support preset deletion with older Lilv */
1295 LV2Plugin::has_editor() const
1297 return _impl->ui != NULL;
1301 LV2Plugin::has_message_output() const
1303 for (uint32_t i = 0; i < num_ports(); ++i) {
1304 if ((_port_flags[i] & PORT_SEQUENCE) &&
1305 (_port_flags[i] & PORT_OUTPUT)) {
1313 LV2Plugin::write_to(RingBuffer<uint8_t>* dest,
1317 const uint8_t* body)
1319 const uint32_t buf_size = sizeof(UIMessage) + size;
1320 vector<uint8_t> buf(buf_size);
1322 UIMessage* msg = (UIMessage*)&buf[0];
1324 msg->protocol = protocol;
1326 memcpy(msg + 1, body, size);
1328 return (dest->write(&buf[0], buf_size) == buf_size);
1332 LV2Plugin::write_from_ui(uint32_t index,
1335 const uint8_t* body)
1338 size_t rbs = _session.engine().raw_buffer_size(DataType::MIDI) * NBUFS;
1339 /* buffer data communication from plugin UI to plugin instance.
1340 * this buffer needs to potentially hold
1341 * (port's minimumSize) * (audio-periods) / (UI-periods)
1344 * e.g 48kSPS / 128fpp -> audio-periods = 375 Hz
1345 * ui-periods = 25 Hz (SuperRapidScreenUpdate)
1346 * default minimumSize = 32K (see LV2Plugin::allocate_atom_event_buffers()
1348 * it is NOT safe to overflow (msg.size will be misinterpreted)
1350 uint32_t bufsiz = 32768;
1351 if (_atom_ev_buffers && _atom_ev_buffers[0]) {
1352 bufsiz = lv2_evbuf_get_capacity(_atom_ev_buffers[0]);
1354 rbs = max((size_t) bufsiz * 8, rbs);
1355 _from_ui = new RingBuffer<uint8_t>(rbs);
1358 if (!write_to(_from_ui, index, protocol, size, body)) {
1359 error << "Error writing from UI to plugin" << endmsg;
1366 LV2Plugin::write_to_ui(uint32_t index,
1369 const uint8_t* body)
1371 if (!write_to(_to_ui, index, protocol, size, body)) {
1372 error << "Error writing from plugin to UI" << endmsg;
1379 forge_variant(LV2_Atom_Forge* forge, const Variant& value)
1381 switch (value.type()) {
1382 case Variant::NOTHING:
1384 case Variant::BEATS:
1385 // No atom type for this, just forge a double
1386 lv2_atom_forge_double(forge, value.get_beats().to_double());
1389 lv2_atom_forge_bool(forge, value.get_bool());
1391 case Variant::DOUBLE:
1392 lv2_atom_forge_double(forge, value.get_double());
1394 case Variant::FLOAT:
1395 lv2_atom_forge_float(forge, value.get_float());
1398 lv2_atom_forge_int(forge, value.get_int());
1401 lv2_atom_forge_long(forge, value.get_long());
1404 lv2_atom_forge_path(
1405 forge, value.get_path().c_str(), value.get_path().size());
1407 case Variant::STRING:
1408 lv2_atom_forge_string(
1409 forge, value.get_string().c_str(), value.get_string().size());
1413 forge, value.get_uri().c_str(), value.get_uri().size());
1418 /** Get a variant type from a URI, return false iff no match found. */
1420 uri_to_variant_type(const std::string& uri, Variant::Type& type)
1422 if (uri == LV2_ATOM__Bool) {
1423 type = Variant::BOOL;
1424 } else if (uri == LV2_ATOM__Double) {
1425 type = Variant::DOUBLE;
1426 } else if (uri == LV2_ATOM__Float) {
1427 type = Variant::FLOAT;
1428 } else if (uri == LV2_ATOM__Int) {
1429 type = Variant::INT;
1430 } else if (uri == LV2_ATOM__Long) {
1431 type = Variant::LONG;
1432 } else if (uri == LV2_ATOM__Path) {
1433 type = Variant::PATH;
1434 } else if (uri == LV2_ATOM__String) {
1435 type = Variant::STRING;
1436 } else if (uri == LV2_ATOM__URI) {
1437 type = Variant::URI;
1445 LV2Plugin::set_property(uint32_t key, const Variant& value)
1447 if (_patch_port_in_index == (uint32_t)-1) {
1448 error << "LV2: set_property called with unset patch_port_in_index" << endmsg;
1450 } else if (value.type() == Variant::NOTHING) {
1451 error << "LV2: set_property called with void value" << endmsg;
1455 // Set up forge to write to temporary buffer on the stack
1456 LV2_Atom_Forge* forge = &_impl->ui_forge;
1457 LV2_Atom_Forge_Frame frame;
1458 uint8_t buf[PATH_MAX]; // Ought to be enough for anyone...
1460 lv2_atom_forge_set_buffer(forge, buf, sizeof(buf));
1462 // Serialize patch:Set message to set property
1463 #ifdef HAVE_LV2_1_10_0
1464 lv2_atom_forge_object(forge, &frame, 1, _uri_map.urids.patch_Set);
1465 lv2_atom_forge_key(forge, _uri_map.urids.patch_property);
1466 lv2_atom_forge_urid(forge, key);
1467 lv2_atom_forge_key(forge, _uri_map.urids.patch_value);
1469 lv2_atom_forge_blank(forge, &frame, 1, _uri_map.urids.patch_Set);
1470 lv2_atom_forge_property_head(forge, _uri_map.urids.patch_property, 0);
1471 lv2_atom_forge_urid(forge, key);
1472 lv2_atom_forge_property_head(forge, _uri_map.urids.patch_value, 0);
1475 forge_variant(forge, value);
1477 // Write message to UI=>Plugin ring
1478 const LV2_Atom* const atom = (const LV2_Atom*)buf;
1479 write_from_ui(_patch_port_in_index,
1480 _uri_map.urids.atom_eventTransfer,
1481 lv2_atom_total_size(atom),
1482 (const uint8_t*)atom);
1485 const ParameterDescriptor&
1486 LV2Plugin::get_property_descriptor(uint32_t id) const
1488 PropertyDescriptors::const_iterator p = _property_descriptors.find(id);
1489 if (p != _property_descriptors.end()) {
1492 return Plugin::get_property_descriptor(id);
1496 load_parameter_descriptor_units(LilvWorld* lworld, ParameterDescriptor& desc, const LilvNodes* units)
1498 if (lilv_nodes_contains(units, _world.units_midiNote)) {
1499 desc.unit = ParameterDescriptor::MIDI_NOTE;
1500 } else if (lilv_nodes_contains(units, _world.units_db)) {
1501 desc.unit = ParameterDescriptor::DB;
1502 } else if (lilv_nodes_contains(units, _world.units_hz)) {
1503 desc.unit = ParameterDescriptor::HZ;
1505 if (lilv_nodes_size(units) > 0) {
1506 const LilvNode* unit = lilv_nodes_get_first(units);
1507 LilvNode* render = get_value(lworld, unit, _world.units_render);
1509 desc.print_fmt = lilv_node_as_string(render);
1510 lilv_node_free(render);
1516 load_parameter_descriptor(LV2World& world,
1517 ParameterDescriptor& desc,
1518 Variant::Type datatype,
1519 const LilvNode* subject)
1521 LilvWorld* lworld = _world.world;
1522 LilvNode* label = get_value(lworld, subject, _world.rdfs_label);
1523 LilvNode* def = get_value(lworld, subject, _world.lv2_default);
1524 LilvNode* minimum = get_value(lworld, subject, _world.lv2_minimum);
1525 LilvNode* maximum = get_value(lworld, subject, _world.lv2_maximum);
1526 LilvNodes* units = lilv_world_find_nodes(lworld, subject, _world.units_unit, NULL);
1528 desc.label = lilv_node_as_string(label);
1530 if (def && lilv_node_is_float(def)) {
1531 desc.normal = lilv_node_as_float(def);
1533 if (minimum && lilv_node_is_float(minimum)) {
1534 desc.lower = lilv_node_as_float(minimum);
1536 if (maximum && lilv_node_is_float(maximum)) {
1537 desc.upper = lilv_node_as_float(maximum);
1539 load_parameter_descriptor_units(lworld, desc, units);
1540 desc.datatype = datatype;
1541 desc.toggled |= datatype == Variant::BOOL;
1542 desc.integer_step |= datatype == Variant::INT || datatype == Variant::LONG;
1543 desc.update_steps();
1545 lilv_nodes_free(units);
1546 lilv_node_free(label);
1547 lilv_node_free(def);
1548 lilv_node_free(minimum);
1549 lilv_node_free(maximum);
1553 LV2Plugin::load_supported_properties(PropertyDescriptors& descs)
1555 LilvWorld* lworld = _world.world;
1556 const LilvNode* subject = lilv_plugin_get_uri(_impl->plugin);
1557 LilvNodes* properties = lilv_world_find_nodes(
1558 lworld, subject, _world.patch_writable, NULL);
1559 LILV_FOREACH(nodes, p, properties) {
1560 // Get label and range
1561 const LilvNode* prop = lilv_nodes_get(properties, p);
1562 LilvNode* range = get_value(lworld, prop, _world.rdfs_range);
1564 warning << string_compose(_("LV2: property <%1> has no range datatype, ignoring"),
1565 lilv_node_as_uri(prop)) << endmsg;
1569 // Convert range to variant type (TODO: support for multiple range types)
1570 Variant::Type datatype;
1571 if (!uri_to_variant_type(lilv_node_as_uri(range), datatype)) {
1572 error << string_compose(_("LV2: property <%1> has unsupported datatype <%1>"),
1573 lilv_node_as_uri(prop), lilv_node_as_uri(range)) << endmsg;
1577 // Add description to result
1578 ParameterDescriptor desc;
1579 desc.key = _uri_map.uri_to_id(lilv_node_as_uri(prop));
1580 desc.datatype = datatype;
1581 load_parameter_descriptor(_world, desc, datatype, prop);
1582 descs.insert(std::make_pair(desc.key, desc));
1584 lilv_node_free(range);
1586 lilv_nodes_free(properties);
1590 LV2Plugin::announce_property_values()
1592 if (_patch_port_in_index == (uint32_t)-1) {
1596 // Set up forge to write to temporary buffer on the stack
1597 LV2_Atom_Forge* forge = &_impl->ui_forge;
1598 LV2_Atom_Forge_Frame frame;
1599 uint8_t buf[PATH_MAX]; // Ought to be enough for anyone...
1601 lv2_atom_forge_set_buffer(forge, buf, sizeof(buf));
1603 // Serialize patch:Get message with no subject (implicitly plugin instance)
1604 #ifdef HAVE_LV2_1_10_0
1605 lv2_atom_forge_object(forge, &frame, 1, _uri_map.urids.patch_Get);
1607 lv2_atom_forge_blank(forge, &frame, 1, _uri_map.urids.patch_Get);
1610 // Write message to UI=>Plugin ring
1611 const LV2_Atom* const atom = (const LV2_Atom*)buf;
1612 write_from_ui(_patch_port_in_index,
1613 _uri_map.urids.atom_eventTransfer,
1614 lv2_atom_total_size(atom),
1615 (const uint8_t*)atom);
1619 LV2Plugin::enable_ui_emission()
1622 /* see note in LV2Plugin::write_from_ui() */
1623 uint32_t bufsiz = 32768;
1624 if (_atom_ev_buffers && _atom_ev_buffers[0]) {
1625 bufsiz = lv2_evbuf_get_capacity(_atom_ev_buffers[0]);
1627 size_t rbs = _session.engine().raw_buffer_size(DataType::MIDI) * NBUFS;
1628 rbs = max((size_t) bufsiz * 8, rbs);
1629 _to_ui = new RingBuffer<uint8_t>(rbs);
1634 LV2Plugin::emit_to_ui(void* controller, UIMessageSink sink)
1640 uint32_t read_space = _to_ui->read_space();
1641 while (read_space > sizeof(UIMessage)) {
1643 if (_to_ui->read((uint8_t*)&msg, sizeof(msg)) != sizeof(msg)) {
1644 error << "Error reading from Plugin=>UI RingBuffer" << endmsg;
1647 vector<uint8_t> body(msg.size);
1648 if (_to_ui->read(&body[0], msg.size) != msg.size) {
1649 error << "Error reading from Plugin=>UI RingBuffer" << endmsg;
1653 sink(controller, msg.index, msg.size, msg.protocol, &body[0]);
1655 read_space -= sizeof(msg) + msg.size;
1660 LV2Plugin::work(uint32_t size, const void* data)
1662 return _impl->work_iface->work(
1663 _impl->instance->lv2_handle, work_respond, this, size, data);
1667 LV2Plugin::work_response(uint32_t size, const void* data)
1669 return _impl->work_iface->work_response(
1670 _impl->instance->lv2_handle, size, data);
1674 LV2Plugin::set_insert_id(PBD::ID id)
1676 if (_insert_id == "0") {
1678 } else if (_insert_id != id) {
1679 lilv_state_free(_impl->state);
1680 _impl->state = NULL;
1686 LV2Plugin::set_state_dir (const std::string& d)
1688 _plugin_state_dir = d;
1692 LV2Plugin::set_state(const XMLNode& node, int version)
1695 const XMLProperty* prop;
1696 XMLNodeConstIterator iter;
1701 LocaleGuard lg(X_("C"));
1703 if (node.name() != state_node_name()) {
1704 error << _("Bad node sent to LV2Plugin::set_state") << endmsg;
1708 #ifndef NO_PLUGIN_STATE
1710 if (version < 3000) {
1711 nodes = node.children("port");
1713 nodes = node.children("Port");
1716 for (iter = nodes.begin(); iter != nodes.end(); ++iter) {
1720 if ((prop = child->property("symbol")) != 0) {
1721 sym = prop->value().c_str();
1723 warning << _("LV2: port has no symbol, ignored") << endmsg;
1727 map<string, uint32_t>::iterator i = _port_indices.find(sym);
1729 if (i != _port_indices.end()) {
1730 port_id = i->second;
1732 warning << _("LV2: port has unknown index, ignored") << endmsg;
1736 if ((prop = child->property("value")) != 0) {
1737 value = prop->value().c_str();
1739 warning << _("LV2: port has no value, ignored") << endmsg;
1743 set_parameter(port_id, atof(value));
1746 if ((prop = node.property("template-dir")) != 0) {
1747 // portable templates, strip absolute path
1748 set_state_dir (Glib::build_filename (
1749 ARDOUR::user_route_template_directory (),
1750 Glib::path_get_basename (prop->value ())));
1754 if ((prop = node.property("state-dir")) != 0) {
1755 if (sscanf(prop->value().c_str(), "state%u", &_state_version) != 1) {
1756 error << string_compose(
1757 "LV2: failed to parse state version from \"%1\"",
1758 prop->value()) << endmsg;
1761 std::string state_file = Glib::build_filename(
1763 Glib::build_filename(prop->value(), "state.ttl"));
1765 LilvState* state = lilv_state_new_from_file(
1766 _world.world, _uri_map.urid_map(), NULL, state_file.c_str());
1768 lilv_state_restore(state, _impl->instance, NULL, NULL, 0, NULL);
1769 lilv_state_free(_impl->state);
1770 _impl->state = state;
1773 if (!_plugin_state_dir.empty ()) {
1774 // force save with session, next time (increment counter)
1775 lilv_state_free (_impl->state);
1776 _impl->state = NULL;
1780 latency_compute_run();
1783 return Plugin::set_state(node, version);
1787 LV2Plugin::get_parameter_descriptor(uint32_t which, ParameterDescriptor& desc) const
1789 const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, which);
1791 error << string_compose("LV2: get descriptor of non-existent port %1", which)
1796 LilvNodes* portunits;
1797 LilvNode *def, *min, *max;
1798 lilv_port_get_range(_impl->plugin, port, &def, &min, &max);
1799 portunits = lilv_port_get_value(_impl->plugin, port, _world.units_unit);
1801 // TODO: Once we can rely on lilv 0.18.0 being present,
1802 // load_parameter_descriptor() can be used for ports as well
1803 desc.integer_step = lilv_port_has_property(_impl->plugin, port, _world.lv2_integer);
1804 desc.toggled = lilv_port_has_property(_impl->plugin, port, _world.lv2_toggled);
1805 desc.logarithmic = lilv_port_has_property(_impl->plugin, port, _world.ext_logarithmic);
1806 desc.sr_dependent = lilv_port_has_property(_impl->plugin, port, _world.lv2_sampleRate);
1807 desc.label = lilv_node_as_string(lilv_port_get_name(_impl->plugin, port));
1808 desc.normal = def ? lilv_node_as_float(def) : 0.0f;
1809 desc.lower = min ? lilv_node_as_float(min) : 0.0f;
1810 desc.upper = max ? lilv_node_as_float(max) : 1.0f;
1811 load_parameter_descriptor_units(_world.world, desc, portunits);
1813 if (desc.sr_dependent) {
1814 desc.lower *= _session.frame_rate ();
1815 desc.upper *= _session.frame_rate ();
1818 desc.min_unbound = false; // TODO: LV2 extension required
1819 desc.max_unbound = false; // TODO: LV2 extension required
1821 desc.enumeration = lilv_port_has_property(_impl->plugin, port, _world.lv2_enumeration);
1822 desc.scale_points = get_scale_points(which);
1824 desc.update_steps();
1826 lilv_node_free(def);
1827 lilv_node_free(min);
1828 lilv_node_free(max);
1829 lilv_nodes_free(portunits);
1835 LV2Plugin::describe_parameter(Evoral::Parameter which)
1837 if (( which.type() == PluginAutomation) && ( which.id() < parameter_count()) ) {
1839 if (lilv_port_has_property(_impl->plugin,
1840 lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.ext_notOnGUI)) {
1841 return X_("hidden");
1844 if (lilv_port_has_property(_impl->plugin,
1845 lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.lv2_freewheeling)) {
1846 return X_("hidden");
1849 if (lilv_port_has_property(_impl->plugin,
1850 lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.lv2_reportsLatency)) {
1851 return X_("latency");
1854 LilvNode* name = lilv_port_get_name(_impl->plugin,
1855 lilv_plugin_get_port_by_index(_impl->plugin, which.id()));
1856 string ret(lilv_node_as_string(name));
1857 lilv_node_free(name);
1865 LV2Plugin::signal_latency() const
1867 if (_latency_control_port) {
1868 return (framecnt_t)floor(*_latency_control_port);
1874 set<Evoral::Parameter>
1875 LV2Plugin::automatable() const
1877 set<Evoral::Parameter> ret;
1879 for (uint32_t i = 0; i < parameter_count(); ++i) {
1880 if (parameter_is_input(i) && parameter_is_control(i)) {
1881 ret.insert(ret.end(), Evoral::Parameter(PluginAutomation, 0, i));
1885 for (PropertyDescriptors::const_iterator p = _property_descriptors.begin();
1886 p != _property_descriptors.end();
1888 ret.insert(ret.end(), Evoral::Parameter(PluginPropertyAutomation, 0, p->first));
1894 LV2Plugin::activate()
1896 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 activate\n", name()));
1898 if (!_was_activated) {
1899 lilv_instance_activate(_impl->instance);
1900 _was_activated = true;
1905 LV2Plugin::deactivate()
1907 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 deactivate\n", name()));
1909 if (_was_activated) {
1910 lilv_instance_deactivate(_impl->instance);
1911 _was_activated = false;
1916 LV2Plugin::cleanup()
1918 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 cleanup\n", name()));
1922 lilv_instance_free(_impl->instance);
1923 _impl->instance = NULL;
1927 LV2Plugin::allocate_atom_event_buffers()
1929 /* reserve local scratch buffers for ATOM event-queues */
1930 const LilvPlugin* p = _impl->plugin;
1932 /* count non-MIDI atom event-ports
1933 * TODO: nicely ask drobilla to make a lilv_ call for that
1935 int count_atom_out = 0;
1936 int count_atom_in = 0;
1937 int minimumSize = 32768; // TODO use a per-port minimum-size
1938 for (uint32_t i = 0; i < lilv_plugin_get_num_ports(p); ++i) {
1939 const LilvPort* port = lilv_plugin_get_port_by_index(p, i);
1940 if (lilv_port_is_a(p, port, _world.atom_AtomPort)) {
1941 LilvNodes* buffer_types = lilv_port_get_value(
1942 p, port, _world.atom_bufferType);
1943 LilvNodes* atom_supports = lilv_port_get_value(
1944 p, port, _world.atom_supports);
1946 if (!lilv_nodes_contains(buffer_types, _world.atom_Sequence)
1947 || !lilv_nodes_contains(atom_supports, _world.midi_MidiEvent)) {
1948 if (lilv_port_is_a(p, port, _world.lv2_InputPort)) {
1951 if (lilv_port_is_a(p, port, _world.lv2_OutputPort)) {
1954 LilvNodes* min_size_v = lilv_port_get_value(_impl->plugin, port, _world.rsz_minimumSize);
1955 LilvNode* min_size = min_size_v ? lilv_nodes_get_first(min_size_v) : NULL;
1956 if (min_size && lilv_node_is_int(min_size)) {
1957 minimumSize = std::max(minimumSize, lilv_node_as_int(min_size));
1959 lilv_nodes_free(min_size_v);
1961 lilv_nodes_free(buffer_types);
1962 lilv_nodes_free(atom_supports);
1966 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 need buffers for %2 atom-in and %3 atom-out event-ports\n",
1967 name(), count_atom_in, count_atom_out));
1969 const int total_atom_buffers = (count_atom_in + count_atom_out);
1970 if (_atom_ev_buffers || total_atom_buffers == 0) {
1974 DEBUG_TRACE(DEBUG::LV2, string_compose("allocate %1 atom_ev_buffers of %d bytes\n", total_atom_buffers, minimumSize));
1975 _atom_ev_buffers = (LV2_Evbuf**) malloc((total_atom_buffers + 1) * sizeof(LV2_Evbuf*));
1976 for (int i = 0; i < total_atom_buffers; ++i ) {
1977 _atom_ev_buffers[i] = lv2_evbuf_new(minimumSize, LV2_EVBUF_ATOM,
1978 _uri_map.urids.atom_Chunk, _uri_map.urids.atom_Sequence);
1980 _atom_ev_buffers[total_atom_buffers] = 0;
1984 /** Write an ardour position/time/tempo/meter as an LV2 event.
1985 * @return true on success.
1988 write_position(LV2_Atom_Forge* forge,
1990 const TempoMetric& t,
1991 Timecode::BBT_Time& bbt,
1993 framepos_t position,
1996 const URIMap::URIDs& urids = URIMap::instance().urids;
1998 uint8_t pos_buf[256];
1999 lv2_atom_forge_set_buffer(forge, pos_buf, sizeof(pos_buf));
2000 LV2_Atom_Forge_Frame frame;
2001 #ifdef HAVE_LV2_1_10_0
2002 lv2_atom_forge_object(forge, &frame, 1, urids.time_Position);
2003 lv2_atom_forge_key(forge, urids.time_frame);
2004 lv2_atom_forge_long(forge, position);
2005 lv2_atom_forge_key(forge, urids.time_speed);
2006 lv2_atom_forge_float(forge, speed);
2007 lv2_atom_forge_key(forge, urids.time_barBeat);
2008 lv2_atom_forge_float(forge, bbt.beats - 1 +
2009 (bbt.ticks / Timecode::BBT_Time::ticks_per_beat));
2010 lv2_atom_forge_key(forge, urids.time_bar);
2011 lv2_atom_forge_long(forge, bbt.bars - 1);
2012 lv2_atom_forge_key(forge, urids.time_beatUnit);
2013 lv2_atom_forge_int(forge, t.meter().note_divisor());
2014 lv2_atom_forge_key(forge, urids.time_beatsPerBar);
2015 lv2_atom_forge_float(forge, t.meter().divisions_per_bar());
2016 lv2_atom_forge_key(forge, urids.time_beatsPerMinute);
2017 lv2_atom_forge_float(forge, t.tempo().beats_per_minute());
2019 lv2_atom_forge_blank(forge, &frame, 1, urids.time_Position);
2020 lv2_atom_forge_property_head(forge, urids.time_frame, 0);
2021 lv2_atom_forge_long(forge, position);
2022 lv2_atom_forge_property_head(forge, urids.time_speed, 0);
2023 lv2_atom_forge_float(forge, speed);
2024 lv2_atom_forge_property_head(forge, urids.time_barBeat, 0);
2025 lv2_atom_forge_float(forge, bbt.beats - 1 +
2026 (bbt.ticks / Timecode::BBT_Time::ticks_per_beat));
2027 lv2_atom_forge_property_head(forge, urids.time_bar, 0);
2028 lv2_atom_forge_long(forge, bbt.bars - 1);
2029 lv2_atom_forge_property_head(forge, urids.time_beatUnit, 0);
2030 lv2_atom_forge_int(forge, t.meter().note_divisor());
2031 lv2_atom_forge_property_head(forge, urids.time_beatsPerBar, 0);
2032 lv2_atom_forge_float(forge, t.meter().divisions_per_bar());
2033 lv2_atom_forge_property_head(forge, urids.time_beatsPerMinute, 0);
2034 lv2_atom_forge_float(forge, t.tempo().beats_per_minute());
2037 LV2_Evbuf_Iterator end = lv2_evbuf_end(buf);
2038 const LV2_Atom* const atom = (const LV2_Atom*)pos_buf;
2039 return lv2_evbuf_write(&end, offset, 0, atom->type, atom->size,
2040 (const uint8_t*)(atom + 1));
2044 LV2Plugin::connect_and_run(BufferSet& bufs,
2045 ChanMapping in_map, ChanMapping out_map,
2046 pframes_t nframes, framecnt_t offset)
2048 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 run %2 offset %3\n", name(), nframes, offset));
2049 Plugin::connect_and_run(bufs, in_map, out_map, nframes, offset);
2051 cycles_t then = get_cycles();
2053 TempoMap& tmap = _session.tempo_map();
2054 Metrics::const_iterator metric_i = tmap.metrics_end();
2055 TempoMetric tmetric = tmap.metric_at(_session.transport_frame(), &metric_i);
2057 if (_freewheel_control_port) {
2058 *_freewheel_control_port = _session.engine().freewheeling() ? 1.f : 0.f;
2061 if (_bpm_control_port) {
2062 *_bpm_control_port = tmetric.tempo().beats_per_minute();
2065 ChanCount bufs_count;
2066 bufs_count.set(DataType::AUDIO, 1);
2067 bufs_count.set(DataType::MIDI, 1);
2068 BufferSet& silent_bufs = _session.get_silent_buffers(bufs_count);
2069 BufferSet& scratch_bufs = _session.get_scratch_buffers(bufs_count);
2070 uint32_t const num_ports = parameter_count();
2071 uint32_t const nil_index = std::numeric_limits<uint32_t>::max();
2073 uint32_t audio_in_index = 0;
2074 uint32_t audio_out_index = 0;
2075 uint32_t midi_in_index = 0;
2076 uint32_t midi_out_index = 0;
2077 uint32_t atom_port_index = 0;
2078 for (uint32_t port_index = 0; port_index < num_ports; ++port_index) {
2080 uint32_t index = nil_index;
2081 PortFlags flags = _port_flags[port_index];
2083 if (flags & PORT_AUDIO) {
2084 if (flags & PORT_INPUT) {
2085 index = in_map.get(DataType::AUDIO, audio_in_index++, &valid);
2087 ? bufs.get_audio(index).data(offset)
2088 : silent_bufs.get_audio(0).data(offset);
2090 index = out_map.get(DataType::AUDIO, audio_out_index++, &valid);
2092 ? bufs.get_audio(index).data(offset)
2093 : scratch_bufs.get_audio(0).data(offset);
2095 } else if (flags & (PORT_EVENT|PORT_SEQUENCE)) {
2096 /* FIXME: The checks here for bufs.count().n_midi() > index shouldn't
2097 be necessary, but the mapping is illegal in some cases. Ideally
2098 that should be fixed, but this is easier...
2100 if (flags & PORT_MIDI) {
2101 if (flags & PORT_INPUT) {
2102 index = in_map.get(DataType::MIDI, midi_in_index++, &valid);
2104 index = out_map.get(DataType::MIDI, midi_out_index++, &valid);
2106 if (valid && bufs.count().n_midi() > index) {
2107 /* Note, ensure_lv2_bufsize() is not RT safe!
2108 * However free()/alloc() is only called if a
2109 * plugin requires a rsz:minimumSize buffersize
2110 * and the existing buffer if smaller.
2112 bufs.ensure_lv2_bufsize((flags & PORT_INPUT), index, _port_minimumSize[port_index]);
2113 _ev_buffers[port_index] = bufs.get_lv2_midi(
2114 (flags & PORT_INPUT), index, (flags & PORT_EVENT));
2116 } else if ((flags & PORT_POSITION) && (flags & PORT_INPUT)) {
2117 lv2_evbuf_reset(_atom_ev_buffers[atom_port_index], true);
2118 _ev_buffers[port_index] = _atom_ev_buffers[atom_port_index++];
2122 if (valid && (flags & PORT_INPUT)) {
2123 Timecode::BBT_Time bbt;
2124 if ((flags & PORT_POSITION)) {
2125 if (_session.transport_frame() != _next_cycle_start ||
2126 _session.transport_speed() != _next_cycle_speed) {
2127 // Transport has changed, write position at cycle start
2128 tmap.bbt_time(_session.transport_frame(), bbt);
2129 write_position(&_impl->forge, _ev_buffers[port_index],
2130 tmetric, bbt, _session.transport_speed(),
2131 _session.transport_frame(), 0);
2135 // Get MIDI iterator range (empty range if no MIDI)
2136 MidiBuffer::iterator m = (index != nil_index)
2137 ? bufs.get_midi(index).begin()
2138 : silent_bufs.get_midi(0).end();
2139 MidiBuffer::iterator m_end = (index != nil_index)
2140 ? bufs.get_midi(index).end()
2143 // Now merge MIDI and any transport events into the buffer
2144 const uint32_t type = _uri_map.urids.midi_MidiEvent;
2145 const framepos_t tend = _session.transport_frame() + nframes;
2147 while (m != m_end || (metric_i != tmap.metrics_end() &&
2148 (*metric_i)->frame() < tend)) {
2149 MetricSection* metric = (metric_i != tmap.metrics_end())
2151 if (m != m_end && (!metric || metric->frame() > (*m).time())) {
2152 const Evoral::MIDIEvent<framepos_t> ev(*m, false);
2153 LV2_Evbuf_Iterator eend = lv2_evbuf_end(_ev_buffers[port_index]);
2154 lv2_evbuf_write(&eend, ev.time(), 0, type, ev.size(), ev.buffer());
2157 tmetric.set_metric(metric);
2158 bbt = metric->start();
2159 write_position(&_impl->forge, _ev_buffers[port_index],
2160 tmetric, bbt, _session.transport_speed(),
2162 metric->frame() - _session.transport_frame());
2166 } else if (!valid) {
2167 // Nothing we understand or care about, connect to scratch
2168 // see note for midi-buffer size above
2169 scratch_bufs.ensure_lv2_bufsize((flags & PORT_INPUT),
2170 0, _port_minimumSize[port_index]);
2171 _ev_buffers[port_index] = scratch_bufs.get_lv2_midi(
2172 (flags & PORT_INPUT), 0, (flags & PORT_EVENT));
2175 buf = lv2_evbuf_get_buffer(_ev_buffers[port_index]);
2177 continue; // Control port, leave buffer alone
2179 lilv_instance_connect_port(_impl->instance, port_index, buf);
2182 // Read messages from UI and push into appropriate buffers
2184 uint32_t read_space = _from_ui->read_space();
2185 while (read_space > sizeof(UIMessage)) {
2187 if (_from_ui->read((uint8_t*)&msg, sizeof(msg)) != sizeof(msg)) {
2188 error << "Error reading from UI=>Plugin RingBuffer" << endmsg;
2191 vector<uint8_t> body(msg.size);
2192 if (_from_ui->read(&body[0], msg.size) != msg.size) {
2193 error << "Error reading from UI=>Plugin RingBuffer" << endmsg;
2196 if (msg.protocol == URIMap::instance().urids.atom_eventTransfer) {
2197 LV2_Evbuf* buf = _ev_buffers[msg.index];
2198 LV2_Evbuf_Iterator i = lv2_evbuf_end(buf);
2199 const LV2_Atom* const atom = (const LV2_Atom*)&body[0];
2200 if (!lv2_evbuf_write(&i, nframes - 1, 0, atom->type, atom->size,
2201 (const uint8_t*)(atom + 1))) {
2202 error << "Failed to write data to LV2 event buffer\n";
2205 error << "Received unknown message type from UI" << endmsg;
2207 read_space -= sizeof(UIMessage) + msg.size;
2214 for (uint32_t port_index = 0; port_index < num_ports; ++port_index) {
2215 PortFlags flags = _port_flags[port_index];
2218 /* TODO ask drobilla about comment
2219 * "Make Ardour event buffers generic so plugins can communicate"
2220 * in libs/ardour/buffer_set.cc:310
2222 * ideally the user could choose which of the following two modes
2223 * to use (e.g. instrument/effect chains MIDI OUT vs MIDI TRHU).
2225 * This implementation follows the discussion on IRC Mar 16 2013 16:47 UTC
2226 * 16:51 < drobilla> rgareus: [..] i.e always replace with MIDI output [of LV2 plugin] if it's there
2227 * 16:52 < drobilla> rgareus: That would probably be good enough [..] to make users not complain
2228 * for quite a while at least ;)
2230 // copy output of LV2 plugin's MIDI port to Ardour MIDI buffers -- MIDI OUT
2231 if ((flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE|PORT_MIDI))) {
2232 const uint32_t buf_index = out_map.get(
2233 DataType::MIDI, midi_out_index++, &valid);
2235 bufs.forward_lv2_midi(_ev_buffers[port_index], buf_index);
2238 // Flush MIDI (write back to Ardour MIDI buffers) -- MIDI THRU
2239 else if ((flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE))) {
2240 const uint32_t buf_index = out_map.get(
2241 DataType::MIDI, midi_out_index++, &valid);
2243 bufs.flush_lv2_midi(true, buf_index);
2248 // Write messages to UI
2249 if ((_to_ui || _patch_port_out_index != (uint32_t)-1) &&
2250 (flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE))) {
2251 LV2_Evbuf* buf = _ev_buffers[port_index];
2252 for (LV2_Evbuf_Iterator i = lv2_evbuf_begin(buf);
2253 lv2_evbuf_is_valid(i);
2254 i = lv2_evbuf_next(i)) {
2255 uint32_t frames, subframes, type, size;
2257 lv2_evbuf_get(i, &frames, &subframes, &type, &size, &data);
2259 // Intercept patch change messages to emit PropertyChanged signal
2260 if ((flags & PORT_PATCHMSG)) {
2261 LV2_Atom* atom = (LV2_Atom*)(data - sizeof(LV2_Atom));
2262 if (atom->type == _uri_map.urids.atom_Blank ||
2263 atom->type == _uri_map.urids.atom_Object) {
2264 LV2_Atom_Object* obj = (LV2_Atom_Object*)atom;
2265 if (obj->body.otype == _uri_map.urids.patch_Set) {
2266 const LV2_Atom* property = NULL;
2267 const LV2_Atom* value = NULL;
2268 lv2_atom_object_get(obj,
2269 _uri_map.urids.patch_property, &property,
2270 _uri_map.urids.patch_value, &value,
2273 if (!property || !value ||
2274 property->type != _uri_map.urids.atom_URID ||
2275 value->type != _uri_map.urids.atom_Path) {
2276 std::cerr << "warning: patch:Set for unknown property" << std::endl;
2280 const uint32_t prop_id = ((const LV2_Atom_URID*)property)->body;
2281 const char* path = (const char*)LV2_ATOM_BODY_CONST(value);
2283 // Emit PropertyChanged signal for UI
2284 // TODO: This should emit the control's Changed signal
2285 PropertyChanged(prop_id, Variant(Variant::PATH, path));
2290 if (!_to_ui) continue;
2291 write_to_ui(port_index, URIMap::instance().urids.atom_eventTransfer,
2292 size + sizeof(LV2_Atom),
2293 data - sizeof(LV2_Atom));
2298 cycles_t now = get_cycles();
2299 set_cycles((uint32_t)(now - then));
2301 // Update expected transport information for next cycle so we can detect changes
2302 _next_cycle_speed = _session.transport_speed();
2303 _next_cycle_start = _session.transport_frame() + (nframes * _next_cycle_speed);
2309 LV2Plugin::parameter_is_control(uint32_t param) const
2311 assert(param < _port_flags.size());
2312 return _port_flags[param] & PORT_CONTROL;
2316 LV2Plugin::parameter_is_audio(uint32_t param) const
2318 assert(param < _port_flags.size());
2319 return _port_flags[param] & PORT_AUDIO;
2323 LV2Plugin::parameter_is_event(uint32_t param) const
2325 assert(param < _port_flags.size());
2326 return _port_flags[param] & PORT_EVENT;
2330 LV2Plugin::parameter_is_output(uint32_t param) const
2332 assert(param < _port_flags.size());
2333 return _port_flags[param] & PORT_OUTPUT;
2337 LV2Plugin::parameter_is_input(uint32_t param) const
2339 assert(param < _port_flags.size());
2340 return _port_flags[param] & PORT_INPUT;
2344 LV2Plugin::print_parameter(uint32_t param, char* buf, uint32_t len) const
2347 if (param < parameter_count()) {
2348 snprintf(buf, len, "%.3f", get_parameter(param));
2355 boost::shared_ptr<ScalePoints>
2356 LV2Plugin::get_scale_points(uint32_t port_index) const
2358 const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, port_index);
2359 LilvScalePoints* points = lilv_port_get_scale_points(_impl->plugin, port);
2361 boost::shared_ptr<ScalePoints> ret;
2366 ret = boost::shared_ptr<ScalePoints>(new ScalePoints());
2368 LILV_FOREACH(scale_points, i, points) {
2369 const LilvScalePoint* p = lilv_scale_points_get(points, i);
2370 const LilvNode* label = lilv_scale_point_get_label(p);
2371 const LilvNode* value = lilv_scale_point_get_value(p);
2372 if (label && (lilv_node_is_float(value) || lilv_node_is_int(value))) {
2373 ret->insert(make_pair(lilv_node_as_string(label),
2374 lilv_node_as_float(value)));
2378 lilv_scale_points_free(points);
2383 LV2Plugin::run(pframes_t nframes)
2385 uint32_t const N = parameter_count();
2386 for (uint32_t i = 0; i < N; ++i) {
2387 if (parameter_is_control(i) && parameter_is_input(i)) {
2388 _control_data[i] = _shadow_data[i];
2392 lilv_instance_run(_impl->instance, nframes);
2394 if (_impl->work_iface) {
2395 _worker->emit_responses();
2396 if (_impl->work_iface->end_run) {
2397 _impl->work_iface->end_run(_impl->instance->lv2_handle);
2403 LV2Plugin::latency_compute_run()
2405 if (!_latency_control_port) {
2409 // Run the plugin so that it can set its latency parameter
2411 bool was_activated = _was_activated;
2414 uint32_t port_index = 0;
2415 uint32_t in_index = 0;
2416 uint32_t out_index = 0;
2418 // this is done in the main thread. non realtime.
2419 const framecnt_t bufsize = _engine.samples_per_cycle();
2420 float *buffer = (float*) malloc(_engine.samples_per_cycle() * sizeof(float));
2422 memset(buffer, 0, sizeof(float) * bufsize);
2424 // FIXME: Ensure plugins can handle in-place processing
2428 while (port_index < parameter_count()) {
2429 if (parameter_is_audio(port_index)) {
2430 if (parameter_is_input(port_index)) {
2431 lilv_instance_connect_port(_impl->instance, port_index, buffer);
2433 } else if (parameter_is_output(port_index)) {
2434 lilv_instance_connect_port(_impl->instance, port_index, buffer);
2443 if (was_activated) {
2450 LV2Plugin::Impl::designated_input (const char* uri, void** bufptrs[], void** bufptr)
2452 const LilvPort* port = NULL;
2453 LilvNode* designation = lilv_new_uri(_world.world, uri);
2454 port = lilv_plugin_get_port_by_designation(
2455 plugin, _world.lv2_InputPort, designation);
2456 lilv_node_free(designation);
2458 bufptrs[lilv_port_get_index(plugin, port)] = bufptr;
2463 static bool lv2_filter (const string& str, void* /*arg*/)
2465 /* Not a dotfile, has a prefix before a period, suffix is "lv2" */
2467 return str[0] != '.' && (str.length() > 3 && str.find (".lv2") == (str.length() - 4));
2471 LV2World::LV2World()
2472 : world(lilv_world_new())
2473 , _bundle_checked(false)
2475 atom_AtomPort = lilv_new_uri(world, LV2_ATOM__AtomPort);
2476 atom_Chunk = lilv_new_uri(world, LV2_ATOM__Chunk);
2477 atom_Sequence = lilv_new_uri(world, LV2_ATOM__Sequence);
2478 atom_bufferType = lilv_new_uri(world, LV2_ATOM__bufferType);
2479 atom_supports = lilv_new_uri(world, LV2_ATOM__supports);
2480 atom_eventTransfer = lilv_new_uri(world, LV2_ATOM__eventTransfer);
2481 ev_EventPort = lilv_new_uri(world, LILV_URI_EVENT_PORT);
2482 ext_logarithmic = lilv_new_uri(world, LV2_PORT_PROPS__logarithmic);
2483 ext_notOnGUI = lilv_new_uri(world, LV2_PORT_PROPS__notOnGUI);
2484 lv2_AudioPort = lilv_new_uri(world, LILV_URI_AUDIO_PORT);
2485 lv2_ControlPort = lilv_new_uri(world, LILV_URI_CONTROL_PORT);
2486 lv2_InputPort = lilv_new_uri(world, LILV_URI_INPUT_PORT);
2487 lv2_OutputPort = lilv_new_uri(world, LILV_URI_OUTPUT_PORT);
2488 lv2_inPlaceBroken = lilv_new_uri(world, LV2_CORE__inPlaceBroken);
2489 lv2_integer = lilv_new_uri(world, LV2_CORE__integer);
2490 lv2_default = lilv_new_uri(world, LV2_CORE__default);
2491 lv2_minimum = lilv_new_uri(world, LV2_CORE__minimum);
2492 lv2_maximum = lilv_new_uri(world, LV2_CORE__maximum);
2493 lv2_reportsLatency = lilv_new_uri(world, LV2_CORE__reportsLatency);
2494 lv2_sampleRate = lilv_new_uri(world, LV2_CORE__sampleRate);
2495 lv2_toggled = lilv_new_uri(world, LV2_CORE__toggled);
2496 lv2_enumeration = lilv_new_uri(world, LV2_CORE__enumeration);
2497 lv2_freewheeling = lilv_new_uri(world, LV2_CORE__freeWheeling);
2498 midi_MidiEvent = lilv_new_uri(world, LILV_URI_MIDI_EVENT);
2499 rdfs_comment = lilv_new_uri(world, LILV_NS_RDFS "comment");
2500 rdfs_label = lilv_new_uri(world, LILV_NS_RDFS "label");
2501 rdfs_range = lilv_new_uri(world, LILV_NS_RDFS "range");
2502 rsz_minimumSize = lilv_new_uri(world, LV2_RESIZE_PORT__minimumSize);
2503 time_Position = lilv_new_uri(world, LV2_TIME__Position);
2504 ui_GtkUI = lilv_new_uri(world, LV2_UI__GtkUI);
2505 ui_external = lilv_new_uri(world, "http://lv2plug.in/ns/extensions/ui#external");
2506 ui_externalkx = lilv_new_uri(world, "http://kxstudio.sf.net/ns/lv2ext/external-ui#Widget");
2507 units_unit = lilv_new_uri(world, LV2_UNITS__unit);
2508 units_render = lilv_new_uri(world, LV2_UNITS__render);
2509 units_hz = lilv_new_uri(world, LV2_UNITS__hz);
2510 units_midiNote = lilv_new_uri(world, LV2_UNITS__midiNote);
2511 units_db = lilv_new_uri(world, LV2_UNITS__db);
2512 patch_writable = lilv_new_uri(world, LV2_PATCH__writable);
2513 patch_Message = lilv_new_uri(world, LV2_PATCH__Message);
2514 lv2_noSampleAccurateCtrl = lilv_new_uri(world, LV2_CORE_PREFIX "noSampleAccurateControls");
2515 #ifdef HAVE_LV2_1_2_0
2516 bufz_powerOf2BlockLength = lilv_new_uri(world, LV2_BUF_SIZE__powerOf2BlockLength);
2517 bufz_fixedBlockLength = lilv_new_uri(world, LV2_BUF_SIZE__fixedBlockLength);
2518 bufz_nominalBlockLength = lilv_new_uri(world, "http://lv2plug.in/ns/ext/buf-size#nominalBlockLength");
2523 LV2World::~LV2World()
2525 #ifdef HAVE_LV2_1_2_0
2526 lilv_node_free(bufz_nominalBlockLength);
2527 lilv_node_free(bufz_fixedBlockLength);
2528 lilv_node_free(bufz_powerOf2BlockLength);
2530 lilv_node_free(lv2_noSampleAccurateCtrl);
2531 lilv_node_free(patch_Message);
2532 lilv_node_free(patch_writable);
2533 lilv_node_free(units_hz);
2534 lilv_node_free(units_midiNote);
2535 lilv_node_free(units_db);
2536 lilv_node_free(units_unit);
2537 lilv_node_free(units_render);
2538 lilv_node_free(ui_externalkx);
2539 lilv_node_free(ui_external);
2540 lilv_node_free(ui_GtkUI);
2541 lilv_node_free(time_Position);
2542 lilv_node_free(rsz_minimumSize);
2543 lilv_node_free(rdfs_comment);
2544 lilv_node_free(rdfs_label);
2545 lilv_node_free(rdfs_range);
2546 lilv_node_free(midi_MidiEvent);
2547 lilv_node_free(lv2_enumeration);
2548 lilv_node_free(lv2_freewheeling);
2549 lilv_node_free(lv2_toggled);
2550 lilv_node_free(lv2_sampleRate);
2551 lilv_node_free(lv2_reportsLatency);
2552 lilv_node_free(lv2_integer);
2553 lilv_node_free(lv2_inPlaceBroken);
2554 lilv_node_free(lv2_OutputPort);
2555 lilv_node_free(lv2_InputPort);
2556 lilv_node_free(lv2_ControlPort);
2557 lilv_node_free(lv2_AudioPort);
2558 lilv_node_free(ext_notOnGUI);
2559 lilv_node_free(ext_logarithmic);
2560 lilv_node_free(ev_EventPort);
2561 lilv_node_free(atom_supports);
2562 lilv_node_free(atom_eventTransfer);
2563 lilv_node_free(atom_bufferType);
2564 lilv_node_free(atom_Sequence);
2565 lilv_node_free(atom_Chunk);
2566 lilv_node_free(atom_AtomPort);
2567 lilv_world_free(world);
2571 LV2World::load_bundled_plugins(bool verbose)
2573 if (!_bundle_checked) {
2575 cout << "Scanning folders for bundled LV2s: " << ARDOUR::lv2_bundled_search_path().to_string() << endl;
2578 vector<string> plugin_objects;
2579 find_paths_matching_filter (plugin_objects, ARDOUR::lv2_bundled_search_path(), lv2_filter, 0, true, true, true);
2580 for ( vector<string>::iterator x = plugin_objects.begin(); x != plugin_objects.end (); ++x) {
2581 #ifdef PLATFORM_WINDOWS
2582 string uri = "file:///" + *x + "/";
2584 string uri = "file://" + *x + "/";
2586 LilvNode *node = lilv_new_uri(world, uri.c_str());
2587 lilv_world_load_bundle(world, node);
2588 lilv_node_free(node);
2591 lilv_world_load_all(world);
2592 _bundle_checked = true;
2596 LV2PluginInfo::LV2PluginInfo (const char* plugin_uri)
2599 _plugin_uri = strdup(plugin_uri);
2602 LV2PluginInfo::~LV2PluginInfo()
2609 LV2PluginInfo::load(Session& session)
2613 const LilvPlugins* plugins = lilv_world_get_all_plugins(_world.world);
2614 LilvNode* uri = lilv_new_uri(_world.world, _plugin_uri);
2615 if (!uri) { throw failed_constructor(); }
2616 const LilvPlugin* lp = lilv_plugins_get_by_uri(plugins, uri);
2617 if (!lp) { throw failed_constructor(); }
2618 plugin.reset(new LV2Plugin(session.engine(), session, lp, session.frame_rate()));
2619 lilv_node_free(uri);
2620 plugin->set_info(PluginInfoPtr(shared_from_this ()));
2622 } catch (failed_constructor& err) {
2623 return PluginPtr((Plugin*)0);
2630 LV2PluginInfo::in_category (const std::string &c) const
2632 // TODO use untranslated lilv_plugin_get_class()
2633 // match gtk2_ardour/plugin_selector.cc
2634 if (category == c) {
2641 LV2PluginInfo::is_instrument () const
2643 if (category == "Instrument") {
2647 /* until we make sure that category remains untranslated in the lv2.ttl spec
2648 * and until most instruments also classify themselves as such, there's a 2nd check:
2650 if (n_inputs.n_midi() > 0 && n_inputs.n_audio() == 0 && n_outputs.n_audio() > 0) {
2658 LV2PluginInfo::discover()
2661 world.load_bundled_plugins();
2662 _world.load_bundled_plugins(true);
2664 PluginInfoList* plugs = new PluginInfoList;
2665 const LilvPlugins* plugins = lilv_world_get_all_plugins(world.world);
2667 LILV_FOREACH(plugins, i, plugins) {
2668 const LilvPlugin* p = lilv_plugins_get(plugins, i);
2669 const LilvNode* pun = lilv_plugin_get_uri(p);
2671 LV2PluginInfoPtr info(new LV2PluginInfo(lilv_node_as_string(pun)));
2673 LilvNode* name = lilv_plugin_get_name(p);
2674 if (!name || !lilv_plugin_get_port_by_index(p, 0)) {
2675 warning << "Ignoring invalid LV2 plugin "
2676 << lilv_node_as_string(lilv_plugin_get_uri(p))
2681 if (lilv_plugin_has_feature(p, world.lv2_inPlaceBroken)) {
2682 warning << string_compose(
2683 _("Ignoring LV2 plugin \"%1\" since it cannot do inplace processing."),
2684 lilv_node_as_string(name)) << endmsg;
2685 lilv_node_free(name);
2689 #ifdef HAVE_LV2_1_2_0
2690 LilvNodes *required_features = lilv_plugin_get_required_features (p);
2691 if (lilv_nodes_contains (required_features, world.bufz_powerOf2BlockLength) ||
2692 lilv_nodes_contains (required_features, world.bufz_fixedBlockLength)
2694 warning << string_compose(
2695 _("Ignoring LV2 plugin \"%1\" because its buffer-size requirements cannot be satisfied."),
2696 lilv_node_as_string(name)) << endmsg;
2697 lilv_nodes_free(required_features);
2698 lilv_node_free(name);
2701 lilv_nodes_free(required_features);
2706 info->name = string(lilv_node_as_string(name));
2707 lilv_node_free(name);
2708 ARDOUR::PluginScanMessage(_("LV2"), info->name, false);
2710 const LilvPluginClass* pclass = lilv_plugin_get_class(p);
2711 const LilvNode* label = lilv_plugin_class_get_label(pclass);
2712 info->category = lilv_node_as_string(label);
2714 LilvNode* author_name = lilv_plugin_get_author_name(p);
2715 info->creator = author_name ? string(lilv_node_as_string(author_name)) : "Unknown";
2716 lilv_node_free(author_name);
2718 info->path = "/NOPATH"; // Meaningless for LV2
2720 /* count atom-event-ports that feature
2721 * atom:supports <http://lv2plug.in/ns/ext/midi#MidiEvent>
2723 * TODO: nicely ask drobilla to make a lilv_ call for that
2725 int count_midi_out = 0;
2726 int count_midi_in = 0;
2727 for (uint32_t i = 0; i < lilv_plugin_get_num_ports(p); ++i) {
2728 const LilvPort* port = lilv_plugin_get_port_by_index(p, i);
2729 if (lilv_port_is_a(p, port, world.atom_AtomPort)) {
2730 LilvNodes* buffer_types = lilv_port_get_value(
2731 p, port, world.atom_bufferType);
2732 LilvNodes* atom_supports = lilv_port_get_value(
2733 p, port, world.atom_supports);
2735 if (lilv_nodes_contains(buffer_types, world.atom_Sequence)
2736 && lilv_nodes_contains(atom_supports, world.midi_MidiEvent)) {
2737 if (lilv_port_is_a(p, port, world.lv2_InputPort)) {
2740 if (lilv_port_is_a(p, port, world.lv2_OutputPort)) {
2744 lilv_nodes_free(buffer_types);
2745 lilv_nodes_free(atom_supports);
2749 info->n_inputs.set_audio(
2750 lilv_plugin_get_num_ports_of_class(
2751 p, world.lv2_InputPort, world.lv2_AudioPort, NULL));
2752 info->n_inputs.set_midi(
2753 lilv_plugin_get_num_ports_of_class(
2754 p, world.lv2_InputPort, world.ev_EventPort, NULL)
2757 info->n_outputs.set_audio(
2758 lilv_plugin_get_num_ports_of_class(
2759 p, world.lv2_OutputPort, world.lv2_AudioPort, NULL));
2760 info->n_outputs.set_midi(
2761 lilv_plugin_get_num_ports_of_class(
2762 p, world.lv2_OutputPort, world.ev_EventPort, NULL)
2765 info->unique_id = lilv_node_as_uri(lilv_plugin_get_uri(p));
2766 info->index = 0; // Meaningless for LV2
2768 plugs->push_back(info);