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 <glib/gstdio.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;
164 bool _bundle_checked;
167 static LV2World _world;
169 /* worker extension */
171 /** Called by the plugin to schedule non-RT work. */
172 static LV2_Worker_Status
173 work_schedule(LV2_Worker_Schedule_Handle handle,
177 LV2Plugin* plugin = (LV2Plugin*)handle;
178 if (plugin->session().engine().freewheeling()) {
179 // Freewheeling, do the work immediately in this (audio) thread
180 return (LV2_Worker_Status)plugin->work(size, data);
182 // Enqueue message for the worker thread
183 return plugin->worker()->schedule(size, data) ?
184 LV2_WORKER_SUCCESS : LV2_WORKER_ERR_UNKNOWN;
188 /** Called by the plugin to respond to non-RT work. */
189 static LV2_Worker_Status
190 work_respond(LV2_Worker_Respond_Handle handle,
194 LV2Plugin* plugin = (LV2Plugin*)handle;
195 if (plugin->session().engine().freewheeling()) {
196 // Freewheeling, respond immediately in this (audio) thread
197 return (LV2_Worker_Status)plugin->work_response(size, data);
199 // Enqueue response for the worker
200 return plugin->worker()->respond(size, data) ?
201 LV2_WORKER_SUCCESS : LV2_WORKER_ERR_UNKNOWN;
208 log_vprintf(LV2_Log_Handle /*handle*/,
214 const int ret = g_vasprintf(&str, fmt, args);
215 if (type == URIMap::instance().urids.log_Error) {
216 error << str << endmsg;
217 } else if (type == URIMap::instance().urids.log_Warning) {
218 warning << str << endmsg;
219 } else if (type == URIMap::instance().urids.log_Note) {
220 info << str << endmsg;
222 // TODO: Toggleable log:Trace message support
227 log_printf(LV2_Log_Handle handle,
229 const char* fmt, ...)
233 const int ret = log_vprintf(handle, type, fmt, args);
238 struct LV2Plugin::Impl {
239 Impl() : plugin(0), ui(0), ui_type(0), name(0), author(0), instance(0)
244 /** Find the LV2 input port with the given designation.
245 * If found, bufptrs[port_index] will be set to bufptr.
247 const LilvPort* designated_input (const char* uri, void** bufptrs[], void** bufptr);
249 const LilvPlugin* plugin;
251 const LilvNode* ui_type;
254 LilvInstance* instance;
255 const LV2_Worker_Interface* work_iface;
257 LV2_Atom_Forge forge;
258 LV2_Atom_Forge ui_forge;
261 LV2Plugin::LV2Plugin (AudioEngine& engine,
263 const void* c_plugin,
265 : Plugin (engine, session)
271 , _patch_port_in_index((uint32_t)-1)
272 , _patch_port_out_index((uint32_t)-1)
273 , _uri_map(URIMap::instance())
275 init(c_plugin, rate);
278 LV2Plugin::LV2Plugin (const LV2Plugin& other)
284 , _insert_id(other._insert_id)
285 , _patch_port_in_index((uint32_t)-1)
286 , _patch_port_out_index((uint32_t)-1)
287 , _uri_map(URIMap::instance())
289 init(other._impl->plugin, other._sample_rate);
291 for (uint32_t i = 0; i < parameter_count(); ++i) {
292 _control_data[i] = other._shadow_data[i];
293 _shadow_data[i] = other._shadow_data[i];
298 LV2Plugin::init(const void* c_plugin, framecnt_t rate)
300 DEBUG_TRACE(DEBUG::LV2, "init\n");
302 _impl->plugin = (const LilvPlugin*)c_plugin;
304 _impl->ui_type = NULL;
309 _atom_ev_buffers = 0;
311 _bpm_control_port = 0;
312 _freewheel_control_port = 0;
313 _latency_control_port = 0;
314 _next_cycle_start = std::numeric_limits<framepos_t>::max();
315 _next_cycle_speed = 1.0;
316 _seq_size = _engine.raw_buffer_size(DataType::MIDI);
318 _was_activated = false;
319 _has_state_interface = false;
321 _instance_access_feature.URI = "http://lv2plug.in/ns/ext/instance-access";
322 _data_access_feature.URI = "http://lv2plug.in/ns/ext/data-access";
323 _make_path_feature.URI = LV2_STATE__makePath;
324 _log_feature.URI = LV2_LOG__log;
325 _work_schedule_feature.URI = LV2_WORKER__schedule;
326 _work_schedule_feature.data = NULL;
327 _def_state_feature.URI = LV2_STATE_PREFIX "loadDefaultState"; // Post LV2-1.2.0
328 _def_state_feature.data = NULL;
330 const LilvPlugin* plugin = _impl->plugin;
332 LilvNode* state_iface_uri = lilv_new_uri(_world.world, LV2_STATE__interface);
333 LilvNode* state_uri = lilv_new_uri(_world.world, LV2_STATE_URI);
334 _has_state_interface =
335 // What plugins should have (lv2:extensionData state:Interface)
336 lilv_plugin_has_extension_data(plugin, state_iface_uri)
337 // What some outdated/incorrect ones have
338 || lilv_plugin_has_feature(plugin, state_uri);
339 lilv_node_free(state_uri);
340 lilv_node_free(state_iface_uri);
342 _features = (LV2_Feature**)calloc(11, sizeof(LV2_Feature*));
343 _features[0] = &_instance_access_feature;
344 _features[1] = &_data_access_feature;
345 _features[2] = &_make_path_feature;
346 _features[3] = _uri_map.uri_map_feature();
347 _features[4] = _uri_map.urid_map_feature();
348 _features[5] = _uri_map.urid_unmap_feature();
349 _features[6] = &_log_feature;
351 unsigned n_features = 7;
352 #ifdef HAVE_LV2_1_2_0
353 _features[n_features++] = &_def_state_feature;
356 lv2_atom_forge_init(&_impl->forge, _uri_map.urid_map());
357 lv2_atom_forge_init(&_impl->ui_forge, _uri_map.urid_map());
359 #ifdef HAVE_LV2_1_2_0
360 LV2_URID atom_Int = _uri_map.uri_to_id(LV2_ATOM__Int);
361 static const int32_t _min_block_length = 1; // may happen during split-cycles
362 static const int32_t _max_block_length = 8192; // max possible (with all engines and during export)
363 /* Consider updating max-block-size whenever the buffersize changes.
364 * It requires re-instantiating the plugin (which is a non-realtime operation),
365 * so it should be done lightly and only for plugins that require it.
367 * given that the block-size can change at any time (split-cycles) ardour currently
368 * does not support plugins that require bufz_fixedBlockLength.
370 LV2_Options_Option options[] = {
371 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id(LV2_BUF_SIZE__minBlockLength),
372 sizeof(int32_t), atom_Int, &_min_block_length },
373 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id(LV2_BUF_SIZE__maxBlockLength),
374 sizeof(int32_t), atom_Int, &_max_block_length },
375 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id(LV2_BUF_SIZE__sequenceSize),
376 sizeof(int32_t), atom_Int, &_seq_size },
377 { LV2_OPTIONS_INSTANCE, 0, 0, 0, 0, NULL }
380 _options_feature.URI = LV2_OPTIONS__options;
381 _options_feature.data = options;
382 _features[n_features++] = &_options_feature;
385 LV2_State_Make_Path* make_path = (LV2_State_Make_Path*)malloc(
386 sizeof(LV2_State_Make_Path));
387 make_path->handle = this;
388 make_path->path = &lv2_state_make_path;
389 _make_path_feature.data = make_path;
391 LV2_Log_Log* log = (LV2_Log_Log*)malloc(sizeof(LV2_Log_Log));
393 log->printf = &log_printf;
394 log->vprintf = &log_vprintf;
395 _log_feature.data = log;
397 LilvNode* worker_schedule = lilv_new_uri(_world.world, LV2_WORKER__schedule);
398 if (lilv_plugin_has_feature(plugin, worker_schedule)) {
399 LV2_Worker_Schedule* schedule = (LV2_Worker_Schedule*)malloc(
400 sizeof(LV2_Worker_Schedule));
401 size_t buf_size = _session.engine().raw_buffer_size(DataType::MIDI) * NBUFS;
402 _worker = new Worker(this, buf_size);
403 schedule->handle = this;
404 schedule->schedule_work = work_schedule;
405 _work_schedule_feature.data = schedule;
406 _features[n_features++] = &_work_schedule_feature;
408 lilv_node_free(worker_schedule);
410 _impl->instance = lilv_plugin_instantiate(plugin, rate, _features);
411 _impl->name = lilv_plugin_get_name(plugin);
412 _impl->author = lilv_plugin_get_author_name(plugin);
414 if (_impl->instance == 0) {
415 error << _("LV2: Failed to instantiate plugin ") << uri() << endmsg;
416 throw failed_constructor();
419 _instance_access_feature.data = (void*)_impl->instance->lv2_handle;
420 _data_access_extension_data.extension_data = _impl->instance->lv2_descriptor->extension_data;
421 _data_access_feature.data = &_data_access_extension_data;
423 LilvNode* worker_iface_uri = lilv_new_uri(_world.world, LV2_WORKER__interface);
424 if (lilv_plugin_has_extension_data(plugin, worker_iface_uri)) {
425 _impl->work_iface = (const LV2_Worker_Interface*)extension_data(
426 LV2_WORKER__interface);
428 lilv_node_free(worker_iface_uri);
430 if (lilv_plugin_has_feature(plugin, _world.lv2_inPlaceBroken)) {
431 error << string_compose(
432 _("LV2: \"%1\" cannot be used, since it cannot do inplace processing."),
433 lilv_node_as_string(_impl->name)) << endmsg;
434 lilv_node_free(_impl->name);
435 lilv_node_free(_impl->author);
436 throw failed_constructor();
439 #ifdef HAVE_LV2_1_2_0
440 LilvNodes *required_features = lilv_plugin_get_required_features (plugin);
441 if (lilv_nodes_contains (required_features, _world.bufz_powerOf2BlockLength) ||
442 lilv_nodes_contains (required_features, _world.bufz_fixedBlockLength)
444 error << string_compose(
445 _("LV2: \"%1\" buffer-size requirements cannot be satisfied."),
446 lilv_node_as_string(_impl->name)) << endmsg;
447 lilv_node_free(_impl->name);
448 lilv_node_free(_impl->author);
449 lilv_nodes_free(required_features);
450 throw failed_constructor();
452 lilv_nodes_free(required_features);
455 #ifdef HAVE_LILV_0_16_0
456 // Load default state
457 LilvState* state = lilv_state_new_from_world(
458 _world.world, _uri_map.urid_map(), lilv_plugin_get_uri(_impl->plugin));
459 if (state && _has_state_interface) {
460 lilv_state_restore(state, _impl->instance, NULL, NULL, 0, NULL);
466 const uint32_t num_ports = this->num_ports();
467 for (uint32_t i = 0; i < num_ports; ++i) {
468 const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, i);
470 size_t minimumSize = 0;
472 if (lilv_port_is_a(_impl->plugin, port, _world.lv2_OutputPort)) {
473 flags |= PORT_OUTPUT;
474 } else if (lilv_port_is_a(_impl->plugin, port, _world.lv2_InputPort)) {
477 error << string_compose(
478 "LV2: \"%1\" port %2 is neither input nor output",
479 lilv_node_as_string(_impl->name), i) << endmsg;
480 throw failed_constructor();
483 if (lilv_port_is_a(_impl->plugin, port, _world.lv2_ControlPort)) {
484 flags |= PORT_CONTROL;
485 } else if (lilv_port_is_a(_impl->plugin, port, _world.lv2_AudioPort)) {
487 } else if (lilv_port_is_a(_impl->plugin, port, _world.ev_EventPort)) {
489 flags |= PORT_MIDI; // We assume old event API ports are for MIDI
490 } else if (lilv_port_is_a(_impl->plugin, port, _world.atom_AtomPort)) {
491 LilvNodes* buffer_types = lilv_port_get_value(
492 _impl->plugin, port, _world.atom_bufferType);
493 LilvNodes* atom_supports = lilv_port_get_value(
494 _impl->plugin, port, _world.atom_supports);
496 if (lilv_nodes_contains(buffer_types, _world.atom_Sequence)) {
497 flags |= PORT_SEQUENCE;
498 if (lilv_nodes_contains(atom_supports, _world.midi_MidiEvent)) {
501 if (lilv_nodes_contains(atom_supports, _world.time_Position)) {
502 flags |= PORT_POSITION;
504 if (lilv_nodes_contains(atom_supports, _world.patch_Message)) {
505 flags |= PORT_PATCHMSG;
506 if (flags & PORT_INPUT) {
507 _patch_port_in_index = i;
509 _patch_port_out_index = i;
513 LilvNodes* min_size_v = lilv_port_get_value(_impl->plugin, port, _world.rsz_minimumSize);
514 LilvNode* min_size = min_size_v ? lilv_nodes_get_first(min_size_v) : NULL;
515 if (min_size && lilv_node_is_int(min_size)) {
516 minimumSize = lilv_node_as_int(min_size);
518 lilv_nodes_free(min_size_v);
519 lilv_nodes_free(buffer_types);
520 lilv_nodes_free(atom_supports);
522 error << string_compose(
523 "LV2: \"%1\" port %2 has no known data type",
524 lilv_node_as_string(_impl->name), i) << endmsg;
525 throw failed_constructor();
528 _port_flags.push_back(flags);
529 _port_minimumSize.push_back(minimumSize);
532 _control_data = new float[num_ports];
533 _shadow_data = new float[num_ports];
534 _defaults = new float[num_ports];
535 _ev_buffers = new LV2_Evbuf*[num_ports];
536 memset(_ev_buffers, 0, sizeof(LV2_Evbuf*) * num_ports);
538 const bool latent = lilv_plugin_has_latency(plugin);
539 const uint32_t latency_index = (latent)
540 ? lilv_plugin_get_latency_port_index(plugin)
543 // Build an array of pointers to special parameter buffers
544 void*** params = new void**[num_ports];
545 for (uint32_t i = 0; i < num_ports; ++i) {
548 _impl->designated_input (LV2_TIME__beatsPerMinute, params, (void**)&_bpm_control_port);
549 _impl->designated_input (LV2_CORE__freeWheeling, params, (void**)&_freewheel_control_port);
551 for (uint32_t i = 0; i < num_ports; ++i) {
552 const LilvPort* port = lilv_plugin_get_port_by_index(plugin, i);
553 const LilvNode* sym = lilv_port_get_symbol(plugin, port);
555 // Store index in map so we can look up index by symbol
556 _port_indices.insert(std::make_pair(lilv_node_as_string(sym), i));
558 // Get range and default value if applicable
559 if (parameter_is_control(i)) {
561 lilv_port_get_range(plugin, port, &def, NULL, NULL);
562 _defaults[i] = def ? lilv_node_as_float(def) : 0.0f;
563 if (lilv_port_has_property (plugin, port, _world.lv2_sampleRate)) {
564 _defaults[i] *= _session.frame_rate ();
568 lilv_instance_connect_port(_impl->instance, i, &_control_data[i]);
570 if (latent && i == latency_index) {
571 _latency_control_port = &_control_data[i];
572 *_latency_control_port = 0;
575 if (parameter_is_input(i)) {
576 _shadow_data[i] = default_value(i);
578 *params[i] = (void*)&_shadow_data[i];
588 LilvUIs* uis = lilv_plugin_get_uis(plugin);
589 if (lilv_uis_size(uis) > 0) {
591 // Look for embeddable UI
592 LILV_FOREACH(uis, u, uis) {
593 const LilvUI* this_ui = lilv_uis_get(uis, u);
594 const LilvNode* this_ui_type = NULL;
595 if (lilv_ui_is_supported(this_ui,
599 // TODO: Multiple UI support
601 _impl->ui_type = this_ui_type;
606 // Look for Gtk native UI
607 LILV_FOREACH(uis, i, uis) {
608 const LilvUI* ui = lilv_uis_get(uis, i);
609 if (lilv_ui_is_a(ui, _world.ui_GtkUI)) {
611 _impl->ui_type = _world.ui_GtkUI;
617 // If Gtk UI is not available, try to find external UI
619 LILV_FOREACH(uis, i, uis) {
620 const LilvUI* ui = lilv_uis_get(uis, i);
621 if (lilv_ui_is_a(ui, _world.ui_externalkx)) {
623 _impl->ui_type = _world.ui_external;
626 if (lilv_ui_is_a(ui, _world.ui_external)) {
628 _impl->ui_type = _world.ui_external;
634 load_supported_properties(_property_descriptors);
635 allocate_atom_event_buffers();
636 latency_compute_run();
639 LV2Plugin::~LV2Plugin ()
641 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 destroy\n", name()));
646 lilv_instance_free(_impl->instance);
647 lilv_node_free(_impl->name);
648 lilv_node_free(_impl->author);
651 free(_make_path_feature.data);
652 free(_work_schedule_feature.data);
658 if (_atom_ev_buffers) {
659 LV2_Evbuf** b = _atom_ev_buffers;
664 free(_atom_ev_buffers);
667 delete [] _control_data;
668 delete [] _shadow_data;
669 delete [] _ev_buffers;
673 LV2Plugin::is_external_ui() const
678 return lilv_ui_is_a(_impl->ui, _world.ui_external) || lilv_ui_is_a(_impl->ui, _world.ui_externalkx);
682 LV2Plugin::is_external_kx() const
687 return lilv_ui_is_a(_impl->ui, _world.ui_externalkx);
691 LV2Plugin::ui_is_resizable () const
693 const LilvNode* s = lilv_ui_get_uri(_impl->ui);
694 LilvNode* p = lilv_new_uri(_world.world, LV2_CORE__optionalFeature);
695 LilvNode* fs = lilv_new_uri(_world.world, LV2_UI__fixedSize);
696 LilvNode* nrs = lilv_new_uri(_world.world, LV2_UI__noUserResize);
698 LilvNodes* fs_matches = lilv_world_find_nodes(_world.world, s, p, fs);
699 LilvNodes* nrs_matches = lilv_world_find_nodes(_world.world, s, p, nrs);
701 lilv_nodes_free(nrs_matches);
702 lilv_nodes_free(fs_matches);
707 return !fs_matches && !nrs_matches;
711 LV2Plugin::unique_id() const
713 return lilv_node_as_uri(lilv_plugin_get_uri(_impl->plugin));
717 LV2Plugin::uri() const
719 return lilv_node_as_uri(lilv_plugin_get_uri(_impl->plugin));
723 LV2Plugin::label() const
725 return lilv_node_as_string(_impl->name);
729 LV2Plugin::name() const
731 return lilv_node_as_string(_impl->name);
735 LV2Plugin::maker() const
737 return _impl->author ? lilv_node_as_string (_impl->author) : "Unknown";
741 LV2Plugin::num_ports() const
743 return lilv_plugin_get_num_ports(_impl->plugin);
747 LV2Plugin::parameter_count() const
749 return lilv_plugin_get_num_ports(_impl->plugin);
753 LV2Plugin::default_value(uint32_t port)
755 return _defaults[port];
759 LV2Plugin::port_symbol(uint32_t index) const
761 const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, index);
763 error << name() << ": Invalid port index " << index << endmsg;
766 const LilvNode* sym = lilv_port_get_symbol(_impl->plugin, port);
767 return lilv_node_as_string(sym);
771 LV2Plugin::port_index (const char* symbol) const
773 const map<string, uint32_t>::const_iterator i = _port_indices.find(symbol);
774 if (i != _port_indices.end()) {
777 warning << string_compose(_("LV2: Unknown port %1"), symbol) << endmsg;
783 LV2Plugin::set_parameter(uint32_t which, float val)
785 DEBUG_TRACE(DEBUG::LV2, string_compose(
786 "%1 set parameter %2 to %3\n", name(), which, val));
788 if (which < lilv_plugin_get_num_ports(_impl->plugin)) {
789 if (get_parameter (which) == val) {
793 _shadow_data[which] = val;
795 warning << string_compose(
796 _("Illegal parameter number used with plugin \"%1\". "
797 "This is a bug in either %2 or the LV2 plugin <%3>"),
798 name(), PROGRAM_NAME, unique_id()) << endmsg;
801 Plugin::set_parameter(which, val);
805 LV2Plugin::get_parameter(uint32_t which) const
807 if (parameter_is_input(which)) {
808 return (float)_shadow_data[which];
810 return (float)_control_data[which];
816 LV2Plugin::get_docs() const
818 LilvNodes* comments = lilv_plugin_get_value(_impl->plugin, _world.rdfs_comment);
820 const std::string docs(lilv_node_as_string(lilv_nodes_get_first(comments)));
821 lilv_nodes_free(comments);
829 LV2Plugin::get_parameter_docs(uint32_t which) const
831 LilvNodes* comments = lilv_port_get_value(
833 lilv_plugin_get_port_by_index(_impl->plugin, which),
834 _world.rdfs_comment);
837 const std::string docs(lilv_node_as_string(lilv_nodes_get_first(comments)));
838 lilv_nodes_free(comments);
846 LV2Plugin::nth_parameter(uint32_t n, bool& ok) const
849 for (uint32_t c = 0, x = 0; x < lilv_plugin_get_num_ports(_impl->plugin); ++x) {
850 if (parameter_is_control(x)) {
862 LV2Plugin::extension_data(const char* uri) const
864 return lilv_instance_get_extension_data(_impl->instance, uri);
868 LV2Plugin::c_plugin()
870 return _impl->plugin;
876 return (const void*)_impl->ui;
880 LV2Plugin::c_ui_type()
882 return (const void*)_impl->ui_type;
885 /** Directory for all plugin state. */
887 LV2Plugin::plugin_dir() const
889 return Glib::build_filename(_session.plugins_dir(), _insert_id.to_s());
892 /** Directory for files created by the plugin (except during save). */
894 LV2Plugin::scratch_dir() const
896 return Glib::build_filename(plugin_dir(), "scratch");
899 /** Directory for snapshots of files in the scratch directory. */
901 LV2Plugin::file_dir() const
903 return Glib::build_filename(plugin_dir(), "files");
906 /** Directory to save state snapshot version @c num into. */
908 LV2Plugin::state_dir(unsigned num) const
910 return Glib::build_filename(plugin_dir(), string_compose("state%1", num));
913 /** Implementation of state:makePath for files created at instantiation time.
914 * Note this is not used for files created at save time (Lilv deals with that).
917 LV2Plugin::lv2_state_make_path(LV2_State_Make_Path_Handle handle,
920 LV2Plugin* me = (LV2Plugin*)handle;
921 if (me->_insert_id == PBD::ID("0")) {
922 warning << string_compose(
923 "File path \"%1\" requested but LV2 %2 has no insert ID",
924 path, me->name()) << endmsg;
925 return g_strdup(path);
928 const std::string abs_path = Glib::build_filename(me->scratch_dir(), path);
929 const std::string dirname = Glib::path_get_dirname(abs_path);
930 g_mkdir_with_parents(dirname.c_str(), 0744);
932 DEBUG_TRACE(DEBUG::LV2, string_compose("new file path %1 => %2\n",
935 return g_strndup(abs_path.c_str(), abs_path.length());
939 LV2Plugin::add_state(XMLNode* root) const
941 assert(_insert_id != PBD::ID("0"));
945 LocaleGuard lg(X_("C"));
947 for (uint32_t i = 0; i < parameter_count(); ++i) {
948 if (parameter_is_input(i) && parameter_is_control(i)) {
949 child = new XMLNode("Port");
950 child->add_property("symbol", port_symbol(i));
951 snprintf(buf, sizeof(buf), "%+f", _shadow_data[i]);
952 child->add_property("value", string(buf));
953 root->add_child_nocopy(*child);
957 if (_has_state_interface) {
958 // Provisionally increment state version and create directory
959 const std::string new_dir = state_dir(++_state_version);
960 g_mkdir_with_parents(new_dir.c_str(), 0744);
962 LilvState* state = lilv_state_new_from_instance(
966 scratch_dir().c_str(),
968 _session.externals_dir().c_str(),
971 const_cast<LV2Plugin*>(this),
975 if (!_impl->state || !lilv_state_equals(state, _impl->state)) {
976 lilv_state_save(_world.world,
978 _uri_map.urid_unmap(),
984 lilv_state_free(_impl->state);
985 _impl->state = state;
987 // State is identical, decrement version and nuke directory
988 lilv_state_free(state);
989 PBD::remove_directory(new_dir);
993 root->add_property("state-dir", string_compose("state%1", _state_version));
997 // TODO: Once we can rely on lilv 0.16.0, lilv_world_get can replace this
999 get_value(LilvWorld* world, const LilvNode* subject, const LilvNode* predicate)
1001 LilvNodes* vs = lilv_world_find_nodes(world, subject, predicate, NULL);
1003 LilvNode* node = lilv_node_duplicate(lilv_nodes_get_first(vs));
1004 lilv_nodes_free(vs);
1011 LV2Plugin::find_presets()
1013 LilvNode* lv2_appliesTo = lilv_new_uri(_world.world, LV2_CORE__appliesTo);
1014 LilvNode* pset_Preset = lilv_new_uri(_world.world, LV2_PRESETS__Preset);
1015 LilvNode* rdfs_label = lilv_new_uri(_world.world, LILV_NS_RDFS "label");
1017 LilvNodes* presets = lilv_plugin_get_related(_impl->plugin, pset_Preset);
1018 LILV_FOREACH(nodes, i, presets) {
1019 const LilvNode* preset = lilv_nodes_get(presets, i);
1020 lilv_world_load_resource(_world.world, preset);
1021 LilvNode* name = get_value(_world.world, preset, rdfs_label);
1023 _presets.insert(std::make_pair(lilv_node_as_string(preset),
1024 Plugin::PresetRecord(
1025 lilv_node_as_string(preset),
1026 lilv_node_as_string(name))));
1027 lilv_node_free(name);
1029 warning << string_compose(
1030 _("Plugin \"%1\" preset \"%2\" is missing a label\n"),
1031 lilv_node_as_string(lilv_plugin_get_uri(_impl->plugin)),
1032 lilv_node_as_string(preset)) << endmsg;
1035 lilv_nodes_free(presets);
1037 lilv_node_free(rdfs_label);
1038 lilv_node_free(pset_Preset);
1039 lilv_node_free(lv2_appliesTo);
1043 set_port_value(const char* port_symbol,
1049 LV2Plugin* self = (LV2Plugin*)user_data;
1050 if (type != 0 && type != URIMap::instance().urids.atom_Float) {
1051 return; // TODO: Support non-float ports
1054 const uint32_t port_index = self->port_index(port_symbol);
1055 if (port_index != (uint32_t)-1) {
1056 self->set_parameter(port_index, *(const float*)value);
1061 LV2Plugin::load_preset(PresetRecord r)
1063 LilvWorld* world = _world.world;
1064 LilvNode* pset = lilv_new_uri(world, r.uri.c_str());
1065 LilvState* state = lilv_state_new_from_world(world, _uri_map.urid_map(), pset);
1068 lilv_state_restore(state, _impl->instance, set_port_value, this, 0, NULL);
1069 lilv_state_free(state);
1070 Plugin::load_preset(r);
1073 lilv_node_free(pset);
1078 ARDOUR::lv2plugin_get_port_value(const char* port_symbol,
1083 LV2Plugin *plugin = (LV2Plugin *) user_data;
1085 uint32_t index = plugin->port_index(port_symbol);
1086 if (index != (uint32_t) -1) {
1087 if (plugin->parameter_is_input(index) && plugin->parameter_is_control(index)) {
1089 *size = sizeof(float);
1090 *type = plugin->_uri_map.uri_to_id(LV2_ATOM__Float);
1091 value = &plugin->_shadow_data[index];
1103 LV2Plugin::do_save_preset(string name)
1105 LilvNode* plug_name = lilv_plugin_get_name(_impl->plugin);
1106 const string prefix = legalize_for_uri(lilv_node_as_string(plug_name));
1107 const string base_name = legalize_for_uri(name);
1108 const string file_name = base_name + ".ttl";
1109 const string bundle = Glib::build_filename(
1110 Glib::get_home_dir(),
1111 Glib::build_filename(".lv2", prefix + "_" + base_name + ".lv2"));
1113 #ifdef HAVE_LILV_0_21_3
1114 /* delete reference to old preset (if any) */
1115 const PresetRecord* r = preset_by_label(name);
1117 LilvNode* pset = lilv_new_uri (_world.world, r->uri.c_str());
1119 lilv_world_unload_resource (_world.world, pset);
1120 lilv_node_free(pset);
1125 LilvState* state = lilv_state_new_from_instance(
1128 _uri_map.urid_map(),
1129 scratch_dir().c_str(), // file_dir
1130 bundle.c_str(), // copy_dir
1131 bundle.c_str(), // link_dir
1132 bundle.c_str(), // save_dir
1133 lv2plugin_get_port_value, // get_value
1134 (void*)this, // user_data
1135 LV2_STATE_IS_POD|LV2_STATE_IS_PORTABLE, // flags
1136 _features // features
1139 lilv_state_set_label(state, name.c_str());
1141 _world.world, // world
1142 _uri_map.urid_map(), // map
1143 _uri_map.urid_unmap(), // unmap
1145 NULL, // uri (NULL = use file URI)
1146 bundle.c_str(), // dir
1147 file_name.c_str() // filename
1150 lilv_state_free(state);
1152 std::string uri = Glib::filename_to_uri(Glib::build_filename(bundle, file_name));
1153 LilvNode *node_bundle = lilv_new_uri(_world.world, Glib::filename_to_uri(Glib::build_filename(bundle, "/")).c_str());
1154 LilvNode *node_preset = lilv_new_uri(_world.world, uri.c_str());
1155 #ifdef HAVE_LILV_0_21_3
1156 lilv_world_unload_resource(_world.world, node_preset);
1157 lilv_world_unload_bundle(_world.world, node_bundle);
1159 lilv_world_load_bundle(_world.world, node_bundle);
1160 lilv_world_load_resource(_world.world, node_preset);
1161 lilv_node_free(node_bundle);
1162 lilv_node_free(node_preset);
1163 lilv_node_free(plug_name);
1168 LV2Plugin::do_remove_preset(string name)
1170 #ifdef HAVE_LILV_0_21_3
1171 /* Look up preset record by label (FIXME: ick, label as ID) */
1172 const PresetRecord* r = preset_by_label(name);
1177 /* Load a LilvState for the preset. */
1178 LilvWorld* world = _world.world;
1179 LilvNode* pset = lilv_new_uri(world, r->uri.c_str());
1180 LilvState* state = lilv_state_new_from_world(world, _uri_map.urid_map(), pset);
1182 lilv_node_free(pset);
1186 /* Unload preset from world. */
1187 lilv_world_unload_resource(world, pset);
1189 /* Delete it from the file system. This will remove the preset file and the entry
1190 from the manifest. If this results in an empty manifest (i.e. the
1191 preset is the only thing in the bundle), then the bundle is removed. */
1192 lilv_state_delete(world, state);
1194 lilv_state_free(state);
1195 lilv_node_free(pset);
1197 /* Without lilv_state_delete(), we could delete the preset file, but this
1198 would leave a broken bundle/manifest around, so the preset would still
1199 be visible, but broken. Naively deleting a bundle is too dangerous, so
1200 we simply do not support preset deletion with older Lilv */
1204 LV2Plugin::has_editor() const
1206 return _impl->ui != NULL;
1210 LV2Plugin::has_message_output() const
1212 for (uint32_t i = 0; i < num_ports(); ++i) {
1213 if ((_port_flags[i] & PORT_SEQUENCE) &&
1214 (_port_flags[i] & PORT_OUTPUT)) {
1222 LV2Plugin::write_to(RingBuffer<uint8_t>* dest,
1226 const uint8_t* body)
1228 const uint32_t buf_size = sizeof(UIMessage) + size;
1229 vector<uint8_t> buf(buf_size);
1231 UIMessage* msg = (UIMessage*)&buf[0];
1233 msg->protocol = protocol;
1235 memcpy(msg + 1, body, size);
1237 return (dest->write(&buf[0], buf_size) == buf_size);
1241 LV2Plugin::write_from_ui(uint32_t index,
1244 const uint8_t* body)
1247 size_t rbs = _session.engine().raw_buffer_size(DataType::MIDI) * NBUFS;
1248 /* buffer data communication from plugin UI to plugin instance.
1249 * this buffer needs to potentially hold
1250 * (port's minimumSize) * (audio-periods) / (UI-periods)
1253 * e.g 48kSPS / 128fpp -> audio-periods = 375 Hz
1254 * ui-periods = 25 Hz (SuperRapidScreenUpdate)
1255 * default minimumSize = 32K (see LV2Plugin::allocate_atom_event_buffers()
1257 * it is NOT safe to overflow (msg.size will be misinterpreted)
1259 uint32_t bufsiz = 32768;
1260 if (_atom_ev_buffers && _atom_ev_buffers[0]) {
1261 bufsiz = lv2_evbuf_get_capacity(_atom_ev_buffers[0]);
1263 rbs = max((size_t) bufsiz * 8, rbs);
1264 _from_ui = new RingBuffer<uint8_t>(rbs);
1267 if (!write_to(_from_ui, index, protocol, size, body)) {
1268 error << "Error writing from UI to plugin" << endmsg;
1275 LV2Plugin::write_to_ui(uint32_t index,
1278 const uint8_t* body)
1280 if (!write_to(_to_ui, index, protocol, size, body)) {
1281 error << "Error writing from plugin to UI" << endmsg;
1288 forge_variant(LV2_Atom_Forge* forge, const Variant& value)
1290 switch (value.type()) {
1291 case Variant::NOTHING:
1293 case Variant::BEATS:
1294 // No atom type for this, just forge a double
1295 lv2_atom_forge_double(forge, value.get_beats().to_double());
1298 lv2_atom_forge_bool(forge, value.get_bool());
1300 case Variant::DOUBLE:
1301 lv2_atom_forge_double(forge, value.get_double());
1303 case Variant::FLOAT:
1304 lv2_atom_forge_float(forge, value.get_float());
1307 lv2_atom_forge_int(forge, value.get_int());
1310 lv2_atom_forge_long(forge, value.get_long());
1313 lv2_atom_forge_path(
1314 forge, value.get_path().c_str(), value.get_path().size());
1316 case Variant::STRING:
1317 lv2_atom_forge_string(
1318 forge, value.get_string().c_str(), value.get_string().size());
1322 forge, value.get_uri().c_str(), value.get_uri().size());
1327 /** Get a variant type from a URI, return false iff no match found. */
1329 uri_to_variant_type(const std::string& uri, Variant::Type& type)
1331 if (uri == LV2_ATOM__Bool) {
1332 type = Variant::BOOL;
1333 } else if (uri == LV2_ATOM__Double) {
1334 type = Variant::DOUBLE;
1335 } else if (uri == LV2_ATOM__Float) {
1336 type = Variant::FLOAT;
1337 } else if (uri == LV2_ATOM__Int) {
1338 type = Variant::INT;
1339 } else if (uri == LV2_ATOM__Long) {
1340 type = Variant::LONG;
1341 } else if (uri == LV2_ATOM__Path) {
1342 type = Variant::PATH;
1343 } else if (uri == LV2_ATOM__String) {
1344 type = Variant::STRING;
1345 } else if (uri == LV2_ATOM__URI) {
1346 type = Variant::URI;
1354 LV2Plugin::set_property(uint32_t key, const Variant& value)
1356 if (_patch_port_in_index == (uint32_t)-1) {
1357 error << "LV2: set_property called with unset patch_port_in_index" << endmsg;
1359 } else if (value.type() == Variant::NOTHING) {
1360 error << "LV2: set_property called with void value" << endmsg;
1364 // Set up forge to write to temporary buffer on the stack
1365 LV2_Atom_Forge* forge = &_impl->ui_forge;
1366 LV2_Atom_Forge_Frame frame;
1367 uint8_t buf[PATH_MAX]; // Ought to be enough for anyone...
1369 lv2_atom_forge_set_buffer(forge, buf, sizeof(buf));
1371 // Serialize patch:Set message to set property
1372 #ifdef HAVE_LV2_1_10_0
1373 lv2_atom_forge_object(forge, &frame, 1, _uri_map.urids.patch_Set);
1374 lv2_atom_forge_key(forge, _uri_map.urids.patch_property);
1375 lv2_atom_forge_urid(forge, key);
1376 lv2_atom_forge_key(forge, _uri_map.urids.patch_value);
1378 lv2_atom_forge_blank(forge, &frame, 1, _uri_map.urids.patch_Set);
1379 lv2_atom_forge_property_head(forge, _uri_map.urids.patch_property, 0);
1380 lv2_atom_forge_urid(forge, key);
1381 lv2_atom_forge_property_head(forge, _uri_map.urids.patch_value, 0);
1384 forge_variant(forge, value);
1386 // Write message to UI=>Plugin ring
1387 const LV2_Atom* const atom = (const LV2_Atom*)buf;
1388 write_from_ui(_patch_port_in_index,
1389 _uri_map.urids.atom_eventTransfer,
1390 lv2_atom_total_size(atom),
1391 (const uint8_t*)atom);
1394 const ParameterDescriptor&
1395 LV2Plugin::get_property_descriptor(uint32_t id) const
1397 PropertyDescriptors::const_iterator p = _property_descriptors.find(id);
1398 if (p != _property_descriptors.end()) {
1401 return Plugin::get_property_descriptor(id);
1405 load_parameter_descriptor_units(LilvWorld* lworld, ParameterDescriptor& desc, const LilvNodes* units)
1407 if (lilv_nodes_contains(units, _world.units_midiNote)) {
1408 desc.unit = ParameterDescriptor::MIDI_NOTE;
1409 } else if (lilv_nodes_contains(units, _world.units_db)) {
1410 desc.unit = ParameterDescriptor::DB;
1411 } else if (lilv_nodes_contains(units, _world.units_hz)) {
1412 desc.unit = ParameterDescriptor::HZ;
1414 if (lilv_nodes_size(units) > 0) {
1415 const LilvNode* unit = lilv_nodes_get_first(units);
1416 LilvNode* render = get_value(lworld, unit, _world.units_render);
1418 desc.print_fmt = lilv_node_as_string(render);
1419 lilv_node_free(render);
1425 load_parameter_descriptor(LV2World& world,
1426 ParameterDescriptor& desc,
1427 Variant::Type datatype,
1428 const LilvNode* subject)
1430 LilvWorld* lworld = _world.world;
1431 LilvNode* label = get_value(lworld, subject, _world.rdfs_label);
1432 LilvNode* def = get_value(lworld, subject, _world.lv2_default);
1433 LilvNode* minimum = get_value(lworld, subject, _world.lv2_minimum);
1434 LilvNode* maximum = get_value(lworld, subject, _world.lv2_maximum);
1435 LilvNodes* units = lilv_world_find_nodes(lworld, subject, _world.units_unit, NULL);
1437 desc.label = lilv_node_as_string(label);
1439 if (def && lilv_node_is_float(def)) {
1440 desc.normal = lilv_node_as_float(def);
1442 if (minimum && lilv_node_is_float(minimum)) {
1443 desc.lower = lilv_node_as_float(minimum);
1445 if (maximum && lilv_node_is_float(maximum)) {
1446 desc.upper = lilv_node_as_float(maximum);
1448 load_parameter_descriptor_units(lworld, desc, units);
1449 desc.datatype = datatype;
1450 desc.toggled |= datatype == Variant::BOOL;
1451 desc.integer_step |= datatype == Variant::INT || datatype == Variant::LONG;
1452 desc.update_steps();
1454 lilv_nodes_free(units);
1455 lilv_node_free(label);
1456 lilv_node_free(def);
1457 lilv_node_free(minimum);
1458 lilv_node_free(maximum);
1462 LV2Plugin::load_supported_properties(PropertyDescriptors& descs)
1464 LilvWorld* lworld = _world.world;
1465 const LilvNode* subject = lilv_plugin_get_uri(_impl->plugin);
1466 LilvNodes* properties = lilv_world_find_nodes(
1467 lworld, subject, _world.patch_writable, NULL);
1468 LILV_FOREACH(nodes, p, properties) {
1469 // Get label and range
1470 const LilvNode* prop = lilv_nodes_get(properties, p);
1471 LilvNode* range = get_value(lworld, prop, _world.rdfs_range);
1473 warning << string_compose(_("LV2: property <%1> has no range datatype, ignoring"),
1474 lilv_node_as_uri(prop)) << endmsg;
1478 // Convert range to variant type (TODO: support for multiple range types)
1479 Variant::Type datatype;
1480 if (!uri_to_variant_type(lilv_node_as_uri(range), datatype)) {
1481 error << string_compose(_("LV2: property <%1> has unsupported datatype <%1>"),
1482 lilv_node_as_uri(prop), lilv_node_as_uri(range)) << endmsg;
1486 // Add description to result
1487 ParameterDescriptor desc;
1488 desc.key = _uri_map.uri_to_id(lilv_node_as_uri(prop));
1489 desc.datatype = datatype;
1490 load_parameter_descriptor(_world, desc, datatype, prop);
1491 descs.insert(std::make_pair(desc.key, desc));
1493 lilv_node_free(range);
1495 lilv_nodes_free(properties);
1499 LV2Plugin::announce_property_values()
1501 if (_patch_port_in_index == (uint32_t)-1) {
1505 // Set up forge to write to temporary buffer on the stack
1506 LV2_Atom_Forge* forge = &_impl->ui_forge;
1507 LV2_Atom_Forge_Frame frame;
1508 uint8_t buf[PATH_MAX]; // Ought to be enough for anyone...
1510 lv2_atom_forge_set_buffer(forge, buf, sizeof(buf));
1512 // Serialize patch:Get message with no subject (implicitly plugin instance)
1513 #ifdef HAVE_LV2_1_10_0
1514 lv2_atom_forge_object(forge, &frame, 1, _uri_map.urids.patch_Get);
1516 lv2_atom_forge_blank(forge, &frame, 1, _uri_map.urids.patch_Get);
1519 // Write message to UI=>Plugin ring
1520 const LV2_Atom* const atom = (const LV2_Atom*)buf;
1521 write_from_ui(_patch_port_in_index,
1522 _uri_map.urids.atom_eventTransfer,
1523 lv2_atom_total_size(atom),
1524 (const uint8_t*)atom);
1528 LV2Plugin::enable_ui_emission()
1531 /* see note in LV2Plugin::write_from_ui() */
1532 uint32_t bufsiz = 32768;
1533 if (_atom_ev_buffers && _atom_ev_buffers[0]) {
1534 bufsiz = lv2_evbuf_get_capacity(_atom_ev_buffers[0]);
1536 size_t rbs = _session.engine().raw_buffer_size(DataType::MIDI) * NBUFS;
1537 rbs = max((size_t) bufsiz * 8, rbs);
1538 _to_ui = new RingBuffer<uint8_t>(rbs);
1543 LV2Plugin::emit_to_ui(void* controller, UIMessageSink sink)
1549 uint32_t read_space = _to_ui->read_space();
1550 while (read_space > sizeof(UIMessage)) {
1552 if (_to_ui->read((uint8_t*)&msg, sizeof(msg)) != sizeof(msg)) {
1553 error << "Error reading from Plugin=>UI RingBuffer" << endmsg;
1556 vector<uint8_t> body(msg.size);
1557 if (_to_ui->read(&body[0], msg.size) != msg.size) {
1558 error << "Error reading from Plugin=>UI RingBuffer" << endmsg;
1562 sink(controller, msg.index, msg.size, msg.protocol, &body[0]);
1564 read_space -= sizeof(msg) + msg.size;
1569 LV2Plugin::work(uint32_t size, const void* data)
1571 return _impl->work_iface->work(
1572 _impl->instance->lv2_handle, work_respond, this, size, data);
1576 LV2Plugin::work_response(uint32_t size, const void* data)
1578 return _impl->work_iface->work_response(
1579 _impl->instance->lv2_handle, size, data);
1583 LV2Plugin::set_insert_id(PBD::ID id)
1589 LV2Plugin::set_state(const XMLNode& node, int version)
1592 const XMLProperty* prop;
1593 XMLNodeConstIterator iter;
1598 LocaleGuard lg(X_("C"));
1600 if (node.name() != state_node_name()) {
1601 error << _("Bad node sent to LV2Plugin::set_state") << endmsg;
1605 #ifndef NO_PLUGIN_STATE
1607 if (version < 3000) {
1608 nodes = node.children("port");
1610 nodes = node.children("Port");
1613 for (iter = nodes.begin(); iter != nodes.end(); ++iter) {
1617 if ((prop = child->property("symbol")) != 0) {
1618 sym = prop->value().c_str();
1620 warning << _("LV2: port has no symbol, ignored") << endmsg;
1624 map<string, uint32_t>::iterator i = _port_indices.find(sym);
1626 if (i != _port_indices.end()) {
1627 port_id = i->second;
1629 warning << _("LV2: port has unknown index, ignored") << endmsg;
1633 if ((prop = child->property("value")) != 0) {
1634 value = prop->value().c_str();
1636 warning << _("LV2: port has no value, ignored") << endmsg;
1640 set_parameter(port_id, atof(value));
1644 if ((prop = node.property("state-dir")) != 0) {
1645 if (sscanf(prop->value().c_str(), "state%u", &_state_version) != 1) {
1646 error << string_compose(
1647 "LV2: failed to parse state version from \"%1\"",
1648 prop->value()) << endmsg;
1651 std::string state_file = Glib::build_filename(
1653 Glib::build_filename(prop->value(), "state.ttl"));
1655 LilvState* state = lilv_state_new_from_file(
1656 _world.world, _uri_map.urid_map(), NULL, state_file.c_str());
1658 lilv_state_restore(state, _impl->instance, NULL, NULL, 0, NULL);
1661 latency_compute_run();
1664 return Plugin::set_state(node, version);
1668 LV2Plugin::get_parameter_descriptor(uint32_t which, ParameterDescriptor& desc) const
1670 const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, which);
1672 error << string_compose("LV2: get descriptor of non-existent port %1", which)
1677 LilvNodes* portunits;
1678 LilvNode *def, *min, *max;
1679 lilv_port_get_range(_impl->plugin, port, &def, &min, &max);
1680 portunits = lilv_port_get_value(_impl->plugin, port, _world.units_unit);
1682 // TODO: Once we can rely on lilv 0.18.0 being present,
1683 // load_parameter_descriptor() can be used for ports as well
1684 desc.integer_step = lilv_port_has_property(_impl->plugin, port, _world.lv2_integer);
1685 desc.toggled = lilv_port_has_property(_impl->plugin, port, _world.lv2_toggled);
1686 desc.logarithmic = lilv_port_has_property(_impl->plugin, port, _world.ext_logarithmic);
1687 desc.sr_dependent = lilv_port_has_property(_impl->plugin, port, _world.lv2_sampleRate);
1688 desc.label = lilv_node_as_string(lilv_port_get_name(_impl->plugin, port));
1689 desc.normal = def ? lilv_node_as_float(def) : 0.0f;
1690 desc.lower = min ? lilv_node_as_float(min) : 0.0f;
1691 desc.upper = max ? lilv_node_as_float(max) : 1.0f;
1692 load_parameter_descriptor_units(_world.world, desc, portunits);
1694 if (desc.sr_dependent) {
1695 desc.lower *= _session.frame_rate ();
1696 desc.upper *= _session.frame_rate ();
1699 desc.min_unbound = false; // TODO: LV2 extension required
1700 desc.max_unbound = false; // TODO: LV2 extension required
1702 desc.enumeration = lilv_port_has_property(_impl->plugin, port, _world.lv2_enumeration);
1703 desc.scale_points = get_scale_points(which);
1705 desc.update_steps();
1707 lilv_node_free(def);
1708 lilv_node_free(min);
1709 lilv_node_free(max);
1710 lilv_nodes_free(portunits);
1716 LV2Plugin::describe_parameter(Evoral::Parameter which)
1718 if (( which.type() == PluginAutomation) && ( which.id() < parameter_count()) ) {
1720 if (lilv_port_has_property(_impl->plugin,
1721 lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.ext_notOnGUI)) {
1722 return X_("hidden");
1725 if (lilv_port_has_property(_impl->plugin,
1726 lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.lv2_freewheeling)) {
1727 return X_("hidden");
1730 if (lilv_port_has_property(_impl->plugin,
1731 lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.lv2_reportsLatency)) {
1732 return X_("latency");
1735 LilvNode* name = lilv_port_get_name(_impl->plugin,
1736 lilv_plugin_get_port_by_index(_impl->plugin, which.id()));
1737 string ret(lilv_node_as_string(name));
1738 lilv_node_free(name);
1746 LV2Plugin::signal_latency() const
1748 if (_latency_control_port) {
1749 return (framecnt_t)floor(*_latency_control_port);
1755 set<Evoral::Parameter>
1756 LV2Plugin::automatable() const
1758 set<Evoral::Parameter> ret;
1760 for (uint32_t i = 0; i < parameter_count(); ++i) {
1761 if (parameter_is_input(i) && parameter_is_control(i)) {
1762 ret.insert(ret.end(), Evoral::Parameter(PluginAutomation, 0, i));
1766 for (PropertyDescriptors::const_iterator p = _property_descriptors.begin();
1767 p != _property_descriptors.end();
1769 ret.insert(ret.end(), Evoral::Parameter(PluginPropertyAutomation, 0, p->first));
1775 LV2Plugin::activate()
1777 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 activate\n", name()));
1779 if (!_was_activated) {
1780 lilv_instance_activate(_impl->instance);
1781 _was_activated = true;
1786 LV2Plugin::deactivate()
1788 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 deactivate\n", name()));
1790 if (_was_activated) {
1791 lilv_instance_deactivate(_impl->instance);
1792 _was_activated = false;
1797 LV2Plugin::cleanup()
1799 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 cleanup\n", name()));
1803 lilv_instance_free(_impl->instance);
1804 _impl->instance = NULL;
1808 LV2Plugin::allocate_atom_event_buffers()
1810 /* reserve local scratch buffers for ATOM event-queues */
1811 const LilvPlugin* p = _impl->plugin;
1813 /* count non-MIDI atom event-ports
1814 * TODO: nicely ask drobilla to make a lilv_ call for that
1816 int count_atom_out = 0;
1817 int count_atom_in = 0;
1818 int minimumSize = 32768; // TODO use a per-port minimum-size
1819 for (uint32_t i = 0; i < lilv_plugin_get_num_ports(p); ++i) {
1820 const LilvPort* port = lilv_plugin_get_port_by_index(p, i);
1821 if (lilv_port_is_a(p, port, _world.atom_AtomPort)) {
1822 LilvNodes* buffer_types = lilv_port_get_value(
1823 p, port, _world.atom_bufferType);
1824 LilvNodes* atom_supports = lilv_port_get_value(
1825 p, port, _world.atom_supports);
1827 if (!lilv_nodes_contains(buffer_types, _world.atom_Sequence)
1828 || !lilv_nodes_contains(atom_supports, _world.midi_MidiEvent)) {
1829 if (lilv_port_is_a(p, port, _world.lv2_InputPort)) {
1832 if (lilv_port_is_a(p, port, _world.lv2_OutputPort)) {
1835 LilvNodes* min_size_v = lilv_port_get_value(_impl->plugin, port, _world.rsz_minimumSize);
1836 LilvNode* min_size = min_size_v ? lilv_nodes_get_first(min_size_v) : NULL;
1837 if (min_size && lilv_node_is_int(min_size)) {
1838 minimumSize = std::max(minimumSize, lilv_node_as_int(min_size));
1840 lilv_nodes_free(min_size_v);
1842 lilv_nodes_free(buffer_types);
1843 lilv_nodes_free(atom_supports);
1847 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 need buffers for %2 atom-in and %3 atom-out event-ports\n",
1848 name(), count_atom_in, count_atom_out));
1850 const int total_atom_buffers = (count_atom_in + count_atom_out);
1851 if (_atom_ev_buffers || total_atom_buffers == 0) {
1855 DEBUG_TRACE(DEBUG::LV2, string_compose("allocate %1 atom_ev_buffers of %d bytes\n", total_atom_buffers, minimumSize));
1856 _atom_ev_buffers = (LV2_Evbuf**) malloc((total_atom_buffers + 1) * sizeof(LV2_Evbuf*));
1857 for (int i = 0; i < total_atom_buffers; ++i ) {
1858 _atom_ev_buffers[i] = lv2_evbuf_new(minimumSize, LV2_EVBUF_ATOM,
1859 _uri_map.urids.atom_Chunk, _uri_map.urids.atom_Sequence);
1861 _atom_ev_buffers[total_atom_buffers] = 0;
1865 /** Write an ardour position/time/tempo/meter as an LV2 event.
1866 * @return true on success.
1869 write_position(LV2_Atom_Forge* forge,
1871 const TempoMetric& t,
1872 Timecode::BBT_Time& bbt,
1874 framepos_t position,
1877 const URIMap::URIDs& urids = URIMap::instance().urids;
1879 uint8_t pos_buf[256];
1880 lv2_atom_forge_set_buffer(forge, pos_buf, sizeof(pos_buf));
1881 LV2_Atom_Forge_Frame frame;
1882 #ifdef HAVE_LV2_1_10_0
1883 lv2_atom_forge_object(forge, &frame, 1, urids.time_Position);
1884 lv2_atom_forge_key(forge, urids.time_frame);
1885 lv2_atom_forge_long(forge, position);
1886 lv2_atom_forge_key(forge, urids.time_speed);
1887 lv2_atom_forge_float(forge, speed);
1888 lv2_atom_forge_key(forge, urids.time_barBeat);
1889 lv2_atom_forge_float(forge, bbt.beats - 1 +
1890 (bbt.ticks / Timecode::BBT_Time::ticks_per_beat));
1891 lv2_atom_forge_key(forge, urids.time_bar);
1892 lv2_atom_forge_long(forge, bbt.bars - 1);
1893 lv2_atom_forge_key(forge, urids.time_beatUnit);
1894 lv2_atom_forge_int(forge, t.meter().note_divisor());
1895 lv2_atom_forge_key(forge, urids.time_beatsPerBar);
1896 lv2_atom_forge_float(forge, t.meter().divisions_per_bar());
1897 lv2_atom_forge_key(forge, urids.time_beatsPerMinute);
1898 lv2_atom_forge_float(forge, t.tempo().beats_per_minute());
1900 lv2_atom_forge_blank(forge, &frame, 1, urids.time_Position);
1901 lv2_atom_forge_property_head(forge, urids.time_frame, 0);
1902 lv2_atom_forge_long(forge, position);
1903 lv2_atom_forge_property_head(forge, urids.time_speed, 0);
1904 lv2_atom_forge_float(forge, speed);
1905 lv2_atom_forge_property_head(forge, urids.time_barBeat, 0);
1906 lv2_atom_forge_float(forge, bbt.beats - 1 +
1907 (bbt.ticks / Timecode::BBT_Time::ticks_per_beat));
1908 lv2_atom_forge_property_head(forge, urids.time_bar, 0);
1909 lv2_atom_forge_long(forge, bbt.bars - 1);
1910 lv2_atom_forge_property_head(forge, urids.time_beatUnit, 0);
1911 lv2_atom_forge_int(forge, t.meter().note_divisor());
1912 lv2_atom_forge_property_head(forge, urids.time_beatsPerBar, 0);
1913 lv2_atom_forge_float(forge, t.meter().divisions_per_bar());
1914 lv2_atom_forge_property_head(forge, urids.time_beatsPerMinute, 0);
1915 lv2_atom_forge_float(forge, t.tempo().beats_per_minute());
1918 LV2_Evbuf_Iterator end = lv2_evbuf_end(buf);
1919 const LV2_Atom* const atom = (const LV2_Atom*)pos_buf;
1920 return lv2_evbuf_write(&end, offset, 0, atom->type, atom->size,
1921 (const uint8_t*)(atom + 1));
1925 LV2Plugin::connect_and_run(BufferSet& bufs,
1926 ChanMapping in_map, ChanMapping out_map,
1927 pframes_t nframes, framecnt_t offset)
1929 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 run %2 offset %3\n", name(), nframes, offset));
1930 Plugin::connect_and_run(bufs, in_map, out_map, nframes, offset);
1932 cycles_t then = get_cycles();
1934 TempoMap& tmap = _session.tempo_map();
1935 Metrics::const_iterator metric_i = tmap.metrics_end();
1936 TempoMetric tmetric = tmap.metric_at(_session.transport_frame(), &metric_i);
1938 if (_freewheel_control_port) {
1939 *_freewheel_control_port = _session.engine().freewheeling() ? 1.f : 0.f;
1942 if (_bpm_control_port) {
1943 *_bpm_control_port = tmetric.tempo().beats_per_minute();
1946 ChanCount bufs_count;
1947 bufs_count.set(DataType::AUDIO, 1);
1948 bufs_count.set(DataType::MIDI, 1);
1949 BufferSet& silent_bufs = _session.get_silent_buffers(bufs_count);
1950 BufferSet& scratch_bufs = _session.get_scratch_buffers(bufs_count);
1951 uint32_t const num_ports = parameter_count();
1952 uint32_t const nil_index = std::numeric_limits<uint32_t>::max();
1954 uint32_t audio_in_index = 0;
1955 uint32_t audio_out_index = 0;
1956 uint32_t midi_in_index = 0;
1957 uint32_t midi_out_index = 0;
1958 uint32_t atom_port_index = 0;
1959 for (uint32_t port_index = 0; port_index < num_ports; ++port_index) {
1961 uint32_t index = nil_index;
1962 PortFlags flags = _port_flags[port_index];
1964 if (flags & PORT_AUDIO) {
1965 if (flags & PORT_INPUT) {
1966 index = in_map.get(DataType::AUDIO, audio_in_index++, &valid);
1968 ? bufs.get_audio(index).data(offset)
1969 : silent_bufs.get_audio(0).data(offset);
1971 index = out_map.get(DataType::AUDIO, audio_out_index++, &valid);
1973 ? bufs.get_audio(index).data(offset)
1974 : scratch_bufs.get_audio(0).data(offset);
1976 } else if (flags & (PORT_EVENT|PORT_SEQUENCE)) {
1977 /* FIXME: The checks here for bufs.count().n_midi() > index shouldn't
1978 be necessary, but the mapping is illegal in some cases. Ideally
1979 that should be fixed, but this is easier...
1981 if (flags & PORT_MIDI) {
1982 if (flags & PORT_INPUT) {
1983 index = in_map.get(DataType::MIDI, midi_in_index++, &valid);
1985 index = out_map.get(DataType::MIDI, midi_out_index++, &valid);
1987 if (valid && bufs.count().n_midi() > index) {
1988 /* Note, ensure_lv2_bufsize() is not RT safe!
1989 * However free()/alloc() is only called if a
1990 * plugin requires a rsz:minimumSize buffersize
1991 * and the existing buffer if smaller.
1993 bufs.ensure_lv2_bufsize((flags & PORT_INPUT), index, _port_minimumSize[port_index]);
1994 _ev_buffers[port_index] = bufs.get_lv2_midi(
1995 (flags & PORT_INPUT), index, (flags & PORT_EVENT));
1997 } else if ((flags & PORT_POSITION) && (flags & PORT_INPUT)) {
1998 lv2_evbuf_reset(_atom_ev_buffers[atom_port_index], true);
1999 _ev_buffers[port_index] = _atom_ev_buffers[atom_port_index++];
2003 if (valid && (flags & PORT_INPUT)) {
2004 Timecode::BBT_Time bbt;
2005 if ((flags & PORT_POSITION)) {
2006 if (_session.transport_frame() != _next_cycle_start ||
2007 _session.transport_speed() != _next_cycle_speed) {
2008 // Transport has changed, write position at cycle start
2009 tmap.bbt_time(_session.transport_frame(), bbt);
2010 write_position(&_impl->forge, _ev_buffers[port_index],
2011 tmetric, bbt, _session.transport_speed(),
2012 _session.transport_frame(), 0);
2016 // Get MIDI iterator range (empty range if no MIDI)
2017 MidiBuffer::iterator m = (index != nil_index)
2018 ? bufs.get_midi(index).begin()
2019 : silent_bufs.get_midi(0).end();
2020 MidiBuffer::iterator m_end = (index != nil_index)
2021 ? bufs.get_midi(index).end()
2024 // Now merge MIDI and any transport events into the buffer
2025 const uint32_t type = _uri_map.urids.midi_MidiEvent;
2026 const framepos_t tend = _session.transport_frame() + nframes;
2028 while (m != m_end || (metric_i != tmap.metrics_end() &&
2029 (*metric_i)->frame() < tend)) {
2030 MetricSection* metric = (metric_i != tmap.metrics_end())
2032 if (m != m_end && (!metric || metric->frame() > (*m).time())) {
2033 const Evoral::MIDIEvent<framepos_t> ev(*m, false);
2034 LV2_Evbuf_Iterator eend = lv2_evbuf_end(_ev_buffers[port_index]);
2035 lv2_evbuf_write(&eend, ev.time(), 0, type, ev.size(), ev.buffer());
2038 tmetric.set_metric(metric);
2039 bbt = metric->start();
2040 write_position(&_impl->forge, _ev_buffers[port_index],
2041 tmetric, bbt, _session.transport_speed(),
2043 metric->frame() - _session.transport_frame());
2047 } else if (!valid) {
2048 // Nothing we understand or care about, connect to scratch
2049 // see note for midi-buffer size above
2050 scratch_bufs.ensure_lv2_bufsize((flags & PORT_INPUT),
2051 0, _port_minimumSize[port_index]);
2052 _ev_buffers[port_index] = scratch_bufs.get_lv2_midi(
2053 (flags & PORT_INPUT), 0, (flags & PORT_EVENT));
2056 buf = lv2_evbuf_get_buffer(_ev_buffers[port_index]);
2058 continue; // Control port, leave buffer alone
2060 lilv_instance_connect_port(_impl->instance, port_index, buf);
2063 // Read messages from UI and push into appropriate buffers
2065 uint32_t read_space = _from_ui->read_space();
2066 while (read_space > sizeof(UIMessage)) {
2068 if (_from_ui->read((uint8_t*)&msg, sizeof(msg)) != sizeof(msg)) {
2069 error << "Error reading from UI=>Plugin RingBuffer" << endmsg;
2072 vector<uint8_t> body(msg.size);
2073 if (_from_ui->read(&body[0], msg.size) != msg.size) {
2074 error << "Error reading from UI=>Plugin RingBuffer" << endmsg;
2077 if (msg.protocol == URIMap::instance().urids.atom_eventTransfer) {
2078 LV2_Evbuf* buf = _ev_buffers[msg.index];
2079 LV2_Evbuf_Iterator i = lv2_evbuf_end(buf);
2080 const LV2_Atom* const atom = (const LV2_Atom*)&body[0];
2081 if (!lv2_evbuf_write(&i, nframes - 1, 0, atom->type, atom->size,
2082 (const uint8_t*)(atom + 1))) {
2083 error << "Failed to write data to LV2 event buffer\n";
2086 error << "Received unknown message type from UI" << endmsg;
2088 read_space -= sizeof(UIMessage) + msg.size;
2095 for (uint32_t port_index = 0; port_index < num_ports; ++port_index) {
2096 PortFlags flags = _port_flags[port_index];
2099 /* TODO ask drobilla about comment
2100 * "Make Ardour event buffers generic so plugins can communicate"
2101 * in libs/ardour/buffer_set.cc:310
2103 * ideally the user could choose which of the following two modes
2104 * to use (e.g. instrument/effect chains MIDI OUT vs MIDI TRHU).
2106 * This implementation follows the discussion on IRC Mar 16 2013 16:47 UTC
2107 * 16:51 < drobilla> rgareus: [..] i.e always replace with MIDI output [of LV2 plugin] if it's there
2108 * 16:52 < drobilla> rgareus: That would probably be good enough [..] to make users not complain
2109 * for quite a while at least ;)
2111 // copy output of LV2 plugin's MIDI port to Ardour MIDI buffers -- MIDI OUT
2112 if ((flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE|PORT_MIDI))) {
2113 const uint32_t buf_index = out_map.get(
2114 DataType::MIDI, midi_out_index++, &valid);
2116 bufs.forward_lv2_midi(_ev_buffers[port_index], buf_index);
2119 // Flush MIDI (write back to Ardour MIDI buffers) -- MIDI THRU
2120 else if ((flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE))) {
2121 const uint32_t buf_index = out_map.get(
2122 DataType::MIDI, midi_out_index++, &valid);
2124 bufs.flush_lv2_midi(true, buf_index);
2129 // Write messages to UI
2130 if ((_to_ui || _patch_port_out_index != (uint32_t)-1) &&
2131 (flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE))) {
2132 LV2_Evbuf* buf = _ev_buffers[port_index];
2133 for (LV2_Evbuf_Iterator i = lv2_evbuf_begin(buf);
2134 lv2_evbuf_is_valid(i);
2135 i = lv2_evbuf_next(i)) {
2136 uint32_t frames, subframes, type, size;
2138 lv2_evbuf_get(i, &frames, &subframes, &type, &size, &data);
2140 // Intercept patch change messages to emit PropertyChanged signal
2141 if ((flags & PORT_PATCHMSG)) {
2142 LV2_Atom* atom = (LV2_Atom*)(data - sizeof(LV2_Atom));
2143 if (atom->type == _uri_map.urids.atom_Blank ||
2144 atom->type == _uri_map.urids.atom_Object) {
2145 LV2_Atom_Object* obj = (LV2_Atom_Object*)atom;
2146 if (obj->body.otype == _uri_map.urids.patch_Set) {
2147 const LV2_Atom* property = NULL;
2148 const LV2_Atom* value = NULL;
2149 lv2_atom_object_get(obj,
2150 _uri_map.urids.patch_property, &property,
2151 _uri_map.urids.patch_value, &value,
2154 if (!property || !value ||
2155 property->type != _uri_map.urids.atom_URID ||
2156 value->type != _uri_map.urids.atom_Path) {
2157 std::cerr << "warning: patch:Set for unknown property" << std::endl;
2161 const uint32_t prop_id = ((const LV2_Atom_URID*)property)->body;
2162 const char* path = (const char*)LV2_ATOM_BODY_CONST(value);
2164 // Emit PropertyChanged signal for UI
2165 // TODO: This should emit the control's Changed signal
2166 PropertyChanged(prop_id, Variant(Variant::PATH, path));
2171 if (!_to_ui) continue;
2172 write_to_ui(port_index, URIMap::instance().urids.atom_eventTransfer,
2173 size + sizeof(LV2_Atom),
2174 data - sizeof(LV2_Atom));
2179 cycles_t now = get_cycles();
2180 set_cycles((uint32_t)(now - then));
2182 // Update expected transport information for next cycle so we can detect changes
2183 _next_cycle_speed = _session.transport_speed();
2184 _next_cycle_start = _session.transport_frame() + (nframes * _next_cycle_speed);
2190 LV2Plugin::parameter_is_control(uint32_t param) const
2192 assert(param < _port_flags.size());
2193 return _port_flags[param] & PORT_CONTROL;
2197 LV2Plugin::parameter_is_audio(uint32_t param) const
2199 assert(param < _port_flags.size());
2200 return _port_flags[param] & PORT_AUDIO;
2204 LV2Plugin::parameter_is_event(uint32_t param) const
2206 assert(param < _port_flags.size());
2207 return _port_flags[param] & PORT_EVENT;
2211 LV2Plugin::parameter_is_output(uint32_t param) const
2213 assert(param < _port_flags.size());
2214 return _port_flags[param] & PORT_OUTPUT;
2218 LV2Plugin::parameter_is_input(uint32_t param) const
2220 assert(param < _port_flags.size());
2221 return _port_flags[param] & PORT_INPUT;
2225 LV2Plugin::print_parameter(uint32_t param, char* buf, uint32_t len) const
2228 if (param < parameter_count()) {
2229 snprintf(buf, len, "%.3f", get_parameter(param));
2236 boost::shared_ptr<ScalePoints>
2237 LV2Plugin::get_scale_points(uint32_t port_index) const
2239 const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, port_index);
2240 LilvScalePoints* points = lilv_port_get_scale_points(_impl->plugin, port);
2242 boost::shared_ptr<ScalePoints> ret;
2247 ret = boost::shared_ptr<ScalePoints>(new ScalePoints());
2249 LILV_FOREACH(scale_points, i, points) {
2250 const LilvScalePoint* p = lilv_scale_points_get(points, i);
2251 const LilvNode* label = lilv_scale_point_get_label(p);
2252 const LilvNode* value = lilv_scale_point_get_value(p);
2253 if (label && (lilv_node_is_float(value) || lilv_node_is_int(value))) {
2254 ret->insert(make_pair(lilv_node_as_string(label),
2255 lilv_node_as_float(value)));
2259 lilv_scale_points_free(points);
2264 LV2Plugin::run(pframes_t nframes)
2266 uint32_t const N = parameter_count();
2267 for (uint32_t i = 0; i < N; ++i) {
2268 if (parameter_is_control(i) && parameter_is_input(i)) {
2269 _control_data[i] = _shadow_data[i];
2273 lilv_instance_run(_impl->instance, nframes);
2275 if (_impl->work_iface) {
2276 _worker->emit_responses();
2277 if (_impl->work_iface->end_run) {
2278 _impl->work_iface->end_run(_impl->instance->lv2_handle);
2284 LV2Plugin::latency_compute_run()
2286 if (!_latency_control_port) {
2290 // Run the plugin so that it can set its latency parameter
2292 bool was_activated = _was_activated;
2295 uint32_t port_index = 0;
2296 uint32_t in_index = 0;
2297 uint32_t out_index = 0;
2299 // this is done in the main thread. non realtime.
2300 const framecnt_t bufsize = _engine.samples_per_cycle();
2301 float *buffer = (float*) malloc(_engine.samples_per_cycle() * sizeof(float));
2303 memset(buffer, 0, sizeof(float) * bufsize);
2305 // FIXME: Ensure plugins can handle in-place processing
2309 while (port_index < parameter_count()) {
2310 if (parameter_is_audio(port_index)) {
2311 if (parameter_is_input(port_index)) {
2312 lilv_instance_connect_port(_impl->instance, port_index, buffer);
2314 } else if (parameter_is_output(port_index)) {
2315 lilv_instance_connect_port(_impl->instance, port_index, buffer);
2324 if (was_activated) {
2331 LV2Plugin::Impl::designated_input (const char* uri, void** bufptrs[], void** bufptr)
2333 const LilvPort* port = NULL;
2334 LilvNode* designation = lilv_new_uri(_world.world, uri);
2335 port = lilv_plugin_get_port_by_designation(
2336 plugin, _world.lv2_InputPort, designation);
2337 lilv_node_free(designation);
2339 bufptrs[lilv_port_get_index(plugin, port)] = bufptr;
2344 static bool lv2_filter (const string& str, void* /*arg*/)
2346 /* Not a dotfile, has a prefix before a period, suffix is "lv2" */
2348 return str[0] != '.' && (str.length() > 3 && str.find (".lv2") == (str.length() - 4));
2352 LV2World::LV2World()
2353 : world(lilv_world_new())
2354 , _bundle_checked(false)
2356 atom_AtomPort = lilv_new_uri(world, LV2_ATOM__AtomPort);
2357 atom_Chunk = lilv_new_uri(world, LV2_ATOM__Chunk);
2358 atom_Sequence = lilv_new_uri(world, LV2_ATOM__Sequence);
2359 atom_bufferType = lilv_new_uri(world, LV2_ATOM__bufferType);
2360 atom_supports = lilv_new_uri(world, LV2_ATOM__supports);
2361 atom_eventTransfer = lilv_new_uri(world, LV2_ATOM__eventTransfer);
2362 ev_EventPort = lilv_new_uri(world, LILV_URI_EVENT_PORT);
2363 ext_logarithmic = lilv_new_uri(world, LV2_PORT_PROPS__logarithmic);
2364 ext_notOnGUI = lilv_new_uri(world, LV2_PORT_PROPS__notOnGUI);
2365 lv2_AudioPort = lilv_new_uri(world, LILV_URI_AUDIO_PORT);
2366 lv2_ControlPort = lilv_new_uri(world, LILV_URI_CONTROL_PORT);
2367 lv2_InputPort = lilv_new_uri(world, LILV_URI_INPUT_PORT);
2368 lv2_OutputPort = lilv_new_uri(world, LILV_URI_OUTPUT_PORT);
2369 lv2_inPlaceBroken = lilv_new_uri(world, LV2_CORE__inPlaceBroken);
2370 lv2_integer = lilv_new_uri(world, LV2_CORE__integer);
2371 lv2_default = lilv_new_uri(world, LV2_CORE__default);
2372 lv2_minimum = lilv_new_uri(world, LV2_CORE__minimum);
2373 lv2_maximum = lilv_new_uri(world, LV2_CORE__maximum);
2374 lv2_reportsLatency = lilv_new_uri(world, LV2_CORE__reportsLatency);
2375 lv2_sampleRate = lilv_new_uri(world, LV2_CORE__sampleRate);
2376 lv2_toggled = lilv_new_uri(world, LV2_CORE__toggled);
2377 lv2_enumeration = lilv_new_uri(world, LV2_CORE__enumeration);
2378 lv2_freewheeling = lilv_new_uri(world, LV2_CORE__freeWheeling);
2379 midi_MidiEvent = lilv_new_uri(world, LILV_URI_MIDI_EVENT);
2380 rdfs_comment = lilv_new_uri(world, LILV_NS_RDFS "comment");
2381 rdfs_label = lilv_new_uri(world, LILV_NS_RDFS "label");
2382 rdfs_range = lilv_new_uri(world, LILV_NS_RDFS "range");
2383 rsz_minimumSize = lilv_new_uri(world, LV2_RESIZE_PORT__minimumSize);
2384 time_Position = lilv_new_uri(world, LV2_TIME__Position);
2385 ui_GtkUI = lilv_new_uri(world, LV2_UI__GtkUI);
2386 ui_external = lilv_new_uri(world, "http://lv2plug.in/ns/extensions/ui#external");
2387 ui_externalkx = lilv_new_uri(world, "http://kxstudio.sf.net/ns/lv2ext/external-ui#Widget");
2388 units_unit = lilv_new_uri(world, LV2_UNITS__unit);
2389 units_render = lilv_new_uri(world, LV2_UNITS__render);
2390 units_hz = lilv_new_uri(world, LV2_UNITS__hz);
2391 units_midiNote = lilv_new_uri(world, LV2_UNITS__midiNote);
2392 units_db = lilv_new_uri(world, LV2_UNITS__db);
2393 patch_writable = lilv_new_uri(world, LV2_PATCH__writable);
2394 patch_Message = lilv_new_uri(world, LV2_PATCH__Message);
2395 #ifdef HAVE_LV2_1_2_0
2396 bufz_powerOf2BlockLength = lilv_new_uri(world, LV2_BUF_SIZE__powerOf2BlockLength);
2397 bufz_fixedBlockLength = lilv_new_uri(world, LV2_BUF_SIZE__fixedBlockLength);
2402 LV2World::~LV2World()
2404 #ifdef HAVE_LV2_1_2_0
2405 lilv_node_free(bufz_fixedBlockLength);
2406 lilv_node_free(bufz_powerOf2BlockLength);
2408 lilv_node_free(patch_Message);
2409 lilv_node_free(patch_writable);
2410 lilv_node_free(units_hz);
2411 lilv_node_free(units_midiNote);
2412 lilv_node_free(units_db);
2413 lilv_node_free(units_unit);
2414 lilv_node_free(units_render);
2415 lilv_node_free(ui_externalkx);
2416 lilv_node_free(ui_external);
2417 lilv_node_free(ui_GtkUI);
2418 lilv_node_free(time_Position);
2419 lilv_node_free(rsz_minimumSize);
2420 lilv_node_free(rdfs_comment);
2421 lilv_node_free(rdfs_label);
2422 lilv_node_free(rdfs_range);
2423 lilv_node_free(midi_MidiEvent);
2424 lilv_node_free(lv2_enumeration);
2425 lilv_node_free(lv2_freewheeling);
2426 lilv_node_free(lv2_toggled);
2427 lilv_node_free(lv2_sampleRate);
2428 lilv_node_free(lv2_reportsLatency);
2429 lilv_node_free(lv2_integer);
2430 lilv_node_free(lv2_inPlaceBroken);
2431 lilv_node_free(lv2_OutputPort);
2432 lilv_node_free(lv2_InputPort);
2433 lilv_node_free(lv2_ControlPort);
2434 lilv_node_free(lv2_AudioPort);
2435 lilv_node_free(ext_notOnGUI);
2436 lilv_node_free(ext_logarithmic);
2437 lilv_node_free(ev_EventPort);
2438 lilv_node_free(atom_supports);
2439 lilv_node_free(atom_eventTransfer);
2440 lilv_node_free(atom_bufferType);
2441 lilv_node_free(atom_Sequence);
2442 lilv_node_free(atom_Chunk);
2443 lilv_node_free(atom_AtomPort);
2444 lilv_world_free(world);
2448 LV2World::load_bundled_plugins(bool verbose)
2450 if (!_bundle_checked) {
2452 cout << "Scanning folders for bundled LV2s: " << ARDOUR::lv2_bundled_search_path().to_string() << endl;
2455 vector<string> plugin_objects;
2456 find_paths_matching_filter (plugin_objects, ARDOUR::lv2_bundled_search_path(), lv2_filter, 0, true, true, true);
2457 for ( vector<string>::iterator x = plugin_objects.begin(); x != plugin_objects.end (); ++x) {
2458 #ifdef PLATFORM_WINDOWS
2459 string uri = "file:///" + *x + "/";
2461 string uri = "file://" + *x + "/";
2463 LilvNode *node = lilv_new_uri(world, uri.c_str());
2464 lilv_world_load_bundle(world, node);
2465 lilv_node_free(node);
2468 lilv_world_load_all(world);
2469 _bundle_checked = true;
2473 LV2PluginInfo::LV2PluginInfo (const char* plugin_uri)
2476 _plugin_uri = strdup(plugin_uri);
2479 LV2PluginInfo::~LV2PluginInfo()
2486 LV2PluginInfo::load(Session& session)
2490 const LilvPlugins* plugins = lilv_world_get_all_plugins(_world.world);
2491 LilvNode* uri = lilv_new_uri(_world.world, _plugin_uri);
2492 if (!uri) { throw failed_constructor(); }
2493 const LilvPlugin* lp = lilv_plugins_get_by_uri(plugins, uri);
2494 if (!lp) { throw failed_constructor(); }
2495 plugin.reset(new LV2Plugin(session.engine(), session, lp, session.frame_rate()));
2496 lilv_node_free(uri);
2497 plugin->set_info(PluginInfoPtr(shared_from_this ()));
2499 } catch (failed_constructor& err) {
2500 return PluginPtr((Plugin*)0);
2507 LV2PluginInfo::discover()
2510 world.load_bundled_plugins();
2511 _world.load_bundled_plugins(true);
2513 PluginInfoList* plugs = new PluginInfoList;
2514 const LilvPlugins* plugins = lilv_world_get_all_plugins(world.world);
2516 LILV_FOREACH(plugins, i, plugins) {
2517 const LilvPlugin* p = lilv_plugins_get(plugins, i);
2518 const LilvNode* pun = lilv_plugin_get_uri(p);
2520 LV2PluginInfoPtr info(new LV2PluginInfo(lilv_node_as_string(pun)));
2522 LilvNode* name = lilv_plugin_get_name(p);
2523 if (!name || !lilv_plugin_get_port_by_index(p, 0)) {
2524 warning << "Ignoring invalid LV2 plugin "
2525 << lilv_node_as_string(lilv_plugin_get_uri(p))
2530 if (lilv_plugin_has_feature(p, world.lv2_inPlaceBroken)) {
2531 warning << string_compose(
2532 _("Ignoring LV2 plugin \"%1\" since it cannot do inplace processing."),
2533 lilv_node_as_string(name)) << endmsg;
2534 lilv_node_free(name);
2538 #ifdef HAVE_LV2_1_2_0
2539 LilvNodes *required_features = lilv_plugin_get_required_features (p);
2540 if (lilv_nodes_contains (required_features, world.bufz_powerOf2BlockLength) ||
2541 lilv_nodes_contains (required_features, world.bufz_fixedBlockLength)
2543 warning << string_compose(
2544 _("Ignoring LV2 plugin \"%1\" because its buffer-size requirements cannot be satisfied."),
2545 lilv_node_as_string(name)) << endmsg;
2546 lilv_nodes_free(required_features);
2547 lilv_node_free(name);
2550 lilv_nodes_free(required_features);
2555 info->name = string(lilv_node_as_string(name));
2556 lilv_node_free(name);
2557 ARDOUR::PluginScanMessage(_("LV2"), info->name, false);
2559 const LilvPluginClass* pclass = lilv_plugin_get_class(p);
2560 const LilvNode* label = lilv_plugin_class_get_label(pclass);
2561 info->category = lilv_node_as_string(label);
2563 LilvNode* author_name = lilv_plugin_get_author_name(p);
2564 info->creator = author_name ? string(lilv_node_as_string(author_name)) : "Unknown";
2565 lilv_node_free(author_name);
2567 info->path = "/NOPATH"; // Meaningless for LV2
2569 /* count atom-event-ports that feature
2570 * atom:supports <http://lv2plug.in/ns/ext/midi#MidiEvent>
2572 * TODO: nicely ask drobilla to make a lilv_ call for that
2574 int count_midi_out = 0;
2575 int count_midi_in = 0;
2576 for (uint32_t i = 0; i < lilv_plugin_get_num_ports(p); ++i) {
2577 const LilvPort* port = lilv_plugin_get_port_by_index(p, i);
2578 if (lilv_port_is_a(p, port, world.atom_AtomPort)) {
2579 LilvNodes* buffer_types = lilv_port_get_value(
2580 p, port, world.atom_bufferType);
2581 LilvNodes* atom_supports = lilv_port_get_value(
2582 p, port, world.atom_supports);
2584 if (lilv_nodes_contains(buffer_types, world.atom_Sequence)
2585 && lilv_nodes_contains(atom_supports, world.midi_MidiEvent)) {
2586 if (lilv_port_is_a(p, port, world.lv2_InputPort)) {
2589 if (lilv_port_is_a(p, port, world.lv2_OutputPort)) {
2593 lilv_nodes_free(buffer_types);
2594 lilv_nodes_free(atom_supports);
2598 info->n_inputs.set_audio(
2599 lilv_plugin_get_num_ports_of_class(
2600 p, world.lv2_InputPort, world.lv2_AudioPort, NULL));
2601 info->n_inputs.set_midi(
2602 lilv_plugin_get_num_ports_of_class(
2603 p, world.lv2_InputPort, world.ev_EventPort, NULL)
2606 info->n_outputs.set_audio(
2607 lilv_plugin_get_num_ports_of_class(
2608 p, world.lv2_OutputPort, world.lv2_AudioPort, NULL));
2609 info->n_outputs.set_midi(
2610 lilv_plugin_get_num_ports_of_class(
2611 p, world.lv2_OutputPort, world.ev_EventPort, NULL)
2614 info->unique_id = lilv_node_as_uri(lilv_plugin_get_uri(p));
2615 info->index = 0; // Meaningless for LV2
2617 plugs->push_back(info);