2 Copyright (C) 2000 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 #include "libardour-config.h"
26 #include "pbd/failed_constructor.h"
27 #include "pbd/xml++.h"
28 #include "pbd/convert.h"
30 #include "ardour/audio_buffer.h"
31 #include "ardour/automation_list.h"
32 #include "ardour/buffer_set.h"
33 #include "ardour/debug.h"
34 #include "ardour/event_type_map.h"
35 #include "ardour/ladspa_plugin.h"
36 #include "ardour/luaproc.h"
37 #include "ardour/plugin.h"
38 #include "ardour/plugin_insert.h"
41 #include "ardour/lv2_plugin.h"
44 #ifdef WINDOWS_VST_SUPPORT
45 #include "ardour/windows_vst_plugin.h"
49 #include "ardour/lxvst_plugin.h"
52 #ifdef AUDIOUNIT_SUPPORT
53 #include "ardour/audio_unit.h"
56 #include "ardour/session.h"
57 #include "ardour/types.h"
62 using namespace ARDOUR;
65 const string PluginInsert::port_automation_node_name = "PortAutomation";
67 PluginInsert::PluginInsert (Session& s, boost::shared_ptr<Plugin> plug)
68 : Processor (s, (plug ? plug->name() : string ("toBeRenamed")))
69 , _signal_analysis_collected_nframes(0)
70 , _signal_analysis_collect_nframes_max(0)
72 , _pending_no_inplace (false)
74 , _strict_io_configured (false)
76 /* the first is the master */
80 create_automatable_parameters ();
85 PluginInsert::set_count (uint32_t num)
87 bool require_state = !_plugins.empty();
89 /* this is a bad idea.... we shouldn't do this while active.
90 only a route holding their redirect_lock should be calling this
95 } else if (num > _plugins.size()) {
96 uint32_t diff = num - _plugins.size();
98 for (uint32_t n = 0; n < diff; ++n) {
99 boost::shared_ptr<Plugin> p = plugin_factory (_plugins[0]);
106 /* XXX do something */
110 } else if (num < _plugins.size()) {
111 uint32_t diff = _plugins.size() - num;
112 for (uint32_t n= 0; n < diff; ++n) {
120 PluginInsert::~PluginInsert ()
125 PluginInsert::control_list_automation_state_changed (Evoral::Parameter which, AutoState s)
127 if (which.type() != PluginAutomation)
130 boost::shared_ptr<AutomationControl> c
131 = boost::dynamic_pointer_cast<AutomationControl>(control (which));
134 _plugins[0]->set_parameter (which.id(), c->list()->eval (_session.transport_frame()));
139 PluginInsert::output_streams() const
141 assert (!_plugins.empty());
143 PluginInfoPtr info = _plugins.front()->get_info();
145 if (_strict_io_configured) {
146 return _configured_in; // XXX, check initial configuration
148 else if (info->reconfigurable_io()) {
149 ChanCount out = _plugins.front()->output_streams ();
150 // DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, reconfigur(able) output streams = %1\n", out));
153 ChanCount out = info->n_outputs;
154 // DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, static output streams = %1 for %2 plugins\n", out, _plugins.size()));
155 out.set_audio (out.n_audio() * _plugins.size());
156 out.set_midi (out.n_midi() * _plugins.size() + midi_bypass.n_midi());
162 PluginInsert::input_streams() const
164 assert (!_plugins.empty());
168 PluginInfoPtr info = _plugins.front()->get_info();
170 if (info->reconfigurable_io()) {
171 assert (_plugins.size() == 1);
172 in = _plugins.front()->input_streams();
177 DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, input streams = %1, match using %2\n", in, _match.method));
179 if (_match.method == Split) {
181 /* we are splitting 1 processor input to multiple plugin inputs,
182 so we have a maximum of 1 stream of each type.
184 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
185 if (in.get (*t) > 1) {
191 } else if (_match.method == Hide) {
193 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
194 in.set (*t, in.get (*t) - _match.hide.get (*t));
200 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
201 in.set (*t, in.get (*t) * _plugins.size ());
209 PluginInsert::natural_output_streams() const
211 return _plugins[0]->get_info()->n_outputs;
215 PluginInsert::natural_input_streams() const
217 return _plugins[0]->get_info()->n_inputs;
221 PluginInsert::has_no_inputs() const
223 return _plugins[0]->get_info()->n_inputs == ChanCount::ZERO;
227 PluginInsert::has_no_audio_inputs() const
229 return _plugins[0]->get_info()->n_inputs.n_audio() == 0;
233 PluginInsert::is_midi_instrument() const
235 /* XXX more finesse is possible here. VST plugins have a
236 a specific "instrument" flag, for example.
238 PluginInfoPtr pi = _plugins[0]->get_info();
240 return pi->n_inputs.n_midi() != 0 &&
241 pi->n_outputs.n_audio() > 0;
245 PluginInsert::create_automatable_parameters ()
247 assert (!_plugins.empty());
249 set<Evoral::Parameter> a = _plugins.front()->automatable ();
251 for (set<Evoral::Parameter>::iterator i = a.begin(); i != a.end(); ++i) {
252 if (i->type() == PluginAutomation) {
254 Evoral::Parameter param(*i);
256 ParameterDescriptor desc;
257 _plugins.front()->get_parameter_descriptor(i->id(), desc);
259 can_automate (param);
260 boost::shared_ptr<AutomationList> list(new AutomationList(param, desc));
261 boost::shared_ptr<AutomationControl> c (new PluginControl(this, param, desc, list));
263 _plugins.front()->set_automation_control (i->id(), c);
264 } else if (i->type() == PluginPropertyAutomation) {
265 Evoral::Parameter param(*i);
266 const ParameterDescriptor& desc = _plugins.front()->get_property_descriptor(param.id());
267 if (desc.datatype != Variant::NOTHING) {
268 boost::shared_ptr<AutomationList> list;
269 if (Variant::type_is_numeric(desc.datatype)) {
270 list = boost::shared_ptr<AutomationList>(new AutomationList(param, desc));
272 add_control (boost::shared_ptr<AutomationControl> (new PluginPropertyControl(this, param, desc, list)));
277 /** Called when something outside of this host has modified a plugin
278 * parameter. Responsible for propagating the change to two places:
280 * 1) anything listening to the Control itself
281 * 2) any replicated plugins that make up this PluginInsert.
283 * The PluginInsert is connected to the ParameterChangedExternally signal for
284 * the first (primary) plugin, and here broadcasts that change to any others.
286 * XXX We should probably drop this whole replication idea (Paul, October 2015)
287 * since it isn't used by sensible plugin APIs (AU, LV2).
290 PluginInsert::parameter_changed_externally (uint32_t which, float val)
292 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, which));
294 /* First propagation: alter the underlying value of the control,
295 * without telling the plugin(s) that own/use it to set it.
302 boost::shared_ptr<PluginControl> pc = boost::dynamic_pointer_cast<PluginControl> (ac);
305 pc->catch_up_with_external_value (val);
308 /* Second propagation: tell all plugins except the first to
309 update the value of this parameter. For sane plugin APIs,
310 there are no other plugins, so this is a no-op in those
314 Plugins::iterator i = _plugins.begin();
316 /* don't set the first plugin, just all the slaves */
318 if (i != _plugins.end()) {
320 for (; i != _plugins.end(); ++i) {
321 (*i)->set_parameter (which, val);
327 PluginInsert::set_block_size (pframes_t nframes)
330 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
331 if ((*i)->set_block_size (nframes) != 0) {
339 PluginInsert::activate ()
341 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
345 Processor::activate ();
349 PluginInsert::deactivate ()
351 Processor::deactivate ();
353 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
359 PluginInsert::flush ()
361 for (vector<boost::shared_ptr<Plugin> >::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
367 PluginInsert::connect_and_run (BufferSet& bufs, pframes_t nframes, framecnt_t offset, bool with_auto, framepos_t now)
369 _no_inplace = _pending_no_inplace;
370 // Calculate if, and how many frames we need to collect for analysis
371 framecnt_t collect_signal_nframes = (_signal_analysis_collect_nframes_max -
372 _signal_analysis_collected_nframes);
373 if (nframes < collect_signal_nframes) { // we might not get all frames now
374 collect_signal_nframes = nframes;
377 ChanCount const in_streams = input_streams ();
378 ChanCount const out_streams = output_streams ();
380 if (_match.method == Split) {
381 assert (_in_map.size () == 1);
382 /* fix the input mapping so that we have maps for each of the plugin's inputs */
384 /* copy the first stream's buffer contents to the others */
385 /* XXX: audio only */
387 uint32_t first_idx = _in_map[0].get (DataType::AUDIO, 0, &valid);
389 for (uint32_t i = in_streams.n_audio(); i < natural_input_streams().n_audio(); ++i) {
390 bufs.get_audio(_in_map[0].get (DataType::AUDIO, i, &valid)).read_from(bufs.get_audio(first_idx), nframes, offset, offset);
395 bufs.set_count(ChanCount::max(bufs.count(), in_streams));
396 bufs.set_count(ChanCount::max(bufs.count(), out_streams));
398 /* Note that we've already required that plugins
399 be able to handle in-place processing.
406 for (Controls::iterator li = controls().begin(); li != controls().end(); ++li, ++n) {
408 boost::shared_ptr<AutomationControl> c
409 = boost::dynamic_pointer_cast<AutomationControl>(li->second);
411 if (c->list() && c->automation_playback()) {
414 const float val = c->list()->rt_safe_eval (now, valid);
417 /* This is the ONLY place where we are
419 * AutomationControl::set_value_unchecked(). We
420 * know that the control is in
421 * automation playback mode, so no
422 * check on writable() is required
423 * (which must be done in AutomationControl::set_value()
426 c->set_value_unchecked(val);
433 if (collect_signal_nframes > 0) {
435 //std::cerr << "collect input, bufs " << bufs.count().n_audio() << " count, " << bufs.available().n_audio() << " available" << std::endl;
436 //std::cerr << " streams " << input_streams().n_audio() << std::endl;
437 //std::cerr << "filling buffer with " << collect_signal_nframes << " frames at " << _signal_analysis_collected_nframes << std::endl;
439 _signal_analysis_inputs.set_count(input_streams());
441 for (uint32_t i = 0; i < input_streams().n_audio(); ++i) {
442 _signal_analysis_inputs.get_audio(i).read_from(
444 collect_signal_nframes,
445 _signal_analysis_collected_nframes); // offset is for target buffer
451 BufferSet& inplace_bufs = _session.get_noinplace_buffers();
452 ARDOUR::ChanMapping used_outputs;
455 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
457 ARDOUR::ChanMapping in_map (natural_input_streams());
458 ARDOUR::ChanMapping out_map;
459 ARDOUR::ChanCount mapped;
460 ARDOUR::ChanCount backmap;
462 // map inputs sequentially
463 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
464 for (uint32_t in = 0; in < natural_input_streams().get (*t); ++in) {
466 uint32_t in_idx = _in_map[pc].get (*t, in, &valid);
467 uint32_t m = mapped.get (*t);
469 inplace_bufs.get (*t, m).read_from (bufs.get (*t, in_idx), nframes, offset, offset);
471 inplace_bufs.get (*t, m).silence (nframes, offset);
473 mapped.set (*t, m + 1);
477 // TODO use map_offset_to() instead ??
481 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
482 for (uint32_t out = 0; out < natural_output_streams().get (*t); ++out) {
483 uint32_t m = mapped.get (*t);
484 inplace_bufs.get (*t, m).silence (nframes, offset);
485 out_map.set (*t, out, m);
486 mapped.set (*t, m + 1);
490 if ((*i)->connect_and_run(inplace_bufs, in_map, out_map, nframes, offset)) {
496 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
497 for (uint32_t out = 0; out < natural_output_streams().get (*t); ++out) {
498 uint32_t m = backmap.get (*t);
500 uint32_t out_idx = _out_map[pc].get (*t, out, &valid);
502 bufs.get (*t, out_idx).read_from (inplace_bufs.get (*t, m), nframes, offset, offset);
503 used_outputs.set (*t, out_idx, 1); // mark as used
505 backmap.set (*t, m + 1);
509 /* all instances have completed, now clear outputs that have not been written to.
510 * (except midi bypass)
512 if (bufs.count().n_midi() == 1 && natural_output_streams().get(DataType::MIDI) == 0) {
513 used_outputs.set (DataType::MIDI, 0, 1); // Midi bypass.
515 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
516 for (uint32_t out = 0; out < bufs.count().get (*t); ++out) {
518 used_outputs.get (*t, out, &valid);
519 if (valid) { continue; }
520 bufs.get (*t, out).silence (nframes, offset);
526 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
527 if ((*i)->connect_and_run(bufs, _in_map[pc], _out_map[pc], nframes, offset)) {
533 if (collect_signal_nframes > 0) {
535 //std::cerr << " output, bufs " << bufs.count().n_audio() << " count, " << bufs.available().n_audio() << " available" << std::endl;
536 //std::cerr << " streams " << output_streams().n_audio() << std::endl;
538 _signal_analysis_outputs.set_count(output_streams());
540 for (uint32_t i = 0; i < output_streams().n_audio(); ++i) {
541 _signal_analysis_outputs.get_audio(i).read_from(
543 collect_signal_nframes,
544 _signal_analysis_collected_nframes); // offset is for target buffer
547 _signal_analysis_collected_nframes += collect_signal_nframes;
548 assert(_signal_analysis_collected_nframes <= _signal_analysis_collect_nframes_max);
550 if (_signal_analysis_collected_nframes == _signal_analysis_collect_nframes_max) {
551 _signal_analysis_collect_nframes_max = 0;
552 _signal_analysis_collected_nframes = 0;
554 AnalysisDataGathered(&_signal_analysis_inputs,
555 &_signal_analysis_outputs);
558 /* leave remaining channel buffers alone */
562 PluginInsert::silence (framecnt_t nframes)
568 ChanMapping in_map (natural_input_streams ());
569 ChanMapping out_map (natural_output_streams ());
571 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
572 (*i)->connect_and_run (_session.get_scratch_buffers ((*i)->get_info()->n_inputs, true), in_map, out_map, nframes, 0);
577 PluginInsert::run (BufferSet& bufs, framepos_t start_frame, framepos_t /*end_frame*/, pframes_t nframes, bool)
579 if (_pending_active) {
580 /* run as normal if we are active or moving from inactive to active */
582 if (_session.transport_rolling() || _session.bounce_processing()) {
583 automation_run (bufs, start_frame, nframes);
585 connect_and_run (bufs, nframes, 0, false);
589 uint32_t in = input_streams ().n_audio ();
590 uint32_t out = output_streams().n_audio ();
592 if (has_no_audio_inputs() || in == 0) {
594 /* silence all (audio) outputs. Should really declick
595 * at the transitions of "active"
598 for (uint32_t n = 0; n < out; ++n) {
599 bufs.get_audio (n).silence (nframes);
602 } else if (out > in) {
604 /* not active, but something has make up for any channel count increase */
606 // TODO: option round-robin (n % in) or silence additional buffers ??
607 // for now , simply replicate last buffer
608 for (uint32_t n = in; n < out; ++n) {
609 bufs.get_audio(n).read_from(bufs.get_audio(in - 1), nframes);
613 bufs.count().set_audio (out);
616 _active = _pending_active;
618 /* we have no idea whether the plugin generated silence or not, so mark
619 * all buffers appropriately.
625 PluginInsert::automation_run (BufferSet& bufs, framepos_t start, pframes_t nframes)
627 Evoral::ControlEvent next_event (0, 0.0f);
628 framepos_t now = start;
629 framepos_t end = now + nframes;
630 framecnt_t offset = 0;
632 Glib::Threads::Mutex::Lock lm (control_lock(), Glib::Threads::TRY_LOCK);
635 connect_and_run (bufs, nframes, offset, false);
639 if (!find_next_event (now, end, next_event) || _plugins.front()->requires_fixed_sized_buffers()) {
641 /* no events have a time within the relevant range */
643 connect_and_run (bufs, nframes, offset, true, now);
649 framecnt_t cnt = min (((framecnt_t) ceil (next_event.when) - now), (framecnt_t) nframes);
651 connect_and_run (bufs, cnt, offset, true, now);
657 if (!find_next_event (now, end, next_event)) {
662 /* cleanup anything that is left to do */
665 connect_and_run (bufs, nframes, offset, true, now);
670 PluginInsert::default_parameter_value (const Evoral::Parameter& param)
672 if (param.type() != PluginAutomation)
675 if (_plugins.empty()) {
676 fatal << _("programming error: ") << X_("PluginInsert::default_parameter_value() called with no plugin")
678 abort(); /*NOTREACHED*/
681 return _plugins[0]->default_value (param.id());
686 PluginInsert::can_reset_all_parameters ()
690 for (uint32_t par = 0; par < _plugins[0]->parameter_count(); ++par) {
692 const uint32_t cid = _plugins[0]->nth_parameter (par, ok);
694 if (!ok || !_plugins[0]->parameter_is_input(cid)) {
698 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, cid));
704 if (ac->automation_state() & Play) {
709 return all && (params > 0);
713 PluginInsert::reset_parameters_to_default ()
717 for (uint32_t par = 0; par < _plugins[0]->parameter_count(); ++par) {
719 const uint32_t cid = _plugins[0]->nth_parameter (par, ok);
721 if (!ok || !_plugins[0]->parameter_is_input(cid)) {
725 const float dflt = _plugins[0]->default_value (cid);
726 const float curr = _plugins[0]->get_parameter (cid);
732 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, cid));
737 if (ac->automation_state() & Play) {
742 ac->set_value (dflt, Controllable::NoGroup);
747 boost::shared_ptr<Plugin>
748 PluginInsert::plugin_factory (boost::shared_ptr<Plugin> other)
750 boost::shared_ptr<LadspaPlugin> lp;
751 boost::shared_ptr<LuaProc> lua;
753 boost::shared_ptr<LV2Plugin> lv2p;
755 #ifdef WINDOWS_VST_SUPPORT
756 boost::shared_ptr<WindowsVSTPlugin> vp;
759 boost::shared_ptr<LXVSTPlugin> lxvp;
761 #ifdef AUDIOUNIT_SUPPORT
762 boost::shared_ptr<AUPlugin> ap;
765 if ((lp = boost::dynamic_pointer_cast<LadspaPlugin> (other)) != 0) {
766 return boost::shared_ptr<Plugin> (new LadspaPlugin (*lp));
767 } else if ((lua = boost::dynamic_pointer_cast<LuaProc> (other)) != 0) {
768 return boost::shared_ptr<Plugin> (new LuaProc (*lua));
770 } else if ((lv2p = boost::dynamic_pointer_cast<LV2Plugin> (other)) != 0) {
771 return boost::shared_ptr<Plugin> (new LV2Plugin (*lv2p));
773 #ifdef WINDOWS_VST_SUPPORT
774 } else if ((vp = boost::dynamic_pointer_cast<WindowsVSTPlugin> (other)) != 0) {
775 return boost::shared_ptr<Plugin> (new WindowsVSTPlugin (*vp));
778 } else if ((lxvp = boost::dynamic_pointer_cast<LXVSTPlugin> (other)) != 0) {
779 return boost::shared_ptr<Plugin> (new LXVSTPlugin (*lxvp));
781 #ifdef AUDIOUNIT_SUPPORT
782 } else if ((ap = boost::dynamic_pointer_cast<AUPlugin> (other)) != 0) {
783 return boost::shared_ptr<Plugin> (new AUPlugin (*ap));
787 fatal << string_compose (_("programming error: %1"),
788 X_("unknown plugin type in PluginInsert::plugin_factory"))
790 abort(); /*NOTREACHED*/
791 return boost::shared_ptr<Plugin> ((Plugin*) 0);
795 PluginInsert::configure_io (ChanCount in, ChanCount out)
797 Match old_match = _match;
798 ChanCount old_in = input_streams ();
799 ChanCount old_out = output_streams ();
802 _configured_out = out;
804 /* TODO use "custom config"
805 * allow user to edit/override output ports, handle strict i/o.
807 * configuration should only applied here.
810 /* set the matching method and number of plugins that we will use to meet this configuration */
811 _match = private_can_support_io_configuration (in, out);
812 if (set_count (_match.plugins) == false) {
813 PluginIoReConfigure (); /* EMIT SIGNAL */
817 /* configure plugins */
818 switch (_match.method) {
821 if (_plugins.front()->configure_io (_plugins.front()->get_info()->n_inputs, out) == false) {
822 PluginIoReConfigure (); /* EMIT SIGNAL */
828 if (_plugins.front()->configure_io (in, out) == false) {
829 PluginIoReConfigure (); /* EMIT SIGNAL */
835 // TODO make configurable, ideally use a single in/out map for all replicated
838 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
839 if (_match.method == Split) {
840 /* TODO see PluginInsert::connect_and_run, channel replication */
841 _in_map[pc] = ChanMapping (natural_input_streams ());
843 _in_map[pc] = ChanMapping (input_streams ());
845 _out_map[pc] = ChanMapping (output_streams());
847 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
848 _in_map[pc].offset_to(*t, pc * natural_input_streams().get(*t));
849 _out_map[pc].offset_to(*t, pc * natural_output_streams().get(*t));
854 if ( (old_match.method != _match.method && (old_match.method == Split || _match.method == Split))
859 PluginIoReConfigure (); /* EMIT SIGNAL */
862 // we don't know the analysis window size, so we must work with the
863 // current buffer size here. each request for data fills in these
864 // buffers and the analyser makes sure it gets enough data for the
866 session().ensure_buffer_set (_signal_analysis_inputs, in);
867 //_signal_analysis_inputs.set_count (in);
869 session().ensure_buffer_set (_signal_analysis_outputs, out);
870 //_signal_analysis_outputs.set_count (out);
872 // std::cerr << "set counts to i" << in.n_audio() << "/o" << out.n_audio() << std::endl;
874 return Processor::configure_io (in, out);
877 /** Decide whether this PluginInsert can support a given IO configuration.
878 * To do this, we run through a set of possible solutions in rough order of
881 * @param in Required input channel count.
882 * @param out Filled in with the output channel count if we return true.
883 * @return true if the given IO configuration can be supported.
886 PluginInsert::can_support_io_configuration (const ChanCount& in, ChanCount& out)
888 return private_can_support_io_configuration (in, out).method != Impossible;
891 /** A private version of can_support_io_configuration which returns the method
892 * by which the configuration can be matched, rather than just whether or not
896 PluginInsert::private_can_support_io_configuration (ChanCount const & inx, ChanCount& out)
898 _strict_io_configured = false;
899 if (_plugins.empty()) {
903 PluginInfoPtr info = _plugins.front()->get_info();
904 ChanCount in; in += inx;
907 if (info->reconfigurable_io()) {
908 /* Plugin has flexible I/O, so delegate to it */
909 bool const r = _plugins.front()->can_support_io_configuration (in, out);
911 return Match (Impossible, 0);
914 if (_strict_io && in.n_audio() < out.n_audio()) {
915 DEBUG_TRACE (DEBUG::Processors, string_compose ("hiding output ports of reconfigurable %1\n", name()));
916 out.set (DataType::AUDIO, in.get (DataType::AUDIO));
919 return Match (Delegate, 1);
922 ChanCount inputs = info->n_inputs;
923 ChanCount outputs = info->n_outputs;
925 if (in.get(DataType::MIDI) == 1 && outputs.get(DataType::MIDI) == 0) {
926 DEBUG_TRACE ( DEBUG::Processors, string_compose ("bypassing midi-data around %1\n", name()));
927 midi_bypass.set(DataType::MIDI, 1);
929 if (in.get(DataType::MIDI) == 1 && inputs.get(DataType::MIDI) == 0) {
930 DEBUG_TRACE ( DEBUG::Processors, string_compose ("hiding midi-port from plugin %1\n", name()));
931 in.set(DataType::MIDI, 0);
934 bool no_inputs = true;
935 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
936 if (inputs.get (*t) != 0) {
942 /* replicate no-input generators with strict i/o */
943 if (no_inputs && _strict_io) {
945 bool can_replicate = true;
947 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
948 uint32_t nout = outputs.get (*t);
949 uint32_t nwant = in.get (*t);
951 can_replicate = false;
958 if (f == 0 && nwant % nout == 0) {
962 if (f * nout != nwant) {
963 can_replicate = false;
968 if (can_replicate && f > 1) {
969 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
970 out.set (*t, outputs.get(*t) * f);
973 return Match (Replicate, f);
977 if ((no_inputs || inputs == in) && _strict_io) {
978 /* special case synths and generators */
979 if (in.n_audio () == 0 && in.n_midi () > 0 && outputs.n_audio () > 0) {
980 // TODO limit the audio-channel count to track output
981 out = outputs + midi_bypass;
983 _strict_io_configured = true;
984 out = in + midi_bypass;
986 return Match (ExactMatch, 1);
990 /* no inputs so we can take any input configuration since we throw it away */
991 out = outputs + midi_bypass;
992 return Match (NoInputs, 1);
995 /* Plugin inputs match requested inputs exactly */
997 out = outputs + midi_bypass;
998 return Match (ExactMatch, 1);
1001 /* We may be able to run more than one copy of the plugin within this insert
1002 to cope with the insert having more inputs than the plugin.
1003 We allow replication only for plugins with either zero or 1 inputs and outputs
1004 for every valid data type.
1008 bool can_replicate = true;
1009 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1011 uint32_t nin = inputs.get (*t);
1013 // No inputs of this type
1014 if (nin == 0 && in.get(*t) == 0) {
1018 if (nin != 1 || outputs.get (*t) != 1) {
1019 can_replicate = false;
1023 // Potential factor not set yet
1025 f = in.get(*t) / nin;
1028 // Factor for this type does not match another type, can not replicate
1029 if (f != (in.get(*t) / nin)) {
1030 can_replicate = false;
1035 if (can_replicate) {
1037 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1038 out.set (*t, outputs.get(*t) * f);
1041 return Match (Replicate, f);
1044 /* If the processor has exactly one input of a given type, and
1045 the plugin has more, we can feed the single processor input
1046 to some or all of the plugin inputs. This is rather
1047 special-case-y, but the 1-to-many case is by far the
1048 simplest. How do I split thy 2 processor inputs to 3
1049 plugin inputs? Let me count the ways ...
1052 bool can_split = !_strict_io;
1053 for (DataType::iterator t = DataType::begin(); t != DataType::end() && can_split; ++t) {
1055 bool const can_split_type = (in.get (*t) == 1 && inputs.get (*t) > 1);
1056 bool const nothing_to_do_for_type = (in.get (*t) == 0 && inputs.get (*t) == 0);
1058 if (!can_split_type && !nothing_to_do_for_type) {
1064 out = outputs + midi_bypass;
1065 return Match (Split, 1);
1068 /* If the plugin has more inputs than we want, we can `hide' some of them
1069 by feeding them silence.
1072 bool could_hide = false;
1073 bool cannot_hide = false;
1074 ChanCount hide_channels;
1076 for (DataType::iterator t = DataType::begin(); t != DataType::end() && !cannot_hide; ++t) {
1077 if (inputs.get(*t) > in.get(*t)) {
1078 /* there is potential to hide, since the plugin has more inputs of type t than the insert */
1079 hide_channels.set (*t, inputs.get(*t) - in.get(*t));
1081 } else if (inputs.get(*t) < in.get(*t)) {
1082 /* we definitely cannot hide, since the plugin has fewer inputs of type t than the insert */
1087 if (could_hide && !cannot_hide) {
1088 if (_strict_io /*&& inputs.get (DataType::AUDIO) == outputs.get (DataType::AUDIO)*/) {
1089 _strict_io_configured = true;
1092 out = outputs + midi_bypass;
1094 return Match (Hide, 1, hide_channels);
1097 midi_bypass.reset();
1098 // TODO make it possible :)
1099 return Match (Impossible, 0);
1103 PluginInsert::get_state ()
1105 return state (true);
1109 PluginInsert::state (bool full)
1111 XMLNode& node = Processor::state (full);
1113 node.add_property("type", _plugins[0]->state_node_name());
1114 node.add_property("unique-id", _plugins[0]->unique_id());
1115 node.add_property("count", string_compose("%1", _plugins.size()));
1117 /* remember actual i/o configuration (for later placeholder
1118 * in case the plugin goes missing) */
1119 node.add_child_nocopy (* _configured_in.state (X_("ConfiguredInput")));
1120 node.add_child_nocopy (* _configured_out.state (X_("ConfiguredOutput")));
1122 _plugins[0]->set_insert_id(this->id());
1123 node.add_child_nocopy (_plugins[0]->get_state());
1125 for (Controls::iterator c = controls().begin(); c != controls().end(); ++c) {
1126 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> ((*c).second);
1128 node.add_child_nocopy (ac->get_state());
1136 PluginInsert::set_control_ids (const XMLNode& node, int version)
1138 const XMLNodeList& nlist = node.children();
1139 XMLNodeConstIterator iter;
1140 set<Evoral::Parameter>::const_iterator p;
1142 for (iter = nlist.begin(); iter != nlist.end(); ++iter) {
1143 if ((*iter)->name() == Controllable::xml_node_name) {
1144 const XMLProperty* prop;
1146 uint32_t p = (uint32_t)-1;
1148 if ((prop = (*iter)->property (X_("symbol"))) != 0) {
1149 boost::shared_ptr<LV2Plugin> lv2plugin = boost::dynamic_pointer_cast<LV2Plugin> (_plugins[0]);
1151 p = lv2plugin->port_index(prop->value().c_str());
1155 if (p == (uint32_t)-1 && (prop = (*iter)->property (X_("parameter"))) != 0) {
1156 p = atoi (prop->value());
1159 if (p != (uint32_t)-1) {
1161 /* this may create the new controllable */
1163 boost::shared_ptr<Evoral::Control> c = control (Evoral::Parameter (PluginAutomation, 0, p));
1165 #ifndef NO_PLUGIN_STATE
1169 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> (c);
1171 ac->set_state (**iter, version);
1180 PluginInsert::set_state(const XMLNode& node, int version)
1182 XMLNodeList nlist = node.children();
1183 XMLNodeIterator niter;
1184 XMLPropertyList plist;
1185 const XMLProperty *prop;
1186 ARDOUR::PluginType type;
1188 if ((prop = node.property ("type")) == 0) {
1189 error << _("XML node describing plugin is missing the `type' field") << endmsg;
1193 if (prop->value() == X_("ladspa") || prop->value() == X_("Ladspa")) { /* handle old school sessions */
1194 type = ARDOUR::LADSPA;
1195 } else if (prop->value() == X_("lv2")) {
1197 } else if (prop->value() == X_("windows-vst")) {
1198 type = ARDOUR::Windows_VST;
1199 } else if (prop->value() == X_("lxvst")) {
1200 type = ARDOUR::LXVST;
1201 } else if (prop->value() == X_("audiounit")) {
1202 type = ARDOUR::AudioUnit;
1203 } else if (prop->value() == X_("luaproc")) {
1206 error << string_compose (_("unknown plugin type %1 in plugin insert state"),
1212 prop = node.property ("unique-id");
1215 #ifdef WINDOWS_VST_SUPPORT
1216 /* older sessions contain VST plugins with only an "id" field.
1219 if (type == ARDOUR::Windows_VST) {
1220 prop = node.property ("id");
1224 #ifdef LXVST_SUPPORT
1225 /*There shouldn't be any older sessions with linuxVST support.. but anyway..*/
1227 if (type == ARDOUR::LXVST) {
1228 prop = node.property ("id");
1234 error << _("Plugin has no unique ID field") << endmsg;
1239 boost::shared_ptr<Plugin> plugin = find_plugin (_session, prop->value(), type);
1241 /* treat linux and windows VST plugins equivalent if they have the same uniqueID
1242 * allow to move sessions windows <> linux */
1243 #ifdef LXVST_SUPPORT
1244 if (plugin == 0 && type == ARDOUR::Windows_VST) {
1245 type = ARDOUR::LXVST;
1246 plugin = find_plugin (_session, prop->value(), type);
1250 #ifdef WINDOWS_VST_SUPPORT
1251 if (plugin == 0 && type == ARDOUR::LXVST) {
1252 type = ARDOUR::Windows_VST;
1253 plugin = find_plugin (_session, prop->value(), type);
1258 error << string_compose(
1259 _("Found a reference to a plugin (\"%1\") that is unknown.\n"
1260 "Perhaps it was removed or moved since it was last used."),
1266 if (type == ARDOUR::Lua) {
1267 XMLNode *ls = node.child (plugin->state_node_name().c_str());
1268 // we need to load the script to set the name and parameters.
1269 boost::shared_ptr<LuaProc> lp = boost::dynamic_pointer_cast<LuaProc>(plugin);
1271 lp->set_script_from_state (*ls);
1275 // The name of the PluginInsert comes from the plugin, nothing else
1276 _name = plugin->get_info()->name;
1280 // Processor::set_state() will set this, but too late
1281 // for it to be available when setting up plugin
1282 // state. We can't call Processor::set_state() until
1283 // the plugins themselves are created and added.
1287 if (_plugins.empty()) {
1288 /* if we are adding the first plugin, we will need to set
1289 up automatable controls.
1291 add_plugin (plugin);
1292 create_automatable_parameters ();
1293 set_control_ids (node, version);
1296 if ((prop = node.property ("count")) != 0) {
1297 sscanf (prop->value().c_str(), "%u", &count);
1300 if (_plugins.size() != count) {
1301 for (uint32_t n = 1; n < count; ++n) {
1302 add_plugin (plugin_factory (plugin));
1306 Processor::set_state (node, version);
1308 PBD::ID new_id = this->id();
1309 PBD::ID old_id = this->id();
1311 if ((prop = node.property ("id")) != 0) {
1312 old_id = prop->value ();
1315 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1317 /* find the node with the type-specific node name ("lv2", "ladspa", etc)
1318 and set all plugins to the same state.
1321 if ((*niter)->name() == plugin->state_node_name()) {
1323 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1324 /* Plugin state can include external files which are named after the ID.
1326 * If regenerate_xml_or_string_ids() is set, the ID will already have
1327 * been changed, so we need to use the old ID from the XML to load the
1328 * state and then update the ID.
1330 * When copying a plugin-state, route_ui takes care of of updating the ID,
1331 * but we need to call set_insert_id() to clear the cached plugin-state
1332 * and force a change.
1334 if (!regenerate_xml_or_string_ids ()) {
1335 (*i)->set_insert_id (new_id);
1337 (*i)->set_insert_id (old_id);
1340 (*i)->set_state (**niter, version);
1342 if (regenerate_xml_or_string_ids ()) {
1343 (*i)->set_insert_id (new_id);
1351 if (version < 3000) {
1353 /* Only 2.X sessions need a call to set_parameter_state() - in 3.X and above
1354 this is all handled by Automatable
1357 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1358 if ((*niter)->name() == "Redirect") {
1359 /* XXX do we need to tackle placement? i think not (pd; oct 16 2009) */
1360 Processor::set_state (**niter, version);
1365 set_parameter_state_2X (node, version);
1368 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1372 (*i)->deactivate ();
1380 PluginInsert::update_id (PBD::ID id)
1383 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1384 (*i)->set_insert_id (id);
1389 PluginInsert::set_state_dir (const std::string& d)
1391 // state() only saves the state of the first plugin
1392 _plugins[0]->set_state_dir (d);
1396 PluginInsert::set_parameter_state_2X (const XMLNode& node, int version)
1398 XMLNodeList nlist = node.children();
1399 XMLNodeIterator niter;
1401 /* look for port automation node */
1403 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1405 if ((*niter)->name() != port_automation_node_name) {
1411 XMLNodeConstIterator iter;
1416 cnodes = (*niter)->children ("port");
1418 for (iter = cnodes.begin(); iter != cnodes.end(); ++iter){
1422 if ((cprop = child->property("number")) != 0) {
1423 port = cprop->value().c_str();
1425 warning << _("PluginInsert: Auto: no ladspa port number") << endmsg;
1429 sscanf (port, "%" PRIu32, &port_id);
1431 if (port_id >= _plugins[0]->parameter_count()) {
1432 warning << _("PluginInsert: Auto: port id out of range") << endmsg;
1436 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(
1437 control(Evoral::Parameter(PluginAutomation, 0, port_id), true));
1439 if (c && c->alist()) {
1440 if (!child->children().empty()) {
1441 c->alist()->set_state (*child->children().front(), version);
1443 /* In some cases 2.X saves lists with min_yval and max_yval
1444 being FLT_MIN and FLT_MAX respectively. This causes problems
1445 in A3 because these min/max values are used to compute
1446 where GUI control points should be drawn. If we see such
1447 values, `correct' them to the min/max of the appropriate
1451 float min_y = c->alist()->get_min_y ();
1452 float max_y = c->alist()->get_max_y ();
1454 ParameterDescriptor desc;
1455 _plugins.front()->get_parameter_descriptor (port_id, desc);
1457 if (min_y == FLT_MIN) {
1461 if (max_y == FLT_MAX) {
1465 c->alist()->set_yrange (min_y, max_y);
1468 error << string_compose (_("PluginInsert: automatable control %1 not found - ignored"), port_id) << endmsg;
1480 PluginInsert::describe_parameter (Evoral::Parameter param)
1482 if (param.type() == PluginAutomation) {
1483 return _plugins[0]->describe_parameter (param);
1484 } else if (param.type() == PluginPropertyAutomation) {
1485 boost::shared_ptr<AutomationControl> c(automation_control(param));
1486 if (c && !c->desc().label.empty()) {
1487 return c->desc().label;
1490 return Automatable::describe_parameter(param);
1494 PluginInsert::signal_latency() const
1496 if (_user_latency) {
1497 return _user_latency;
1500 return _plugins[0]->signal_latency ();
1504 PluginInsert::type ()
1506 return plugin()->get_info()->type;
1509 PluginInsert::PluginControl::PluginControl (PluginInsert* p,
1510 const Evoral::Parameter& param,
1511 const ParameterDescriptor& desc,
1512 boost::shared_ptr<AutomationList> list)
1513 : AutomationControl (p->session(), param, desc, list, p->describe_parameter(param))
1517 alist()->reset_default (desc.normal);
1519 list->set_interpolation(Evoral::ControlList::Discrete);
1524 set_flags(Controllable::Toggle);
1528 /** @param val `user' value */
1530 PluginInsert::PluginControl::set_value (double user_val, PBD::Controllable::GroupControlDisposition group_override)
1533 _set_value (user_val, group_override);
1537 PluginInsert::PluginControl::set_value_unchecked (double user_val)
1539 /* used only by automation playback */
1540 _set_value (user_val, Controllable::NoGroup);
1544 PluginInsert::PluginControl::_set_value (double user_val, PBD::Controllable::GroupControlDisposition group_override)
1546 /* FIXME: probably should be taking out some lock here.. */
1548 for (Plugins::iterator i = _plugin->_plugins.begin(); i != _plugin->_plugins.end(); ++i) {
1549 (*i)->set_parameter (_list->parameter().id(), user_val);
1552 boost::shared_ptr<Plugin> iasp = _plugin->_impulseAnalysisPlugin.lock();
1554 iasp->set_parameter (_list->parameter().id(), user_val);
1557 AutomationControl::set_value (user_val, group_override);
1561 PluginInsert::PluginControl::catch_up_with_external_value (double user_val)
1563 AutomationControl::set_value (user_val, Controllable::NoGroup);
1567 PluginInsert::PluginControl::get_state ()
1571 XMLNode& node (AutomationControl::get_state());
1572 ss << parameter().id();
1573 node.add_property (X_("parameter"), ss.str());
1575 boost::shared_ptr<LV2Plugin> lv2plugin = boost::dynamic_pointer_cast<LV2Plugin> (_plugin->_plugins[0]);
1577 node.add_property (X_("symbol"), lv2plugin->port_symbol (parameter().id()));
1584 /** @return `user' val */
1586 PluginInsert::PluginControl::get_value () const
1588 boost::shared_ptr<Plugin> plugin = _plugin->plugin (0);
1594 return plugin->get_parameter (_list->parameter().id());
1597 PluginInsert::PluginPropertyControl::PluginPropertyControl (PluginInsert* p,
1598 const Evoral::Parameter& param,
1599 const ParameterDescriptor& desc,
1600 boost::shared_ptr<AutomationList> list)
1601 : AutomationControl (p->session(), param, desc, list)
1605 alist()->set_yrange (desc.lower, desc.upper);
1606 alist()->reset_default (desc.normal);
1610 set_flags(Controllable::Toggle);
1615 PluginInsert::PluginPropertyControl::set_value (double user_val, PBD::Controllable::GroupControlDisposition /* group_override*/)
1618 set_value_unchecked (user_val);
1623 PluginInsert::PluginPropertyControl::set_value_unchecked (double user_val)
1625 /* Old numeric set_value(), coerce to appropriate datatype if possible.
1626 This is lossy, but better than nothing until Ardour's automation system
1627 can handle various datatypes all the way down. */
1628 const Variant value(_desc.datatype, user_val);
1629 if (value.type() == Variant::NOTHING) {
1630 error << "set_value(double) called for non-numeric property" << endmsg;
1634 for (Plugins::iterator i = _plugin->_plugins.begin(); i != _plugin->_plugins.end(); ++i) {
1635 (*i)->set_property(_list->parameter().id(), value);
1639 AutomationControl::set_value (user_val, Controllable::NoGroup);
1643 PluginInsert::PluginPropertyControl::get_state ()
1647 XMLNode& node (AutomationControl::get_state());
1648 ss << parameter().id();
1649 node.add_property (X_("property"), ss.str());
1650 node.remove_property (X_("value"));
1656 PluginInsert::PluginPropertyControl::get_value () const
1658 return _value.to_double();
1661 boost::shared_ptr<Plugin>
1662 PluginInsert::get_impulse_analysis_plugin()
1664 boost::shared_ptr<Plugin> ret;
1665 if (_impulseAnalysisPlugin.expired()) {
1666 ret = plugin_factory(_plugins[0]);
1667 ret->configure_io (input_streams (), output_streams ());
1668 _impulseAnalysisPlugin = ret;
1670 ret = _impulseAnalysisPlugin.lock();
1677 PluginInsert::collect_signal_for_analysis (framecnt_t nframes)
1679 // called from outside the audio thread, so this should be safe
1680 // only do audio as analysis is (currently) only for audio plugins
1681 _signal_analysis_inputs.ensure_buffers( DataType::AUDIO, input_streams().n_audio(), nframes);
1682 _signal_analysis_outputs.ensure_buffers( DataType::AUDIO, output_streams().n_audio(), nframes);
1684 _signal_analysis_collected_nframes = 0;
1685 _signal_analysis_collect_nframes_max = nframes;
1688 /** Add a plugin to our list */
1690 PluginInsert::add_plugin (boost::shared_ptr<Plugin> plugin)
1692 plugin->set_insert_id (this->id());
1694 if (_plugins.empty()) {
1695 /* first (and probably only) plugin instance - connect to relevant signals
1698 plugin->ParameterChangedExternally.connect_same_thread (*this, boost::bind (&PluginInsert::parameter_changed_externally, this, _1, _2));
1699 plugin->StartTouch.connect_same_thread (*this, boost::bind (&PluginInsert::start_touch, this, _1));
1700 plugin->EndTouch.connect_same_thread (*this, boost::bind (&PluginInsert::end_touch, this, _1));
1703 _plugins.push_back (plugin);
1707 PluginInsert::realtime_handle_transport_stopped ()
1709 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1710 (*i)->realtime_handle_transport_stopped ();
1715 PluginInsert::realtime_locate ()
1717 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1718 (*i)->realtime_locate ();
1723 PluginInsert::monitoring_changed ()
1725 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1726 (*i)->monitoring_changed ();
1731 PluginInsert::start_touch (uint32_t param_id)
1733 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id));
1735 ac->start_touch (session().audible_frame());
1740 PluginInsert::end_touch (uint32_t param_id)
1742 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id));
1744 ac->stop_touch (true, session().audible_frame());