2 Copyright (C) 2008-2012 Paul Davis
3 Author: David Robillard
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
28 #include <glib/gstdio.h>
29 #include <glib/gprintf.h>
32 #include <boost/utility.hpp>
34 #include "pbd/clear_dir.h"
35 #include "pbd/file_utils.h"
36 #include "pbd/stl_delete.h"
37 #include "pbd/compose.h"
38 #include "pbd/error.h"
39 #include "pbd/xml++.h"
41 #include "libardour-config.h"
43 #include "ardour/audio_buffer.h"
44 #include "ardour/audioengine.h"
45 #include "ardour/debug.h"
46 #include "ardour/lv2_plugin.h"
47 #include "ardour/session.h"
48 #include "ardour/tempo.h"
49 #include "ardour/types.h"
50 #include "ardour/utils.h"
51 #include "ardour/worker.h"
52 #include "ardour/search_paths.h"
57 #include <lilv/lilv.h>
59 #include "lv2/lv2plug.in/ns/ext/atom/atom.h"
60 #include "lv2/lv2plug.in/ns/ext/atom/forge.h"
61 #include "lv2/lv2plug.in/ns/ext/log/log.h"
62 #include "lv2/lv2plug.in/ns/ext/midi/midi.h"
63 #include "lv2/lv2plug.in/ns/ext/port-props/port-props.h"
64 #include "lv2/lv2plug.in/ns/ext/presets/presets.h"
65 #include "lv2/lv2plug.in/ns/ext/state/state.h"
66 #include "lv2/lv2plug.in/ns/ext/time/time.h"
67 #include "lv2/lv2plug.in/ns/ext/worker/worker.h"
68 #include "lv2/lv2plug.in/ns/ext/resize-port/resize-port.h"
69 #include "lv2/lv2plug.in/ns/extensions/ui/ui.h"
71 #include "lv2/lv2plug.in/ns/ext/buf-size/buf-size.h"
72 #include "lv2/lv2plug.in/ns/ext/options/options.h"
75 #include "lv2_evbuf.h"
78 #include <suil/suil.h>
81 /** The number of MIDI buffers that will fit in a UI/worker comm buffer.
82 This needs to be roughly the number of cycles the UI will get around to
83 actually processing the traffic. Lower values are flakier but save memory.
85 static const size_t NBUFS = 4;
88 using namespace ARDOUR;
91 URIMap LV2Plugin::_uri_map;
93 LV2Plugin::URIDs LV2Plugin::urids = {
94 _uri_map.uri_to_id(LV2_ATOM__Chunk),
95 _uri_map.uri_to_id(LV2_ATOM__Path),
96 _uri_map.uri_to_id(LV2_ATOM__Sequence),
97 _uri_map.uri_to_id(LV2_ATOM__eventTransfer),
98 _uri_map.uri_to_id(LV2_LOG__Error),
99 _uri_map.uri_to_id(LV2_LOG__Note),
100 _uri_map.uri_to_id(LV2_LOG__Warning),
101 _uri_map.uri_to_id(LV2_MIDI__MidiEvent),
102 _uri_map.uri_to_id(LV2_TIME__Position),
103 _uri_map.uri_to_id(LV2_TIME__bar),
104 _uri_map.uri_to_id(LV2_TIME__barBeat),
105 _uri_map.uri_to_id(LV2_TIME__beatUnit),
106 _uri_map.uri_to_id(LV2_TIME__beatsPerBar),
107 _uri_map.uri_to_id(LV2_TIME__beatsPerMinute),
108 _uri_map.uri_to_id(LV2_TIME__frame),
109 _uri_map.uri_to_id(LV2_TIME__speed)
112 class LV2World : boost::noncopyable {
117 void load_bundled_plugins();
121 LilvNode* atom_AtomPort;
122 LilvNode* atom_Chunk;
123 LilvNode* atom_Sequence;
124 LilvNode* atom_bufferType;
125 LilvNode* atom_eventTransfer;
126 LilvNode* atom_supports;
127 LilvNode* ev_EventPort;
128 LilvNode* ext_logarithmic;
129 LilvNode* ext_notOnGUI;
130 LilvNode* lv2_AudioPort;
131 LilvNode* lv2_ControlPort;
132 LilvNode* lv2_InputPort;
133 LilvNode* lv2_OutputPort;
134 LilvNode* lv2_enumeration;
135 LilvNode* lv2_freewheeling;
136 LilvNode* lv2_inPlaceBroken;
137 LilvNode* lv2_integer;
138 LilvNode* lv2_reportsLatency;
139 LilvNode* lv2_sampleRate;
140 LilvNode* lv2_toggled;
141 LilvNode* midi_MidiEvent;
142 LilvNode* rdfs_comment;
143 LilvNode* rsz_minimumSize;
144 LilvNode* time_Position;
146 LilvNode* ui_external;
147 LilvNode* ui_externalkx;
148 LilvNode* units_unit;
149 LilvNode* units_midiNote;
152 bool _bundle_checked;
155 static LV2World _world;
157 /* worker extension */
159 /** Called by the plugin to schedule non-RT work. */
160 static LV2_Worker_Status
161 work_schedule(LV2_Worker_Schedule_Handle handle,
165 LV2Plugin* plugin = (LV2Plugin*)handle;
166 if (plugin->session().engine().freewheeling()) {
167 // Freewheeling, do the work immediately in this (audio) thread
168 return (LV2_Worker_Status)plugin->work(size, data);
170 // Enqueue message for the worker thread
171 return plugin->worker()->schedule(size, data) ?
172 LV2_WORKER_SUCCESS : LV2_WORKER_ERR_UNKNOWN;
176 /** Called by the plugin to respond to non-RT work. */
177 static LV2_Worker_Status
178 work_respond(LV2_Worker_Respond_Handle handle,
182 LV2Plugin* plugin = (LV2Plugin*)handle;
183 if (plugin->session().engine().freewheeling()) {
184 // Freewheeling, respond immediately in this (audio) thread
185 return (LV2_Worker_Status)plugin->work_response(size, data);
187 // Enqueue response for the worker
188 return plugin->worker()->respond(size, data) ?
189 LV2_WORKER_SUCCESS : LV2_WORKER_ERR_UNKNOWN;
196 log_vprintf(LV2_Log_Handle /*handle*/,
202 const int ret = g_vasprintf(&str, fmt, args);
203 if (type == LV2Plugin::urids.log_Error) {
204 error << str << endmsg;
205 } else if (type == LV2Plugin::urids.log_Warning) {
206 warning << str << endmsg;
207 } else if (type == LV2Plugin::urids.log_Note) {
208 info << str << endmsg;
210 // TODO: Toggleable log:Trace message support
215 log_printf(LV2_Log_Handle handle,
217 const char* fmt, ...)
221 const int ret = log_vprintf(handle, type, fmt, args);
226 struct LV2Plugin::Impl {
227 Impl() : plugin(0), ui(0), ui_type(0), name(0), author(0), instance(0)
232 /** Find the LV2 input port with the given designation.
233 * If found, bufptrs[port_index] will be set to bufptr.
235 const LilvPort* designated_input (const char* uri, void** bufptrs[], void** bufptr);
237 const LilvPlugin* plugin;
239 const LilvNode* ui_type;
242 LilvInstance* instance;
243 const LV2_Worker_Interface* work_iface;
245 LV2_Atom_Forge forge;
248 LV2Plugin::LV2Plugin (AudioEngine& engine,
250 const void* c_plugin,
252 : Plugin (engine, session)
259 init(c_plugin, rate);
262 LV2Plugin::LV2Plugin (const LV2Plugin& other)
268 , _insert_id(other._insert_id)
270 init(other._impl->plugin, other._sample_rate);
272 for (uint32_t i = 0; i < parameter_count(); ++i) {
273 _control_data[i] = other._shadow_data[i];
274 _shadow_data[i] = other._shadow_data[i];
279 LV2Plugin::init(const void* c_plugin, framecnt_t rate)
281 DEBUG_TRACE(DEBUG::LV2, "init\n");
283 _impl->plugin = (const LilvPlugin*)c_plugin;
285 _impl->ui_type = NULL;
290 _atom_ev_buffers = 0;
292 _bpm_control_port = 0;
293 _freewheel_control_port = 0;
294 _latency_control_port = 0;
295 _next_cycle_start = std::numeric_limits<framepos_t>::max();
296 _next_cycle_speed = 1.0;
297 _block_length = _engine.samples_per_cycle();
298 _seq_size = _engine.raw_buffer_size(DataType::MIDI);
300 _was_activated = false;
301 _has_state_interface = false;
303 _instance_access_feature.URI = "http://lv2plug.in/ns/ext/instance-access";
304 _data_access_feature.URI = "http://lv2plug.in/ns/ext/data-access";
305 _make_path_feature.URI = LV2_STATE__makePath;
306 _log_feature.URI = LV2_LOG__log;
307 _work_schedule_feature.URI = LV2_WORKER__schedule;
308 _work_schedule_feature.data = NULL;
309 _def_state_feature.URI = LV2_STATE_PREFIX "loadDefaultState"; // Post LV2-1.2.0
310 _def_state_feature.data = NULL;
312 const LilvPlugin* plugin = _impl->plugin;
314 LilvNode* state_iface_uri = lilv_new_uri(_world.world, LV2_STATE__interface);
315 LilvNode* state_uri = lilv_new_uri(_world.world, LV2_STATE_URI);
316 _has_state_interface =
317 // What plugins should have (lv2:extensionData state:Interface)
318 lilv_plugin_has_extension_data(plugin, state_iface_uri)
319 // What some outdated/incorrect ones have
320 || lilv_plugin_has_feature(plugin, state_uri);
321 lilv_node_free(state_uri);
322 lilv_node_free(state_iface_uri);
324 _features = (LV2_Feature**)calloc(11, sizeof(LV2_Feature*));
325 _features[0] = &_instance_access_feature;
326 _features[1] = &_data_access_feature;
327 _features[2] = &_make_path_feature;
328 _features[3] = _uri_map.uri_map_feature();
329 _features[4] = _uri_map.urid_map_feature();
330 _features[5] = _uri_map.urid_unmap_feature();
331 _features[6] = &_log_feature;
333 unsigned n_features = 7;
335 _features[n_features++] = &_def_state_feature;
338 lv2_atom_forge_init(&_impl->forge, _uri_map.urid_map());
341 LV2_URID atom_Int = _uri_map.uri_to_id(LV2_ATOM__Int);
342 LV2_Options_Option options[] = {
343 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id(LV2_BUF_SIZE__minBlockLength),
344 sizeof(int32_t), atom_Int, &_block_length },
345 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id(LV2_BUF_SIZE__maxBlockLength),
346 sizeof(int32_t), atom_Int, &_block_length },
347 { LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id(LV2_BUF_SIZE__sequenceSize),
348 sizeof(int32_t), atom_Int, &_seq_size },
349 { LV2_OPTIONS_INSTANCE, 0, 0, 0, 0, NULL }
352 _options_feature.URI = LV2_OPTIONS__options;
353 _options_feature.data = options;
354 _features[n_features++] = &_options_feature;
357 LV2_State_Make_Path* make_path = (LV2_State_Make_Path*)malloc(
358 sizeof(LV2_State_Make_Path));
359 make_path->handle = this;
360 make_path->path = &lv2_state_make_path;
361 _make_path_feature.data = make_path;
363 LV2_Log_Log* log = (LV2_Log_Log*)malloc(sizeof(LV2_Log_Log));
365 log->printf = &log_printf;
366 log->vprintf = &log_vprintf;
367 _log_feature.data = log;
369 LilvNode* worker_schedule = lilv_new_uri(_world.world, LV2_WORKER__schedule);
370 if (lilv_plugin_has_feature(plugin, worker_schedule)) {
371 LV2_Worker_Schedule* schedule = (LV2_Worker_Schedule*)malloc(
372 sizeof(LV2_Worker_Schedule));
373 size_t buf_size = _session.engine().raw_buffer_size(DataType::MIDI) * NBUFS;
374 _worker = new Worker(this, buf_size);
375 schedule->handle = this;
376 schedule->schedule_work = work_schedule;
377 _work_schedule_feature.data = schedule;
378 _features[n_features++] = &_work_schedule_feature;
380 lilv_node_free(worker_schedule);
382 _impl->instance = lilv_plugin_instantiate(plugin, rate, _features);
383 _impl->name = lilv_plugin_get_name(plugin);
384 _impl->author = lilv_plugin_get_author_name(plugin);
386 if (_impl->instance == 0) {
387 error << _("LV2: Failed to instantiate plugin ") << uri() << endmsg;
388 throw failed_constructor();
391 _instance_access_feature.data = (void*)_impl->instance->lv2_handle;
392 _data_access_extension_data.extension_data = _impl->instance->lv2_descriptor->extension_data;
393 _data_access_feature.data = &_data_access_extension_data;
395 LilvNode* worker_iface_uri = lilv_new_uri(_world.world, LV2_WORKER__interface);
396 if (lilv_plugin_has_extension_data(plugin, worker_iface_uri)) {
397 _impl->work_iface = (const LV2_Worker_Interface*)extension_data(
398 LV2_WORKER__interface);
400 lilv_node_free(worker_iface_uri);
402 if (lilv_plugin_has_feature(plugin, _world.lv2_inPlaceBroken)) {
403 error << string_compose(
404 _("LV2: \"%1\" cannot be used, since it cannot do inplace processing"),
405 lilv_node_as_string(_impl->name)) << endmsg;
406 lilv_node_free(_impl->name);
407 lilv_node_free(_impl->author);
408 throw failed_constructor();
412 // Load default state
413 LilvState* state = lilv_state_new_from_world(
414 _world.world, _uri_map.urid_map(), lilv_plugin_get_uri(_impl->plugin));
415 if (state && _has_state_interface) {
416 lilv_state_restore(state, _impl->instance, NULL, NULL, 0, NULL);
422 const uint32_t num_ports = this->num_ports();
423 for (uint32_t i = 0; i < num_ports; ++i) {
424 const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, i);
426 size_t minimumSize = 0;
428 if (lilv_port_is_a(_impl->plugin, port, _world.lv2_OutputPort)) {
429 flags |= PORT_OUTPUT;
430 } else if (lilv_port_is_a(_impl->plugin, port, _world.lv2_InputPort)) {
433 error << string_compose(
434 "LV2: \"%1\" port %2 is neither input nor output",
435 lilv_node_as_string(_impl->name), i) << endmsg;
436 throw failed_constructor();
439 if (lilv_port_is_a(_impl->plugin, port, _world.lv2_ControlPort)) {
440 flags |= PORT_CONTROL;
441 } else if (lilv_port_is_a(_impl->plugin, port, _world.lv2_AudioPort)) {
443 } else if (lilv_port_is_a(_impl->plugin, port, _world.ev_EventPort)) {
445 flags |= PORT_MIDI; // We assume old event API ports are for MIDI
446 } else if (lilv_port_is_a(_impl->plugin, port, _world.atom_AtomPort)) {
447 LilvNodes* buffer_types = lilv_port_get_value(
448 _impl->plugin, port, _world.atom_bufferType);
449 LilvNodes* atom_supports = lilv_port_get_value(
450 _impl->plugin, port, _world.atom_supports);
452 if (lilv_nodes_contains(buffer_types, _world.atom_Sequence)) {
453 flags |= PORT_SEQUENCE;
454 if (lilv_nodes_contains(atom_supports, _world.midi_MidiEvent)) {
457 if (lilv_nodes_contains(atom_supports, _world.time_Position)) {
458 flags |= PORT_POSITION;
461 LilvNodes* min_size_v = lilv_port_get_value(_impl->plugin, port, _world.rsz_minimumSize);
462 LilvNode* min_size = min_size_v ? lilv_nodes_get_first(min_size_v) : NULL;
463 if (min_size && lilv_node_is_int(min_size)) {
464 minimumSize = lilv_node_as_int(min_size);
466 lilv_nodes_free(min_size_v);
467 lilv_nodes_free(buffer_types);
468 lilv_nodes_free(atom_supports);
470 error << string_compose(
471 "LV2: \"%1\" port %2 has no known data type",
472 lilv_node_as_string(_impl->name), i) << endmsg;
473 throw failed_constructor();
476 _port_flags.push_back(flags);
477 _port_minimumSize.push_back(minimumSize);
480 _control_data = new float[num_ports];
481 _shadow_data = new float[num_ports];
482 _defaults = new float[num_ports];
483 _ev_buffers = new LV2_Evbuf*[num_ports];
484 memset(_ev_buffers, 0, sizeof(LV2_Evbuf*) * num_ports);
486 const bool latent = lilv_plugin_has_latency(plugin);
487 const uint32_t latency_index = (latent)
488 ? lilv_plugin_get_latency_port_index(plugin)
491 // Build an array of pointers to special parameter buffers
492 void*** params = new void**[num_ports];
493 for (uint32_t i = 0; i < num_ports; ++i) {
496 _impl->designated_input (LV2_TIME__beatsPerMinute, params, (void**)&_bpm_control_port);
497 _impl->designated_input (LV2_CORE__freeWheeling, params, (void**)&_freewheel_control_port);
499 for (uint32_t i = 0; i < num_ports; ++i) {
500 const LilvPort* port = lilv_plugin_get_port_by_index(plugin, i);
501 const LilvNode* sym = lilv_port_get_symbol(plugin, port);
503 // Store index in map so we can look up index by symbol
504 _port_indices.insert(std::make_pair(lilv_node_as_string(sym), i));
506 // Get range and default value if applicable
507 if (parameter_is_control(i)) {
509 lilv_port_get_range(plugin, port, &def, NULL, NULL);
510 _defaults[i] = def ? lilv_node_as_float(def) : 0.0f;
511 if (lilv_port_has_property (plugin, port, _world.lv2_sampleRate)) {
512 _defaults[i] *= _session.frame_rate ();
516 lilv_instance_connect_port(_impl->instance, i, &_control_data[i]);
518 if (latent && i == latency_index) {
519 _latency_control_port = &_control_data[i];
520 *_latency_control_port = 0;
523 if (parameter_is_input(i)) {
524 _shadow_data[i] = default_value(i);
526 *params[i] = (void*)&_shadow_data[i];
536 LilvUIs* uis = lilv_plugin_get_uis(plugin);
537 if (lilv_uis_size(uis) > 0) {
539 // Look for embeddable UI
540 LILV_FOREACH(uis, u, uis) {
541 const LilvUI* this_ui = lilv_uis_get(uis, u);
542 const LilvNode* this_ui_type = NULL;
543 if (lilv_ui_is_supported(this_ui,
547 // TODO: Multiple UI support
549 _impl->ui_type = this_ui_type;
554 // Look for Gtk native UI
555 LILV_FOREACH(uis, i, uis) {
556 const LilvUI* ui = lilv_uis_get(uis, i);
557 if (lilv_ui_is_a(ui, _world.ui_GtkUI)) {
559 _impl->ui_type = _world.ui_GtkUI;
565 // If Gtk UI is not available, try to find external UI
567 LILV_FOREACH(uis, i, uis) {
568 const LilvUI* ui = lilv_uis_get(uis, i);
569 if (lilv_ui_is_a(ui, _world.ui_externalkx)) {
571 _impl->ui_type = _world.ui_external;
574 if (lilv_ui_is_a(ui, _world.ui_external)) {
576 _impl->ui_type = _world.ui_external;
582 allocate_atom_event_buffers();
583 latency_compute_run();
586 LV2Plugin::~LV2Plugin ()
588 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 destroy\n", name()));
593 lilv_instance_free(_impl->instance);
594 lilv_node_free(_impl->name);
595 lilv_node_free(_impl->author);
598 free(_make_path_feature.data);
599 free(_work_schedule_feature.data);
605 if (_atom_ev_buffers) {
606 LV2_Evbuf** b = _atom_ev_buffers;
611 free(_atom_ev_buffers);
614 delete [] _control_data;
615 delete [] _shadow_data;
616 delete [] _ev_buffers;
620 LV2Plugin::is_external_ui() const
625 return lilv_ui_is_a(_impl->ui, _world.ui_external) || lilv_ui_is_a(_impl->ui, _world.ui_externalkx);
629 LV2Plugin::is_external_kx() const
634 return lilv_ui_is_a(_impl->ui, _world.ui_externalkx);
638 LV2Plugin::ui_is_resizable () const
640 const LilvNode* s = lilv_ui_get_uri(_impl->ui);
641 LilvNode* p = lilv_new_uri(_world.world, LV2_CORE__optionalFeature);
642 LilvNode* fs = lilv_new_uri(_world.world, LV2_UI__fixedSize);
643 LilvNode* nrs = lilv_new_uri(_world.world, LV2_UI__noUserResize);
645 LilvNodes* fs_matches = lilv_world_find_nodes(_world.world, s, p, fs);
646 LilvNodes* nrs_matches = lilv_world_find_nodes(_world.world, s, p, nrs);
648 lilv_nodes_free(nrs_matches);
649 lilv_nodes_free(fs_matches);
654 return !fs_matches && !nrs_matches;
658 LV2Plugin::unique_id() const
660 return lilv_node_as_uri(lilv_plugin_get_uri(_impl->plugin));
664 LV2Plugin::uri() const
666 return lilv_node_as_uri(lilv_plugin_get_uri(_impl->plugin));
670 LV2Plugin::label() const
672 return lilv_node_as_string(_impl->name);
676 LV2Plugin::name() const
678 return lilv_node_as_string(_impl->name);
682 LV2Plugin::maker() const
684 return _impl->author ? lilv_node_as_string (_impl->author) : "Unknown";
688 LV2Plugin::num_ports() const
690 return lilv_plugin_get_num_ports(_impl->plugin);
694 LV2Plugin::parameter_count() const
696 return lilv_plugin_get_num_ports(_impl->plugin);
700 LV2Plugin::default_value(uint32_t port)
702 return _defaults[port];
706 LV2Plugin::port_symbol(uint32_t index) const
708 const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, index);
710 error << name() << ": Invalid port index " << index << endmsg;
713 const LilvNode* sym = lilv_port_get_symbol(_impl->plugin, port);
714 return lilv_node_as_string(sym);
718 LV2Plugin::port_index (const char* symbol) const
720 const map<string, uint32_t>::const_iterator i = _port_indices.find(symbol);
721 if (i != _port_indices.end()) {
724 warning << string_compose(_("LV2: Unknown port %1"), symbol) << endmsg;
730 LV2Plugin::set_parameter(uint32_t which, float val)
732 DEBUG_TRACE(DEBUG::LV2, string_compose(
733 "%1 set parameter %2 to %3\n", name(), which, val));
735 if (which < lilv_plugin_get_num_ports(_impl->plugin)) {
736 if (get_parameter (which) == val) {
740 _shadow_data[which] = val;
742 warning << string_compose(
743 _("Illegal parameter number used with plugin \"%1\". "
744 "This is a bug in either %2 or the LV2 plugin <%3>"),
745 name(), PROGRAM_NAME, unique_id()) << endmsg;
748 Plugin::set_parameter(which, val);
752 LV2Plugin::get_parameter(uint32_t which) const
754 if (parameter_is_input(which)) {
755 return (float)_shadow_data[which];
757 return (float)_control_data[which];
763 LV2Plugin::get_docs() const
765 LilvNodes* comments = lilv_plugin_get_value(_impl->plugin, _world.rdfs_comment);
767 const std::string docs(lilv_node_as_string(lilv_nodes_get_first(comments)));
768 lilv_nodes_free(comments);
776 LV2Plugin::get_parameter_docs(uint32_t which) const
778 LilvNodes* comments = lilv_port_get_value(
780 lilv_plugin_get_port_by_index(_impl->plugin, which),
781 _world.rdfs_comment);
784 const std::string docs(lilv_node_as_string(lilv_nodes_get_first(comments)));
785 lilv_nodes_free(comments);
793 LV2Plugin::nth_parameter(uint32_t n, bool& ok) const
796 for (uint32_t c = 0, x = 0; x < lilv_plugin_get_num_ports(_impl->plugin); ++x) {
797 if (parameter_is_control(x)) {
809 LV2Plugin::extension_data(const char* uri) const
811 return lilv_instance_get_extension_data(_impl->instance, uri);
815 LV2Plugin::c_plugin()
817 return _impl->plugin;
823 return (const void*)_impl->ui;
827 LV2Plugin::c_ui_type()
829 return (const void*)_impl->ui_type;
832 /** Directory for all plugin state. */
834 LV2Plugin::plugin_dir() const
836 return Glib::build_filename(_session.plugins_dir(), _insert_id.to_s());
839 /** Directory for files created by the plugin (except during save). */
841 LV2Plugin::scratch_dir() const
843 return Glib::build_filename(plugin_dir(), "scratch");
846 /** Directory for snapshots of files in the scratch directory. */
848 LV2Plugin::file_dir() const
850 return Glib::build_filename(plugin_dir(), "files");
853 /** Directory to save state snapshot version @c num into. */
855 LV2Plugin::state_dir(unsigned num) const
857 return Glib::build_filename(plugin_dir(), string_compose("state%1", num));
860 /** Implementation of state:makePath for files created at instantiation time.
861 * Note this is not used for files created at save time (Lilv deals with that).
864 LV2Plugin::lv2_state_make_path(LV2_State_Make_Path_Handle handle,
867 LV2Plugin* me = (LV2Plugin*)handle;
868 if (me->_insert_id == PBD::ID("0")) {
869 warning << string_compose(
870 "File path \"%1\" requested but LV2 %2 has no insert ID",
871 path, me->name()) << endmsg;
872 return g_strdup(path);
875 const std::string abs_path = Glib::build_filename(me->scratch_dir(), path);
876 const std::string dirname = Glib::path_get_dirname(abs_path);
877 g_mkdir_with_parents(dirname.c_str(), 0744);
879 DEBUG_TRACE(DEBUG::LV2, string_compose("new file path %1 => %2\n",
882 return g_strndup(abs_path.c_str(), abs_path.length());
886 LV2Plugin::add_state(XMLNode* root) const
888 assert(_insert_id != PBD::ID("0"));
892 LocaleGuard lg(X_("POSIX"));
894 for (uint32_t i = 0; i < parameter_count(); ++i) {
895 if (parameter_is_input(i) && parameter_is_control(i)) {
896 child = new XMLNode("Port");
897 child->add_property("symbol", port_symbol(i));
898 snprintf(buf, sizeof(buf), "%+f", _shadow_data[i]);
899 child->add_property("value", string(buf));
900 root->add_child_nocopy(*child);
904 if (_has_state_interface) {
905 // Provisionally increment state version and create directory
906 const std::string new_dir = state_dir(++_state_version);
907 g_mkdir_with_parents(new_dir.c_str(), 0744);
909 LilvState* state = lilv_state_new_from_instance(
913 scratch_dir().c_str(),
915 _session.externals_dir().c_str(),
918 const_cast<LV2Plugin*>(this),
922 if (!_impl->state || !lilv_state_equals(state, _impl->state)) {
923 lilv_state_save(_world.world,
925 _uri_map.urid_unmap(),
931 lilv_state_free(_impl->state);
932 _impl->state = state;
934 // State is identical, decrement version and nuke directory
935 lilv_state_free(state);
936 PBD::remove_directory(new_dir);
940 root->add_property("state-dir", string_compose("state%1", _state_version));
944 static inline const LilvNode*
945 get_value(LilvWorld* world, const LilvNode* subject, const LilvNode* predicate)
947 LilvNodes* vs = lilv_world_find_nodes(world, subject, predicate, NULL);
948 return vs ? lilv_nodes_get_first(vs) : NULL;
952 LV2Plugin::find_presets()
954 LilvNode* lv2_appliesTo = lilv_new_uri(_world.world, LV2_CORE__appliesTo);
955 LilvNode* pset_Preset = lilv_new_uri(_world.world, LV2_PRESETS__Preset);
956 LilvNode* rdfs_label = lilv_new_uri(_world.world, LILV_NS_RDFS "label");
958 LilvNodes* presets = lilv_plugin_get_related(_impl->plugin, pset_Preset);
959 LILV_FOREACH(nodes, i, presets) {
960 const LilvNode* preset = lilv_nodes_get(presets, i);
961 lilv_world_load_resource(_world.world, preset);
962 const LilvNode* name = get_value(_world.world, preset, rdfs_label);
964 _presets.insert(std::make_pair(lilv_node_as_string(preset),
965 Plugin::PresetRecord(
966 lilv_node_as_string(preset),
967 lilv_node_as_string(name))));
969 warning << string_compose(
970 _("Plugin \"%1\" preset \"%2\" is missing a label\n"),
971 lilv_node_as_string(lilv_plugin_get_uri(_impl->plugin)),
972 lilv_node_as_string(preset)) << endmsg;
975 lilv_nodes_free(presets);
977 lilv_node_free(rdfs_label);
978 lilv_node_free(pset_Preset);
979 lilv_node_free(lv2_appliesTo);
983 set_port_value(const char* port_symbol,
989 LV2Plugin* self = (LV2Plugin*)user_data;
990 if (type != 0 && type != self->_uri_map.uri_to_id(LV2_ATOM__Float)) {
991 return; // TODO: Support non-float ports
994 const uint32_t port_index = self->port_index(port_symbol);
995 if (port_index != (uint32_t)-1) {
996 self->set_parameter(port_index, *(const float*)value);
1001 LV2Plugin::load_preset(PresetRecord r)
1003 LilvWorld* world = _world.world;
1004 LilvNode* pset = lilv_new_uri(world, r.uri.c_str());
1005 LilvState* state = lilv_state_new_from_world(world, _uri_map.urid_map(), pset);
1008 lilv_state_restore(state, _impl->instance, set_port_value, this, 0, NULL);
1009 lilv_state_free(state);
1010 Plugin::load_preset(r);
1013 lilv_node_free(pset);
1018 ARDOUR::lv2plugin_get_port_value(const char* port_symbol,
1023 LV2Plugin *plugin = (LV2Plugin *) user_data;
1025 uint32_t index = plugin->port_index(port_symbol);
1026 if (index != (uint32_t) -1) {
1027 if (plugin->parameter_is_input(index) && plugin->parameter_is_control(index)) {
1029 *size = sizeof(float);
1030 *type = plugin->_uri_map.uri_to_id(LV2_ATOM__Float);
1031 value = &plugin->_shadow_data[index];
1043 LV2Plugin::do_save_preset(string name)
1045 const string base_name = legalize_for_uri(name);
1046 const string file_name = base_name + ".ttl";
1047 const string bundle = Glib::build_filename(
1048 Glib::get_home_dir(),
1049 Glib::build_filename(".lv2", base_name + ".lv2"));
1051 LilvState* state = lilv_state_new_from_instance(
1054 _uri_map.urid_map(),
1055 scratch_dir().c_str(), // file_dir
1056 bundle.c_str(), // copy_dir
1057 bundle.c_str(), // link_dir
1058 bundle.c_str(), // save_dir
1059 lv2plugin_get_port_value, // get_value
1060 (void*)this, // user_data
1061 LV2_STATE_IS_POD|LV2_STATE_IS_PORTABLE, // flags
1062 _features // features
1065 lilv_state_set_label(state, name.c_str());
1067 _world.world, // world
1068 _uri_map.urid_map(), // map
1069 _uri_map.urid_unmap(), // unmap
1071 NULL, // uri (NULL = use file URI)
1072 bundle.c_str(), // dir
1073 file_name.c_str() // filename
1076 lilv_state_free(state);
1078 std::string uri = Glib::filename_to_uri(Glib::build_filename(bundle, file_name));
1079 LilvNode *node_bundle = lilv_new_uri(_world.world, Glib::filename_to_uri(Glib::build_filename(bundle, "/")).c_str());
1080 LilvNode *node_preset = lilv_new_uri(_world.world, uri.c_str());
1081 lilv_world_load_bundle(_world.world, node_bundle);
1082 lilv_world_load_resource(_world.world, node_preset);
1083 lilv_node_free(node_bundle);
1084 lilv_node_free(node_preset);
1089 LV2Plugin::do_remove_preset(string name)
1091 string preset_file = Glib::build_filename(
1092 Glib::get_home_dir(),
1093 Glib::build_filename(
1094 Glib::build_filename(".lv2", "presets"),
1098 ::g_unlink(preset_file.c_str());
1102 LV2Plugin::has_editor() const
1104 return _impl->ui != NULL;
1108 LV2Plugin::has_message_output() const
1110 for (uint32_t i = 0; i < num_ports(); ++i) {
1111 if ((_port_flags[i] & PORT_SEQUENCE) &&
1112 (_port_flags[i] & PORT_OUTPUT)) {
1120 LV2Plugin::write_to(RingBuffer<uint8_t>* dest,
1124 const uint8_t* body)
1126 const uint32_t buf_size = sizeof(UIMessage) + size;
1127 vector<uint8_t> buf(buf_size);
1129 UIMessage* msg = (UIMessage*)&buf[0];
1131 msg->protocol = protocol;
1133 memcpy(msg + 1, body, size);
1135 return (dest->write(&buf[0], buf_size) == buf_size);
1139 LV2Plugin::write_from_ui(uint32_t index,
1142 const uint8_t* body)
1145 size_t rbs = _session.engine().raw_buffer_size(DataType::MIDI) * NBUFS;
1146 /* buffer data communication from plugin UI to plugin instance.
1147 * this buffer needs to potentially hold
1148 * (port's minimumSize) * (audio-periods) / (UI-periods)
1151 * e.g 48kSPS / 128fpp -> audio-periods = 375 Hz
1152 * ui-periods = 25 Hz (SuperRapidScreenUpdate)
1153 * default minimumSize = 32K (see LV2Plugin::allocate_atom_event_buffers()
1155 * it is NOT safe to overflow (msg.size will be misinterpreted)
1157 uint32_t bufsiz = 32768;
1158 if (_atom_ev_buffers && _atom_ev_buffers[0]) {
1159 bufsiz = lv2_evbuf_get_capacity(_atom_ev_buffers[0]);
1161 rbs = max((size_t) bufsiz * 8, rbs);
1162 _from_ui = new RingBuffer<uint8_t>(rbs);
1165 if (!write_to(_from_ui, index, protocol, size, body)) {
1166 error << "Error writing from UI to plugin" << endmsg;
1173 LV2Plugin::write_to_ui(uint32_t index,
1176 const uint8_t* body)
1178 if (!write_to(_to_ui, index, protocol, size, body)) {
1179 error << "Error writing from plugin to UI" << endmsg;
1186 LV2Plugin::enable_ui_emmission()
1189 /* see note in LV2Plugin::write_from_ui() */
1190 uint32_t bufsiz = 32768;
1191 if (_atom_ev_buffers && _atom_ev_buffers[0]) {
1192 bufsiz = lv2_evbuf_get_capacity(_atom_ev_buffers[0]);
1194 size_t rbs = _session.engine().raw_buffer_size(DataType::MIDI) * NBUFS;
1195 rbs = max((size_t) bufsiz * 8, rbs);
1196 _to_ui = new RingBuffer<uint8_t>(rbs);
1201 LV2Plugin::emit_to_ui(void* controller, UIMessageSink sink)
1207 uint32_t read_space = _to_ui->read_space();
1208 while (read_space > sizeof(UIMessage)) {
1210 if (_to_ui->read((uint8_t*)&msg, sizeof(msg)) != sizeof(msg)) {
1211 error << "Error reading from Plugin=>UI RingBuffer" << endmsg;
1214 vector<uint8_t> body(msg.size);
1215 if (_to_ui->read(&body[0], msg.size) != msg.size) {
1216 error << "Error reading from Plugin=>UI RingBuffer" << endmsg;
1220 sink(controller, msg.index, msg.size, msg.protocol, &body[0]);
1222 read_space -= sizeof(msg) + msg.size;
1227 LV2Plugin::work(uint32_t size, const void* data)
1229 return _impl->work_iface->work(
1230 _impl->instance->lv2_handle, work_respond, this, size, data);
1234 LV2Plugin::work_response(uint32_t size, const void* data)
1236 return _impl->work_iface->work_response(
1237 _impl->instance->lv2_handle, size, data);
1241 LV2Plugin::set_insert_info(const PluginInsert* insert)
1243 _insert_id = insert->id();
1247 LV2Plugin::set_state(const XMLNode& node, int version)
1250 const XMLProperty* prop;
1251 XMLNodeConstIterator iter;
1256 LocaleGuard lg(X_("POSIX"));
1258 if (node.name() != state_node_name()) {
1259 error << _("Bad node sent to LV2Plugin::set_state") << endmsg;
1263 #ifndef NO_PLUGIN_STATE
1265 if (version < 3000) {
1266 nodes = node.children("port");
1268 nodes = node.children("Port");
1271 for (iter = nodes.begin(); iter != nodes.end(); ++iter) {
1275 if ((prop = child->property("symbol")) != 0) {
1276 sym = prop->value().c_str();
1278 warning << _("LV2: port has no symbol, ignored") << endmsg;
1282 map<string, uint32_t>::iterator i = _port_indices.find(sym);
1284 if (i != _port_indices.end()) {
1285 port_id = i->second;
1287 warning << _("LV2: port has unknown index, ignored") << endmsg;
1291 if ((prop = child->property("value")) != 0) {
1292 value = prop->value().c_str();
1294 warning << _("LV2: port has no value, ignored") << endmsg;
1298 set_parameter(port_id, atof(value));
1302 if ((prop = node.property("state-dir")) != 0) {
1303 if (sscanf(prop->value().c_str(), "state%u", &_state_version) != 1) {
1304 error << string_compose(
1305 "LV2: failed to parse state version from \"%1\"",
1306 prop->value()) << endmsg;
1309 std::string state_file = Glib::build_filename(
1311 Glib::build_filename(prop->value(), "state.ttl"));
1313 LilvState* state = lilv_state_new_from_file(
1314 _world.world, _uri_map.urid_map(), NULL, state_file.c_str());
1316 lilv_state_restore(state, _impl->instance, NULL, NULL, 0, NULL);
1319 latency_compute_run();
1322 return Plugin::set_state(node, version);
1326 LV2Plugin::get_parameter_descriptor(uint32_t which, ParameterDescriptor& desc) const
1328 const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, which);
1330 LilvNodes* portunits;
1331 LilvNode *def, *min, *max;
1332 lilv_port_get_range(_impl->plugin, port, &def, &min, &max);
1333 portunits = lilv_port_get_value(_impl->plugin, port, _world.units_unit);
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 desc.midinote = lilv_nodes_contains(portunits, _world.units_midiNote);
1344 if (desc.sr_dependent) {
1345 desc.lower *= _session.frame_rate ();
1346 desc.upper *= _session.frame_rate ();
1349 desc.min_unbound = false; // TODO: LV2 extension required
1350 desc.max_unbound = false; // TODO: LV2 extension required
1352 if (desc.integer_step) {
1354 desc.smallstep = 0.1;
1355 desc.largestep = 10.0;
1357 const float delta = desc.upper - desc.lower;
1358 desc.step = delta / 1000.0f;
1359 desc.smallstep = delta / 10000.0f;
1360 desc.largestep = delta / 10.0f;
1363 desc.enumeration = lilv_port_has_property(_impl->plugin, port, _world.lv2_enumeration);
1365 lilv_node_free(def);
1366 lilv_node_free(min);
1367 lilv_node_free(max);
1368 lilv_nodes_free(portunits);
1374 LV2Plugin::describe_parameter(Evoral::Parameter which)
1376 if (( which.type() == PluginAutomation) && ( which.id() < parameter_count()) ) {
1378 if (lilv_port_has_property(_impl->plugin,
1379 lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.ext_notOnGUI)) {
1380 return X_("hidden");
1383 if (lilv_port_has_property(_impl->plugin,
1384 lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.lv2_freewheeling)) {
1385 return X_("hidden");
1388 if (lilv_port_has_property(_impl->plugin,
1389 lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.lv2_reportsLatency)) {
1390 return X_("latency");
1393 LilvNode* name = lilv_port_get_name(_impl->plugin,
1394 lilv_plugin_get_port_by_index(_impl->plugin, which.id()));
1395 string ret(lilv_node_as_string(name));
1396 lilv_node_free(name);
1404 LV2Plugin::signal_latency() const
1406 if (_latency_control_port) {
1407 return (framecnt_t)floor(*_latency_control_port);
1413 set<Evoral::Parameter>
1414 LV2Plugin::automatable() const
1416 set<Evoral::Parameter> ret;
1418 for (uint32_t i = 0; i < parameter_count(); ++i) {
1419 if (parameter_is_input(i) && parameter_is_control(i)) {
1420 ret.insert(ret.end(), Evoral::Parameter(PluginAutomation, 0, i));
1428 LV2Plugin::activate()
1430 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 activate\n", name()));
1432 if (!_was_activated) {
1433 lilv_instance_activate(_impl->instance);
1434 _was_activated = true;
1439 LV2Plugin::deactivate()
1441 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 deactivate\n", name()));
1443 if (_was_activated) {
1444 lilv_instance_deactivate(_impl->instance);
1445 _was_activated = false;
1450 LV2Plugin::cleanup()
1452 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 cleanup\n", name()));
1456 lilv_instance_free(_impl->instance);
1457 _impl->instance = NULL;
1461 LV2Plugin::allocate_atom_event_buffers()
1463 /* reserve local scratch buffers for ATOM event-queues */
1464 const LilvPlugin* p = _impl->plugin;
1466 /* count non-MIDI atom event-ports
1467 * TODO: nicely ask drobilla to make a lilv_ call for that
1469 int count_atom_out = 0;
1470 int count_atom_in = 0;
1471 int minimumSize = 32768; // TODO use a per-port minimum-size
1472 for (uint32_t i = 0; i < lilv_plugin_get_num_ports(p); ++i) {
1473 const LilvPort* port = lilv_plugin_get_port_by_index(p, i);
1474 if (lilv_port_is_a(p, port, _world.atom_AtomPort)) {
1475 LilvNodes* buffer_types = lilv_port_get_value(
1476 p, port, _world.atom_bufferType);
1477 LilvNodes* atom_supports = lilv_port_get_value(
1478 p, port, _world.atom_supports);
1480 if (!lilv_nodes_contains(buffer_types, _world.atom_Sequence)
1481 || !lilv_nodes_contains(atom_supports, _world.midi_MidiEvent)) {
1482 if (lilv_port_is_a(p, port, _world.lv2_InputPort)) {
1485 if (lilv_port_is_a(p, port, _world.lv2_OutputPort)) {
1488 LilvNodes* min_size_v = lilv_port_get_value(_impl->plugin, port, _world.rsz_minimumSize);
1489 LilvNode* min_size = min_size_v ? lilv_nodes_get_first(min_size_v) : NULL;
1490 if (min_size && lilv_node_is_int(min_size)) {
1491 minimumSize = std::max(minimumSize, lilv_node_as_int(min_size));
1493 lilv_nodes_free(min_size_v);
1495 lilv_nodes_free(buffer_types);
1496 lilv_nodes_free(atom_supports);
1500 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 need buffers for %2 atom-in and %3 atom-out event-ports\n",
1501 name(), count_atom_in, count_atom_out));
1503 const int total_atom_buffers = (count_atom_in + count_atom_out);
1504 if (_atom_ev_buffers || total_atom_buffers == 0) {
1508 DEBUG_TRACE(DEBUG::LV2, string_compose("allocate %1 atom_ev_buffers of %d bytes\n", total_atom_buffers, minimumSize));
1509 _atom_ev_buffers = (LV2_Evbuf**) malloc((total_atom_buffers + 1) * sizeof(LV2_Evbuf*));
1510 for (int i = 0; i < total_atom_buffers; ++i ) {
1511 _atom_ev_buffers[i] = lv2_evbuf_new(minimumSize, LV2_EVBUF_ATOM,
1512 LV2Plugin::urids.atom_Chunk, LV2Plugin::urids.atom_Sequence);
1514 _atom_ev_buffers[total_atom_buffers] = 0;
1518 /** Write an ardour position/time/tempo/meter as an LV2 event.
1519 * @return true on success.
1522 write_position(LV2_Atom_Forge* forge,
1524 const TempoMetric& t,
1525 Timecode::BBT_Time& bbt,
1527 framepos_t position,
1530 uint8_t pos_buf[256];
1531 lv2_atom_forge_set_buffer(forge, pos_buf, sizeof(pos_buf));
1532 LV2_Atom_Forge_Frame frame;
1533 lv2_atom_forge_blank(forge, &frame, 1, LV2Plugin::urids.time_Position);
1534 lv2_atom_forge_property_head(forge, LV2Plugin::urids.time_frame, 0);
1535 lv2_atom_forge_long(forge, position);
1536 lv2_atom_forge_property_head(forge, LV2Plugin::urids.time_speed, 0);
1537 lv2_atom_forge_float(forge, speed);
1538 lv2_atom_forge_property_head(forge, LV2Plugin::urids.time_barBeat, 0);
1539 lv2_atom_forge_float(forge, bbt.beats - 1 +
1540 (bbt.ticks / Timecode::BBT_Time::ticks_per_beat));
1541 lv2_atom_forge_property_head(forge, LV2Plugin::urids.time_bar, 0);
1542 lv2_atom_forge_long(forge, bbt.bars - 1);
1543 lv2_atom_forge_property_head(forge, LV2Plugin::urids.time_beatUnit, 0);
1544 lv2_atom_forge_int(forge, t.meter().note_divisor());
1545 lv2_atom_forge_property_head(forge, LV2Plugin::urids.time_beatsPerBar, 0);
1546 lv2_atom_forge_float(forge, t.meter().divisions_per_bar());
1547 lv2_atom_forge_property_head(forge, LV2Plugin::urids.time_beatsPerMinute, 0);
1548 lv2_atom_forge_float(forge, t.tempo().beats_per_minute());
1550 LV2_Evbuf_Iterator end = lv2_evbuf_end(buf);
1551 const LV2_Atom* const atom = (const LV2_Atom*)pos_buf;
1552 return lv2_evbuf_write(&end, offset, 0, atom->type, atom->size,
1553 (const uint8_t*)(atom + 1));
1557 LV2Plugin::connect_and_run(BufferSet& bufs,
1558 ChanMapping in_map, ChanMapping out_map,
1559 pframes_t nframes, framecnt_t offset)
1561 DEBUG_TRACE(DEBUG::LV2, string_compose("%1 run %2 offset %3\n", name(), nframes, offset));
1562 Plugin::connect_and_run(bufs, in_map, out_map, nframes, offset);
1564 cycles_t then = get_cycles();
1566 TempoMap& tmap = _session.tempo_map();
1567 Metrics::const_iterator metric_i = tmap.metrics_end();
1568 TempoMetric tmetric = tmap.metric_at(_session.transport_frame(), &metric_i);
1570 if (_freewheel_control_port) {
1571 *_freewheel_control_port = _session.engine().freewheeling();
1574 if (_bpm_control_port) {
1575 *_bpm_control_port = tmetric.tempo().beats_per_minute();
1578 ChanCount bufs_count;
1579 bufs_count.set(DataType::AUDIO, 1);
1580 bufs_count.set(DataType::MIDI, 1);
1581 BufferSet& silent_bufs = _session.get_silent_buffers(bufs_count);
1582 BufferSet& scratch_bufs = _session.get_scratch_buffers(bufs_count);
1583 uint32_t const num_ports = parameter_count();
1584 uint32_t const nil_index = std::numeric_limits<uint32_t>::max();
1586 uint32_t audio_in_index = 0;
1587 uint32_t audio_out_index = 0;
1588 uint32_t midi_in_index = 0;
1589 uint32_t midi_out_index = 0;
1590 uint32_t atom_port_index = 0;
1591 for (uint32_t port_index = 0; port_index < num_ports; ++port_index) {
1593 uint32_t index = nil_index;
1594 PortFlags flags = _port_flags[port_index];
1596 if (flags & PORT_AUDIO) {
1597 if (flags & PORT_INPUT) {
1598 index = in_map.get(DataType::AUDIO, audio_in_index++, &valid);
1600 ? bufs.get_audio(index).data(offset)
1601 : silent_bufs.get_audio(0).data(offset);
1603 index = out_map.get(DataType::AUDIO, audio_out_index++, &valid);
1605 ? bufs.get_audio(index).data(offset)
1606 : scratch_bufs.get_audio(0).data(offset);
1608 } else if (flags & (PORT_EVENT|PORT_SEQUENCE)) {
1609 /* FIXME: The checks here for bufs.count().n_midi() > index shouldn't
1610 be necessary, but the mapping is illegal in some cases. Ideally
1611 that should be fixed, but this is easier...
1613 if (flags & PORT_MIDI) {
1614 if (flags & PORT_INPUT) {
1615 index = in_map.get(DataType::MIDI, midi_in_index++, &valid);
1617 index = out_map.get(DataType::MIDI, midi_out_index++, &valid);
1619 if (valid && bufs.count().n_midi() > index) {
1620 /* Note, ensure_lv2_bufsize() is not RT safe!
1621 * However free()/alloc() is only called if a
1622 * plugin requires a rsz:minimumSize buffersize
1623 * and the existing buffer if smaller.
1625 bufs.ensure_lv2_bufsize((flags & PORT_INPUT), index, _port_minimumSize[port_index]);
1626 _ev_buffers[port_index] = bufs.get_lv2_midi(
1627 (flags & PORT_INPUT), index, (flags & PORT_EVENT));
1629 } else if ((flags & PORT_POSITION) && (flags & PORT_INPUT)) {
1630 lv2_evbuf_reset(_atom_ev_buffers[atom_port_index], true);
1631 _ev_buffers[port_index] = _atom_ev_buffers[atom_port_index++];
1635 if (valid && (flags & PORT_INPUT)) {
1636 Timecode::BBT_Time bbt;
1637 if ((flags & PORT_POSITION)) {
1638 if (_session.transport_frame() != _next_cycle_start ||
1639 _session.transport_speed() != _next_cycle_speed) {
1640 // Transport has changed, write position at cycle start
1641 tmap.bbt_time(_session.transport_frame(), bbt);
1642 write_position(&_impl->forge, _ev_buffers[port_index],
1643 tmetric, bbt, _session.transport_speed(),
1644 _session.transport_frame(), 0);
1648 // Get MIDI iterator range (empty range if no MIDI)
1649 MidiBuffer::iterator m = (index != nil_index)
1650 ? bufs.get_midi(index).begin()
1651 : silent_bufs.get_midi(0).end();
1652 MidiBuffer::iterator m_end = (index != nil_index)
1653 ? bufs.get_midi(index).end()
1656 // Now merge MIDI and any transport events into the buffer
1657 const uint32_t type = LV2Plugin::urids.midi_MidiEvent;
1658 const framepos_t tend = _session.transport_frame() + nframes;
1660 while (m != m_end || (metric_i != tmap.metrics_end() &&
1661 (*metric_i)->frame() < tend)) {
1662 MetricSection* metric = (metric_i != tmap.metrics_end())
1664 if (m != m_end && (!metric || metric->frame() > (*m).time())) {
1665 const Evoral::MIDIEvent<framepos_t> ev(*m, false);
1666 LV2_Evbuf_Iterator eend = lv2_evbuf_end(_ev_buffers[port_index]);
1667 lv2_evbuf_write(&eend, ev.time(), 0, type, ev.size(), ev.buffer());
1670 tmetric.set_metric(metric);
1671 bbt = metric->start();
1672 write_position(&_impl->forge, _ev_buffers[port_index],
1673 tmetric, bbt, _session.transport_speed(),
1675 metric->frame() - _session.transport_frame());
1679 } else if (!valid) {
1680 // Nothing we understand or care about, connect to scratch
1681 // see note for midi-buffer size above
1682 scratch_bufs.ensure_lv2_bufsize((flags & PORT_INPUT),
1683 0, _port_minimumSize[port_index]);
1684 _ev_buffers[port_index] = scratch_bufs.get_lv2_midi(
1685 (flags & PORT_INPUT), 0, (flags & PORT_EVENT));
1687 buf = lv2_evbuf_get_buffer(_ev_buffers[port_index]);
1689 continue; // Control port, leave buffer alone
1691 lilv_instance_connect_port(_impl->instance, port_index, buf);
1694 // Read messages from UI and push into appropriate buffers
1696 uint32_t read_space = _from_ui->read_space();
1697 while (read_space > sizeof(UIMessage)) {
1699 if (_from_ui->read((uint8_t*)&msg, sizeof(msg)) != sizeof(msg)) {
1700 error << "Error reading from UI=>Plugin RingBuffer" << endmsg;
1703 vector<uint8_t> body(msg.size);
1704 if (_from_ui->read(&body[0], msg.size) != msg.size) {
1705 error << "Error reading from UI=>Plugin RingBuffer" << endmsg;
1708 if (msg.protocol == urids.atom_eventTransfer) {
1709 LV2_Evbuf* buf = _ev_buffers[msg.index];
1710 LV2_Evbuf_Iterator i = lv2_evbuf_end(buf);
1711 const LV2_Atom* const atom = (const LV2_Atom*)&body[0];
1712 if (!lv2_evbuf_write(&i, nframes, 0, atom->type, atom->size,
1713 (const uint8_t*)(atom + 1))) {
1714 error << "Failed to write data to LV2 event buffer\n";
1717 error << "Received unknown message type from UI" << endmsg;
1719 read_space -= sizeof(UIMessage) + msg.size;
1726 for (uint32_t port_index = 0; port_index < num_ports; ++port_index) {
1727 PortFlags flags = _port_flags[port_index];
1730 /* TODO ask drobilla about comment
1731 * "Make Ardour event buffers generic so plugins can communicate"
1732 * in libs/ardour/buffer_set.cc:310
1734 * ideally the user could choose which of the following two modes
1735 * to use (e.g. instrument/effect chains MIDI OUT vs MIDI TRHU).
1737 * This implementation follows the discussion on IRC Mar 16 2013 16:47 UTC
1738 * 16:51 < drobilla> rgareus: [..] i.e always replace with MIDI output [of LV2 plugin] if it's there
1739 * 16:52 < drobilla> rgareus: That would probably be good enough [..] to make users not complain
1740 * for quite a while at least ;)
1742 // copy output of LV2 plugin's MIDI port to Ardour MIDI buffers -- MIDI OUT
1743 if ((flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE|PORT_MIDI))) {
1744 const uint32_t buf_index = out_map.get(
1745 DataType::MIDI, midi_out_index++, &valid);
1747 bufs.forward_lv2_midi(_ev_buffers[port_index], buf_index);
1750 // Flush MIDI (write back to Ardour MIDI buffers) -- MIDI THRU
1751 else if ((flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE))) {
1752 const uint32_t buf_index = out_map.get(
1753 DataType::MIDI, midi_out_index++, &valid);
1755 bufs.flush_lv2_midi(true, buf_index);
1759 // Write messages to UI
1760 if (_to_ui && (flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE))) {
1761 LV2_Evbuf* buf = _ev_buffers[port_index];
1762 for (LV2_Evbuf_Iterator i = lv2_evbuf_begin(buf);
1763 lv2_evbuf_is_valid(i);
1764 i = lv2_evbuf_next(i)) {
1765 uint32_t frames, subframes, type, size;
1767 lv2_evbuf_get(i, &frames, &subframes, &type, &size, &data);
1768 write_to_ui(port_index, urids.atom_eventTransfer,
1769 size + sizeof(LV2_Atom),
1770 data - sizeof(LV2_Atom));
1775 cycles_t now = get_cycles();
1776 set_cycles((uint32_t)(now - then));
1778 // Update expected transport information for next cycle so we can detect changes
1779 _next_cycle_speed = _session.transport_speed();
1780 _next_cycle_start = _session.transport_frame() + (nframes * _next_cycle_speed);
1786 LV2Plugin::parameter_is_control(uint32_t param) const
1788 assert(param < _port_flags.size());
1789 return _port_flags[param] & PORT_CONTROL;
1793 LV2Plugin::parameter_is_audio(uint32_t param) const
1795 assert(param < _port_flags.size());
1796 return _port_flags[param] & PORT_AUDIO;
1800 LV2Plugin::parameter_is_event(uint32_t param) const
1802 assert(param < _port_flags.size());
1803 return _port_flags[param] & PORT_EVENT;
1807 LV2Plugin::parameter_is_output(uint32_t param) const
1809 assert(param < _port_flags.size());
1810 return _port_flags[param] & PORT_OUTPUT;
1814 LV2Plugin::parameter_is_input(uint32_t param) const
1816 assert(param < _port_flags.size());
1817 return _port_flags[param] & PORT_INPUT;
1821 LV2Plugin::print_parameter(uint32_t param, char* buf, uint32_t len) const
1824 if (param < parameter_count()) {
1825 snprintf(buf, len, "%.3f", get_parameter(param));
1832 boost::shared_ptr<Plugin::ScalePoints>
1833 LV2Plugin::get_scale_points(uint32_t port_index) const
1835 const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, port_index);
1836 LilvScalePoints* points = lilv_port_get_scale_points(_impl->plugin, port);
1838 boost::shared_ptr<Plugin::ScalePoints> ret;
1843 ret = boost::shared_ptr<Plugin::ScalePoints>(new ScalePoints());
1845 LILV_FOREACH(scale_points, i, points) {
1846 const LilvScalePoint* p = lilv_scale_points_get(points, i);
1847 const LilvNode* label = lilv_scale_point_get_label(p);
1848 const LilvNode* value = lilv_scale_point_get_value(p);
1849 if (label && (lilv_node_is_float(value) || lilv_node_is_int(value))) {
1850 ret->insert(make_pair(lilv_node_as_string(label),
1851 lilv_node_as_float(value)));
1855 lilv_scale_points_free(points);
1860 LV2Plugin::run(pframes_t nframes)
1862 uint32_t const N = parameter_count();
1863 for (uint32_t i = 0; i < N; ++i) {
1864 if (parameter_is_control(i) && parameter_is_input(i)) {
1865 _control_data[i] = _shadow_data[i];
1869 lilv_instance_run(_impl->instance, nframes);
1871 if (_impl->work_iface) {
1872 _worker->emit_responses();
1873 if (_impl->work_iface->end_run) {
1874 _impl->work_iface->end_run(_impl->instance->lv2_handle);
1880 LV2Plugin::latency_compute_run()
1882 if (!_latency_control_port) {
1886 // Run the plugin so that it can set its latency parameter
1890 uint32_t port_index = 0;
1891 uint32_t in_index = 0;
1892 uint32_t out_index = 0;
1894 const framecnt_t bufsize = 1024;
1895 float buffer[bufsize];
1897 memset(buffer, 0, sizeof(float) * bufsize);
1899 // FIXME: Ensure plugins can handle in-place processing
1903 while (port_index < parameter_count()) {
1904 if (parameter_is_audio(port_index)) {
1905 if (parameter_is_input(port_index)) {
1906 lilv_instance_connect_port(_impl->instance, port_index, buffer);
1908 } else if (parameter_is_output(port_index)) {
1909 lilv_instance_connect_port(_impl->instance, port_index, buffer);
1921 LV2Plugin::Impl::designated_input (const char* uri, void** bufptrs[], void** bufptr)
1923 const LilvPort* port = NULL;
1924 LilvNode* designation = lilv_new_uri(_world.world, uri);
1925 port = lilv_plugin_get_port_by_designation(
1926 plugin, _world.lv2_InputPort, designation);
1927 lilv_node_free(designation);
1929 bufptrs[lilv_port_get_index(plugin, port)] = bufptr;
1934 static bool lv2_filter (const string& str, void* /*arg*/)
1936 /* Not a dotfile, has a prefix before a period, suffix is "lv2" */
1938 return str[0] != '.' && (str.length() > 3 && str.find (".lv2") == (str.length() - 4));
1942 LV2World::LV2World()
1943 : world(lilv_world_new())
1944 , _bundle_checked(false)
1946 lilv_world_load_all(world);
1948 atom_AtomPort = lilv_new_uri(world, LV2_ATOM__AtomPort);
1949 atom_Chunk = lilv_new_uri(world, LV2_ATOM__Chunk);
1950 atom_Sequence = lilv_new_uri(world, LV2_ATOM__Sequence);
1951 atom_bufferType = lilv_new_uri(world, LV2_ATOM__bufferType);
1952 atom_supports = lilv_new_uri(world, LV2_ATOM__supports);
1953 atom_eventTransfer = lilv_new_uri(world, LV2_ATOM__eventTransfer);
1954 ev_EventPort = lilv_new_uri(world, LILV_URI_EVENT_PORT);
1955 ext_logarithmic = lilv_new_uri(world, LV2_PORT_PROPS__logarithmic);
1956 ext_notOnGUI = lilv_new_uri(world, LV2_PORT_PROPS__notOnGUI);
1957 lv2_AudioPort = lilv_new_uri(world, LILV_URI_AUDIO_PORT);
1958 lv2_ControlPort = lilv_new_uri(world, LILV_URI_CONTROL_PORT);
1959 lv2_InputPort = lilv_new_uri(world, LILV_URI_INPUT_PORT);
1960 lv2_OutputPort = lilv_new_uri(world, LILV_URI_OUTPUT_PORT);
1961 lv2_inPlaceBroken = lilv_new_uri(world, LV2_CORE__inPlaceBroken);
1962 lv2_integer = lilv_new_uri(world, LV2_CORE__integer);
1963 lv2_reportsLatency = lilv_new_uri(world, LV2_CORE__reportsLatency);
1964 lv2_sampleRate = lilv_new_uri(world, LV2_CORE__sampleRate);
1965 lv2_toggled = lilv_new_uri(world, LV2_CORE__toggled);
1966 lv2_enumeration = lilv_new_uri(world, LV2_CORE__enumeration);
1967 lv2_freewheeling = lilv_new_uri(world, LV2_CORE__freeWheeling);
1968 midi_MidiEvent = lilv_new_uri(world, LILV_URI_MIDI_EVENT);
1969 rdfs_comment = lilv_new_uri(world, LILV_NS_RDFS "comment");
1970 rsz_minimumSize = lilv_new_uri(world, LV2_RESIZE_PORT__minimumSize);
1971 time_Position = lilv_new_uri(world, LV2_TIME__Position);
1972 ui_GtkUI = lilv_new_uri(world, LV2_UI__GtkUI);
1973 ui_external = lilv_new_uri(world, "http://lv2plug.in/ns/extensions/ui#external");
1974 ui_externalkx = lilv_new_uri(world, "http://kxstudio.sf.net/ns/lv2ext/external-ui#Widget");
1975 units_unit = lilv_new_uri(world, "http://lv2plug.in/ns/extensions/units#unit");
1976 units_midiNote = lilv_new_uri(world, "http://lv2plug.in/ns/extensions/units#midiNote");
1979 LV2World::~LV2World()
1981 lilv_node_free(units_midiNote);
1982 lilv_node_free(units_unit);
1983 lilv_node_free(ui_externalkx);
1984 lilv_node_free(ui_external);
1985 lilv_node_free(ui_GtkUI);
1986 lilv_node_free(time_Position);
1987 lilv_node_free(rsz_minimumSize);
1988 lilv_node_free(rdfs_comment);
1989 lilv_node_free(midi_MidiEvent);
1990 lilv_node_free(lv2_enumeration);
1991 lilv_node_free(lv2_freewheeling);
1992 lilv_node_free(lv2_toggled);
1993 lilv_node_free(lv2_sampleRate);
1994 lilv_node_free(lv2_reportsLatency);
1995 lilv_node_free(lv2_integer);
1996 lilv_node_free(lv2_inPlaceBroken);
1997 lilv_node_free(lv2_OutputPort);
1998 lilv_node_free(lv2_InputPort);
1999 lilv_node_free(lv2_ControlPort);
2000 lilv_node_free(lv2_AudioPort);
2001 lilv_node_free(ext_notOnGUI);
2002 lilv_node_free(ext_logarithmic);
2003 lilv_node_free(ev_EventPort);
2004 lilv_node_free(atom_supports);
2005 lilv_node_free(atom_eventTransfer);
2006 lilv_node_free(atom_bufferType);
2007 lilv_node_free(atom_Sequence);
2008 lilv_node_free(atom_Chunk);
2009 lilv_node_free(atom_AtomPort);
2013 LV2World::load_bundled_plugins()
2015 if (!_bundle_checked) {
2016 cout << "Scanning folders for bundled LV2s: " << ARDOUR::lv2_bundled_search_path().to_string() << endl;
2018 vector<string> plugin_objects;
2019 find_files_matching_filter (plugin_objects, ARDOUR::lv2_bundled_search_path().to_string(), lv2_filter, 0, true, true);
2020 for ( vector<string>::iterator x = plugin_objects.begin(); x != plugin_objects.end (); ++x) {
2021 #ifdef PLATFORM_WINDOWS
2022 string uri = "file:///" + *x + "/";
2024 string uri = "file://" + *x + "/";
2026 LilvNode *node = lilv_new_uri(world, uri.c_str());
2027 lilv_world_load_bundle(world, node);
2028 lilv_node_free(node);
2031 _bundle_checked = true;
2035 LV2PluginInfo::LV2PluginInfo (const void* c_plugin)
2036 : _c_plugin(c_plugin)
2041 LV2PluginInfo::~LV2PluginInfo()
2045 LV2PluginInfo::load(Session& session)
2050 plugin.reset(new LV2Plugin(session.engine(), session,
2051 (const LilvPlugin*)_c_plugin,
2052 session.frame_rate()));
2054 plugin->set_info(PluginInfoPtr(new LV2PluginInfo(*this)));
2056 } catch (failed_constructor& err) {
2057 return PluginPtr((Plugin*)0);
2064 LV2PluginInfo::discover()
2066 _world.load_bundled_plugins();
2068 PluginInfoList* plugs = new PluginInfoList;
2069 const LilvPlugins* plugins = lilv_world_get_all_plugins(_world.world);
2071 if (!Config->get_show_plugin_scan_window()) {
2072 info << "LV2: Discovering " << lilv_plugins_size(plugins) << " plugins" << endmsg;
2075 LILV_FOREACH(plugins, i, plugins) {
2076 const LilvPlugin* p = lilv_plugins_get(plugins, i);
2077 LV2PluginInfoPtr info(new LV2PluginInfo((const void*)p));
2079 LilvNode* name = lilv_plugin_get_name(p);
2080 if (!name || !lilv_plugin_get_port_by_index(p, 0)) {
2081 warning << "Ignoring invalid LV2 plugin "
2082 << lilv_node_as_string(lilv_plugin_get_uri(p))
2089 info->name = string(lilv_node_as_string(name));
2090 lilv_node_free(name);
2091 ARDOUR::PluginScanMessage(_("LV2"), info->name, false);
2093 const LilvPluginClass* pclass = lilv_plugin_get_class(p);
2094 const LilvNode* label = lilv_plugin_class_get_label(pclass);
2095 info->category = lilv_node_as_string(label);
2097 LilvNode* author_name = lilv_plugin_get_author_name(p);
2098 info->creator = author_name ? string(lilv_node_as_string(author_name)) : "Unknown";
2099 lilv_node_free(author_name);
2101 info->path = "/NOPATH"; // Meaningless for LV2
2103 /* count atom-event-ports that feature
2104 * atom:supports <http://lv2plug.in/ns/ext/midi#MidiEvent>
2106 * TODO: nicely ask drobilla to make a lilv_ call for that
2108 int count_midi_out = 0;
2109 int count_midi_in = 0;
2110 for (uint32_t i = 0; i < lilv_plugin_get_num_ports(p); ++i) {
2111 const LilvPort* port = lilv_plugin_get_port_by_index(p, i);
2112 if (lilv_port_is_a(p, port, _world.atom_AtomPort)) {
2113 LilvNodes* buffer_types = lilv_port_get_value(
2114 p, port, _world.atom_bufferType);
2115 LilvNodes* atom_supports = lilv_port_get_value(
2116 p, port, _world.atom_supports);
2118 if (lilv_nodes_contains(buffer_types, _world.atom_Sequence)
2119 && lilv_nodes_contains(atom_supports, _world.midi_MidiEvent)) {
2120 if (lilv_port_is_a(p, port, _world.lv2_InputPort)) {
2123 if (lilv_port_is_a(p, port, _world.lv2_OutputPort)) {
2127 lilv_nodes_free(buffer_types);
2128 lilv_nodes_free(atom_supports);
2132 info->n_inputs.set_audio(
2133 lilv_plugin_get_num_ports_of_class(
2134 p, _world.lv2_InputPort, _world.lv2_AudioPort, NULL));
2135 info->n_inputs.set_midi(
2136 lilv_plugin_get_num_ports_of_class(
2137 p, _world.lv2_InputPort, _world.ev_EventPort, NULL)
2140 info->n_outputs.set_audio(
2141 lilv_plugin_get_num_ports_of_class(
2142 p, _world.lv2_OutputPort, _world.lv2_AudioPort, NULL));
2143 info->n_outputs.set_midi(
2144 lilv_plugin_get_num_ports_of_class(
2145 p, _world.lv2_OutputPort, _world.ev_EventPort, NULL)
2148 info->unique_id = lilv_node_as_uri(lilv_plugin_get_uri(p));
2149 info->index = 0; // Meaningless for LV2
2151 plugs->push_back(info);