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 class LV2World : boost::noncopyable {
105 void load_bundled_plugins(bool verbose=false);
109 LilvNode* atom_AtomPort;
110 LilvNode* atom_Chunk;
111 LilvNode* atom_Sequence;
112 LilvNode* atom_bufferType;
113 LilvNode* atom_eventTransfer;
114 LilvNode* atom_supports;
115 LilvNode* ev_EventPort;
116 LilvNode* ext_logarithmic;
117 LilvNode* ext_notOnGUI;
118 LilvNode* lv2_AudioPort;
119 LilvNode* lv2_ControlPort;
120 LilvNode* lv2_InputPort;
121 LilvNode* lv2_OutputPort;
122 LilvNode* lv2_enumeration;
123 LilvNode* lv2_freewheeling;
124 LilvNode* lv2_inPlaceBroken;
125 LilvNode* lv2_integer;
126 LilvNode* lv2_default;
127 LilvNode* lv2_minimum;
128 LilvNode* lv2_maximum;
129 LilvNode* lv2_reportsLatency;
130 LilvNode* lv2_sampleRate;
131 LilvNode* lv2_toggled;
132 LilvNode* midi_MidiEvent;
133 LilvNode* rdfs_comment;
134 LilvNode* rdfs_label;
135 LilvNode* rdfs_range;
136 LilvNode* rsz_minimumSize;
137 LilvNode* time_Position;
139 LilvNode* ui_external;
140 LilvNode* ui_externalkx;
141 LilvNode* units_unit;
142 LilvNode* units_midiNote;
143 LilvNode* patch_writable;
144 LilvNode* patch_Message;
147 bool _bundle_checked;
150 static LV2World _world;
152 /* worker extension */
154 /** Called by the plugin to schedule non-RT work. */
155 static LV2_Worker_Status
156 work_schedule(LV2_Worker_Schedule_Handle handle,
160 LV2Plugin* plugin = (LV2Plugin*)handle;
161 if (plugin->session().engine().freewheeling()) {
162 // Freewheeling, do the work immediately in this (audio) thread
163 return (LV2_Worker_Status)plugin->work(size, data);
165 // Enqueue message for the worker thread
166 return plugin->worker()->schedule(size, data) ?
167 LV2_WORKER_SUCCESS : LV2_WORKER_ERR_UNKNOWN;
171 /** Called by the plugin to respond to non-RT work. */
172 static LV2_Worker_Status
173 work_respond(LV2_Worker_Respond_Handle handle,
177 LV2Plugin* plugin = (LV2Plugin*)handle;
178 if (plugin->session().engine().freewheeling()) {
179 // Freewheeling, respond immediately in this (audio) thread
180 return (LV2_Worker_Status)plugin->work_response(size, data);
182 // Enqueue response for the worker
183 return plugin->worker()->respond(size, data) ?
184 LV2_WORKER_SUCCESS : LV2_WORKER_ERR_UNKNOWN;
191 log_vprintf(LV2_Log_Handle /*handle*/,
197 const int ret = g_vasprintf(&str, fmt, args);
198 if (type == URIMap::instance().urids.log_Error) {
199 error << str << endmsg;
200 } else if (type == URIMap::instance().urids.log_Warning) {
201 warning << str << endmsg;
202 } else if (type == URIMap::instance().urids.log_Note) {
203 info << str << endmsg;
205 // TODO: Toggleable log:Trace message support
210 log_printf(LV2_Log_Handle handle,
212 const char* fmt, ...)
216 const int ret = log_vprintf(handle, type, fmt, args);
221 struct LV2Plugin::Impl {
222 Impl() : plugin(0), ui(0), ui_type(0), name(0), author(0), instance(0)
227 /** Find the LV2 input port with the given designation.
228 * If found, bufptrs[port_index] will be set to bufptr.
230 const LilvPort* designated_input (const char* uri, void** bufptrs[], void** bufptr);
232 const LilvPlugin* plugin;
234 const LilvNode* ui_type;
237 LilvInstance* instance;
238 const LV2_Worker_Interface* work_iface;
240 LV2_Atom_Forge forge;
241 LV2_Atom_Forge ui_forge;
244 LV2Plugin::LV2Plugin (AudioEngine& engine,
246 const void* c_plugin,
248 : Plugin (engine, session)
254 , _patch_port_in_index((uint32_t)-1)
255 , _patch_port_out_index((uint32_t)-1)
256 , _uri_map(URIMap::instance())
258 init(c_plugin, rate);
261 LV2Plugin::LV2Plugin (const LV2Plugin& other)
267 , _insert_id(other._insert_id)
268 , _patch_port_in_index((uint32_t)-1)
269 , _patch_port_out_index((uint32_t)-1)
270 , _uri_map(URIMap::instance())
272 init(other._impl->plugin, other._sample_rate);
274 for (uint32_t i = 0; i < parameter_count(); ++i) {
275 _control_data[i] = other._shadow_data[i];
276 _shadow_data[i] = other._shadow_data[i];
281 LV2Plugin::init(const void* c_plugin, framecnt_t rate)
283 DEBUG_TRACE(DEBUG::LV2, "init\n");
285 _impl->plugin = (const LilvPlugin*)c_plugin;
287 _impl->ui_type = NULL;
292 _atom_ev_buffers = 0;
294 _bpm_control_port = 0;
295 _freewheel_control_port = 0;
296 _latency_control_port = 0;
297 _next_cycle_start = std::numeric_limits<framepos_t>::max();
298 _next_cycle_speed = 1.0;
299 _block_length = _engine.samples_per_cycle();
300 _seq_size = _engine.raw_buffer_size(DataType::MIDI);
302 _was_activated = false;
303 _has_state_interface = false;
305 _instance_access_feature.URI = "http://lv2plug.in/ns/ext/instance-access";
306 _data_access_feature.URI = "http://lv2plug.in/ns/ext/data-access";
307 _make_path_feature.URI = LV2_STATE__makePath;
308 _log_feature.URI = LV2_LOG__log;
309 _work_schedule_feature.URI = LV2_WORKER__schedule;
310 _work_schedule_feature.data = NULL;
311 _def_state_feature.URI = LV2_STATE_PREFIX "loadDefaultState"; // Post LV2-1.2.0
312 _def_state_feature.data = NULL;
314 const LilvPlugin* plugin = _impl->plugin;
316 LilvNode* state_iface_uri = lilv_new_uri(_world.world, LV2_STATE__interface);
317 LilvNode* state_uri = lilv_new_uri(_world.world, LV2_STATE_URI);
318 _has_state_interface =
319 // What plugins should have (lv2:extensionData state:Interface)
320 lilv_plugin_has_extension_data(plugin, state_iface_uri)
321 // What some outdated/incorrect ones have
322 || lilv_plugin_has_feature(plugin, state_uri);
323 lilv_node_free(state_uri);
324 lilv_node_free(state_iface_uri);
326 _features = (LV2_Feature**)calloc(11, sizeof(LV2_Feature*));
327 _features[0] = &_instance_access_feature;
328 _features[1] = &_data_access_feature;
329 _features[2] = &_make_path_feature;
330 _features[3] = _uri_map.uri_map_feature();
331 _features[4] = _uri_map.urid_map_feature();
332 _features[5] = _uri_map.urid_unmap_feature();
333 _features[6] = &_log_feature;
335 unsigned n_features = 7;
336 #ifdef HAVE_LV2_1_2_0
337 _features[n_features++] = &_def_state_feature;
340 lv2_atom_forge_init(&_impl->forge, _uri_map.urid_map());
341 lv2_atom_forge_init(&_impl->ui_forge, _uri_map.urid_map());
343 #ifdef HAVE_LV2_1_2_0
344 LV2_URID atom_Int = _uri_map.uri_to_id(LV2_ATOM__Int);
345 LV2_Options_Option options[] = {
346 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id(LV2_BUF_SIZE__minBlockLength),
347 sizeof(int32_t), atom_Int, &_block_length },
348 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id(LV2_BUF_SIZE__maxBlockLength),
349 sizeof(int32_t), atom_Int, &_block_length },
350 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id(LV2_BUF_SIZE__sequenceSize),
351 sizeof(int32_t), atom_Int, &_seq_size },
352 { LV2_OPTIONS_INSTANCE, 0, 0, 0, 0, NULL }
355 _options_feature.URI = LV2_OPTIONS__options;
356 _options_feature.data = options;
357 _features[n_features++] = &_options_feature;
360 LV2_State_Make_Path* make_path = (LV2_State_Make_Path*)malloc(
361 sizeof(LV2_State_Make_Path));
362 make_path->handle = this;
363 make_path->path = &lv2_state_make_path;
364 _make_path_feature.data = make_path;
366 LV2_Log_Log* log = (LV2_Log_Log*)malloc(sizeof(LV2_Log_Log));
368 log->printf = &log_printf;
369 log->vprintf = &log_vprintf;
370 _log_feature.data = log;
372 LilvNode* worker_schedule = lilv_new_uri(_world.world, LV2_WORKER__schedule);
373 if (lilv_plugin_has_feature(plugin, worker_schedule)) {
374 LV2_Worker_Schedule* schedule = (LV2_Worker_Schedule*)malloc(
375 sizeof(LV2_Worker_Schedule));
376 size_t buf_size = _session.engine().raw_buffer_size(DataType::MIDI) * NBUFS;
377 _worker = new Worker(this, buf_size);
378 schedule->handle = this;
379 schedule->schedule_work = work_schedule;
380 _work_schedule_feature.data = schedule;
381 _features[n_features++] = &_work_schedule_feature;
383 lilv_node_free(worker_schedule);
385 _impl->instance = lilv_plugin_instantiate(plugin, rate, _features);
386 _impl->name = lilv_plugin_get_name(plugin);
387 _impl->author = lilv_plugin_get_author_name(plugin);
389 if (_impl->instance == 0) {
390 error << _("LV2: Failed to instantiate plugin ") << uri() << endmsg;
391 throw failed_constructor();
394 _instance_access_feature.data = (void*)_impl->instance->lv2_handle;
395 _data_access_extension_data.extension_data = _impl->instance->lv2_descriptor->extension_data;
396 _data_access_feature.data = &_data_access_extension_data;
398 LilvNode* worker_iface_uri = lilv_new_uri(_world.world, LV2_WORKER__interface);
399 if (lilv_plugin_has_extension_data(plugin, worker_iface_uri)) {
400 _impl->work_iface = (const LV2_Worker_Interface*)extension_data(
401 LV2_WORKER__interface);
403 lilv_node_free(worker_iface_uri);
405 if (lilv_plugin_has_feature(plugin, _world.lv2_inPlaceBroken)) {
406 error << string_compose(
407 _("LV2: \"%1\" cannot be used, since it cannot do inplace processing"),
408 lilv_node_as_string(_impl->name)) << endmsg;
409 lilv_node_free(_impl->name);
410 lilv_node_free(_impl->author);
411 throw failed_constructor();
414 #ifdef HAVE_LILV_0_16_0
415 // Load default state
416 LilvState* state = lilv_state_new_from_world(
417 _world.world, _uri_map.urid_map(), lilv_plugin_get_uri(_impl->plugin));
418 if (state && _has_state_interface) {
419 lilv_state_restore(state, _impl->instance, NULL, NULL, 0, NULL);
425 const uint32_t num_ports = this->num_ports();
426 for (uint32_t i = 0; i < num_ports; ++i) {
427 const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, i);
429 size_t minimumSize = 0;
431 if (lilv_port_is_a(_impl->plugin, port, _world.lv2_OutputPort)) {
432 flags |= PORT_OUTPUT;
433 } else if (lilv_port_is_a(_impl->plugin, port, _world.lv2_InputPort)) {
436 error << string_compose(
437 "LV2: \"%1\" port %2 is neither input nor output",
438 lilv_node_as_string(_impl->name), i) << endmsg;
439 throw failed_constructor();
442 if (lilv_port_is_a(_impl->plugin, port, _world.lv2_ControlPort)) {
443 flags |= PORT_CONTROL;
444 } else if (lilv_port_is_a(_impl->plugin, port, _world.lv2_AudioPort)) {
446 } else if (lilv_port_is_a(_impl->plugin, port, _world.ev_EventPort)) {
448 flags |= PORT_MIDI; // We assume old event API ports are for MIDI
449 } else if (lilv_port_is_a(_impl->plugin, port, _world.atom_AtomPort)) {
450 LilvNodes* buffer_types = lilv_port_get_value(
451 _impl->plugin, port, _world.atom_bufferType);
452 LilvNodes* atom_supports = lilv_port_get_value(
453 _impl->plugin, port, _world.atom_supports);
455 if (lilv_nodes_contains(buffer_types, _world.atom_Sequence)) {
456 flags |= PORT_SEQUENCE;
457 if (lilv_nodes_contains(atom_supports, _world.midi_MidiEvent)) {
460 if (lilv_nodes_contains(atom_supports, _world.time_Position)) {
461 flags |= PORT_POSITION;
463 if (lilv_nodes_contains(atom_supports, _world.patch_Message)) {
464 flags |= PORT_PATCHMSG;
465 if (flags & PORT_INPUT) {
466 _patch_port_in_index = i;
468 _patch_port_out_index = i;
472 LilvNodes* min_size_v = lilv_port_get_value(_impl->plugin, port, _world.rsz_minimumSize);
473 LilvNode* min_size = min_size_v ? lilv_nodes_get_first(min_size_v) : NULL;
474 if (min_size && lilv_node_is_int(min_size)) {
475 minimumSize = lilv_node_as_int(min_size);
477 lilv_nodes_free(min_size_v);
478 lilv_nodes_free(buffer_types);
479 lilv_nodes_free(atom_supports);
481 error << string_compose(
482 "LV2: \"%1\" port %2 has no known data type",
483 lilv_node_as_string(_impl->name), i) << endmsg;
484 throw failed_constructor();
487 _port_flags.push_back(flags);
488 _port_minimumSize.push_back(minimumSize);
491 _control_data = new float[num_ports];
492 _shadow_data = new float[num_ports];
493 _defaults = new float[num_ports];
494 _ev_buffers = new LV2_Evbuf*[num_ports];
495 memset(_ev_buffers, 0, sizeof(LV2_Evbuf*) * num_ports);
497 const bool latent = lilv_plugin_has_latency(plugin);
498 const uint32_t latency_index = (latent)
499 ? lilv_plugin_get_latency_port_index(plugin)
502 // Build an array of pointers to special parameter buffers
503 void*** params = new void**[num_ports];
504 for (uint32_t i = 0; i < num_ports; ++i) {
507 _impl->designated_input (LV2_TIME__beatsPerMinute, params, (void**)&_bpm_control_port);
508 _impl->designated_input (LV2_CORE__freeWheeling, params, (void**)&_freewheel_control_port);
510 for (uint32_t i = 0; i < num_ports; ++i) {
511 const LilvPort* port = lilv_plugin_get_port_by_index(plugin, i);
512 const LilvNode* sym = lilv_port_get_symbol(plugin, port);
514 // Store index in map so we can look up index by symbol
515 _port_indices.insert(std::make_pair(lilv_node_as_string(sym), i));
517 // Get range and default value if applicable
518 if (parameter_is_control(i)) {
520 lilv_port_get_range(plugin, port, &def, NULL, NULL);
521 _defaults[i] = def ? lilv_node_as_float(def) : 0.0f;
522 if (lilv_port_has_property (plugin, port, _world.lv2_sampleRate)) {
523 _defaults[i] *= _session.frame_rate ();
527 lilv_instance_connect_port(_impl->instance, i, &_control_data[i]);
529 if (latent && i == latency_index) {
530 _latency_control_port = &_control_data[i];
531 *_latency_control_port = 0;
534 if (parameter_is_input(i)) {
535 _shadow_data[i] = default_value(i);
537 *params[i] = (void*)&_shadow_data[i];
547 LilvUIs* uis = lilv_plugin_get_uis(plugin);
548 if (lilv_uis_size(uis) > 0) {
550 // Look for embeddable UI
551 LILV_FOREACH(uis, u, uis) {
552 const LilvUI* this_ui = lilv_uis_get(uis, u);
553 const LilvNode* this_ui_type = NULL;
554 if (lilv_ui_is_supported(this_ui,
558 // TODO: Multiple UI support
560 _impl->ui_type = this_ui_type;
565 // Look for Gtk native UI
566 LILV_FOREACH(uis, i, uis) {
567 const LilvUI* ui = lilv_uis_get(uis, i);
568 if (lilv_ui_is_a(ui, _world.ui_GtkUI)) {
570 _impl->ui_type = _world.ui_GtkUI;
576 // If Gtk UI is not available, try to find external UI
578 LILV_FOREACH(uis, i, uis) {
579 const LilvUI* ui = lilv_uis_get(uis, i);
580 if (lilv_ui_is_a(ui, _world.ui_externalkx)) {
582 _impl->ui_type = _world.ui_external;
585 if (lilv_ui_is_a(ui, _world.ui_external)) {
587 _impl->ui_type = _world.ui_external;
593 load_supported_properties(_property_descriptors);
594 allocate_atom_event_buffers();
595 latency_compute_run();
598 LV2Plugin::~LV2Plugin ()
600 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 destroy\n", name()));
605 lilv_instance_free(_impl->instance);
606 lilv_node_free(_impl->name);
607 lilv_node_free(_impl->author);
610 free(_make_path_feature.data);
611 free(_work_schedule_feature.data);
617 if (_atom_ev_buffers) {
618 LV2_Evbuf** b = _atom_ev_buffers;
623 free(_atom_ev_buffers);
626 delete [] _control_data;
627 delete [] _shadow_data;
628 delete [] _ev_buffers;
632 LV2Plugin::is_external_ui() const
637 return lilv_ui_is_a(_impl->ui, _world.ui_external) || lilv_ui_is_a(_impl->ui, _world.ui_externalkx);
641 LV2Plugin::is_external_kx() const
646 return lilv_ui_is_a(_impl->ui, _world.ui_externalkx);
650 LV2Plugin::ui_is_resizable () const
652 const LilvNode* s = lilv_ui_get_uri(_impl->ui);
653 LilvNode* p = lilv_new_uri(_world.world, LV2_CORE__optionalFeature);
654 LilvNode* fs = lilv_new_uri(_world.world, LV2_UI__fixedSize);
655 LilvNode* nrs = lilv_new_uri(_world.world, LV2_UI__noUserResize);
657 LilvNodes* fs_matches = lilv_world_find_nodes(_world.world, s, p, fs);
658 LilvNodes* nrs_matches = lilv_world_find_nodes(_world.world, s, p, nrs);
660 lilv_nodes_free(nrs_matches);
661 lilv_nodes_free(fs_matches);
666 return !fs_matches && !nrs_matches;
670 LV2Plugin::unique_id() const
672 return lilv_node_as_uri(lilv_plugin_get_uri(_impl->plugin));
676 LV2Plugin::uri() const
678 return lilv_node_as_uri(lilv_plugin_get_uri(_impl->plugin));
682 LV2Plugin::label() const
684 return lilv_node_as_string(_impl->name);
688 LV2Plugin::name() const
690 return lilv_node_as_string(_impl->name);
694 LV2Plugin::maker() const
696 return _impl->author ? lilv_node_as_string (_impl->author) : "Unknown";
700 LV2Plugin::num_ports() const
702 return lilv_plugin_get_num_ports(_impl->plugin);
706 LV2Plugin::parameter_count() const
708 return lilv_plugin_get_num_ports(_impl->plugin);
712 LV2Plugin::default_value(uint32_t port)
714 return _defaults[port];
718 LV2Plugin::port_symbol(uint32_t index) const
720 const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, index);
722 error << name() << ": Invalid port index " << index << endmsg;
725 const LilvNode* sym = lilv_port_get_symbol(_impl->plugin, port);
726 return lilv_node_as_string(sym);
730 LV2Plugin::port_index (const char* symbol) const
732 const map<string, uint32_t>::const_iterator i = _port_indices.find(symbol);
733 if (i != _port_indices.end()) {
736 warning << string_compose(_("LV2: Unknown port %1"), symbol) << endmsg;
742 LV2Plugin::set_parameter(uint32_t which, float val)
744 DEBUG_TRACE(DEBUG::LV2, string_compose(
745 "%1 set parameter %2 to %3\n", name(), which, val));
747 if (which < lilv_plugin_get_num_ports(_impl->plugin)) {
748 if (get_parameter (which) == val) {
752 _shadow_data[which] = val;
754 warning << string_compose(
755 _("Illegal parameter number used with plugin \"%1\". "
756 "This is a bug in either %2 or the LV2 plugin <%3>"),
757 name(), PROGRAM_NAME, unique_id()) << endmsg;
760 Plugin::set_parameter(which, val);
764 LV2Plugin::get_parameter(uint32_t which) const
766 if (parameter_is_input(which)) {
767 return (float)_shadow_data[which];
769 return (float)_control_data[which];
775 LV2Plugin::get_docs() const
777 LilvNodes* comments = lilv_plugin_get_value(_impl->plugin, _world.rdfs_comment);
779 const std::string docs(lilv_node_as_string(lilv_nodes_get_first(comments)));
780 lilv_nodes_free(comments);
788 LV2Plugin::get_parameter_docs(uint32_t which) const
790 LilvNodes* comments = lilv_port_get_value(
792 lilv_plugin_get_port_by_index(_impl->plugin, which),
793 _world.rdfs_comment);
796 const std::string docs(lilv_node_as_string(lilv_nodes_get_first(comments)));
797 lilv_nodes_free(comments);
805 LV2Plugin::nth_parameter(uint32_t n, bool& ok) const
808 for (uint32_t c = 0, x = 0; x < lilv_plugin_get_num_ports(_impl->plugin); ++x) {
809 if (parameter_is_control(x)) {
821 LV2Plugin::extension_data(const char* uri) const
823 return lilv_instance_get_extension_data(_impl->instance, uri);
827 LV2Plugin::c_plugin()
829 return _impl->plugin;
835 return (const void*)_impl->ui;
839 LV2Plugin::c_ui_type()
841 return (const void*)_impl->ui_type;
844 /** Directory for all plugin state. */
846 LV2Plugin::plugin_dir() const
848 return Glib::build_filename(_session.plugins_dir(), _insert_id.to_s());
851 /** Directory for files created by the plugin (except during save). */
853 LV2Plugin::scratch_dir() const
855 return Glib::build_filename(plugin_dir(), "scratch");
858 /** Directory for snapshots of files in the scratch directory. */
860 LV2Plugin::file_dir() const
862 return Glib::build_filename(plugin_dir(), "files");
865 /** Directory to save state snapshot version @c num into. */
867 LV2Plugin::state_dir(unsigned num) const
869 return Glib::build_filename(plugin_dir(), string_compose("state%1", num));
872 /** Implementation of state:makePath for files created at instantiation time.
873 * Note this is not used for files created at save time (Lilv deals with that).
876 LV2Plugin::lv2_state_make_path(LV2_State_Make_Path_Handle handle,
879 LV2Plugin* me = (LV2Plugin*)handle;
880 if (me->_insert_id == PBD::ID("0")) {
881 warning << string_compose(
882 "File path \"%1\" requested but LV2 %2 has no insert ID",
883 path, me->name()) << endmsg;
884 return g_strdup(path);
887 const std::string abs_path = Glib::build_filename(me->scratch_dir(), path);
888 const std::string dirname = Glib::path_get_dirname(abs_path);
889 g_mkdir_with_parents(dirname.c_str(), 0744);
891 DEBUG_TRACE(DEBUG::LV2, string_compose("new file path %1 => %2\n",
894 return g_strndup(abs_path.c_str(), abs_path.length());
898 LV2Plugin::add_state(XMLNode* root) const
900 assert(_insert_id != PBD::ID("0"));
904 LocaleGuard lg(X_("POSIX"));
906 for (uint32_t i = 0; i < parameter_count(); ++i) {
907 if (parameter_is_input(i) && parameter_is_control(i)) {
908 child = new XMLNode("Port");
909 child->add_property("symbol", port_symbol(i));
910 snprintf(buf, sizeof(buf), "%+f", _shadow_data[i]);
911 child->add_property("value", string(buf));
912 root->add_child_nocopy(*child);
916 if (_has_state_interface) {
917 // Provisionally increment state version and create directory
918 const std::string new_dir = state_dir(++_state_version);
919 g_mkdir_with_parents(new_dir.c_str(), 0744);
921 LilvState* state = lilv_state_new_from_instance(
925 scratch_dir().c_str(),
927 _session.externals_dir().c_str(),
930 const_cast<LV2Plugin*>(this),
934 if (!_impl->state || !lilv_state_equals(state, _impl->state)) {
935 lilv_state_save(_world.world,
937 _uri_map.urid_unmap(),
943 lilv_state_free(_impl->state);
944 _impl->state = state;
946 // State is identical, decrement version and nuke directory
947 lilv_state_free(state);
948 PBD::remove_directory(new_dir);
952 root->add_property("state-dir", string_compose("state%1", _state_version));
956 static inline const LilvNode*
957 get_value(LilvWorld* world, const LilvNode* subject, const LilvNode* predicate)
959 LilvNodes* vs = lilv_world_find_nodes(world, subject, predicate, NULL);
960 return vs ? lilv_nodes_get_first(vs) : NULL;
964 LV2Plugin::find_presets()
966 LilvNode* lv2_appliesTo = lilv_new_uri(_world.world, LV2_CORE__appliesTo);
967 LilvNode* pset_Preset = lilv_new_uri(_world.world, LV2_PRESETS__Preset);
968 LilvNode* rdfs_label = lilv_new_uri(_world.world, LILV_NS_RDFS "label");
970 LilvNodes* presets = lilv_plugin_get_related(_impl->plugin, pset_Preset);
971 LILV_FOREACH(nodes, i, presets) {
972 const LilvNode* preset = lilv_nodes_get(presets, i);
973 lilv_world_load_resource(_world.world, preset);
974 const LilvNode* name = get_value(_world.world, preset, rdfs_label);
976 _presets.insert(std::make_pair(lilv_node_as_string(preset),
977 Plugin::PresetRecord(
978 lilv_node_as_string(preset),
979 lilv_node_as_string(name))));
981 warning << string_compose(
982 _("Plugin \"%1\" preset \"%2\" is missing a label\n"),
983 lilv_node_as_string(lilv_plugin_get_uri(_impl->plugin)),
984 lilv_node_as_string(preset)) << endmsg;
987 lilv_nodes_free(presets);
989 lilv_node_free(rdfs_label);
990 lilv_node_free(pset_Preset);
991 lilv_node_free(lv2_appliesTo);
995 set_port_value(const char* port_symbol,
1001 LV2Plugin* self = (LV2Plugin*)user_data;
1002 if (type != 0 && type != URIMap::instance().urids.atom_Float) {
1003 return; // TODO: Support non-float ports
1006 const uint32_t port_index = self->port_index(port_symbol);
1007 if (port_index != (uint32_t)-1) {
1008 self->set_parameter(port_index, *(const float*)value);
1013 LV2Plugin::load_preset(PresetRecord r)
1015 LilvWorld* world = _world.world;
1016 LilvNode* pset = lilv_new_uri(world, r.uri.c_str());
1017 LilvState* state = lilv_state_new_from_world(world, _uri_map.urid_map(), pset);
1020 lilv_state_restore(state, _impl->instance, set_port_value, this, 0, NULL);
1021 lilv_state_free(state);
1022 Plugin::load_preset(r);
1025 lilv_node_free(pset);
1030 ARDOUR::lv2plugin_get_port_value(const char* port_symbol,
1035 LV2Plugin *plugin = (LV2Plugin *) user_data;
1037 uint32_t index = plugin->port_index(port_symbol);
1038 if (index != (uint32_t) -1) {
1039 if (plugin->parameter_is_input(index) && plugin->parameter_is_control(index)) {
1041 *size = sizeof(float);
1042 *type = plugin->_uri_map.uri_to_id(LV2_ATOM__Float);
1043 value = &plugin->_shadow_data[index];
1055 LV2Plugin::do_save_preset(string name)
1057 const string base_name = legalize_for_uri(name);
1058 const string file_name = base_name + ".ttl";
1059 const string bundle = Glib::build_filename(
1060 Glib::get_home_dir(),
1061 Glib::build_filename(".lv2", base_name + ".lv2"));
1063 LilvState* state = lilv_state_new_from_instance(
1066 _uri_map.urid_map(),
1067 scratch_dir().c_str(), // file_dir
1068 bundle.c_str(), // copy_dir
1069 bundle.c_str(), // link_dir
1070 bundle.c_str(), // save_dir
1071 lv2plugin_get_port_value, // get_value
1072 (void*)this, // user_data
1073 LV2_STATE_IS_POD|LV2_STATE_IS_PORTABLE, // flags
1074 _features // features
1077 lilv_state_set_label(state, name.c_str());
1079 _world.world, // world
1080 _uri_map.urid_map(), // map
1081 _uri_map.urid_unmap(), // unmap
1083 NULL, // uri (NULL = use file URI)
1084 bundle.c_str(), // dir
1085 file_name.c_str() // filename
1088 lilv_state_free(state);
1090 std::string uri = Glib::filename_to_uri(Glib::build_filename(bundle, file_name));
1091 LilvNode *node_bundle = lilv_new_uri(_world.world, Glib::filename_to_uri(Glib::build_filename(bundle, "/")).c_str());
1092 LilvNode *node_preset = lilv_new_uri(_world.world, uri.c_str());
1093 #ifdef HAVE_LILV_0_19_2
1094 lilv_world_unload_resource(_world.world, node_preset);
1095 lilv_world_unload_bundle(_world.world, node_bundle);
1097 lilv_world_load_bundle(_world.world, node_bundle);
1098 lilv_world_load_resource(_world.world, node_preset);
1099 lilv_node_free(node_bundle);
1100 lilv_node_free(node_preset);
1105 LV2Plugin::do_remove_preset(string name)
1107 string preset_file = Glib::build_filename(
1108 Glib::get_home_dir(),
1109 Glib::build_filename(
1110 Glib::build_filename(".lv2", "presets"),
1114 ::g_unlink(preset_file.c_str());
1118 LV2Plugin::has_editor() const
1120 return _impl->ui != NULL;
1124 LV2Plugin::has_message_output() const
1126 for (uint32_t i = 0; i < num_ports(); ++i) {
1127 if ((_port_flags[i] & PORT_SEQUENCE) &&
1128 (_port_flags[i] & PORT_OUTPUT)) {
1136 LV2Plugin::write_to(RingBuffer<uint8_t>* dest,
1140 const uint8_t* body)
1142 const uint32_t buf_size = sizeof(UIMessage) + size;
1143 vector<uint8_t> buf(buf_size);
1145 UIMessage* msg = (UIMessage*)&buf[0];
1147 msg->protocol = protocol;
1149 memcpy(msg + 1, body, size);
1151 return (dest->write(&buf[0], buf_size) == buf_size);
1155 LV2Plugin::write_from_ui(uint32_t index,
1158 const uint8_t* body)
1161 size_t rbs = _session.engine().raw_buffer_size(DataType::MIDI) * NBUFS;
1162 /* buffer data communication from plugin UI to plugin instance.
1163 * this buffer needs to potentially hold
1164 * (port's minimumSize) * (audio-periods) / (UI-periods)
1167 * e.g 48kSPS / 128fpp -> audio-periods = 375 Hz
1168 * ui-periods = 25 Hz (SuperRapidScreenUpdate)
1169 * default minimumSize = 32K (see LV2Plugin::allocate_atom_event_buffers()
1171 * it is NOT safe to overflow (msg.size will be misinterpreted)
1173 uint32_t bufsiz = 32768;
1174 if (_atom_ev_buffers && _atom_ev_buffers[0]) {
1175 bufsiz = lv2_evbuf_get_capacity(_atom_ev_buffers[0]);
1177 rbs = max((size_t) bufsiz * 8, rbs);
1178 _from_ui = new RingBuffer<uint8_t>(rbs);
1181 if (!write_to(_from_ui, index, protocol, size, body)) {
1182 error << "Error writing from UI to plugin" << endmsg;
1189 LV2Plugin::write_to_ui(uint32_t index,
1192 const uint8_t* body)
1194 if (!write_to(_to_ui, index, protocol, size, body)) {
1195 error << "Error writing from plugin to UI" << endmsg;
1202 forge_variant(LV2_Atom_Forge* forge, const Variant& value)
1204 switch (value.type()) {
1208 lv2_atom_forge_bool(forge, value.get_bool());
1210 case Variant::DOUBLE:
1211 lv2_atom_forge_double(forge, value.get_double());
1213 case Variant::FLOAT:
1214 lv2_atom_forge_float(forge, value.get_float());
1217 lv2_atom_forge_int(forge, value.get_int());
1220 lv2_atom_forge_long(forge, value.get_long());
1223 lv2_atom_forge_path(
1224 forge, value.get_path().c_str(), value.get_path().size());
1226 case Variant::STRING:
1227 lv2_atom_forge_string(
1228 forge, value.get_string().c_str(), value.get_string().size());
1232 forge, value.get_uri().c_str(), value.get_uri().size());
1237 /** Get a variant type from a URI, return false iff no match found. */
1239 uri_to_variant_type(const std::string& uri, Variant::Type& type)
1241 if (uri == LV2_ATOM__Bool) {
1242 type = Variant::BOOL;
1243 } else if (uri == LV2_ATOM__Double) {
1244 type = Variant::DOUBLE;
1245 } else if (uri == LV2_ATOM__Float) {
1246 type = Variant::FLOAT;
1247 } else if (uri == LV2_ATOM__Int) {
1248 type = Variant::INT;
1249 } else if (uri == LV2_ATOM__Long) {
1250 type = Variant::LONG;
1251 } else if (uri == LV2_ATOM__Path) {
1252 type = Variant::PATH;
1253 } else if (uri == LV2_ATOM__String) {
1254 type = Variant::STRING;
1255 } else if (uri == LV2_ATOM__URI) {
1256 type = Variant::URI;
1264 LV2Plugin::set_property(uint32_t key, const Variant& value)
1266 if (_patch_port_in_index == (uint32_t)-1) {
1267 error << "LV2: set_property called with unset patch_port_in_index" << endmsg;
1269 } else if (value.type() == Variant::VOID) {
1270 error << "LV2: set_property called with void value" << endmsg;
1274 // Set up forge to write to temporary buffer on the stack
1275 LV2_Atom_Forge* forge = &_impl->ui_forge;
1276 LV2_Atom_Forge_Frame frame;
1277 uint8_t buf[PATH_MAX]; // Ought to be enough for anyone...
1279 lv2_atom_forge_set_buffer(forge, buf, sizeof(buf));
1281 // Serialize patch:Set message to set property
1282 #ifdef HAVE_LV2_1_10_0
1283 lv2_atom_forge_object(forge, &frame, 1, _uri_map.urids.patch_Set);
1284 lv2_atom_forge_key(forge, _uri_map.urids.patch_property);
1285 lv2_atom_forge_urid(forge, key);
1286 lv2_atom_forge_key(forge, _uri_map.urids.patch_value);
1288 lv2_atom_forge_blank(forge, &frame, 1, _uri_map.urids.patch_Set);
1289 lv2_atom_forge_property_head(forge, _uri_map.urids.patch_property, 0);
1290 lv2_atom_forge_urid(forge, key);
1291 lv2_atom_forge_property_head(forge, _uri_map.urids.patch_value, 0);
1294 forge_variant(forge, value);
1296 // Write message to UI=>Plugin ring
1297 const LV2_Atom* const atom = (const LV2_Atom*)buf;
1298 write_from_ui(_patch_port_in_index,
1299 _uri_map.urids.atom_eventTransfer,
1300 lv2_atom_total_size(atom),
1301 (const uint8_t*)atom);
1304 const ParameterDescriptor&
1305 LV2Plugin::get_property_descriptor(uint32_t id) const
1307 PropertyDescriptors::const_iterator p = _property_descriptors.find(id);
1308 if (p != _property_descriptors.end()) {
1311 return Plugin::get_property_descriptor(id);
1315 set_parameter_descriptor(LV2World& world,
1316 ParameterDescriptor& desc,
1317 Variant::Type datatype,
1318 const LilvNode* subject)
1320 LilvWorld* lworld = _world.world;
1321 LilvNode* label = lilv_world_get(lworld, subject, _world.rdfs_label, NULL);
1322 LilvNode* def = lilv_world_get(lworld, subject, _world.lv2_default, NULL);
1323 LilvNode* minimum = lilv_world_get(lworld, subject, _world.lv2_minimum, NULL);
1324 LilvNode* maximum = lilv_world_get(lworld, subject, _world.lv2_maximum, NULL);
1326 desc.label = lilv_node_as_string(label);
1328 if (def && lilv_node_is_float(def)) {
1329 desc.normal = lilv_node_as_float(def);
1331 if (minimum && lilv_node_is_float(minimum)) {
1332 desc.lower = lilv_node_as_float(minimum);
1334 if (maximum && lilv_node_is_float(maximum)) {
1335 desc.upper = lilv_node_as_float(maximum);
1337 desc.datatype = datatype;
1338 desc.toggled |= datatype == Variant::BOOL;
1339 desc.integer_step |= datatype == Variant::INT || datatype == Variant::LONG;
1343 LV2Plugin::load_supported_properties(PropertyDescriptors& descs)
1345 LilvWorld* lworld = _world.world;
1346 const LilvNode* subject = lilv_plugin_get_uri(_impl->plugin);
1347 LilvNodes* properties = lilv_world_find_nodes(
1348 lworld, subject, _world.patch_writable, NULL);
1349 LILV_FOREACH(nodes, p, properties) {
1350 // Get label and range
1351 const LilvNode* prop = lilv_nodes_get(properties, p);
1352 LilvNode* range = lilv_world_get(lworld, prop, _world.rdfs_range, NULL);
1354 warning << string_compose(_("LV2: property <%1> has no range datatype, ignoring"),
1355 lilv_node_as_uri(prop)) << endmsg;
1359 // Convert range to variant type (TODO: support for multiple range types)
1360 Variant::Type datatype;
1361 if (!uri_to_variant_type(lilv_node_as_uri(range), datatype)) {
1362 error << string_compose(_("LV2: property <%1> has unsupported datatype <%1>"),
1363 lilv_node_as_uri(prop), lilv_node_as_uri(range)) << endmsg;
1367 // Add description to result
1368 ParameterDescriptor desc;
1369 desc.key = _uri_map.uri_to_id(lilv_node_as_uri(prop));
1370 desc.datatype = datatype;
1371 set_parameter_descriptor(_world, desc, datatype, prop);
1372 descs.insert(std::make_pair(desc.key, desc));
1374 lilv_node_free(range);
1376 lilv_nodes_free(properties);
1380 LV2Plugin::announce_property_values()
1382 if (_patch_port_in_index == (uint32_t)-1) {
1386 // Set up forge to write to temporary buffer on the stack
1387 LV2_Atom_Forge* forge = &_impl->ui_forge;
1388 LV2_Atom_Forge_Frame frame;
1389 uint8_t buf[PATH_MAX]; // Ought to be enough for anyone...
1391 lv2_atom_forge_set_buffer(forge, buf, sizeof(buf));
1393 // Serialize patch:Get message with no subject (implicitly plugin instance)
1394 #ifdef HAVE_LV2_1_10_0
1395 lv2_atom_forge_object(forge, &frame, 1, _uri_map.urids.patch_Get);
1397 lv2_atom_forge_blank(forge, &frame, 1, _uri_map.urids.patch_Get);
1400 // Write message to UI=>Plugin ring
1401 const LV2_Atom* const atom = (const LV2_Atom*)buf;
1402 write_from_ui(_patch_port_in_index,
1403 _uri_map.urids.atom_eventTransfer,
1404 lv2_atom_total_size(atom),
1405 (const uint8_t*)atom);
1409 LV2Plugin::enable_ui_emission()
1412 /* see note in LV2Plugin::write_from_ui() */
1413 uint32_t bufsiz = 32768;
1414 if (_atom_ev_buffers && _atom_ev_buffers[0]) {
1415 bufsiz = lv2_evbuf_get_capacity(_atom_ev_buffers[0]);
1417 size_t rbs = _session.engine().raw_buffer_size(DataType::MIDI) * NBUFS;
1418 rbs = max((size_t) bufsiz * 8, rbs);
1419 _to_ui = new RingBuffer<uint8_t>(rbs);
1424 LV2Plugin::emit_to_ui(void* controller, UIMessageSink sink)
1430 uint32_t read_space = _to_ui->read_space();
1431 while (read_space > sizeof(UIMessage)) {
1433 if (_to_ui->read((uint8_t*)&msg, sizeof(msg)) != sizeof(msg)) {
1434 error << "Error reading from Plugin=>UI RingBuffer" << endmsg;
1437 vector<uint8_t> body(msg.size);
1438 if (_to_ui->read(&body[0], msg.size) != msg.size) {
1439 error << "Error reading from Plugin=>UI RingBuffer" << endmsg;
1443 sink(controller, msg.index, msg.size, msg.protocol, &body[0]);
1445 read_space -= sizeof(msg) + msg.size;
1450 LV2Plugin::work(uint32_t size, const void* data)
1452 return _impl->work_iface->work(
1453 _impl->instance->lv2_handle, work_respond, this, size, data);
1457 LV2Plugin::work_response(uint32_t size, const void* data)
1459 return _impl->work_iface->work_response(
1460 _impl->instance->lv2_handle, size, data);
1464 LV2Plugin::set_insert_info(const PluginInsert* insert)
1466 _insert_id = insert->id();
1470 LV2Plugin::set_state(const XMLNode& node, int version)
1473 const XMLProperty* prop;
1474 XMLNodeConstIterator iter;
1479 LocaleGuard lg(X_("POSIX"));
1481 if (node.name() != state_node_name()) {
1482 error << _("Bad node sent to LV2Plugin::set_state") << endmsg;
1486 #ifndef NO_PLUGIN_STATE
1488 if (version < 3000) {
1489 nodes = node.children("port");
1491 nodes = node.children("Port");
1494 for (iter = nodes.begin(); iter != nodes.end(); ++iter) {
1498 if ((prop = child->property("symbol")) != 0) {
1499 sym = prop->value().c_str();
1501 warning << _("LV2: port has no symbol, ignored") << endmsg;
1505 map<string, uint32_t>::iterator i = _port_indices.find(sym);
1507 if (i != _port_indices.end()) {
1508 port_id = i->second;
1510 warning << _("LV2: port has unknown index, ignored") << endmsg;
1514 if ((prop = child->property("value")) != 0) {
1515 value = prop->value().c_str();
1517 warning << _("LV2: port has no value, ignored") << endmsg;
1521 set_parameter(port_id, atof(value));
1525 if ((prop = node.property("state-dir")) != 0) {
1526 if (sscanf(prop->value().c_str(), "state%u", &_state_version) != 1) {
1527 error << string_compose(
1528 "LV2: failed to parse state version from \"%1\"",
1529 prop->value()) << endmsg;
1532 std::string state_file = Glib::build_filename(
1534 Glib::build_filename(prop->value(), "state.ttl"));
1536 LilvState* state = lilv_state_new_from_file(
1537 _world.world, _uri_map.urid_map(), NULL, state_file.c_str());
1539 lilv_state_restore(state, _impl->instance, NULL, NULL, 0, NULL);
1542 latency_compute_run();
1545 return Plugin::set_state(node, version);
1549 LV2Plugin::get_parameter_descriptor(uint32_t which, ParameterDescriptor& desc) const
1551 const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, which);
1553 error << string_compose("LV2: get descriptor of non-existent port %1", which)
1558 LilvNodes* portunits;
1559 LilvNode *def, *min, *max;
1560 lilv_port_get_range(_impl->plugin, port, &def, &min, &max);
1561 portunits = lilv_port_get_value(_impl->plugin, port, _world.units_unit);
1563 desc.integer_step = lilv_port_has_property(_impl->plugin, port, _world.lv2_integer);
1564 desc.toggled = lilv_port_has_property(_impl->plugin, port, _world.lv2_toggled);
1565 desc.logarithmic = lilv_port_has_property(_impl->plugin, port, _world.ext_logarithmic);
1566 desc.sr_dependent = lilv_port_has_property(_impl->plugin, port, _world.lv2_sampleRate);
1567 desc.label = lilv_node_as_string(lilv_port_get_name(_impl->plugin, port));
1568 desc.lower = min ? lilv_node_as_float(min) : 0.0f;
1569 desc.upper = max ? lilv_node_as_float(max) : 1.0f;
1570 desc.midinote = lilv_nodes_contains(portunits, _world.units_midiNote);
1572 if (desc.sr_dependent) {
1573 desc.lower *= _session.frame_rate ();
1574 desc.upper *= _session.frame_rate ();
1577 desc.min_unbound = false; // TODO: LV2 extension required
1578 desc.max_unbound = false; // TODO: LV2 extension required
1580 if (desc.integer_step) {
1582 desc.smallstep = 0.1;
1583 desc.largestep = 10.0;
1585 const float delta = desc.upper - desc.lower;
1586 desc.step = delta / 1000.0f;
1587 desc.smallstep = delta / 10000.0f;
1588 desc.largestep = delta / 10.0f;
1591 desc.enumeration = lilv_port_has_property(_impl->plugin, port, _world.lv2_enumeration);
1592 desc.scale_points = get_scale_points(which);
1594 lilv_node_free(def);
1595 lilv_node_free(min);
1596 lilv_node_free(max);
1597 lilv_nodes_free(portunits);
1603 LV2Plugin::describe_parameter(Evoral::Parameter which)
1605 if (( which.type() == PluginAutomation) && ( which.id() < parameter_count()) ) {
1607 if (lilv_port_has_property(_impl->plugin,
1608 lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.ext_notOnGUI)) {
1609 return X_("hidden");
1612 if (lilv_port_has_property(_impl->plugin,
1613 lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.lv2_freewheeling)) {
1614 return X_("hidden");
1617 if (lilv_port_has_property(_impl->plugin,
1618 lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.lv2_reportsLatency)) {
1619 return X_("latency");
1622 LilvNode* name = lilv_port_get_name(_impl->plugin,
1623 lilv_plugin_get_port_by_index(_impl->plugin, which.id()));
1624 string ret(lilv_node_as_string(name));
1625 lilv_node_free(name);
1633 LV2Plugin::signal_latency() const
1635 if (_latency_control_port) {
1636 return (framecnt_t)floor(*_latency_control_port);
1642 set<Evoral::Parameter>
1643 LV2Plugin::automatable() const
1645 set<Evoral::Parameter> ret;
1647 for (uint32_t i = 0; i < parameter_count(); ++i) {
1648 if (parameter_is_input(i) && parameter_is_control(i)) {
1649 ret.insert(ret.end(), Evoral::Parameter(PluginAutomation, 0, i));
1653 for (PropertyDescriptors::const_iterator p = _property_descriptors.begin();
1654 p != _property_descriptors.end();
1656 ret.insert(ret.end(), Evoral::Parameter(PluginPropertyAutomation, 0, p->first));
1662 LV2Plugin::activate()
1664 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 activate\n", name()));
1666 if (!_was_activated) {
1667 lilv_instance_activate(_impl->instance);
1668 _was_activated = true;
1673 LV2Plugin::deactivate()
1675 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 deactivate\n", name()));
1677 if (_was_activated) {
1678 lilv_instance_deactivate(_impl->instance);
1679 _was_activated = false;
1684 LV2Plugin::cleanup()
1686 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 cleanup\n", name()));
1690 lilv_instance_free(_impl->instance);
1691 _impl->instance = NULL;
1695 LV2Plugin::allocate_atom_event_buffers()
1697 /* reserve local scratch buffers for ATOM event-queues */
1698 const LilvPlugin* p = _impl->plugin;
1700 /* count non-MIDI atom event-ports
1701 * TODO: nicely ask drobilla to make a lilv_ call for that
1703 int count_atom_out = 0;
1704 int count_atom_in = 0;
1705 int minimumSize = 32768; // TODO use a per-port minimum-size
1706 for (uint32_t i = 0; i < lilv_plugin_get_num_ports(p); ++i) {
1707 const LilvPort* port = lilv_plugin_get_port_by_index(p, i);
1708 if (lilv_port_is_a(p, port, _world.atom_AtomPort)) {
1709 LilvNodes* buffer_types = lilv_port_get_value(
1710 p, port, _world.atom_bufferType);
1711 LilvNodes* atom_supports = lilv_port_get_value(
1712 p, port, _world.atom_supports);
1714 if (!lilv_nodes_contains(buffer_types, _world.atom_Sequence)
1715 || !lilv_nodes_contains(atom_supports, _world.midi_MidiEvent)) {
1716 if (lilv_port_is_a(p, port, _world.lv2_InputPort)) {
1719 if (lilv_port_is_a(p, port, _world.lv2_OutputPort)) {
1722 LilvNodes* min_size_v = lilv_port_get_value(_impl->plugin, port, _world.rsz_minimumSize);
1723 LilvNode* min_size = min_size_v ? lilv_nodes_get_first(min_size_v) : NULL;
1724 if (min_size && lilv_node_is_int(min_size)) {
1725 minimumSize = std::max(minimumSize, lilv_node_as_int(min_size));
1727 lilv_nodes_free(min_size_v);
1729 lilv_nodes_free(buffer_types);
1730 lilv_nodes_free(atom_supports);
1734 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 need buffers for %2 atom-in and %3 atom-out event-ports\n",
1735 name(), count_atom_in, count_atom_out));
1737 const int total_atom_buffers = (count_atom_in + count_atom_out);
1738 if (_atom_ev_buffers || total_atom_buffers == 0) {
1742 DEBUG_TRACE(DEBUG::LV2, string_compose("allocate %1 atom_ev_buffers of %d bytes\n", total_atom_buffers, minimumSize));
1743 _atom_ev_buffers = (LV2_Evbuf**) malloc((total_atom_buffers + 1) * sizeof(LV2_Evbuf*));
1744 for (int i = 0; i < total_atom_buffers; ++i ) {
1745 _atom_ev_buffers[i] = lv2_evbuf_new(minimumSize, LV2_EVBUF_ATOM,
1746 _uri_map.urids.atom_Chunk, _uri_map.urids.atom_Sequence);
1748 _atom_ev_buffers[total_atom_buffers] = 0;
1752 /** Write an ardour position/time/tempo/meter as an LV2 event.
1753 * @return true on success.
1756 write_position(LV2_Atom_Forge* forge,
1758 const TempoMetric& t,
1759 Timecode::BBT_Time& bbt,
1761 framepos_t position,
1764 const URIMap::URIDs& urids = URIMap::instance().urids;
1766 uint8_t pos_buf[256];
1767 lv2_atom_forge_set_buffer(forge, pos_buf, sizeof(pos_buf));
1768 LV2_Atom_Forge_Frame frame;
1769 #ifdef HAVE_LV2_1_10_0
1770 lv2_atom_forge_object(forge, &frame, 1, urids.time_Position);
1771 lv2_atom_forge_key(forge, urids.time_frame);
1772 lv2_atom_forge_long(forge, position);
1773 lv2_atom_forge_key(forge, urids.time_speed);
1774 lv2_atom_forge_float(forge, speed);
1775 lv2_atom_forge_key(forge, urids.time_barBeat);
1776 lv2_atom_forge_float(forge, bbt.beats - 1 +
1777 (bbt.ticks / Timecode::BBT_Time::ticks_per_beat));
1778 lv2_atom_forge_key(forge, urids.time_bar);
1779 lv2_atom_forge_long(forge, bbt.bars - 1);
1780 lv2_atom_forge_key(forge, urids.time_beatUnit);
1781 lv2_atom_forge_int(forge, t.meter().note_divisor());
1782 lv2_atom_forge_key(forge, urids.time_beatsPerBar);
1783 lv2_atom_forge_float(forge, t.meter().divisions_per_bar());
1784 lv2_atom_forge_key(forge, urids.time_beatsPerMinute);
1785 lv2_atom_forge_float(forge, t.tempo().beats_per_minute());
1787 lv2_atom_forge_blank(forge, &frame, 1, urids.time_Position);
1788 lv2_atom_forge_property_head(forge, urids.time_frame, 0);
1789 lv2_atom_forge_long(forge, position);
1790 lv2_atom_forge_property_head(forge, urids.time_speed, 0);
1791 lv2_atom_forge_float(forge, speed);
1792 lv2_atom_forge_property_head(forge, urids.time_barBeat, 0);
1793 lv2_atom_forge_float(forge, bbt.beats - 1 +
1794 (bbt.ticks / Timecode::BBT_Time::ticks_per_beat));
1795 lv2_atom_forge_property_head(forge, urids.time_bar, 0);
1796 lv2_atom_forge_long(forge, bbt.bars - 1);
1797 lv2_atom_forge_property_head(forge, urids.time_beatUnit, 0);
1798 lv2_atom_forge_int(forge, t.meter().note_divisor());
1799 lv2_atom_forge_property_head(forge, urids.time_beatsPerBar, 0);
1800 lv2_atom_forge_float(forge, t.meter().divisions_per_bar());
1801 lv2_atom_forge_property_head(forge, urids.time_beatsPerMinute, 0);
1802 lv2_atom_forge_float(forge, t.tempo().beats_per_minute());
1805 LV2_Evbuf_Iterator end = lv2_evbuf_end(buf);
1806 const LV2_Atom* const atom = (const LV2_Atom*)pos_buf;
1807 return lv2_evbuf_write(&end, offset, 0, atom->type, atom->size,
1808 (const uint8_t*)(atom + 1));
1812 LV2Plugin::connect_and_run(BufferSet& bufs,
1813 ChanMapping in_map, ChanMapping out_map,
1814 pframes_t nframes, framecnt_t offset)
1816 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 run %2 offset %3\n", name(), nframes, offset));
1817 Plugin::connect_and_run(bufs, in_map, out_map, nframes, offset);
1819 cycles_t then = get_cycles();
1821 TempoMap& tmap = _session.tempo_map();
1822 Metrics::const_iterator metric_i = tmap.metrics_end();
1823 TempoMetric tmetric = tmap.metric_at(_session.transport_frame(), &metric_i);
1825 if (_freewheel_control_port) {
1826 *_freewheel_control_port = _session.engine().freewheeling();
1829 if (_bpm_control_port) {
1830 *_bpm_control_port = tmetric.tempo().beats_per_minute();
1833 ChanCount bufs_count;
1834 bufs_count.set(DataType::AUDIO, 1);
1835 bufs_count.set(DataType::MIDI, 1);
1836 BufferSet& silent_bufs = _session.get_silent_buffers(bufs_count);
1837 BufferSet& scratch_bufs = _session.get_scratch_buffers(bufs_count);
1838 uint32_t const num_ports = parameter_count();
1839 uint32_t const nil_index = std::numeric_limits<uint32_t>::max();
1841 uint32_t audio_in_index = 0;
1842 uint32_t audio_out_index = 0;
1843 uint32_t midi_in_index = 0;
1844 uint32_t midi_out_index = 0;
1845 uint32_t atom_port_index = 0;
1846 for (uint32_t port_index = 0; port_index < num_ports; ++port_index) {
1848 uint32_t index = nil_index;
1849 PortFlags flags = _port_flags[port_index];
1851 if (flags & PORT_AUDIO) {
1852 if (flags & PORT_INPUT) {
1853 index = in_map.get(DataType::AUDIO, audio_in_index++, &valid);
1855 ? bufs.get_audio(index).data(offset)
1856 : silent_bufs.get_audio(0).data(offset);
1858 index = out_map.get(DataType::AUDIO, audio_out_index++, &valid);
1860 ? bufs.get_audio(index).data(offset)
1861 : scratch_bufs.get_audio(0).data(offset);
1863 } else if (flags & (PORT_EVENT|PORT_SEQUENCE)) {
1864 /* FIXME: The checks here for bufs.count().n_midi() > index shouldn't
1865 be necessary, but the mapping is illegal in some cases. Ideally
1866 that should be fixed, but this is easier...
1868 if (flags & PORT_MIDI) {
1869 if (flags & PORT_INPUT) {
1870 index = in_map.get(DataType::MIDI, midi_in_index++, &valid);
1872 index = out_map.get(DataType::MIDI, midi_out_index++, &valid);
1874 if (valid && bufs.count().n_midi() > index) {
1875 /* Note, ensure_lv2_bufsize() is not RT safe!
1876 * However free()/alloc() is only called if a
1877 * plugin requires a rsz:minimumSize buffersize
1878 * and the existing buffer if smaller.
1880 bufs.ensure_lv2_bufsize((flags & PORT_INPUT), index, _port_minimumSize[port_index]);
1881 _ev_buffers[port_index] = bufs.get_lv2_midi(
1882 (flags & PORT_INPUT), index, (flags & PORT_EVENT));
1884 } else if ((flags & PORT_POSITION) && (flags & PORT_INPUT)) {
1885 lv2_evbuf_reset(_atom_ev_buffers[atom_port_index], true);
1886 _ev_buffers[port_index] = _atom_ev_buffers[atom_port_index++];
1890 if (valid && (flags & PORT_INPUT)) {
1891 Timecode::BBT_Time bbt;
1892 if ((flags & PORT_POSITION)) {
1893 if (_session.transport_frame() != _next_cycle_start ||
1894 _session.transport_speed() != _next_cycle_speed) {
1895 // Transport has changed, write position at cycle start
1896 tmap.bbt_time(_session.transport_frame(), bbt);
1897 write_position(&_impl->forge, _ev_buffers[port_index],
1898 tmetric, bbt, _session.transport_speed(),
1899 _session.transport_frame(), 0);
1903 // Get MIDI iterator range (empty range if no MIDI)
1904 MidiBuffer::iterator m = (index != nil_index)
1905 ? bufs.get_midi(index).begin()
1906 : silent_bufs.get_midi(0).end();
1907 MidiBuffer::iterator m_end = (index != nil_index)
1908 ? bufs.get_midi(index).end()
1911 // Now merge MIDI and any transport events into the buffer
1912 const uint32_t type = _uri_map.urids.midi_MidiEvent;
1913 const framepos_t tend = _session.transport_frame() + nframes;
1915 while (m != m_end || (metric_i != tmap.metrics_end() &&
1916 (*metric_i)->frame() < tend)) {
1917 MetricSection* metric = (metric_i != tmap.metrics_end())
1919 if (m != m_end && (!metric || metric->frame() > (*m).time())) {
1920 const Evoral::MIDIEvent<framepos_t> ev(*m, false);
1921 LV2_Evbuf_Iterator eend = lv2_evbuf_end(_ev_buffers[port_index]);
1922 lv2_evbuf_write(&eend, ev.time(), 0, type, ev.size(), ev.buffer());
1925 tmetric.set_metric(metric);
1926 bbt = metric->start();
1927 write_position(&_impl->forge, _ev_buffers[port_index],
1928 tmetric, bbt, _session.transport_speed(),
1930 metric->frame() - _session.transport_frame());
1934 } else if (!valid) {
1935 // Nothing we understand or care about, connect to scratch
1936 // see note for midi-buffer size above
1937 scratch_bufs.ensure_lv2_bufsize((flags & PORT_INPUT),
1938 0, _port_minimumSize[port_index]);
1939 _ev_buffers[port_index] = scratch_bufs.get_lv2_midi(
1940 (flags & PORT_INPUT), 0, (flags & PORT_EVENT));
1943 buf = lv2_evbuf_get_buffer(_ev_buffers[port_index]);
1945 continue; // Control port, leave buffer alone
1947 lilv_instance_connect_port(_impl->instance, port_index, buf);
1950 // Read messages from UI and push into appropriate buffers
1952 uint32_t read_space = _from_ui->read_space();
1953 while (read_space > sizeof(UIMessage)) {
1955 if (_from_ui->read((uint8_t*)&msg, sizeof(msg)) != sizeof(msg)) {
1956 error << "Error reading from UI=>Plugin RingBuffer" << endmsg;
1959 vector<uint8_t> body(msg.size);
1960 if (_from_ui->read(&body[0], msg.size) != msg.size) {
1961 error << "Error reading from UI=>Plugin RingBuffer" << endmsg;
1964 if (msg.protocol == URIMap::instance().urids.atom_eventTransfer) {
1965 LV2_Evbuf* buf = _ev_buffers[msg.index];
1966 LV2_Evbuf_Iterator i = lv2_evbuf_end(buf);
1967 const LV2_Atom* const atom = (const LV2_Atom*)&body[0];
1968 if (!lv2_evbuf_write(&i, nframes, 0, atom->type, atom->size,
1969 (const uint8_t*)(atom + 1))) {
1970 error << "Failed to write data to LV2 event buffer\n";
1973 error << "Received unknown message type from UI" << endmsg;
1975 read_space -= sizeof(UIMessage) + msg.size;
1982 for (uint32_t port_index = 0; port_index < num_ports; ++port_index) {
1983 PortFlags flags = _port_flags[port_index];
1986 /* TODO ask drobilla about comment
1987 * "Make Ardour event buffers generic so plugins can communicate"
1988 * in libs/ardour/buffer_set.cc:310
1990 * ideally the user could choose which of the following two modes
1991 * to use (e.g. instrument/effect chains MIDI OUT vs MIDI TRHU).
1993 * This implementation follows the discussion on IRC Mar 16 2013 16:47 UTC
1994 * 16:51 < drobilla> rgareus: [..] i.e always replace with MIDI output [of LV2 plugin] if it's there
1995 * 16:52 < drobilla> rgareus: That would probably be good enough [..] to make users not complain
1996 * for quite a while at least ;)
1998 // copy output of LV2 plugin's MIDI port to Ardour MIDI buffers -- MIDI OUT
1999 if ((flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE|PORT_MIDI))) {
2000 const uint32_t buf_index = out_map.get(
2001 DataType::MIDI, midi_out_index++, &valid);
2003 bufs.forward_lv2_midi(_ev_buffers[port_index], buf_index);
2006 // Flush MIDI (write back to Ardour MIDI buffers) -- MIDI THRU
2007 else if ((flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE))) {
2008 const uint32_t buf_index = out_map.get(
2009 DataType::MIDI, midi_out_index++, &valid);
2011 bufs.flush_lv2_midi(true, buf_index);
2016 // Write messages to UI
2017 if ((_to_ui || _patch_port_out_index != (uint32_t)-1) &&
2018 (flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE))) {
2019 LV2_Evbuf* buf = _ev_buffers[port_index];
2020 for (LV2_Evbuf_Iterator i = lv2_evbuf_begin(buf);
2021 lv2_evbuf_is_valid(i);
2022 i = lv2_evbuf_next(i)) {
2023 uint32_t frames, subframes, type, size;
2025 lv2_evbuf_get(i, &frames, &subframes, &type, &size, &data);
2027 // Intercept patch change messages to emit PropertyChanged signal
2028 if ((flags & PORT_PATCHMSG)) {
2029 LV2_Atom* atom = (LV2_Atom*)(data - sizeof(LV2_Atom));
2030 if (atom->type == _uri_map.urids.atom_Blank ||
2031 atom->type == _uri_map.urids.atom_Object) {
2032 LV2_Atom_Object* obj = (LV2_Atom_Object*)atom;
2033 if (obj->body.otype == _uri_map.urids.patch_Set) {
2034 const LV2_Atom* property = NULL;
2035 const LV2_Atom* value = NULL;
2036 lv2_atom_object_get(obj,
2037 _uri_map.urids.patch_property, &property,
2038 _uri_map.urids.patch_value, &value,
2041 if (!property || !value ||
2042 property->type != _uri_map.urids.atom_URID ||
2043 value->type != _uri_map.urids.atom_Path) {
2044 std::cerr << "warning: patch:Set for unknown property" << std::endl;
2048 const uint32_t prop_id = ((const LV2_Atom_URID*)property)->body;
2049 const char* path = (const char*)LV2_ATOM_BODY_CONST(value);
2051 // Emit PropertyChanged signal for UI
2052 // TODO: This should emit the control's Changed signal
2053 PropertyChanged(prop_id, Variant(Variant::PATH, path));
2058 if (!_to_ui) continue;
2059 write_to_ui(port_index, URIMap::instance().urids.atom_eventTransfer,
2060 size + sizeof(LV2_Atom),
2061 data - sizeof(LV2_Atom));
2066 cycles_t now = get_cycles();
2067 set_cycles((uint32_t)(now - then));
2069 // Update expected transport information for next cycle so we can detect changes
2070 _next_cycle_speed = _session.transport_speed();
2071 _next_cycle_start = _session.transport_frame() + (nframes * _next_cycle_speed);
2077 LV2Plugin::parameter_is_control(uint32_t param) const
2079 assert(param < _port_flags.size());
2080 return _port_flags[param] & PORT_CONTROL;
2084 LV2Plugin::parameter_is_audio(uint32_t param) const
2086 assert(param < _port_flags.size());
2087 return _port_flags[param] & PORT_AUDIO;
2091 LV2Plugin::parameter_is_event(uint32_t param) const
2093 assert(param < _port_flags.size());
2094 return _port_flags[param] & PORT_EVENT;
2098 LV2Plugin::parameter_is_output(uint32_t param) const
2100 assert(param < _port_flags.size());
2101 return _port_flags[param] & PORT_OUTPUT;
2105 LV2Plugin::parameter_is_input(uint32_t param) const
2107 assert(param < _port_flags.size());
2108 return _port_flags[param] & PORT_INPUT;
2112 LV2Plugin::print_parameter(uint32_t param, char* buf, uint32_t len) const
2115 if (param < parameter_count()) {
2116 snprintf(buf, len, "%.3f", get_parameter(param));
2123 boost::shared_ptr<ScalePoints>
2124 LV2Plugin::get_scale_points(uint32_t port_index) const
2126 const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, port_index);
2127 LilvScalePoints* points = lilv_port_get_scale_points(_impl->plugin, port);
2129 boost::shared_ptr<ScalePoints> ret;
2134 ret = boost::shared_ptr<ScalePoints>(new ScalePoints());
2136 LILV_FOREACH(scale_points, i, points) {
2137 const LilvScalePoint* p = lilv_scale_points_get(points, i);
2138 const LilvNode* label = lilv_scale_point_get_label(p);
2139 const LilvNode* value = lilv_scale_point_get_value(p);
2140 if (label && (lilv_node_is_float(value) || lilv_node_is_int(value))) {
2141 ret->insert(make_pair(lilv_node_as_string(label),
2142 lilv_node_as_float(value)));
2146 lilv_scale_points_free(points);
2151 LV2Plugin::run(pframes_t nframes)
2153 uint32_t const N = parameter_count();
2154 for (uint32_t i = 0; i < N; ++i) {
2155 if (parameter_is_control(i) && parameter_is_input(i)) {
2156 _control_data[i] = _shadow_data[i];
2160 lilv_instance_run(_impl->instance, nframes);
2162 if (_impl->work_iface) {
2163 _worker->emit_responses();
2164 if (_impl->work_iface->end_run) {
2165 _impl->work_iface->end_run(_impl->instance->lv2_handle);
2171 LV2Plugin::latency_compute_run()
2173 if (!_latency_control_port) {
2177 // Run the plugin so that it can set its latency parameter
2179 bool was_activated = _was_activated;
2182 uint32_t port_index = 0;
2183 uint32_t in_index = 0;
2184 uint32_t out_index = 0;
2186 // this is done in the main thread. non realtime.
2187 const framecnt_t bufsize = _engine.samples_per_cycle();
2188 float *buffer = (float*) malloc(_engine.samples_per_cycle() * sizeof(float));
2190 memset(buffer, 0, sizeof(float) * bufsize);
2192 // FIXME: Ensure plugins can handle in-place processing
2196 while (port_index < parameter_count()) {
2197 if (parameter_is_audio(port_index)) {
2198 if (parameter_is_input(port_index)) {
2199 lilv_instance_connect_port(_impl->instance, port_index, buffer);
2201 } else if (parameter_is_output(port_index)) {
2202 lilv_instance_connect_port(_impl->instance, port_index, buffer);
2211 if (was_activated) {
2218 LV2Plugin::Impl::designated_input (const char* uri, void** bufptrs[], void** bufptr)
2220 const LilvPort* port = NULL;
2221 LilvNode* designation = lilv_new_uri(_world.world, uri);
2222 port = lilv_plugin_get_port_by_designation(
2223 plugin, _world.lv2_InputPort, designation);
2224 lilv_node_free(designation);
2226 bufptrs[lilv_port_get_index(plugin, port)] = bufptr;
2231 static bool lv2_filter (const string& str, void* /*arg*/)
2233 /* Not a dotfile, has a prefix before a period, suffix is "lv2" */
2235 return str[0] != '.' && (str.length() > 3 && str.find (".lv2") == (str.length() - 4));
2239 LV2World::LV2World()
2240 : world(lilv_world_new())
2241 , _bundle_checked(false)
2243 lilv_world_load_all(world);
2245 atom_AtomPort = lilv_new_uri(world, LV2_ATOM__AtomPort);
2246 atom_Chunk = lilv_new_uri(world, LV2_ATOM__Chunk);
2247 atom_Sequence = lilv_new_uri(world, LV2_ATOM__Sequence);
2248 atom_bufferType = lilv_new_uri(world, LV2_ATOM__bufferType);
2249 atom_supports = lilv_new_uri(world, LV2_ATOM__supports);
2250 atom_eventTransfer = lilv_new_uri(world, LV2_ATOM__eventTransfer);
2251 ev_EventPort = lilv_new_uri(world, LILV_URI_EVENT_PORT);
2252 ext_logarithmic = lilv_new_uri(world, LV2_PORT_PROPS__logarithmic);
2253 ext_notOnGUI = lilv_new_uri(world, LV2_PORT_PROPS__notOnGUI);
2254 lv2_AudioPort = lilv_new_uri(world, LILV_URI_AUDIO_PORT);
2255 lv2_ControlPort = lilv_new_uri(world, LILV_URI_CONTROL_PORT);
2256 lv2_InputPort = lilv_new_uri(world, LILV_URI_INPUT_PORT);
2257 lv2_OutputPort = lilv_new_uri(world, LILV_URI_OUTPUT_PORT);
2258 lv2_inPlaceBroken = lilv_new_uri(world, LV2_CORE__inPlaceBroken);
2259 lv2_integer = lilv_new_uri(world, LV2_CORE__integer);
2260 lv2_default = lilv_new_uri(world, LV2_CORE__default);
2261 lv2_minimum = lilv_new_uri(world, LV2_CORE__minimum);
2262 lv2_maximum = lilv_new_uri(world, LV2_CORE__maximum);
2263 lv2_reportsLatency = lilv_new_uri(world, LV2_CORE__reportsLatency);
2264 lv2_sampleRate = lilv_new_uri(world, LV2_CORE__sampleRate);
2265 lv2_toggled = lilv_new_uri(world, LV2_CORE__toggled);
2266 lv2_enumeration = lilv_new_uri(world, LV2_CORE__enumeration);
2267 lv2_freewheeling = lilv_new_uri(world, LV2_CORE__freeWheeling);
2268 midi_MidiEvent = lilv_new_uri(world, LILV_URI_MIDI_EVENT);
2269 rdfs_comment = lilv_new_uri(world, LILV_NS_RDFS "comment");
2270 rdfs_label = lilv_new_uri(world, LILV_NS_RDFS "label");
2271 rdfs_range = lilv_new_uri(world, LILV_NS_RDFS "range");
2272 rsz_minimumSize = lilv_new_uri(world, LV2_RESIZE_PORT__minimumSize);
2273 time_Position = lilv_new_uri(world, LV2_TIME__Position);
2274 ui_GtkUI = lilv_new_uri(world, LV2_UI__GtkUI);
2275 ui_external = lilv_new_uri(world, "http://lv2plug.in/ns/extensions/ui#external");
2276 ui_externalkx = lilv_new_uri(world, "http://kxstudio.sf.net/ns/lv2ext/external-ui#Widget");
2277 units_unit = lilv_new_uri(world, "http://lv2plug.in/ns/extensions/units#unit");
2278 units_midiNote = lilv_new_uri(world, "http://lv2plug.in/ns/extensions/units#midiNote");
2279 patch_writable = lilv_new_uri(world, LV2_PATCH__writable);
2280 patch_Message = lilv_new_uri(world, LV2_PATCH__Message);
2283 LV2World::~LV2World()
2285 lilv_node_free(patch_Message);
2286 lilv_node_free(patch_writable);
2287 lilv_node_free(units_midiNote);
2288 lilv_node_free(units_unit);
2289 lilv_node_free(ui_externalkx);
2290 lilv_node_free(ui_external);
2291 lilv_node_free(ui_GtkUI);
2292 lilv_node_free(time_Position);
2293 lilv_node_free(rsz_minimumSize);
2294 lilv_node_free(rdfs_comment);
2295 lilv_node_free(rdfs_label);
2296 lilv_node_free(rdfs_range);
2297 lilv_node_free(midi_MidiEvent);
2298 lilv_node_free(lv2_enumeration);
2299 lilv_node_free(lv2_freewheeling);
2300 lilv_node_free(lv2_toggled);
2301 lilv_node_free(lv2_sampleRate);
2302 lilv_node_free(lv2_reportsLatency);
2303 lilv_node_free(lv2_integer);
2304 lilv_node_free(lv2_inPlaceBroken);
2305 lilv_node_free(lv2_OutputPort);
2306 lilv_node_free(lv2_InputPort);
2307 lilv_node_free(lv2_ControlPort);
2308 lilv_node_free(lv2_AudioPort);
2309 lilv_node_free(ext_notOnGUI);
2310 lilv_node_free(ext_logarithmic);
2311 lilv_node_free(ev_EventPort);
2312 lilv_node_free(atom_supports);
2313 lilv_node_free(atom_eventTransfer);
2314 lilv_node_free(atom_bufferType);
2315 lilv_node_free(atom_Sequence);
2316 lilv_node_free(atom_Chunk);
2317 lilv_node_free(atom_AtomPort);
2318 lilv_world_free(world);
2322 LV2World::load_bundled_plugins(bool verbose)
2324 if (!_bundle_checked) {
2326 cout << "Scanning folders for bundled LV2s: " << ARDOUR::lv2_bundled_search_path().to_string() << endl;
2329 vector<string> plugin_objects;
2330 find_paths_matching_filter (plugin_objects, ARDOUR::lv2_bundled_search_path(), lv2_filter, 0, true, true, true);
2331 for ( vector<string>::iterator x = plugin_objects.begin(); x != plugin_objects.end (); ++x) {
2332 #ifdef PLATFORM_WINDOWS
2333 string uri = "file:///" + *x + "/";
2335 string uri = "file://" + *x + "/";
2337 LilvNode *node = lilv_new_uri(world, uri.c_str());
2338 lilv_world_load_bundle(world, node);
2339 lilv_node_free(node);
2342 _bundle_checked = true;
2346 LV2PluginInfo::LV2PluginInfo (const char* plugin_uri)
2349 _plugin_uri = strdup(plugin_uri);
2352 LV2PluginInfo::~LV2PluginInfo()
2359 LV2PluginInfo::load(Session& session)
2363 const LilvPlugins* plugins = lilv_world_get_all_plugins(_world.world);
2364 LilvNode* uri = lilv_new_uri(_world.world, _plugin_uri);
2365 if (!uri) { throw failed_constructor(); }
2366 const LilvPlugin* lp = lilv_plugins_get_by_uri(plugins, uri);
2367 if (!lp) { throw failed_constructor(); }
2368 plugin.reset(new LV2Plugin(session.engine(), session, lp, session.frame_rate()));
2369 lilv_node_free(uri);
2370 plugin->set_info(PluginInfoPtr(shared_from_this ()));
2372 } catch (failed_constructor& err) {
2373 return PluginPtr((Plugin*)0);
2380 LV2PluginInfo::discover()
2383 world.load_bundled_plugins();
2384 _world.load_bundled_plugins(true);
2386 PluginInfoList* plugs = new PluginInfoList;
2387 const LilvPlugins* plugins = lilv_world_get_all_plugins(world.world);
2389 if (!Config->get_show_plugin_scan_window()) {
2390 info << "LV2: Discovering " << lilv_plugins_size(plugins) << " plugins" << endmsg;
2393 LILV_FOREACH(plugins, i, plugins) {
2394 const LilvPlugin* p = lilv_plugins_get(plugins, i);
2395 const LilvNode* pun = lilv_plugin_get_uri(p);
2397 LV2PluginInfoPtr info(new LV2PluginInfo(lilv_node_as_string(pun)));
2399 LilvNode* name = lilv_plugin_get_name(p);
2400 if (!name || !lilv_plugin_get_port_by_index(p, 0)) {
2401 warning << "Ignoring invalid LV2 plugin "
2402 << lilv_node_as_string(lilv_plugin_get_uri(p))
2409 info->name = string(lilv_node_as_string(name));
2410 lilv_node_free(name);
2411 ARDOUR::PluginScanMessage(_("LV2"), info->name, false);
2413 const LilvPluginClass* pclass = lilv_plugin_get_class(p);
2414 const LilvNode* label = lilv_plugin_class_get_label(pclass);
2415 info->category = lilv_node_as_string(label);
2417 LilvNode* author_name = lilv_plugin_get_author_name(p);
2418 info->creator = author_name ? string(lilv_node_as_string(author_name)) : "Unknown";
2419 lilv_node_free(author_name);
2421 info->path = "/NOPATH"; // Meaningless for LV2
2423 /* count atom-event-ports that feature
2424 * atom:supports <http://lv2plug.in/ns/ext/midi#MidiEvent>
2426 * TODO: nicely ask drobilla to make a lilv_ call for that
2428 int count_midi_out = 0;
2429 int count_midi_in = 0;
2430 for (uint32_t i = 0; i < lilv_plugin_get_num_ports(p); ++i) {
2431 const LilvPort* port = lilv_plugin_get_port_by_index(p, i);
2432 if (lilv_port_is_a(p, port, world.atom_AtomPort)) {
2433 LilvNodes* buffer_types = lilv_port_get_value(
2434 p, port, world.atom_bufferType);
2435 LilvNodes* atom_supports = lilv_port_get_value(
2436 p, port, world.atom_supports);
2438 if (lilv_nodes_contains(buffer_types, world.atom_Sequence)
2439 && lilv_nodes_contains(atom_supports, world.midi_MidiEvent)) {
2440 if (lilv_port_is_a(p, port, world.lv2_InputPort)) {
2443 if (lilv_port_is_a(p, port, world.lv2_OutputPort)) {
2447 lilv_nodes_free(buffer_types);
2448 lilv_nodes_free(atom_supports);
2452 info->n_inputs.set_audio(
2453 lilv_plugin_get_num_ports_of_class(
2454 p, world.lv2_InputPort, world.lv2_AudioPort, NULL));
2455 info->n_inputs.set_midi(
2456 lilv_plugin_get_num_ports_of_class(
2457 p, world.lv2_InputPort, world.ev_EventPort, NULL)
2460 info->n_outputs.set_audio(
2461 lilv_plugin_get_num_ports_of_class(
2462 p, world.lv2_OutputPort, world.lv2_AudioPort, NULL));
2463 info->n_outputs.set_midi(
2464 lilv_plugin_get_num_ports_of_class(
2465 p, world.lv2_OutputPort, world.ev_EventPort, NULL)
2468 info->unique_id = lilv_node_as_uri(lilv_plugin_get_uri(p));
2469 info->index = 0; // Meaningless for LV2
2471 plugs->push_back(info);