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;
148 bool _bundle_checked;
151 static LV2World _world;
153 /* worker extension */
155 /** Called by the plugin to schedule non-RT work. */
156 static LV2_Worker_Status
157 work_schedule(LV2_Worker_Schedule_Handle handle,
161 LV2Plugin* plugin = (LV2Plugin*)handle;
162 if (plugin->session().engine().freewheeling()) {
163 // Freewheeling, do the work immediately in this (audio) thread
164 return (LV2_Worker_Status)plugin->work(size, data);
166 // Enqueue message for the worker thread
167 return plugin->worker()->schedule(size, data) ?
168 LV2_WORKER_SUCCESS : LV2_WORKER_ERR_UNKNOWN;
172 /** Called by the plugin to respond to non-RT work. */
173 static LV2_Worker_Status
174 work_respond(LV2_Worker_Respond_Handle handle,
178 LV2Plugin* plugin = (LV2Plugin*)handle;
179 if (plugin->session().engine().freewheeling()) {
180 // Freewheeling, respond immediately in this (audio) thread
181 return (LV2_Worker_Status)plugin->work_response(size, data);
183 // Enqueue response for the worker
184 return plugin->worker()->respond(size, data) ?
185 LV2_WORKER_SUCCESS : LV2_WORKER_ERR_UNKNOWN;
192 log_vprintf(LV2_Log_Handle /*handle*/,
198 const int ret = g_vasprintf(&str, fmt, args);
199 if (type == LV2Plugin::urids.log_Error) {
200 error << str << endmsg;
201 } else if (type == LV2Plugin::urids.log_Warning) {
202 warning << str << endmsg;
203 } else if (type == LV2Plugin::urids.log_Note) {
204 info << str << endmsg;
206 // TODO: Toggleable log:Trace message support
211 log_printf(LV2_Log_Handle handle,
213 const char* fmt, ...)
217 const int ret = log_vprintf(handle, type, fmt, args);
222 struct LV2Plugin::Impl {
223 Impl() : plugin(0), ui(0), ui_type(0), name(0), author(0), instance(0)
228 /** Find the LV2 input port with the given designation.
229 * If found, bufptrs[port_index] will be set to bufptr.
231 const LilvPort* designated_input (const char* uri, void** bufptrs[], void** bufptr);
233 const LilvPlugin* plugin;
235 const LilvNode* ui_type;
238 LilvInstance* instance;
239 const LV2_Worker_Interface* work_iface;
241 LV2_Atom_Forge forge;
244 LV2Plugin::LV2Plugin (AudioEngine& engine,
246 const void* c_plugin,
248 : Plugin (engine, session)
255 init(c_plugin, rate);
258 LV2Plugin::LV2Plugin (const LV2Plugin& other)
264 , _insert_id(other._insert_id)
266 init(other._impl->plugin, other._sample_rate);
268 for (uint32_t i = 0; i < parameter_count(); ++i) {
269 _control_data[i] = other._shadow_data[i];
270 _shadow_data[i] = other._shadow_data[i];
275 LV2Plugin::init(const void* c_plugin, framecnt_t rate)
277 DEBUG_TRACE(DEBUG::LV2, "init\n");
279 _impl->plugin = (const LilvPlugin*)c_plugin;
281 _impl->ui_type = NULL;
286 _atom_ev_buffers = 0;
288 _bpm_control_port = 0;
289 _freewheel_control_port = 0;
290 _latency_control_port = 0;
291 _next_cycle_start = std::numeric_limits<framepos_t>::max();
292 _next_cycle_speed = 1.0;
293 _block_length = _engine.frames_per_cycle();
294 _seq_size = _engine.raw_buffer_size(DataType::MIDI);
296 _was_activated = false;
297 _has_state_interface = false;
299 _instance_access_feature.URI = "http://lv2plug.in/ns/ext/instance-access";
300 _data_access_feature.URI = "http://lv2plug.in/ns/ext/data-access";
301 _make_path_feature.URI = LV2_STATE__makePath;
302 _log_feature.URI = LV2_LOG__log;
303 _work_schedule_feature.URI = LV2_WORKER__schedule;
304 _work_schedule_feature.data = NULL;
305 _def_state_feature.URI = LV2_STATE_PREFIX "loadDefaultState"; // Post LV2-1.2.0
306 _def_state_feature.data = NULL;
308 const LilvPlugin* plugin = _impl->plugin;
310 LilvNode* state_iface_uri = lilv_new_uri(_world.world, LV2_STATE__interface);
311 LilvNode* state_uri = lilv_new_uri(_world.world, LV2_STATE_URI);
312 _has_state_interface =
313 // What plugins should have (lv2:extensionData state:Interface)
314 lilv_plugin_has_extension_data(plugin, state_iface_uri)
315 // What some outdated/incorrect ones have
316 || lilv_plugin_has_feature(plugin, state_uri);
317 lilv_node_free(state_uri);
318 lilv_node_free(state_iface_uri);
320 _features = (LV2_Feature**)calloc(11, sizeof(LV2_Feature*));
321 _features[0] = &_instance_access_feature;
322 _features[1] = &_data_access_feature;
323 _features[2] = &_make_path_feature;
324 _features[3] = _uri_map.uri_map_feature();
325 _features[4] = _uri_map.urid_map_feature();
326 _features[5] = _uri_map.urid_unmap_feature();
327 _features[6] = &_log_feature;
329 unsigned n_features = 7;
331 _features[n_features++] = &_def_state_feature;
334 lv2_atom_forge_init(&_impl->forge, _uri_map.urid_map());
337 LV2_URID atom_Int = _uri_map.uri_to_id(LV2_ATOM__Int);
338 LV2_Options_Option options[] = {
339 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id(LV2_BUF_SIZE__minBlockLength),
340 sizeof(int32_t), atom_Int, &_block_length },
341 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id(LV2_BUF_SIZE__maxBlockLength),
342 sizeof(int32_t), atom_Int, &_block_length },
343 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id(LV2_BUF_SIZE__sequenceSize),
344 sizeof(int32_t), atom_Int, &_seq_size },
345 { LV2_OPTIONS_INSTANCE, 0, 0, 0, 0, NULL }
348 _options_feature.URI = LV2_OPTIONS__options;
349 _options_feature.data = options;
350 _features[n_features++] = &_options_feature;
353 LV2_State_Make_Path* make_path = (LV2_State_Make_Path*)malloc(
354 sizeof(LV2_State_Make_Path));
355 make_path->handle = this;
356 make_path->path = &lv2_state_make_path;
357 _make_path_feature.data = make_path;
359 LV2_Log_Log* log = (LV2_Log_Log*)malloc(sizeof(LV2_Log_Log));
361 log->printf = &log_printf;
362 log->vprintf = &log_vprintf;
363 _log_feature.data = log;
365 LilvNode* worker_schedule = lilv_new_uri(_world.world, LV2_WORKER__schedule);
366 if (lilv_plugin_has_feature(plugin, worker_schedule)) {
367 LV2_Worker_Schedule* schedule = (LV2_Worker_Schedule*)malloc(
368 sizeof(LV2_Worker_Schedule));
369 size_t buf_size = _session.engine().raw_buffer_size(DataType::MIDI) * NBUFS;
370 _worker = new Worker(this, buf_size);
371 schedule->handle = this;
372 schedule->schedule_work = work_schedule;
373 _work_schedule_feature.data = schedule;
374 _features[n_features++] = &_work_schedule_feature;
376 lilv_node_free(worker_schedule);
378 _impl->instance = lilv_plugin_instantiate(plugin, rate, _features);
379 _impl->name = lilv_plugin_get_name(plugin);
380 _impl->author = lilv_plugin_get_author_name(plugin);
382 if (_impl->instance == 0) {
383 error << _("LV2: Failed to instantiate plugin ") << uri() << endmsg;
384 throw failed_constructor();
387 _instance_access_feature.data = (void*)_impl->instance->lv2_handle;
388 _data_access_extension_data.extension_data = _impl->instance->lv2_descriptor->extension_data;
389 _data_access_feature.data = &_data_access_extension_data;
391 LilvNode* worker_iface_uri = lilv_new_uri(_world.world, LV2_WORKER__interface);
392 if (lilv_plugin_has_extension_data(plugin, worker_iface_uri)) {
393 _impl->work_iface = (const LV2_Worker_Interface*)extension_data(
394 LV2_WORKER__interface);
396 lilv_node_free(worker_iface_uri);
398 if (lilv_plugin_has_feature(plugin, _world.lv2_inPlaceBroken)) {
399 error << string_compose(
400 _("LV2: \"%1\" cannot be used, since it cannot do inplace processing"),
401 lilv_node_as_string(_impl->name)) << endmsg;
402 lilv_node_free(_impl->name);
403 lilv_node_free(_impl->author);
404 throw failed_constructor();
408 // Load default state
409 LilvState* state = lilv_state_new_from_world(
410 _world.world, _uri_map.urid_map(), lilv_plugin_get_uri(_impl->plugin));
411 if (state && _has_state_interface) {
412 lilv_state_restore(state, _impl->instance, NULL, NULL, 0, NULL);
418 const uint32_t num_ports = this->num_ports();
419 for (uint32_t i = 0; i < num_ports; ++i) {
420 const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, i);
422 size_t minimumSize = 0;
424 if (lilv_port_is_a(_impl->plugin, port, _world.lv2_OutputPort)) {
425 flags |= PORT_OUTPUT;
426 } else if (lilv_port_is_a(_impl->plugin, port, _world.lv2_InputPort)) {
429 error << string_compose(
430 "LV2: \"%1\" port %2 is neither input nor output",
431 lilv_node_as_string(_impl->name), i) << endmsg;
432 throw failed_constructor();
435 if (lilv_port_is_a(_impl->plugin, port, _world.lv2_ControlPort)) {
436 flags |= PORT_CONTROL;
437 } else if (lilv_port_is_a(_impl->plugin, port, _world.lv2_AudioPort)) {
439 } else if (lilv_port_is_a(_impl->plugin, port, _world.ev_EventPort)) {
441 flags |= PORT_MIDI; // We assume old event API ports are for MIDI
442 } else if (lilv_port_is_a(_impl->plugin, port, _world.atom_AtomPort)) {
443 LilvNodes* buffer_types = lilv_port_get_value(
444 _impl->plugin, port, _world.atom_bufferType);
445 LilvNodes* atom_supports = lilv_port_get_value(
446 _impl->plugin, port, _world.atom_supports);
448 if (lilv_nodes_contains(buffer_types, _world.atom_Sequence)) {
449 flags |= PORT_SEQUENCE;
450 if (lilv_nodes_contains(atom_supports, _world.midi_MidiEvent)) {
453 if (lilv_nodes_contains(atom_supports, _world.time_Position)) {
454 flags |= PORT_POSITION;
457 LilvNodes* min_size_v = lilv_port_get_value(_impl->plugin, port, _world.rsz_minimumSize);
458 LilvNode* min_size = min_size_v ? lilv_nodes_get_first(min_size_v) : NULL;
459 if (min_size && lilv_node_is_int(min_size)) {
460 minimumSize = lilv_node_as_int(min_size);
462 lilv_nodes_free(min_size_v);
463 lilv_nodes_free(buffer_types);
464 lilv_nodes_free(atom_supports);
466 error << string_compose(
467 "LV2: \"%1\" port %2 has no known data type",
468 lilv_node_as_string(_impl->name), i) << endmsg;
469 throw failed_constructor();
472 _port_flags.push_back(flags);
473 _port_minimumSize.push_back(minimumSize);
476 _control_data = new float[num_ports];
477 _shadow_data = new float[num_ports];
478 _defaults = new float[num_ports];
479 _ev_buffers = new LV2_Evbuf*[num_ports];
480 memset(_ev_buffers, 0, sizeof(LV2_Evbuf*) * num_ports);
482 const bool latent = lilv_plugin_has_latency(plugin);
483 const uint32_t latency_index = (latent)
484 ? lilv_plugin_get_latency_port_index(plugin)
487 // Build an array of pointers to special parameter buffers
488 void*** params = new void**[num_ports];
489 for (uint32_t i = 0; i < num_ports; ++i) {
492 _impl->designated_input (LV2_TIME__beatsPerMinute, params, (void**)&_bpm_control_port);
493 _impl->designated_input (LV2_CORE__freeWheeling, params, (void**)&_freewheel_control_port);
495 for (uint32_t i = 0; i < num_ports; ++i) {
496 const LilvPort* port = lilv_plugin_get_port_by_index(plugin, i);
497 const LilvNode* sym = lilv_port_get_symbol(plugin, port);
499 // Store index in map so we can look up index by symbol
500 _port_indices.insert(std::make_pair(lilv_node_as_string(sym), i));
502 // Get range and default value if applicable
503 if (parameter_is_control(i)) {
505 lilv_port_get_range(plugin, port, &def, NULL, NULL);
506 _defaults[i] = def ? lilv_node_as_float(def) : 0.0f;
507 if (lilv_port_has_property (plugin, port, _world.lv2_sampleRate)) {
508 _defaults[i] *= _session.frame_rate ();
512 lilv_instance_connect_port(_impl->instance, i, &_control_data[i]);
514 if (latent && i == latency_index) {
515 _latency_control_port = &_control_data[i];
516 *_latency_control_port = 0;
519 if (parameter_is_input(i)) {
520 _shadow_data[i] = default_value(i);
522 *params[i] = (void*)&_shadow_data[i];
532 LilvUIs* uis = lilv_plugin_get_uis(plugin);
533 if (lilv_uis_size(uis) > 0) {
535 // Look for embeddable UI
536 LILV_FOREACH(uis, u, uis) {
537 const LilvUI* this_ui = lilv_uis_get(uis, u);
538 const LilvNode* this_ui_type = NULL;
539 if (lilv_ui_is_supported(this_ui,
543 // TODO: Multiple UI support
545 _impl->ui_type = this_ui_type;
550 // Look for Gtk native UI
551 LILV_FOREACH(uis, i, uis) {
552 const LilvUI* ui = lilv_uis_get(uis, i);
553 if (lilv_ui_is_a(ui, _world.ui_GtkUI)) {
555 _impl->ui_type = _world.ui_GtkUI;
561 // If Gtk UI is not available, try to find external UI
563 LILV_FOREACH(uis, i, uis) {
564 const LilvUI* ui = lilv_uis_get(uis, i);
565 if (lilv_ui_is_a(ui, _world.ui_external)) {
567 _impl->ui_type = _world.ui_external;
574 allocate_atom_event_buffers();
575 latency_compute_run();
578 LV2Plugin::~LV2Plugin ()
580 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 destroy\n", name()));
585 lilv_instance_free(_impl->instance);
586 lilv_node_free(_impl->name);
587 lilv_node_free(_impl->author);
590 free(_make_path_feature.data);
591 free(_work_schedule_feature.data);
597 if (_atom_ev_buffers) {
598 LV2_Evbuf** b = _atom_ev_buffers;
603 free(_atom_ev_buffers);
606 delete [] _control_data;
607 delete [] _shadow_data;
608 delete [] _ev_buffers;
612 LV2Plugin::is_external_ui() const
617 return lilv_ui_is_a(_impl->ui, _world.ui_external);
621 LV2Plugin::ui_is_resizable () const
623 const LilvNode* s = lilv_ui_get_uri(_impl->ui);
624 LilvNode* p = lilv_new_uri(_world.world, LV2_CORE__optionalFeature);
625 LilvNode* fs = lilv_new_uri(_world.world, LV2_UI__fixedSize);
626 LilvNode* nrs = lilv_new_uri(_world.world, LV2_UI__noUserResize);
628 LilvNodes* fs_matches = lilv_world_find_nodes(_world.world, s, p, fs);
629 LilvNodes* nrs_matches = lilv_world_find_nodes(_world.world, s, p, nrs);
631 lilv_nodes_free(nrs_matches);
632 lilv_nodes_free(fs_matches);
637 return !fs_matches && !nrs_matches;
641 LV2Plugin::unique_id() const
643 return lilv_node_as_uri(lilv_plugin_get_uri(_impl->plugin));
647 LV2Plugin::uri() const
649 return lilv_node_as_uri(lilv_plugin_get_uri(_impl->plugin));
653 LV2Plugin::label() const
655 return lilv_node_as_string(_impl->name);
659 LV2Plugin::name() const
661 return lilv_node_as_string(_impl->name);
665 LV2Plugin::maker() const
667 return _impl->author ? lilv_node_as_string (_impl->author) : "Unknown";
671 LV2Plugin::num_ports() const
673 return lilv_plugin_get_num_ports(_impl->plugin);
677 LV2Plugin::parameter_count() const
679 return lilv_plugin_get_num_ports(_impl->plugin);
683 LV2Plugin::default_value(uint32_t port)
685 return _defaults[port];
689 LV2Plugin::port_symbol(uint32_t index) const
691 const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, index);
693 error << name() << ": Invalid port index " << index << endmsg;
696 const LilvNode* sym = lilv_port_get_symbol(_impl->plugin, port);
697 return lilv_node_as_string(sym);
701 LV2Plugin::port_index (const char* symbol) const
703 const map<string, uint32_t>::const_iterator i = _port_indices.find(symbol);
704 if (i != _port_indices.end()) {
707 warning << string_compose(_("LV2: Unknown port %1"), symbol) << endmsg;
713 LV2Plugin::set_parameter(uint32_t which, float val)
715 DEBUG_TRACE(DEBUG::LV2, string_compose(
716 "%1 set parameter %2 to %3\n", name(), which, val));
718 if (which < lilv_plugin_get_num_ports(_impl->plugin)) {
719 if (get_parameter (which) == val) {
723 _shadow_data[which] = val;
725 warning << string_compose(
726 _("Illegal parameter number used with plugin \"%1\". "
727 "This is a bug in either %2 or the LV2 plugin <%3>"),
728 name(), PROGRAM_NAME, unique_id()) << endmsg;
731 Plugin::set_parameter(which, val);
735 LV2Plugin::get_parameter(uint32_t which) const
737 if (parameter_is_input(which)) {
738 return (float)_shadow_data[which];
740 return (float)_control_data[which];
746 LV2Plugin::get_docs() const
748 LilvNodes* comments = lilv_plugin_get_value(_impl->plugin, _world.rdfs_comment);
750 const std::string docs(lilv_node_as_string(lilv_nodes_get_first(comments)));
751 lilv_nodes_free(comments);
759 LV2Plugin::get_parameter_docs(uint32_t which) const
761 LilvNodes* comments = lilv_port_get_value(
763 lilv_plugin_get_port_by_index(_impl->plugin, which),
764 _world.rdfs_comment);
767 const std::string docs(lilv_node_as_string(lilv_nodes_get_first(comments)));
768 lilv_nodes_free(comments);
776 LV2Plugin::nth_parameter(uint32_t n, bool& ok) const
779 for (uint32_t c = 0, x = 0; x < lilv_plugin_get_num_ports(_impl->plugin); ++x) {
780 if (parameter_is_control(x)) {
792 LV2Plugin::extension_data(const char* uri) const
794 return lilv_instance_get_extension_data(_impl->instance, uri);
798 LV2Plugin::c_plugin()
800 return _impl->plugin;
806 return (const void*)_impl->ui;
810 LV2Plugin::c_ui_type()
812 return (const void*)_impl->ui_type;
815 /** Directory for all plugin state. */
817 LV2Plugin::plugin_dir() const
819 return Glib::build_filename(_session.plugins_dir(), _insert_id.to_s());
822 /** Directory for files created by the plugin (except during save). */
824 LV2Plugin::scratch_dir() const
826 return Glib::build_filename(plugin_dir(), "scratch");
829 /** Directory for snapshots of files in the scratch directory. */
831 LV2Plugin::file_dir() const
833 return Glib::build_filename(plugin_dir(), "files");
836 /** Directory to save state snapshot version @c num into. */
838 LV2Plugin::state_dir(unsigned num) const
840 return Glib::build_filename(plugin_dir(), string_compose("state%1", num));
843 /** Implementation of state:makePath for files created at instantiation time.
844 * Note this is not used for files created at save time (Lilv deals with that).
847 LV2Plugin::lv2_state_make_path(LV2_State_Make_Path_Handle handle,
850 LV2Plugin* me = (LV2Plugin*)handle;
851 if (me->_insert_id == PBD::ID("0")) {
852 warning << string_compose(
853 "File path \"%1\" requested but LV2 %2 has no insert ID",
854 path, me->name()) << endmsg;
855 return g_strdup(path);
858 const std::string abs_path = Glib::build_filename(me->scratch_dir(), path);
859 const std::string dirname = Glib::path_get_dirname(abs_path);
860 g_mkdir_with_parents(dirname.c_str(), 0744);
862 DEBUG_TRACE(DEBUG::LV2, string_compose("new file path %1 => %2\n",
865 return g_strndup(abs_path.c_str(), abs_path.length());
869 remove_directory(const std::string& path)
871 if (!Glib::file_test(path, Glib::FILE_TEST_IS_DIR)) {
872 warning << string_compose("\"%1\" is not a directory", path) << endmsg;
876 Glib::RefPtr<Gio::File> dir = Gio::File::create_for_path(path);
877 Glib::RefPtr<Gio::FileEnumerator> e = dir->enumerate_children();
878 Glib::RefPtr<Gio::FileInfo> fi;
879 while ((fi = e->next_file())) {
880 if (fi->get_type() == Gio::FILE_TYPE_DIRECTORY) {
881 remove_directory(fi->get_name());
883 dir->get_child(fi->get_name())->remove();
890 LV2Plugin::add_state(XMLNode* root) const
892 assert(_insert_id != PBD::ID("0"));
896 LocaleGuard lg(X_("POSIX"));
898 for (uint32_t i = 0; i < parameter_count(); ++i) {
899 if (parameter_is_input(i) && parameter_is_control(i)) {
900 child = new XMLNode("Port");
901 child->add_property("symbol", port_symbol(i));
902 snprintf(buf, sizeof(buf), "%+f", _shadow_data[i]);
903 child->add_property("value", string(buf));
904 root->add_child_nocopy(*child);
908 if (_has_state_interface) {
909 // Provisionally increment state version and create directory
910 const std::string new_dir = state_dir(++_state_version);
911 g_mkdir_with_parents(new_dir.c_str(), 0744);
913 LilvState* state = lilv_state_new_from_instance(
917 scratch_dir().c_str(),
919 _session.externals_dir().c_str(),
922 const_cast<LV2Plugin*>(this),
926 if (!_impl->state || !lilv_state_equals(state, _impl->state)) {
927 lilv_state_save(_world.world,
929 _uri_map.urid_unmap(),
935 lilv_state_free(_impl->state);
936 _impl->state = state;
938 // State is identical, decrement version and nuke directory
939 lilv_state_free(state);
940 remove_directory(new_dir);
944 root->add_property("state-dir", string_compose("state%1", _state_version));
948 static inline const LilvNode*
949 get_value(LilvWorld* world, const LilvNode* subject, const LilvNode* predicate)
951 LilvNodes* vs = lilv_world_find_nodes(world, subject, predicate, NULL);
952 return vs ? lilv_nodes_get_first(vs) : NULL;
956 LV2Plugin::find_presets()
958 LilvNode* lv2_appliesTo = lilv_new_uri(_world.world, LV2_CORE__appliesTo);
959 LilvNode* pset_Preset = lilv_new_uri(_world.world, LV2_PRESETS__Preset);
960 LilvNode* rdfs_label = lilv_new_uri(_world.world, LILV_NS_RDFS "label");
962 LilvNodes* presets = lilv_plugin_get_related(_impl->plugin, pset_Preset);
963 LILV_FOREACH(nodes, i, presets) {
964 const LilvNode* preset = lilv_nodes_get(presets, i);
965 lilv_world_load_resource(_world.world, preset);
966 const LilvNode* name = get_value(_world.world, preset, rdfs_label);
968 _presets.insert(std::make_pair(lilv_node_as_string(preset),
969 Plugin::PresetRecord(
970 lilv_node_as_string(preset),
971 lilv_node_as_string(name))));
973 warning << string_compose(
974 _("Plugin \"%1\% preset \"%2%\" is missing a label\n"),
975 lilv_node_as_string(lilv_plugin_get_uri(_impl->plugin)),
976 lilv_node_as_string(preset)) << endmsg;
979 lilv_nodes_free(presets);
981 lilv_node_free(rdfs_label);
982 lilv_node_free(pset_Preset);
983 lilv_node_free(lv2_appliesTo);
987 set_port_value(const char* port_symbol,
993 LV2Plugin* self = (LV2Plugin*)user_data;
994 if (type != 0 && type != self->_uri_map.uri_to_id(LV2_ATOM__Float)) {
995 return; // TODO: Support non-float ports
998 const uint32_t port_index = self->port_index(port_symbol);
999 if (port_index != (uint32_t)-1) {
1000 self->set_parameter(port_index, *(const float*)value);
1005 LV2Plugin::load_preset(PresetRecord r)
1007 LilvWorld* world = _world.world;
1008 LilvNode* pset = lilv_new_uri(world, r.uri.c_str());
1009 LilvState* state = lilv_state_new_from_world(world, _uri_map.urid_map(), pset);
1012 lilv_state_restore(state, _impl->instance, set_port_value, this, 0, NULL);
1013 lilv_state_free(state);
1016 lilv_node_free(pset);
1021 ARDOUR::lv2plugin_get_port_value(const char* port_symbol,
1026 LV2Plugin *plugin = (LV2Plugin *) user_data;
1028 uint32_t index = plugin->port_index(port_symbol);
1029 if (index != (uint32_t) -1) {
1030 if (plugin->parameter_is_input(index) && plugin->parameter_is_control(index)) {
1032 *size = sizeof(float);
1033 *type = plugin->_uri_map.uri_to_id(LV2_ATOM__Float);
1034 value = &plugin->_shadow_data[index];
1046 LV2Plugin::do_save_preset(string name)
1048 const string base_name = legalize_for_uri(name);
1049 const string file_name = base_name + ".ttl";
1050 const string bundle = Glib::build_filename(
1051 Glib::get_home_dir(),
1052 Glib::build_filename(".lv2", base_name + ".lv2"));
1054 LilvState* state = lilv_state_new_from_instance(
1057 _uri_map.urid_map(),
1058 scratch_dir().c_str(), // file_dir
1059 bundle.c_str(), // copy_dir
1060 bundle.c_str(), // link_dir
1061 bundle.c_str(), // save_dir
1062 lv2plugin_get_port_value, // get_value
1063 (void*)this, // user_data
1064 LV2_STATE_IS_POD|LV2_STATE_IS_PORTABLE, // flags
1065 _features // features
1068 lilv_state_set_label(state, name.c_str());
1070 _world.world, // world
1071 _uri_map.urid_map(), // map
1072 _uri_map.urid_unmap(), // unmap
1074 NULL, // uri (NULL = use file URI)
1075 bundle.c_str(), // dir
1076 file_name.c_str() // filename
1079 lilv_state_free(state);
1081 return Glib::filename_to_uri(Glib::build_filename(bundle, file_name));
1085 LV2Plugin::do_remove_preset(string name)
1087 string preset_file = Glib::build_filename(
1088 Glib::get_home_dir(),
1089 Glib::build_filename(
1090 Glib::build_filename(".lv2", "presets"),
1094 ::g_unlink(preset_file.c_str());
1098 LV2Plugin::has_editor() const
1100 return _impl->ui != NULL;
1104 LV2Plugin::has_message_output() const
1106 for (uint32_t i = 0; i < num_ports(); ++i) {
1107 if ((_port_flags[i] & PORT_SEQUENCE) &&
1108 (_port_flags[i] & PORT_OUTPUT)) {
1116 LV2Plugin::write_to(RingBuffer<uint8_t>* dest,
1120 const uint8_t* body)
1122 const uint32_t buf_size = sizeof(UIMessage) + size;
1123 uint8_t buf[buf_size];
1125 UIMessage* msg = (UIMessage*)buf;
1127 msg->protocol = protocol;
1129 memcpy(msg + 1, body, size);
1131 return (dest->write(buf, buf_size) == buf_size);
1135 LV2Plugin::write_from_ui(uint32_t index,
1138 const uint8_t* body)
1141 _from_ui = new RingBuffer<uint8_t>(
1142 _session.engine().raw_buffer_size(DataType::MIDI) * NBUFS);
1145 if (!write_to(_from_ui, index, protocol, size, body)) {
1146 error << "Error writing from UI to plugin" << endmsg;
1153 LV2Plugin::write_to_ui(uint32_t index,
1156 const uint8_t* body)
1158 if (!write_to(_to_ui, index, protocol, size, body)) {
1159 error << "Error writing from plugin to UI" << endmsg;
1166 LV2Plugin::enable_ui_emmission()
1169 _to_ui = new RingBuffer<uint8_t>(
1170 _session.engine().raw_buffer_size(DataType::MIDI) * NBUFS);
1175 LV2Plugin::emit_to_ui(void* controller, UIMessageSink sink)
1181 uint32_t read_space = _to_ui->read_space();
1182 while (read_space > sizeof(UIMessage)) {
1184 if (_to_ui->read((uint8_t*)&msg, sizeof(msg)) != sizeof(msg)) {
1185 error << "Error reading from Plugin=>UI RingBuffer" << endmsg;
1188 uint8_t body[msg.size];
1189 if (_to_ui->read(body, msg.size) != msg.size) {
1190 error << "Error reading from Plugin=>UI RingBuffer" << endmsg;
1194 sink(controller, msg.index, msg.size, msg.protocol, body);
1196 read_space -= sizeof(msg) + msg.size;
1201 LV2Plugin::work(uint32_t size, const void* data)
1203 return _impl->work_iface->work(
1204 _impl->instance->lv2_handle, work_respond, this, size, data);
1208 LV2Plugin::work_response(uint32_t size, const void* data)
1210 return _impl->work_iface->work_response(
1211 _impl->instance->lv2_handle, size, data);
1215 LV2Plugin::set_insert_info(const PluginInsert* insert)
1217 _insert_id = insert->id();
1221 LV2Plugin::set_state(const XMLNode& node, int version)
1224 const XMLProperty* prop;
1225 XMLNodeConstIterator iter;
1230 LocaleGuard lg(X_("POSIX"));
1232 if (node.name() != state_node_name()) {
1233 error << _("Bad node sent to LV2Plugin::set_state") << endmsg;
1237 #ifndef NO_PLUGIN_STATE
1239 if (version < 3000) {
1240 nodes = node.children("port");
1242 nodes = node.children("Port");
1245 for (iter = nodes.begin(); iter != nodes.end(); ++iter) {
1249 if ((prop = child->property("symbol")) != 0) {
1250 sym = prop->value().c_str();
1252 warning << _("LV2: port has no symbol, ignored") << endmsg;
1256 map<string, uint32_t>::iterator i = _port_indices.find(sym);
1258 if (i != _port_indices.end()) {
1259 port_id = i->second;
1261 warning << _("LV2: port has unknown index, ignored") << endmsg;
1265 if ((prop = child->property("value")) != 0) {
1266 value = prop->value().c_str();
1268 warning << _("LV2: port has no value, ignored") << endmsg;
1272 set_parameter(port_id, atof(value));
1276 if ((prop = node.property("state-dir")) != 0) {
1277 if (sscanf(prop->value().c_str(), "state%u", &_state_version) != 1) {
1278 error << string_compose(
1279 "LV2: failed to parse state version from \"%1\"",
1280 prop->value()) << endmsg;
1283 std::string state_file = Glib::build_filename(
1285 Glib::build_filename(prop->value(), "state.ttl"));
1287 LilvState* state = lilv_state_new_from_file(
1288 _world.world, _uri_map.urid_map(), NULL, state_file.c_str());
1290 lilv_state_restore(state, _impl->instance, NULL, NULL, 0, NULL);
1293 latency_compute_run();
1296 return Plugin::set_state(node, version);
1300 LV2Plugin::get_parameter_descriptor(uint32_t which, ParameterDescriptor& desc) const
1302 const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, which);
1304 LilvNode *def, *min, *max;
1305 lilv_port_get_range(_impl->plugin, port, &def, &min, &max);
1307 desc.integer_step = lilv_port_has_property(_impl->plugin, port, _world.lv2_integer);
1308 desc.toggled = lilv_port_has_property(_impl->plugin, port, _world.lv2_toggled);
1309 desc.logarithmic = lilv_port_has_property(_impl->plugin, port, _world.ext_logarithmic);
1310 desc.sr_dependent = lilv_port_has_property(_impl->plugin, port, _world.lv2_sampleRate);
1311 desc.label = lilv_node_as_string(lilv_port_get_name(_impl->plugin, port));
1312 desc.lower = min ? lilv_node_as_float(min) : 0.0f;
1313 desc.upper = max ? lilv_node_as_float(max) : 1.0f;
1314 if (desc.sr_dependent) {
1315 desc.lower *= _session.frame_rate ();
1316 desc.upper *= _session.frame_rate ();
1319 desc.min_unbound = false; // TODO: LV2 extension required
1320 desc.max_unbound = false; // TODO: LV2 extension required
1322 if (desc.integer_step) {
1324 desc.smallstep = 0.1;
1325 desc.largestep = 10.0;
1327 const float delta = desc.upper - desc.lower;
1328 desc.step = delta / 1000.0f;
1329 desc.smallstep = delta / 10000.0f;
1330 desc.largestep = delta / 10.0f;
1333 desc.enumeration = lilv_port_has_property(_impl->plugin, port, _world.lv2_enumeration);
1335 lilv_node_free(def);
1336 lilv_node_free(min);
1337 lilv_node_free(max);
1343 LV2Plugin::describe_parameter(Evoral::Parameter which)
1345 if (( which.type() == PluginAutomation) && ( which.id() < parameter_count()) ) {
1347 if (lilv_port_has_property(_impl->plugin,
1348 lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.ext_notOnGUI)) {
1349 return X_("hidden");
1352 if (lilv_port_has_property(_impl->plugin,
1353 lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.lv2_freewheeling)) {
1354 return X_("hidden");
1357 if (lilv_port_has_property(_impl->plugin,
1358 lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.lv2_sampleRate)) {
1359 return X_("hidden");
1362 if (lilv_port_has_property(_impl->plugin,
1363 lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.lv2_reportsLatency)) {
1364 return X_("latency");
1367 LilvNode* name = lilv_port_get_name(_impl->plugin,
1368 lilv_plugin_get_port_by_index(_impl->plugin, which.id()));
1369 string ret(lilv_node_as_string(name));
1370 lilv_node_free(name);
1378 LV2Plugin::signal_latency() const
1380 if (_latency_control_port) {
1381 return (framecnt_t)floor(*_latency_control_port);
1387 set<Evoral::Parameter>
1388 LV2Plugin::automatable() const
1390 set<Evoral::Parameter> ret;
1392 for (uint32_t i = 0; i < parameter_count(); ++i) {
1393 if (parameter_is_input(i) && parameter_is_control(i)) {
1394 ret.insert(ret.end(), Evoral::Parameter(PluginAutomation, 0, i));
1402 LV2Plugin::activate()
1404 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 activate\n", name()));
1406 if (!_was_activated) {
1407 lilv_instance_activate(_impl->instance);
1408 _was_activated = true;
1413 LV2Plugin::deactivate()
1415 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 deactivate\n", name()));
1417 if (_was_activated) {
1418 lilv_instance_deactivate(_impl->instance);
1419 _was_activated = false;
1424 LV2Plugin::cleanup()
1426 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 cleanup\n", name()));
1430 lilv_instance_free(_impl->instance);
1431 _impl->instance = NULL;
1435 LV2Plugin::allocate_atom_event_buffers()
1437 /* reserve local scratch buffers for ATOM event-queues */
1438 const LilvPlugin* p = _impl->plugin;
1440 /* count non-MIDI atom event-ports
1441 * TODO: nicely ask drobilla to make a lilv_ call for that
1443 int count_atom_out = 0;
1444 int count_atom_in = 0;
1445 int minimumSize = 32768; // TODO use a per-port minimum-size
1446 for (uint32_t i = 0; i < lilv_plugin_get_num_ports(p); ++i) {
1447 const LilvPort* port = lilv_plugin_get_port_by_index(p, i);
1448 if (lilv_port_is_a(p, port, _world.atom_AtomPort)) {
1449 LilvNodes* buffer_types = lilv_port_get_value(
1450 p, port, _world.atom_bufferType);
1451 LilvNodes* atom_supports = lilv_port_get_value(
1452 p, port, _world.atom_supports);
1454 if (!lilv_nodes_contains(buffer_types, _world.atom_Sequence)
1455 || !lilv_nodes_contains(atom_supports, _world.midi_MidiEvent)) {
1456 if (lilv_port_is_a(p, port, _world.lv2_InputPort)) {
1459 if (lilv_port_is_a(p, port, _world.lv2_OutputPort)) {
1462 LilvNodes* min_size_v = lilv_port_get_value(_impl->plugin, port, _world.rsz_minimumSize);
1463 LilvNode* min_size = min_size_v ? lilv_nodes_get_first(min_size_v) : NULL;
1464 if (min_size && lilv_node_is_int(min_size)) {
1465 minimumSize = std::max(minimumSize, lilv_node_as_int(min_size));
1467 lilv_nodes_free(min_size_v);
1469 lilv_nodes_free(buffer_types);
1470 lilv_nodes_free(atom_supports);
1474 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 need buffers for %2 atom-in and %3 atom-out event-ports\n",
1475 name(), count_atom_in, count_atom_out));
1477 const int total_atom_buffers = (count_atom_in + count_atom_out);
1478 if (_atom_ev_buffers || total_atom_buffers == 0) {
1482 DEBUG_TRACE(DEBUG::LV2, string_compose("allocate %1 atom_ev_buffers\n", total_atom_buffers));
1483 _atom_ev_buffers = (LV2_Evbuf**) malloc((total_atom_buffers + 1) * sizeof(LV2_Evbuf*));
1484 for (int i = 0; i < total_atom_buffers; ++i ) {
1485 _atom_ev_buffers[i] = lv2_evbuf_new(minimumSize, LV2_EVBUF_ATOM,
1486 LV2Plugin::urids.atom_Chunk, LV2Plugin::urids.atom_Sequence);
1488 _atom_ev_buffers[total_atom_buffers] = 0;
1492 /** Write an ardour position/time/tempo/meter as an LV2 event.
1493 * @return true on success.
1496 write_position(LV2_Atom_Forge* forge,
1498 const TempoMetric& t,
1499 Timecode::BBT_Time& bbt,
1501 framepos_t position,
1504 uint8_t pos_buf[256];
1505 lv2_atom_forge_set_buffer(forge, pos_buf, sizeof(pos_buf));
1506 LV2_Atom_Forge_Frame frame;
1507 lv2_atom_forge_blank(forge, &frame, 1, LV2Plugin::urids.time_Position);
1508 lv2_atom_forge_property_head(forge, LV2Plugin::urids.time_frame, 0);
1509 lv2_atom_forge_long(forge, position);
1510 lv2_atom_forge_property_head(forge, LV2Plugin::urids.time_speed, 0);
1511 lv2_atom_forge_float(forge, speed);
1512 lv2_atom_forge_property_head(forge, LV2Plugin::urids.time_barBeat, 0);
1513 lv2_atom_forge_float(forge, bbt.beats - 1 +
1514 (bbt.ticks / Timecode::BBT_Time::ticks_per_beat));
1515 lv2_atom_forge_property_head(forge, LV2Plugin::urids.time_bar, 0);
1516 lv2_atom_forge_long(forge, bbt.bars - 1);
1517 lv2_atom_forge_property_head(forge, LV2Plugin::urids.time_beatUnit, 0);
1518 lv2_atom_forge_int(forge, t.meter().note_divisor());
1519 lv2_atom_forge_property_head(forge, LV2Plugin::urids.time_beatsPerBar, 0);
1520 lv2_atom_forge_float(forge, t.meter().divisions_per_bar());
1521 lv2_atom_forge_property_head(forge, LV2Plugin::urids.time_beatsPerMinute, 0);
1522 lv2_atom_forge_float(forge, t.tempo().beats_per_minute());
1524 LV2_Evbuf_Iterator end = lv2_evbuf_end(buf);
1525 const LV2_Atom* const atom = (const LV2_Atom*)pos_buf;
1526 return lv2_evbuf_write(&end, offset, 0, atom->type, atom->size,
1527 (const uint8_t*)(atom + 1));
1531 LV2Plugin::connect_and_run(BufferSet& bufs,
1532 ChanMapping in_map, ChanMapping out_map,
1533 pframes_t nframes, framecnt_t offset)
1535 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 run %2 offset %3\n", name(), nframes, offset));
1536 Plugin::connect_and_run(bufs, in_map, out_map, nframes, offset);
1538 cycles_t then = get_cycles();
1540 TempoMap& tmap = _session.tempo_map();
1541 Metrics::const_iterator metric_i = tmap.metrics_end();
1542 TempoMetric tmetric = tmap.metric_at(_session.transport_frame(), &metric_i);
1544 if (_freewheel_control_port) {
1545 *_freewheel_control_port = _session.engine().freewheeling();
1548 if (_bpm_control_port) {
1549 *_bpm_control_port = tmetric.tempo().beats_per_minute();
1552 ChanCount bufs_count;
1553 bufs_count.set(DataType::AUDIO, 1);
1554 bufs_count.set(DataType::MIDI, 1);
1555 BufferSet& silent_bufs = _session.get_silent_buffers(bufs_count);
1556 BufferSet& scratch_bufs = _session.get_scratch_buffers(bufs_count);
1557 uint32_t const num_ports = parameter_count();
1558 uint32_t const nil_index = std::numeric_limits<uint32_t>::max();
1560 uint32_t audio_in_index = 0;
1561 uint32_t audio_out_index = 0;
1562 uint32_t midi_in_index = 0;
1563 uint32_t midi_out_index = 0;
1564 uint32_t atom_port_index = 0;
1565 for (uint32_t port_index = 0; port_index < num_ports; ++port_index) {
1567 uint32_t index = nil_index;
1568 PortFlags flags = _port_flags[port_index];
1570 if (flags & PORT_AUDIO) {
1571 if (flags & PORT_INPUT) {
1572 index = in_map.get(DataType::AUDIO, audio_in_index++, &valid);
1574 ? bufs.get_audio(index).data(offset)
1575 : silent_bufs.get_audio(0).data(offset);
1577 index = out_map.get(DataType::AUDIO, audio_out_index++, &valid);
1579 ? bufs.get_audio(index).data(offset)
1580 : scratch_bufs.get_audio(0).data(offset);
1582 } else if (flags & (PORT_EVENT|PORT_SEQUENCE)) {
1583 /* FIXME: The checks here for bufs.count().n_midi() > index shouldn't
1584 be necessary, but the mapping is illegal in some cases. Ideally
1585 that should be fixed, but this is easier...
1587 if (flags & PORT_MIDI) {
1588 if (flags & PORT_INPUT) {
1589 index = in_map.get(DataType::MIDI, midi_in_index++, &valid);
1591 index = out_map.get(DataType::MIDI, midi_out_index++, &valid);
1593 if (valid && bufs.count().n_midi() > index) {
1594 /* Note, ensure_lv2_bufsize() is not RT safe!
1595 * However free()/alloc() is only called if a
1596 * plugin requires a rsz:minimumSize buffersize
1597 * and the existing buffer if smaller.
1599 bufs.ensure_lv2_bufsize((flags & PORT_INPUT), index, _port_minimumSize[port_index]);
1600 _ev_buffers[port_index] = bufs.get_lv2_midi(
1601 (flags & PORT_INPUT), index, (flags & PORT_EVENT));
1603 } else if ((flags & PORT_POSITION) && (flags & PORT_INPUT)) {
1604 lv2_evbuf_reset(_atom_ev_buffers[atom_port_index], true);
1605 _ev_buffers[port_index] = _atom_ev_buffers[atom_port_index++];
1609 if (valid && (flags & PORT_INPUT)) {
1610 Timecode::BBT_Time bbt;
1611 if ((flags & PORT_POSITION)) {
1612 if (_session.transport_frame() != _next_cycle_start ||
1613 _session.transport_speed() != _next_cycle_speed) {
1614 // Transport has changed, write position at cycle start
1615 tmap.bbt_time(_session.transport_frame(), bbt);
1616 write_position(&_impl->forge, _ev_buffers[port_index],
1617 tmetric, bbt, _session.transport_speed(),
1618 _session.transport_frame(), 0);
1622 // Get MIDI iterator range (empty range if no MIDI)
1623 MidiBuffer::iterator m = (index != nil_index)
1624 ? bufs.get_midi(index).begin()
1625 : silent_bufs.get_midi(0).end();
1626 MidiBuffer::iterator m_end = (index != nil_index)
1627 ? bufs.get_midi(index).end()
1630 // Now merge MIDI and any transport events into the buffer
1631 const uint32_t type = LV2Plugin::urids.midi_MidiEvent;
1632 const framepos_t tend = _session.transport_frame() + nframes;
1634 while (m != m_end || (metric_i != tmap.metrics_end() &&
1635 (*metric_i)->frame() < tend)) {
1636 MetricSection* metric = (metric_i != tmap.metrics_end())
1638 if (m != m_end && (!metric || metric->frame() > (*m).time())) {
1639 const Evoral::MIDIEvent<framepos_t> ev(*m, false);
1640 LV2_Evbuf_Iterator eend = lv2_evbuf_end(_ev_buffers[port_index]);
1641 lv2_evbuf_write(&eend, ev.time(), 0, type, ev.size(), ev.buffer());
1644 tmetric.set_metric(metric);
1645 bbt = metric->start();
1646 write_position(&_impl->forge, _ev_buffers[port_index],
1647 tmetric, bbt, _session.transport_speed(),
1649 metric->frame() - _session.transport_frame());
1653 } else if (!valid) {
1654 // Nothing we understand or care about, connect to scratch
1655 _ev_buffers[port_index] = silent_bufs.get_lv2_midi(
1656 (flags & PORT_INPUT), 0, (flags & PORT_EVENT));
1658 buf = lv2_evbuf_get_buffer(_ev_buffers[port_index]);
1660 continue; // Control port, leave buffer alone
1662 lilv_instance_connect_port(_impl->instance, port_index, buf);
1665 // Read messages from UI and push into appropriate buffers
1667 uint32_t read_space = _from_ui->read_space();
1668 while (read_space > sizeof(UIMessage)) {
1670 if (_from_ui->read((uint8_t*)&msg, sizeof(msg)) != sizeof(msg)) {
1671 error << "Error reading from UI=>Plugin RingBuffer" << endmsg;
1674 uint8_t body[msg.size];
1675 if (_from_ui->read(body, msg.size) != msg.size) {
1676 error << "Error reading from UI=>Plugin RingBuffer" << endmsg;
1679 if (msg.protocol == urids.atom_eventTransfer) {
1680 LV2_Evbuf* buf = _ev_buffers[msg.index];
1681 LV2_Evbuf_Iterator i = lv2_evbuf_end(buf);
1682 const LV2_Atom* const atom = (const LV2_Atom*)body;
1683 if (!lv2_evbuf_write(&i, nframes, 0, atom->type, atom->size,
1684 (const uint8_t*)(atom + 1))) {
1685 error << "Failed to write data to LV2 event buffer\n";
1688 error << "Received unknown message type from UI" << endmsg;
1690 read_space -= sizeof(UIMessage) + msg.size;
1697 for (uint32_t port_index = 0; port_index < num_ports; ++port_index) {
1698 PortFlags flags = _port_flags[port_index];
1701 /* TODO ask drobilla about comment
1702 * "Make Ardour event buffers generic so plugins can communicate"
1703 * in libs/ardour/buffer_set.cc:310
1705 * ideally the user could choose which of the following two modes
1706 * to use (e.g. instrument/effect chains MIDI OUT vs MIDI TRHU).
1708 * This implementation follows the discussion on IRC Mar 16 2013 16:47 UTC
1709 * 16:51 < drobilla> rgareus: [..] i.e always replace with MIDI output [of LV2 plugin] if it's there
1710 * 16:52 < drobilla> rgareus: That would probably be good enough [..] to make users not complain
1711 * for quite a while at least ;)
1713 // copy output of LV2 plugin's MIDI port to Ardour MIDI buffers -- MIDI OUT
1714 if ((flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE|PORT_MIDI))) {
1715 const uint32_t buf_index = out_map.get(
1716 DataType::MIDI, midi_out_index++, &valid);
1718 bufs.forward_lv2_midi(_ev_buffers[port_index], buf_index);
1721 // Flush MIDI (write back to Ardour MIDI buffers) -- MIDI THRU
1722 else if ((flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE))) {
1723 const uint32_t buf_index = out_map.get(
1724 DataType::MIDI, midi_out_index++, &valid);
1726 bufs.flush_lv2_midi(true, buf_index);
1730 // Write messages to UI
1731 if (_to_ui && (flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE))) {
1732 LV2_Evbuf* buf = _ev_buffers[port_index];
1733 for (LV2_Evbuf_Iterator i = lv2_evbuf_begin(buf);
1734 lv2_evbuf_is_valid(i);
1735 i = lv2_evbuf_next(i)) {
1736 uint32_t frames, subframes, type, size;
1738 lv2_evbuf_get(i, &frames, &subframes, &type, &size, &data);
1739 write_to_ui(port_index, urids.atom_eventTransfer,
1740 size + sizeof(LV2_Atom),
1741 data - sizeof(LV2_Atom));
1746 cycles_t now = get_cycles();
1747 set_cycles((uint32_t)(now - then));
1749 // Update expected transport information for next cycle so we can detect changes
1750 _next_cycle_speed = _session.transport_speed();
1751 _next_cycle_start = _session.transport_frame() + (nframes * _next_cycle_speed);
1757 LV2Plugin::parameter_is_control(uint32_t param) const
1759 assert(param < _port_flags.size());
1760 return _port_flags[param] & PORT_CONTROL;
1764 LV2Plugin::parameter_is_audio(uint32_t param) const
1766 assert(param < _port_flags.size());
1767 return _port_flags[param] & PORT_AUDIO;
1771 LV2Plugin::parameter_is_event(uint32_t param) const
1773 assert(param < _port_flags.size());
1774 return _port_flags[param] & PORT_EVENT;
1778 LV2Plugin::parameter_is_output(uint32_t param) const
1780 assert(param < _port_flags.size());
1781 return _port_flags[param] & PORT_OUTPUT;
1785 LV2Plugin::parameter_is_input(uint32_t param) const
1787 assert(param < _port_flags.size());
1788 return _port_flags[param] & PORT_INPUT;
1792 LV2Plugin::print_parameter(uint32_t param, char* buf, uint32_t len) const
1795 if (param < parameter_count()) {
1796 snprintf(buf, len, "%.3f", get_parameter(param));
1803 boost::shared_ptr<Plugin::ScalePoints>
1804 LV2Plugin::get_scale_points(uint32_t port_index) const
1806 const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, port_index);
1807 LilvScalePoints* points = lilv_port_get_scale_points(_impl->plugin, port);
1809 boost::shared_ptr<Plugin::ScalePoints> ret;
1814 ret = boost::shared_ptr<Plugin::ScalePoints>(new ScalePoints());
1816 LILV_FOREACH(scale_points, i, points) {
1817 const LilvScalePoint* p = lilv_scale_points_get(points, i);
1818 const LilvNode* label = lilv_scale_point_get_label(p);
1819 const LilvNode* value = lilv_scale_point_get_value(p);
1820 if (label && (lilv_node_is_float(value) || lilv_node_is_int(value))) {
1821 ret->insert(make_pair(lilv_node_as_string(label),
1822 lilv_node_as_float(value)));
1826 lilv_scale_points_free(points);
1831 LV2Plugin::run(pframes_t nframes)
1833 uint32_t const N = parameter_count();
1834 for (uint32_t i = 0; i < N; ++i) {
1835 if (parameter_is_control(i) && parameter_is_input(i)) {
1836 _control_data[i] = _shadow_data[i];
1840 lilv_instance_run(_impl->instance, nframes);
1842 if (_impl->work_iface) {
1843 _worker->emit_responses();
1844 if (_impl->work_iface->end_run) {
1845 _impl->work_iface->end_run(_impl->instance->lv2_handle);
1851 LV2Plugin::latency_compute_run()
1853 if (!_latency_control_port) {
1857 // Run the plugin so that it can set its latency parameter
1861 uint32_t port_index = 0;
1862 uint32_t in_index = 0;
1863 uint32_t out_index = 0;
1865 const framecnt_t bufsize = 1024;
1866 float buffer[bufsize];
1868 memset(buffer, 0, sizeof(float) * bufsize);
1870 // FIXME: Ensure plugins can handle in-place processing
1874 while (port_index < parameter_count()) {
1875 if (parameter_is_audio(port_index)) {
1876 if (parameter_is_input(port_index)) {
1877 lilv_instance_connect_port(_impl->instance, port_index, buffer);
1879 } else if (parameter_is_output(port_index)) {
1880 lilv_instance_connect_port(_impl->instance, port_index, buffer);
1892 LV2Plugin::Impl::designated_input (const char* uri, void** bufptrs[], void** bufptr)
1894 const LilvPort* port = NULL;
1895 LilvNode* designation = lilv_new_uri(_world.world, uri);
1896 port = lilv_plugin_get_port_by_designation(
1897 plugin, _world.lv2_InputPort, designation);
1898 lilv_node_free(designation);
1900 bufptrs[lilv_port_get_index(plugin, port)] = bufptr;
1905 static bool lv2_filter (const string& str, void *arg)
1907 /* Not a dotfile, has a prefix before a period, suffix is "lv2" */
1909 return str[0] != '.' && (str.length() > 3 && str.find (".lv2") == (str.length() - 4));
1913 LV2World::LV2World()
1914 : world(lilv_world_new())
1915 , _bundle_checked(false)
1917 lilv_world_load_all(world);
1919 atom_AtomPort = lilv_new_uri(world, LV2_ATOM__AtomPort);
1920 atom_Chunk = lilv_new_uri(world, LV2_ATOM__Chunk);
1921 atom_Sequence = lilv_new_uri(world, LV2_ATOM__Sequence);
1922 atom_bufferType = lilv_new_uri(world, LV2_ATOM__bufferType);
1923 atom_supports = lilv_new_uri(world, LV2_ATOM__supports);
1924 atom_eventTransfer = lilv_new_uri(world, LV2_ATOM__eventTransfer);
1925 ev_EventPort = lilv_new_uri(world, LILV_URI_EVENT_PORT);
1926 ext_logarithmic = lilv_new_uri(world, LV2_PORT_PROPS__logarithmic);
1927 ext_notOnGUI = lilv_new_uri(world, LV2_PORT_PROPS__notOnGUI);
1928 lv2_AudioPort = lilv_new_uri(world, LILV_URI_AUDIO_PORT);
1929 lv2_ControlPort = lilv_new_uri(world, LILV_URI_CONTROL_PORT);
1930 lv2_InputPort = lilv_new_uri(world, LILV_URI_INPUT_PORT);
1931 lv2_OutputPort = lilv_new_uri(world, LILV_URI_OUTPUT_PORT);
1932 lv2_inPlaceBroken = lilv_new_uri(world, LV2_CORE__inPlaceBroken);
1933 lv2_integer = lilv_new_uri(world, LV2_CORE__integer);
1934 lv2_reportsLatency = lilv_new_uri(world, LV2_CORE__reportsLatency);
1935 lv2_sampleRate = lilv_new_uri(world, LV2_CORE__sampleRate);
1936 lv2_toggled = lilv_new_uri(world, LV2_CORE__toggled);
1937 lv2_enumeration = lilv_new_uri(world, LV2_CORE__enumeration);
1938 lv2_freewheeling = lilv_new_uri(world, LV2_CORE__freeWheeling);
1939 midi_MidiEvent = lilv_new_uri(world, LILV_URI_MIDI_EVENT);
1940 rdfs_comment = lilv_new_uri(world, LILV_NS_RDFS "comment");
1941 rsz_minimumSize = lilv_new_uri(world, LV2_RESIZE_PORT__minimumSize);
1942 time_Position = lilv_new_uri(world, LV2_TIME__Position);
1943 ui_GtkUI = lilv_new_uri(world, LV2_UI__GtkUI);
1944 ui_external = lilv_new_uri(world, "http://lv2plug.in/ns/extensions/ui#external");
1947 LV2World::~LV2World()
1949 lilv_node_free(ui_external);
1950 lilv_node_free(ui_GtkUI);
1951 lilv_node_free(time_Position);
1952 lilv_node_free(rsz_minimumSize);
1953 lilv_node_free(rdfs_comment);
1954 lilv_node_free(midi_MidiEvent);
1955 lilv_node_free(lv2_enumeration);
1956 lilv_node_free(lv2_freewheeling);
1957 lilv_node_free(lv2_toggled);
1958 lilv_node_free(lv2_sampleRate);
1959 lilv_node_free(lv2_reportsLatency);
1960 lilv_node_free(lv2_integer);
1961 lilv_node_free(lv2_inPlaceBroken);
1962 lilv_node_free(lv2_OutputPort);
1963 lilv_node_free(lv2_InputPort);
1964 lilv_node_free(lv2_ControlPort);
1965 lilv_node_free(lv2_AudioPort);
1966 lilv_node_free(ext_notOnGUI);
1967 lilv_node_free(ext_logarithmic);
1968 lilv_node_free(ev_EventPort);
1969 lilv_node_free(atom_supports);
1970 lilv_node_free(atom_eventTransfer);
1971 lilv_node_free(atom_bufferType);
1972 lilv_node_free(atom_Sequence);
1973 lilv_node_free(atom_Chunk);
1974 lilv_node_free(atom_AtomPort);
1978 LV2World::load_bundled_plugins()
1980 if (!_bundle_checked) {
1981 cout << "Scanning folders for bundled LV2s: " << ARDOUR::lv2_bundled_search_path().to_string() << endl;
1982 PathScanner scanner;
1983 vector<string *> *plugin_objects = scanner (ARDOUR::lv2_bundled_search_path().to_string(), lv2_filter, 0, true, true);
1984 if (plugin_objects) {
1985 for ( vector<string *>::iterator x = plugin_objects->begin(); x != plugin_objects->end (); ++x) {
1987 string uri = "file:///" + **x + "/";
1989 string uri = "file://" + **x + "/";
1991 LilvNode *node = lilv_new_uri(world, uri.c_str());
1992 lilv_world_load_bundle(world, node);
1993 lilv_node_free(node);
1996 delete (plugin_objects);
1998 _bundle_checked = true;
2002 LV2PluginInfo::LV2PluginInfo (const void* c_plugin)
2003 : _c_plugin(c_plugin)
2008 LV2PluginInfo::~LV2PluginInfo()
2012 LV2PluginInfo::load(Session& session)
2017 plugin.reset(new LV2Plugin(session.engine(), session,
2018 (const LilvPlugin*)_c_plugin,
2019 session.frame_rate()));
2021 plugin->set_info(PluginInfoPtr(new LV2PluginInfo(*this)));
2023 } catch (failed_constructor& err) {
2024 return PluginPtr((Plugin*)0);
2031 LV2PluginInfo::discover()
2033 _world.load_bundled_plugins();
2035 PluginInfoList* plugs = new PluginInfoList;
2036 const LilvPlugins* plugins = lilv_world_get_all_plugins(_world.world);
2038 info << "LV2: Discovering " << lilv_plugins_size(plugins) << " plugins" << endmsg;
2040 LILV_FOREACH(plugins, i, plugins) {
2041 const LilvPlugin* p = lilv_plugins_get(plugins, i);
2042 LV2PluginInfoPtr info(new LV2PluginInfo((const void*)p));
2044 LilvNode* name = lilv_plugin_get_name(p);
2045 if (!name || !lilv_plugin_get_port_by_index(p, 0)) {
2046 warning << "Ignoring invalid LV2 plugin "
2047 << lilv_node_as_string(lilv_plugin_get_uri(p))
2054 info->name = string(lilv_node_as_string(name));
2055 lilv_node_free(name);
2057 const LilvPluginClass* pclass = lilv_plugin_get_class(p);
2058 const LilvNode* label = lilv_plugin_class_get_label(pclass);
2059 info->category = lilv_node_as_string(label);
2061 LilvNode* author_name = lilv_plugin_get_author_name(p);
2062 info->creator = author_name ? string(lilv_node_as_string(author_name)) : "Unknown";
2063 lilv_node_free(author_name);
2065 info->path = "/NOPATH"; // Meaningless for LV2
2067 /* count atom-event-ports that feature
2068 * atom:supports <http://lv2plug.in/ns/ext/midi#MidiEvent>
2070 * TODO: nicely ask drobilla to make a lilv_ call for that
2072 int count_midi_out = 0;
2073 int count_midi_in = 0;
2074 for (uint32_t i = 0; i < lilv_plugin_get_num_ports(p); ++i) {
2075 const LilvPort* port = lilv_plugin_get_port_by_index(p, i);
2076 if (lilv_port_is_a(p, port, _world.atom_AtomPort)) {
2077 LilvNodes* buffer_types = lilv_port_get_value(
2078 p, port, _world.atom_bufferType);
2079 LilvNodes* atom_supports = lilv_port_get_value(
2080 p, port, _world.atom_supports);
2082 if (lilv_nodes_contains(buffer_types, _world.atom_Sequence)
2083 && lilv_nodes_contains(atom_supports, _world.midi_MidiEvent)) {
2084 if (lilv_port_is_a(p, port, _world.lv2_InputPort)) {
2087 if (lilv_port_is_a(p, port, _world.lv2_OutputPort)) {
2091 lilv_nodes_free(buffer_types);
2092 lilv_nodes_free(atom_supports);
2096 info->n_inputs.set_audio(
2097 lilv_plugin_get_num_ports_of_class(
2098 p, _world.lv2_InputPort, _world.lv2_AudioPort, NULL));
2099 info->n_inputs.set_midi(
2100 lilv_plugin_get_num_ports_of_class(
2101 p, _world.lv2_InputPort, _world.ev_EventPort, NULL)
2104 info->n_outputs.set_audio(
2105 lilv_plugin_get_num_ports_of_class(
2106 p, _world.lv2_OutputPort, _world.lv2_AudioPort, NULL));
2107 info->n_outputs.set_midi(
2108 lilv_plugin_get_num_ports_of_class(
2109 p, _world.lv2_OutputPort, _world.ev_EventPort, NULL)
2112 info->unique_id = lilv_node_as_uri(lilv_plugin_get_uri(p));
2113 info->index = 0; // Meaningless for LV2
2115 plugs->push_back(info);