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();
454 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
456 ARDOUR::ChanMapping in_map (natural_input_streams());
457 ARDOUR::ChanMapping out_map;
458 ARDOUR::ChanCount mapped;
459 ARDOUR::ChanCount backmap;
461 // map inputs sequentially
462 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
463 for (uint32_t in = 0; in < natural_input_streams().get (*t); ++in) {
465 uint32_t in_idx = _in_map[pc].get (*t, in, &valid);
466 uint32_t m = mapped.get (*t);
468 inplace_bufs.get (*t, m).read_from (bufs.get (*t, in_idx), nframes, offset, offset);
470 inplace_bufs.get (*t, m).silence (nframes, offset);
472 mapped.set (*t, m + 1);
479 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
480 for (uint32_t out = 0; out < natural_output_streams().get (*t); ++out) {
481 uint32_t m = mapped.get (*t);
482 inplace_bufs.get (*t, m).silence (nframes, offset);
483 out_map.set (*t, out, m);
484 mapped.set (*t, m + 1);
488 if ((*i)->connect_and_run(inplace_bufs, in_map, out_map, nframes, offset)) {
492 // clear output buffers
493 bufs.silence (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);
504 backmap.set (*t, m + 1);
511 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
512 if ((*i)->connect_and_run(bufs, _in_map[pc], _out_map[pc], nframes, offset)) {
518 if (collect_signal_nframes > 0) {
520 //std::cerr << " output, bufs " << bufs.count().n_audio() << " count, " << bufs.available().n_audio() << " available" << std::endl;
521 //std::cerr << " streams " << output_streams().n_audio() << std::endl;
523 _signal_analysis_outputs.set_count(output_streams());
525 for (uint32_t i = 0; i < output_streams().n_audio(); ++i) {
526 _signal_analysis_outputs.get_audio(i).read_from(
528 collect_signal_nframes,
529 _signal_analysis_collected_nframes); // offset is for target buffer
532 _signal_analysis_collected_nframes += collect_signal_nframes;
533 assert(_signal_analysis_collected_nframes <= _signal_analysis_collect_nframes_max);
535 if (_signal_analysis_collected_nframes == _signal_analysis_collect_nframes_max) {
536 _signal_analysis_collect_nframes_max = 0;
537 _signal_analysis_collected_nframes = 0;
539 AnalysisDataGathered(&_signal_analysis_inputs,
540 &_signal_analysis_outputs);
543 /* leave remaining channel buffers alone */
547 PluginInsert::silence (framecnt_t nframes)
553 ChanMapping in_map (natural_input_streams ());
554 ChanMapping out_map (natural_output_streams ());
556 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
557 (*i)->connect_and_run (_session.get_scratch_buffers ((*i)->get_info()->n_inputs, true), in_map, out_map, nframes, 0);
562 PluginInsert::run (BufferSet& bufs, framepos_t start_frame, framepos_t /*end_frame*/, pframes_t nframes, bool)
564 if (_pending_active) {
565 /* run as normal if we are active or moving from inactive to active */
567 if (_session.transport_rolling() || _session.bounce_processing()) {
568 automation_run (bufs, start_frame, nframes);
570 connect_and_run (bufs, nframes, 0, false);
574 uint32_t in = input_streams ().n_audio ();
575 uint32_t out = output_streams().n_audio ();
577 if (has_no_audio_inputs() || in == 0) {
579 /* silence all (audio) outputs. Should really declick
580 * at the transitions of "active"
583 for (uint32_t n = 0; n < out; ++n) {
584 bufs.get_audio (n).silence (nframes);
587 } else if (out > in) {
589 /* not active, but something has make up for any channel count increase */
591 // TODO: option round-robin (n % in) or silence additional buffers ??
592 // for now , simply replicate last buffer
593 for (uint32_t n = in; n < out; ++n) {
594 bufs.get_audio(n).read_from(bufs.get_audio(in - 1), nframes);
598 bufs.count().set_audio (out);
601 _active = _pending_active;
603 /* we have no idea whether the plugin generated silence or not, so mark
604 * all buffers appropriately.
610 PluginInsert::automation_run (BufferSet& bufs, framepos_t start, pframes_t nframes)
612 Evoral::ControlEvent next_event (0, 0.0f);
613 framepos_t now = start;
614 framepos_t end = now + nframes;
615 framecnt_t offset = 0;
617 Glib::Threads::Mutex::Lock lm (control_lock(), Glib::Threads::TRY_LOCK);
620 connect_and_run (bufs, nframes, offset, false);
624 if (!find_next_event (now, end, next_event) || _plugins.front()->requires_fixed_sized_buffers()) {
626 /* no events have a time within the relevant range */
628 connect_and_run (bufs, nframes, offset, true, now);
634 framecnt_t cnt = min (((framecnt_t) ceil (next_event.when) - now), (framecnt_t) nframes);
636 connect_and_run (bufs, cnt, offset, true, now);
642 if (!find_next_event (now, end, next_event)) {
647 /* cleanup anything that is left to do */
650 connect_and_run (bufs, nframes, offset, true, now);
655 PluginInsert::default_parameter_value (const Evoral::Parameter& param)
657 if (param.type() != PluginAutomation)
660 if (_plugins.empty()) {
661 fatal << _("programming error: ") << X_("PluginInsert::default_parameter_value() called with no plugin")
663 abort(); /*NOTREACHED*/
666 return _plugins[0]->default_value (param.id());
671 PluginInsert::can_reset_all_parameters ()
675 for (uint32_t par = 0; par < _plugins[0]->parameter_count(); ++par) {
677 const uint32_t cid = _plugins[0]->nth_parameter (par, ok);
679 if (!ok || !_plugins[0]->parameter_is_input(cid)) {
683 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, cid));
689 if (ac->automation_state() & Play) {
694 return all && (params > 0);
698 PluginInsert::reset_parameters_to_default ()
702 for (uint32_t par = 0; par < _plugins[0]->parameter_count(); ++par) {
704 const uint32_t cid = _plugins[0]->nth_parameter (par, ok);
706 if (!ok || !_plugins[0]->parameter_is_input(cid)) {
710 const float dflt = _plugins[0]->default_value (cid);
711 const float curr = _plugins[0]->get_parameter (cid);
717 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, cid));
722 if (ac->automation_state() & Play) {
727 ac->set_value (dflt, Controllable::NoGroup);
732 boost::shared_ptr<Plugin>
733 PluginInsert::plugin_factory (boost::shared_ptr<Plugin> other)
735 boost::shared_ptr<LadspaPlugin> lp;
736 boost::shared_ptr<LuaProc> lua;
738 boost::shared_ptr<LV2Plugin> lv2p;
740 #ifdef WINDOWS_VST_SUPPORT
741 boost::shared_ptr<WindowsVSTPlugin> vp;
744 boost::shared_ptr<LXVSTPlugin> lxvp;
746 #ifdef AUDIOUNIT_SUPPORT
747 boost::shared_ptr<AUPlugin> ap;
750 if ((lp = boost::dynamic_pointer_cast<LadspaPlugin> (other)) != 0) {
751 return boost::shared_ptr<Plugin> (new LadspaPlugin (*lp));
752 } else if ((lua = boost::dynamic_pointer_cast<LuaProc> (other)) != 0) {
753 return boost::shared_ptr<Plugin> (new LuaProc (*lua));
755 } else if ((lv2p = boost::dynamic_pointer_cast<LV2Plugin> (other)) != 0) {
756 return boost::shared_ptr<Plugin> (new LV2Plugin (*lv2p));
758 #ifdef WINDOWS_VST_SUPPORT
759 } else if ((vp = boost::dynamic_pointer_cast<WindowsVSTPlugin> (other)) != 0) {
760 return boost::shared_ptr<Plugin> (new WindowsVSTPlugin (*vp));
763 } else if ((lxvp = boost::dynamic_pointer_cast<LXVSTPlugin> (other)) != 0) {
764 return boost::shared_ptr<Plugin> (new LXVSTPlugin (*lxvp));
766 #ifdef AUDIOUNIT_SUPPORT
767 } else if ((ap = boost::dynamic_pointer_cast<AUPlugin> (other)) != 0) {
768 return boost::shared_ptr<Plugin> (new AUPlugin (*ap));
772 fatal << string_compose (_("programming error: %1"),
773 X_("unknown plugin type in PluginInsert::plugin_factory"))
775 abort(); /*NOTREACHED*/
776 return boost::shared_ptr<Plugin> ((Plugin*) 0);
780 PluginInsert::configure_io (ChanCount in, ChanCount out)
782 Match old_match = _match;
783 ChanCount old_in = input_streams ();
784 ChanCount old_out = output_streams ();
787 _configured_out = out;
789 /* set the matching method and number of plugins that we will use to meet this configuration */
790 _match = private_can_support_io_configuration (in, out);
791 if (set_count (_match.plugins) == false) {
792 PluginIoReConfigure (); /* EMIT SIGNAL */
796 /* configure plugins */
797 switch (_match.method) {
800 if (_plugins.front()->configure_io (_plugins.front()->get_info()->n_inputs, out) == false) {
801 PluginIoReConfigure (); /* EMIT SIGNAL */
807 if (_plugins.front()->configure_io (in, out) == false) {
808 PluginIoReConfigure (); /* EMIT SIGNAL */
814 // TODO make configurable
816 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
817 if (_match.method == Split) {
818 /* TODO see PluginInsert::connect_and_run, channel replication */
819 _in_map[pc] = ChanMapping (natural_input_streams ());
821 _in_map[pc] = ChanMapping (input_streams ());
823 _out_map[pc] = ChanMapping (output_streams());
825 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
826 _in_map[pc].offset_to(*t, pc * natural_input_streams().get(*t));
827 _out_map[pc].offset_to(*t, pc * natural_output_streams().get(*t));
832 if ( (old_match.method != _match.method && (old_match.method == Split || _match.method == Split))
837 PluginIoReConfigure (); /* EMIT SIGNAL */
840 // we don't know the analysis window size, so we must work with the
841 // current buffer size here. each request for data fills in these
842 // buffers and the analyser makes sure it gets enough data for the
844 session().ensure_buffer_set (_signal_analysis_inputs, in);
845 //_signal_analysis_inputs.set_count (in);
847 session().ensure_buffer_set (_signal_analysis_outputs, out);
848 //_signal_analysis_outputs.set_count (out);
850 // std::cerr << "set counts to i" << in.n_audio() << "/o" << out.n_audio() << std::endl;
852 return Processor::configure_io (in, out);
855 /** Decide whether this PluginInsert can support a given IO configuration.
856 * To do this, we run through a set of possible solutions in rough order of
859 * @param in Required input channel count.
860 * @param out Filled in with the output channel count if we return true.
861 * @return true if the given IO configuration can be supported.
864 PluginInsert::can_support_io_configuration (const ChanCount& in, ChanCount& out)
866 return private_can_support_io_configuration (in, out).method != Impossible;
869 /** A private version of can_support_io_configuration which returns the method
870 * by which the configuration can be matched, rather than just whether or not
874 PluginInsert::private_can_support_io_configuration (ChanCount const & inx, ChanCount& out)
876 _strict_io_configured = false;
877 if (_plugins.empty()) {
881 PluginInfoPtr info = _plugins.front()->get_info();
882 ChanCount in; in += inx;
885 if (info->reconfigurable_io()) {
886 /* Plugin has flexible I/O, so delegate to it */
887 bool const r = _plugins.front()->can_support_io_configuration (in, out);
889 return Match (Impossible, 0);
892 if (_strict_io && in.n_audio() < out.n_audio()) {
893 DEBUG_TRACE (DEBUG::Processors, string_compose ("hiding output ports of reconfigurable %1\n", name()));
894 out.set (DataType::AUDIO, in.get (DataType::AUDIO));
897 return Match (Delegate, 1);
900 ChanCount inputs = info->n_inputs;
901 ChanCount outputs = info->n_outputs;
903 if (in.get(DataType::MIDI) == 1 && outputs.get(DataType::MIDI) == 0) {
904 DEBUG_TRACE ( DEBUG::Processors, string_compose ("bypassing midi-data around %1\n", name()));
905 midi_bypass.set(DataType::MIDI, 1);
907 if (in.get(DataType::MIDI) == 1 && inputs.get(DataType::MIDI) == 0) {
908 DEBUG_TRACE ( DEBUG::Processors, string_compose ("hiding midi-port from plugin %1\n", name()));
909 in.set(DataType::MIDI, 0);
912 bool no_inputs = true;
913 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
914 if (inputs.get (*t) != 0) {
921 /* no inputs so we can take any input configuration since we throw it away */
922 out = outputs + midi_bypass;
923 return Match (NoInputs, 1);
926 /* Plugin inputs match requested inputs exactly */
927 if (inputs == in && (!_strict_io || outputs.n_audio() == inputs.n_audio())) {
928 out = outputs + midi_bypass;
929 return Match (ExactMatch, 1);
932 /* We may be able to run more than one copy of the plugin within this insert
933 to cope with the insert having more inputs than the plugin.
934 We allow replication only for plugins with either zero or 1 inputs and outputs
935 for every valid data type.
939 bool can_replicate = true;
940 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
942 uint32_t nin = inputs.get (*t);
944 // No inputs of this type
945 if (nin == 0 && in.get(*t) == 0) {
949 if (nin != 1 || outputs.get (*t) != 1) {
950 can_replicate = false;
954 // Potential factor not set yet
956 f = in.get(*t) / nin;
959 // Factor for this type does not match another type, can not replicate
960 if (f != (in.get(*t) / nin)) {
961 can_replicate = false;
967 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
968 out.set (*t, outputs.get(*t) * f);
971 return Match (Replicate, f);
974 /* If the processor has exactly one input of a given type, and
975 the plugin has more, we can feed the single processor input
976 to some or all of the plugin inputs. This is rather
977 special-case-y, but the 1-to-many case is by far the
978 simplest. How do I split thy 2 processor inputs to 3
979 plugin inputs? Let me count the ways ...
982 bool can_split = !_strict_io;
983 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
985 bool const can_split_type = (in.get (*t) == 1 && inputs.get (*t) > 1);
986 bool const nothing_to_do_for_type = (in.get (*t) == 0 && inputs.get (*t) == 0);
988 if (!can_split_type && !nothing_to_do_for_type) {
994 out = outputs + midi_bypass;
995 return Match (Split, 1);
998 /* If the plugin has more inputs than we want, we can `hide' some of them
999 by feeding them silence.
1002 bool could_hide = false;
1003 bool cannot_hide = false;
1004 ChanCount hide_channels;
1006 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1007 if (inputs.get(*t) > in.get(*t)) {
1008 /* there is potential to hide, since the plugin has more inputs of type t than the insert */
1009 hide_channels.set (*t, inputs.get(*t) - in.get(*t));
1011 } else if (inputs.get(*t) < in.get(*t)) {
1012 /* we definitely cannot hide, since the plugin has fewer inputs of type t than the insert */
1017 if (could_hide && !cannot_hide) {
1018 if (_strict_io && inputs.get (DataType::AUDIO) == outputs.get (DataType::AUDIO)) {
1019 _strict_io_configured = true;
1022 out = outputs + midi_bypass;
1024 return Match (Hide, 1, hide_channels);
1027 midi_bypass.reset();
1028 return Match (Impossible, 0);
1032 PluginInsert::get_state ()
1034 return state (true);
1038 PluginInsert::state (bool full)
1040 XMLNode& node = Processor::state (full);
1042 node.add_property("type", _plugins[0]->state_node_name());
1043 node.add_property("unique-id", _plugins[0]->unique_id());
1044 node.add_property("count", string_compose("%1", _plugins.size()));
1046 /* remember actual i/o configuration (for later placeholder
1047 * in case the plugin goes missing) */
1048 node.add_child_nocopy (* _configured_in.state (X_("ConfiguredInput")));
1049 node.add_child_nocopy (* _configured_out.state (X_("ConfiguredOutput")));
1051 _plugins[0]->set_insert_id(this->id());
1052 node.add_child_nocopy (_plugins[0]->get_state());
1054 for (Controls::iterator c = controls().begin(); c != controls().end(); ++c) {
1055 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> ((*c).second);
1057 node.add_child_nocopy (ac->get_state());
1065 PluginInsert::set_control_ids (const XMLNode& node, int version)
1067 const XMLNodeList& nlist = node.children();
1068 XMLNodeConstIterator iter;
1069 set<Evoral::Parameter>::const_iterator p;
1071 for (iter = nlist.begin(); iter != nlist.end(); ++iter) {
1072 if ((*iter)->name() == Controllable::xml_node_name) {
1073 const XMLProperty* prop;
1075 uint32_t p = (uint32_t)-1;
1077 if ((prop = (*iter)->property (X_("symbol"))) != 0) {
1078 boost::shared_ptr<LV2Plugin> lv2plugin = boost::dynamic_pointer_cast<LV2Plugin> (_plugins[0]);
1080 p = lv2plugin->port_index(prop->value().c_str());
1084 if (p == (uint32_t)-1 && (prop = (*iter)->property (X_("parameter"))) != 0) {
1085 p = atoi (prop->value());
1088 if (p != (uint32_t)-1) {
1090 /* this may create the new controllable */
1092 boost::shared_ptr<Evoral::Control> c = control (Evoral::Parameter (PluginAutomation, 0, p));
1094 #ifndef NO_PLUGIN_STATE
1098 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> (c);
1100 ac->set_state (**iter, version);
1109 PluginInsert::set_state(const XMLNode& node, int version)
1111 XMLNodeList nlist = node.children();
1112 XMLNodeIterator niter;
1113 XMLPropertyList plist;
1114 const XMLProperty *prop;
1115 ARDOUR::PluginType type;
1117 if ((prop = node.property ("type")) == 0) {
1118 error << _("XML node describing plugin is missing the `type' field") << endmsg;
1122 if (prop->value() == X_("ladspa") || prop->value() == X_("Ladspa")) { /* handle old school sessions */
1123 type = ARDOUR::LADSPA;
1124 } else if (prop->value() == X_("lv2")) {
1126 } else if (prop->value() == X_("windows-vst")) {
1127 type = ARDOUR::Windows_VST;
1128 } else if (prop->value() == X_("lxvst")) {
1129 type = ARDOUR::LXVST;
1130 } else if (prop->value() == X_("audiounit")) {
1131 type = ARDOUR::AudioUnit;
1132 } else if (prop->value() == X_("luaproc")) {
1135 error << string_compose (_("unknown plugin type %1 in plugin insert state"),
1141 prop = node.property ("unique-id");
1144 #ifdef WINDOWS_VST_SUPPORT
1145 /* older sessions contain VST plugins with only an "id" field.
1148 if (type == ARDOUR::Windows_VST) {
1149 prop = node.property ("id");
1153 #ifdef LXVST_SUPPORT
1154 /*There shouldn't be any older sessions with linuxVST support.. but anyway..*/
1156 if (type == ARDOUR::LXVST) {
1157 prop = node.property ("id");
1163 error << _("Plugin has no unique ID field") << endmsg;
1168 boost::shared_ptr<Plugin> plugin = find_plugin (_session, prop->value(), type);
1170 /* treat linux and windows VST plugins equivalent if they have the same uniqueID
1171 * allow to move sessions windows <> linux */
1172 #ifdef LXVST_SUPPORT
1173 if (plugin == 0 && type == ARDOUR::Windows_VST) {
1174 type = ARDOUR::LXVST;
1175 plugin = find_plugin (_session, prop->value(), type);
1179 #ifdef WINDOWS_VST_SUPPORT
1180 if (plugin == 0 && type == ARDOUR::LXVST) {
1181 type = ARDOUR::Windows_VST;
1182 plugin = find_plugin (_session, prop->value(), type);
1187 error << string_compose(
1188 _("Found a reference to a plugin (\"%1\") that is unknown.\n"
1189 "Perhaps it was removed or moved since it was last used."),
1195 if (type == ARDOUR::Lua) {
1196 XMLNode *ls = node.child (plugin->state_node_name().c_str());
1197 // we need to load the script to set the name and parameters.
1198 boost::shared_ptr<LuaProc> lp = boost::dynamic_pointer_cast<LuaProc>(plugin);
1200 lp->set_script_from_state (*ls);
1204 // The name of the PluginInsert comes from the plugin, nothing else
1205 _name = plugin->get_info()->name;
1209 // Processor::set_state() will set this, but too late
1210 // for it to be available when setting up plugin
1211 // state. We can't call Processor::set_state() until
1212 // the plugins themselves are created and added.
1216 if (_plugins.empty()) {
1217 /* if we are adding the first plugin, we will need to set
1218 up automatable controls.
1220 add_plugin (plugin);
1221 create_automatable_parameters ();
1222 set_control_ids (node, version);
1225 if ((prop = node.property ("count")) != 0) {
1226 sscanf (prop->value().c_str(), "%u", &count);
1229 if (_plugins.size() != count) {
1230 for (uint32_t n = 1; n < count; ++n) {
1231 add_plugin (plugin_factory (plugin));
1235 Processor::set_state (node, version);
1237 PBD::ID new_id = this->id();
1238 PBD::ID old_id = this->id();
1240 if ((prop = node.property ("id")) != 0) {
1241 old_id = prop->value ();
1244 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1246 /* find the node with the type-specific node name ("lv2", "ladspa", etc)
1247 and set all plugins to the same state.
1250 if ((*niter)->name() == plugin->state_node_name()) {
1252 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1253 /* Plugin state can include external files which are named after the ID.
1255 * If regenerate_xml_or_string_ids() is set, the ID will already have
1256 * been changed, so we need to use the old ID from the XML to load the
1257 * state and then update the ID.
1259 * When copying a plugin-state, route_ui takes care of of updating the ID,
1260 * but we need to call set_insert_id() to clear the cached plugin-state
1261 * and force a change.
1263 if (!regenerate_xml_or_string_ids ()) {
1264 (*i)->set_insert_id (new_id);
1266 (*i)->set_insert_id (old_id);
1269 (*i)->set_state (**niter, version);
1271 if (regenerate_xml_or_string_ids ()) {
1272 (*i)->set_insert_id (new_id);
1280 if (version < 3000) {
1282 /* Only 2.X sessions need a call to set_parameter_state() - in 3.X and above
1283 this is all handled by Automatable
1286 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1287 if ((*niter)->name() == "Redirect") {
1288 /* XXX do we need to tackle placement? i think not (pd; oct 16 2009) */
1289 Processor::set_state (**niter, version);
1294 set_parameter_state_2X (node, version);
1297 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1301 (*i)->deactivate ();
1309 PluginInsert::update_id (PBD::ID id)
1312 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1313 (*i)->set_insert_id (id);
1318 PluginInsert::set_state_dir (const std::string& d)
1320 // state() only saves the state of the first plugin
1321 _plugins[0]->set_state_dir (d);
1325 PluginInsert::set_parameter_state_2X (const XMLNode& node, int version)
1327 XMLNodeList nlist = node.children();
1328 XMLNodeIterator niter;
1330 /* look for port automation node */
1332 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1334 if ((*niter)->name() != port_automation_node_name) {
1340 XMLNodeConstIterator iter;
1345 cnodes = (*niter)->children ("port");
1347 for (iter = cnodes.begin(); iter != cnodes.end(); ++iter){
1351 if ((cprop = child->property("number")) != 0) {
1352 port = cprop->value().c_str();
1354 warning << _("PluginInsert: Auto: no ladspa port number") << endmsg;
1358 sscanf (port, "%" PRIu32, &port_id);
1360 if (port_id >= _plugins[0]->parameter_count()) {
1361 warning << _("PluginInsert: Auto: port id out of range") << endmsg;
1365 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(
1366 control(Evoral::Parameter(PluginAutomation, 0, port_id), true));
1368 if (c && c->alist()) {
1369 if (!child->children().empty()) {
1370 c->alist()->set_state (*child->children().front(), version);
1372 /* In some cases 2.X saves lists with min_yval and max_yval
1373 being FLT_MIN and FLT_MAX respectively. This causes problems
1374 in A3 because these min/max values are used to compute
1375 where GUI control points should be drawn. If we see such
1376 values, `correct' them to the min/max of the appropriate
1380 float min_y = c->alist()->get_min_y ();
1381 float max_y = c->alist()->get_max_y ();
1383 ParameterDescriptor desc;
1384 _plugins.front()->get_parameter_descriptor (port_id, desc);
1386 if (min_y == FLT_MIN) {
1390 if (max_y == FLT_MAX) {
1394 c->alist()->set_yrange (min_y, max_y);
1397 error << string_compose (_("PluginInsert: automatable control %1 not found - ignored"), port_id) << endmsg;
1409 PluginInsert::describe_parameter (Evoral::Parameter param)
1411 if (param.type() == PluginAutomation) {
1412 return _plugins[0]->describe_parameter (param);
1413 } else if (param.type() == PluginPropertyAutomation) {
1414 boost::shared_ptr<AutomationControl> c(automation_control(param));
1415 if (c && !c->desc().label.empty()) {
1416 return c->desc().label;
1419 return Automatable::describe_parameter(param);
1423 PluginInsert::signal_latency() const
1425 if (_user_latency) {
1426 return _user_latency;
1429 return _plugins[0]->signal_latency ();
1433 PluginInsert::type ()
1435 return plugin()->get_info()->type;
1438 PluginInsert::PluginControl::PluginControl (PluginInsert* p,
1439 const Evoral::Parameter& param,
1440 const ParameterDescriptor& desc,
1441 boost::shared_ptr<AutomationList> list)
1442 : AutomationControl (p->session(), param, desc, list, p->describe_parameter(param))
1446 alist()->reset_default (desc.normal);
1448 list->set_interpolation(Evoral::ControlList::Discrete);
1453 set_flags(Controllable::Toggle);
1457 /** @param val `user' value */
1459 PluginInsert::PluginControl::set_value (double user_val, PBD::Controllable::GroupControlDisposition group_override)
1462 _set_value (user_val, group_override);
1466 PluginInsert::PluginControl::set_value_unchecked (double user_val)
1468 /* used only by automation playback */
1469 _set_value (user_val, Controllable::NoGroup);
1473 PluginInsert::PluginControl::_set_value (double user_val, PBD::Controllable::GroupControlDisposition group_override)
1475 /* FIXME: probably should be taking out some lock here.. */
1477 for (Plugins::iterator i = _plugin->_plugins.begin(); i != _plugin->_plugins.end(); ++i) {
1478 (*i)->set_parameter (_list->parameter().id(), user_val);
1481 boost::shared_ptr<Plugin> iasp = _plugin->_impulseAnalysisPlugin.lock();
1483 iasp->set_parameter (_list->parameter().id(), user_val);
1486 AutomationControl::set_value (user_val, group_override);
1490 PluginInsert::PluginControl::catch_up_with_external_value (double user_val)
1492 AutomationControl::set_value (user_val, Controllable::NoGroup);
1496 PluginInsert::PluginControl::get_state ()
1500 XMLNode& node (AutomationControl::get_state());
1501 ss << parameter().id();
1502 node.add_property (X_("parameter"), ss.str());
1504 boost::shared_ptr<LV2Plugin> lv2plugin = boost::dynamic_pointer_cast<LV2Plugin> (_plugin->_plugins[0]);
1506 node.add_property (X_("symbol"), lv2plugin->port_symbol (parameter().id()));
1513 /** @return `user' val */
1515 PluginInsert::PluginControl::get_value () const
1517 boost::shared_ptr<Plugin> plugin = _plugin->plugin (0);
1523 return plugin->get_parameter (_list->parameter().id());
1526 PluginInsert::PluginPropertyControl::PluginPropertyControl (PluginInsert* p,
1527 const Evoral::Parameter& param,
1528 const ParameterDescriptor& desc,
1529 boost::shared_ptr<AutomationList> list)
1530 : AutomationControl (p->session(), param, desc, list)
1534 alist()->set_yrange (desc.lower, desc.upper);
1535 alist()->reset_default (desc.normal);
1539 set_flags(Controllable::Toggle);
1544 PluginInsert::PluginPropertyControl::set_value (double user_val, PBD::Controllable::GroupControlDisposition /* group_override*/)
1547 set_value_unchecked (user_val);
1552 PluginInsert::PluginPropertyControl::set_value_unchecked (double user_val)
1554 /* Old numeric set_value(), coerce to appropriate datatype if possible.
1555 This is lossy, but better than nothing until Ardour's automation system
1556 can handle various datatypes all the way down. */
1557 const Variant value(_desc.datatype, user_val);
1558 if (value.type() == Variant::NOTHING) {
1559 error << "set_value(double) called for non-numeric property" << endmsg;
1563 for (Plugins::iterator i = _plugin->_plugins.begin(); i != _plugin->_plugins.end(); ++i) {
1564 (*i)->set_property(_list->parameter().id(), value);
1568 AutomationControl::set_value (user_val, Controllable::NoGroup);
1572 PluginInsert::PluginPropertyControl::get_state ()
1576 XMLNode& node (AutomationControl::get_state());
1577 ss << parameter().id();
1578 node.add_property (X_("property"), ss.str());
1579 node.remove_property (X_("value"));
1585 PluginInsert::PluginPropertyControl::get_value () const
1587 return _value.to_double();
1590 boost::shared_ptr<Plugin>
1591 PluginInsert::get_impulse_analysis_plugin()
1593 boost::shared_ptr<Plugin> ret;
1594 if (_impulseAnalysisPlugin.expired()) {
1595 ret = plugin_factory(_plugins[0]);
1596 ret->configure_io (input_streams (), output_streams ());
1597 _impulseAnalysisPlugin = ret;
1599 ret = _impulseAnalysisPlugin.lock();
1606 PluginInsert::collect_signal_for_analysis (framecnt_t nframes)
1608 // called from outside the audio thread, so this should be safe
1609 // only do audio as analysis is (currently) only for audio plugins
1610 _signal_analysis_inputs.ensure_buffers( DataType::AUDIO, input_streams().n_audio(), nframes);
1611 _signal_analysis_outputs.ensure_buffers( DataType::AUDIO, output_streams().n_audio(), nframes);
1613 _signal_analysis_collected_nframes = 0;
1614 _signal_analysis_collect_nframes_max = nframes;
1617 /** Add a plugin to our list */
1619 PluginInsert::add_plugin (boost::shared_ptr<Plugin> plugin)
1621 plugin->set_insert_id (this->id());
1623 if (_plugins.empty()) {
1624 /* first (and probably only) plugin instance - connect to relevant signals
1627 plugin->ParameterChangedExternally.connect_same_thread (*this, boost::bind (&PluginInsert::parameter_changed_externally, this, _1, _2));
1628 plugin->StartTouch.connect_same_thread (*this, boost::bind (&PluginInsert::start_touch, this, _1));
1629 plugin->EndTouch.connect_same_thread (*this, boost::bind (&PluginInsert::end_touch, this, _1));
1632 _plugins.push_back (plugin);
1636 PluginInsert::realtime_handle_transport_stopped ()
1638 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1639 (*i)->realtime_handle_transport_stopped ();
1644 PluginInsert::realtime_locate ()
1646 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1647 (*i)->realtime_locate ();
1652 PluginInsert::monitoring_changed ()
1654 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1655 (*i)->monitoring_changed ();
1660 PluginInsert::start_touch (uint32_t param_id)
1662 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id));
1664 ac->start_touch (session().audible_frame());
1669 PluginInsert::end_touch (uint32_t param_id)
1671 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id));
1673 ac->stop_touch (true, session().audible_frame());