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)
242 #ifdef HAVE_LV2_1_2_0
250 /** Find the LV2 input port with the given designation.
251 * If found, bufptrs[port_index] will be set to bufptr.
253 const LilvPort* designated_input (const char* uri, void** bufptrs[], void** bufptr);
255 const LilvPlugin* plugin;
257 const LilvNode* ui_type;
260 LilvInstance* instance;
261 const LV2_Worker_Interface* work_iface;
262 #ifdef HAVE_LV2_1_2_0
263 const LV2_Options_Interface* opts_iface;
266 LV2_Atom_Forge forge;
267 LV2_Atom_Forge ui_forge;
268 int32_t block_length;
269 #ifdef HAVE_LV2_1_2_0
270 LV2_Options_Option* options;
274 LV2Plugin::LV2Plugin (AudioEngine& engine,
276 const void* c_plugin,
278 : Plugin (engine, session)
284 , _patch_port_in_index((uint32_t)-1)
285 , _patch_port_out_index((uint32_t)-1)
286 , _uri_map(URIMap::instance())
288 init(c_plugin, rate);
291 LV2Plugin::LV2Plugin (const LV2Plugin& other)
297 , _insert_id(other._insert_id)
298 , _patch_port_in_index((uint32_t)-1)
299 , _patch_port_out_index((uint32_t)-1)
300 , _uri_map(URIMap::instance())
302 init(other._impl->plugin, other._sample_rate);
304 for (uint32_t i = 0; i < parameter_count(); ++i) {
305 _control_data[i] = other._shadow_data[i];
306 _shadow_data[i] = other._shadow_data[i];
311 LV2Plugin::init(const void* c_plugin, framecnt_t rate)
313 DEBUG_TRACE(DEBUG::LV2, "init\n");
315 _impl->plugin = (const LilvPlugin*)c_plugin;
317 _impl->ui_type = NULL;
322 _atom_ev_buffers = 0;
324 _bpm_control_port = 0;
325 _freewheel_control_port = 0;
326 _latency_control_port = 0;
327 _next_cycle_start = std::numeric_limits<framepos_t>::max();
328 _next_cycle_speed = 1.0;
329 _seq_size = _engine.raw_buffer_size(DataType::MIDI);
331 _was_activated = false;
332 _has_state_interface = false;
333 _impl->block_length = _session.get_block_size();
335 _instance_access_feature.URI = "http://lv2plug.in/ns/ext/instance-access";
336 _data_access_feature.URI = "http://lv2plug.in/ns/ext/data-access";
337 _make_path_feature.URI = LV2_STATE__makePath;
338 _log_feature.URI = LV2_LOG__log;
339 _work_schedule_feature.URI = LV2_WORKER__schedule;
340 _work_schedule_feature.data = NULL;
341 _def_state_feature.URI = LV2_STATE_PREFIX "loadDefaultState"; // Post LV2-1.2.0
342 _def_state_feature.data = NULL;
344 const LilvPlugin* plugin = _impl->plugin;
346 LilvNode* state_iface_uri = lilv_new_uri(_world.world, LV2_STATE__interface);
347 LilvNode* state_uri = lilv_new_uri(_world.world, LV2_STATE_URI);
348 _has_state_interface =
349 // What plugins should have (lv2:extensionData state:Interface)
350 lilv_plugin_has_extension_data(plugin, state_iface_uri)
351 // What some outdated/incorrect ones have
352 || lilv_plugin_has_feature(plugin, state_uri);
353 lilv_node_free(state_uri);
354 lilv_node_free(state_iface_uri);
356 _features = (LV2_Feature**)calloc(11, sizeof(LV2_Feature*));
357 _features[0] = &_instance_access_feature;
358 _features[1] = &_data_access_feature;
359 _features[2] = &_make_path_feature;
360 _features[3] = _uri_map.uri_map_feature();
361 _features[4] = _uri_map.urid_map_feature();
362 _features[5] = _uri_map.urid_unmap_feature();
363 _features[6] = &_log_feature;
365 unsigned n_features = 7;
366 #ifdef HAVE_LV2_1_2_0
367 _features[n_features++] = &_def_state_feature;
370 lv2_atom_forge_init(&_impl->forge, _uri_map.urid_map());
371 lv2_atom_forge_init(&_impl->ui_forge, _uri_map.urid_map());
373 #ifdef HAVE_LV2_1_2_0
374 LV2_URID atom_Int = _uri_map.uri_to_id(LV2_ATOM__Int);
375 static const int32_t _min_block_length = 1; // may happen during split-cycles
376 static const int32_t _max_block_length = 8192; // max possible (with all engines and during export)
377 /* Consider updating max-block-size whenever the buffersize changes.
378 * It requires re-instantiating the plugin (which is a non-realtime operation),
379 * so it should be done lightly and only for plugins that require it.
381 * given that the block-size can change at any time (split-cycles) ardour currently
382 * does not support plugins that require bufz_fixedBlockLength.
384 LV2_Options_Option options[] = {
385 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id(LV2_BUF_SIZE__minBlockLength),
386 sizeof(int32_t), atom_Int, &_min_block_length },
387 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id(LV2_BUF_SIZE__maxBlockLength),
388 sizeof(int32_t), atom_Int, &_max_block_length },
389 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id(LV2_BUF_SIZE__sequenceSize),
390 sizeof(int32_t), atom_Int, &_seq_size },
391 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id("http://lv2plug.in/ns/ext/buf-size#nominalBlockLength"),
392 sizeof(int32_t), atom_Int, &_impl->block_length },
393 { LV2_OPTIONS_INSTANCE, 0, 0, 0, 0, NULL }
396 _impl->options = (LV2_Options_Option*) malloc (sizeof (options));
397 memcpy ((void*) _impl->options, (void*) options, sizeof (options));
399 _options_feature.URI = LV2_OPTIONS__options;
400 _options_feature.data = _impl->options;
401 _features[n_features++] = &_options_feature;
404 LV2_State_Make_Path* make_path = (LV2_State_Make_Path*)malloc(
405 sizeof(LV2_State_Make_Path));
406 make_path->handle = this;
407 make_path->path = &lv2_state_make_path;
408 _make_path_feature.data = make_path;
410 LV2_Log_Log* log = (LV2_Log_Log*)malloc(sizeof(LV2_Log_Log));
412 log->printf = &log_printf;
413 log->vprintf = &log_vprintf;
414 _log_feature.data = log;
416 LilvNode* worker_schedule = lilv_new_uri(_world.world, LV2_WORKER__schedule);
417 if (lilv_plugin_has_feature(plugin, worker_schedule)) {
418 LV2_Worker_Schedule* schedule = (LV2_Worker_Schedule*)malloc(
419 sizeof(LV2_Worker_Schedule));
420 size_t buf_size = _session.engine().raw_buffer_size(DataType::MIDI) * NBUFS;
421 _worker = new Worker(this, buf_size);
422 schedule->handle = this;
423 schedule->schedule_work = work_schedule;
424 _work_schedule_feature.data = schedule;
425 _features[n_features++] = &_work_schedule_feature;
427 lilv_node_free(worker_schedule);
429 _impl->instance = lilv_plugin_instantiate(plugin, rate, _features);
430 _impl->name = lilv_plugin_get_name(plugin);
431 _impl->author = lilv_plugin_get_author_name(plugin);
433 if (_impl->instance == 0) {
434 error << _("LV2: Failed to instantiate plugin ") << uri() << endmsg;
435 throw failed_constructor();
438 _instance_access_feature.data = (void*)_impl->instance->lv2_handle;
439 _data_access_extension_data.extension_data = _impl->instance->lv2_descriptor->extension_data;
440 _data_access_feature.data = &_data_access_extension_data;
442 LilvNode* worker_iface_uri = lilv_new_uri(_world.world, LV2_WORKER__interface);
443 if (lilv_plugin_has_extension_data(plugin, worker_iface_uri)) {
444 _impl->work_iface = (const LV2_Worker_Interface*)extension_data(
445 LV2_WORKER__interface);
447 lilv_node_free(worker_iface_uri);
450 #ifdef HAVE_LV2_1_2_0
451 LilvNode* options_iface_uri = lilv_new_uri(_world.world, LV2_OPTIONS__interface);
452 if (lilv_plugin_has_extension_data(plugin, options_iface_uri)) {
453 _impl->opts_iface = (const LV2_Options_Interface*)extension_data(
454 LV2_OPTIONS__interface);
456 lilv_node_free(options_iface_uri);
459 if (lilv_plugin_has_feature(plugin, _world.lv2_inPlaceBroken)) {
460 error << string_compose(
461 _("LV2: \"%1\" cannot be used, since it cannot do inplace processing."),
462 lilv_node_as_string(_impl->name)) << endmsg;
463 lilv_node_free(_impl->name);
464 lilv_node_free(_impl->author);
465 throw failed_constructor();
468 #ifdef HAVE_LV2_1_2_0
469 LilvNodes *required_features = lilv_plugin_get_required_features (plugin);
470 if (lilv_nodes_contains (required_features, _world.bufz_powerOf2BlockLength) ||
471 lilv_nodes_contains (required_features, _world.bufz_fixedBlockLength)
473 error << string_compose(
474 _("LV2: \"%1\" buffer-size requirements cannot be satisfied."),
475 lilv_node_as_string(_impl->name)) << endmsg;
476 lilv_node_free(_impl->name);
477 lilv_node_free(_impl->author);
478 lilv_nodes_free(required_features);
479 throw failed_constructor();
481 lilv_nodes_free(required_features);
484 #ifdef HAVE_LILV_0_16_0
485 // Load default state
486 LilvState* state = lilv_state_new_from_world(
487 _world.world, _uri_map.urid_map(), lilv_plugin_get_uri(_impl->plugin));
488 if (state && _has_state_interface) {
489 lilv_state_restore(state, _impl->instance, NULL, NULL, 0, NULL);
491 lilv_state_free(state);
496 const uint32_t num_ports = this->num_ports();
497 for (uint32_t i = 0; i < num_ports; ++i) {
498 const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, i);
500 size_t minimumSize = 0;
502 if (lilv_port_is_a(_impl->plugin, port, _world.lv2_OutputPort)) {
503 flags |= PORT_OUTPUT;
504 } else if (lilv_port_is_a(_impl->plugin, port, _world.lv2_InputPort)) {
507 error << string_compose(
508 "LV2: \"%1\" port %2 is neither input nor output",
509 lilv_node_as_string(_impl->name), i) << endmsg;
510 throw failed_constructor();
513 if (lilv_port_is_a(_impl->plugin, port, _world.lv2_ControlPort)) {
514 flags |= PORT_CONTROL;
515 } else if (lilv_port_is_a(_impl->plugin, port, _world.lv2_AudioPort)) {
517 } else if (lilv_port_is_a(_impl->plugin, port, _world.ev_EventPort)) {
519 flags |= PORT_MIDI; // We assume old event API ports are for MIDI
520 } else if (lilv_port_is_a(_impl->plugin, port, _world.atom_AtomPort)) {
521 LilvNodes* buffer_types = lilv_port_get_value(
522 _impl->plugin, port, _world.atom_bufferType);
523 LilvNodes* atom_supports = lilv_port_get_value(
524 _impl->plugin, port, _world.atom_supports);
526 if (lilv_nodes_contains(buffer_types, _world.atom_Sequence)) {
527 flags |= PORT_SEQUENCE;
528 if (lilv_nodes_contains(atom_supports, _world.midi_MidiEvent)) {
531 if (lilv_nodes_contains(atom_supports, _world.time_Position)) {
532 flags |= PORT_POSITION;
534 if (lilv_nodes_contains(atom_supports, _world.patch_Message)) {
535 flags |= PORT_PATCHMSG;
536 if (flags & PORT_INPUT) {
537 _patch_port_in_index = i;
539 _patch_port_out_index = i;
543 LilvNodes* min_size_v = lilv_port_get_value(_impl->plugin, port, _world.rsz_minimumSize);
544 LilvNode* min_size = min_size_v ? lilv_nodes_get_first(min_size_v) : NULL;
545 if (min_size && lilv_node_is_int(min_size)) {
546 minimumSize = lilv_node_as_int(min_size);
548 lilv_nodes_free(min_size_v);
549 lilv_nodes_free(buffer_types);
550 lilv_nodes_free(atom_supports);
552 error << string_compose(
553 "LV2: \"%1\" port %2 has no known data type",
554 lilv_node_as_string(_impl->name), i) << endmsg;
555 throw failed_constructor();
558 _port_flags.push_back(flags);
559 _port_minimumSize.push_back(minimumSize);
562 _control_data = new float[num_ports];
563 _shadow_data = new float[num_ports];
564 _defaults = new float[num_ports];
565 _ev_buffers = new LV2_Evbuf*[num_ports];
566 memset(_ev_buffers, 0, sizeof(LV2_Evbuf*) * num_ports);
568 const bool latent = lilv_plugin_has_latency(plugin);
569 const uint32_t latency_index = (latent)
570 ? lilv_plugin_get_latency_port_index(plugin)
573 // Build an array of pointers to special parameter buffers
574 void*** params = new void**[num_ports];
575 for (uint32_t i = 0; i < num_ports; ++i) {
578 _impl->designated_input (LV2_TIME__beatsPerMinute, params, (void**)&_bpm_control_port);
579 _impl->designated_input (LV2_CORE__freeWheeling, params, (void**)&_freewheel_control_port);
581 for (uint32_t i = 0; i < num_ports; ++i) {
582 const LilvPort* port = lilv_plugin_get_port_by_index(plugin, i);
583 const LilvNode* sym = lilv_port_get_symbol(plugin, port);
585 // Store index in map so we can look up index by symbol
586 _port_indices.insert(std::make_pair(lilv_node_as_string(sym), i));
588 // Get range and default value if applicable
589 if (parameter_is_control(i)) {
591 lilv_port_get_range(plugin, port, &def, NULL, NULL);
592 _defaults[i] = def ? lilv_node_as_float(def) : 0.0f;
593 if (lilv_port_has_property (plugin, port, _world.lv2_sampleRate)) {
594 _defaults[i] *= _session.frame_rate ();
598 lilv_instance_connect_port(_impl->instance, i, &_control_data[i]);
600 if (latent && i == latency_index) {
601 _latency_control_port = &_control_data[i];
602 *_latency_control_port = 0;
605 if (parameter_is_input(i)) {
606 _shadow_data[i] = default_value(i);
608 *params[i] = (void*)&_shadow_data[i];
618 LilvUIs* uis = lilv_plugin_get_uis(plugin);
619 if (lilv_uis_size(uis) > 0) {
621 // Look for embeddable UI
622 LILV_FOREACH(uis, u, uis) {
623 const LilvUI* this_ui = lilv_uis_get(uis, u);
624 const LilvNode* this_ui_type = NULL;
625 if (lilv_ui_is_supported(this_ui,
629 // TODO: Multiple UI support
631 _impl->ui_type = this_ui_type;
636 // Look for Gtk native UI
637 LILV_FOREACH(uis, i, uis) {
638 const LilvUI* ui = lilv_uis_get(uis, i);
639 if (lilv_ui_is_a(ui, _world.ui_GtkUI)) {
641 _impl->ui_type = _world.ui_GtkUI;
647 // If Gtk UI is not available, try to find external 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_externalkx)) {
653 _impl->ui_type = _world.ui_external;
656 if (lilv_ui_is_a(ui, _world.ui_external)) {
658 _impl->ui_type = _world.ui_external;
664 load_supported_properties(_property_descriptors);
665 allocate_atom_event_buffers();
666 latency_compute_run();
670 LV2Plugin::set_block_size (pframes_t nframes)
672 #ifdef HAVE_LV2_1_2_0
673 if (_impl->opts_iface) {
674 LV2_URID atom_Int = _uri_map.uri_to_id(LV2_ATOM__Int);
675 _impl->block_length = nframes;
676 LV2_Options_Option block_size_option = {
677 LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id ("http://lv2plug.in/ns/ext/buf-size#nominalBlockLength"),
678 sizeof(int32_t), atom_Int, (void*)&_impl->block_length
680 _impl->opts_iface->set (_impl->instance->lv2_handle, &block_size_option);
686 LV2Plugin::~LV2Plugin ()
688 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 destroy\n", name()));
693 lilv_instance_free(_impl->instance);
694 lilv_state_free(_impl->state);
695 lilv_node_free(_impl->name);
696 lilv_node_free(_impl->author);
697 #ifdef HAVE_LV2_1_2_0
698 free(_impl->options);
702 free(_make_path_feature.data);
703 free(_work_schedule_feature.data);
709 if (_atom_ev_buffers) {
710 LV2_Evbuf** b = _atom_ev_buffers;
715 free(_atom_ev_buffers);
718 delete [] _control_data;
719 delete [] _shadow_data;
721 delete [] _ev_buffers;
725 LV2Plugin::is_external_ui() const
730 return lilv_ui_is_a(_impl->ui, _world.ui_external) || lilv_ui_is_a(_impl->ui, _world.ui_externalkx);
734 LV2Plugin::is_external_kx() const
739 return lilv_ui_is_a(_impl->ui, _world.ui_externalkx);
743 LV2Plugin::ui_is_resizable () const
745 const LilvNode* s = lilv_ui_get_uri(_impl->ui);
746 LilvNode* p = lilv_new_uri(_world.world, LV2_CORE__optionalFeature);
747 LilvNode* fs = lilv_new_uri(_world.world, LV2_UI__fixedSize);
748 LilvNode* nrs = lilv_new_uri(_world.world, LV2_UI__noUserResize);
750 LilvNodes* fs_matches = lilv_world_find_nodes(_world.world, s, p, fs);
751 LilvNodes* nrs_matches = lilv_world_find_nodes(_world.world, s, p, nrs);
753 lilv_nodes_free(nrs_matches);
754 lilv_nodes_free(fs_matches);
759 return !fs_matches && !nrs_matches;
763 LV2Plugin::unique_id() const
765 return lilv_node_as_uri(lilv_plugin_get_uri(_impl->plugin));
769 LV2Plugin::uri() const
771 return lilv_node_as_uri(lilv_plugin_get_uri(_impl->plugin));
775 LV2Plugin::label() const
777 return lilv_node_as_string(_impl->name);
781 LV2Plugin::name() const
783 return lilv_node_as_string(_impl->name);
787 LV2Plugin::maker() const
789 return _impl->author ? lilv_node_as_string (_impl->author) : "Unknown";
793 LV2Plugin::num_ports() const
795 return lilv_plugin_get_num_ports(_impl->plugin);
799 LV2Plugin::parameter_count() const
801 return lilv_plugin_get_num_ports(_impl->plugin);
805 LV2Plugin::default_value(uint32_t port)
807 return _defaults[port];
811 LV2Plugin::port_symbol(uint32_t index) const
813 const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, index);
815 error << name() << ": Invalid port index " << index << endmsg;
818 const LilvNode* sym = lilv_port_get_symbol(_impl->plugin, port);
819 return lilv_node_as_string(sym);
823 LV2Plugin::port_index (const char* symbol) const
825 const map<string, uint32_t>::const_iterator i = _port_indices.find(symbol);
826 if (i != _port_indices.end()) {
829 warning << string_compose(_("LV2: Unknown port %1"), symbol) << endmsg;
835 LV2Plugin::set_parameter(uint32_t which, float val)
837 DEBUG_TRACE(DEBUG::LV2, string_compose(
838 "%1 set parameter %2 to %3\n", name(), which, val));
840 if (which < lilv_plugin_get_num_ports(_impl->plugin)) {
841 if (get_parameter (which) == val) {
845 _shadow_data[which] = val;
847 warning << string_compose(
848 _("Illegal parameter number used with plugin \"%1\". "
849 "This is a bug in either %2 or the LV2 plugin <%3>"),
850 name(), PROGRAM_NAME, unique_id()) << endmsg;
853 Plugin::set_parameter(which, val);
857 LV2Plugin::get_parameter(uint32_t which) const
859 if (parameter_is_input(which)) {
860 return (float)_shadow_data[which];
862 return (float)_control_data[which];
868 LV2Plugin::get_docs() const
870 LilvNodes* comments = lilv_plugin_get_value(_impl->plugin, _world.rdfs_comment);
872 const std::string docs(lilv_node_as_string(lilv_nodes_get_first(comments)));
873 lilv_nodes_free(comments);
881 LV2Plugin::get_parameter_docs(uint32_t which) const
883 LilvNodes* comments = lilv_port_get_value(
885 lilv_plugin_get_port_by_index(_impl->plugin, which),
886 _world.rdfs_comment);
889 const std::string docs(lilv_node_as_string(lilv_nodes_get_first(comments)));
890 lilv_nodes_free(comments);
898 LV2Plugin::nth_parameter(uint32_t n, bool& ok) const
901 for (uint32_t c = 0, x = 0; x < lilv_plugin_get_num_ports(_impl->plugin); ++x) {
902 if (parameter_is_control(x)) {
914 LV2Plugin::extension_data(const char* uri) const
916 return lilv_instance_get_extension_data(_impl->instance, uri);
920 LV2Plugin::c_plugin()
922 return _impl->plugin;
928 return (const void*)_impl->ui;
932 LV2Plugin::c_ui_type()
934 return (const void*)_impl->ui_type;
937 /** Directory for all plugin state. */
939 LV2Plugin::plugin_dir() const
941 return Glib::build_filename(_session.plugins_dir(), _insert_id.to_s());
944 /** Directory for files created by the plugin (except during save). */
946 LV2Plugin::scratch_dir() const
948 return Glib::build_filename(plugin_dir(), "scratch");
951 /** Directory for snapshots of files in the scratch directory. */
953 LV2Plugin::file_dir() const
955 return Glib::build_filename(plugin_dir(), "files");
958 /** Directory to save state snapshot version @c num into. */
960 LV2Plugin::state_dir(unsigned num) const
962 return Glib::build_filename(plugin_dir(), string_compose("state%1", num));
965 /** Implementation of state:makePath for files created at instantiation time.
966 * Note this is not used for files created at save time (Lilv deals with that).
969 LV2Plugin::lv2_state_make_path(LV2_State_Make_Path_Handle handle,
972 LV2Plugin* me = (LV2Plugin*)handle;
973 if (me->_insert_id == PBD::ID("0")) {
974 warning << string_compose(
975 "File path \"%1\" requested but LV2 %2 has no insert ID",
976 path, me->name()) << endmsg;
977 return g_strdup(path);
980 const std::string abs_path = Glib::build_filename(me->scratch_dir(), path);
981 const std::string dirname = Glib::path_get_dirname(abs_path);
982 g_mkdir_with_parents(dirname.c_str(), 0744);
984 DEBUG_TRACE(DEBUG::LV2, string_compose("new file path %1 => %2\n",
987 return g_strndup(abs_path.c_str(), abs_path.length());
991 LV2Plugin::add_state(XMLNode* root) const
993 assert(_insert_id != PBD::ID("0"));
997 LocaleGuard lg(X_("C"));
999 for (uint32_t i = 0; i < parameter_count(); ++i) {
1000 if (parameter_is_input(i) && parameter_is_control(i)) {
1001 child = new XMLNode("Port");
1002 child->add_property("symbol", port_symbol(i));
1003 snprintf(buf, sizeof(buf), "%+f", _shadow_data[i]);
1004 child->add_property("value", string(buf));
1005 root->add_child_nocopy(*child);
1009 if (_has_state_interface) {
1010 // Provisionally increment state version and create directory
1011 const std::string new_dir = state_dir(++_state_version);
1012 g_mkdir_with_parents(new_dir.c_str(), 0744);
1014 LilvState* state = lilv_state_new_from_instance(
1017 _uri_map.urid_map(),
1018 scratch_dir().c_str(),
1020 _session.externals_dir().c_str(),
1023 const_cast<LV2Plugin*>(this),
1027 if (!_impl->state || !lilv_state_equals(state, _impl->state)) {
1028 lilv_state_save(_world.world,
1029 _uri_map.urid_map(),
1030 _uri_map.urid_unmap(),
1036 lilv_state_free(_impl->state);
1037 _impl->state = state;
1039 // State is identical, decrement version and nuke directory
1040 lilv_state_free(state);
1041 PBD::remove_directory(new_dir);
1045 root->add_property("state-dir", string_compose("state%1", _state_version));
1049 // TODO: Once we can rely on lilv 0.16.0, lilv_world_get can replace this
1051 get_value(LilvWorld* world, const LilvNode* subject, const LilvNode* predicate)
1053 LilvNodes* vs = lilv_world_find_nodes(world, subject, predicate, NULL);
1055 LilvNode* node = lilv_node_duplicate(lilv_nodes_get_first(vs));
1056 lilv_nodes_free(vs);
1063 LV2Plugin::find_presets()
1065 LilvNode* lv2_appliesTo = lilv_new_uri(_world.world, LV2_CORE__appliesTo);
1066 LilvNode* pset_Preset = lilv_new_uri(_world.world, LV2_PRESETS__Preset);
1067 LilvNode* rdfs_label = lilv_new_uri(_world.world, LILV_NS_RDFS "label");
1069 LilvNodes* presets = lilv_plugin_get_related(_impl->plugin, pset_Preset);
1070 LILV_FOREACH(nodes, i, presets) {
1071 const LilvNode* preset = lilv_nodes_get(presets, i);
1072 lilv_world_load_resource(_world.world, preset);
1073 LilvNode* name = get_value(_world.world, preset, rdfs_label);
1075 _presets.insert(std::make_pair(lilv_node_as_string(preset),
1076 Plugin::PresetRecord(
1077 lilv_node_as_string(preset),
1078 lilv_node_as_string(name))));
1079 lilv_node_free(name);
1081 warning << string_compose(
1082 _("Plugin \"%1\" preset \"%2\" is missing a label\n"),
1083 lilv_node_as_string(lilv_plugin_get_uri(_impl->plugin)),
1084 lilv_node_as_string(preset)) << endmsg;
1087 lilv_nodes_free(presets);
1089 lilv_node_free(rdfs_label);
1090 lilv_node_free(pset_Preset);
1091 lilv_node_free(lv2_appliesTo);
1095 set_port_value(const char* port_symbol,
1101 LV2Plugin* self = (LV2Plugin*)user_data;
1102 if (type != 0 && type != URIMap::instance().urids.atom_Float) {
1103 return; // TODO: Support non-float ports
1106 const uint32_t port_index = self->port_index(port_symbol);
1107 if (port_index != (uint32_t)-1) {
1108 self->set_parameter(port_index, *(const float*)value);
1113 LV2Plugin::load_preset(PresetRecord r)
1115 LilvWorld* world = _world.world;
1116 LilvNode* pset = lilv_new_uri(world, r.uri.c_str());
1117 LilvState* state = lilv_state_new_from_world(world, _uri_map.urid_map(), pset);
1120 lilv_state_restore(state, _impl->instance, set_port_value, this, 0, NULL);
1121 lilv_state_free(state);
1122 Plugin::load_preset(r);
1125 lilv_node_free(pset);
1130 ARDOUR::lv2plugin_get_port_value(const char* port_symbol,
1135 LV2Plugin *plugin = (LV2Plugin *) user_data;
1137 uint32_t index = plugin->port_index(port_symbol);
1138 if (index != (uint32_t) -1) {
1139 if (plugin->parameter_is_input(index) && plugin->parameter_is_control(index)) {
1141 *size = sizeof(float);
1142 *type = plugin->_uri_map.uri_to_id(LV2_ATOM__Float);
1143 value = &plugin->_shadow_data[index];
1155 LV2Plugin::do_save_preset(string name)
1157 LilvNode* plug_name = lilv_plugin_get_name(_impl->plugin);
1158 const string prefix = legalize_for_uri(lilv_node_as_string(plug_name));
1159 const string base_name = legalize_for_uri(name);
1160 const string file_name = base_name + ".ttl";
1161 const string bundle = Glib::build_filename(
1162 Glib::get_home_dir(),
1163 Glib::build_filename(".lv2", prefix + "_" + base_name + ".lv2"));
1165 #ifdef HAVE_LILV_0_21_3
1166 /* delete reference to old preset (if any) */
1167 const PresetRecord* r = preset_by_label(name);
1169 LilvNode* pset = lilv_new_uri (_world.world, r->uri.c_str());
1171 lilv_world_unload_resource (_world.world, pset);
1172 lilv_node_free(pset);
1177 LilvState* state = lilv_state_new_from_instance(
1180 _uri_map.urid_map(),
1181 scratch_dir().c_str(), // file_dir
1182 bundle.c_str(), // copy_dir
1183 bundle.c_str(), // link_dir
1184 bundle.c_str(), // save_dir
1185 lv2plugin_get_port_value, // get_value
1186 (void*)this, // user_data
1187 LV2_STATE_IS_POD|LV2_STATE_IS_PORTABLE, // flags
1188 _features // features
1191 lilv_state_set_label(state, name.c_str());
1193 _world.world, // world
1194 _uri_map.urid_map(), // map
1195 _uri_map.urid_unmap(), // unmap
1197 NULL, // uri (NULL = use file URI)
1198 bundle.c_str(), // dir
1199 file_name.c_str() // filename
1202 lilv_state_free(state);
1204 std::string uri = Glib::filename_to_uri(Glib::build_filename(bundle, file_name));
1205 LilvNode *node_bundle = lilv_new_uri(_world.world, Glib::filename_to_uri(Glib::build_filename(bundle, "/")).c_str());
1206 LilvNode *node_preset = lilv_new_uri(_world.world, uri.c_str());
1207 #ifdef HAVE_LILV_0_21_3
1208 lilv_world_unload_resource(_world.world, node_preset);
1209 lilv_world_unload_bundle(_world.world, node_bundle);
1211 lilv_world_load_bundle(_world.world, node_bundle);
1212 lilv_world_load_resource(_world.world, node_preset);
1213 lilv_node_free(node_bundle);
1214 lilv_node_free(node_preset);
1215 lilv_node_free(plug_name);
1220 LV2Plugin::do_remove_preset(string name)
1222 #ifdef HAVE_LILV_0_21_3
1223 /* Look up preset record by label (FIXME: ick, label as ID) */
1224 const PresetRecord* r = preset_by_label(name);
1229 /* Load a LilvState for the preset. */
1230 LilvWorld* world = _world.world;
1231 LilvNode* pset = lilv_new_uri(world, r->uri.c_str());
1232 LilvState* state = lilv_state_new_from_world(world, _uri_map.urid_map(), pset);
1234 lilv_node_free(pset);
1238 /* Unload preset from world. */
1239 lilv_world_unload_resource(world, pset);
1241 /* Delete it from the file system. This will remove the preset file and the entry
1242 from the manifest. If this results in an empty manifest (i.e. the
1243 preset is the only thing in the bundle), then the bundle is removed. */
1244 lilv_state_delete(world, state);
1246 lilv_state_free(state);
1247 lilv_node_free(pset);
1249 /* Without lilv_state_delete(), we could delete the preset file, but this
1250 would leave a broken bundle/manifest around, so the preset would still
1251 be visible, but broken. Naively deleting a bundle is too dangerous, so
1252 we simply do not support preset deletion with older Lilv */
1256 LV2Plugin::has_editor() const
1258 return _impl->ui != NULL;
1262 LV2Plugin::has_message_output() const
1264 for (uint32_t i = 0; i < num_ports(); ++i) {
1265 if ((_port_flags[i] & PORT_SEQUENCE) &&
1266 (_port_flags[i] & PORT_OUTPUT)) {
1274 LV2Plugin::write_to(RingBuffer<uint8_t>* dest,
1278 const uint8_t* body)
1280 const uint32_t buf_size = sizeof(UIMessage) + size;
1281 vector<uint8_t> buf(buf_size);
1283 UIMessage* msg = (UIMessage*)&buf[0];
1285 msg->protocol = protocol;
1287 memcpy(msg + 1, body, size);
1289 return (dest->write(&buf[0], buf_size) == buf_size);
1293 LV2Plugin::write_from_ui(uint32_t index,
1296 const uint8_t* body)
1299 size_t rbs = _session.engine().raw_buffer_size(DataType::MIDI) * NBUFS;
1300 /* buffer data communication from plugin UI to plugin instance.
1301 * this buffer needs to potentially hold
1302 * (port's minimumSize) * (audio-periods) / (UI-periods)
1305 * e.g 48kSPS / 128fpp -> audio-periods = 375 Hz
1306 * ui-periods = 25 Hz (SuperRapidScreenUpdate)
1307 * default minimumSize = 32K (see LV2Plugin::allocate_atom_event_buffers()
1309 * it is NOT safe to overflow (msg.size will be misinterpreted)
1311 uint32_t bufsiz = 32768;
1312 if (_atom_ev_buffers && _atom_ev_buffers[0]) {
1313 bufsiz = lv2_evbuf_get_capacity(_atom_ev_buffers[0]);
1315 rbs = max((size_t) bufsiz * 8, rbs);
1316 _from_ui = new RingBuffer<uint8_t>(rbs);
1319 if (!write_to(_from_ui, index, protocol, size, body)) {
1320 error << "Error writing from UI to plugin" << endmsg;
1327 LV2Plugin::write_to_ui(uint32_t index,
1330 const uint8_t* body)
1332 if (!write_to(_to_ui, index, protocol, size, body)) {
1333 error << "Error writing from plugin to UI" << endmsg;
1340 forge_variant(LV2_Atom_Forge* forge, const Variant& value)
1342 switch (value.type()) {
1343 case Variant::NOTHING:
1345 case Variant::BEATS:
1346 // No atom type for this, just forge a double
1347 lv2_atom_forge_double(forge, value.get_beats().to_double());
1350 lv2_atom_forge_bool(forge, value.get_bool());
1352 case Variant::DOUBLE:
1353 lv2_atom_forge_double(forge, value.get_double());
1355 case Variant::FLOAT:
1356 lv2_atom_forge_float(forge, value.get_float());
1359 lv2_atom_forge_int(forge, value.get_int());
1362 lv2_atom_forge_long(forge, value.get_long());
1365 lv2_atom_forge_path(
1366 forge, value.get_path().c_str(), value.get_path().size());
1368 case Variant::STRING:
1369 lv2_atom_forge_string(
1370 forge, value.get_string().c_str(), value.get_string().size());
1374 forge, value.get_uri().c_str(), value.get_uri().size());
1379 /** Get a variant type from a URI, return false iff no match found. */
1381 uri_to_variant_type(const std::string& uri, Variant::Type& type)
1383 if (uri == LV2_ATOM__Bool) {
1384 type = Variant::BOOL;
1385 } else if (uri == LV2_ATOM__Double) {
1386 type = Variant::DOUBLE;
1387 } else if (uri == LV2_ATOM__Float) {
1388 type = Variant::FLOAT;
1389 } else if (uri == LV2_ATOM__Int) {
1390 type = Variant::INT;
1391 } else if (uri == LV2_ATOM__Long) {
1392 type = Variant::LONG;
1393 } else if (uri == LV2_ATOM__Path) {
1394 type = Variant::PATH;
1395 } else if (uri == LV2_ATOM__String) {
1396 type = Variant::STRING;
1397 } else if (uri == LV2_ATOM__URI) {
1398 type = Variant::URI;
1406 LV2Plugin::set_property(uint32_t key, const Variant& value)
1408 if (_patch_port_in_index == (uint32_t)-1) {
1409 error << "LV2: set_property called with unset patch_port_in_index" << endmsg;
1411 } else if (value.type() == Variant::NOTHING) {
1412 error << "LV2: set_property called with void value" << endmsg;
1416 // Set up forge to write to temporary buffer on the stack
1417 LV2_Atom_Forge* forge = &_impl->ui_forge;
1418 LV2_Atom_Forge_Frame frame;
1419 uint8_t buf[PATH_MAX]; // Ought to be enough for anyone...
1421 lv2_atom_forge_set_buffer(forge, buf, sizeof(buf));
1423 // Serialize patch:Set message to set property
1424 #ifdef HAVE_LV2_1_10_0
1425 lv2_atom_forge_object(forge, &frame, 1, _uri_map.urids.patch_Set);
1426 lv2_atom_forge_key(forge, _uri_map.urids.patch_property);
1427 lv2_atom_forge_urid(forge, key);
1428 lv2_atom_forge_key(forge, _uri_map.urids.patch_value);
1430 lv2_atom_forge_blank(forge, &frame, 1, _uri_map.urids.patch_Set);
1431 lv2_atom_forge_property_head(forge, _uri_map.urids.patch_property, 0);
1432 lv2_atom_forge_urid(forge, key);
1433 lv2_atom_forge_property_head(forge, _uri_map.urids.patch_value, 0);
1436 forge_variant(forge, value);
1438 // Write message to UI=>Plugin ring
1439 const LV2_Atom* const atom = (const LV2_Atom*)buf;
1440 write_from_ui(_patch_port_in_index,
1441 _uri_map.urids.atom_eventTransfer,
1442 lv2_atom_total_size(atom),
1443 (const uint8_t*)atom);
1446 const ParameterDescriptor&
1447 LV2Plugin::get_property_descriptor(uint32_t id) const
1449 PropertyDescriptors::const_iterator p = _property_descriptors.find(id);
1450 if (p != _property_descriptors.end()) {
1453 return Plugin::get_property_descriptor(id);
1457 load_parameter_descriptor_units(LilvWorld* lworld, ParameterDescriptor& desc, const LilvNodes* units)
1459 if (lilv_nodes_contains(units, _world.units_midiNote)) {
1460 desc.unit = ParameterDescriptor::MIDI_NOTE;
1461 } else if (lilv_nodes_contains(units, _world.units_db)) {
1462 desc.unit = ParameterDescriptor::DB;
1463 } else if (lilv_nodes_contains(units, _world.units_hz)) {
1464 desc.unit = ParameterDescriptor::HZ;
1466 if (lilv_nodes_size(units) > 0) {
1467 const LilvNode* unit = lilv_nodes_get_first(units);
1468 LilvNode* render = get_value(lworld, unit, _world.units_render);
1470 desc.print_fmt = lilv_node_as_string(render);
1471 lilv_node_free(render);
1477 load_parameter_descriptor(LV2World& world,
1478 ParameterDescriptor& desc,
1479 Variant::Type datatype,
1480 const LilvNode* subject)
1482 LilvWorld* lworld = _world.world;
1483 LilvNode* label = get_value(lworld, subject, _world.rdfs_label);
1484 LilvNode* def = get_value(lworld, subject, _world.lv2_default);
1485 LilvNode* minimum = get_value(lworld, subject, _world.lv2_minimum);
1486 LilvNode* maximum = get_value(lworld, subject, _world.lv2_maximum);
1487 LilvNodes* units = lilv_world_find_nodes(lworld, subject, _world.units_unit, NULL);
1489 desc.label = lilv_node_as_string(label);
1491 if (def && lilv_node_is_float(def)) {
1492 desc.normal = lilv_node_as_float(def);
1494 if (minimum && lilv_node_is_float(minimum)) {
1495 desc.lower = lilv_node_as_float(minimum);
1497 if (maximum && lilv_node_is_float(maximum)) {
1498 desc.upper = lilv_node_as_float(maximum);
1500 load_parameter_descriptor_units(lworld, desc, units);
1501 desc.datatype = datatype;
1502 desc.toggled |= datatype == Variant::BOOL;
1503 desc.integer_step |= datatype == Variant::INT || datatype == Variant::LONG;
1504 desc.update_steps();
1506 lilv_nodes_free(units);
1507 lilv_node_free(label);
1508 lilv_node_free(def);
1509 lilv_node_free(minimum);
1510 lilv_node_free(maximum);
1514 LV2Plugin::load_supported_properties(PropertyDescriptors& descs)
1516 LilvWorld* lworld = _world.world;
1517 const LilvNode* subject = lilv_plugin_get_uri(_impl->plugin);
1518 LilvNodes* properties = lilv_world_find_nodes(
1519 lworld, subject, _world.patch_writable, NULL);
1520 LILV_FOREACH(nodes, p, properties) {
1521 // Get label and range
1522 const LilvNode* prop = lilv_nodes_get(properties, p);
1523 LilvNode* range = get_value(lworld, prop, _world.rdfs_range);
1525 warning << string_compose(_("LV2: property <%1> has no range datatype, ignoring"),
1526 lilv_node_as_uri(prop)) << endmsg;
1530 // Convert range to variant type (TODO: support for multiple range types)
1531 Variant::Type datatype;
1532 if (!uri_to_variant_type(lilv_node_as_uri(range), datatype)) {
1533 error << string_compose(_("LV2: property <%1> has unsupported datatype <%1>"),
1534 lilv_node_as_uri(prop), lilv_node_as_uri(range)) << endmsg;
1538 // Add description to result
1539 ParameterDescriptor desc;
1540 desc.key = _uri_map.uri_to_id(lilv_node_as_uri(prop));
1541 desc.datatype = datatype;
1542 load_parameter_descriptor(_world, desc, datatype, prop);
1543 descs.insert(std::make_pair(desc.key, desc));
1545 lilv_node_free(range);
1547 lilv_nodes_free(properties);
1551 LV2Plugin::announce_property_values()
1553 if (_patch_port_in_index == (uint32_t)-1) {
1557 // Set up forge to write to temporary buffer on the stack
1558 LV2_Atom_Forge* forge = &_impl->ui_forge;
1559 LV2_Atom_Forge_Frame frame;
1560 uint8_t buf[PATH_MAX]; // Ought to be enough for anyone...
1562 lv2_atom_forge_set_buffer(forge, buf, sizeof(buf));
1564 // Serialize patch:Get message with no subject (implicitly plugin instance)
1565 #ifdef HAVE_LV2_1_10_0
1566 lv2_atom_forge_object(forge, &frame, 1, _uri_map.urids.patch_Get);
1568 lv2_atom_forge_blank(forge, &frame, 1, _uri_map.urids.patch_Get);
1571 // Write message to UI=>Plugin ring
1572 const LV2_Atom* const atom = (const LV2_Atom*)buf;
1573 write_from_ui(_patch_port_in_index,
1574 _uri_map.urids.atom_eventTransfer,
1575 lv2_atom_total_size(atom),
1576 (const uint8_t*)atom);
1580 LV2Plugin::enable_ui_emission()
1583 /* see note in LV2Plugin::write_from_ui() */
1584 uint32_t bufsiz = 32768;
1585 if (_atom_ev_buffers && _atom_ev_buffers[0]) {
1586 bufsiz = lv2_evbuf_get_capacity(_atom_ev_buffers[0]);
1588 size_t rbs = _session.engine().raw_buffer_size(DataType::MIDI) * NBUFS;
1589 rbs = max((size_t) bufsiz * 8, rbs);
1590 _to_ui = new RingBuffer<uint8_t>(rbs);
1595 LV2Plugin::emit_to_ui(void* controller, UIMessageSink sink)
1601 uint32_t read_space = _to_ui->read_space();
1602 while (read_space > sizeof(UIMessage)) {
1604 if (_to_ui->read((uint8_t*)&msg, sizeof(msg)) != sizeof(msg)) {
1605 error << "Error reading from Plugin=>UI RingBuffer" << endmsg;
1608 vector<uint8_t> body(msg.size);
1609 if (_to_ui->read(&body[0], msg.size) != msg.size) {
1610 error << "Error reading from Plugin=>UI RingBuffer" << endmsg;
1614 sink(controller, msg.index, msg.size, msg.protocol, &body[0]);
1616 read_space -= sizeof(msg) + msg.size;
1621 LV2Plugin::work(uint32_t size, const void* data)
1623 return _impl->work_iface->work(
1624 _impl->instance->lv2_handle, work_respond, this, size, data);
1628 LV2Plugin::work_response(uint32_t size, const void* data)
1630 return _impl->work_iface->work_response(
1631 _impl->instance->lv2_handle, size, data);
1635 LV2Plugin::set_insert_id(PBD::ID id)
1641 LV2Plugin::set_state(const XMLNode& node, int version)
1644 const XMLProperty* prop;
1645 XMLNodeConstIterator iter;
1650 LocaleGuard lg(X_("C"));
1652 if (node.name() != state_node_name()) {
1653 error << _("Bad node sent to LV2Plugin::set_state") << endmsg;
1657 #ifndef NO_PLUGIN_STATE
1659 if (version < 3000) {
1660 nodes = node.children("port");
1662 nodes = node.children("Port");
1665 for (iter = nodes.begin(); iter != nodes.end(); ++iter) {
1669 if ((prop = child->property("symbol")) != 0) {
1670 sym = prop->value().c_str();
1672 warning << _("LV2: port has no symbol, ignored") << endmsg;
1676 map<string, uint32_t>::iterator i = _port_indices.find(sym);
1678 if (i != _port_indices.end()) {
1679 port_id = i->second;
1681 warning << _("LV2: port has unknown index, ignored") << endmsg;
1685 if ((prop = child->property("value")) != 0) {
1686 value = prop->value().c_str();
1688 warning << _("LV2: port has no value, ignored") << endmsg;
1692 set_parameter(port_id, atof(value));
1696 if ((prop = node.property("state-dir")) != 0) {
1697 if (sscanf(prop->value().c_str(), "state%u", &_state_version) != 1) {
1698 error << string_compose(
1699 "LV2: failed to parse state version from \"%1\"",
1700 prop->value()) << endmsg;
1703 std::string state_file = Glib::build_filename(
1705 Glib::build_filename(prop->value(), "state.ttl"));
1707 LilvState* state = lilv_state_new_from_file(
1708 _world.world, _uri_map.urid_map(), NULL, state_file.c_str());
1710 lilv_state_restore(state, _impl->instance, NULL, NULL, 0, NULL);
1711 lilv_state_free(_impl->state);
1712 _impl->state = state;
1715 latency_compute_run();
1718 return Plugin::set_state(node, version);
1722 LV2Plugin::get_parameter_descriptor(uint32_t which, ParameterDescriptor& desc) const
1724 const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, which);
1726 error << string_compose("LV2: get descriptor of non-existent port %1", which)
1731 LilvNodes* portunits;
1732 LilvNode *def, *min, *max;
1733 lilv_port_get_range(_impl->plugin, port, &def, &min, &max);
1734 portunits = lilv_port_get_value(_impl->plugin, port, _world.units_unit);
1736 // TODO: Once we can rely on lilv 0.18.0 being present,
1737 // load_parameter_descriptor() can be used for ports as well
1738 desc.integer_step = lilv_port_has_property(_impl->plugin, port, _world.lv2_integer);
1739 desc.toggled = lilv_port_has_property(_impl->plugin, port, _world.lv2_toggled);
1740 desc.logarithmic = lilv_port_has_property(_impl->plugin, port, _world.ext_logarithmic);
1741 desc.sr_dependent = lilv_port_has_property(_impl->plugin, port, _world.lv2_sampleRate);
1742 desc.label = lilv_node_as_string(lilv_port_get_name(_impl->plugin, port));
1743 desc.normal = def ? lilv_node_as_float(def) : 0.0f;
1744 desc.lower = min ? lilv_node_as_float(min) : 0.0f;
1745 desc.upper = max ? lilv_node_as_float(max) : 1.0f;
1746 load_parameter_descriptor_units(_world.world, desc, portunits);
1748 if (desc.sr_dependent) {
1749 desc.lower *= _session.frame_rate ();
1750 desc.upper *= _session.frame_rate ();
1753 desc.min_unbound = false; // TODO: LV2 extension required
1754 desc.max_unbound = false; // TODO: LV2 extension required
1756 desc.enumeration = lilv_port_has_property(_impl->plugin, port, _world.lv2_enumeration);
1757 desc.scale_points = get_scale_points(which);
1759 desc.update_steps();
1761 lilv_node_free(def);
1762 lilv_node_free(min);
1763 lilv_node_free(max);
1764 lilv_nodes_free(portunits);
1770 LV2Plugin::describe_parameter(Evoral::Parameter which)
1772 if (( which.type() == PluginAutomation) && ( which.id() < parameter_count()) ) {
1774 if (lilv_port_has_property(_impl->plugin,
1775 lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.ext_notOnGUI)) {
1776 return X_("hidden");
1779 if (lilv_port_has_property(_impl->plugin,
1780 lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.lv2_freewheeling)) {
1781 return X_("hidden");
1784 if (lilv_port_has_property(_impl->plugin,
1785 lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.lv2_reportsLatency)) {
1786 return X_("latency");
1789 LilvNode* name = lilv_port_get_name(_impl->plugin,
1790 lilv_plugin_get_port_by_index(_impl->plugin, which.id()));
1791 string ret(lilv_node_as_string(name));
1792 lilv_node_free(name);
1800 LV2Plugin::signal_latency() const
1802 if (_latency_control_port) {
1803 return (framecnt_t)floor(*_latency_control_port);
1809 set<Evoral::Parameter>
1810 LV2Plugin::automatable() const
1812 set<Evoral::Parameter> ret;
1814 for (uint32_t i = 0; i < parameter_count(); ++i) {
1815 if (parameter_is_input(i) && parameter_is_control(i)) {
1816 ret.insert(ret.end(), Evoral::Parameter(PluginAutomation, 0, i));
1820 for (PropertyDescriptors::const_iterator p = _property_descriptors.begin();
1821 p != _property_descriptors.end();
1823 ret.insert(ret.end(), Evoral::Parameter(PluginPropertyAutomation, 0, p->first));
1829 LV2Plugin::activate()
1831 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 activate\n", name()));
1833 if (!_was_activated) {
1834 lilv_instance_activate(_impl->instance);
1835 _was_activated = true;
1840 LV2Plugin::deactivate()
1842 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 deactivate\n", name()));
1844 if (_was_activated) {
1845 lilv_instance_deactivate(_impl->instance);
1846 _was_activated = false;
1851 LV2Plugin::cleanup()
1853 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 cleanup\n", name()));
1857 lilv_instance_free(_impl->instance);
1858 _impl->instance = NULL;
1862 LV2Plugin::allocate_atom_event_buffers()
1864 /* reserve local scratch buffers for ATOM event-queues */
1865 const LilvPlugin* p = _impl->plugin;
1867 /* count non-MIDI atom event-ports
1868 * TODO: nicely ask drobilla to make a lilv_ call for that
1870 int count_atom_out = 0;
1871 int count_atom_in = 0;
1872 int minimumSize = 32768; // TODO use a per-port minimum-size
1873 for (uint32_t i = 0; i < lilv_plugin_get_num_ports(p); ++i) {
1874 const LilvPort* port = lilv_plugin_get_port_by_index(p, i);
1875 if (lilv_port_is_a(p, port, _world.atom_AtomPort)) {
1876 LilvNodes* buffer_types = lilv_port_get_value(
1877 p, port, _world.atom_bufferType);
1878 LilvNodes* atom_supports = lilv_port_get_value(
1879 p, port, _world.atom_supports);
1881 if (!lilv_nodes_contains(buffer_types, _world.atom_Sequence)
1882 || !lilv_nodes_contains(atom_supports, _world.midi_MidiEvent)) {
1883 if (lilv_port_is_a(p, port, _world.lv2_InputPort)) {
1886 if (lilv_port_is_a(p, port, _world.lv2_OutputPort)) {
1889 LilvNodes* min_size_v = lilv_port_get_value(_impl->plugin, port, _world.rsz_minimumSize);
1890 LilvNode* min_size = min_size_v ? lilv_nodes_get_first(min_size_v) : NULL;
1891 if (min_size && lilv_node_is_int(min_size)) {
1892 minimumSize = std::max(minimumSize, lilv_node_as_int(min_size));
1894 lilv_nodes_free(min_size_v);
1896 lilv_nodes_free(buffer_types);
1897 lilv_nodes_free(atom_supports);
1901 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 need buffers for %2 atom-in and %3 atom-out event-ports\n",
1902 name(), count_atom_in, count_atom_out));
1904 const int total_atom_buffers = (count_atom_in + count_atom_out);
1905 if (_atom_ev_buffers || total_atom_buffers == 0) {
1909 DEBUG_TRACE(DEBUG::LV2, string_compose("allocate %1 atom_ev_buffers of %d bytes\n", total_atom_buffers, minimumSize));
1910 _atom_ev_buffers = (LV2_Evbuf**) malloc((total_atom_buffers + 1) * sizeof(LV2_Evbuf*));
1911 for (int i = 0; i < total_atom_buffers; ++i ) {
1912 _atom_ev_buffers[i] = lv2_evbuf_new(minimumSize, LV2_EVBUF_ATOM,
1913 _uri_map.urids.atom_Chunk, _uri_map.urids.atom_Sequence);
1915 _atom_ev_buffers[total_atom_buffers] = 0;
1919 /** Write an ardour position/time/tempo/meter as an LV2 event.
1920 * @return true on success.
1923 write_position(LV2_Atom_Forge* forge,
1925 const TempoMetric& t,
1926 Timecode::BBT_Time& bbt,
1928 framepos_t position,
1931 const URIMap::URIDs& urids = URIMap::instance().urids;
1933 uint8_t pos_buf[256];
1934 lv2_atom_forge_set_buffer(forge, pos_buf, sizeof(pos_buf));
1935 LV2_Atom_Forge_Frame frame;
1936 #ifdef HAVE_LV2_1_10_0
1937 lv2_atom_forge_object(forge, &frame, 1, urids.time_Position);
1938 lv2_atom_forge_key(forge, urids.time_frame);
1939 lv2_atom_forge_long(forge, position);
1940 lv2_atom_forge_key(forge, urids.time_speed);
1941 lv2_atom_forge_float(forge, speed);
1942 lv2_atom_forge_key(forge, urids.time_barBeat);
1943 lv2_atom_forge_float(forge, bbt.beats - 1 +
1944 (bbt.ticks / Timecode::BBT_Time::ticks_per_beat));
1945 lv2_atom_forge_key(forge, urids.time_bar);
1946 lv2_atom_forge_long(forge, bbt.bars - 1);
1947 lv2_atom_forge_key(forge, urids.time_beatUnit);
1948 lv2_atom_forge_int(forge, t.meter().note_divisor());
1949 lv2_atom_forge_key(forge, urids.time_beatsPerBar);
1950 lv2_atom_forge_float(forge, t.meter().divisions_per_bar());
1951 lv2_atom_forge_key(forge, urids.time_beatsPerMinute);
1952 lv2_atom_forge_float(forge, t.tempo().beats_per_minute());
1954 lv2_atom_forge_blank(forge, &frame, 1, urids.time_Position);
1955 lv2_atom_forge_property_head(forge, urids.time_frame, 0);
1956 lv2_atom_forge_long(forge, position);
1957 lv2_atom_forge_property_head(forge, urids.time_speed, 0);
1958 lv2_atom_forge_float(forge, speed);
1959 lv2_atom_forge_property_head(forge, urids.time_barBeat, 0);
1960 lv2_atom_forge_float(forge, bbt.beats - 1 +
1961 (bbt.ticks / Timecode::BBT_Time::ticks_per_beat));
1962 lv2_atom_forge_property_head(forge, urids.time_bar, 0);
1963 lv2_atom_forge_long(forge, bbt.bars - 1);
1964 lv2_atom_forge_property_head(forge, urids.time_beatUnit, 0);
1965 lv2_atom_forge_int(forge, t.meter().note_divisor());
1966 lv2_atom_forge_property_head(forge, urids.time_beatsPerBar, 0);
1967 lv2_atom_forge_float(forge, t.meter().divisions_per_bar());
1968 lv2_atom_forge_property_head(forge, urids.time_beatsPerMinute, 0);
1969 lv2_atom_forge_float(forge, t.tempo().beats_per_minute());
1972 LV2_Evbuf_Iterator end = lv2_evbuf_end(buf);
1973 const LV2_Atom* const atom = (const LV2_Atom*)pos_buf;
1974 return lv2_evbuf_write(&end, offset, 0, atom->type, atom->size,
1975 (const uint8_t*)(atom + 1));
1979 LV2Plugin::connect_and_run(BufferSet& bufs,
1980 ChanMapping in_map, ChanMapping out_map,
1981 pframes_t nframes, framecnt_t offset)
1983 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 run %2 offset %3\n", name(), nframes, offset));
1984 Plugin::connect_and_run(bufs, in_map, out_map, nframes, offset);
1986 cycles_t then = get_cycles();
1988 TempoMap& tmap = _session.tempo_map();
1989 Metrics::const_iterator metric_i = tmap.metrics_end();
1990 TempoMetric tmetric = tmap.metric_at(_session.transport_frame(), &metric_i);
1992 if (_freewheel_control_port) {
1993 *_freewheel_control_port = _session.engine().freewheeling() ? 1.f : 0.f;
1996 if (_bpm_control_port) {
1997 *_bpm_control_port = tmetric.tempo().beats_per_minute();
2000 ChanCount bufs_count;
2001 bufs_count.set(DataType::AUDIO, 1);
2002 bufs_count.set(DataType::MIDI, 1);
2003 BufferSet& silent_bufs = _session.get_silent_buffers(bufs_count);
2004 BufferSet& scratch_bufs = _session.get_scratch_buffers(bufs_count);
2005 uint32_t const num_ports = parameter_count();
2006 uint32_t const nil_index = std::numeric_limits<uint32_t>::max();
2008 uint32_t audio_in_index = 0;
2009 uint32_t audio_out_index = 0;
2010 uint32_t midi_in_index = 0;
2011 uint32_t midi_out_index = 0;
2012 uint32_t atom_port_index = 0;
2013 for (uint32_t port_index = 0; port_index < num_ports; ++port_index) {
2015 uint32_t index = nil_index;
2016 PortFlags flags = _port_flags[port_index];
2018 if (flags & PORT_AUDIO) {
2019 if (flags & PORT_INPUT) {
2020 index = in_map.get(DataType::AUDIO, audio_in_index++, &valid);
2022 ? bufs.get_audio(index).data(offset)
2023 : silent_bufs.get_audio(0).data(offset);
2025 index = out_map.get(DataType::AUDIO, audio_out_index++, &valid);
2027 ? bufs.get_audio(index).data(offset)
2028 : scratch_bufs.get_audio(0).data(offset);
2030 } else if (flags & (PORT_EVENT|PORT_SEQUENCE)) {
2031 /* FIXME: The checks here for bufs.count().n_midi() > index shouldn't
2032 be necessary, but the mapping is illegal in some cases. Ideally
2033 that should be fixed, but this is easier...
2035 if (flags & PORT_MIDI) {
2036 if (flags & PORT_INPUT) {
2037 index = in_map.get(DataType::MIDI, midi_in_index++, &valid);
2039 index = out_map.get(DataType::MIDI, midi_out_index++, &valid);
2041 if (valid && bufs.count().n_midi() > index) {
2042 /* Note, ensure_lv2_bufsize() is not RT safe!
2043 * However free()/alloc() is only called if a
2044 * plugin requires a rsz:minimumSize buffersize
2045 * and the existing buffer if smaller.
2047 bufs.ensure_lv2_bufsize((flags & PORT_INPUT), index, _port_minimumSize[port_index]);
2048 _ev_buffers[port_index] = bufs.get_lv2_midi(
2049 (flags & PORT_INPUT), index, (flags & PORT_EVENT));
2051 } else if ((flags & PORT_POSITION) && (flags & PORT_INPUT)) {
2052 lv2_evbuf_reset(_atom_ev_buffers[atom_port_index], true);
2053 _ev_buffers[port_index] = _atom_ev_buffers[atom_port_index++];
2057 if (valid && (flags & PORT_INPUT)) {
2058 Timecode::BBT_Time bbt;
2059 if ((flags & PORT_POSITION)) {
2060 if (_session.transport_frame() != _next_cycle_start ||
2061 _session.transport_speed() != _next_cycle_speed) {
2062 // Transport has changed, write position at cycle start
2063 tmap.bbt_time(_session.transport_frame(), bbt);
2064 write_position(&_impl->forge, _ev_buffers[port_index],
2065 tmetric, bbt, _session.transport_speed(),
2066 _session.transport_frame(), 0);
2070 // Get MIDI iterator range (empty range if no MIDI)
2071 MidiBuffer::iterator m = (index != nil_index)
2072 ? bufs.get_midi(index).begin()
2073 : silent_bufs.get_midi(0).end();
2074 MidiBuffer::iterator m_end = (index != nil_index)
2075 ? bufs.get_midi(index).end()
2078 // Now merge MIDI and any transport events into the buffer
2079 const uint32_t type = _uri_map.urids.midi_MidiEvent;
2080 const framepos_t tend = _session.transport_frame() + nframes;
2082 while (m != m_end || (metric_i != tmap.metrics_end() &&
2083 (*metric_i)->frame() < tend)) {
2084 MetricSection* metric = (metric_i != tmap.metrics_end())
2086 if (m != m_end && (!metric || metric->frame() > (*m).time())) {
2087 const Evoral::MIDIEvent<framepos_t> ev(*m, false);
2088 LV2_Evbuf_Iterator eend = lv2_evbuf_end(_ev_buffers[port_index]);
2089 lv2_evbuf_write(&eend, ev.time(), 0, type, ev.size(), ev.buffer());
2092 tmetric.set_metric(metric);
2093 bbt = metric->start();
2094 write_position(&_impl->forge, _ev_buffers[port_index],
2095 tmetric, bbt, _session.transport_speed(),
2097 metric->frame() - _session.transport_frame());
2101 } else if (!valid) {
2102 // Nothing we understand or care about, connect to scratch
2103 // see note for midi-buffer size above
2104 scratch_bufs.ensure_lv2_bufsize((flags & PORT_INPUT),
2105 0, _port_minimumSize[port_index]);
2106 _ev_buffers[port_index] = scratch_bufs.get_lv2_midi(
2107 (flags & PORT_INPUT), 0, (flags & PORT_EVENT));
2110 buf = lv2_evbuf_get_buffer(_ev_buffers[port_index]);
2112 continue; // Control port, leave buffer alone
2114 lilv_instance_connect_port(_impl->instance, port_index, buf);
2117 // Read messages from UI and push into appropriate buffers
2119 uint32_t read_space = _from_ui->read_space();
2120 while (read_space > sizeof(UIMessage)) {
2122 if (_from_ui->read((uint8_t*)&msg, sizeof(msg)) != sizeof(msg)) {
2123 error << "Error reading from UI=>Plugin RingBuffer" << endmsg;
2126 vector<uint8_t> body(msg.size);
2127 if (_from_ui->read(&body[0], msg.size) != msg.size) {
2128 error << "Error reading from UI=>Plugin RingBuffer" << endmsg;
2131 if (msg.protocol == URIMap::instance().urids.atom_eventTransfer) {
2132 LV2_Evbuf* buf = _ev_buffers[msg.index];
2133 LV2_Evbuf_Iterator i = lv2_evbuf_end(buf);
2134 const LV2_Atom* const atom = (const LV2_Atom*)&body[0];
2135 if (!lv2_evbuf_write(&i, nframes - 1, 0, atom->type, atom->size,
2136 (const uint8_t*)(atom + 1))) {
2137 error << "Failed to write data to LV2 event buffer\n";
2140 error << "Received unknown message type from UI" << endmsg;
2142 read_space -= sizeof(UIMessage) + msg.size;
2149 for (uint32_t port_index = 0; port_index < num_ports; ++port_index) {
2150 PortFlags flags = _port_flags[port_index];
2153 /* TODO ask drobilla about comment
2154 * "Make Ardour event buffers generic so plugins can communicate"
2155 * in libs/ardour/buffer_set.cc:310
2157 * ideally the user could choose which of the following two modes
2158 * to use (e.g. instrument/effect chains MIDI OUT vs MIDI TRHU).
2160 * This implementation follows the discussion on IRC Mar 16 2013 16:47 UTC
2161 * 16:51 < drobilla> rgareus: [..] i.e always replace with MIDI output [of LV2 plugin] if it's there
2162 * 16:52 < drobilla> rgareus: That would probably be good enough [..] to make users not complain
2163 * for quite a while at least ;)
2165 // copy output of LV2 plugin's MIDI port to Ardour MIDI buffers -- MIDI OUT
2166 if ((flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE|PORT_MIDI))) {
2167 const uint32_t buf_index = out_map.get(
2168 DataType::MIDI, midi_out_index++, &valid);
2170 bufs.forward_lv2_midi(_ev_buffers[port_index], buf_index);
2173 // Flush MIDI (write back to Ardour MIDI buffers) -- MIDI THRU
2174 else if ((flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE))) {
2175 const uint32_t buf_index = out_map.get(
2176 DataType::MIDI, midi_out_index++, &valid);
2178 bufs.flush_lv2_midi(true, buf_index);
2183 // Write messages to UI
2184 if ((_to_ui || _patch_port_out_index != (uint32_t)-1) &&
2185 (flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE))) {
2186 LV2_Evbuf* buf = _ev_buffers[port_index];
2187 for (LV2_Evbuf_Iterator i = lv2_evbuf_begin(buf);
2188 lv2_evbuf_is_valid(i);
2189 i = lv2_evbuf_next(i)) {
2190 uint32_t frames, subframes, type, size;
2192 lv2_evbuf_get(i, &frames, &subframes, &type, &size, &data);
2194 // Intercept patch change messages to emit PropertyChanged signal
2195 if ((flags & PORT_PATCHMSG)) {
2196 LV2_Atom* atom = (LV2_Atom*)(data - sizeof(LV2_Atom));
2197 if (atom->type == _uri_map.urids.atom_Blank ||
2198 atom->type == _uri_map.urids.atom_Object) {
2199 LV2_Atom_Object* obj = (LV2_Atom_Object*)atom;
2200 if (obj->body.otype == _uri_map.urids.patch_Set) {
2201 const LV2_Atom* property = NULL;
2202 const LV2_Atom* value = NULL;
2203 lv2_atom_object_get(obj,
2204 _uri_map.urids.patch_property, &property,
2205 _uri_map.urids.patch_value, &value,
2208 if (!property || !value ||
2209 property->type != _uri_map.urids.atom_URID ||
2210 value->type != _uri_map.urids.atom_Path) {
2211 std::cerr << "warning: patch:Set for unknown property" << std::endl;
2215 const uint32_t prop_id = ((const LV2_Atom_URID*)property)->body;
2216 const char* path = (const char*)LV2_ATOM_BODY_CONST(value);
2218 // Emit PropertyChanged signal for UI
2219 // TODO: This should emit the control's Changed signal
2220 PropertyChanged(prop_id, Variant(Variant::PATH, path));
2225 if (!_to_ui) continue;
2226 write_to_ui(port_index, URIMap::instance().urids.atom_eventTransfer,
2227 size + sizeof(LV2_Atom),
2228 data - sizeof(LV2_Atom));
2233 cycles_t now = get_cycles();
2234 set_cycles((uint32_t)(now - then));
2236 // Update expected transport information for next cycle so we can detect changes
2237 _next_cycle_speed = _session.transport_speed();
2238 _next_cycle_start = _session.transport_frame() + (nframes * _next_cycle_speed);
2244 LV2Plugin::parameter_is_control(uint32_t param) const
2246 assert(param < _port_flags.size());
2247 return _port_flags[param] & PORT_CONTROL;
2251 LV2Plugin::parameter_is_audio(uint32_t param) const
2253 assert(param < _port_flags.size());
2254 return _port_flags[param] & PORT_AUDIO;
2258 LV2Plugin::parameter_is_event(uint32_t param) const
2260 assert(param < _port_flags.size());
2261 return _port_flags[param] & PORT_EVENT;
2265 LV2Plugin::parameter_is_output(uint32_t param) const
2267 assert(param < _port_flags.size());
2268 return _port_flags[param] & PORT_OUTPUT;
2272 LV2Plugin::parameter_is_input(uint32_t param) const
2274 assert(param < _port_flags.size());
2275 return _port_flags[param] & PORT_INPUT;
2279 LV2Plugin::print_parameter(uint32_t param, char* buf, uint32_t len) const
2282 if (param < parameter_count()) {
2283 snprintf(buf, len, "%.3f", get_parameter(param));
2290 boost::shared_ptr<ScalePoints>
2291 LV2Plugin::get_scale_points(uint32_t port_index) const
2293 const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, port_index);
2294 LilvScalePoints* points = lilv_port_get_scale_points(_impl->plugin, port);
2296 boost::shared_ptr<ScalePoints> ret;
2301 ret = boost::shared_ptr<ScalePoints>(new ScalePoints());
2303 LILV_FOREACH(scale_points, i, points) {
2304 const LilvScalePoint* p = lilv_scale_points_get(points, i);
2305 const LilvNode* label = lilv_scale_point_get_label(p);
2306 const LilvNode* value = lilv_scale_point_get_value(p);
2307 if (label && (lilv_node_is_float(value) || lilv_node_is_int(value))) {
2308 ret->insert(make_pair(lilv_node_as_string(label),
2309 lilv_node_as_float(value)));
2313 lilv_scale_points_free(points);
2318 LV2Plugin::run(pframes_t nframes)
2320 uint32_t const N = parameter_count();
2321 for (uint32_t i = 0; i < N; ++i) {
2322 if (parameter_is_control(i) && parameter_is_input(i)) {
2323 _control_data[i] = _shadow_data[i];
2327 lilv_instance_run(_impl->instance, nframes);
2329 if (_impl->work_iface) {
2330 _worker->emit_responses();
2331 if (_impl->work_iface->end_run) {
2332 _impl->work_iface->end_run(_impl->instance->lv2_handle);
2338 LV2Plugin::latency_compute_run()
2340 if (!_latency_control_port) {
2344 // Run the plugin so that it can set its latency parameter
2346 bool was_activated = _was_activated;
2349 uint32_t port_index = 0;
2350 uint32_t in_index = 0;
2351 uint32_t out_index = 0;
2353 // this is done in the main thread. non realtime.
2354 const framecnt_t bufsize = _engine.samples_per_cycle();
2355 float *buffer = (float*) malloc(_engine.samples_per_cycle() * sizeof(float));
2357 memset(buffer, 0, sizeof(float) * bufsize);
2359 // FIXME: Ensure plugins can handle in-place processing
2363 while (port_index < parameter_count()) {
2364 if (parameter_is_audio(port_index)) {
2365 if (parameter_is_input(port_index)) {
2366 lilv_instance_connect_port(_impl->instance, port_index, buffer);
2368 } else if (parameter_is_output(port_index)) {
2369 lilv_instance_connect_port(_impl->instance, port_index, buffer);
2378 if (was_activated) {
2385 LV2Plugin::Impl::designated_input (const char* uri, void** bufptrs[], void** bufptr)
2387 const LilvPort* port = NULL;
2388 LilvNode* designation = lilv_new_uri(_world.world, uri);
2389 port = lilv_plugin_get_port_by_designation(
2390 plugin, _world.lv2_InputPort, designation);
2391 lilv_node_free(designation);
2393 bufptrs[lilv_port_get_index(plugin, port)] = bufptr;
2398 static bool lv2_filter (const string& str, void* /*arg*/)
2400 /* Not a dotfile, has a prefix before a period, suffix is "lv2" */
2402 return str[0] != '.' && (str.length() > 3 && str.find (".lv2") == (str.length() - 4));
2406 LV2World::LV2World()
2407 : world(lilv_world_new())
2408 , _bundle_checked(false)
2410 atom_AtomPort = lilv_new_uri(world, LV2_ATOM__AtomPort);
2411 atom_Chunk = lilv_new_uri(world, LV2_ATOM__Chunk);
2412 atom_Sequence = lilv_new_uri(world, LV2_ATOM__Sequence);
2413 atom_bufferType = lilv_new_uri(world, LV2_ATOM__bufferType);
2414 atom_supports = lilv_new_uri(world, LV2_ATOM__supports);
2415 atom_eventTransfer = lilv_new_uri(world, LV2_ATOM__eventTransfer);
2416 ev_EventPort = lilv_new_uri(world, LILV_URI_EVENT_PORT);
2417 ext_logarithmic = lilv_new_uri(world, LV2_PORT_PROPS__logarithmic);
2418 ext_notOnGUI = lilv_new_uri(world, LV2_PORT_PROPS__notOnGUI);
2419 lv2_AudioPort = lilv_new_uri(world, LILV_URI_AUDIO_PORT);
2420 lv2_ControlPort = lilv_new_uri(world, LILV_URI_CONTROL_PORT);
2421 lv2_InputPort = lilv_new_uri(world, LILV_URI_INPUT_PORT);
2422 lv2_OutputPort = lilv_new_uri(world, LILV_URI_OUTPUT_PORT);
2423 lv2_inPlaceBroken = lilv_new_uri(world, LV2_CORE__inPlaceBroken);
2424 lv2_integer = lilv_new_uri(world, LV2_CORE__integer);
2425 lv2_default = lilv_new_uri(world, LV2_CORE__default);
2426 lv2_minimum = lilv_new_uri(world, LV2_CORE__minimum);
2427 lv2_maximum = lilv_new_uri(world, LV2_CORE__maximum);
2428 lv2_reportsLatency = lilv_new_uri(world, LV2_CORE__reportsLatency);
2429 lv2_sampleRate = lilv_new_uri(world, LV2_CORE__sampleRate);
2430 lv2_toggled = lilv_new_uri(world, LV2_CORE__toggled);
2431 lv2_enumeration = lilv_new_uri(world, LV2_CORE__enumeration);
2432 lv2_freewheeling = lilv_new_uri(world, LV2_CORE__freeWheeling);
2433 midi_MidiEvent = lilv_new_uri(world, LILV_URI_MIDI_EVENT);
2434 rdfs_comment = lilv_new_uri(world, LILV_NS_RDFS "comment");
2435 rdfs_label = lilv_new_uri(world, LILV_NS_RDFS "label");
2436 rdfs_range = lilv_new_uri(world, LILV_NS_RDFS "range");
2437 rsz_minimumSize = lilv_new_uri(world, LV2_RESIZE_PORT__minimumSize);
2438 time_Position = lilv_new_uri(world, LV2_TIME__Position);
2439 ui_GtkUI = lilv_new_uri(world, LV2_UI__GtkUI);
2440 ui_external = lilv_new_uri(world, "http://lv2plug.in/ns/extensions/ui#external");
2441 ui_externalkx = lilv_new_uri(world, "http://kxstudio.sf.net/ns/lv2ext/external-ui#Widget");
2442 units_unit = lilv_new_uri(world, LV2_UNITS__unit);
2443 units_render = lilv_new_uri(world, LV2_UNITS__render);
2444 units_hz = lilv_new_uri(world, LV2_UNITS__hz);
2445 units_midiNote = lilv_new_uri(world, LV2_UNITS__midiNote);
2446 units_db = lilv_new_uri(world, LV2_UNITS__db);
2447 patch_writable = lilv_new_uri(world, LV2_PATCH__writable);
2448 patch_Message = lilv_new_uri(world, LV2_PATCH__Message);
2449 #ifdef HAVE_LV2_1_2_0
2450 bufz_powerOf2BlockLength = lilv_new_uri(world, LV2_BUF_SIZE__powerOf2BlockLength);
2451 bufz_fixedBlockLength = lilv_new_uri(world, LV2_BUF_SIZE__fixedBlockLength);
2452 bufz_nominalBlockLength = lilv_new_uri(world, "http://lv2plug.in/ns/ext/buf-size#nominalBlockLength");
2457 LV2World::~LV2World()
2459 #ifdef HAVE_LV2_1_2_0
2460 lilv_node_free(bufz_nominalBlockLength);
2461 lilv_node_free(bufz_fixedBlockLength);
2462 lilv_node_free(bufz_powerOf2BlockLength);
2464 lilv_node_free(patch_Message);
2465 lilv_node_free(patch_writable);
2466 lilv_node_free(units_hz);
2467 lilv_node_free(units_midiNote);
2468 lilv_node_free(units_db);
2469 lilv_node_free(units_unit);
2470 lilv_node_free(units_render);
2471 lilv_node_free(ui_externalkx);
2472 lilv_node_free(ui_external);
2473 lilv_node_free(ui_GtkUI);
2474 lilv_node_free(time_Position);
2475 lilv_node_free(rsz_minimumSize);
2476 lilv_node_free(rdfs_comment);
2477 lilv_node_free(rdfs_label);
2478 lilv_node_free(rdfs_range);
2479 lilv_node_free(midi_MidiEvent);
2480 lilv_node_free(lv2_enumeration);
2481 lilv_node_free(lv2_freewheeling);
2482 lilv_node_free(lv2_toggled);
2483 lilv_node_free(lv2_sampleRate);
2484 lilv_node_free(lv2_reportsLatency);
2485 lilv_node_free(lv2_integer);
2486 lilv_node_free(lv2_inPlaceBroken);
2487 lilv_node_free(lv2_OutputPort);
2488 lilv_node_free(lv2_InputPort);
2489 lilv_node_free(lv2_ControlPort);
2490 lilv_node_free(lv2_AudioPort);
2491 lilv_node_free(ext_notOnGUI);
2492 lilv_node_free(ext_logarithmic);
2493 lilv_node_free(ev_EventPort);
2494 lilv_node_free(atom_supports);
2495 lilv_node_free(atom_eventTransfer);
2496 lilv_node_free(atom_bufferType);
2497 lilv_node_free(atom_Sequence);
2498 lilv_node_free(atom_Chunk);
2499 lilv_node_free(atom_AtomPort);
2500 lilv_world_free(world);
2504 LV2World::load_bundled_plugins(bool verbose)
2506 if (!_bundle_checked) {
2508 cout << "Scanning folders for bundled LV2s: " << ARDOUR::lv2_bundled_search_path().to_string() << endl;
2511 vector<string> plugin_objects;
2512 find_paths_matching_filter (plugin_objects, ARDOUR::lv2_bundled_search_path(), lv2_filter, 0, true, true, true);
2513 for ( vector<string>::iterator x = plugin_objects.begin(); x != plugin_objects.end (); ++x) {
2514 #ifdef PLATFORM_WINDOWS
2515 string uri = "file:///" + *x + "/";
2517 string uri = "file://" + *x + "/";
2519 LilvNode *node = lilv_new_uri(world, uri.c_str());
2520 lilv_world_load_bundle(world, node);
2521 lilv_node_free(node);
2524 lilv_world_load_all(world);
2525 _bundle_checked = true;
2529 LV2PluginInfo::LV2PluginInfo (const char* plugin_uri)
2532 _plugin_uri = strdup(plugin_uri);
2535 LV2PluginInfo::~LV2PluginInfo()
2542 LV2PluginInfo::load(Session& session)
2546 const LilvPlugins* plugins = lilv_world_get_all_plugins(_world.world);
2547 LilvNode* uri = lilv_new_uri(_world.world, _plugin_uri);
2548 if (!uri) { throw failed_constructor(); }
2549 const LilvPlugin* lp = lilv_plugins_get_by_uri(plugins, uri);
2550 if (!lp) { throw failed_constructor(); }
2551 plugin.reset(new LV2Plugin(session.engine(), session, lp, session.frame_rate()));
2552 lilv_node_free(uri);
2553 plugin->set_info(PluginInfoPtr(shared_from_this ()));
2555 } catch (failed_constructor& err) {
2556 return PluginPtr((Plugin*)0);
2563 LV2PluginInfo::discover()
2566 world.load_bundled_plugins();
2567 _world.load_bundled_plugins(true);
2569 PluginInfoList* plugs = new PluginInfoList;
2570 const LilvPlugins* plugins = lilv_world_get_all_plugins(world.world);
2572 LILV_FOREACH(plugins, i, plugins) {
2573 const LilvPlugin* p = lilv_plugins_get(plugins, i);
2574 const LilvNode* pun = lilv_plugin_get_uri(p);
2576 LV2PluginInfoPtr info(new LV2PluginInfo(lilv_node_as_string(pun)));
2578 LilvNode* name = lilv_plugin_get_name(p);
2579 if (!name || !lilv_plugin_get_port_by_index(p, 0)) {
2580 warning << "Ignoring invalid LV2 plugin "
2581 << lilv_node_as_string(lilv_plugin_get_uri(p))
2586 if (lilv_plugin_has_feature(p, world.lv2_inPlaceBroken)) {
2587 warning << string_compose(
2588 _("Ignoring LV2 plugin \"%1\" since it cannot do inplace processing."),
2589 lilv_node_as_string(name)) << endmsg;
2590 lilv_node_free(name);
2594 #ifdef HAVE_LV2_1_2_0
2595 LilvNodes *required_features = lilv_plugin_get_required_features (p);
2596 if (lilv_nodes_contains (required_features, world.bufz_powerOf2BlockLength) ||
2597 lilv_nodes_contains (required_features, world.bufz_fixedBlockLength)
2599 warning << string_compose(
2600 _("Ignoring LV2 plugin \"%1\" because its buffer-size requirements cannot be satisfied."),
2601 lilv_node_as_string(name)) << endmsg;
2602 lilv_nodes_free(required_features);
2603 lilv_node_free(name);
2606 lilv_nodes_free(required_features);
2611 info->name = string(lilv_node_as_string(name));
2612 lilv_node_free(name);
2613 ARDOUR::PluginScanMessage(_("LV2"), info->name, false);
2615 const LilvPluginClass* pclass = lilv_plugin_get_class(p);
2616 const LilvNode* label = lilv_plugin_class_get_label(pclass);
2617 info->category = lilv_node_as_string(label);
2619 LilvNode* author_name = lilv_plugin_get_author_name(p);
2620 info->creator = author_name ? string(lilv_node_as_string(author_name)) : "Unknown";
2621 lilv_node_free(author_name);
2623 info->path = "/NOPATH"; // Meaningless for LV2
2625 /* count atom-event-ports that feature
2626 * atom:supports <http://lv2plug.in/ns/ext/midi#MidiEvent>
2628 * TODO: nicely ask drobilla to make a lilv_ call for that
2630 int count_midi_out = 0;
2631 int count_midi_in = 0;
2632 for (uint32_t i = 0; i < lilv_plugin_get_num_ports(p); ++i) {
2633 const LilvPort* port = lilv_plugin_get_port_by_index(p, i);
2634 if (lilv_port_is_a(p, port, world.atom_AtomPort)) {
2635 LilvNodes* buffer_types = lilv_port_get_value(
2636 p, port, world.atom_bufferType);
2637 LilvNodes* atom_supports = lilv_port_get_value(
2638 p, port, world.atom_supports);
2640 if (lilv_nodes_contains(buffer_types, world.atom_Sequence)
2641 && lilv_nodes_contains(atom_supports, world.midi_MidiEvent)) {
2642 if (lilv_port_is_a(p, port, world.lv2_InputPort)) {
2645 if (lilv_port_is_a(p, port, world.lv2_OutputPort)) {
2649 lilv_nodes_free(buffer_types);
2650 lilv_nodes_free(atom_supports);
2654 info->n_inputs.set_audio(
2655 lilv_plugin_get_num_ports_of_class(
2656 p, world.lv2_InputPort, world.lv2_AudioPort, NULL));
2657 info->n_inputs.set_midi(
2658 lilv_plugin_get_num_ports_of_class(
2659 p, world.lv2_InputPort, world.ev_EventPort, NULL)
2662 info->n_outputs.set_audio(
2663 lilv_plugin_get_num_ports_of_class(
2664 p, world.lv2_OutputPort, world.lv2_AudioPort, NULL));
2665 info->n_outputs.set_midi(
2666 lilv_plugin_get_num_ports_of_class(
2667 p, world.lv2_OutputPort, world.ev_EventPort, NULL)
2670 info->unique_id = lilv_node_as_uri(lilv_plugin_get_uri(p));
2671 info->index = 0; // Meaningless for LV2
2673 plugs->push_back(info);