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 #ifdef HAVE_LV2_1_2_0
159 LilvNode* bufz_powerOf2BlockLength;
160 LilvNode* bufz_fixedBlockLength;
161 LilvNode* bufz_nominalBlockLength;
165 bool _bundle_checked;
168 static LV2World _world;
170 /* worker extension */
172 /** Called by the plugin to schedule non-RT work. */
173 static LV2_Worker_Status
174 work_schedule(LV2_Worker_Schedule_Handle handle,
178 LV2Plugin* plugin = (LV2Plugin*)handle;
179 if (plugin->session().engine().freewheeling()) {
180 // Freewheeling, do the work immediately in this (audio) thread
181 return (LV2_Worker_Status)plugin->work(size, data);
183 // Enqueue message for the worker thread
184 return plugin->worker()->schedule(size, data) ?
185 LV2_WORKER_SUCCESS : LV2_WORKER_ERR_UNKNOWN;
189 /** Called by the plugin to respond to non-RT work. */
190 static LV2_Worker_Status
191 work_respond(LV2_Worker_Respond_Handle handle,
195 LV2Plugin* plugin = (LV2Plugin*)handle;
196 if (plugin->session().engine().freewheeling()) {
197 // Freewheeling, respond immediately in this (audio) thread
198 return (LV2_Worker_Status)plugin->work_response(size, data);
200 // Enqueue response for the worker
201 return plugin->worker()->respond(size, data) ?
202 LV2_WORKER_SUCCESS : LV2_WORKER_ERR_UNKNOWN;
209 log_vprintf(LV2_Log_Handle /*handle*/,
215 const int ret = g_vasprintf(&str, fmt, args);
216 if (type == URIMap::instance().urids.log_Error) {
217 error << str << endmsg;
218 } else if (type == URIMap::instance().urids.log_Warning) {
219 warning << str << endmsg;
220 } else if (type == URIMap::instance().urids.log_Note) {
221 info << str << endmsg;
223 // TODO: Toggleable log:Trace message support
228 log_printf(LV2_Log_Handle handle,
230 const char* fmt, ...)
234 const int ret = log_vprintf(handle, type, fmt, args);
239 struct LV2Plugin::Impl {
240 Impl() : plugin(0), ui(0), ui_type(0), name(0), author(0), instance(0)
248 /** Find the LV2 input port with the given designation.
249 * If found, bufptrs[port_index] will be set to bufptr.
251 const LilvPort* designated_input (const char* uri, void** bufptrs[], void** bufptr);
253 const LilvPlugin* plugin;
255 const LilvNode* ui_type;
258 LilvInstance* instance;
259 const LV2_Worker_Interface* work_iface;
260 const LV2_Options_Interface* opts_iface;
262 LV2_Atom_Forge forge;
263 LV2_Atom_Forge ui_forge;
264 int32_t block_length;
265 LV2_Options_Option* options;
268 LV2Plugin::LV2Plugin (AudioEngine& engine,
270 const void* c_plugin,
272 : Plugin (engine, session)
278 , _patch_port_in_index((uint32_t)-1)
279 , _patch_port_out_index((uint32_t)-1)
280 , _uri_map(URIMap::instance())
282 init(c_plugin, rate);
285 LV2Plugin::LV2Plugin (const LV2Plugin& other)
291 , _insert_id(other._insert_id)
292 , _patch_port_in_index((uint32_t)-1)
293 , _patch_port_out_index((uint32_t)-1)
294 , _uri_map(URIMap::instance())
296 init(other._impl->plugin, other._sample_rate);
298 for (uint32_t i = 0; i < parameter_count(); ++i) {
299 _control_data[i] = other._shadow_data[i];
300 _shadow_data[i] = other._shadow_data[i];
305 LV2Plugin::init(const void* c_plugin, framecnt_t rate)
307 DEBUG_TRACE(DEBUG::LV2, "init\n");
309 _impl->plugin = (const LilvPlugin*)c_plugin;
311 _impl->ui_type = NULL;
316 _atom_ev_buffers = 0;
318 _bpm_control_port = 0;
319 _freewheel_control_port = 0;
320 _latency_control_port = 0;
321 _next_cycle_start = std::numeric_limits<framepos_t>::max();
322 _next_cycle_speed = 1.0;
323 _seq_size = _engine.raw_buffer_size(DataType::MIDI);
325 _was_activated = false;
326 _has_state_interface = false;
327 _impl->block_length = _session.get_block_size();
329 _instance_access_feature.URI = "http://lv2plug.in/ns/ext/instance-access";
330 _data_access_feature.URI = "http://lv2plug.in/ns/ext/data-access";
331 _make_path_feature.URI = LV2_STATE__makePath;
332 _log_feature.URI = LV2_LOG__log;
333 _work_schedule_feature.URI = LV2_WORKER__schedule;
334 _work_schedule_feature.data = NULL;
335 _def_state_feature.URI = LV2_STATE_PREFIX "loadDefaultState"; // Post LV2-1.2.0
336 _def_state_feature.data = NULL;
338 const LilvPlugin* plugin = _impl->plugin;
340 LilvNode* state_iface_uri = lilv_new_uri(_world.world, LV2_STATE__interface);
341 LilvNode* state_uri = lilv_new_uri(_world.world, LV2_STATE_URI);
342 _has_state_interface =
343 // What plugins should have (lv2:extensionData state:Interface)
344 lilv_plugin_has_extension_data(plugin, state_iface_uri)
345 // What some outdated/incorrect ones have
346 || lilv_plugin_has_feature(plugin, state_uri);
347 lilv_node_free(state_uri);
348 lilv_node_free(state_iface_uri);
350 _features = (LV2_Feature**)calloc(11, sizeof(LV2_Feature*));
351 _features[0] = &_instance_access_feature;
352 _features[1] = &_data_access_feature;
353 _features[2] = &_make_path_feature;
354 _features[3] = _uri_map.uri_map_feature();
355 _features[4] = _uri_map.urid_map_feature();
356 _features[5] = _uri_map.urid_unmap_feature();
357 _features[6] = &_log_feature;
359 unsigned n_features = 7;
360 #ifdef HAVE_LV2_1_2_0
361 _features[n_features++] = &_def_state_feature;
364 lv2_atom_forge_init(&_impl->forge, _uri_map.urid_map());
365 lv2_atom_forge_init(&_impl->ui_forge, _uri_map.urid_map());
367 #ifdef HAVE_LV2_1_2_0
368 LV2_URID atom_Int = _uri_map.uri_to_id(LV2_ATOM__Int);
369 static const int32_t _min_block_length = 1; // may happen during split-cycles
370 static const int32_t _max_block_length = 8192; // max possible (with all engines and during export)
371 /* Consider updating max-block-size whenever the buffersize changes.
372 * It requires re-instantiating the plugin (which is a non-realtime operation),
373 * so it should be done lightly and only for plugins that require it.
375 * given that the block-size can change at any time (split-cycles) ardour currently
376 * does not support plugins that require bufz_fixedBlockLength.
378 LV2_Options_Option options[] = {
379 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id(LV2_BUF_SIZE__minBlockLength),
380 sizeof(int32_t), atom_Int, &_min_block_length },
381 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id(LV2_BUF_SIZE__maxBlockLength),
382 sizeof(int32_t), atom_Int, &_max_block_length },
383 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id(LV2_BUF_SIZE__sequenceSize),
384 sizeof(int32_t), atom_Int, &_seq_size },
385 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id("http://lv2plug.in/ns/ext/buf-size#nominalBlockLength"),
386 sizeof(int32_t), atom_Int, &_impl->block_length },
387 { LV2_OPTIONS_INSTANCE, 0, 0, 0, 0, NULL }
390 _impl->options = (LV2_Options_Option*) malloc (sizeof (options));
391 memcpy ((void*) _impl->options, (void*) options, sizeof (options));
393 _options_feature.URI = LV2_OPTIONS__options;
394 _options_feature.data = _impl->options;
395 _features[n_features++] = &_options_feature;
398 LV2_State_Make_Path* make_path = (LV2_State_Make_Path*)malloc(
399 sizeof(LV2_State_Make_Path));
400 make_path->handle = this;
401 make_path->path = &lv2_state_make_path;
402 _make_path_feature.data = make_path;
404 LV2_Log_Log* log = (LV2_Log_Log*)malloc(sizeof(LV2_Log_Log));
406 log->printf = &log_printf;
407 log->vprintf = &log_vprintf;
408 _log_feature.data = log;
410 LilvNode* worker_schedule = lilv_new_uri(_world.world, LV2_WORKER__schedule);
411 if (lilv_plugin_has_feature(plugin, worker_schedule)) {
412 LV2_Worker_Schedule* schedule = (LV2_Worker_Schedule*)malloc(
413 sizeof(LV2_Worker_Schedule));
414 size_t buf_size = _session.engine().raw_buffer_size(DataType::MIDI) * NBUFS;
415 _worker = new Worker(this, buf_size);
416 schedule->handle = this;
417 schedule->schedule_work = work_schedule;
418 _work_schedule_feature.data = schedule;
419 _features[n_features++] = &_work_schedule_feature;
421 lilv_node_free(worker_schedule);
423 _impl->instance = lilv_plugin_instantiate(plugin, rate, _features);
424 _impl->name = lilv_plugin_get_name(plugin);
425 _impl->author = lilv_plugin_get_author_name(plugin);
427 if (_impl->instance == 0) {
428 error << _("LV2: Failed to instantiate plugin ") << uri() << endmsg;
429 throw failed_constructor();
432 _instance_access_feature.data = (void*)_impl->instance->lv2_handle;
433 _data_access_extension_data.extension_data = _impl->instance->lv2_descriptor->extension_data;
434 _data_access_feature.data = &_data_access_extension_data;
436 LilvNode* worker_iface_uri = lilv_new_uri(_world.world, LV2_WORKER__interface);
437 if (lilv_plugin_has_extension_data(plugin, worker_iface_uri)) {
438 _impl->work_iface = (const LV2_Worker_Interface*)extension_data(
439 LV2_WORKER__interface);
441 lilv_node_free(worker_iface_uri);
444 LilvNode* options_iface_uri = lilv_new_uri(_world.world, LV2_OPTIONS__interface);
445 if (lilv_plugin_has_extension_data(plugin, options_iface_uri)) {
446 _impl->opts_iface = (const LV2_Options_Interface*)extension_data(
447 LV2_OPTIONS__interface);
449 lilv_node_free(options_iface_uri);
451 if (lilv_plugin_has_feature(plugin, _world.lv2_inPlaceBroken)) {
452 error << string_compose(
453 _("LV2: \"%1\" cannot be used, since it cannot do inplace processing."),
454 lilv_node_as_string(_impl->name)) << endmsg;
455 lilv_node_free(_impl->name);
456 lilv_node_free(_impl->author);
457 throw failed_constructor();
460 #ifdef HAVE_LV2_1_2_0
461 LilvNodes *required_features = lilv_plugin_get_required_features (plugin);
462 if (lilv_nodes_contains (required_features, _world.bufz_powerOf2BlockLength) ||
463 lilv_nodes_contains (required_features, _world.bufz_fixedBlockLength)
465 error << string_compose(
466 _("LV2: \"%1\" buffer-size requirements cannot be satisfied."),
467 lilv_node_as_string(_impl->name)) << endmsg;
468 lilv_node_free(_impl->name);
469 lilv_node_free(_impl->author);
470 lilv_nodes_free(required_features);
471 throw failed_constructor();
473 lilv_nodes_free(required_features);
476 #ifdef HAVE_LILV_0_16_0
477 // Load default state
478 LilvState* state = lilv_state_new_from_world(
479 _world.world, _uri_map.urid_map(), lilv_plugin_get_uri(_impl->plugin));
480 if (state && _has_state_interface) {
481 lilv_state_restore(state, _impl->instance, NULL, NULL, 0, NULL);
487 const uint32_t num_ports = this->num_ports();
488 for (uint32_t i = 0; i < num_ports; ++i) {
489 const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, i);
491 size_t minimumSize = 0;
493 if (lilv_port_is_a(_impl->plugin, port, _world.lv2_OutputPort)) {
494 flags |= PORT_OUTPUT;
495 } else if (lilv_port_is_a(_impl->plugin, port, _world.lv2_InputPort)) {
498 error << string_compose(
499 "LV2: \"%1\" port %2 is neither input nor output",
500 lilv_node_as_string(_impl->name), i) << endmsg;
501 throw failed_constructor();
504 if (lilv_port_is_a(_impl->plugin, port, _world.lv2_ControlPort)) {
505 flags |= PORT_CONTROL;
506 } else if (lilv_port_is_a(_impl->plugin, port, _world.lv2_AudioPort)) {
508 } else if (lilv_port_is_a(_impl->plugin, port, _world.ev_EventPort)) {
510 flags |= PORT_MIDI; // We assume old event API ports are for MIDI
511 } else if (lilv_port_is_a(_impl->plugin, port, _world.atom_AtomPort)) {
512 LilvNodes* buffer_types = lilv_port_get_value(
513 _impl->plugin, port, _world.atom_bufferType);
514 LilvNodes* atom_supports = lilv_port_get_value(
515 _impl->plugin, port, _world.atom_supports);
517 if (lilv_nodes_contains(buffer_types, _world.atom_Sequence)) {
518 flags |= PORT_SEQUENCE;
519 if (lilv_nodes_contains(atom_supports, _world.midi_MidiEvent)) {
522 if (lilv_nodes_contains(atom_supports, _world.time_Position)) {
523 flags |= PORT_POSITION;
525 if (lilv_nodes_contains(atom_supports, _world.patch_Message)) {
526 flags |= PORT_PATCHMSG;
527 if (flags & PORT_INPUT) {
528 _patch_port_in_index = i;
530 _patch_port_out_index = i;
534 LilvNodes* min_size_v = lilv_port_get_value(_impl->plugin, port, _world.rsz_minimumSize);
535 LilvNode* min_size = min_size_v ? lilv_nodes_get_first(min_size_v) : NULL;
536 if (min_size && lilv_node_is_int(min_size)) {
537 minimumSize = lilv_node_as_int(min_size);
539 lilv_nodes_free(min_size_v);
540 lilv_nodes_free(buffer_types);
541 lilv_nodes_free(atom_supports);
543 error << string_compose(
544 "LV2: \"%1\" port %2 has no known data type",
545 lilv_node_as_string(_impl->name), i) << endmsg;
546 throw failed_constructor();
549 _port_flags.push_back(flags);
550 _port_minimumSize.push_back(minimumSize);
553 _control_data = new float[num_ports];
554 _shadow_data = new float[num_ports];
555 _defaults = new float[num_ports];
556 _ev_buffers = new LV2_Evbuf*[num_ports];
557 memset(_ev_buffers, 0, sizeof(LV2_Evbuf*) * num_ports);
559 const bool latent = lilv_plugin_has_latency(plugin);
560 const uint32_t latency_index = (latent)
561 ? lilv_plugin_get_latency_port_index(plugin)
564 // Build an array of pointers to special parameter buffers
565 void*** params = new void**[num_ports];
566 for (uint32_t i = 0; i < num_ports; ++i) {
569 _impl->designated_input (LV2_TIME__beatsPerMinute, params, (void**)&_bpm_control_port);
570 _impl->designated_input (LV2_CORE__freeWheeling, params, (void**)&_freewheel_control_port);
572 for (uint32_t i = 0; i < num_ports; ++i) {
573 const LilvPort* port = lilv_plugin_get_port_by_index(plugin, i);
574 const LilvNode* sym = lilv_port_get_symbol(plugin, port);
576 // Store index in map so we can look up index by symbol
577 _port_indices.insert(std::make_pair(lilv_node_as_string(sym), i));
579 // Get range and default value if applicable
580 if (parameter_is_control(i)) {
582 lilv_port_get_range(plugin, port, &def, NULL, NULL);
583 _defaults[i] = def ? lilv_node_as_float(def) : 0.0f;
584 if (lilv_port_has_property (plugin, port, _world.lv2_sampleRate)) {
585 _defaults[i] *= _session.frame_rate ();
589 lilv_instance_connect_port(_impl->instance, i, &_control_data[i]);
591 if (latent && i == latency_index) {
592 _latency_control_port = &_control_data[i];
593 *_latency_control_port = 0;
596 if (parameter_is_input(i)) {
597 _shadow_data[i] = default_value(i);
599 *params[i] = (void*)&_shadow_data[i];
609 LilvUIs* uis = lilv_plugin_get_uis(plugin);
610 if (lilv_uis_size(uis) > 0) {
612 // Look for embeddable UI
613 LILV_FOREACH(uis, u, uis) {
614 const LilvUI* this_ui = lilv_uis_get(uis, u);
615 const LilvNode* this_ui_type = NULL;
616 if (lilv_ui_is_supported(this_ui,
620 // TODO: Multiple UI support
622 _impl->ui_type = this_ui_type;
627 // Look for Gtk native UI
628 LILV_FOREACH(uis, i, uis) {
629 const LilvUI* ui = lilv_uis_get(uis, i);
630 if (lilv_ui_is_a(ui, _world.ui_GtkUI)) {
632 _impl->ui_type = _world.ui_GtkUI;
638 // If Gtk UI is not available, try to find external UI
640 LILV_FOREACH(uis, i, uis) {
641 const LilvUI* ui = lilv_uis_get(uis, i);
642 if (lilv_ui_is_a(ui, _world.ui_externalkx)) {
644 _impl->ui_type = _world.ui_external;
647 if (lilv_ui_is_a(ui, _world.ui_external)) {
649 _impl->ui_type = _world.ui_external;
655 load_supported_properties(_property_descriptors);
656 allocate_atom_event_buffers();
657 latency_compute_run();
661 LV2Plugin::set_block_size (pframes_t nframes)
663 #ifdef HAVE_LV2_1_2_0
664 if (_impl->opts_iface) {
665 LV2_URID atom_Int = _uri_map.uri_to_id(LV2_ATOM__Int);
666 _impl->block_length = nframes;
667 LV2_Options_Option block_size_option = {
668 LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id ("http://lv2plug.in/ns/ext/buf-size#nominalBlockLength"),
669 sizeof(int32_t), atom_Int, (void*)&_impl->block_length
671 _impl->opts_iface->set (_impl->instance->lv2_handle, &block_size_option);
677 LV2Plugin::~LV2Plugin ()
679 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 destroy\n", name()));
684 lilv_instance_free(_impl->instance);
685 lilv_node_free(_impl->name);
686 lilv_node_free(_impl->author);
687 free(_impl->options);
690 free(_make_path_feature.data);
691 free(_work_schedule_feature.data);
697 if (_atom_ev_buffers) {
698 LV2_Evbuf** b = _atom_ev_buffers;
703 free(_atom_ev_buffers);
706 delete [] _control_data;
707 delete [] _shadow_data;
709 delete [] _ev_buffers;
713 LV2Plugin::is_external_ui() const
718 return lilv_ui_is_a(_impl->ui, _world.ui_external) || lilv_ui_is_a(_impl->ui, _world.ui_externalkx);
722 LV2Plugin::is_external_kx() const
727 return lilv_ui_is_a(_impl->ui, _world.ui_externalkx);
731 LV2Plugin::ui_is_resizable () const
733 const LilvNode* s = lilv_ui_get_uri(_impl->ui);
734 LilvNode* p = lilv_new_uri(_world.world, LV2_CORE__optionalFeature);
735 LilvNode* fs = lilv_new_uri(_world.world, LV2_UI__fixedSize);
736 LilvNode* nrs = lilv_new_uri(_world.world, LV2_UI__noUserResize);
738 LilvNodes* fs_matches = lilv_world_find_nodes(_world.world, s, p, fs);
739 LilvNodes* nrs_matches = lilv_world_find_nodes(_world.world, s, p, nrs);
741 lilv_nodes_free(nrs_matches);
742 lilv_nodes_free(fs_matches);
747 return !fs_matches && !nrs_matches;
751 LV2Plugin::unique_id() const
753 return lilv_node_as_uri(lilv_plugin_get_uri(_impl->plugin));
757 LV2Plugin::uri() const
759 return lilv_node_as_uri(lilv_plugin_get_uri(_impl->plugin));
763 LV2Plugin::label() const
765 return lilv_node_as_string(_impl->name);
769 LV2Plugin::name() const
771 return lilv_node_as_string(_impl->name);
775 LV2Plugin::maker() const
777 return _impl->author ? lilv_node_as_string (_impl->author) : "Unknown";
781 LV2Plugin::num_ports() const
783 return lilv_plugin_get_num_ports(_impl->plugin);
787 LV2Plugin::parameter_count() const
789 return lilv_plugin_get_num_ports(_impl->plugin);
793 LV2Plugin::default_value(uint32_t port)
795 return _defaults[port];
799 LV2Plugin::port_symbol(uint32_t index) const
801 const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, index);
803 error << name() << ": Invalid port index " << index << endmsg;
806 const LilvNode* sym = lilv_port_get_symbol(_impl->plugin, port);
807 return lilv_node_as_string(sym);
811 LV2Plugin::port_index (const char* symbol) const
813 const map<string, uint32_t>::const_iterator i = _port_indices.find(symbol);
814 if (i != _port_indices.end()) {
817 warning << string_compose(_("LV2: Unknown port %1"), symbol) << endmsg;
823 LV2Plugin::set_parameter(uint32_t which, float val)
825 DEBUG_TRACE(DEBUG::LV2, string_compose(
826 "%1 set parameter %2 to %3\n", name(), which, val));
828 if (which < lilv_plugin_get_num_ports(_impl->plugin)) {
829 if (get_parameter (which) == val) {
833 _shadow_data[which] = val;
835 warning << string_compose(
836 _("Illegal parameter number used with plugin \"%1\". "
837 "This is a bug in either %2 or the LV2 plugin <%3>"),
838 name(), PROGRAM_NAME, unique_id()) << endmsg;
841 Plugin::set_parameter(which, val);
845 LV2Plugin::get_parameter(uint32_t which) const
847 if (parameter_is_input(which)) {
848 return (float)_shadow_data[which];
850 return (float)_control_data[which];
856 LV2Plugin::get_docs() const
858 LilvNodes* comments = lilv_plugin_get_value(_impl->plugin, _world.rdfs_comment);
860 const std::string docs(lilv_node_as_string(lilv_nodes_get_first(comments)));
861 lilv_nodes_free(comments);
869 LV2Plugin::get_parameter_docs(uint32_t which) const
871 LilvNodes* comments = lilv_port_get_value(
873 lilv_plugin_get_port_by_index(_impl->plugin, which),
874 _world.rdfs_comment);
877 const std::string docs(lilv_node_as_string(lilv_nodes_get_first(comments)));
878 lilv_nodes_free(comments);
886 LV2Plugin::nth_parameter(uint32_t n, bool& ok) const
889 for (uint32_t c = 0, x = 0; x < lilv_plugin_get_num_ports(_impl->plugin); ++x) {
890 if (parameter_is_control(x)) {
902 LV2Plugin::extension_data(const char* uri) const
904 return lilv_instance_get_extension_data(_impl->instance, uri);
908 LV2Plugin::c_plugin()
910 return _impl->plugin;
916 return (const void*)_impl->ui;
920 LV2Plugin::c_ui_type()
922 return (const void*)_impl->ui_type;
925 /** Directory for all plugin state. */
927 LV2Plugin::plugin_dir() const
929 return Glib::build_filename(_session.plugins_dir(), _insert_id.to_s());
932 /** Directory for files created by the plugin (except during save). */
934 LV2Plugin::scratch_dir() const
936 return Glib::build_filename(plugin_dir(), "scratch");
939 /** Directory for snapshots of files in the scratch directory. */
941 LV2Plugin::file_dir() const
943 return Glib::build_filename(plugin_dir(), "files");
946 /** Directory to save state snapshot version @c num into. */
948 LV2Plugin::state_dir(unsigned num) const
950 return Glib::build_filename(plugin_dir(), string_compose("state%1", num));
953 /** Implementation of state:makePath for files created at instantiation time.
954 * Note this is not used for files created at save time (Lilv deals with that).
957 LV2Plugin::lv2_state_make_path(LV2_State_Make_Path_Handle handle,
960 LV2Plugin* me = (LV2Plugin*)handle;
961 if (me->_insert_id == PBD::ID("0")) {
962 warning << string_compose(
963 "File path \"%1\" requested but LV2 %2 has no insert ID",
964 path, me->name()) << endmsg;
965 return g_strdup(path);
968 const std::string abs_path = Glib::build_filename(me->scratch_dir(), path);
969 const std::string dirname = Glib::path_get_dirname(abs_path);
970 g_mkdir_with_parents(dirname.c_str(), 0744);
972 DEBUG_TRACE(DEBUG::LV2, string_compose("new file path %1 => %2\n",
975 return g_strndup(abs_path.c_str(), abs_path.length());
979 LV2Plugin::add_state(XMLNode* root) const
981 assert(_insert_id != PBD::ID("0"));
985 LocaleGuard lg(X_("C"));
987 for (uint32_t i = 0; i < parameter_count(); ++i) {
988 if (parameter_is_input(i) && parameter_is_control(i)) {
989 child = new XMLNode("Port");
990 child->add_property("symbol", port_symbol(i));
991 snprintf(buf, sizeof(buf), "%+f", _shadow_data[i]);
992 child->add_property("value", string(buf));
993 root->add_child_nocopy(*child);
997 if (_has_state_interface) {
998 // Provisionally increment state version and create directory
999 const std::string new_dir = state_dir(++_state_version);
1000 g_mkdir_with_parents(new_dir.c_str(), 0744);
1002 LilvState* state = lilv_state_new_from_instance(
1005 _uri_map.urid_map(),
1006 scratch_dir().c_str(),
1008 _session.externals_dir().c_str(),
1011 const_cast<LV2Plugin*>(this),
1015 if (!_impl->state || !lilv_state_equals(state, _impl->state)) {
1016 lilv_state_save(_world.world,
1017 _uri_map.urid_map(),
1018 _uri_map.urid_unmap(),
1024 lilv_state_free(_impl->state);
1025 _impl->state = state;
1027 // State is identical, decrement version and nuke directory
1028 lilv_state_free(state);
1029 PBD::remove_directory(new_dir);
1033 root->add_property("state-dir", string_compose("state%1", _state_version));
1037 // TODO: Once we can rely on lilv 0.16.0, lilv_world_get can replace this
1039 get_value(LilvWorld* world, const LilvNode* subject, const LilvNode* predicate)
1041 LilvNodes* vs = lilv_world_find_nodes(world, subject, predicate, NULL);
1043 LilvNode* node = lilv_node_duplicate(lilv_nodes_get_first(vs));
1044 lilv_nodes_free(vs);
1051 LV2Plugin::find_presets()
1053 LilvNode* lv2_appliesTo = lilv_new_uri(_world.world, LV2_CORE__appliesTo);
1054 LilvNode* pset_Preset = lilv_new_uri(_world.world, LV2_PRESETS__Preset);
1055 LilvNode* rdfs_label = lilv_new_uri(_world.world, LILV_NS_RDFS "label");
1057 LilvNodes* presets = lilv_plugin_get_related(_impl->plugin, pset_Preset);
1058 LILV_FOREACH(nodes, i, presets) {
1059 const LilvNode* preset = lilv_nodes_get(presets, i);
1060 lilv_world_load_resource(_world.world, preset);
1061 LilvNode* name = get_value(_world.world, preset, rdfs_label);
1063 _presets.insert(std::make_pair(lilv_node_as_string(preset),
1064 Plugin::PresetRecord(
1065 lilv_node_as_string(preset),
1066 lilv_node_as_string(name))));
1067 lilv_node_free(name);
1069 warning << string_compose(
1070 _("Plugin \"%1\" preset \"%2\" is missing a label\n"),
1071 lilv_node_as_string(lilv_plugin_get_uri(_impl->plugin)),
1072 lilv_node_as_string(preset)) << endmsg;
1075 lilv_nodes_free(presets);
1077 lilv_node_free(rdfs_label);
1078 lilv_node_free(pset_Preset);
1079 lilv_node_free(lv2_appliesTo);
1083 set_port_value(const char* port_symbol,
1089 LV2Plugin* self = (LV2Plugin*)user_data;
1090 if (type != 0 && type != URIMap::instance().urids.atom_Float) {
1091 return; // TODO: Support non-float ports
1094 const uint32_t port_index = self->port_index(port_symbol);
1095 if (port_index != (uint32_t)-1) {
1096 self->set_parameter(port_index, *(const float*)value);
1101 LV2Plugin::load_preset(PresetRecord r)
1103 LilvWorld* world = _world.world;
1104 LilvNode* pset = lilv_new_uri(world, r.uri.c_str());
1105 LilvState* state = lilv_state_new_from_world(world, _uri_map.urid_map(), pset);
1108 lilv_state_restore(state, _impl->instance, set_port_value, this, 0, NULL);
1109 lilv_state_free(state);
1110 Plugin::load_preset(r);
1113 lilv_node_free(pset);
1118 ARDOUR::lv2plugin_get_port_value(const char* port_symbol,
1123 LV2Plugin *plugin = (LV2Plugin *) user_data;
1125 uint32_t index = plugin->port_index(port_symbol);
1126 if (index != (uint32_t) -1) {
1127 if (plugin->parameter_is_input(index) && plugin->parameter_is_control(index)) {
1129 *size = sizeof(float);
1130 *type = plugin->_uri_map.uri_to_id(LV2_ATOM__Float);
1131 value = &plugin->_shadow_data[index];
1143 LV2Plugin::do_save_preset(string name)
1145 LilvNode* plug_name = lilv_plugin_get_name(_impl->plugin);
1146 const string prefix = legalize_for_uri(lilv_node_as_string(plug_name));
1147 const string base_name = legalize_for_uri(name);
1148 const string file_name = base_name + ".ttl";
1149 const string bundle = Glib::build_filename(
1150 Glib::get_home_dir(),
1151 Glib::build_filename(".lv2", prefix + "_" + base_name + ".lv2"));
1153 #ifdef HAVE_LILV_0_21_3
1154 /* delete reference to old preset (if any) */
1155 const PresetRecord* r = preset_by_label(name);
1157 LilvNode* pset = lilv_new_uri (_world.world, r->uri.c_str());
1159 lilv_world_unload_resource (_world.world, pset);
1160 lilv_node_free(pset);
1165 LilvState* state = lilv_state_new_from_instance(
1168 _uri_map.urid_map(),
1169 scratch_dir().c_str(), // file_dir
1170 bundle.c_str(), // copy_dir
1171 bundle.c_str(), // link_dir
1172 bundle.c_str(), // save_dir
1173 lv2plugin_get_port_value, // get_value
1174 (void*)this, // user_data
1175 LV2_STATE_IS_POD|LV2_STATE_IS_PORTABLE, // flags
1176 _features // features
1179 lilv_state_set_label(state, name.c_str());
1181 _world.world, // world
1182 _uri_map.urid_map(), // map
1183 _uri_map.urid_unmap(), // unmap
1185 NULL, // uri (NULL = use file URI)
1186 bundle.c_str(), // dir
1187 file_name.c_str() // filename
1190 lilv_state_free(state);
1192 std::string uri = Glib::filename_to_uri(Glib::build_filename(bundle, file_name));
1193 LilvNode *node_bundle = lilv_new_uri(_world.world, Glib::filename_to_uri(Glib::build_filename(bundle, "/")).c_str());
1194 LilvNode *node_preset = lilv_new_uri(_world.world, uri.c_str());
1195 #ifdef HAVE_LILV_0_21_3
1196 lilv_world_unload_resource(_world.world, node_preset);
1197 lilv_world_unload_bundle(_world.world, node_bundle);
1199 lilv_world_load_bundle(_world.world, node_bundle);
1200 lilv_world_load_resource(_world.world, node_preset);
1201 lilv_node_free(node_bundle);
1202 lilv_node_free(node_preset);
1203 lilv_node_free(plug_name);
1208 LV2Plugin::do_remove_preset(string name)
1210 #ifdef HAVE_LILV_0_21_3
1211 /* Look up preset record by label (FIXME: ick, label as ID) */
1212 const PresetRecord* r = preset_by_label(name);
1217 /* Load a LilvState for the preset. */
1218 LilvWorld* world = _world.world;
1219 LilvNode* pset = lilv_new_uri(world, r->uri.c_str());
1220 LilvState* state = lilv_state_new_from_world(world, _uri_map.urid_map(), pset);
1222 lilv_node_free(pset);
1226 /* Unload preset from world. */
1227 lilv_world_unload_resource(world, pset);
1229 /* Delete it from the file system. This will remove the preset file and the entry
1230 from the manifest. If this results in an empty manifest (i.e. the
1231 preset is the only thing in the bundle), then the bundle is removed. */
1232 lilv_state_delete(world, state);
1234 lilv_state_free(state);
1235 lilv_node_free(pset);
1237 /* Without lilv_state_delete(), we could delete the preset file, but this
1238 would leave a broken bundle/manifest around, so the preset would still
1239 be visible, but broken. Naively deleting a bundle is too dangerous, so
1240 we simply do not support preset deletion with older Lilv */
1244 LV2Plugin::has_editor() const
1246 return _impl->ui != NULL;
1250 LV2Plugin::has_message_output() const
1252 for (uint32_t i = 0; i < num_ports(); ++i) {
1253 if ((_port_flags[i] & PORT_SEQUENCE) &&
1254 (_port_flags[i] & PORT_OUTPUT)) {
1262 LV2Plugin::write_to(RingBuffer<uint8_t>* dest,
1266 const uint8_t* body)
1268 const uint32_t buf_size = sizeof(UIMessage) + size;
1269 vector<uint8_t> buf(buf_size);
1271 UIMessage* msg = (UIMessage*)&buf[0];
1273 msg->protocol = protocol;
1275 memcpy(msg + 1, body, size);
1277 return (dest->write(&buf[0], buf_size) == buf_size);
1281 LV2Plugin::write_from_ui(uint32_t index,
1284 const uint8_t* body)
1287 size_t rbs = _session.engine().raw_buffer_size(DataType::MIDI) * NBUFS;
1288 /* buffer data communication from plugin UI to plugin instance.
1289 * this buffer needs to potentially hold
1290 * (port's minimumSize) * (audio-periods) / (UI-periods)
1293 * e.g 48kSPS / 128fpp -> audio-periods = 375 Hz
1294 * ui-periods = 25 Hz (SuperRapidScreenUpdate)
1295 * default minimumSize = 32K (see LV2Plugin::allocate_atom_event_buffers()
1297 * it is NOT safe to overflow (msg.size will be misinterpreted)
1299 uint32_t bufsiz = 32768;
1300 if (_atom_ev_buffers && _atom_ev_buffers[0]) {
1301 bufsiz = lv2_evbuf_get_capacity(_atom_ev_buffers[0]);
1303 rbs = max((size_t) bufsiz * 8, rbs);
1304 _from_ui = new RingBuffer<uint8_t>(rbs);
1307 if (!write_to(_from_ui, index, protocol, size, body)) {
1308 error << "Error writing from UI to plugin" << endmsg;
1315 LV2Plugin::write_to_ui(uint32_t index,
1318 const uint8_t* body)
1320 if (!write_to(_to_ui, index, protocol, size, body)) {
1321 error << "Error writing from plugin to UI" << endmsg;
1328 forge_variant(LV2_Atom_Forge* forge, const Variant& value)
1330 switch (value.type()) {
1331 case Variant::NOTHING:
1333 case Variant::BEATS:
1334 // No atom type for this, just forge a double
1335 lv2_atom_forge_double(forge, value.get_beats().to_double());
1338 lv2_atom_forge_bool(forge, value.get_bool());
1340 case Variant::DOUBLE:
1341 lv2_atom_forge_double(forge, value.get_double());
1343 case Variant::FLOAT:
1344 lv2_atom_forge_float(forge, value.get_float());
1347 lv2_atom_forge_int(forge, value.get_int());
1350 lv2_atom_forge_long(forge, value.get_long());
1353 lv2_atom_forge_path(
1354 forge, value.get_path().c_str(), value.get_path().size());
1356 case Variant::STRING:
1357 lv2_atom_forge_string(
1358 forge, value.get_string().c_str(), value.get_string().size());
1362 forge, value.get_uri().c_str(), value.get_uri().size());
1367 /** Get a variant type from a URI, return false iff no match found. */
1369 uri_to_variant_type(const std::string& uri, Variant::Type& type)
1371 if (uri == LV2_ATOM__Bool) {
1372 type = Variant::BOOL;
1373 } else if (uri == LV2_ATOM__Double) {
1374 type = Variant::DOUBLE;
1375 } else if (uri == LV2_ATOM__Float) {
1376 type = Variant::FLOAT;
1377 } else if (uri == LV2_ATOM__Int) {
1378 type = Variant::INT;
1379 } else if (uri == LV2_ATOM__Long) {
1380 type = Variant::LONG;
1381 } else if (uri == LV2_ATOM__Path) {
1382 type = Variant::PATH;
1383 } else if (uri == LV2_ATOM__String) {
1384 type = Variant::STRING;
1385 } else if (uri == LV2_ATOM__URI) {
1386 type = Variant::URI;
1394 LV2Plugin::set_property(uint32_t key, const Variant& value)
1396 if (_patch_port_in_index == (uint32_t)-1) {
1397 error << "LV2: set_property called with unset patch_port_in_index" << endmsg;
1399 } else if (value.type() == Variant::NOTHING) {
1400 error << "LV2: set_property called with void value" << endmsg;
1404 // Set up forge to write to temporary buffer on the stack
1405 LV2_Atom_Forge* forge = &_impl->ui_forge;
1406 LV2_Atom_Forge_Frame frame;
1407 uint8_t buf[PATH_MAX]; // Ought to be enough for anyone...
1409 lv2_atom_forge_set_buffer(forge, buf, sizeof(buf));
1411 // Serialize patch:Set message to set property
1412 #ifdef HAVE_LV2_1_10_0
1413 lv2_atom_forge_object(forge, &frame, 1, _uri_map.urids.patch_Set);
1414 lv2_atom_forge_key(forge, _uri_map.urids.patch_property);
1415 lv2_atom_forge_urid(forge, key);
1416 lv2_atom_forge_key(forge, _uri_map.urids.patch_value);
1418 lv2_atom_forge_blank(forge, &frame, 1, _uri_map.urids.patch_Set);
1419 lv2_atom_forge_property_head(forge, _uri_map.urids.patch_property, 0);
1420 lv2_atom_forge_urid(forge, key);
1421 lv2_atom_forge_property_head(forge, _uri_map.urids.patch_value, 0);
1424 forge_variant(forge, value);
1426 // Write message to UI=>Plugin ring
1427 const LV2_Atom* const atom = (const LV2_Atom*)buf;
1428 write_from_ui(_patch_port_in_index,
1429 _uri_map.urids.atom_eventTransfer,
1430 lv2_atom_total_size(atom),
1431 (const uint8_t*)atom);
1434 const ParameterDescriptor&
1435 LV2Plugin::get_property_descriptor(uint32_t id) const
1437 PropertyDescriptors::const_iterator p = _property_descriptors.find(id);
1438 if (p != _property_descriptors.end()) {
1441 return Plugin::get_property_descriptor(id);
1445 load_parameter_descriptor_units(LilvWorld* lworld, ParameterDescriptor& desc, const LilvNodes* units)
1447 if (lilv_nodes_contains(units, _world.units_midiNote)) {
1448 desc.unit = ParameterDescriptor::MIDI_NOTE;
1449 } else if (lilv_nodes_contains(units, _world.units_db)) {
1450 desc.unit = ParameterDescriptor::DB;
1451 } else if (lilv_nodes_contains(units, _world.units_hz)) {
1452 desc.unit = ParameterDescriptor::HZ;
1454 if (lilv_nodes_size(units) > 0) {
1455 const LilvNode* unit = lilv_nodes_get_first(units);
1456 LilvNode* render = get_value(lworld, unit, _world.units_render);
1458 desc.print_fmt = lilv_node_as_string(render);
1459 lilv_node_free(render);
1465 load_parameter_descriptor(LV2World& world,
1466 ParameterDescriptor& desc,
1467 Variant::Type datatype,
1468 const LilvNode* subject)
1470 LilvWorld* lworld = _world.world;
1471 LilvNode* label = get_value(lworld, subject, _world.rdfs_label);
1472 LilvNode* def = get_value(lworld, subject, _world.lv2_default);
1473 LilvNode* minimum = get_value(lworld, subject, _world.lv2_minimum);
1474 LilvNode* maximum = get_value(lworld, subject, _world.lv2_maximum);
1475 LilvNodes* units = lilv_world_find_nodes(lworld, subject, _world.units_unit, NULL);
1477 desc.label = lilv_node_as_string(label);
1479 if (def && lilv_node_is_float(def)) {
1480 desc.normal = lilv_node_as_float(def);
1482 if (minimum && lilv_node_is_float(minimum)) {
1483 desc.lower = lilv_node_as_float(minimum);
1485 if (maximum && lilv_node_is_float(maximum)) {
1486 desc.upper = lilv_node_as_float(maximum);
1488 load_parameter_descriptor_units(lworld, desc, units);
1489 desc.datatype = datatype;
1490 desc.toggled |= datatype == Variant::BOOL;
1491 desc.integer_step |= datatype == Variant::INT || datatype == Variant::LONG;
1492 desc.update_steps();
1494 lilv_nodes_free(units);
1495 lilv_node_free(label);
1496 lilv_node_free(def);
1497 lilv_node_free(minimum);
1498 lilv_node_free(maximum);
1502 LV2Plugin::load_supported_properties(PropertyDescriptors& descs)
1504 LilvWorld* lworld = _world.world;
1505 const LilvNode* subject = lilv_plugin_get_uri(_impl->plugin);
1506 LilvNodes* properties = lilv_world_find_nodes(
1507 lworld, subject, _world.patch_writable, NULL);
1508 LILV_FOREACH(nodes, p, properties) {
1509 // Get label and range
1510 const LilvNode* prop = lilv_nodes_get(properties, p);
1511 LilvNode* range = get_value(lworld, prop, _world.rdfs_range);
1513 warning << string_compose(_("LV2: property <%1> has no range datatype, ignoring"),
1514 lilv_node_as_uri(prop)) << endmsg;
1518 // Convert range to variant type (TODO: support for multiple range types)
1519 Variant::Type datatype;
1520 if (!uri_to_variant_type(lilv_node_as_uri(range), datatype)) {
1521 error << string_compose(_("LV2: property <%1> has unsupported datatype <%1>"),
1522 lilv_node_as_uri(prop), lilv_node_as_uri(range)) << endmsg;
1526 // Add description to result
1527 ParameterDescriptor desc;
1528 desc.key = _uri_map.uri_to_id(lilv_node_as_uri(prop));
1529 desc.datatype = datatype;
1530 load_parameter_descriptor(_world, desc, datatype, prop);
1531 descs.insert(std::make_pair(desc.key, desc));
1533 lilv_node_free(range);
1535 lilv_nodes_free(properties);
1539 LV2Plugin::announce_property_values()
1541 if (_patch_port_in_index == (uint32_t)-1) {
1545 // Set up forge to write to temporary buffer on the stack
1546 LV2_Atom_Forge* forge = &_impl->ui_forge;
1547 LV2_Atom_Forge_Frame frame;
1548 uint8_t buf[PATH_MAX]; // Ought to be enough for anyone...
1550 lv2_atom_forge_set_buffer(forge, buf, sizeof(buf));
1552 // Serialize patch:Get message with no subject (implicitly plugin instance)
1553 #ifdef HAVE_LV2_1_10_0
1554 lv2_atom_forge_object(forge, &frame, 1, _uri_map.urids.patch_Get);
1556 lv2_atom_forge_blank(forge, &frame, 1, _uri_map.urids.patch_Get);
1559 // Write message to UI=>Plugin ring
1560 const LV2_Atom* const atom = (const LV2_Atom*)buf;
1561 write_from_ui(_patch_port_in_index,
1562 _uri_map.urids.atom_eventTransfer,
1563 lv2_atom_total_size(atom),
1564 (const uint8_t*)atom);
1568 LV2Plugin::enable_ui_emission()
1571 /* see note in LV2Plugin::write_from_ui() */
1572 uint32_t bufsiz = 32768;
1573 if (_atom_ev_buffers && _atom_ev_buffers[0]) {
1574 bufsiz = lv2_evbuf_get_capacity(_atom_ev_buffers[0]);
1576 size_t rbs = _session.engine().raw_buffer_size(DataType::MIDI) * NBUFS;
1577 rbs = max((size_t) bufsiz * 8, rbs);
1578 _to_ui = new RingBuffer<uint8_t>(rbs);
1583 LV2Plugin::emit_to_ui(void* controller, UIMessageSink sink)
1589 uint32_t read_space = _to_ui->read_space();
1590 while (read_space > sizeof(UIMessage)) {
1592 if (_to_ui->read((uint8_t*)&msg, sizeof(msg)) != sizeof(msg)) {
1593 error << "Error reading from Plugin=>UI RingBuffer" << endmsg;
1596 vector<uint8_t> body(msg.size);
1597 if (_to_ui->read(&body[0], msg.size) != msg.size) {
1598 error << "Error reading from Plugin=>UI RingBuffer" << endmsg;
1602 sink(controller, msg.index, msg.size, msg.protocol, &body[0]);
1604 read_space -= sizeof(msg) + msg.size;
1609 LV2Plugin::work(uint32_t size, const void* data)
1611 return _impl->work_iface->work(
1612 _impl->instance->lv2_handle, work_respond, this, size, data);
1616 LV2Plugin::work_response(uint32_t size, const void* data)
1618 return _impl->work_iface->work_response(
1619 _impl->instance->lv2_handle, size, data);
1623 LV2Plugin::set_insert_id(PBD::ID id)
1629 LV2Plugin::set_state(const XMLNode& node, int version)
1632 const XMLProperty* prop;
1633 XMLNodeConstIterator iter;
1638 LocaleGuard lg(X_("C"));
1640 if (node.name() != state_node_name()) {
1641 error << _("Bad node sent to LV2Plugin::set_state") << endmsg;
1645 #ifndef NO_PLUGIN_STATE
1647 if (version < 3000) {
1648 nodes = node.children("port");
1650 nodes = node.children("Port");
1653 for (iter = nodes.begin(); iter != nodes.end(); ++iter) {
1657 if ((prop = child->property("symbol")) != 0) {
1658 sym = prop->value().c_str();
1660 warning << _("LV2: port has no symbol, ignored") << endmsg;
1664 map<string, uint32_t>::iterator i = _port_indices.find(sym);
1666 if (i != _port_indices.end()) {
1667 port_id = i->second;
1669 warning << _("LV2: port has unknown index, ignored") << endmsg;
1673 if ((prop = child->property("value")) != 0) {
1674 value = prop->value().c_str();
1676 warning << _("LV2: port has no value, ignored") << endmsg;
1680 set_parameter(port_id, atof(value));
1684 if ((prop = node.property("state-dir")) != 0) {
1685 if (sscanf(prop->value().c_str(), "state%u", &_state_version) != 1) {
1686 error << string_compose(
1687 "LV2: failed to parse state version from \"%1\"",
1688 prop->value()) << endmsg;
1691 std::string state_file = Glib::build_filename(
1693 Glib::build_filename(prop->value(), "state.ttl"));
1695 LilvState* state = lilv_state_new_from_file(
1696 _world.world, _uri_map.urid_map(), NULL, state_file.c_str());
1698 lilv_state_restore(state, _impl->instance, NULL, NULL, 0, NULL);
1701 latency_compute_run();
1704 return Plugin::set_state(node, version);
1708 LV2Plugin::get_parameter_descriptor(uint32_t which, ParameterDescriptor& desc) const
1710 const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, which);
1712 error << string_compose("LV2: get descriptor of non-existent port %1", which)
1717 LilvNodes* portunits;
1718 LilvNode *def, *min, *max;
1719 lilv_port_get_range(_impl->plugin, port, &def, &min, &max);
1720 portunits = lilv_port_get_value(_impl->plugin, port, _world.units_unit);
1722 // TODO: Once we can rely on lilv 0.18.0 being present,
1723 // load_parameter_descriptor() can be used for ports as well
1724 desc.integer_step = lilv_port_has_property(_impl->plugin, port, _world.lv2_integer);
1725 desc.toggled = lilv_port_has_property(_impl->plugin, port, _world.lv2_toggled);
1726 desc.logarithmic = lilv_port_has_property(_impl->plugin, port, _world.ext_logarithmic);
1727 desc.sr_dependent = lilv_port_has_property(_impl->plugin, port, _world.lv2_sampleRate);
1728 desc.label = lilv_node_as_string(lilv_port_get_name(_impl->plugin, port));
1729 desc.normal = def ? lilv_node_as_float(def) : 0.0f;
1730 desc.lower = min ? lilv_node_as_float(min) : 0.0f;
1731 desc.upper = max ? lilv_node_as_float(max) : 1.0f;
1732 load_parameter_descriptor_units(_world.world, desc, portunits);
1734 if (desc.sr_dependent) {
1735 desc.lower *= _session.frame_rate ();
1736 desc.upper *= _session.frame_rate ();
1739 desc.min_unbound = false; // TODO: LV2 extension required
1740 desc.max_unbound = false; // TODO: LV2 extension required
1742 desc.enumeration = lilv_port_has_property(_impl->plugin, port, _world.lv2_enumeration);
1743 desc.scale_points = get_scale_points(which);
1745 desc.update_steps();
1747 lilv_node_free(def);
1748 lilv_node_free(min);
1749 lilv_node_free(max);
1750 lilv_nodes_free(portunits);
1756 LV2Plugin::describe_parameter(Evoral::Parameter which)
1758 if (( which.type() == PluginAutomation) && ( which.id() < parameter_count()) ) {
1760 if (lilv_port_has_property(_impl->plugin,
1761 lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.ext_notOnGUI)) {
1762 return X_("hidden");
1765 if (lilv_port_has_property(_impl->plugin,
1766 lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.lv2_freewheeling)) {
1767 return X_("hidden");
1770 if (lilv_port_has_property(_impl->plugin,
1771 lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.lv2_reportsLatency)) {
1772 return X_("latency");
1775 LilvNode* name = lilv_port_get_name(_impl->plugin,
1776 lilv_plugin_get_port_by_index(_impl->plugin, which.id()));
1777 string ret(lilv_node_as_string(name));
1778 lilv_node_free(name);
1786 LV2Plugin::signal_latency() const
1788 if (_latency_control_port) {
1789 return (framecnt_t)floor(*_latency_control_port);
1795 set<Evoral::Parameter>
1796 LV2Plugin::automatable() const
1798 set<Evoral::Parameter> ret;
1800 for (uint32_t i = 0; i < parameter_count(); ++i) {
1801 if (parameter_is_input(i) && parameter_is_control(i)) {
1802 ret.insert(ret.end(), Evoral::Parameter(PluginAutomation, 0, i));
1806 for (PropertyDescriptors::const_iterator p = _property_descriptors.begin();
1807 p != _property_descriptors.end();
1809 ret.insert(ret.end(), Evoral::Parameter(PluginPropertyAutomation, 0, p->first));
1815 LV2Plugin::activate()
1817 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 activate\n", name()));
1819 if (!_was_activated) {
1820 lilv_instance_activate(_impl->instance);
1821 _was_activated = true;
1826 LV2Plugin::deactivate()
1828 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 deactivate\n", name()));
1830 if (_was_activated) {
1831 lilv_instance_deactivate(_impl->instance);
1832 _was_activated = false;
1837 LV2Plugin::cleanup()
1839 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 cleanup\n", name()));
1843 lilv_instance_free(_impl->instance);
1844 _impl->instance = NULL;
1848 LV2Plugin::allocate_atom_event_buffers()
1850 /* reserve local scratch buffers for ATOM event-queues */
1851 const LilvPlugin* p = _impl->plugin;
1853 /* count non-MIDI atom event-ports
1854 * TODO: nicely ask drobilla to make a lilv_ call for that
1856 int count_atom_out = 0;
1857 int count_atom_in = 0;
1858 int minimumSize = 32768; // TODO use a per-port minimum-size
1859 for (uint32_t i = 0; i < lilv_plugin_get_num_ports(p); ++i) {
1860 const LilvPort* port = lilv_plugin_get_port_by_index(p, i);
1861 if (lilv_port_is_a(p, port, _world.atom_AtomPort)) {
1862 LilvNodes* buffer_types = lilv_port_get_value(
1863 p, port, _world.atom_bufferType);
1864 LilvNodes* atom_supports = lilv_port_get_value(
1865 p, port, _world.atom_supports);
1867 if (!lilv_nodes_contains(buffer_types, _world.atom_Sequence)
1868 || !lilv_nodes_contains(atom_supports, _world.midi_MidiEvent)) {
1869 if (lilv_port_is_a(p, port, _world.lv2_InputPort)) {
1872 if (lilv_port_is_a(p, port, _world.lv2_OutputPort)) {
1875 LilvNodes* min_size_v = lilv_port_get_value(_impl->plugin, port, _world.rsz_minimumSize);
1876 LilvNode* min_size = min_size_v ? lilv_nodes_get_first(min_size_v) : NULL;
1877 if (min_size && lilv_node_is_int(min_size)) {
1878 minimumSize = std::max(minimumSize, lilv_node_as_int(min_size));
1880 lilv_nodes_free(min_size_v);
1882 lilv_nodes_free(buffer_types);
1883 lilv_nodes_free(atom_supports);
1887 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 need buffers for %2 atom-in and %3 atom-out event-ports\n",
1888 name(), count_atom_in, count_atom_out));
1890 const int total_atom_buffers = (count_atom_in + count_atom_out);
1891 if (_atom_ev_buffers || total_atom_buffers == 0) {
1895 DEBUG_TRACE(DEBUG::LV2, string_compose("allocate %1 atom_ev_buffers of %d bytes\n", total_atom_buffers, minimumSize));
1896 _atom_ev_buffers = (LV2_Evbuf**) malloc((total_atom_buffers + 1) * sizeof(LV2_Evbuf*));
1897 for (int i = 0; i < total_atom_buffers; ++i ) {
1898 _atom_ev_buffers[i] = lv2_evbuf_new(minimumSize, LV2_EVBUF_ATOM,
1899 _uri_map.urids.atom_Chunk, _uri_map.urids.atom_Sequence);
1901 _atom_ev_buffers[total_atom_buffers] = 0;
1905 /** Write an ardour position/time/tempo/meter as an LV2 event.
1906 * @return true on success.
1909 write_position(LV2_Atom_Forge* forge,
1911 const TempoMetric& t,
1912 Timecode::BBT_Time& bbt,
1914 framepos_t position,
1917 const URIMap::URIDs& urids = URIMap::instance().urids;
1919 uint8_t pos_buf[256];
1920 lv2_atom_forge_set_buffer(forge, pos_buf, sizeof(pos_buf));
1921 LV2_Atom_Forge_Frame frame;
1922 #ifdef HAVE_LV2_1_10_0
1923 lv2_atom_forge_object(forge, &frame, 1, urids.time_Position);
1924 lv2_atom_forge_key(forge, urids.time_frame);
1925 lv2_atom_forge_long(forge, position);
1926 lv2_atom_forge_key(forge, urids.time_speed);
1927 lv2_atom_forge_float(forge, speed);
1928 lv2_atom_forge_key(forge, urids.time_barBeat);
1929 lv2_atom_forge_float(forge, bbt.beats - 1 +
1930 (bbt.ticks / Timecode::BBT_Time::ticks_per_beat));
1931 lv2_atom_forge_key(forge, urids.time_bar);
1932 lv2_atom_forge_long(forge, bbt.bars - 1);
1933 lv2_atom_forge_key(forge, urids.time_beatUnit);
1934 lv2_atom_forge_int(forge, t.meter().note_divisor());
1935 lv2_atom_forge_key(forge, urids.time_beatsPerBar);
1936 lv2_atom_forge_float(forge, t.meter().divisions_per_bar());
1937 lv2_atom_forge_key(forge, urids.time_beatsPerMinute);
1938 lv2_atom_forge_float(forge, t.tempo().beats_per_minute());
1940 lv2_atom_forge_blank(forge, &frame, 1, urids.time_Position);
1941 lv2_atom_forge_property_head(forge, urids.time_frame, 0);
1942 lv2_atom_forge_long(forge, position);
1943 lv2_atom_forge_property_head(forge, urids.time_speed, 0);
1944 lv2_atom_forge_float(forge, speed);
1945 lv2_atom_forge_property_head(forge, urids.time_barBeat, 0);
1946 lv2_atom_forge_float(forge, bbt.beats - 1 +
1947 (bbt.ticks / Timecode::BBT_Time::ticks_per_beat));
1948 lv2_atom_forge_property_head(forge, urids.time_bar, 0);
1949 lv2_atom_forge_long(forge, bbt.bars - 1);
1950 lv2_atom_forge_property_head(forge, urids.time_beatUnit, 0);
1951 lv2_atom_forge_int(forge, t.meter().note_divisor());
1952 lv2_atom_forge_property_head(forge, urids.time_beatsPerBar, 0);
1953 lv2_atom_forge_float(forge, t.meter().divisions_per_bar());
1954 lv2_atom_forge_property_head(forge, urids.time_beatsPerMinute, 0);
1955 lv2_atom_forge_float(forge, t.tempo().beats_per_minute());
1958 LV2_Evbuf_Iterator end = lv2_evbuf_end(buf);
1959 const LV2_Atom* const atom = (const LV2_Atom*)pos_buf;
1960 return lv2_evbuf_write(&end, offset, 0, atom->type, atom->size,
1961 (const uint8_t*)(atom + 1));
1965 LV2Plugin::connect_and_run(BufferSet& bufs,
1966 ChanMapping in_map, ChanMapping out_map,
1967 pframes_t nframes, framecnt_t offset)
1969 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 run %2 offset %3\n", name(), nframes, offset));
1970 Plugin::connect_and_run(bufs, in_map, out_map, nframes, offset);
1972 cycles_t then = get_cycles();
1974 TempoMap& tmap = _session.tempo_map();
1975 Metrics::const_iterator metric_i = tmap.metrics_end();
1976 TempoMetric tmetric = tmap.metric_at(_session.transport_frame(), &metric_i);
1978 if (_freewheel_control_port) {
1979 *_freewheel_control_port = _session.engine().freewheeling() ? 1.f : 0.f;
1982 if (_bpm_control_port) {
1983 *_bpm_control_port = tmetric.tempo().beats_per_minute();
1986 ChanCount bufs_count;
1987 bufs_count.set(DataType::AUDIO, 1);
1988 bufs_count.set(DataType::MIDI, 1);
1989 BufferSet& silent_bufs = _session.get_silent_buffers(bufs_count);
1990 BufferSet& scratch_bufs = _session.get_scratch_buffers(bufs_count);
1991 uint32_t const num_ports = parameter_count();
1992 uint32_t const nil_index = std::numeric_limits<uint32_t>::max();
1994 uint32_t audio_in_index = 0;
1995 uint32_t audio_out_index = 0;
1996 uint32_t midi_in_index = 0;
1997 uint32_t midi_out_index = 0;
1998 uint32_t atom_port_index = 0;
1999 for (uint32_t port_index = 0; port_index < num_ports; ++port_index) {
2001 uint32_t index = nil_index;
2002 PortFlags flags = _port_flags[port_index];
2004 if (flags & PORT_AUDIO) {
2005 if (flags & PORT_INPUT) {
2006 index = in_map.get(DataType::AUDIO, audio_in_index++, &valid);
2008 ? bufs.get_audio(index).data(offset)
2009 : silent_bufs.get_audio(0).data(offset);
2011 index = out_map.get(DataType::AUDIO, audio_out_index++, &valid);
2013 ? bufs.get_audio(index).data(offset)
2014 : scratch_bufs.get_audio(0).data(offset);
2016 } else if (flags & (PORT_EVENT|PORT_SEQUENCE)) {
2017 /* FIXME: The checks here for bufs.count().n_midi() > index shouldn't
2018 be necessary, but the mapping is illegal in some cases. Ideally
2019 that should be fixed, but this is easier...
2021 if (flags & PORT_MIDI) {
2022 if (flags & PORT_INPUT) {
2023 index = in_map.get(DataType::MIDI, midi_in_index++, &valid);
2025 index = out_map.get(DataType::MIDI, midi_out_index++, &valid);
2027 if (valid && bufs.count().n_midi() > index) {
2028 /* Note, ensure_lv2_bufsize() is not RT safe!
2029 * However free()/alloc() is only called if a
2030 * plugin requires a rsz:minimumSize buffersize
2031 * and the existing buffer if smaller.
2033 bufs.ensure_lv2_bufsize((flags & PORT_INPUT), index, _port_minimumSize[port_index]);
2034 _ev_buffers[port_index] = bufs.get_lv2_midi(
2035 (flags & PORT_INPUT), index, (flags & PORT_EVENT));
2037 } else if ((flags & PORT_POSITION) && (flags & PORT_INPUT)) {
2038 lv2_evbuf_reset(_atom_ev_buffers[atom_port_index], true);
2039 _ev_buffers[port_index] = _atom_ev_buffers[atom_port_index++];
2043 if (valid && (flags & PORT_INPUT)) {
2044 Timecode::BBT_Time bbt;
2045 if ((flags & PORT_POSITION)) {
2046 if (_session.transport_frame() != _next_cycle_start ||
2047 _session.transport_speed() != _next_cycle_speed) {
2048 // Transport has changed, write position at cycle start
2049 tmap.bbt_time(_session.transport_frame(), bbt);
2050 write_position(&_impl->forge, _ev_buffers[port_index],
2051 tmetric, bbt, _session.transport_speed(),
2052 _session.transport_frame(), 0);
2056 // Get MIDI iterator range (empty range if no MIDI)
2057 MidiBuffer::iterator m = (index != nil_index)
2058 ? bufs.get_midi(index).begin()
2059 : silent_bufs.get_midi(0).end();
2060 MidiBuffer::iterator m_end = (index != nil_index)
2061 ? bufs.get_midi(index).end()
2064 // Now merge MIDI and any transport events into the buffer
2065 const uint32_t type = _uri_map.urids.midi_MidiEvent;
2066 const framepos_t tend = _session.transport_frame() + nframes;
2068 while (m != m_end || (metric_i != tmap.metrics_end() &&
2069 (*metric_i)->frame() < tend)) {
2070 MetricSection* metric = (metric_i != tmap.metrics_end())
2072 if (m != m_end && (!metric || metric->frame() > (*m).time())) {
2073 const Evoral::MIDIEvent<framepos_t> ev(*m, false);
2074 LV2_Evbuf_Iterator eend = lv2_evbuf_end(_ev_buffers[port_index]);
2075 lv2_evbuf_write(&eend, ev.time(), 0, type, ev.size(), ev.buffer());
2078 tmetric.set_metric(metric);
2079 bbt = metric->start();
2080 write_position(&_impl->forge, _ev_buffers[port_index],
2081 tmetric, bbt, _session.transport_speed(),
2083 metric->frame() - _session.transport_frame());
2087 } else if (!valid) {
2088 // Nothing we understand or care about, connect to scratch
2089 // see note for midi-buffer size above
2090 scratch_bufs.ensure_lv2_bufsize((flags & PORT_INPUT),
2091 0, _port_minimumSize[port_index]);
2092 _ev_buffers[port_index] = scratch_bufs.get_lv2_midi(
2093 (flags & PORT_INPUT), 0, (flags & PORT_EVENT));
2096 buf = lv2_evbuf_get_buffer(_ev_buffers[port_index]);
2098 continue; // Control port, leave buffer alone
2100 lilv_instance_connect_port(_impl->instance, port_index, buf);
2103 // Read messages from UI and push into appropriate buffers
2105 uint32_t read_space = _from_ui->read_space();
2106 while (read_space > sizeof(UIMessage)) {
2108 if (_from_ui->read((uint8_t*)&msg, sizeof(msg)) != sizeof(msg)) {
2109 error << "Error reading from UI=>Plugin RingBuffer" << endmsg;
2112 vector<uint8_t> body(msg.size);
2113 if (_from_ui->read(&body[0], msg.size) != msg.size) {
2114 error << "Error reading from UI=>Plugin RingBuffer" << endmsg;
2117 if (msg.protocol == URIMap::instance().urids.atom_eventTransfer) {
2118 LV2_Evbuf* buf = _ev_buffers[msg.index];
2119 LV2_Evbuf_Iterator i = lv2_evbuf_end(buf);
2120 const LV2_Atom* const atom = (const LV2_Atom*)&body[0];
2121 if (!lv2_evbuf_write(&i, nframes - 1, 0, atom->type, atom->size,
2122 (const uint8_t*)(atom + 1))) {
2123 error << "Failed to write data to LV2 event buffer\n";
2126 error << "Received unknown message type from UI" << endmsg;
2128 read_space -= sizeof(UIMessage) + msg.size;
2135 for (uint32_t port_index = 0; port_index < num_ports; ++port_index) {
2136 PortFlags flags = _port_flags[port_index];
2139 /* TODO ask drobilla about comment
2140 * "Make Ardour event buffers generic so plugins can communicate"
2141 * in libs/ardour/buffer_set.cc:310
2143 * ideally the user could choose which of the following two modes
2144 * to use (e.g. instrument/effect chains MIDI OUT vs MIDI TRHU).
2146 * This implementation follows the discussion on IRC Mar 16 2013 16:47 UTC
2147 * 16:51 < drobilla> rgareus: [..] i.e always replace with MIDI output [of LV2 plugin] if it's there
2148 * 16:52 < drobilla> rgareus: That would probably be good enough [..] to make users not complain
2149 * for quite a while at least ;)
2151 // copy output of LV2 plugin's MIDI port to Ardour MIDI buffers -- MIDI OUT
2152 if ((flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE|PORT_MIDI))) {
2153 const uint32_t buf_index = out_map.get(
2154 DataType::MIDI, midi_out_index++, &valid);
2156 bufs.forward_lv2_midi(_ev_buffers[port_index], buf_index);
2159 // Flush MIDI (write back to Ardour MIDI buffers) -- MIDI THRU
2160 else if ((flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE))) {
2161 const uint32_t buf_index = out_map.get(
2162 DataType::MIDI, midi_out_index++, &valid);
2164 bufs.flush_lv2_midi(true, buf_index);
2169 // Write messages to UI
2170 if ((_to_ui || _patch_port_out_index != (uint32_t)-1) &&
2171 (flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE))) {
2172 LV2_Evbuf* buf = _ev_buffers[port_index];
2173 for (LV2_Evbuf_Iterator i = lv2_evbuf_begin(buf);
2174 lv2_evbuf_is_valid(i);
2175 i = lv2_evbuf_next(i)) {
2176 uint32_t frames, subframes, type, size;
2178 lv2_evbuf_get(i, &frames, &subframes, &type, &size, &data);
2180 // Intercept patch change messages to emit PropertyChanged signal
2181 if ((flags & PORT_PATCHMSG)) {
2182 LV2_Atom* atom = (LV2_Atom*)(data - sizeof(LV2_Atom));
2183 if (atom->type == _uri_map.urids.atom_Blank ||
2184 atom->type == _uri_map.urids.atom_Object) {
2185 LV2_Atom_Object* obj = (LV2_Atom_Object*)atom;
2186 if (obj->body.otype == _uri_map.urids.patch_Set) {
2187 const LV2_Atom* property = NULL;
2188 const LV2_Atom* value = NULL;
2189 lv2_atom_object_get(obj,
2190 _uri_map.urids.patch_property, &property,
2191 _uri_map.urids.patch_value, &value,
2194 if (!property || !value ||
2195 property->type != _uri_map.urids.atom_URID ||
2196 value->type != _uri_map.urids.atom_Path) {
2197 std::cerr << "warning: patch:Set for unknown property" << std::endl;
2201 const uint32_t prop_id = ((const LV2_Atom_URID*)property)->body;
2202 const char* path = (const char*)LV2_ATOM_BODY_CONST(value);
2204 // Emit PropertyChanged signal for UI
2205 // TODO: This should emit the control's Changed signal
2206 PropertyChanged(prop_id, Variant(Variant::PATH, path));
2211 if (!_to_ui) continue;
2212 write_to_ui(port_index, URIMap::instance().urids.atom_eventTransfer,
2213 size + sizeof(LV2_Atom),
2214 data - sizeof(LV2_Atom));
2219 cycles_t now = get_cycles();
2220 set_cycles((uint32_t)(now - then));
2222 // Update expected transport information for next cycle so we can detect changes
2223 _next_cycle_speed = _session.transport_speed();
2224 _next_cycle_start = _session.transport_frame() + (nframes * _next_cycle_speed);
2230 LV2Plugin::parameter_is_control(uint32_t param) const
2232 assert(param < _port_flags.size());
2233 return _port_flags[param] & PORT_CONTROL;
2237 LV2Plugin::parameter_is_audio(uint32_t param) const
2239 assert(param < _port_flags.size());
2240 return _port_flags[param] & PORT_AUDIO;
2244 LV2Plugin::parameter_is_event(uint32_t param) const
2246 assert(param < _port_flags.size());
2247 return _port_flags[param] & PORT_EVENT;
2251 LV2Plugin::parameter_is_output(uint32_t param) const
2253 assert(param < _port_flags.size());
2254 return _port_flags[param] & PORT_OUTPUT;
2258 LV2Plugin::parameter_is_input(uint32_t param) const
2260 assert(param < _port_flags.size());
2261 return _port_flags[param] & PORT_INPUT;
2265 LV2Plugin::print_parameter(uint32_t param, char* buf, uint32_t len) const
2268 if (param < parameter_count()) {
2269 snprintf(buf, len, "%.3f", get_parameter(param));
2276 boost::shared_ptr<ScalePoints>
2277 LV2Plugin::get_scale_points(uint32_t port_index) const
2279 const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, port_index);
2280 LilvScalePoints* points = lilv_port_get_scale_points(_impl->plugin, port);
2282 boost::shared_ptr<ScalePoints> ret;
2287 ret = boost::shared_ptr<ScalePoints>(new ScalePoints());
2289 LILV_FOREACH(scale_points, i, points) {
2290 const LilvScalePoint* p = lilv_scale_points_get(points, i);
2291 const LilvNode* label = lilv_scale_point_get_label(p);
2292 const LilvNode* value = lilv_scale_point_get_value(p);
2293 if (label && (lilv_node_is_float(value) || lilv_node_is_int(value))) {
2294 ret->insert(make_pair(lilv_node_as_string(label),
2295 lilv_node_as_float(value)));
2299 lilv_scale_points_free(points);
2304 LV2Plugin::run(pframes_t nframes)
2306 uint32_t const N = parameter_count();
2307 for (uint32_t i = 0; i < N; ++i) {
2308 if (parameter_is_control(i) && parameter_is_input(i)) {
2309 _control_data[i] = _shadow_data[i];
2313 lilv_instance_run(_impl->instance, nframes);
2315 if (_impl->work_iface) {
2316 _worker->emit_responses();
2317 if (_impl->work_iface->end_run) {
2318 _impl->work_iface->end_run(_impl->instance->lv2_handle);
2324 LV2Plugin::latency_compute_run()
2326 if (!_latency_control_port) {
2330 // Run the plugin so that it can set its latency parameter
2332 bool was_activated = _was_activated;
2335 uint32_t port_index = 0;
2336 uint32_t in_index = 0;
2337 uint32_t out_index = 0;
2339 // this is done in the main thread. non realtime.
2340 const framecnt_t bufsize = _engine.samples_per_cycle();
2341 float *buffer = (float*) malloc(_engine.samples_per_cycle() * sizeof(float));
2343 memset(buffer, 0, sizeof(float) * bufsize);
2345 // FIXME: Ensure plugins can handle in-place processing
2349 while (port_index < parameter_count()) {
2350 if (parameter_is_audio(port_index)) {
2351 if (parameter_is_input(port_index)) {
2352 lilv_instance_connect_port(_impl->instance, port_index, buffer);
2354 } else if (parameter_is_output(port_index)) {
2355 lilv_instance_connect_port(_impl->instance, port_index, buffer);
2364 if (was_activated) {
2371 LV2Plugin::Impl::designated_input (const char* uri, void** bufptrs[], void** bufptr)
2373 const LilvPort* port = NULL;
2374 LilvNode* designation = lilv_new_uri(_world.world, uri);
2375 port = lilv_plugin_get_port_by_designation(
2376 plugin, _world.lv2_InputPort, designation);
2377 lilv_node_free(designation);
2379 bufptrs[lilv_port_get_index(plugin, port)] = bufptr;
2384 static bool lv2_filter (const string& str, void* /*arg*/)
2386 /* Not a dotfile, has a prefix before a period, suffix is "lv2" */
2388 return str[0] != '.' && (str.length() > 3 && str.find (".lv2") == (str.length() - 4));
2392 LV2World::LV2World()
2393 : world(lilv_world_new())
2394 , _bundle_checked(false)
2396 atom_AtomPort = lilv_new_uri(world, LV2_ATOM__AtomPort);
2397 atom_Chunk = lilv_new_uri(world, LV2_ATOM__Chunk);
2398 atom_Sequence = lilv_new_uri(world, LV2_ATOM__Sequence);
2399 atom_bufferType = lilv_new_uri(world, LV2_ATOM__bufferType);
2400 atom_supports = lilv_new_uri(world, LV2_ATOM__supports);
2401 atom_eventTransfer = lilv_new_uri(world, LV2_ATOM__eventTransfer);
2402 ev_EventPort = lilv_new_uri(world, LILV_URI_EVENT_PORT);
2403 ext_logarithmic = lilv_new_uri(world, LV2_PORT_PROPS__logarithmic);
2404 ext_notOnGUI = lilv_new_uri(world, LV2_PORT_PROPS__notOnGUI);
2405 lv2_AudioPort = lilv_new_uri(world, LILV_URI_AUDIO_PORT);
2406 lv2_ControlPort = lilv_new_uri(world, LILV_URI_CONTROL_PORT);
2407 lv2_InputPort = lilv_new_uri(world, LILV_URI_INPUT_PORT);
2408 lv2_OutputPort = lilv_new_uri(world, LILV_URI_OUTPUT_PORT);
2409 lv2_inPlaceBroken = lilv_new_uri(world, LV2_CORE__inPlaceBroken);
2410 lv2_integer = lilv_new_uri(world, LV2_CORE__integer);
2411 lv2_default = lilv_new_uri(world, LV2_CORE__default);
2412 lv2_minimum = lilv_new_uri(world, LV2_CORE__minimum);
2413 lv2_maximum = lilv_new_uri(world, LV2_CORE__maximum);
2414 lv2_reportsLatency = lilv_new_uri(world, LV2_CORE__reportsLatency);
2415 lv2_sampleRate = lilv_new_uri(world, LV2_CORE__sampleRate);
2416 lv2_toggled = lilv_new_uri(world, LV2_CORE__toggled);
2417 lv2_enumeration = lilv_new_uri(world, LV2_CORE__enumeration);
2418 lv2_freewheeling = lilv_new_uri(world, LV2_CORE__freeWheeling);
2419 midi_MidiEvent = lilv_new_uri(world, LILV_URI_MIDI_EVENT);
2420 rdfs_comment = lilv_new_uri(world, LILV_NS_RDFS "comment");
2421 rdfs_label = lilv_new_uri(world, LILV_NS_RDFS "label");
2422 rdfs_range = lilv_new_uri(world, LILV_NS_RDFS "range");
2423 rsz_minimumSize = lilv_new_uri(world, LV2_RESIZE_PORT__minimumSize);
2424 time_Position = lilv_new_uri(world, LV2_TIME__Position);
2425 ui_GtkUI = lilv_new_uri(world, LV2_UI__GtkUI);
2426 ui_external = lilv_new_uri(world, "http://lv2plug.in/ns/extensions/ui#external");
2427 ui_externalkx = lilv_new_uri(world, "http://kxstudio.sf.net/ns/lv2ext/external-ui#Widget");
2428 units_unit = lilv_new_uri(world, LV2_UNITS__unit);
2429 units_render = lilv_new_uri(world, LV2_UNITS__render);
2430 units_hz = lilv_new_uri(world, LV2_UNITS__hz);
2431 units_midiNote = lilv_new_uri(world, LV2_UNITS__midiNote);
2432 units_db = lilv_new_uri(world, LV2_UNITS__db);
2433 patch_writable = lilv_new_uri(world, LV2_PATCH__writable);
2434 patch_Message = lilv_new_uri(world, LV2_PATCH__Message);
2435 #ifdef HAVE_LV2_1_2_0
2436 bufz_powerOf2BlockLength = lilv_new_uri(world, LV2_BUF_SIZE__powerOf2BlockLength);
2437 bufz_fixedBlockLength = lilv_new_uri(world, LV2_BUF_SIZE__fixedBlockLength);
2438 bufz_nominalBlockLength = lilv_new_uri(world, "http://lv2plug.in/ns/ext/buf-size#nominalBlockLength");
2443 LV2World::~LV2World()
2445 #ifdef HAVE_LV2_1_2_0
2446 lilv_node_free(bufz_nominalBlockLength);
2447 lilv_node_free(bufz_fixedBlockLength);
2448 lilv_node_free(bufz_powerOf2BlockLength);
2450 lilv_node_free(patch_Message);
2451 lilv_node_free(patch_writable);
2452 lilv_node_free(units_hz);
2453 lilv_node_free(units_midiNote);
2454 lilv_node_free(units_db);
2455 lilv_node_free(units_unit);
2456 lilv_node_free(units_render);
2457 lilv_node_free(ui_externalkx);
2458 lilv_node_free(ui_external);
2459 lilv_node_free(ui_GtkUI);
2460 lilv_node_free(time_Position);
2461 lilv_node_free(rsz_minimumSize);
2462 lilv_node_free(rdfs_comment);
2463 lilv_node_free(rdfs_label);
2464 lilv_node_free(rdfs_range);
2465 lilv_node_free(midi_MidiEvent);
2466 lilv_node_free(lv2_enumeration);
2467 lilv_node_free(lv2_freewheeling);
2468 lilv_node_free(lv2_toggled);
2469 lilv_node_free(lv2_sampleRate);
2470 lilv_node_free(lv2_reportsLatency);
2471 lilv_node_free(lv2_integer);
2472 lilv_node_free(lv2_inPlaceBroken);
2473 lilv_node_free(lv2_OutputPort);
2474 lilv_node_free(lv2_InputPort);
2475 lilv_node_free(lv2_ControlPort);
2476 lilv_node_free(lv2_AudioPort);
2477 lilv_node_free(ext_notOnGUI);
2478 lilv_node_free(ext_logarithmic);
2479 lilv_node_free(ev_EventPort);
2480 lilv_node_free(atom_supports);
2481 lilv_node_free(atom_eventTransfer);
2482 lilv_node_free(atom_bufferType);
2483 lilv_node_free(atom_Sequence);
2484 lilv_node_free(atom_Chunk);
2485 lilv_node_free(atom_AtomPort);
2486 lilv_world_free(world);
2490 LV2World::load_bundled_plugins(bool verbose)
2492 if (!_bundle_checked) {
2494 cout << "Scanning folders for bundled LV2s: " << ARDOUR::lv2_bundled_search_path().to_string() << endl;
2497 vector<string> plugin_objects;
2498 find_paths_matching_filter (plugin_objects, ARDOUR::lv2_bundled_search_path(), lv2_filter, 0, true, true, true);
2499 for ( vector<string>::iterator x = plugin_objects.begin(); x != plugin_objects.end (); ++x) {
2500 #ifdef PLATFORM_WINDOWS
2501 string uri = "file:///" + *x + "/";
2503 string uri = "file://" + *x + "/";
2505 LilvNode *node = lilv_new_uri(world, uri.c_str());
2506 lilv_world_load_bundle(world, node);
2507 lilv_node_free(node);
2510 lilv_world_load_all(world);
2511 _bundle_checked = true;
2515 LV2PluginInfo::LV2PluginInfo (const char* plugin_uri)
2518 _plugin_uri = strdup(plugin_uri);
2521 LV2PluginInfo::~LV2PluginInfo()
2528 LV2PluginInfo::load(Session& session)
2532 const LilvPlugins* plugins = lilv_world_get_all_plugins(_world.world);
2533 LilvNode* uri = lilv_new_uri(_world.world, _plugin_uri);
2534 if (!uri) { throw failed_constructor(); }
2535 const LilvPlugin* lp = lilv_plugins_get_by_uri(plugins, uri);
2536 if (!lp) { throw failed_constructor(); }
2537 plugin.reset(new LV2Plugin(session.engine(), session, lp, session.frame_rate()));
2538 lilv_node_free(uri);
2539 plugin->set_info(PluginInfoPtr(shared_from_this ()));
2541 } catch (failed_constructor& err) {
2542 return PluginPtr((Plugin*)0);
2549 LV2PluginInfo::discover()
2552 world.load_bundled_plugins();
2553 _world.load_bundled_plugins(true);
2555 PluginInfoList* plugs = new PluginInfoList;
2556 const LilvPlugins* plugins = lilv_world_get_all_plugins(world.world);
2558 LILV_FOREACH(plugins, i, plugins) {
2559 const LilvPlugin* p = lilv_plugins_get(plugins, i);
2560 const LilvNode* pun = lilv_plugin_get_uri(p);
2562 LV2PluginInfoPtr info(new LV2PluginInfo(lilv_node_as_string(pun)));
2564 LilvNode* name = lilv_plugin_get_name(p);
2565 if (!name || !lilv_plugin_get_port_by_index(p, 0)) {
2566 warning << "Ignoring invalid LV2 plugin "
2567 << lilv_node_as_string(lilv_plugin_get_uri(p))
2572 if (lilv_plugin_has_feature(p, world.lv2_inPlaceBroken)) {
2573 warning << string_compose(
2574 _("Ignoring LV2 plugin \"%1\" since it cannot do inplace processing."),
2575 lilv_node_as_string(name)) << endmsg;
2576 lilv_node_free(name);
2580 #ifdef HAVE_LV2_1_2_0
2581 LilvNodes *required_features = lilv_plugin_get_required_features (p);
2582 if (lilv_nodes_contains (required_features, world.bufz_powerOf2BlockLength) ||
2583 lilv_nodes_contains (required_features, world.bufz_fixedBlockLength)
2585 warning << string_compose(
2586 _("Ignoring LV2 plugin \"%1\" because its buffer-size requirements cannot be satisfied."),
2587 lilv_node_as_string(name)) << endmsg;
2588 lilv_nodes_free(required_features);
2589 lilv_node_free(name);
2592 lilv_nodes_free(required_features);
2597 info->name = string(lilv_node_as_string(name));
2598 lilv_node_free(name);
2599 ARDOUR::PluginScanMessage(_("LV2"), info->name, false);
2601 const LilvPluginClass* pclass = lilv_plugin_get_class(p);
2602 const LilvNode* label = lilv_plugin_class_get_label(pclass);
2603 info->category = lilv_node_as_string(label);
2605 LilvNode* author_name = lilv_plugin_get_author_name(p);
2606 info->creator = author_name ? string(lilv_node_as_string(author_name)) : "Unknown";
2607 lilv_node_free(author_name);
2609 info->path = "/NOPATH"; // Meaningless for LV2
2611 /* count atom-event-ports that feature
2612 * atom:supports <http://lv2plug.in/ns/ext/midi#MidiEvent>
2614 * TODO: nicely ask drobilla to make a lilv_ call for that
2616 int count_midi_out = 0;
2617 int count_midi_in = 0;
2618 for (uint32_t i = 0; i < lilv_plugin_get_num_ports(p); ++i) {
2619 const LilvPort* port = lilv_plugin_get_port_by_index(p, i);
2620 if (lilv_port_is_a(p, port, world.atom_AtomPort)) {
2621 LilvNodes* buffer_types = lilv_port_get_value(
2622 p, port, world.atom_bufferType);
2623 LilvNodes* atom_supports = lilv_port_get_value(
2624 p, port, world.atom_supports);
2626 if (lilv_nodes_contains(buffer_types, world.atom_Sequence)
2627 && lilv_nodes_contains(atom_supports, world.midi_MidiEvent)) {
2628 if (lilv_port_is_a(p, port, world.lv2_InputPort)) {
2631 if (lilv_port_is_a(p, port, world.lv2_OutputPort)) {
2635 lilv_nodes_free(buffer_types);
2636 lilv_nodes_free(atom_supports);
2640 info->n_inputs.set_audio(
2641 lilv_plugin_get_num_ports_of_class(
2642 p, world.lv2_InputPort, world.lv2_AudioPort, NULL));
2643 info->n_inputs.set_midi(
2644 lilv_plugin_get_num_ports_of_class(
2645 p, world.lv2_InputPort, world.ev_EventPort, NULL)
2648 info->n_outputs.set_audio(
2649 lilv_plugin_get_num_ports_of_class(
2650 p, world.lv2_OutputPort, world.lv2_AudioPort, NULL));
2651 info->n_outputs.set_midi(
2652 lilv_plugin_get_num_ports_of_class(
2653 p, world.lv2_OutputPort, world.ev_EventPort, NULL)
2656 info->unique_id = lilv_node_as_uri(lilv_plugin_get_uri(p));
2657 info->index = 0; // Meaningless for LV2
2659 plugs->push_back(info);