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 <giomm/file.h>
30 #include <glib/gprintf.h>
33 #include <boost/utility.hpp>
35 #include "pbd/pathscanner.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/lv2_bundled_search_path.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"
70 #include "lv2/lv2plug.in/ns/ext/buf-size/buf-size.h"
71 #include "lv2/lv2plug.in/ns/ext/options/options.h"
74 #include "lv2_evbuf.h"
77 #include <suil/suil.h>
80 /** The number of MIDI buffers that will fit in a UI/worker comm buffer.
81 This needs to be roughly the number of cycles the UI will get around to
82 actually processing the traffic. Lower values are flakier but save memory.
84 static const size_t NBUFS = 4;
87 using namespace ARDOUR;
90 URIMap LV2Plugin::_uri_map;
92 LV2Plugin::URIDs LV2Plugin::urids = {
93 _uri_map.uri_to_id(LV2_ATOM__Chunk),
94 _uri_map.uri_to_id(LV2_ATOM__Path),
95 _uri_map.uri_to_id(LV2_ATOM__Sequence),
96 _uri_map.uri_to_id(LV2_ATOM__eventTransfer),
97 _uri_map.uri_to_id(LV2_LOG__Error),
98 _uri_map.uri_to_id(LV2_LOG__Note),
99 _uri_map.uri_to_id(LV2_LOG__Warning),
100 _uri_map.uri_to_id(LV2_MIDI__MidiEvent),
101 _uri_map.uri_to_id(LV2_TIME__Position),
102 _uri_map.uri_to_id(LV2_TIME__bar),
103 _uri_map.uri_to_id(LV2_TIME__barBeat),
104 _uri_map.uri_to_id(LV2_TIME__beatUnit),
105 _uri_map.uri_to_id(LV2_TIME__beatsPerBar),
106 _uri_map.uri_to_id(LV2_TIME__beatsPerMinute),
107 _uri_map.uri_to_id(LV2_TIME__frame),
108 _uri_map.uri_to_id(LV2_TIME__speed)
111 class LV2World : boost::noncopyable {
116 void load_bundled_plugins();
120 LilvNode* atom_AtomPort;
121 LilvNode* atom_Chunk;
122 LilvNode* atom_Sequence;
123 LilvNode* atom_bufferType;
124 LilvNode* atom_eventTransfer;
125 LilvNode* atom_supports;
126 LilvNode* ev_EventPort;
127 LilvNode* ext_logarithmic;
128 LilvNode* ext_notOnGUI;
129 LilvNode* lv2_AudioPort;
130 LilvNode* lv2_ControlPort;
131 LilvNode* lv2_InputPort;
132 LilvNode* lv2_OutputPort;
133 LilvNode* lv2_enumeration;
134 LilvNode* lv2_freewheeling;
135 LilvNode* lv2_inPlaceBroken;
136 LilvNode* lv2_integer;
137 LilvNode* lv2_reportsLatency;
138 LilvNode* lv2_sampleRate;
139 LilvNode* lv2_toggled;
140 LilvNode* midi_MidiEvent;
141 LilvNode* rdfs_comment;
142 LilvNode* rsz_minimumSize;
143 LilvNode* time_Position;
145 LilvNode* ui_external;
146 LilvNode* ui_externalkx;
149 bool _bundle_checked;
152 static LV2World _world;
154 /* worker extension */
156 /** Called by the plugin to schedule non-RT work. */
157 static LV2_Worker_Status
158 work_schedule(LV2_Worker_Schedule_Handle handle,
162 LV2Plugin* plugin = (LV2Plugin*)handle;
163 if (plugin->session().engine().freewheeling()) {
164 // Freewheeling, do the work immediately in this (audio) thread
165 return (LV2_Worker_Status)plugin->work(size, data);
167 // Enqueue message for the worker thread
168 return plugin->worker()->schedule(size, data) ?
169 LV2_WORKER_SUCCESS : LV2_WORKER_ERR_UNKNOWN;
173 /** Called by the plugin to respond to non-RT work. */
174 static LV2_Worker_Status
175 work_respond(LV2_Worker_Respond_Handle handle,
179 LV2Plugin* plugin = (LV2Plugin*)handle;
180 if (plugin->session().engine().freewheeling()) {
181 // Freewheeling, respond immediately in this (audio) thread
182 return (LV2_Worker_Status)plugin->work_response(size, data);
184 // Enqueue response for the worker
185 return plugin->worker()->respond(size, data) ?
186 LV2_WORKER_SUCCESS : LV2_WORKER_ERR_UNKNOWN;
193 log_vprintf(LV2_Log_Handle /*handle*/,
199 const int ret = g_vasprintf(&str, fmt, args);
200 if (type == LV2Plugin::urids.log_Error) {
201 error << str << endmsg;
202 } else if (type == LV2Plugin::urids.log_Warning) {
203 warning << str << endmsg;
204 } else if (type == LV2Plugin::urids.log_Note) {
205 info << str << endmsg;
207 // TODO: Toggleable log:Trace message support
212 log_printf(LV2_Log_Handle handle,
214 const char* fmt, ...)
218 const int ret = log_vprintf(handle, type, fmt, args);
223 struct LV2Plugin::Impl {
224 Impl() : plugin(0), ui(0), ui_type(0), name(0), author(0), instance(0)
229 /** Find the LV2 input port with the given designation.
230 * If found, bufptrs[port_index] will be set to bufptr.
232 const LilvPort* designated_input (const char* uri, void** bufptrs[], void** bufptr);
234 const LilvPlugin* plugin;
236 const LilvNode* ui_type;
239 LilvInstance* instance;
240 const LV2_Worker_Interface* work_iface;
242 LV2_Atom_Forge forge;
245 LV2Plugin::LV2Plugin (AudioEngine& engine,
247 const void* c_plugin,
249 : Plugin (engine, session)
256 init(c_plugin, rate);
259 LV2Plugin::LV2Plugin (const LV2Plugin& other)
265 , _insert_id(other._insert_id)
267 init(other._impl->plugin, other._sample_rate);
269 for (uint32_t i = 0; i < parameter_count(); ++i) {
270 _control_data[i] = other._shadow_data[i];
271 _shadow_data[i] = other._shadow_data[i];
276 LV2Plugin::init(const void* c_plugin, framecnt_t rate)
278 DEBUG_TRACE(DEBUG::LV2, "init\n");
280 _impl->plugin = (const LilvPlugin*)c_plugin;
282 _impl->ui_type = NULL;
287 _atom_ev_buffers = 0;
289 _bpm_control_port = 0;
290 _freewheel_control_port = 0;
291 _latency_control_port = 0;
292 _next_cycle_start = std::numeric_limits<framepos_t>::max();
293 _next_cycle_speed = 1.0;
294 _block_length = _engine.samples_per_cycle();
295 _seq_size = _engine.raw_buffer_size(DataType::MIDI);
297 _was_activated = false;
298 _has_state_interface = false;
300 _instance_access_feature.URI = "http://lv2plug.in/ns/ext/instance-access";
301 _data_access_feature.URI = "http://lv2plug.in/ns/ext/data-access";
302 _make_path_feature.URI = LV2_STATE__makePath;
303 _log_feature.URI = LV2_LOG__log;
304 _work_schedule_feature.URI = LV2_WORKER__schedule;
305 _work_schedule_feature.data = NULL;
306 _def_state_feature.URI = LV2_STATE_PREFIX "loadDefaultState"; // Post LV2-1.2.0
307 _def_state_feature.data = NULL;
309 const LilvPlugin* plugin = _impl->plugin;
311 LilvNode* state_iface_uri = lilv_new_uri(_world.world, LV2_STATE__interface);
312 LilvNode* state_uri = lilv_new_uri(_world.world, LV2_STATE_URI);
313 _has_state_interface =
314 // What plugins should have (lv2:extensionData state:Interface)
315 lilv_plugin_has_extension_data(plugin, state_iface_uri)
316 // What some outdated/incorrect ones have
317 || lilv_plugin_has_feature(plugin, state_uri);
318 lilv_node_free(state_uri);
319 lilv_node_free(state_iface_uri);
321 _features = (LV2_Feature**)calloc(11, sizeof(LV2_Feature*));
322 _features[0] = &_instance_access_feature;
323 _features[1] = &_data_access_feature;
324 _features[2] = &_make_path_feature;
325 _features[3] = _uri_map.uri_map_feature();
326 _features[4] = _uri_map.urid_map_feature();
327 _features[5] = _uri_map.urid_unmap_feature();
328 _features[6] = &_log_feature;
330 unsigned n_features = 7;
332 _features[n_features++] = &_def_state_feature;
335 lv2_atom_forge_init(&_impl->forge, _uri_map.urid_map());
338 LV2_URID atom_Int = _uri_map.uri_to_id(LV2_ATOM__Int);
339 LV2_Options_Option options[] = {
340 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id(LV2_BUF_SIZE__minBlockLength),
341 sizeof(int32_t), atom_Int, &_block_length },
342 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id(LV2_BUF_SIZE__maxBlockLength),
343 sizeof(int32_t), atom_Int, &_block_length },
344 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id(LV2_BUF_SIZE__sequenceSize),
345 sizeof(int32_t), atom_Int, &_seq_size },
346 { LV2_OPTIONS_INSTANCE, 0, 0, 0, 0, NULL }
349 _options_feature.URI = LV2_OPTIONS__options;
350 _options_feature.data = options;
351 _features[n_features++] = &_options_feature;
354 LV2_State_Make_Path* make_path = (LV2_State_Make_Path*)malloc(
355 sizeof(LV2_State_Make_Path));
356 make_path->handle = this;
357 make_path->path = &lv2_state_make_path;
358 _make_path_feature.data = make_path;
360 LV2_Log_Log* log = (LV2_Log_Log*)malloc(sizeof(LV2_Log_Log));
362 log->printf = &log_printf;
363 log->vprintf = &log_vprintf;
364 _log_feature.data = log;
366 LilvNode* worker_schedule = lilv_new_uri(_world.world, LV2_WORKER__schedule);
367 if (lilv_plugin_has_feature(plugin, worker_schedule)) {
368 LV2_Worker_Schedule* schedule = (LV2_Worker_Schedule*)malloc(
369 sizeof(LV2_Worker_Schedule));
370 size_t buf_size = _session.engine().raw_buffer_size(DataType::MIDI) * NBUFS;
371 _worker = new Worker(this, buf_size);
372 schedule->handle = this;
373 schedule->schedule_work = work_schedule;
374 _work_schedule_feature.data = schedule;
375 _features[n_features++] = &_work_schedule_feature;
377 lilv_node_free(worker_schedule);
379 _impl->instance = lilv_plugin_instantiate(plugin, rate, _features);
380 _impl->name = lilv_plugin_get_name(plugin);
381 _impl->author = lilv_plugin_get_author_name(plugin);
383 if (_impl->instance == 0) {
384 error << _("LV2: Failed to instantiate plugin ") << uri() << endmsg;
385 throw failed_constructor();
388 _instance_access_feature.data = (void*)_impl->instance->lv2_handle;
389 _data_access_extension_data.extension_data = _impl->instance->lv2_descriptor->extension_data;
390 _data_access_feature.data = &_data_access_extension_data;
392 LilvNode* worker_iface_uri = lilv_new_uri(_world.world, LV2_WORKER__interface);
393 if (lilv_plugin_has_extension_data(plugin, worker_iface_uri)) {
394 _impl->work_iface = (const LV2_Worker_Interface*)extension_data(
395 LV2_WORKER__interface);
397 lilv_node_free(worker_iface_uri);
399 if (lilv_plugin_has_feature(plugin, _world.lv2_inPlaceBroken)) {
400 error << string_compose(
401 _("LV2: \"%1\" cannot be used, since it cannot do inplace processing"),
402 lilv_node_as_string(_impl->name)) << endmsg;
403 lilv_node_free(_impl->name);
404 lilv_node_free(_impl->author);
405 throw failed_constructor();
409 // Load default state
410 LilvState* state = lilv_state_new_from_world(
411 _world.world, _uri_map.urid_map(), lilv_plugin_get_uri(_impl->plugin));
412 if (state && _has_state_interface) {
413 lilv_state_restore(state, _impl->instance, NULL, NULL, 0, NULL);
419 const uint32_t num_ports = this->num_ports();
420 for (uint32_t i = 0; i < num_ports; ++i) {
421 const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, i);
423 size_t minimumSize = 0;
425 if (lilv_port_is_a(_impl->plugin, port, _world.lv2_OutputPort)) {
426 flags |= PORT_OUTPUT;
427 } else if (lilv_port_is_a(_impl->plugin, port, _world.lv2_InputPort)) {
430 error << string_compose(
431 "LV2: \"%1\" port %2 is neither input nor output",
432 lilv_node_as_string(_impl->name), i) << endmsg;
433 throw failed_constructor();
436 if (lilv_port_is_a(_impl->plugin, port, _world.lv2_ControlPort)) {
437 flags |= PORT_CONTROL;
438 } else if (lilv_port_is_a(_impl->plugin, port, _world.lv2_AudioPort)) {
440 } else if (lilv_port_is_a(_impl->plugin, port, _world.ev_EventPort)) {
442 flags |= PORT_MIDI; // We assume old event API ports are for MIDI
443 } else if (lilv_port_is_a(_impl->plugin, port, _world.atom_AtomPort)) {
444 LilvNodes* buffer_types = lilv_port_get_value(
445 _impl->plugin, port, _world.atom_bufferType);
446 LilvNodes* atom_supports = lilv_port_get_value(
447 _impl->plugin, port, _world.atom_supports);
449 if (lilv_nodes_contains(buffer_types, _world.atom_Sequence)) {
450 flags |= PORT_SEQUENCE;
451 if (lilv_nodes_contains(atom_supports, _world.midi_MidiEvent)) {
454 if (lilv_nodes_contains(atom_supports, _world.time_Position)) {
455 flags |= PORT_POSITION;
458 LilvNodes* min_size_v = lilv_port_get_value(_impl->plugin, port, _world.rsz_minimumSize);
459 LilvNode* min_size = min_size_v ? lilv_nodes_get_first(min_size_v) : NULL;
460 if (min_size && lilv_node_is_int(min_size)) {
461 minimumSize = lilv_node_as_int(min_size);
463 lilv_nodes_free(min_size_v);
464 lilv_nodes_free(buffer_types);
465 lilv_nodes_free(atom_supports);
467 error << string_compose(
468 "LV2: \"%1\" port %2 has no known data type",
469 lilv_node_as_string(_impl->name), i) << endmsg;
470 throw failed_constructor();
473 _port_flags.push_back(flags);
474 _port_minimumSize.push_back(minimumSize);
477 _control_data = new float[num_ports];
478 _shadow_data = new float[num_ports];
479 _defaults = new float[num_ports];
480 _ev_buffers = new LV2_Evbuf*[num_ports];
481 memset(_ev_buffers, 0, sizeof(LV2_Evbuf*) * num_ports);
483 const bool latent = lilv_plugin_has_latency(plugin);
484 const uint32_t latency_index = (latent)
485 ? lilv_plugin_get_latency_port_index(plugin)
488 // Build an array of pointers to special parameter buffers
489 void*** params = new void**[num_ports];
490 for (uint32_t i = 0; i < num_ports; ++i) {
493 _impl->designated_input (LV2_TIME__beatsPerMinute, params, (void**)&_bpm_control_port);
494 _impl->designated_input (LV2_CORE__freeWheeling, params, (void**)&_freewheel_control_port);
496 for (uint32_t i = 0; i < num_ports; ++i) {
497 const LilvPort* port = lilv_plugin_get_port_by_index(plugin, i);
498 const LilvNode* sym = lilv_port_get_symbol(plugin, port);
500 // Store index in map so we can look up index by symbol
501 _port_indices.insert(std::make_pair(lilv_node_as_string(sym), i));
503 // Get range and default value if applicable
504 if (parameter_is_control(i)) {
506 lilv_port_get_range(plugin, port, &def, NULL, NULL);
507 _defaults[i] = def ? lilv_node_as_float(def) : 0.0f;
508 if (lilv_port_has_property (plugin, port, _world.lv2_sampleRate)) {
509 _defaults[i] *= _session.frame_rate ();
513 lilv_instance_connect_port(_impl->instance, i, &_control_data[i]);
515 if (latent && i == latency_index) {
516 _latency_control_port = &_control_data[i];
517 *_latency_control_port = 0;
520 if (parameter_is_input(i)) {
521 _shadow_data[i] = default_value(i);
523 *params[i] = (void*)&_shadow_data[i];
533 LilvUIs* uis = lilv_plugin_get_uis(plugin);
534 if (lilv_uis_size(uis) > 0) {
536 // Look for embeddable UI
537 LILV_FOREACH(uis, u, uis) {
538 const LilvUI* this_ui = lilv_uis_get(uis, u);
539 const LilvNode* this_ui_type = NULL;
540 if (lilv_ui_is_supported(this_ui,
544 // TODO: Multiple UI support
546 _impl->ui_type = this_ui_type;
551 // Look for Gtk native UI
552 LILV_FOREACH(uis, i, uis) {
553 const LilvUI* ui = lilv_uis_get(uis, i);
554 if (lilv_ui_is_a(ui, _world.ui_GtkUI)) {
556 _impl->ui_type = _world.ui_GtkUI;
562 // If Gtk UI is not available, try to find external UI
564 LILV_FOREACH(uis, i, uis) {
565 const LilvUI* ui = lilv_uis_get(uis, i);
566 if (lilv_ui_is_a(ui, _world.ui_externalkx)) {
568 _impl->ui_type = _world.ui_external;
571 if (lilv_ui_is_a(ui, _world.ui_external)) {
573 _impl->ui_type = _world.ui_external;
579 allocate_atom_event_buffers();
580 latency_compute_run();
583 LV2Plugin::~LV2Plugin ()
585 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 destroy\n", name()));
590 lilv_instance_free(_impl->instance);
591 lilv_node_free(_impl->name);
592 lilv_node_free(_impl->author);
595 free(_make_path_feature.data);
596 free(_work_schedule_feature.data);
602 if (_atom_ev_buffers) {
603 LV2_Evbuf** b = _atom_ev_buffers;
608 free(_atom_ev_buffers);
611 delete [] _control_data;
612 delete [] _shadow_data;
613 delete [] _ev_buffers;
617 LV2Plugin::is_external_ui() const
622 return lilv_ui_is_a(_impl->ui, _world.ui_external) || lilv_ui_is_a(_impl->ui, _world.ui_externalkx);
626 LV2Plugin::is_external_kx() const
631 return lilv_ui_is_a(_impl->ui, _world.ui_externalkx);
635 LV2Plugin::ui_is_resizable () const
637 const LilvNode* s = lilv_ui_get_uri(_impl->ui);
638 LilvNode* p = lilv_new_uri(_world.world, LV2_CORE__optionalFeature);
639 LilvNode* fs = lilv_new_uri(_world.world, LV2_UI__fixedSize);
640 LilvNode* nrs = lilv_new_uri(_world.world, LV2_UI__noUserResize);
642 LilvNodes* fs_matches = lilv_world_find_nodes(_world.world, s, p, fs);
643 LilvNodes* nrs_matches = lilv_world_find_nodes(_world.world, s, p, nrs);
645 lilv_nodes_free(nrs_matches);
646 lilv_nodes_free(fs_matches);
651 return !fs_matches && !nrs_matches;
655 LV2Plugin::unique_id() const
657 return lilv_node_as_uri(lilv_plugin_get_uri(_impl->plugin));
661 LV2Plugin::uri() const
663 return lilv_node_as_uri(lilv_plugin_get_uri(_impl->plugin));
667 LV2Plugin::label() const
669 return lilv_node_as_string(_impl->name);
673 LV2Plugin::name() const
675 return lilv_node_as_string(_impl->name);
679 LV2Plugin::maker() const
681 return _impl->author ? lilv_node_as_string (_impl->author) : "Unknown";
685 LV2Plugin::num_ports() const
687 return lilv_plugin_get_num_ports(_impl->plugin);
691 LV2Plugin::parameter_count() const
693 return lilv_plugin_get_num_ports(_impl->plugin);
697 LV2Plugin::default_value(uint32_t port)
699 return _defaults[port];
703 LV2Plugin::port_symbol(uint32_t index) const
705 const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, index);
707 error << name() << ": Invalid port index " << index << endmsg;
710 const LilvNode* sym = lilv_port_get_symbol(_impl->plugin, port);
711 return lilv_node_as_string(sym);
715 LV2Plugin::port_index (const char* symbol) const
717 const map<string, uint32_t>::const_iterator i = _port_indices.find(symbol);
718 if (i != _port_indices.end()) {
721 warning << string_compose(_("LV2: Unknown port %1"), symbol) << endmsg;
727 LV2Plugin::set_parameter(uint32_t which, float val)
729 DEBUG_TRACE(DEBUG::LV2, string_compose(
730 "%1 set parameter %2 to %3\n", name(), which, val));
732 if (which < lilv_plugin_get_num_ports(_impl->plugin)) {
733 if (get_parameter (which) == val) {
737 _shadow_data[which] = val;
739 warning << string_compose(
740 _("Illegal parameter number used with plugin \"%1\". "
741 "This is a bug in either %2 or the LV2 plugin <%3>"),
742 name(), PROGRAM_NAME, unique_id()) << endmsg;
745 Plugin::set_parameter(which, val);
749 LV2Plugin::get_parameter(uint32_t which) const
751 if (parameter_is_input(which)) {
752 return (float)_shadow_data[which];
754 return (float)_control_data[which];
760 LV2Plugin::get_docs() const
762 LilvNodes* comments = lilv_plugin_get_value(_impl->plugin, _world.rdfs_comment);
764 const std::string docs(lilv_node_as_string(lilv_nodes_get_first(comments)));
765 lilv_nodes_free(comments);
773 LV2Plugin::get_parameter_docs(uint32_t which) const
775 LilvNodes* comments = lilv_port_get_value(
777 lilv_plugin_get_port_by_index(_impl->plugin, which),
778 _world.rdfs_comment);
781 const std::string docs(lilv_node_as_string(lilv_nodes_get_first(comments)));
782 lilv_nodes_free(comments);
790 LV2Plugin::nth_parameter(uint32_t n, bool& ok) const
793 for (uint32_t c = 0, x = 0; x < lilv_plugin_get_num_ports(_impl->plugin); ++x) {
794 if (parameter_is_control(x)) {
806 LV2Plugin::extension_data(const char* uri) const
808 return lilv_instance_get_extension_data(_impl->instance, uri);
812 LV2Plugin::c_plugin()
814 return _impl->plugin;
820 return (const void*)_impl->ui;
824 LV2Plugin::c_ui_type()
826 return (const void*)_impl->ui_type;
829 /** Directory for all plugin state. */
831 LV2Plugin::plugin_dir() const
833 return Glib::build_filename(_session.plugins_dir(), _insert_id.to_s());
836 /** Directory for files created by the plugin (except during save). */
838 LV2Plugin::scratch_dir() const
840 return Glib::build_filename(plugin_dir(), "scratch");
843 /** Directory for snapshots of files in the scratch directory. */
845 LV2Plugin::file_dir() const
847 return Glib::build_filename(plugin_dir(), "files");
850 /** Directory to save state snapshot version @c num into. */
852 LV2Plugin::state_dir(unsigned num) const
854 return Glib::build_filename(plugin_dir(), string_compose("state%1", num));
857 /** Implementation of state:makePath for files created at instantiation time.
858 * Note this is not used for files created at save time (Lilv deals with that).
861 LV2Plugin::lv2_state_make_path(LV2_State_Make_Path_Handle handle,
864 LV2Plugin* me = (LV2Plugin*)handle;
865 if (me->_insert_id == PBD::ID("0")) {
866 warning << string_compose(
867 "File path \"%1\" requested but LV2 %2 has no insert ID",
868 path, me->name()) << endmsg;
869 return g_strdup(path);
872 const std::string abs_path = Glib::build_filename(me->scratch_dir(), path);
873 const std::string dirname = Glib::path_get_dirname(abs_path);
874 g_mkdir_with_parents(dirname.c_str(), 0744);
876 DEBUG_TRACE(DEBUG::LV2, string_compose("new file path %1 => %2\n",
879 return g_strndup(abs_path.c_str(), abs_path.length());
883 remove_directory(const std::string& path)
885 if (!Glib::file_test(path, Glib::FILE_TEST_IS_DIR)) {
886 warning << string_compose("\"%1\" is not a directory", path) << endmsg;
890 Glib::RefPtr<Gio::File> dir = Gio::File::create_for_path(path);
891 Glib::RefPtr<Gio::FileEnumerator> e = dir->enumerate_children();
892 Glib::RefPtr<Gio::FileInfo> fi;
893 while ((fi = e->next_file())) {
894 if (fi->get_type() == Gio::FILE_TYPE_DIRECTORY) {
895 remove_directory(fi->get_name());
897 dir->get_child(fi->get_name())->remove();
904 LV2Plugin::add_state(XMLNode* root) const
906 assert(_insert_id != PBD::ID("0"));
910 LocaleGuard lg(X_("POSIX"));
912 for (uint32_t i = 0; i < parameter_count(); ++i) {
913 if (parameter_is_input(i) && parameter_is_control(i)) {
914 child = new XMLNode("Port");
915 child->add_property("symbol", port_symbol(i));
916 snprintf(buf, sizeof(buf), "%+f", _shadow_data[i]);
917 child->add_property("value", string(buf));
918 root->add_child_nocopy(*child);
922 if (_has_state_interface) {
923 // Provisionally increment state version and create directory
924 const std::string new_dir = state_dir(++_state_version);
925 g_mkdir_with_parents(new_dir.c_str(), 0744);
927 LilvState* state = lilv_state_new_from_instance(
931 scratch_dir().c_str(),
933 _session.externals_dir().c_str(),
936 const_cast<LV2Plugin*>(this),
940 if (!_impl->state || !lilv_state_equals(state, _impl->state)) {
941 lilv_state_save(_world.world,
943 _uri_map.urid_unmap(),
949 lilv_state_free(_impl->state);
950 _impl->state = state;
952 // State is identical, decrement version and nuke directory
953 lilv_state_free(state);
954 remove_directory(new_dir);
958 root->add_property("state-dir", string_compose("state%1", _state_version));
962 static inline const LilvNode*
963 get_value(LilvWorld* world, const LilvNode* subject, const LilvNode* predicate)
965 LilvNodes* vs = lilv_world_find_nodes(world, subject, predicate, NULL);
966 return vs ? lilv_nodes_get_first(vs) : NULL;
970 LV2Plugin::find_presets()
972 LilvNode* lv2_appliesTo = lilv_new_uri(_world.world, LV2_CORE__appliesTo);
973 LilvNode* pset_Preset = lilv_new_uri(_world.world, LV2_PRESETS__Preset);
974 LilvNode* rdfs_label = lilv_new_uri(_world.world, LILV_NS_RDFS "label");
976 LilvNodes* presets = lilv_plugin_get_related(_impl->plugin, pset_Preset);
977 LILV_FOREACH(nodes, i, presets) {
978 const LilvNode* preset = lilv_nodes_get(presets, i);
979 lilv_world_load_resource(_world.world, preset);
980 const LilvNode* name = get_value(_world.world, preset, rdfs_label);
982 _presets.insert(std::make_pair(lilv_node_as_string(preset),
983 Plugin::PresetRecord(
984 lilv_node_as_string(preset),
985 lilv_node_as_string(name))));
987 warning << string_compose(
988 _("Plugin \"%1\" preset \"%2\" is missing a label\n"),
989 lilv_node_as_string(lilv_plugin_get_uri(_impl->plugin)),
990 lilv_node_as_string(preset)) << endmsg;
993 lilv_nodes_free(presets);
995 lilv_node_free(rdfs_label);
996 lilv_node_free(pset_Preset);
997 lilv_node_free(lv2_appliesTo);
1001 set_port_value(const char* port_symbol,
1007 LV2Plugin* self = (LV2Plugin*)user_data;
1008 if (type != 0 && type != self->_uri_map.uri_to_id(LV2_ATOM__Float)) {
1009 return; // TODO: Support non-float ports
1012 const uint32_t port_index = self->port_index(port_symbol);
1013 if (port_index != (uint32_t)-1) {
1014 self->set_parameter(port_index, *(const float*)value);
1019 LV2Plugin::load_preset(PresetRecord r)
1021 LilvWorld* world = _world.world;
1022 LilvNode* pset = lilv_new_uri(world, r.uri.c_str());
1023 LilvState* state = lilv_state_new_from_world(world, _uri_map.urid_map(), pset);
1026 lilv_state_restore(state, _impl->instance, set_port_value, this, 0, NULL);
1027 lilv_state_free(state);
1030 lilv_node_free(pset);
1035 ARDOUR::lv2plugin_get_port_value(const char* port_symbol,
1040 LV2Plugin *plugin = (LV2Plugin *) user_data;
1042 uint32_t index = plugin->port_index(port_symbol);
1043 if (index != (uint32_t) -1) {
1044 if (plugin->parameter_is_input(index) && plugin->parameter_is_control(index)) {
1046 *size = sizeof(float);
1047 *type = plugin->_uri_map.uri_to_id(LV2_ATOM__Float);
1048 value = &plugin->_shadow_data[index];
1060 LV2Plugin::do_save_preset(string name)
1062 const string base_name = legalize_for_uri(name);
1063 const string file_name = base_name + ".ttl";
1064 const string bundle = Glib::build_filename(
1065 Glib::get_home_dir(),
1066 Glib::build_filename(".lv2", base_name + ".lv2"));
1068 LilvState* state = lilv_state_new_from_instance(
1071 _uri_map.urid_map(),
1072 scratch_dir().c_str(), // file_dir
1073 bundle.c_str(), // copy_dir
1074 bundle.c_str(), // link_dir
1075 bundle.c_str(), // save_dir
1076 lv2plugin_get_port_value, // get_value
1077 (void*)this, // user_data
1078 LV2_STATE_IS_POD|LV2_STATE_IS_PORTABLE, // flags
1079 _features // features
1082 lilv_state_set_label(state, name.c_str());
1084 _world.world, // world
1085 _uri_map.urid_map(), // map
1086 _uri_map.urid_unmap(), // unmap
1088 NULL, // uri (NULL = use file URI)
1089 bundle.c_str(), // dir
1090 file_name.c_str() // filename
1093 lilv_state_free(state);
1095 return Glib::filename_to_uri(Glib::build_filename(bundle, file_name));
1099 LV2Plugin::do_remove_preset(string name)
1101 string preset_file = Glib::build_filename(
1102 Glib::get_home_dir(),
1103 Glib::build_filename(
1104 Glib::build_filename(".lv2", "presets"),
1108 ::g_unlink(preset_file.c_str());
1112 LV2Plugin::has_editor() const
1114 return _impl->ui != NULL;
1118 LV2Plugin::has_message_output() const
1120 for (uint32_t i = 0; i < num_ports(); ++i) {
1121 if ((_port_flags[i] & PORT_SEQUENCE) &&
1122 (_port_flags[i] & PORT_OUTPUT)) {
1130 LV2Plugin::write_to(RingBuffer<uint8_t>* dest,
1134 const uint8_t* body)
1136 const uint32_t buf_size = sizeof(UIMessage) + size;
1137 vector<uint8_t> buf(buf_size);
1139 UIMessage* msg = (UIMessage*)&buf[0];
1141 msg->protocol = protocol;
1143 memcpy(msg + 1, body, size);
1145 return (dest->write(&buf[0], buf_size) == buf_size);
1149 LV2Plugin::write_from_ui(uint32_t index,
1152 const uint8_t* body)
1155 size_t rbs = _session.engine().raw_buffer_size(DataType::MIDI) * NBUFS;
1156 /* buffer data communication from plugin UI to plugin instance.
1157 * this buffer needs to potentially hold
1158 * (port's minimumSize) * (audio-periods) / (UI-periods)
1161 * e.g 48kSPS / 128fpp -> audio-periods = 375 Hz
1162 * ui-periods = 25 Hz (SuperRapidScreenUpdate)
1163 * default minimumSize = 32K (see LV2Plugin::allocate_atom_event_buffers()
1165 * it is safe to overflow (but the plugin state may be inconsistent).
1167 rbs = max((size_t) 32768 * 6, rbs);
1168 _from_ui = new RingBuffer<uint8_t>(rbs);
1171 if (!write_to(_from_ui, index, protocol, size, body)) {
1172 error << "Error writing from UI to plugin" << endmsg;
1179 LV2Plugin::write_to_ui(uint32_t index,
1182 const uint8_t* body)
1184 if (!write_to(_to_ui, index, protocol, size, body)) {
1185 error << "Error writing from plugin to UI" << endmsg;
1192 LV2Plugin::enable_ui_emmission()
1195 /* see note in LV2Plugin::write_from_ui() */
1196 size_t rbs = _session.engine().raw_buffer_size(DataType::MIDI) * NBUFS;
1197 rbs = max((size_t) 32768 * 8, rbs);
1198 _to_ui = new RingBuffer<uint8_t>(rbs);
1203 LV2Plugin::emit_to_ui(void* controller, UIMessageSink sink)
1209 uint32_t read_space = _to_ui->read_space();
1210 while (read_space > sizeof(UIMessage)) {
1212 if (_to_ui->read((uint8_t*)&msg, sizeof(msg)) != sizeof(msg)) {
1213 error << "Error reading from Plugin=>UI RingBuffer" << endmsg;
1216 vector<uint8_t> body(msg.size);
1217 if (_to_ui->read(&body[0], msg.size) != msg.size) {
1218 error << "Error reading from Plugin=>UI RingBuffer" << endmsg;
1222 sink(controller, msg.index, msg.size, msg.protocol, &body[0]);
1224 read_space -= sizeof(msg) + msg.size;
1229 LV2Plugin::work(uint32_t size, const void* data)
1231 return _impl->work_iface->work(
1232 _impl->instance->lv2_handle, work_respond, this, size, data);
1236 LV2Plugin::work_response(uint32_t size, const void* data)
1238 return _impl->work_iface->work_response(
1239 _impl->instance->lv2_handle, size, data);
1243 LV2Plugin::set_insert_info(const PluginInsert* insert)
1245 _insert_id = insert->id();
1249 LV2Plugin::set_state(const XMLNode& node, int version)
1252 const XMLProperty* prop;
1253 XMLNodeConstIterator iter;
1258 LocaleGuard lg(X_("POSIX"));
1260 if (node.name() != state_node_name()) {
1261 error << _("Bad node sent to LV2Plugin::set_state") << endmsg;
1265 #ifndef NO_PLUGIN_STATE
1267 if (version < 3000) {
1268 nodes = node.children("port");
1270 nodes = node.children("Port");
1273 for (iter = nodes.begin(); iter != nodes.end(); ++iter) {
1277 if ((prop = child->property("symbol")) != 0) {
1278 sym = prop->value().c_str();
1280 warning << _("LV2: port has no symbol, ignored") << endmsg;
1284 map<string, uint32_t>::iterator i = _port_indices.find(sym);
1286 if (i != _port_indices.end()) {
1287 port_id = i->second;
1289 warning << _("LV2: port has unknown index, ignored") << endmsg;
1293 if ((prop = child->property("value")) != 0) {
1294 value = prop->value().c_str();
1296 warning << _("LV2: port has no value, ignored") << endmsg;
1300 set_parameter(port_id, atof(value));
1304 if ((prop = node.property("state-dir")) != 0) {
1305 if (sscanf(prop->value().c_str(), "state%u", &_state_version) != 1) {
1306 error << string_compose(
1307 "LV2: failed to parse state version from \"%1\"",
1308 prop->value()) << endmsg;
1311 std::string state_file = Glib::build_filename(
1313 Glib::build_filename(prop->value(), "state.ttl"));
1315 LilvState* state = lilv_state_new_from_file(
1316 _world.world, _uri_map.urid_map(), NULL, state_file.c_str());
1318 lilv_state_restore(state, _impl->instance, NULL, NULL, 0, NULL);
1321 latency_compute_run();
1324 return Plugin::set_state(node, version);
1328 LV2Plugin::get_parameter_descriptor(uint32_t which, ParameterDescriptor& desc) const
1330 const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, which);
1332 LilvNode *def, *min, *max;
1333 lilv_port_get_range(_impl->plugin, port, &def, &min, &max);
1335 desc.integer_step = lilv_port_has_property(_impl->plugin, port, _world.lv2_integer);
1336 desc.toggled = lilv_port_has_property(_impl->plugin, port, _world.lv2_toggled);
1337 desc.logarithmic = lilv_port_has_property(_impl->plugin, port, _world.ext_logarithmic);
1338 desc.sr_dependent = lilv_port_has_property(_impl->plugin, port, _world.lv2_sampleRate);
1339 desc.label = lilv_node_as_string(lilv_port_get_name(_impl->plugin, port));
1340 desc.lower = min ? lilv_node_as_float(min) : 0.0f;
1341 desc.upper = max ? lilv_node_as_float(max) : 1.0f;
1342 if (desc.sr_dependent) {
1343 desc.lower *= _session.frame_rate ();
1344 desc.upper *= _session.frame_rate ();
1347 desc.min_unbound = false; // TODO: LV2 extension required
1348 desc.max_unbound = false; // TODO: LV2 extension required
1350 if (desc.integer_step) {
1352 desc.smallstep = 0.1;
1353 desc.largestep = 10.0;
1355 const float delta = desc.upper - desc.lower;
1356 desc.step = delta / 1000.0f;
1357 desc.smallstep = delta / 10000.0f;
1358 desc.largestep = delta / 10.0f;
1361 desc.enumeration = lilv_port_has_property(_impl->plugin, port, _world.lv2_enumeration);
1363 lilv_node_free(def);
1364 lilv_node_free(min);
1365 lilv_node_free(max);
1371 LV2Plugin::describe_parameter(Evoral::Parameter which)
1373 if (( which.type() == PluginAutomation) && ( which.id() < parameter_count()) ) {
1375 if (lilv_port_has_property(_impl->plugin,
1376 lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.ext_notOnGUI)) {
1377 return X_("hidden");
1380 if (lilv_port_has_property(_impl->plugin,
1381 lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.lv2_freewheeling)) {
1382 return X_("hidden");
1385 if (lilv_port_has_property(_impl->plugin,
1386 lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.lv2_reportsLatency)) {
1387 return X_("latency");
1390 LilvNode* name = lilv_port_get_name(_impl->plugin,
1391 lilv_plugin_get_port_by_index(_impl->plugin, which.id()));
1392 string ret(lilv_node_as_string(name));
1393 lilv_node_free(name);
1401 LV2Plugin::signal_latency() const
1403 if (_latency_control_port) {
1404 return (framecnt_t)floor(*_latency_control_port);
1410 set<Evoral::Parameter>
1411 LV2Plugin::automatable() const
1413 set<Evoral::Parameter> ret;
1415 for (uint32_t i = 0; i < parameter_count(); ++i) {
1416 if (parameter_is_input(i) && parameter_is_control(i)) {
1417 ret.insert(ret.end(), Evoral::Parameter(PluginAutomation, 0, i));
1425 LV2Plugin::activate()
1427 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 activate\n", name()));
1429 if (!_was_activated) {
1430 lilv_instance_activate(_impl->instance);
1431 _was_activated = true;
1436 LV2Plugin::deactivate()
1438 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 deactivate\n", name()));
1440 if (_was_activated) {
1441 lilv_instance_deactivate(_impl->instance);
1442 _was_activated = false;
1447 LV2Plugin::cleanup()
1449 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 cleanup\n", name()));
1453 lilv_instance_free(_impl->instance);
1454 _impl->instance = NULL;
1458 LV2Plugin::allocate_atom_event_buffers()
1460 /* reserve local scratch buffers for ATOM event-queues */
1461 const LilvPlugin* p = _impl->plugin;
1463 /* count non-MIDI atom event-ports
1464 * TODO: nicely ask drobilla to make a lilv_ call for that
1466 int count_atom_out = 0;
1467 int count_atom_in = 0;
1468 int minimumSize = 32768; // TODO use a per-port minimum-size
1469 for (uint32_t i = 0; i < lilv_plugin_get_num_ports(p); ++i) {
1470 const LilvPort* port = lilv_plugin_get_port_by_index(p, i);
1471 if (lilv_port_is_a(p, port, _world.atom_AtomPort)) {
1472 LilvNodes* buffer_types = lilv_port_get_value(
1473 p, port, _world.atom_bufferType);
1474 LilvNodes* atom_supports = lilv_port_get_value(
1475 p, port, _world.atom_supports);
1477 if (!lilv_nodes_contains(buffer_types, _world.atom_Sequence)
1478 || !lilv_nodes_contains(atom_supports, _world.midi_MidiEvent)) {
1479 if (lilv_port_is_a(p, port, _world.lv2_InputPort)) {
1482 if (lilv_port_is_a(p, port, _world.lv2_OutputPort)) {
1485 LilvNodes* min_size_v = lilv_port_get_value(_impl->plugin, port, _world.rsz_minimumSize);
1486 LilvNode* min_size = min_size_v ? lilv_nodes_get_first(min_size_v) : NULL;
1487 if (min_size && lilv_node_is_int(min_size)) {
1488 minimumSize = std::max(minimumSize, lilv_node_as_int(min_size));
1490 lilv_nodes_free(min_size_v);
1492 lilv_nodes_free(buffer_types);
1493 lilv_nodes_free(atom_supports);
1497 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 need buffers for %2 atom-in and %3 atom-out event-ports\n",
1498 name(), count_atom_in, count_atom_out));
1500 const int total_atom_buffers = (count_atom_in + count_atom_out);
1501 if (_atom_ev_buffers || total_atom_buffers == 0) {
1505 DEBUG_TRACE(DEBUG::LV2, string_compose("allocate %1 atom_ev_buffers\n", total_atom_buffers));
1506 _atom_ev_buffers = (LV2_Evbuf**) malloc((total_atom_buffers + 1) * sizeof(LV2_Evbuf*));
1507 for (int i = 0; i < total_atom_buffers; ++i ) {
1508 _atom_ev_buffers[i] = lv2_evbuf_new(minimumSize, LV2_EVBUF_ATOM,
1509 LV2Plugin::urids.atom_Chunk, LV2Plugin::urids.atom_Sequence);
1511 _atom_ev_buffers[total_atom_buffers] = 0;
1515 /** Write an ardour position/time/tempo/meter as an LV2 event.
1516 * @return true on success.
1519 write_position(LV2_Atom_Forge* forge,
1521 const TempoMetric& t,
1522 Timecode::BBT_Time& bbt,
1524 framepos_t position,
1527 uint8_t pos_buf[256];
1528 lv2_atom_forge_set_buffer(forge, pos_buf, sizeof(pos_buf));
1529 LV2_Atom_Forge_Frame frame;
1530 lv2_atom_forge_blank(forge, &frame, 1, LV2Plugin::urids.time_Position);
1531 lv2_atom_forge_property_head(forge, LV2Plugin::urids.time_frame, 0);
1532 lv2_atom_forge_long(forge, position);
1533 lv2_atom_forge_property_head(forge, LV2Plugin::urids.time_speed, 0);
1534 lv2_atom_forge_float(forge, speed);
1535 lv2_atom_forge_property_head(forge, LV2Plugin::urids.time_barBeat, 0);
1536 lv2_atom_forge_float(forge, bbt.beats - 1 +
1537 (bbt.ticks / Timecode::BBT_Time::ticks_per_beat));
1538 lv2_atom_forge_property_head(forge, LV2Plugin::urids.time_bar, 0);
1539 lv2_atom_forge_long(forge, bbt.bars - 1);
1540 lv2_atom_forge_property_head(forge, LV2Plugin::urids.time_beatUnit, 0);
1541 lv2_atom_forge_int(forge, t.meter().note_divisor());
1542 lv2_atom_forge_property_head(forge, LV2Plugin::urids.time_beatsPerBar, 0);
1543 lv2_atom_forge_float(forge, t.meter().divisions_per_bar());
1544 lv2_atom_forge_property_head(forge, LV2Plugin::urids.time_beatsPerMinute, 0);
1545 lv2_atom_forge_float(forge, t.tempo().beats_per_minute());
1547 LV2_Evbuf_Iterator end = lv2_evbuf_end(buf);
1548 const LV2_Atom* const atom = (const LV2_Atom*)pos_buf;
1549 return lv2_evbuf_write(&end, offset, 0, atom->type, atom->size,
1550 (const uint8_t*)(atom + 1));
1554 LV2Plugin::connect_and_run(BufferSet& bufs,
1555 ChanMapping in_map, ChanMapping out_map,
1556 pframes_t nframes, framecnt_t offset)
1558 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 run %2 offset %3\n", name(), nframes, offset));
1559 Plugin::connect_and_run(bufs, in_map, out_map, nframes, offset);
1561 cycles_t then = get_cycles();
1563 TempoMap& tmap = _session.tempo_map();
1564 Metrics::const_iterator metric_i = tmap.metrics_end();
1565 TempoMetric tmetric = tmap.metric_at(_session.transport_frame(), &metric_i);
1567 if (_freewheel_control_port) {
1568 *_freewheel_control_port = _session.engine().freewheeling();
1571 if (_bpm_control_port) {
1572 *_bpm_control_port = tmetric.tempo().beats_per_minute();
1575 ChanCount bufs_count;
1576 bufs_count.set(DataType::AUDIO, 1);
1577 bufs_count.set(DataType::MIDI, 1);
1578 BufferSet& silent_bufs = _session.get_silent_buffers(bufs_count);
1579 BufferSet& scratch_bufs = _session.get_scratch_buffers(bufs_count);
1580 uint32_t const num_ports = parameter_count();
1581 uint32_t const nil_index = std::numeric_limits<uint32_t>::max();
1583 uint32_t audio_in_index = 0;
1584 uint32_t audio_out_index = 0;
1585 uint32_t midi_in_index = 0;
1586 uint32_t midi_out_index = 0;
1587 uint32_t atom_port_index = 0;
1588 for (uint32_t port_index = 0; port_index < num_ports; ++port_index) {
1590 uint32_t index = nil_index;
1591 PortFlags flags = _port_flags[port_index];
1593 if (flags & PORT_AUDIO) {
1594 if (flags & PORT_INPUT) {
1595 index = in_map.get(DataType::AUDIO, audio_in_index++, &valid);
1597 ? bufs.get_audio(index).data(offset)
1598 : silent_bufs.get_audio(0).data(offset);
1600 index = out_map.get(DataType::AUDIO, audio_out_index++, &valid);
1602 ? bufs.get_audio(index).data(offset)
1603 : scratch_bufs.get_audio(0).data(offset);
1605 } else if (flags & (PORT_EVENT|PORT_SEQUENCE)) {
1606 /* FIXME: The checks here for bufs.count().n_midi() > index shouldn't
1607 be necessary, but the mapping is illegal in some cases. Ideally
1608 that should be fixed, but this is easier...
1610 if (flags & PORT_MIDI) {
1611 if (flags & PORT_INPUT) {
1612 index = in_map.get(DataType::MIDI, midi_in_index++, &valid);
1614 index = out_map.get(DataType::MIDI, midi_out_index++, &valid);
1616 if (valid && bufs.count().n_midi() > index) {
1617 /* Note, ensure_lv2_bufsize() is not RT safe!
1618 * However free()/alloc() is only called if a
1619 * plugin requires a rsz:minimumSize buffersize
1620 * and the existing buffer if smaller.
1622 bufs.ensure_lv2_bufsize((flags & PORT_INPUT), index, _port_minimumSize[port_index]);
1623 _ev_buffers[port_index] = bufs.get_lv2_midi(
1624 (flags & PORT_INPUT), index, (flags & PORT_EVENT));
1626 } else if ((flags & PORT_POSITION) && (flags & PORT_INPUT)) {
1627 lv2_evbuf_reset(_atom_ev_buffers[atom_port_index], true);
1628 _ev_buffers[port_index] = _atom_ev_buffers[atom_port_index++];
1632 if (valid && (flags & PORT_INPUT)) {
1633 Timecode::BBT_Time bbt;
1634 if ((flags & PORT_POSITION)) {
1635 if (_session.transport_frame() != _next_cycle_start ||
1636 _session.transport_speed() != _next_cycle_speed) {
1637 // Transport has changed, write position at cycle start
1638 tmap.bbt_time(_session.transport_frame(), bbt);
1639 write_position(&_impl->forge, _ev_buffers[port_index],
1640 tmetric, bbt, _session.transport_speed(),
1641 _session.transport_frame(), 0);
1645 // Get MIDI iterator range (empty range if no MIDI)
1646 MidiBuffer::iterator m = (index != nil_index)
1647 ? bufs.get_midi(index).begin()
1648 : silent_bufs.get_midi(0).end();
1649 MidiBuffer::iterator m_end = (index != nil_index)
1650 ? bufs.get_midi(index).end()
1653 // Now merge MIDI and any transport events into the buffer
1654 const uint32_t type = LV2Plugin::urids.midi_MidiEvent;
1655 const framepos_t tend = _session.transport_frame() + nframes;
1657 while (m != m_end || (metric_i != tmap.metrics_end() &&
1658 (*metric_i)->frame() < tend)) {
1659 MetricSection* metric = (metric_i != tmap.metrics_end())
1661 if (m != m_end && (!metric || metric->frame() > (*m).time())) {
1662 const Evoral::MIDIEvent<framepos_t> ev(*m, false);
1663 LV2_Evbuf_Iterator eend = lv2_evbuf_end(_ev_buffers[port_index]);
1664 lv2_evbuf_write(&eend, ev.time(), 0, type, ev.size(), ev.buffer());
1667 tmetric.set_metric(metric);
1668 bbt = metric->start();
1669 write_position(&_impl->forge, _ev_buffers[port_index],
1670 tmetric, bbt, _session.transport_speed(),
1672 metric->frame() - _session.transport_frame());
1676 } else if (!valid) {
1677 // Nothing we understand or care about, connect to scratch
1678 _ev_buffers[port_index] = scratch_bufs.get_lv2_midi(
1679 (flags & PORT_INPUT), 0, (flags & PORT_EVENT));
1681 buf = lv2_evbuf_get_buffer(_ev_buffers[port_index]);
1683 continue; // Control port, leave buffer alone
1685 lilv_instance_connect_port(_impl->instance, port_index, buf);
1688 // Read messages from UI and push into appropriate buffers
1690 uint32_t read_space = _from_ui->read_space();
1691 while (read_space > sizeof(UIMessage)) {
1693 if (_from_ui->read((uint8_t*)&msg, sizeof(msg)) != sizeof(msg)) {
1694 error << "Error reading from UI=>Plugin RingBuffer" << endmsg;
1697 vector<uint8_t> body(msg.size);
1698 if (_from_ui->read(&body[0], msg.size) != msg.size) {
1699 error << "Error reading from UI=>Plugin RingBuffer" << endmsg;
1702 if (msg.protocol == urids.atom_eventTransfer) {
1703 LV2_Evbuf* buf = _ev_buffers[msg.index];
1704 LV2_Evbuf_Iterator i = lv2_evbuf_end(buf);
1705 const LV2_Atom* const atom = (const LV2_Atom*)&body[0];
1706 if (!lv2_evbuf_write(&i, nframes, 0, atom->type, atom->size,
1707 (const uint8_t*)(atom + 1))) {
1708 error << "Failed to write data to LV2 event buffer\n";
1711 error << "Received unknown message type from UI" << endmsg;
1713 read_space -= sizeof(UIMessage) + msg.size;
1720 for (uint32_t port_index = 0; port_index < num_ports; ++port_index) {
1721 PortFlags flags = _port_flags[port_index];
1724 /* TODO ask drobilla about comment
1725 * "Make Ardour event buffers generic so plugins can communicate"
1726 * in libs/ardour/buffer_set.cc:310
1728 * ideally the user could choose which of the following two modes
1729 * to use (e.g. instrument/effect chains MIDI OUT vs MIDI TRHU).
1731 * This implementation follows the discussion on IRC Mar 16 2013 16:47 UTC
1732 * 16:51 < drobilla> rgareus: [..] i.e always replace with MIDI output [of LV2 plugin] if it's there
1733 * 16:52 < drobilla> rgareus: That would probably be good enough [..] to make users not complain
1734 * for quite a while at least ;)
1736 // copy output of LV2 plugin's MIDI port to Ardour MIDI buffers -- MIDI OUT
1737 if ((flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE|PORT_MIDI))) {
1738 const uint32_t buf_index = out_map.get(
1739 DataType::MIDI, midi_out_index++, &valid);
1741 bufs.forward_lv2_midi(_ev_buffers[port_index], buf_index);
1744 // Flush MIDI (write back to Ardour MIDI buffers) -- MIDI THRU
1745 else if ((flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE))) {
1746 const uint32_t buf_index = out_map.get(
1747 DataType::MIDI, midi_out_index++, &valid);
1749 bufs.flush_lv2_midi(true, buf_index);
1753 // Write messages to UI
1754 if (_to_ui && (flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE))) {
1755 LV2_Evbuf* buf = _ev_buffers[port_index];
1756 for (LV2_Evbuf_Iterator i = lv2_evbuf_begin(buf);
1757 lv2_evbuf_is_valid(i);
1758 i = lv2_evbuf_next(i)) {
1759 uint32_t frames, subframes, type, size;
1761 lv2_evbuf_get(i, &frames, &subframes, &type, &size, &data);
1762 write_to_ui(port_index, urids.atom_eventTransfer,
1763 size + sizeof(LV2_Atom),
1764 data - sizeof(LV2_Atom));
1769 cycles_t now = get_cycles();
1770 set_cycles((uint32_t)(now - then));
1772 // Update expected transport information for next cycle so we can detect changes
1773 _next_cycle_speed = _session.transport_speed();
1774 _next_cycle_start = _session.transport_frame() + (nframes * _next_cycle_speed);
1780 LV2Plugin::parameter_is_control(uint32_t param) const
1782 assert(param < _port_flags.size());
1783 return _port_flags[param] & PORT_CONTROL;
1787 LV2Plugin::parameter_is_audio(uint32_t param) const
1789 assert(param < _port_flags.size());
1790 return _port_flags[param] & PORT_AUDIO;
1794 LV2Plugin::parameter_is_event(uint32_t param) const
1796 assert(param < _port_flags.size());
1797 return _port_flags[param] & PORT_EVENT;
1801 LV2Plugin::parameter_is_output(uint32_t param) const
1803 assert(param < _port_flags.size());
1804 return _port_flags[param] & PORT_OUTPUT;
1808 LV2Plugin::parameter_is_input(uint32_t param) const
1810 assert(param < _port_flags.size());
1811 return _port_flags[param] & PORT_INPUT;
1815 LV2Plugin::print_parameter(uint32_t param, char* buf, uint32_t len) const
1818 if (param < parameter_count()) {
1819 snprintf(buf, len, "%.3f", get_parameter(param));
1826 boost::shared_ptr<Plugin::ScalePoints>
1827 LV2Plugin::get_scale_points(uint32_t port_index) const
1829 const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, port_index);
1830 LilvScalePoints* points = lilv_port_get_scale_points(_impl->plugin, port);
1832 boost::shared_ptr<Plugin::ScalePoints> ret;
1837 ret = boost::shared_ptr<Plugin::ScalePoints>(new ScalePoints());
1839 LILV_FOREACH(scale_points, i, points) {
1840 const LilvScalePoint* p = lilv_scale_points_get(points, i);
1841 const LilvNode* label = lilv_scale_point_get_label(p);
1842 const LilvNode* value = lilv_scale_point_get_value(p);
1843 if (label && (lilv_node_is_float(value) || lilv_node_is_int(value))) {
1844 ret->insert(make_pair(lilv_node_as_string(label),
1845 lilv_node_as_float(value)));
1849 lilv_scale_points_free(points);
1854 LV2Plugin::run(pframes_t nframes)
1856 uint32_t const N = parameter_count();
1857 for (uint32_t i = 0; i < N; ++i) {
1858 if (parameter_is_control(i) && parameter_is_input(i)) {
1859 _control_data[i] = _shadow_data[i];
1863 lilv_instance_run(_impl->instance, nframes);
1865 if (_impl->work_iface) {
1866 _worker->emit_responses();
1867 if (_impl->work_iface->end_run) {
1868 _impl->work_iface->end_run(_impl->instance->lv2_handle);
1874 LV2Plugin::latency_compute_run()
1876 if (!_latency_control_port) {
1880 // Run the plugin so that it can set its latency parameter
1884 uint32_t port_index = 0;
1885 uint32_t in_index = 0;
1886 uint32_t out_index = 0;
1888 const framecnt_t bufsize = 1024;
1889 float buffer[bufsize];
1891 memset(buffer, 0, sizeof(float) * bufsize);
1893 // FIXME: Ensure plugins can handle in-place processing
1897 while (port_index < parameter_count()) {
1898 if (parameter_is_audio(port_index)) {
1899 if (parameter_is_input(port_index)) {
1900 lilv_instance_connect_port(_impl->instance, port_index, buffer);
1902 } else if (parameter_is_output(port_index)) {
1903 lilv_instance_connect_port(_impl->instance, port_index, buffer);
1915 LV2Plugin::Impl::designated_input (const char* uri, void** bufptrs[], void** bufptr)
1917 const LilvPort* port = NULL;
1918 LilvNode* designation = lilv_new_uri(_world.world, uri);
1919 port = lilv_plugin_get_port_by_designation(
1920 plugin, _world.lv2_InputPort, designation);
1921 lilv_node_free(designation);
1923 bufptrs[lilv_port_get_index(plugin, port)] = bufptr;
1928 static bool lv2_filter (const string& str, void* /*arg*/)
1930 /* Not a dotfile, has a prefix before a period, suffix is "lv2" */
1932 return str[0] != '.' && (str.length() > 3 && str.find (".lv2") == (str.length() - 4));
1936 LV2World::LV2World()
1937 : world(lilv_world_new())
1938 , _bundle_checked(false)
1940 lilv_world_load_all(world);
1942 atom_AtomPort = lilv_new_uri(world, LV2_ATOM__AtomPort);
1943 atom_Chunk = lilv_new_uri(world, LV2_ATOM__Chunk);
1944 atom_Sequence = lilv_new_uri(world, LV2_ATOM__Sequence);
1945 atom_bufferType = lilv_new_uri(world, LV2_ATOM__bufferType);
1946 atom_supports = lilv_new_uri(world, LV2_ATOM__supports);
1947 atom_eventTransfer = lilv_new_uri(world, LV2_ATOM__eventTransfer);
1948 ev_EventPort = lilv_new_uri(world, LILV_URI_EVENT_PORT);
1949 ext_logarithmic = lilv_new_uri(world, LV2_PORT_PROPS__logarithmic);
1950 ext_notOnGUI = lilv_new_uri(world, LV2_PORT_PROPS__notOnGUI);
1951 lv2_AudioPort = lilv_new_uri(world, LILV_URI_AUDIO_PORT);
1952 lv2_ControlPort = lilv_new_uri(world, LILV_URI_CONTROL_PORT);
1953 lv2_InputPort = lilv_new_uri(world, LILV_URI_INPUT_PORT);
1954 lv2_OutputPort = lilv_new_uri(world, LILV_URI_OUTPUT_PORT);
1955 lv2_inPlaceBroken = lilv_new_uri(world, LV2_CORE__inPlaceBroken);
1956 lv2_integer = lilv_new_uri(world, LV2_CORE__integer);
1957 lv2_reportsLatency = lilv_new_uri(world, LV2_CORE__reportsLatency);
1958 lv2_sampleRate = lilv_new_uri(world, LV2_CORE__sampleRate);
1959 lv2_toggled = lilv_new_uri(world, LV2_CORE__toggled);
1960 lv2_enumeration = lilv_new_uri(world, LV2_CORE__enumeration);
1961 lv2_freewheeling = lilv_new_uri(world, LV2_CORE__freeWheeling);
1962 midi_MidiEvent = lilv_new_uri(world, LILV_URI_MIDI_EVENT);
1963 rdfs_comment = lilv_new_uri(world, LILV_NS_RDFS "comment");
1964 rsz_minimumSize = lilv_new_uri(world, LV2_RESIZE_PORT__minimumSize);
1965 time_Position = lilv_new_uri(world, LV2_TIME__Position);
1966 ui_GtkUI = lilv_new_uri(world, LV2_UI__GtkUI);
1967 ui_external = lilv_new_uri(world, "http://lv2plug.in/ns/extensions/ui#external");
1968 ui_externalkx = lilv_new_uri(world, "http://kxstudio.sf.net/ns/lv2ext/external-ui#Widget");
1971 LV2World::~LV2World()
1973 lilv_node_free(ui_externalkx);
1974 lilv_node_free(ui_external);
1975 lilv_node_free(ui_GtkUI);
1976 lilv_node_free(time_Position);
1977 lilv_node_free(rsz_minimumSize);
1978 lilv_node_free(rdfs_comment);
1979 lilv_node_free(midi_MidiEvent);
1980 lilv_node_free(lv2_enumeration);
1981 lilv_node_free(lv2_freewheeling);
1982 lilv_node_free(lv2_toggled);
1983 lilv_node_free(lv2_sampleRate);
1984 lilv_node_free(lv2_reportsLatency);
1985 lilv_node_free(lv2_integer);
1986 lilv_node_free(lv2_inPlaceBroken);
1987 lilv_node_free(lv2_OutputPort);
1988 lilv_node_free(lv2_InputPort);
1989 lilv_node_free(lv2_ControlPort);
1990 lilv_node_free(lv2_AudioPort);
1991 lilv_node_free(ext_notOnGUI);
1992 lilv_node_free(ext_logarithmic);
1993 lilv_node_free(ev_EventPort);
1994 lilv_node_free(atom_supports);
1995 lilv_node_free(atom_eventTransfer);
1996 lilv_node_free(atom_bufferType);
1997 lilv_node_free(atom_Sequence);
1998 lilv_node_free(atom_Chunk);
1999 lilv_node_free(atom_AtomPort);
2003 LV2World::load_bundled_plugins()
2005 if (!_bundle_checked) {
2006 cout << "Scanning folders for bundled LV2s: " << ARDOUR::lv2_bundled_search_path().to_string() << endl;
2007 PathScanner scanner;
2008 vector<string *> *plugin_objects = scanner (ARDOUR::lv2_bundled_search_path().to_string(), lv2_filter, 0, true, true);
2009 if (plugin_objects) {
2010 for ( vector<string *>::iterator x = plugin_objects->begin(); x != plugin_objects->end (); ++x) {
2011 #ifdef PLATFORM_WINDOWS
2012 string uri = "file:///" + **x + "/";
2014 string uri = "file://" + **x + "/";
2016 LilvNode *node = lilv_new_uri(world, uri.c_str());
2017 lilv_world_load_bundle(world, node);
2018 lilv_node_free(node);
2021 delete (plugin_objects);
2023 _bundle_checked = true;
2027 LV2PluginInfo::LV2PluginInfo (const void* c_plugin)
2028 : _c_plugin(c_plugin)
2033 LV2PluginInfo::~LV2PluginInfo()
2037 LV2PluginInfo::load(Session& session)
2042 plugin.reset(new LV2Plugin(session.engine(), session,
2043 (const LilvPlugin*)_c_plugin,
2044 session.frame_rate()));
2046 plugin->set_info(PluginInfoPtr(new LV2PluginInfo(*this)));
2048 } catch (failed_constructor& err) {
2049 return PluginPtr((Plugin*)0);
2056 LV2PluginInfo::discover()
2058 _world.load_bundled_plugins();
2060 PluginInfoList* plugs = new PluginInfoList;
2061 const LilvPlugins* plugins = lilv_world_get_all_plugins(_world.world);
2063 info << "LV2: Discovering " << lilv_plugins_size(plugins) << " plugins" << endmsg;
2065 LILV_FOREACH(plugins, i, plugins) {
2066 const LilvPlugin* p = lilv_plugins_get(plugins, i);
2067 LV2PluginInfoPtr info(new LV2PluginInfo((const void*)p));
2069 LilvNode* name = lilv_plugin_get_name(p);
2070 if (!name || !lilv_plugin_get_port_by_index(p, 0)) {
2071 warning << "Ignoring invalid LV2 plugin "
2072 << lilv_node_as_string(lilv_plugin_get_uri(p))
2079 info->name = string(lilv_node_as_string(name));
2080 lilv_node_free(name);
2082 const LilvPluginClass* pclass = lilv_plugin_get_class(p);
2083 const LilvNode* label = lilv_plugin_class_get_label(pclass);
2084 info->category = lilv_node_as_string(label);
2086 LilvNode* author_name = lilv_plugin_get_author_name(p);
2087 info->creator = author_name ? string(lilv_node_as_string(author_name)) : "Unknown";
2088 lilv_node_free(author_name);
2090 info->path = "/NOPATH"; // Meaningless for LV2
2092 /* count atom-event-ports that feature
2093 * atom:supports <http://lv2plug.in/ns/ext/midi#MidiEvent>
2095 * TODO: nicely ask drobilla to make a lilv_ call for that
2097 int count_midi_out = 0;
2098 int count_midi_in = 0;
2099 for (uint32_t i = 0; i < lilv_plugin_get_num_ports(p); ++i) {
2100 const LilvPort* port = lilv_plugin_get_port_by_index(p, i);
2101 if (lilv_port_is_a(p, port, _world.atom_AtomPort)) {
2102 LilvNodes* buffer_types = lilv_port_get_value(
2103 p, port, _world.atom_bufferType);
2104 LilvNodes* atom_supports = lilv_port_get_value(
2105 p, port, _world.atom_supports);
2107 if (lilv_nodes_contains(buffer_types, _world.atom_Sequence)
2108 && lilv_nodes_contains(atom_supports, _world.midi_MidiEvent)) {
2109 if (lilv_port_is_a(p, port, _world.lv2_InputPort)) {
2112 if (lilv_port_is_a(p, port, _world.lv2_OutputPort)) {
2116 lilv_nodes_free(buffer_types);
2117 lilv_nodes_free(atom_supports);
2121 info->n_inputs.set_audio(
2122 lilv_plugin_get_num_ports_of_class(
2123 p, _world.lv2_InputPort, _world.lv2_AudioPort, NULL));
2124 info->n_inputs.set_midi(
2125 lilv_plugin_get_num_ports_of_class(
2126 p, _world.lv2_InputPort, _world.ev_EventPort, NULL)
2129 info->n_outputs.set_audio(
2130 lilv_plugin_get_num_ports_of_class(
2131 p, _world.lv2_OutputPort, _world.lv2_AudioPort, NULL));
2132 info->n_outputs.set_midi(
2133 lilv_plugin_get_num_ports_of_class(
2134 p, _world.lv2_OutputPort, _world.ev_EventPort, NULL)
2137 info->unique_id = lilv_node_as_uri(lilv_plugin_get_uri(p));
2138 info->index = 0; // Meaningless for LV2
2140 plugs->push_back(info);