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/ext/patch/patch.h"
71 #include "lv2/lv2plug.in/ns/ext/buf-size/buf-size.h"
72 #include "lv2/lv2plug.in/ns/ext/options/options.h"
75 #include "lv2_evbuf.h"
78 #include <suil/suil.h>
81 // Compatibility for lv2-1.0.0
82 #ifndef LV2_ATOM_CONTENTS_CONST
83 #define LV2_ATOM_CONTENTS_CONST(type, atom) \
84 ((const void*)((const uint8_t*)(atom) + sizeof(type)))
86 #ifndef LV2_ATOM_BODY_CONST
87 #define LV2_ATOM_BODY_CONST(atom) LV2_ATOM_CONTENTS_CONST(LV2_Atom, atom)
90 /** The number of MIDI buffers that will fit in a UI/worker comm buffer.
91 This needs to be roughly the number of cycles the UI will get around to
92 actually processing the traffic. Lower values are flakier but save memory.
94 static const size_t NBUFS = 4;
97 using namespace ARDOUR;
100 URIMap LV2Plugin::_uri_map;
102 LV2Plugin::URIDs LV2Plugin::urids = {
103 _uri_map.uri_to_id(LV2_ATOM__Chunk),
104 _uri_map.uri_to_id(LV2_ATOM__Path),
105 _uri_map.uri_to_id(LV2_ATOM__Sequence),
106 _uri_map.uri_to_id(LV2_ATOM__eventTransfer),
107 _uri_map.uri_to_id(LV2_ATOM__URID),
108 _uri_map.uri_to_id(LV2_ATOM__Blank),
109 _uri_map.uri_to_id(LV2_ATOM__Object),
110 _uri_map.uri_to_id(LV2_LOG__Error),
111 _uri_map.uri_to_id(LV2_LOG__Note),
112 _uri_map.uri_to_id(LV2_LOG__Warning),
113 _uri_map.uri_to_id(LV2_MIDI__MidiEvent),
114 _uri_map.uri_to_id(LV2_TIME__Position),
115 _uri_map.uri_to_id(LV2_TIME__bar),
116 _uri_map.uri_to_id(LV2_TIME__barBeat),
117 _uri_map.uri_to_id(LV2_TIME__beatUnit),
118 _uri_map.uri_to_id(LV2_TIME__beatsPerBar),
119 _uri_map.uri_to_id(LV2_TIME__beatsPerMinute),
120 _uri_map.uri_to_id(LV2_TIME__frame),
121 _uri_map.uri_to_id(LV2_TIME__speed),
122 _uri_map.uri_to_id(LV2_PATCH__Get),
123 _uri_map.uri_to_id(LV2_PATCH__Set),
124 _uri_map.uri_to_id(LV2_PATCH__property),
125 _uri_map.uri_to_id(LV2_PATCH__value)
128 class LV2World : boost::noncopyable {
133 void load_bundled_plugins(bool verbose=false);
137 LilvNode* atom_AtomPort;
138 LilvNode* atom_Chunk;
139 LilvNode* atom_Sequence;
140 LilvNode* atom_bufferType;
141 LilvNode* atom_eventTransfer;
142 LilvNode* atom_supports;
143 LilvNode* ev_EventPort;
144 LilvNode* ext_logarithmic;
145 LilvNode* ext_notOnGUI;
146 LilvNode* lv2_AudioPort;
147 LilvNode* lv2_ControlPort;
148 LilvNode* lv2_InputPort;
149 LilvNode* lv2_OutputPort;
150 LilvNode* lv2_enumeration;
151 LilvNode* lv2_freewheeling;
152 LilvNode* lv2_inPlaceBroken;
153 LilvNode* lv2_integer;
154 LilvNode* lv2_reportsLatency;
155 LilvNode* lv2_sampleRate;
156 LilvNode* lv2_toggled;
157 LilvNode* midi_MidiEvent;
158 LilvNode* rdfs_comment;
159 LilvNode* rdfs_label;
160 LilvNode* rdfs_range;
161 LilvNode* rsz_minimumSize;
162 LilvNode* time_Position;
164 LilvNode* ui_external;
165 LilvNode* ui_externalkx;
166 LilvNode* units_unit;
167 LilvNode* units_midiNote;
168 LilvNode* patch_writable;
169 LilvNode* patch_Message;
172 bool _bundle_checked;
175 static LV2World _world;
177 /* worker extension */
179 /** Called by the plugin to schedule non-RT work. */
180 static LV2_Worker_Status
181 work_schedule(LV2_Worker_Schedule_Handle handle,
185 LV2Plugin* plugin = (LV2Plugin*)handle;
186 if (plugin->session().engine().freewheeling()) {
187 // Freewheeling, do the work immediately in this (audio) thread
188 return (LV2_Worker_Status)plugin->work(size, data);
190 // Enqueue message for the worker thread
191 return plugin->worker()->schedule(size, data) ?
192 LV2_WORKER_SUCCESS : LV2_WORKER_ERR_UNKNOWN;
196 /** Called by the plugin to respond to non-RT work. */
197 static LV2_Worker_Status
198 work_respond(LV2_Worker_Respond_Handle handle,
202 LV2Plugin* plugin = (LV2Plugin*)handle;
203 if (plugin->session().engine().freewheeling()) {
204 // Freewheeling, respond immediately in this (audio) thread
205 return (LV2_Worker_Status)plugin->work_response(size, data);
207 // Enqueue response for the worker
208 return plugin->worker()->respond(size, data) ?
209 LV2_WORKER_SUCCESS : LV2_WORKER_ERR_UNKNOWN;
216 log_vprintf(LV2_Log_Handle /*handle*/,
222 const int ret = g_vasprintf(&str, fmt, args);
223 if (type == LV2Plugin::urids.log_Error) {
224 error << str << endmsg;
225 } else if (type == LV2Plugin::urids.log_Warning) {
226 warning << str << endmsg;
227 } else if (type == LV2Plugin::urids.log_Note) {
228 info << str << endmsg;
230 // TODO: Toggleable log:Trace message support
235 log_printf(LV2_Log_Handle handle,
237 const char* fmt, ...)
241 const int ret = log_vprintf(handle, type, fmt, args);
246 struct LV2Plugin::Impl {
247 Impl() : plugin(0), ui(0), ui_type(0), name(0), author(0), instance(0)
252 /** Find the LV2 input port with the given designation.
253 * If found, bufptrs[port_index] will be set to bufptr.
255 const LilvPort* designated_input (const char* uri, void** bufptrs[], void** bufptr);
257 const LilvPlugin* plugin;
259 const LilvNode* ui_type;
262 LilvInstance* instance;
263 const LV2_Worker_Interface* work_iface;
265 LV2_Atom_Forge forge;
266 LV2_Atom_Forge ui_forge;
269 LV2Plugin::LV2Plugin (AudioEngine& engine,
271 const void* c_plugin,
273 : Plugin (engine, session)
279 , _patch_port_in_index((uint32_t)-1)
280 , _patch_port_out_index((uint32_t)-1)
282 init(c_plugin, rate);
285 LV2Plugin::LV2Plugin (const LV2Plugin& other)
291 , _insert_id(other._insert_id)
292 , _patch_port_in_index((uint32_t)-1)
293 , _patch_port_out_index((uint32_t)-1)
295 init(other._impl->plugin, other._sample_rate);
297 for (uint32_t i = 0; i < parameter_count(); ++i) {
298 _control_data[i] = other._shadow_data[i];
299 _shadow_data[i] = other._shadow_data[i];
304 LV2Plugin::init(const void* c_plugin, framecnt_t rate)
306 DEBUG_TRACE(DEBUG::LV2, "init\n");
308 _impl->plugin = (const LilvPlugin*)c_plugin;
310 _impl->ui_type = NULL;
315 _atom_ev_buffers = 0;
317 _bpm_control_port = 0;
318 _freewheel_control_port = 0;
319 _latency_control_port = 0;
320 _next_cycle_start = std::numeric_limits<framepos_t>::max();
321 _next_cycle_speed = 1.0;
322 _block_length = _engine.samples_per_cycle();
323 _seq_size = _engine.raw_buffer_size(DataType::MIDI);
325 _was_activated = false;
326 _has_state_interface = false;
328 _instance_access_feature.URI = "http://lv2plug.in/ns/ext/instance-access";
329 _data_access_feature.URI = "http://lv2plug.in/ns/ext/data-access";
330 _make_path_feature.URI = LV2_STATE__makePath;
331 _log_feature.URI = LV2_LOG__log;
332 _work_schedule_feature.URI = LV2_WORKER__schedule;
333 _work_schedule_feature.data = NULL;
334 _def_state_feature.URI = LV2_STATE_PREFIX "loadDefaultState"; // Post LV2-1.2.0
335 _def_state_feature.data = NULL;
337 const LilvPlugin* plugin = _impl->plugin;
339 LilvNode* state_iface_uri = lilv_new_uri(_world.world, LV2_STATE__interface);
340 LilvNode* state_uri = lilv_new_uri(_world.world, LV2_STATE_URI);
341 _has_state_interface =
342 // What plugins should have (lv2:extensionData state:Interface)
343 lilv_plugin_has_extension_data(plugin, state_iface_uri)
344 // What some outdated/incorrect ones have
345 || lilv_plugin_has_feature(plugin, state_uri);
346 lilv_node_free(state_uri);
347 lilv_node_free(state_iface_uri);
349 _features = (LV2_Feature**)calloc(11, sizeof(LV2_Feature*));
350 _features[0] = &_instance_access_feature;
351 _features[1] = &_data_access_feature;
352 _features[2] = &_make_path_feature;
353 _features[3] = _uri_map.uri_map_feature();
354 _features[4] = _uri_map.urid_map_feature();
355 _features[5] = _uri_map.urid_unmap_feature();
356 _features[6] = &_log_feature;
358 unsigned n_features = 7;
359 #ifdef HAVE_LV2_1_2_0
360 _features[n_features++] = &_def_state_feature;
363 lv2_atom_forge_init(&_impl->forge, _uri_map.urid_map());
364 lv2_atom_forge_init(&_impl->ui_forge, _uri_map.urid_map());
366 #ifdef HAVE_LV2_1_2_0
367 LV2_URID atom_Int = _uri_map.uri_to_id(LV2_ATOM__Int);
368 LV2_Options_Option options[] = {
369 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id(LV2_BUF_SIZE__minBlockLength),
370 sizeof(int32_t), atom_Int, &_block_length },
371 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id(LV2_BUF_SIZE__maxBlockLength),
372 sizeof(int32_t), atom_Int, &_block_length },
373 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id(LV2_BUF_SIZE__sequenceSize),
374 sizeof(int32_t), atom_Int, &_seq_size },
375 { LV2_OPTIONS_INSTANCE, 0, 0, 0, 0, NULL }
378 _options_feature.URI = LV2_OPTIONS__options;
379 _options_feature.data = options;
380 _features[n_features++] = &_options_feature;
383 LV2_State_Make_Path* make_path = (LV2_State_Make_Path*)malloc(
384 sizeof(LV2_State_Make_Path));
385 make_path->handle = this;
386 make_path->path = &lv2_state_make_path;
387 _make_path_feature.data = make_path;
389 LV2_Log_Log* log = (LV2_Log_Log*)malloc(sizeof(LV2_Log_Log));
391 log->printf = &log_printf;
392 log->vprintf = &log_vprintf;
393 _log_feature.data = log;
395 LilvNode* worker_schedule = lilv_new_uri(_world.world, LV2_WORKER__schedule);
396 if (lilv_plugin_has_feature(plugin, worker_schedule)) {
397 LV2_Worker_Schedule* schedule = (LV2_Worker_Schedule*)malloc(
398 sizeof(LV2_Worker_Schedule));
399 size_t buf_size = _session.engine().raw_buffer_size(DataType::MIDI) * NBUFS;
400 _worker = new Worker(this, buf_size);
401 schedule->handle = this;
402 schedule->schedule_work = work_schedule;
403 _work_schedule_feature.data = schedule;
404 _features[n_features++] = &_work_schedule_feature;
406 lilv_node_free(worker_schedule);
408 _impl->instance = lilv_plugin_instantiate(plugin, rate, _features);
409 _impl->name = lilv_plugin_get_name(plugin);
410 _impl->author = lilv_plugin_get_author_name(plugin);
412 if (_impl->instance == 0) {
413 error << _("LV2: Failed to instantiate plugin ") << uri() << endmsg;
414 throw failed_constructor();
417 _instance_access_feature.data = (void*)_impl->instance->lv2_handle;
418 _data_access_extension_data.extension_data = _impl->instance->lv2_descriptor->extension_data;
419 _data_access_feature.data = &_data_access_extension_data;
421 LilvNode* worker_iface_uri = lilv_new_uri(_world.world, LV2_WORKER__interface);
422 if (lilv_plugin_has_extension_data(plugin, worker_iface_uri)) {
423 _impl->work_iface = (const LV2_Worker_Interface*)extension_data(
424 LV2_WORKER__interface);
426 lilv_node_free(worker_iface_uri);
428 if (lilv_plugin_has_feature(plugin, _world.lv2_inPlaceBroken)) {
429 error << string_compose(
430 _("LV2: \"%1\" cannot be used, since it cannot do inplace processing"),
431 lilv_node_as_string(_impl->name)) << endmsg;
432 lilv_node_free(_impl->name);
433 lilv_node_free(_impl->author);
434 throw failed_constructor();
437 #ifdef HAVE_LILV_0_16_0
438 // Load default state
439 LilvState* state = lilv_state_new_from_world(
440 _world.world, _uri_map.urid_map(), lilv_plugin_get_uri(_impl->plugin));
441 if (state && _has_state_interface) {
442 lilv_state_restore(state, _impl->instance, NULL, NULL, 0, NULL);
448 const uint32_t num_ports = this->num_ports();
449 for (uint32_t i = 0; i < num_ports; ++i) {
450 const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, i);
452 size_t minimumSize = 0;
454 if (lilv_port_is_a(_impl->plugin, port, _world.lv2_OutputPort)) {
455 flags |= PORT_OUTPUT;
456 } else if (lilv_port_is_a(_impl->plugin, port, _world.lv2_InputPort)) {
459 error << string_compose(
460 "LV2: \"%1\" port %2 is neither input nor output",
461 lilv_node_as_string(_impl->name), i) << endmsg;
462 throw failed_constructor();
465 if (lilv_port_is_a(_impl->plugin, port, _world.lv2_ControlPort)) {
466 flags |= PORT_CONTROL;
467 } else if (lilv_port_is_a(_impl->plugin, port, _world.lv2_AudioPort)) {
469 } else if (lilv_port_is_a(_impl->plugin, port, _world.ev_EventPort)) {
471 flags |= PORT_MIDI; // We assume old event API ports are for MIDI
472 } else if (lilv_port_is_a(_impl->plugin, port, _world.atom_AtomPort)) {
473 LilvNodes* buffer_types = lilv_port_get_value(
474 _impl->plugin, port, _world.atom_bufferType);
475 LilvNodes* atom_supports = lilv_port_get_value(
476 _impl->plugin, port, _world.atom_supports);
478 if (lilv_nodes_contains(buffer_types, _world.atom_Sequence)) {
479 flags |= PORT_SEQUENCE;
480 if (lilv_nodes_contains(atom_supports, _world.midi_MidiEvent)) {
483 if (lilv_nodes_contains(atom_supports, _world.time_Position)) {
484 flags |= PORT_POSITION;
486 if (lilv_nodes_contains(atom_supports, _world.patch_Message)) {
487 flags |= PORT_PATCHMSG;
488 if (flags & PORT_INPUT) {
489 _patch_port_in_index = i;
491 _patch_port_out_index = i;
495 LilvNodes* min_size_v = lilv_port_get_value(_impl->plugin, port, _world.rsz_minimumSize);
496 LilvNode* min_size = min_size_v ? lilv_nodes_get_first(min_size_v) : NULL;
497 if (min_size && lilv_node_is_int(min_size)) {
498 minimumSize = lilv_node_as_int(min_size);
500 lilv_nodes_free(min_size_v);
501 lilv_nodes_free(buffer_types);
502 lilv_nodes_free(atom_supports);
504 error << string_compose(
505 "LV2: \"%1\" port %2 has no known data type",
506 lilv_node_as_string(_impl->name), i) << endmsg;
507 throw failed_constructor();
510 _port_flags.push_back(flags);
511 _port_minimumSize.push_back(minimumSize);
514 _control_data = new float[num_ports];
515 _shadow_data = new float[num_ports];
516 _defaults = new float[num_ports];
517 _ev_buffers = new LV2_Evbuf*[num_ports];
518 memset(_ev_buffers, 0, sizeof(LV2_Evbuf*) * num_ports);
520 const bool latent = lilv_plugin_has_latency(plugin);
521 const uint32_t latency_index = (latent)
522 ? lilv_plugin_get_latency_port_index(plugin)
525 // Build an array of pointers to special parameter buffers
526 void*** params = new void**[num_ports];
527 for (uint32_t i = 0; i < num_ports; ++i) {
530 _impl->designated_input (LV2_TIME__beatsPerMinute, params, (void**)&_bpm_control_port);
531 _impl->designated_input (LV2_CORE__freeWheeling, params, (void**)&_freewheel_control_port);
533 for (uint32_t i = 0; i < num_ports; ++i) {
534 const LilvPort* port = lilv_plugin_get_port_by_index(plugin, i);
535 const LilvNode* sym = lilv_port_get_symbol(plugin, port);
537 // Store index in map so we can look up index by symbol
538 _port_indices.insert(std::make_pair(lilv_node_as_string(sym), i));
540 // Get range and default value if applicable
541 if (parameter_is_control(i)) {
543 lilv_port_get_range(plugin, port, &def, NULL, NULL);
544 _defaults[i] = def ? lilv_node_as_float(def) : 0.0f;
545 if (lilv_port_has_property (plugin, port, _world.lv2_sampleRate)) {
546 _defaults[i] *= _session.frame_rate ();
550 lilv_instance_connect_port(_impl->instance, i, &_control_data[i]);
552 if (latent && i == latency_index) {
553 _latency_control_port = &_control_data[i];
554 *_latency_control_port = 0;
557 if (parameter_is_input(i)) {
558 _shadow_data[i] = default_value(i);
560 *params[i] = (void*)&_shadow_data[i];
570 LilvUIs* uis = lilv_plugin_get_uis(plugin);
571 if (lilv_uis_size(uis) > 0) {
573 // Look for embeddable UI
574 LILV_FOREACH(uis, u, uis) {
575 const LilvUI* this_ui = lilv_uis_get(uis, u);
576 const LilvNode* this_ui_type = NULL;
577 if (lilv_ui_is_supported(this_ui,
581 // TODO: Multiple UI support
583 _impl->ui_type = this_ui_type;
588 // Look for Gtk native UI
589 LILV_FOREACH(uis, i, uis) {
590 const LilvUI* ui = lilv_uis_get(uis, i);
591 if (lilv_ui_is_a(ui, _world.ui_GtkUI)) {
593 _impl->ui_type = _world.ui_GtkUI;
599 // If Gtk UI is not available, try to find external UI
601 LILV_FOREACH(uis, i, uis) {
602 const LilvUI* ui = lilv_uis_get(uis, i);
603 if (lilv_ui_is_a(ui, _world.ui_externalkx)) {
605 _impl->ui_type = _world.ui_external;
608 if (lilv_ui_is_a(ui, _world.ui_external)) {
610 _impl->ui_type = _world.ui_external;
616 allocate_atom_event_buffers();
617 latency_compute_run();
620 LV2Plugin::~LV2Plugin ()
622 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 destroy\n", name()));
627 lilv_instance_free(_impl->instance);
628 lilv_node_free(_impl->name);
629 lilv_node_free(_impl->author);
632 free(_make_path_feature.data);
633 free(_work_schedule_feature.data);
639 if (_atom_ev_buffers) {
640 LV2_Evbuf** b = _atom_ev_buffers;
645 free(_atom_ev_buffers);
648 delete [] _control_data;
649 delete [] _shadow_data;
650 delete [] _ev_buffers;
654 LV2Plugin::is_external_ui() const
659 return lilv_ui_is_a(_impl->ui, _world.ui_external) || lilv_ui_is_a(_impl->ui, _world.ui_externalkx);
663 LV2Plugin::is_external_kx() const
668 return lilv_ui_is_a(_impl->ui, _world.ui_externalkx);
672 LV2Plugin::ui_is_resizable () const
674 const LilvNode* s = lilv_ui_get_uri(_impl->ui);
675 LilvNode* p = lilv_new_uri(_world.world, LV2_CORE__optionalFeature);
676 LilvNode* fs = lilv_new_uri(_world.world, LV2_UI__fixedSize);
677 LilvNode* nrs = lilv_new_uri(_world.world, LV2_UI__noUserResize);
679 LilvNodes* fs_matches = lilv_world_find_nodes(_world.world, s, p, fs);
680 LilvNodes* nrs_matches = lilv_world_find_nodes(_world.world, s, p, nrs);
682 lilv_nodes_free(nrs_matches);
683 lilv_nodes_free(fs_matches);
688 return !fs_matches && !nrs_matches;
692 LV2Plugin::unique_id() const
694 return lilv_node_as_uri(lilv_plugin_get_uri(_impl->plugin));
698 LV2Plugin::uri() const
700 return lilv_node_as_uri(lilv_plugin_get_uri(_impl->plugin));
704 LV2Plugin::label() const
706 return lilv_node_as_string(_impl->name);
710 LV2Plugin::name() const
712 return lilv_node_as_string(_impl->name);
716 LV2Plugin::maker() const
718 return _impl->author ? lilv_node_as_string (_impl->author) : "Unknown";
722 LV2Plugin::num_ports() const
724 return lilv_plugin_get_num_ports(_impl->plugin);
728 LV2Plugin::parameter_count() const
730 return lilv_plugin_get_num_ports(_impl->plugin);
734 LV2Plugin::default_value(uint32_t port)
736 return _defaults[port];
740 LV2Plugin::port_symbol(uint32_t index) const
742 const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, index);
744 error << name() << ": Invalid port index " << index << endmsg;
747 const LilvNode* sym = lilv_port_get_symbol(_impl->plugin, port);
748 return lilv_node_as_string(sym);
752 LV2Plugin::port_index (const char* symbol) const
754 const map<string, uint32_t>::const_iterator i = _port_indices.find(symbol);
755 if (i != _port_indices.end()) {
758 warning << string_compose(_("LV2: Unknown port %1"), symbol) << endmsg;
764 LV2Plugin::set_parameter(uint32_t which, float val)
766 DEBUG_TRACE(DEBUG::LV2, string_compose(
767 "%1 set parameter %2 to %3\n", name(), which, val));
769 if (which < lilv_plugin_get_num_ports(_impl->plugin)) {
770 if (get_parameter (which) == val) {
774 _shadow_data[which] = val;
776 warning << string_compose(
777 _("Illegal parameter number used with plugin \"%1\". "
778 "This is a bug in either %2 or the LV2 plugin <%3>"),
779 name(), PROGRAM_NAME, unique_id()) << endmsg;
782 Plugin::set_parameter(which, val);
786 LV2Plugin::get_parameter(uint32_t which) const
788 if (parameter_is_input(which)) {
789 return (float)_shadow_data[which];
791 return (float)_control_data[which];
797 LV2Plugin::get_docs() const
799 LilvNodes* comments = lilv_plugin_get_value(_impl->plugin, _world.rdfs_comment);
801 const std::string docs(lilv_node_as_string(lilv_nodes_get_first(comments)));
802 lilv_nodes_free(comments);
810 LV2Plugin::get_parameter_docs(uint32_t which) const
812 LilvNodes* comments = lilv_port_get_value(
814 lilv_plugin_get_port_by_index(_impl->plugin, which),
815 _world.rdfs_comment);
818 const std::string docs(lilv_node_as_string(lilv_nodes_get_first(comments)));
819 lilv_nodes_free(comments);
827 LV2Plugin::nth_parameter(uint32_t n, bool& ok) const
830 for (uint32_t c = 0, x = 0; x < lilv_plugin_get_num_ports(_impl->plugin); ++x) {
831 if (parameter_is_control(x)) {
843 LV2Plugin::extension_data(const char* uri) const
845 return lilv_instance_get_extension_data(_impl->instance, uri);
849 LV2Plugin::c_plugin()
851 return _impl->plugin;
857 return (const void*)_impl->ui;
861 LV2Plugin::c_ui_type()
863 return (const void*)_impl->ui_type;
866 /** Directory for all plugin state. */
868 LV2Plugin::plugin_dir() const
870 return Glib::build_filename(_session.plugins_dir(), _insert_id.to_s());
873 /** Directory for files created by the plugin (except during save). */
875 LV2Plugin::scratch_dir() const
877 return Glib::build_filename(plugin_dir(), "scratch");
880 /** Directory for snapshots of files in the scratch directory. */
882 LV2Plugin::file_dir() const
884 return Glib::build_filename(plugin_dir(), "files");
887 /** Directory to save state snapshot version @c num into. */
889 LV2Plugin::state_dir(unsigned num) const
891 return Glib::build_filename(plugin_dir(), string_compose("state%1", num));
894 /** Implementation of state:makePath for files created at instantiation time.
895 * Note this is not used for files created at save time (Lilv deals with that).
898 LV2Plugin::lv2_state_make_path(LV2_State_Make_Path_Handle handle,
901 LV2Plugin* me = (LV2Plugin*)handle;
902 if (me->_insert_id == PBD::ID("0")) {
903 warning << string_compose(
904 "File path \"%1\" requested but LV2 %2 has no insert ID",
905 path, me->name()) << endmsg;
906 return g_strdup(path);
909 const std::string abs_path = Glib::build_filename(me->scratch_dir(), path);
910 const std::string dirname = Glib::path_get_dirname(abs_path);
911 g_mkdir_with_parents(dirname.c_str(), 0744);
913 DEBUG_TRACE(DEBUG::LV2, string_compose("new file path %1 => %2\n",
916 return g_strndup(abs_path.c_str(), abs_path.length());
920 LV2Plugin::add_state(XMLNode* root) const
922 assert(_insert_id != PBD::ID("0"));
926 LocaleGuard lg(X_("POSIX"));
928 for (uint32_t i = 0; i < parameter_count(); ++i) {
929 if (parameter_is_input(i) && parameter_is_control(i)) {
930 child = new XMLNode("Port");
931 child->add_property("symbol", port_symbol(i));
932 snprintf(buf, sizeof(buf), "%+f", _shadow_data[i]);
933 child->add_property("value", string(buf));
934 root->add_child_nocopy(*child);
938 if (_has_state_interface) {
939 // Provisionally increment state version and create directory
940 const std::string new_dir = state_dir(++_state_version);
941 g_mkdir_with_parents(new_dir.c_str(), 0744);
943 LilvState* state = lilv_state_new_from_instance(
947 scratch_dir().c_str(),
949 _session.externals_dir().c_str(),
952 const_cast<LV2Plugin*>(this),
956 if (!_impl->state || !lilv_state_equals(state, _impl->state)) {
957 lilv_state_save(_world.world,
959 _uri_map.urid_unmap(),
965 lilv_state_free(_impl->state);
966 _impl->state = state;
968 // State is identical, decrement version and nuke directory
969 lilv_state_free(state);
970 PBD::remove_directory(new_dir);
974 root->add_property("state-dir", string_compose("state%1", _state_version));
978 static inline const LilvNode*
979 get_value(LilvWorld* world, const LilvNode* subject, const LilvNode* predicate)
981 LilvNodes* vs = lilv_world_find_nodes(world, subject, predicate, NULL);
982 return vs ? lilv_nodes_get_first(vs) : NULL;
986 LV2Plugin::find_presets()
988 LilvNode* lv2_appliesTo = lilv_new_uri(_world.world, LV2_CORE__appliesTo);
989 LilvNode* pset_Preset = lilv_new_uri(_world.world, LV2_PRESETS__Preset);
990 LilvNode* rdfs_label = lilv_new_uri(_world.world, LILV_NS_RDFS "label");
992 LilvNodes* presets = lilv_plugin_get_related(_impl->plugin, pset_Preset);
993 LILV_FOREACH(nodes, i, presets) {
994 const LilvNode* preset = lilv_nodes_get(presets, i);
995 lilv_world_load_resource(_world.world, preset);
996 const LilvNode* name = get_value(_world.world, preset, rdfs_label);
998 _presets.insert(std::make_pair(lilv_node_as_string(preset),
999 Plugin::PresetRecord(
1000 lilv_node_as_string(preset),
1001 lilv_node_as_string(name))));
1003 warning << string_compose(
1004 _("Plugin \"%1\" preset \"%2\" is missing a label\n"),
1005 lilv_node_as_string(lilv_plugin_get_uri(_impl->plugin)),
1006 lilv_node_as_string(preset)) << endmsg;
1009 lilv_nodes_free(presets);
1011 lilv_node_free(rdfs_label);
1012 lilv_node_free(pset_Preset);
1013 lilv_node_free(lv2_appliesTo);
1017 set_port_value(const char* port_symbol,
1023 LV2Plugin* self = (LV2Plugin*)user_data;
1024 if (type != 0 && type != self->_uri_map.uri_to_id(LV2_ATOM__Float)) {
1025 return; // TODO: Support non-float ports
1028 const uint32_t port_index = self->port_index(port_symbol);
1029 if (port_index != (uint32_t)-1) {
1030 self->set_parameter(port_index, *(const float*)value);
1035 LV2Plugin::load_preset(PresetRecord r)
1037 LilvWorld* world = _world.world;
1038 LilvNode* pset = lilv_new_uri(world, r.uri.c_str());
1039 LilvState* state = lilv_state_new_from_world(world, _uri_map.urid_map(), pset);
1042 lilv_state_restore(state, _impl->instance, set_port_value, this, 0, NULL);
1043 lilv_state_free(state);
1044 Plugin::load_preset(r);
1047 lilv_node_free(pset);
1052 ARDOUR::lv2plugin_get_port_value(const char* port_symbol,
1057 LV2Plugin *plugin = (LV2Plugin *) user_data;
1059 uint32_t index = plugin->port_index(port_symbol);
1060 if (index != (uint32_t) -1) {
1061 if (plugin->parameter_is_input(index) && plugin->parameter_is_control(index)) {
1063 *size = sizeof(float);
1064 *type = plugin->_uri_map.uri_to_id(LV2_ATOM__Float);
1065 value = &plugin->_shadow_data[index];
1077 LV2Plugin::do_save_preset(string name)
1079 const string base_name = legalize_for_uri(name);
1080 const string file_name = base_name + ".ttl";
1081 const string bundle = Glib::build_filename(
1082 Glib::get_home_dir(),
1083 Glib::build_filename(".lv2", base_name + ".lv2"));
1085 LilvState* state = lilv_state_new_from_instance(
1088 _uri_map.urid_map(),
1089 scratch_dir().c_str(), // file_dir
1090 bundle.c_str(), // copy_dir
1091 bundle.c_str(), // link_dir
1092 bundle.c_str(), // save_dir
1093 lv2plugin_get_port_value, // get_value
1094 (void*)this, // user_data
1095 LV2_STATE_IS_POD|LV2_STATE_IS_PORTABLE, // flags
1096 _features // features
1099 lilv_state_set_label(state, name.c_str());
1101 _world.world, // world
1102 _uri_map.urid_map(), // map
1103 _uri_map.urid_unmap(), // unmap
1105 NULL, // uri (NULL = use file URI)
1106 bundle.c_str(), // dir
1107 file_name.c_str() // filename
1110 lilv_state_free(state);
1112 std::string uri = Glib::filename_to_uri(Glib::build_filename(bundle, file_name));
1113 LilvNode *node_bundle = lilv_new_uri(_world.world, Glib::filename_to_uri(Glib::build_filename(bundle, "/")).c_str());
1114 LilvNode *node_preset = lilv_new_uri(_world.world, uri.c_str());
1115 #ifdef HAVE_LILV_0_19_2
1116 lilv_world_unload_resource(_world.world, node_preset);
1117 lilv_world_unload_bundle(_world.world, node_bundle);
1119 lilv_world_load_bundle(_world.world, node_bundle);
1120 lilv_world_load_resource(_world.world, node_preset);
1121 lilv_node_free(node_bundle);
1122 lilv_node_free(node_preset);
1127 LV2Plugin::do_remove_preset(string name)
1129 string preset_file = Glib::build_filename(
1130 Glib::get_home_dir(),
1131 Glib::build_filename(
1132 Glib::build_filename(".lv2", "presets"),
1136 ::g_unlink(preset_file.c_str());
1140 LV2Plugin::has_editor() const
1142 return _impl->ui != NULL;
1146 LV2Plugin::has_message_output() const
1148 for (uint32_t i = 0; i < num_ports(); ++i) {
1149 if ((_port_flags[i] & PORT_SEQUENCE) &&
1150 (_port_flags[i] & PORT_OUTPUT)) {
1158 LV2Plugin::write_to(RingBuffer<uint8_t>* dest,
1162 const uint8_t* body)
1164 const uint32_t buf_size = sizeof(UIMessage) + size;
1165 vector<uint8_t> buf(buf_size);
1167 UIMessage* msg = (UIMessage*)&buf[0];
1169 msg->protocol = protocol;
1171 memcpy(msg + 1, body, size);
1173 return (dest->write(&buf[0], buf_size) == buf_size);
1177 LV2Plugin::write_from_ui(uint32_t index,
1180 const uint8_t* body)
1183 size_t rbs = _session.engine().raw_buffer_size(DataType::MIDI) * NBUFS;
1184 /* buffer data communication from plugin UI to plugin instance.
1185 * this buffer needs to potentially hold
1186 * (port's minimumSize) * (audio-periods) / (UI-periods)
1189 * e.g 48kSPS / 128fpp -> audio-periods = 375 Hz
1190 * ui-periods = 25 Hz (SuperRapidScreenUpdate)
1191 * default minimumSize = 32K (see LV2Plugin::allocate_atom_event_buffers()
1193 * it is NOT safe to overflow (msg.size will be misinterpreted)
1195 uint32_t bufsiz = 32768;
1196 if (_atom_ev_buffers && _atom_ev_buffers[0]) {
1197 bufsiz = lv2_evbuf_get_capacity(_atom_ev_buffers[0]);
1199 rbs = max((size_t) bufsiz * 8, rbs);
1200 _from_ui = new RingBuffer<uint8_t>(rbs);
1203 if (!write_to(_from_ui, index, protocol, size, body)) {
1204 error << "Error writing from UI to plugin" << endmsg;
1211 LV2Plugin::write_to_ui(uint32_t index,
1214 const uint8_t* body)
1216 if (!write_to(_to_ui, index, protocol, size, body)) {
1217 error << "Error writing from plugin to UI" << endmsg;
1224 forge_variant(LV2_Atom_Forge* forge, const Variant& value)
1226 switch (value.type()) {
1230 lv2_atom_forge_bool(forge, value.get_bool());
1232 case Variant::DOUBLE:
1233 lv2_atom_forge_double(forge, value.get_double());
1235 case Variant::FLOAT:
1236 lv2_atom_forge_float(forge, value.get_float());
1239 lv2_atom_forge_int(forge, value.get_int());
1242 lv2_atom_forge_long(forge, value.get_long());
1245 lv2_atom_forge_path(
1246 forge, value.get_path().c_str(), value.get_path().size());
1248 case Variant::STRING:
1249 lv2_atom_forge_string(
1250 forge, value.get_string().c_str(), value.get_string().size());
1254 forge, value.get_uri().c_str(), value.get_uri().size());
1259 /** Get a variant type from a URI, return false iff no match found. */
1261 uri_to_variant_type(const std::string& uri, Variant::Type& type)
1263 if (uri == LV2_ATOM__Bool) {
1264 type = Variant::BOOL;
1265 } else if (uri == LV2_ATOM__Double) {
1266 type = Variant::DOUBLE;
1267 } else if (uri == LV2_ATOM__Float) {
1268 type = Variant::FLOAT;
1269 } else if (uri == LV2_ATOM__Int) {
1270 type = Variant::INT;
1271 } else if (uri == LV2_ATOM__Long) {
1272 type = Variant::LONG;
1273 } else if (uri == LV2_ATOM__Path) {
1274 type = Variant::PATH;
1275 } else if (uri == LV2_ATOM__String) {
1276 type = Variant::STRING;
1277 } else if (uri == LV2_ATOM__URI) {
1278 type = Variant::URI;
1286 LV2Plugin::set_property(uint32_t key, const Variant& value)
1288 if (_patch_port_in_index == (uint32_t)-1) {
1289 error << "LV2: set_property called with unset patch_port_in_index" << endmsg;
1291 } else if (value.type() == Variant::VOID) {
1292 error << "LV2: set_property called with void value" << endmsg;
1296 // Set up forge to write to temporary buffer on the stack
1297 LV2_Atom_Forge* forge = &_impl->ui_forge;
1298 LV2_Atom_Forge_Frame frame;
1299 uint8_t buf[PATH_MAX]; // Ought to be enough for anyone...
1301 lv2_atom_forge_set_buffer(forge, buf, sizeof(buf));
1303 // Serialize patch:Set message to set property
1304 #ifdef HAVE_LV2_1_10_0
1305 lv2_atom_forge_object(forge, &frame, 1, LV2Plugin::urids.patch_Set);
1306 lv2_atom_forge_key(forge, LV2Plugin::urids.patch_property);
1307 lv2_atom_forge_urid(forge, key);
1308 lv2_atom_forge_key(forge, LV2Plugin::urids.patch_value);
1310 lv2_atom_forge_blank(forge, &frame, 1, LV2Plugin::urids.patch_Set);
1311 lv2_atom_forge_property_head(forge, LV2Plugin::urids.patch_property, 0);
1312 lv2_atom_forge_urid(forge, key);
1313 lv2_atom_forge_property_head(forge, LV2Plugin::urids.patch_value, 0);
1316 forge_variant(forge, value);
1318 // Write message to UI=>Plugin ring
1319 const LV2_Atom* const atom = (const LV2_Atom*)buf;
1320 write_from_ui(_patch_port_in_index,
1321 LV2Plugin::urids.atom_eventTransfer,
1322 lv2_atom_total_size(atom),
1323 (const uint8_t*)atom);
1327 LV2Plugin::get_supported_properties(std::vector<ParameterDescriptor>& descs)
1329 LilvWorld* lworld = _world.world;
1330 const LilvNode* subject = lilv_plugin_get_uri(_impl->plugin);
1331 LilvNodes* properties = lilv_world_find_nodes(
1332 lworld, subject, _world.patch_writable, NULL);
1333 LILV_FOREACH(nodes, p, properties) {
1334 // Get label and range
1335 const LilvNode* prop = lilv_nodes_get(properties, p);
1336 LilvNode* label = lilv_world_get(lworld, prop, _world.rdfs_label, NULL);
1337 LilvNode* range = lilv_world_get(lworld, prop, _world.rdfs_range, NULL);
1339 // Convert range to variant type (TODO: support for multiple range types)
1340 Variant::Type datatype;
1341 if (!uri_to_variant_type(lilv_node_as_uri(range), datatype)) {
1342 error << string_compose(_("LV2: unknown variant datatype \"%1\""),
1343 lilv_node_as_uri(range));
1347 // Add description to result
1348 ParameterDescriptor desc;
1349 desc.key = _uri_map.uri_to_id(lilv_node_as_uri(prop));
1350 desc.label = lilv_node_as_string(label);
1351 desc.datatype = datatype;
1352 desc.toggled = datatype == Variant::BOOL;
1353 desc.integer_step = datatype == Variant::INT || datatype == Variant::LONG;
1354 descs.push_back(desc);
1356 lilv_node_free(label);
1357 lilv_node_free(range);
1359 lilv_nodes_free(properties);
1363 LV2Plugin::announce_property_values()
1365 if (_patch_port_in_index == (uint32_t)-1) {
1369 // Set up forge to write to temporary buffer on the stack
1370 LV2_Atom_Forge* forge = &_impl->ui_forge;
1371 LV2_Atom_Forge_Frame frame;
1372 uint8_t buf[PATH_MAX]; // Ought to be enough for anyone...
1374 lv2_atom_forge_set_buffer(forge, buf, sizeof(buf));
1376 // Serialize patch:Get message with no subject (implicitly plugin instance)
1377 #ifdef HAVE_LV2_1_10_0
1378 lv2_atom_forge_object(forge, &frame, 1, LV2Plugin::urids.patch_Get);
1380 lv2_atom_forge_blank(forge, &frame, 1, LV2Plugin::urids.patch_Get);
1383 // Write message to UI=>Plugin ring
1384 const LV2_Atom* const atom = (const LV2_Atom*)buf;
1385 write_from_ui(_patch_port_in_index,
1386 LV2Plugin::urids.atom_eventTransfer,
1387 lv2_atom_total_size(atom),
1388 (const uint8_t*)atom);
1392 LV2Plugin::enable_ui_emission()
1395 /* see note in LV2Plugin::write_from_ui() */
1396 uint32_t bufsiz = 32768;
1397 if (_atom_ev_buffers && _atom_ev_buffers[0]) {
1398 bufsiz = lv2_evbuf_get_capacity(_atom_ev_buffers[0]);
1400 size_t rbs = _session.engine().raw_buffer_size(DataType::MIDI) * NBUFS;
1401 rbs = max((size_t) bufsiz * 8, rbs);
1402 _to_ui = new RingBuffer<uint8_t>(rbs);
1407 LV2Plugin::emit_to_ui(void* controller, UIMessageSink sink)
1413 uint32_t read_space = _to_ui->read_space();
1414 while (read_space > sizeof(UIMessage)) {
1416 if (_to_ui->read((uint8_t*)&msg, sizeof(msg)) != sizeof(msg)) {
1417 error << "Error reading from Plugin=>UI RingBuffer" << endmsg;
1420 vector<uint8_t> body(msg.size);
1421 if (_to_ui->read(&body[0], msg.size) != msg.size) {
1422 error << "Error reading from Plugin=>UI RingBuffer" << endmsg;
1426 sink(controller, msg.index, msg.size, msg.protocol, &body[0]);
1428 read_space -= sizeof(msg) + msg.size;
1433 LV2Plugin::work(uint32_t size, const void* data)
1435 return _impl->work_iface->work(
1436 _impl->instance->lv2_handle, work_respond, this, size, data);
1440 LV2Plugin::work_response(uint32_t size, const void* data)
1442 return _impl->work_iface->work_response(
1443 _impl->instance->lv2_handle, size, data);
1447 LV2Plugin::set_insert_info(const PluginInsert* insert)
1449 _insert_id = insert->id();
1453 LV2Plugin::set_state(const XMLNode& node, int version)
1456 const XMLProperty* prop;
1457 XMLNodeConstIterator iter;
1462 LocaleGuard lg(X_("POSIX"));
1464 if (node.name() != state_node_name()) {
1465 error << _("Bad node sent to LV2Plugin::set_state") << endmsg;
1469 #ifndef NO_PLUGIN_STATE
1471 if (version < 3000) {
1472 nodes = node.children("port");
1474 nodes = node.children("Port");
1477 for (iter = nodes.begin(); iter != nodes.end(); ++iter) {
1481 if ((prop = child->property("symbol")) != 0) {
1482 sym = prop->value().c_str();
1484 warning << _("LV2: port has no symbol, ignored") << endmsg;
1488 map<string, uint32_t>::iterator i = _port_indices.find(sym);
1490 if (i != _port_indices.end()) {
1491 port_id = i->second;
1493 warning << _("LV2: port has unknown index, ignored") << endmsg;
1497 if ((prop = child->property("value")) != 0) {
1498 value = prop->value().c_str();
1500 warning << _("LV2: port has no value, ignored") << endmsg;
1504 set_parameter(port_id, atof(value));
1508 if ((prop = node.property("state-dir")) != 0) {
1509 if (sscanf(prop->value().c_str(), "state%u", &_state_version) != 1) {
1510 error << string_compose(
1511 "LV2: failed to parse state version from \"%1\"",
1512 prop->value()) << endmsg;
1515 std::string state_file = Glib::build_filename(
1517 Glib::build_filename(prop->value(), "state.ttl"));
1519 LilvState* state = lilv_state_new_from_file(
1520 _world.world, _uri_map.urid_map(), NULL, state_file.c_str());
1522 lilv_state_restore(state, _impl->instance, NULL, NULL, 0, NULL);
1525 latency_compute_run();
1528 return Plugin::set_state(node, version);
1532 LV2Plugin::get_parameter_descriptor(uint32_t which, ParameterDescriptor& desc) const
1534 const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, which);
1536 LilvNodes* portunits;
1537 LilvNode *def, *min, *max;
1538 lilv_port_get_range(_impl->plugin, port, &def, &min, &max);
1539 portunits = lilv_port_get_value(_impl->plugin, port, _world.units_unit);
1541 desc.integer_step = lilv_port_has_property(_impl->plugin, port, _world.lv2_integer);
1542 desc.toggled = lilv_port_has_property(_impl->plugin, port, _world.lv2_toggled);
1543 desc.logarithmic = lilv_port_has_property(_impl->plugin, port, _world.ext_logarithmic);
1544 desc.sr_dependent = lilv_port_has_property(_impl->plugin, port, _world.lv2_sampleRate);
1545 desc.label = lilv_node_as_string(lilv_port_get_name(_impl->plugin, port));
1546 desc.lower = min ? lilv_node_as_float(min) : 0.0f;
1547 desc.upper = max ? lilv_node_as_float(max) : 1.0f;
1548 desc.midinote = lilv_nodes_contains(portunits, _world.units_midiNote);
1550 if (desc.sr_dependent) {
1551 desc.lower *= _session.frame_rate ();
1552 desc.upper *= _session.frame_rate ();
1555 desc.min_unbound = false; // TODO: LV2 extension required
1556 desc.max_unbound = false; // TODO: LV2 extension required
1558 if (desc.integer_step) {
1560 desc.smallstep = 0.1;
1561 desc.largestep = 10.0;
1563 const float delta = desc.upper - desc.lower;
1564 desc.step = delta / 1000.0f;
1565 desc.smallstep = delta / 10000.0f;
1566 desc.largestep = delta / 10.0f;
1569 desc.enumeration = lilv_port_has_property(_impl->plugin, port, _world.lv2_enumeration);
1570 desc.scale_points = get_scale_points(which);
1572 lilv_node_free(def);
1573 lilv_node_free(min);
1574 lilv_node_free(max);
1575 lilv_nodes_free(portunits);
1581 LV2Plugin::describe_parameter(Evoral::Parameter which)
1583 if (( which.type() == PluginAutomation) && ( which.id() < parameter_count()) ) {
1585 if (lilv_port_has_property(_impl->plugin,
1586 lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.ext_notOnGUI)) {
1587 return X_("hidden");
1590 if (lilv_port_has_property(_impl->plugin,
1591 lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.lv2_freewheeling)) {
1592 return X_("hidden");
1595 if (lilv_port_has_property(_impl->plugin,
1596 lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.lv2_reportsLatency)) {
1597 return X_("latency");
1600 LilvNode* name = lilv_port_get_name(_impl->plugin,
1601 lilv_plugin_get_port_by_index(_impl->plugin, which.id()));
1602 string ret(lilv_node_as_string(name));
1603 lilv_node_free(name);
1611 LV2Plugin::signal_latency() const
1613 if (_latency_control_port) {
1614 return (framecnt_t)floor(*_latency_control_port);
1620 set<Evoral::Parameter>
1621 LV2Plugin::automatable() const
1623 set<Evoral::Parameter> ret;
1625 for (uint32_t i = 0; i < parameter_count(); ++i) {
1626 if (parameter_is_input(i) && parameter_is_control(i)) {
1627 ret.insert(ret.end(), Evoral::Parameter(PluginAutomation, 0, i));
1635 LV2Plugin::activate()
1637 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 activate\n", name()));
1639 if (!_was_activated) {
1640 lilv_instance_activate(_impl->instance);
1641 _was_activated = true;
1646 LV2Plugin::deactivate()
1648 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 deactivate\n", name()));
1650 if (_was_activated) {
1651 lilv_instance_deactivate(_impl->instance);
1652 _was_activated = false;
1657 LV2Plugin::cleanup()
1659 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 cleanup\n", name()));
1663 lilv_instance_free(_impl->instance);
1664 _impl->instance = NULL;
1668 LV2Plugin::allocate_atom_event_buffers()
1670 /* reserve local scratch buffers for ATOM event-queues */
1671 const LilvPlugin* p = _impl->plugin;
1673 /* count non-MIDI atom event-ports
1674 * TODO: nicely ask drobilla to make a lilv_ call for that
1676 int count_atom_out = 0;
1677 int count_atom_in = 0;
1678 int minimumSize = 32768; // TODO use a per-port minimum-size
1679 for (uint32_t i = 0; i < lilv_plugin_get_num_ports(p); ++i) {
1680 const LilvPort* port = lilv_plugin_get_port_by_index(p, i);
1681 if (lilv_port_is_a(p, port, _world.atom_AtomPort)) {
1682 LilvNodes* buffer_types = lilv_port_get_value(
1683 p, port, _world.atom_bufferType);
1684 LilvNodes* atom_supports = lilv_port_get_value(
1685 p, port, _world.atom_supports);
1687 if (!lilv_nodes_contains(buffer_types, _world.atom_Sequence)
1688 || !lilv_nodes_contains(atom_supports, _world.midi_MidiEvent)) {
1689 if (lilv_port_is_a(p, port, _world.lv2_InputPort)) {
1692 if (lilv_port_is_a(p, port, _world.lv2_OutputPort)) {
1695 LilvNodes* min_size_v = lilv_port_get_value(_impl->plugin, port, _world.rsz_minimumSize);
1696 LilvNode* min_size = min_size_v ? lilv_nodes_get_first(min_size_v) : NULL;
1697 if (min_size && lilv_node_is_int(min_size)) {
1698 minimumSize = std::max(minimumSize, lilv_node_as_int(min_size));
1700 lilv_nodes_free(min_size_v);
1702 lilv_nodes_free(buffer_types);
1703 lilv_nodes_free(atom_supports);
1707 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 need buffers for %2 atom-in and %3 atom-out event-ports\n",
1708 name(), count_atom_in, count_atom_out));
1710 const int total_atom_buffers = (count_atom_in + count_atom_out);
1711 if (_atom_ev_buffers || total_atom_buffers == 0) {
1715 DEBUG_TRACE(DEBUG::LV2, string_compose("allocate %1 atom_ev_buffers of %d bytes\n", total_atom_buffers, minimumSize));
1716 _atom_ev_buffers = (LV2_Evbuf**) malloc((total_atom_buffers + 1) * sizeof(LV2_Evbuf*));
1717 for (int i = 0; i < total_atom_buffers; ++i ) {
1718 _atom_ev_buffers[i] = lv2_evbuf_new(minimumSize, LV2_EVBUF_ATOM,
1719 LV2Plugin::urids.atom_Chunk, LV2Plugin::urids.atom_Sequence);
1721 _atom_ev_buffers[total_atom_buffers] = 0;
1725 /** Write an ardour position/time/tempo/meter as an LV2 event.
1726 * @return true on success.
1729 write_position(LV2_Atom_Forge* forge,
1731 const TempoMetric& t,
1732 Timecode::BBT_Time& bbt,
1734 framepos_t position,
1737 uint8_t pos_buf[256];
1738 lv2_atom_forge_set_buffer(forge, pos_buf, sizeof(pos_buf));
1739 LV2_Atom_Forge_Frame frame;
1740 #ifdef HAVE_LV2_1_10_0
1741 lv2_atom_forge_object(forge, &frame, 1, LV2Plugin::urids.time_Position);
1742 lv2_atom_forge_key(forge, LV2Plugin::urids.time_frame);
1743 lv2_atom_forge_long(forge, position);
1744 lv2_atom_forge_key(forge, LV2Plugin::urids.time_speed);
1745 lv2_atom_forge_float(forge, speed);
1746 lv2_atom_forge_key(forge, LV2Plugin::urids.time_barBeat);
1747 lv2_atom_forge_float(forge, bbt.beats - 1 +
1748 (bbt.ticks / Timecode::BBT_Time::ticks_per_beat));
1749 lv2_atom_forge_key(forge, LV2Plugin::urids.time_bar);
1750 lv2_atom_forge_long(forge, bbt.bars - 1);
1751 lv2_atom_forge_key(forge, LV2Plugin::urids.time_beatUnit);
1752 lv2_atom_forge_int(forge, t.meter().note_divisor());
1753 lv2_atom_forge_key(forge, LV2Plugin::urids.time_beatsPerBar);
1754 lv2_atom_forge_float(forge, t.meter().divisions_per_bar());
1755 lv2_atom_forge_key(forge, LV2Plugin::urids.time_beatsPerMinute);
1756 lv2_atom_forge_float(forge, t.tempo().beats_per_minute());
1758 lv2_atom_forge_blank(forge, &frame, 1, LV2Plugin::urids.time_Position);
1759 lv2_atom_forge_property_head(forge, LV2Plugin::urids.time_frame, 0);
1760 lv2_atom_forge_long(forge, position);
1761 lv2_atom_forge_property_head(forge, LV2Plugin::urids.time_speed, 0);
1762 lv2_atom_forge_float(forge, speed);
1763 lv2_atom_forge_property_head(forge, LV2Plugin::urids.time_barBeat, 0);
1764 lv2_atom_forge_float(forge, bbt.beats - 1 +
1765 (bbt.ticks / Timecode::BBT_Time::ticks_per_beat));
1766 lv2_atom_forge_property_head(forge, LV2Plugin::urids.time_bar, 0);
1767 lv2_atom_forge_long(forge, bbt.bars - 1);
1768 lv2_atom_forge_property_head(forge, LV2Plugin::urids.time_beatUnit, 0);
1769 lv2_atom_forge_int(forge, t.meter().note_divisor());
1770 lv2_atom_forge_property_head(forge, LV2Plugin::urids.time_beatsPerBar, 0);
1771 lv2_atom_forge_float(forge, t.meter().divisions_per_bar());
1772 lv2_atom_forge_property_head(forge, LV2Plugin::urids.time_beatsPerMinute, 0);
1773 lv2_atom_forge_float(forge, t.tempo().beats_per_minute());
1776 LV2_Evbuf_Iterator end = lv2_evbuf_end(buf);
1777 const LV2_Atom* const atom = (const LV2_Atom*)pos_buf;
1778 return lv2_evbuf_write(&end, offset, 0, atom->type, atom->size,
1779 (const uint8_t*)(atom + 1));
1783 LV2Plugin::connect_and_run(BufferSet& bufs,
1784 ChanMapping in_map, ChanMapping out_map,
1785 pframes_t nframes, framecnt_t offset)
1787 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 run %2 offset %3\n", name(), nframes, offset));
1788 Plugin::connect_and_run(bufs, in_map, out_map, nframes, offset);
1790 cycles_t then = get_cycles();
1792 TempoMap& tmap = _session.tempo_map();
1793 Metrics::const_iterator metric_i = tmap.metrics_end();
1794 TempoMetric tmetric = tmap.metric_at(_session.transport_frame(), &metric_i);
1796 if (_freewheel_control_port) {
1797 *_freewheel_control_port = _session.engine().freewheeling();
1800 if (_bpm_control_port) {
1801 *_bpm_control_port = tmetric.tempo().beats_per_minute();
1804 ChanCount bufs_count;
1805 bufs_count.set(DataType::AUDIO, 1);
1806 bufs_count.set(DataType::MIDI, 1);
1807 BufferSet& silent_bufs = _session.get_silent_buffers(bufs_count);
1808 BufferSet& scratch_bufs = _session.get_scratch_buffers(bufs_count);
1809 uint32_t const num_ports = parameter_count();
1810 uint32_t const nil_index = std::numeric_limits<uint32_t>::max();
1812 uint32_t audio_in_index = 0;
1813 uint32_t audio_out_index = 0;
1814 uint32_t midi_in_index = 0;
1815 uint32_t midi_out_index = 0;
1816 uint32_t atom_port_index = 0;
1817 for (uint32_t port_index = 0; port_index < num_ports; ++port_index) {
1819 uint32_t index = nil_index;
1820 PortFlags flags = _port_flags[port_index];
1822 if (flags & PORT_AUDIO) {
1823 if (flags & PORT_INPUT) {
1824 index = in_map.get(DataType::AUDIO, audio_in_index++, &valid);
1826 ? bufs.get_audio(index).data(offset)
1827 : silent_bufs.get_audio(0).data(offset);
1829 index = out_map.get(DataType::AUDIO, audio_out_index++, &valid);
1831 ? bufs.get_audio(index).data(offset)
1832 : scratch_bufs.get_audio(0).data(offset);
1834 } else if (flags & (PORT_EVENT|PORT_SEQUENCE)) {
1835 /* FIXME: The checks here for bufs.count().n_midi() > index shouldn't
1836 be necessary, but the mapping is illegal in some cases. Ideally
1837 that should be fixed, but this is easier...
1839 if (flags & PORT_MIDI) {
1840 if (flags & PORT_INPUT) {
1841 index = in_map.get(DataType::MIDI, midi_in_index++, &valid);
1843 index = out_map.get(DataType::MIDI, midi_out_index++, &valid);
1845 if (valid && bufs.count().n_midi() > index) {
1846 /* Note, ensure_lv2_bufsize() is not RT safe!
1847 * However free()/alloc() is only called if a
1848 * plugin requires a rsz:minimumSize buffersize
1849 * and the existing buffer if smaller.
1851 bufs.ensure_lv2_bufsize((flags & PORT_INPUT), index, _port_minimumSize[port_index]);
1852 _ev_buffers[port_index] = bufs.get_lv2_midi(
1853 (flags & PORT_INPUT), index, (flags & PORT_EVENT));
1855 } else if ((flags & PORT_POSITION) && (flags & PORT_INPUT)) {
1856 lv2_evbuf_reset(_atom_ev_buffers[atom_port_index], true);
1857 _ev_buffers[port_index] = _atom_ev_buffers[atom_port_index++];
1861 if (valid && (flags & PORT_INPUT)) {
1862 Timecode::BBT_Time bbt;
1863 if ((flags & PORT_POSITION)) {
1864 if (_session.transport_frame() != _next_cycle_start ||
1865 _session.transport_speed() != _next_cycle_speed) {
1866 // Transport has changed, write position at cycle start
1867 tmap.bbt_time(_session.transport_frame(), bbt);
1868 write_position(&_impl->forge, _ev_buffers[port_index],
1869 tmetric, bbt, _session.transport_speed(),
1870 _session.transport_frame(), 0);
1874 // Get MIDI iterator range (empty range if no MIDI)
1875 MidiBuffer::iterator m = (index != nil_index)
1876 ? bufs.get_midi(index).begin()
1877 : silent_bufs.get_midi(0).end();
1878 MidiBuffer::iterator m_end = (index != nil_index)
1879 ? bufs.get_midi(index).end()
1882 // Now merge MIDI and any transport events into the buffer
1883 const uint32_t type = LV2Plugin::urids.midi_MidiEvent;
1884 const framepos_t tend = _session.transport_frame() + nframes;
1886 while (m != m_end || (metric_i != tmap.metrics_end() &&
1887 (*metric_i)->frame() < tend)) {
1888 MetricSection* metric = (metric_i != tmap.metrics_end())
1890 if (m != m_end && (!metric || metric->frame() > (*m).time())) {
1891 const Evoral::MIDIEvent<framepos_t> ev(*m, false);
1892 LV2_Evbuf_Iterator eend = lv2_evbuf_end(_ev_buffers[port_index]);
1893 lv2_evbuf_write(&eend, ev.time(), 0, type, ev.size(), ev.buffer());
1896 tmetric.set_metric(metric);
1897 bbt = metric->start();
1898 write_position(&_impl->forge, _ev_buffers[port_index],
1899 tmetric, bbt, _session.transport_speed(),
1901 metric->frame() - _session.transport_frame());
1905 } else if (!valid) {
1906 // Nothing we understand or care about, connect to scratch
1907 // see note for midi-buffer size above
1908 scratch_bufs.ensure_lv2_bufsize((flags & PORT_INPUT),
1909 0, _port_minimumSize[port_index]);
1910 _ev_buffers[port_index] = scratch_bufs.get_lv2_midi(
1911 (flags & PORT_INPUT), 0, (flags & PORT_EVENT));
1914 buf = lv2_evbuf_get_buffer(_ev_buffers[port_index]);
1916 continue; // Control port, leave buffer alone
1918 lilv_instance_connect_port(_impl->instance, port_index, buf);
1921 // Read messages from UI and push into appropriate buffers
1923 uint32_t read_space = _from_ui->read_space();
1924 while (read_space > sizeof(UIMessage)) {
1926 if (_from_ui->read((uint8_t*)&msg, sizeof(msg)) != sizeof(msg)) {
1927 error << "Error reading from UI=>Plugin RingBuffer" << endmsg;
1930 vector<uint8_t> body(msg.size);
1931 if (_from_ui->read(&body[0], msg.size) != msg.size) {
1932 error << "Error reading from UI=>Plugin RingBuffer" << endmsg;
1935 if (msg.protocol == urids.atom_eventTransfer) {
1936 LV2_Evbuf* buf = _ev_buffers[msg.index];
1937 LV2_Evbuf_Iterator i = lv2_evbuf_end(buf);
1938 const LV2_Atom* const atom = (const LV2_Atom*)&body[0];
1939 if (!lv2_evbuf_write(&i, nframes, 0, atom->type, atom->size,
1940 (const uint8_t*)(atom + 1))) {
1941 error << "Failed to write data to LV2 event buffer\n";
1944 error << "Received unknown message type from UI" << endmsg;
1946 read_space -= sizeof(UIMessage) + msg.size;
1953 for (uint32_t port_index = 0; port_index < num_ports; ++port_index) {
1954 PortFlags flags = _port_flags[port_index];
1957 /* TODO ask drobilla about comment
1958 * "Make Ardour event buffers generic so plugins can communicate"
1959 * in libs/ardour/buffer_set.cc:310
1961 * ideally the user could choose which of the following two modes
1962 * to use (e.g. instrument/effect chains MIDI OUT vs MIDI TRHU).
1964 * This implementation follows the discussion on IRC Mar 16 2013 16:47 UTC
1965 * 16:51 < drobilla> rgareus: [..] i.e always replace with MIDI output [of LV2 plugin] if it's there
1966 * 16:52 < drobilla> rgareus: That would probably be good enough [..] to make users not complain
1967 * for quite a while at least ;)
1969 // copy output of LV2 plugin's MIDI port to Ardour MIDI buffers -- MIDI OUT
1970 if ((flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE|PORT_MIDI))) {
1971 const uint32_t buf_index = out_map.get(
1972 DataType::MIDI, midi_out_index++, &valid);
1974 bufs.forward_lv2_midi(_ev_buffers[port_index], buf_index);
1977 // Flush MIDI (write back to Ardour MIDI buffers) -- MIDI THRU
1978 else if ((flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE))) {
1979 const uint32_t buf_index = out_map.get(
1980 DataType::MIDI, midi_out_index++, &valid);
1982 bufs.flush_lv2_midi(true, buf_index);
1987 // Write messages to UI
1988 if ((_to_ui || _patch_port_out_index != (uint32_t)-1) &&
1989 (flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE))) {
1990 LV2_Evbuf* buf = _ev_buffers[port_index];
1991 for (LV2_Evbuf_Iterator i = lv2_evbuf_begin(buf);
1992 lv2_evbuf_is_valid(i);
1993 i = lv2_evbuf_next(i)) {
1994 uint32_t frames, subframes, type, size;
1996 lv2_evbuf_get(i, &frames, &subframes, &type, &size, &data);
1998 // Intercept patch change messages to emit PropertyChanged signal
1999 if ((flags & PORT_PATCHMSG)) {
2000 LV2_Atom* atom = (LV2_Atom*)(data - sizeof(LV2_Atom));
2001 if (atom->type == LV2Plugin::urids.atom_Blank ||
2002 atom->type == LV2Plugin::urids.atom_Object) {
2003 LV2_Atom_Object* obj = (LV2_Atom_Object*)atom;
2004 if (obj->body.otype == LV2Plugin::urids.patch_Set) {
2005 const LV2_Atom* property = NULL;
2006 const LV2_Atom* value = NULL;
2007 lv2_atom_object_get(obj,
2008 LV2Plugin::urids.patch_property, &property,
2009 LV2Plugin::urids.patch_value, &value,
2012 if (!property || !value ||
2013 property->type != LV2Plugin::urids.atom_URID ||
2014 value->type != LV2Plugin::urids.atom_Path) {
2015 std::cerr << "warning: patch:Set for unknown property" << std::endl;
2019 const uint32_t prop_id = ((const LV2_Atom_URID*)property)->body;
2020 const char* path = (const char*)LV2_ATOM_BODY_CONST(value);
2022 // Emit PropertyChanged signal for UI
2023 PropertyChanged(prop_id, Variant(Variant::PATH, path));
2028 if (!_to_ui) continue;
2029 write_to_ui(port_index, urids.atom_eventTransfer,
2030 size + sizeof(LV2_Atom),
2031 data - sizeof(LV2_Atom));
2036 cycles_t now = get_cycles();
2037 set_cycles((uint32_t)(now - then));
2039 // Update expected transport information for next cycle so we can detect changes
2040 _next_cycle_speed = _session.transport_speed();
2041 _next_cycle_start = _session.transport_frame() + (nframes * _next_cycle_speed);
2047 LV2Plugin::parameter_is_control(uint32_t param) const
2049 assert(param < _port_flags.size());
2050 return _port_flags[param] & PORT_CONTROL;
2054 LV2Plugin::parameter_is_audio(uint32_t param) const
2056 assert(param < _port_flags.size());
2057 return _port_flags[param] & PORT_AUDIO;
2061 LV2Plugin::parameter_is_event(uint32_t param) const
2063 assert(param < _port_flags.size());
2064 return _port_flags[param] & PORT_EVENT;
2068 LV2Plugin::parameter_is_output(uint32_t param) const
2070 assert(param < _port_flags.size());
2071 return _port_flags[param] & PORT_OUTPUT;
2075 LV2Plugin::parameter_is_input(uint32_t param) const
2077 assert(param < _port_flags.size());
2078 return _port_flags[param] & PORT_INPUT;
2082 LV2Plugin::print_parameter(uint32_t param, char* buf, uint32_t len) const
2085 if (param < parameter_count()) {
2086 snprintf(buf, len, "%.3f", get_parameter(param));
2093 boost::shared_ptr<ScalePoints>
2094 LV2Plugin::get_scale_points(uint32_t port_index) const
2096 const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, port_index);
2097 LilvScalePoints* points = lilv_port_get_scale_points(_impl->plugin, port);
2099 boost::shared_ptr<ScalePoints> ret;
2104 ret = boost::shared_ptr<ScalePoints>(new ScalePoints());
2106 LILV_FOREACH(scale_points, i, points) {
2107 const LilvScalePoint* p = lilv_scale_points_get(points, i);
2108 const LilvNode* label = lilv_scale_point_get_label(p);
2109 const LilvNode* value = lilv_scale_point_get_value(p);
2110 if (label && (lilv_node_is_float(value) || lilv_node_is_int(value))) {
2111 ret->insert(make_pair(lilv_node_as_string(label),
2112 lilv_node_as_float(value)));
2116 lilv_scale_points_free(points);
2121 LV2Plugin::run(pframes_t nframes)
2123 uint32_t const N = parameter_count();
2124 for (uint32_t i = 0; i < N; ++i) {
2125 if (parameter_is_control(i) && parameter_is_input(i)) {
2126 _control_data[i] = _shadow_data[i];
2130 lilv_instance_run(_impl->instance, nframes);
2132 if (_impl->work_iface) {
2133 _worker->emit_responses();
2134 if (_impl->work_iface->end_run) {
2135 _impl->work_iface->end_run(_impl->instance->lv2_handle);
2141 LV2Plugin::latency_compute_run()
2143 if (!_latency_control_port) {
2147 // Run the plugin so that it can set its latency parameter
2149 bool was_activated = _was_activated;
2152 uint32_t port_index = 0;
2153 uint32_t in_index = 0;
2154 uint32_t out_index = 0;
2156 // this is done in the main thread. non realtime.
2157 const framecnt_t bufsize = _engine.samples_per_cycle();
2158 float *buffer = (float*) malloc(_engine.samples_per_cycle() * sizeof(float));
2160 memset(buffer, 0, sizeof(float) * bufsize);
2162 // FIXME: Ensure plugins can handle in-place processing
2166 while (port_index < parameter_count()) {
2167 if (parameter_is_audio(port_index)) {
2168 if (parameter_is_input(port_index)) {
2169 lilv_instance_connect_port(_impl->instance, port_index, buffer);
2171 } else if (parameter_is_output(port_index)) {
2172 lilv_instance_connect_port(_impl->instance, port_index, buffer);
2181 if (was_activated) {
2188 LV2Plugin::Impl::designated_input (const char* uri, void** bufptrs[], void** bufptr)
2190 const LilvPort* port = NULL;
2191 LilvNode* designation = lilv_new_uri(_world.world, uri);
2192 port = lilv_plugin_get_port_by_designation(
2193 plugin, _world.lv2_InputPort, designation);
2194 lilv_node_free(designation);
2196 bufptrs[lilv_port_get_index(plugin, port)] = bufptr;
2201 static bool lv2_filter (const string& str, void* /*arg*/)
2203 /* Not a dotfile, has a prefix before a period, suffix is "lv2" */
2205 return str[0] != '.' && (str.length() > 3 && str.find (".lv2") == (str.length() - 4));
2209 LV2World::LV2World()
2210 : world(lilv_world_new())
2211 , _bundle_checked(false)
2213 lilv_world_load_all(world);
2215 atom_AtomPort = lilv_new_uri(world, LV2_ATOM__AtomPort);
2216 atom_Chunk = lilv_new_uri(world, LV2_ATOM__Chunk);
2217 atom_Sequence = lilv_new_uri(world, LV2_ATOM__Sequence);
2218 atom_bufferType = lilv_new_uri(world, LV2_ATOM__bufferType);
2219 atom_supports = lilv_new_uri(world, LV2_ATOM__supports);
2220 atom_eventTransfer = lilv_new_uri(world, LV2_ATOM__eventTransfer);
2221 ev_EventPort = lilv_new_uri(world, LILV_URI_EVENT_PORT);
2222 ext_logarithmic = lilv_new_uri(world, LV2_PORT_PROPS__logarithmic);
2223 ext_notOnGUI = lilv_new_uri(world, LV2_PORT_PROPS__notOnGUI);
2224 lv2_AudioPort = lilv_new_uri(world, LILV_URI_AUDIO_PORT);
2225 lv2_ControlPort = lilv_new_uri(world, LILV_URI_CONTROL_PORT);
2226 lv2_InputPort = lilv_new_uri(world, LILV_URI_INPUT_PORT);
2227 lv2_OutputPort = lilv_new_uri(world, LILV_URI_OUTPUT_PORT);
2228 lv2_inPlaceBroken = lilv_new_uri(world, LV2_CORE__inPlaceBroken);
2229 lv2_integer = lilv_new_uri(world, LV2_CORE__integer);
2230 lv2_reportsLatency = lilv_new_uri(world, LV2_CORE__reportsLatency);
2231 lv2_sampleRate = lilv_new_uri(world, LV2_CORE__sampleRate);
2232 lv2_toggled = lilv_new_uri(world, LV2_CORE__toggled);
2233 lv2_enumeration = lilv_new_uri(world, LV2_CORE__enumeration);
2234 lv2_freewheeling = lilv_new_uri(world, LV2_CORE__freeWheeling);
2235 midi_MidiEvent = lilv_new_uri(world, LILV_URI_MIDI_EVENT);
2236 rdfs_comment = lilv_new_uri(world, LILV_NS_RDFS "comment");
2237 rdfs_label = lilv_new_uri(world, LILV_NS_RDFS "label");
2238 rdfs_range = lilv_new_uri(world, LILV_NS_RDFS "range");
2239 rsz_minimumSize = lilv_new_uri(world, LV2_RESIZE_PORT__minimumSize);
2240 time_Position = lilv_new_uri(world, LV2_TIME__Position);
2241 ui_GtkUI = lilv_new_uri(world, LV2_UI__GtkUI);
2242 ui_external = lilv_new_uri(world, "http://lv2plug.in/ns/extensions/ui#external");
2243 ui_externalkx = lilv_new_uri(world, "http://kxstudio.sf.net/ns/lv2ext/external-ui#Widget");
2244 units_unit = lilv_new_uri(world, "http://lv2plug.in/ns/extensions/units#unit");
2245 units_midiNote = lilv_new_uri(world, "http://lv2plug.in/ns/extensions/units#midiNote");
2246 patch_writable = lilv_new_uri(world, LV2_PATCH__writable);
2247 patch_Message = lilv_new_uri(world, LV2_PATCH__Message);
2250 LV2World::~LV2World()
2252 lilv_node_free(patch_Message);
2253 lilv_node_free(patch_writable);
2254 lilv_node_free(units_midiNote);
2255 lilv_node_free(units_unit);
2256 lilv_node_free(ui_externalkx);
2257 lilv_node_free(ui_external);
2258 lilv_node_free(ui_GtkUI);
2259 lilv_node_free(time_Position);
2260 lilv_node_free(rsz_minimumSize);
2261 lilv_node_free(rdfs_comment);
2262 lilv_node_free(rdfs_label);
2263 lilv_node_free(rdfs_range);
2264 lilv_node_free(midi_MidiEvent);
2265 lilv_node_free(lv2_enumeration);
2266 lilv_node_free(lv2_freewheeling);
2267 lilv_node_free(lv2_toggled);
2268 lilv_node_free(lv2_sampleRate);
2269 lilv_node_free(lv2_reportsLatency);
2270 lilv_node_free(lv2_integer);
2271 lilv_node_free(lv2_inPlaceBroken);
2272 lilv_node_free(lv2_OutputPort);
2273 lilv_node_free(lv2_InputPort);
2274 lilv_node_free(lv2_ControlPort);
2275 lilv_node_free(lv2_AudioPort);
2276 lilv_node_free(ext_notOnGUI);
2277 lilv_node_free(ext_logarithmic);
2278 lilv_node_free(ev_EventPort);
2279 lilv_node_free(atom_supports);
2280 lilv_node_free(atom_eventTransfer);
2281 lilv_node_free(atom_bufferType);
2282 lilv_node_free(atom_Sequence);
2283 lilv_node_free(atom_Chunk);
2284 lilv_node_free(atom_AtomPort);
2285 lilv_world_free(world);
2289 LV2World::load_bundled_plugins(bool verbose)
2291 if (!_bundle_checked) {
2293 cout << "Scanning folders for bundled LV2s: " << ARDOUR::lv2_bundled_search_path().to_string() << endl;
2296 vector<string> plugin_objects;
2297 find_paths_matching_filter (plugin_objects, ARDOUR::lv2_bundled_search_path(), lv2_filter, 0, true, true, true);
2298 for ( vector<string>::iterator x = plugin_objects.begin(); x != plugin_objects.end (); ++x) {
2299 #ifdef PLATFORM_WINDOWS
2300 string uri = "file:///" + *x + "/";
2302 string uri = "file://" + *x + "/";
2304 LilvNode *node = lilv_new_uri(world, uri.c_str());
2305 lilv_world_load_bundle(world, node);
2306 lilv_node_free(node);
2309 _bundle_checked = true;
2313 LV2PluginInfo::LV2PluginInfo (const char* plugin_uri)
2316 _plugin_uri = strdup(plugin_uri);
2319 LV2PluginInfo::~LV2PluginInfo()
2326 LV2PluginInfo::load(Session& session)
2330 const LilvPlugins* plugins = lilv_world_get_all_plugins(_world.world);
2331 LilvNode* uri = lilv_new_uri(_world.world, _plugin_uri);
2332 if (!uri) { throw failed_constructor(); }
2333 const LilvPlugin* lp = lilv_plugins_get_by_uri(plugins, uri);
2334 if (!lp) { throw failed_constructor(); }
2335 plugin.reset(new LV2Plugin(session.engine(), session, lp, session.frame_rate()));
2336 lilv_node_free(uri);
2337 plugin->set_info(PluginInfoPtr(shared_from_this ()));
2339 } catch (failed_constructor& err) {
2340 return PluginPtr((Plugin*)0);
2347 LV2PluginInfo::discover()
2350 world.load_bundled_plugins();
2351 _world.load_bundled_plugins(true);
2353 PluginInfoList* plugs = new PluginInfoList;
2354 const LilvPlugins* plugins = lilv_world_get_all_plugins(world.world);
2356 if (!Config->get_show_plugin_scan_window()) {
2357 info << "LV2: Discovering " << lilv_plugins_size(plugins) << " plugins" << endmsg;
2360 LILV_FOREACH(plugins, i, plugins) {
2361 const LilvPlugin* p = lilv_plugins_get(plugins, i);
2362 const LilvNode* pun = lilv_plugin_get_uri(p);
2364 LV2PluginInfoPtr info(new LV2PluginInfo(lilv_node_as_string(pun)));
2366 LilvNode* name = lilv_plugin_get_name(p);
2367 if (!name || !lilv_plugin_get_port_by_index(p, 0)) {
2368 warning << "Ignoring invalid LV2 plugin "
2369 << lilv_node_as_string(lilv_plugin_get_uri(p))
2376 info->name = string(lilv_node_as_string(name));
2377 lilv_node_free(name);
2378 ARDOUR::PluginScanMessage(_("LV2"), info->name, false);
2380 const LilvPluginClass* pclass = lilv_plugin_get_class(p);
2381 const LilvNode* label = lilv_plugin_class_get_label(pclass);
2382 info->category = lilv_node_as_string(label);
2384 LilvNode* author_name = lilv_plugin_get_author_name(p);
2385 info->creator = author_name ? string(lilv_node_as_string(author_name)) : "Unknown";
2386 lilv_node_free(author_name);
2388 info->path = "/NOPATH"; // Meaningless for LV2
2390 /* count atom-event-ports that feature
2391 * atom:supports <http://lv2plug.in/ns/ext/midi#MidiEvent>
2393 * TODO: nicely ask drobilla to make a lilv_ call for that
2395 int count_midi_out = 0;
2396 int count_midi_in = 0;
2397 for (uint32_t i = 0; i < lilv_plugin_get_num_ports(p); ++i) {
2398 const LilvPort* port = lilv_plugin_get_port_by_index(p, i);
2399 if (lilv_port_is_a(p, port, world.atom_AtomPort)) {
2400 LilvNodes* buffer_types = lilv_port_get_value(
2401 p, port, world.atom_bufferType);
2402 LilvNodes* atom_supports = lilv_port_get_value(
2403 p, port, world.atom_supports);
2405 if (lilv_nodes_contains(buffer_types, world.atom_Sequence)
2406 && lilv_nodes_contains(atom_supports, world.midi_MidiEvent)) {
2407 if (lilv_port_is_a(p, port, world.lv2_InputPort)) {
2410 if (lilv_port_is_a(p, port, world.lv2_OutputPort)) {
2414 lilv_nodes_free(buffer_types);
2415 lilv_nodes_free(atom_supports);
2419 info->n_inputs.set_audio(
2420 lilv_plugin_get_num_ports_of_class(
2421 p, world.lv2_InputPort, world.lv2_AudioPort, NULL));
2422 info->n_inputs.set_midi(
2423 lilv_plugin_get_num_ports_of_class(
2424 p, world.lv2_InputPort, world.ev_EventPort, NULL)
2427 info->n_outputs.set_audio(
2428 lilv_plugin_get_num_ports_of_class(
2429 p, world.lv2_OutputPort, world.lv2_AudioPort, NULL));
2430 info->n_outputs.set_midi(
2431 lilv_plugin_get_num_ports_of_class(
2432 p, world.lv2_OutputPort, world.ev_EventPort, NULL)
2435 info->unique_id = lilv_node_as_uri(lilv_plugin_get_uri(p));
2436 info->index = 0; // Meaningless for LV2
2438 plugs->push_back(info);