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)
75 , _maps_from_state (false)
77 /* the first is the master */
81 create_automatable_parameters ();
82 const ChanCount& sc (sidechain_input_pins ());
83 if (sc.n_total () > 0) {
84 add_sidechain (sc.n_audio ());
89 PluginInsert::~PluginInsert ()
94 PluginInsert::set_strict_io (bool b)
96 bool changed = _strict_io != b;
99 PluginConfigChanged (); /* EMIT SIGNAL */
104 PluginInsert::set_count (uint32_t num)
106 bool require_state = !_plugins.empty();
108 /* this is a bad idea.... we shouldn't do this while active.
109 only a route holding their redirect_lock should be calling this
114 } else if (num > _plugins.size()) {
115 uint32_t diff = num - _plugins.size();
117 for (uint32_t n = 0; n < diff; ++n) {
118 boost::shared_ptr<Plugin> p = plugin_factory (_plugins[0]);
125 /* XXX do something */
128 PluginConfigChanged (); /* EMIT SIGNAL */
130 } else if (num < _plugins.size()) {
131 uint32_t diff = _plugins.size() - num;
132 for (uint32_t n= 0; n < diff; ++n) {
135 PluginConfigChanged (); /* EMIT SIGNAL */
143 PluginInsert::set_outputs (const ChanCount& c)
145 bool changed = (_custom_out != c) && _custom_cfg;
148 PluginConfigChanged (); /* EMIT SIGNAL */
153 PluginInsert::set_custom_cfg (bool b)
155 bool changed = _custom_cfg != b;
158 PluginConfigChanged (); /* EMIT SIGNAL */
163 PluginInsert::add_sidechain (uint32_t n_audio)
165 // caller must hold process lock
169 // TODO add route-name, plugin name and shorten.. (plugin name can be long and conatain odd chars)
170 std::string n = "Sidechain " + id().to_s(); /// XXX
171 SideChain *sc = new SideChain (_session, n);
172 _sidechain = boost::shared_ptr<SideChain> (sc);
173 _sidechain->activate ();
174 for (uint32_t n = 0; n < n_audio; ++n) {
175 _sidechain->input()->add_port ("", owner()); // add a port, don't connect.
177 PluginConfigChanged (); /* EMIT SIGNAL */
182 PluginInsert::del_sidechain ()
188 PluginConfigChanged (); /* EMIT SIGNAL */
193 PluginInsert::control_list_automation_state_changed (Evoral::Parameter which, AutoState s)
195 if (which.type() != PluginAutomation)
198 boost::shared_ptr<AutomationControl> c
199 = boost::dynamic_pointer_cast<AutomationControl>(control (which));
202 _plugins[0]->set_parameter (which.id(), c->list()->eval (_session.transport_frame()));
207 PluginInsert::output_streams() const
209 assert (_configured);
210 return _configured_out;
214 PluginInsert::input_streams() const
216 assert (_configured);
217 return _configured_in;
221 PluginInsert::internal_streams() const
223 assert (_configured);
224 return _configured_internal;
228 PluginInsert::internal_output_streams() const
230 assert (!_plugins.empty());
232 PluginInfoPtr info = _plugins.front()->get_info();
234 if (info->reconfigurable_io()) {
235 ChanCount out = _plugins.front()->output_streams ();
236 // DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, reconfigur(able) output streams = %1\n", out));
239 ChanCount out = info->n_outputs;
240 // DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, static output streams = %1 for %2 plugins\n", out, _plugins.size()));
241 out.set_audio (out.n_audio() * _plugins.size());
242 out.set_midi (out.n_midi() * _plugins.size());
248 PluginInsert::internal_input_streams() const
250 assert (!_plugins.empty());
254 PluginInfoPtr info = _plugins.front()->get_info();
256 if (info->reconfigurable_io()) {
257 assert (_plugins.size() == 1);
258 in = _plugins.front()->input_streams();
263 DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, input streams = %1, match using %2\n", in, _match.method));
265 if (_match.method == Split) {
267 /* we are splitting 1 processor input to multiple plugin inputs,
268 so we have a maximum of 1 stream of each type.
270 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
271 if (in.get (*t) > 1) {
277 } else if (_match.method == Hide) {
279 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
280 in.set (*t, in.get (*t) - _match.hide.get (*t));
286 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
287 in.set (*t, in.get (*t) * _plugins.size ());
295 PluginInsert::natural_output_streams() const
297 return _plugins[0]->get_info()->n_outputs;
301 PluginInsert::natural_input_streams() const
303 return _plugins[0]->get_info()->n_inputs;
307 PluginInsert::sidechain_input_pins() const
309 return _cached_sidechain_pins;
313 PluginInsert::has_no_inputs() const
315 return _plugins[0]->get_info()->n_inputs == ChanCount::ZERO;
319 PluginInsert::has_no_audio_inputs() const
321 return _plugins[0]->get_info()->n_inputs.n_audio() == 0;
325 PluginInsert::is_midi_instrument() const
327 /* XXX more finesse is possible here. VST plugins have a
328 a specific "instrument" flag, for example.
330 PluginInfoPtr pi = _plugins[0]->get_info();
332 return pi->n_inputs.n_midi() != 0 &&
333 pi->n_outputs.n_audio() > 0;
337 PluginInsert::create_automatable_parameters ()
339 assert (!_plugins.empty());
341 set<Evoral::Parameter> a = _plugins.front()->automatable ();
343 for (set<Evoral::Parameter>::iterator i = a.begin(); i != a.end(); ++i) {
344 if (i->type() == PluginAutomation) {
346 Evoral::Parameter param(*i);
348 ParameterDescriptor desc;
349 _plugins.front()->get_parameter_descriptor(i->id(), desc);
351 can_automate (param);
352 boost::shared_ptr<AutomationList> list(new AutomationList(param, desc));
353 boost::shared_ptr<AutomationControl> c (new PluginControl(this, param, desc, list));
355 _plugins.front()->set_automation_control (i->id(), c);
356 } else if (i->type() == PluginPropertyAutomation) {
357 Evoral::Parameter param(*i);
358 const ParameterDescriptor& desc = _plugins.front()->get_property_descriptor(param.id());
359 if (desc.datatype != Variant::NOTHING) {
360 boost::shared_ptr<AutomationList> list;
361 if (Variant::type_is_numeric(desc.datatype)) {
362 list = boost::shared_ptr<AutomationList>(new AutomationList(param, desc));
364 add_control (boost::shared_ptr<AutomationControl> (new PluginPropertyControl(this, param, desc, list)));
369 /** Called when something outside of this host has modified a plugin
370 * parameter. Responsible for propagating the change to two places:
372 * 1) anything listening to the Control itself
373 * 2) any replicated plugins that make up this PluginInsert.
375 * The PluginInsert is connected to the ParameterChangedExternally signal for
376 * the first (primary) plugin, and here broadcasts that change to any others.
378 * XXX We should probably drop this whole replication idea (Paul, October 2015)
379 * since it isn't used by sensible plugin APIs (AU, LV2).
382 PluginInsert::parameter_changed_externally (uint32_t which, float val)
384 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, which));
386 /* First propagation: alter the underlying value of the control,
387 * without telling the plugin(s) that own/use it to set it.
394 boost::shared_ptr<PluginControl> pc = boost::dynamic_pointer_cast<PluginControl> (ac);
397 pc->catch_up_with_external_value (val);
400 /* Second propagation: tell all plugins except the first to
401 update the value of this parameter. For sane plugin APIs,
402 there are no other plugins, so this is a no-op in those
406 Plugins::iterator i = _plugins.begin();
408 /* don't set the first plugin, just all the slaves */
410 if (i != _plugins.end()) {
412 for (; i != _plugins.end(); ++i) {
413 (*i)->set_parameter (which, val);
419 PluginInsert::set_block_size (pframes_t nframes)
422 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
423 if ((*i)->set_block_size (nframes) != 0) {
431 PluginInsert::activate ()
433 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
437 Processor::activate ();
441 PluginInsert::deactivate ()
443 Processor::deactivate ();
445 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
451 PluginInsert::flush ()
453 for (vector<boost::shared_ptr<Plugin> >::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
459 PluginInsert::connect_and_run (BufferSet& bufs, pframes_t nframes, framecnt_t offset, bool with_auto, framepos_t now)
461 PinMappings in_map (_in_map);
462 PinMappings out_map (_out_map);
465 // TODO optimize special case.
466 // Currently this never triggers because the in_map for "Split" triggeres no_inplace.
467 if (_match.method == Split && !_no_inplace) {
468 assert (in_map.size () == 1);
469 in_map[0] = ChanMapping (ChanCount::max (natural_input_streams (), _configured_in)); // no sidechain
470 ChanCount const in_streams = internal_input_streams ();
471 /* copy the first stream's audio buffer contents to the others */
473 uint32_t first_idx = in_map[0].get (DataType::AUDIO, 0, &valid);
475 for (uint32_t i = in_streams.n_audio(); i < natural_input_streams().n_audio(); ++i) {
476 uint32_t idx = in_map[0].get (DataType::AUDIO, i, &valid);
478 bufs.get_audio(idx).read_from(bufs.get_audio(first_idx), nframes, offset, offset);
485 bufs.set_count(ChanCount::max(bufs.count(), _configured_internal));
486 bufs.set_count(ChanCount::max(bufs.count(), _configured_out));
492 for (Controls::iterator li = controls().begin(); li != controls().end(); ++li, ++n) {
494 boost::shared_ptr<AutomationControl> c
495 = boost::dynamic_pointer_cast<AutomationControl>(li->second);
497 if (c->list() && c->automation_playback()) {
500 const float val = c->list()->rt_safe_eval (now, valid);
503 /* This is the ONLY place where we are
505 * AutomationControl::set_value_unchecked(). We
506 * know that the control is in
507 * automation playback mode, so no
508 * check on writable() is required
509 * (which must be done in AutomationControl::set_value()
512 c->set_value_unchecked(val);
519 /* Calculate if, and how many frames we need to collect for analysis */
520 framecnt_t collect_signal_nframes = (_signal_analysis_collect_nframes_max -
521 _signal_analysis_collected_nframes);
522 if (nframes < collect_signal_nframes) { // we might not get all frames now
523 collect_signal_nframes = nframes;
526 if (collect_signal_nframes > 0) {
528 //std::cerr << "collect input, bufs " << bufs.count().n_audio() << " count, " << bufs.available().n_audio() << " available" << std::endl;
529 //std::cerr << " streams " << internal_input_streams().n_audio() << std::endl;
530 //std::cerr << "filling buffer with " << collect_signal_nframes << " frames at " << _signal_analysis_collected_nframes << std::endl;
532 _signal_analysis_inputs.set_count(internal_input_streams());
534 for (uint32_t i = 0; i < internal_input_streams().n_audio(); ++i) {
535 _signal_analysis_inputs.get_audio(i).read_from(
537 collect_signal_nframes,
538 _signal_analysis_collected_nframes); // offset is for target buffer
543 if (is_channelstrip ()) {
544 if (_configured_in.n_audio() > 0) {
545 ChanMapping mb_in_map (ChanCount::min (_configured_in, ChanCount (DataType::AUDIO, 2)));
546 ChanMapping mb_out_map (ChanCount::min (_configured_out, ChanCount (DataType::AUDIO, 2)));
548 _plugins.front()->connect_and_run (bufs, mb_in_map, mb_out_map, nframes, offset);
550 for (uint32_t out = _configured_in.n_audio (); out < bufs.count().get (DataType::AUDIO); ++out) {
551 bufs.get (DataType::AUDIO, out).silence (nframes, offset);
557 BufferSet& inplace_bufs = _session.get_noinplace_buffers();
558 ARDOUR::ChanMapping used_outputs;
561 // TODO optimize this flow. prepare during configure_io()
562 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
564 ARDOUR::ChanMapping i_in_map (natural_input_streams());
565 ARDOUR::ChanMapping i_out_map;
566 ARDOUR::ChanCount mapped;
567 ARDOUR::ChanCount backmap;
569 // map inputs sequentially
570 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
571 for (uint32_t in = 0; in < natural_input_streams().get (*t); ++in) {
573 uint32_t in_idx = in_map[pc].get (*t, in, &valid);
574 uint32_t m = mapped.get (*t);
576 inplace_bufs.get (*t, m).read_from (bufs.get (*t, in_idx), nframes, offset, offset);
578 inplace_bufs.get (*t, m).silence (nframes, offset);
580 mapped.set (*t, m + 1);
584 // TODO use map_offset_to() instead ??
588 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
589 for (uint32_t out = 0; out < natural_output_streams().get (*t); ++out) {
590 uint32_t m = mapped.get (*t);
591 inplace_bufs.get (*t, m).silence (nframes, offset);
592 i_out_map.set (*t, out, m);
593 mapped.set (*t, m + 1);
597 if ((*i)->connect_and_run(inplace_bufs, i_in_map, i_out_map, nframes, offset)) {
602 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
603 for (uint32_t out = 0; out < natural_output_streams().get (*t); ++out) {
604 uint32_t m = backmap.get (*t);
606 uint32_t out_idx = out_map[pc].get (*t, out, &valid);
608 bufs.get (*t, out_idx).read_from (inplace_bufs.get (*t, m), nframes, offset, offset);
609 used_outputs.set (*t, out_idx, 1); // mark as used
611 backmap.set (*t, m + 1);
615 /* all instances have completed, now clear outputs that have not been written to.
616 * (except midi bypass)
618 if (has_midi_bypass ()) {
619 used_outputs.set (DataType::MIDI, 0, 1); // Midi bypass.
621 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
622 for (uint32_t out = 0; out < bufs.count().get (*t); ++out) {
624 used_outputs.get (*t, out, &valid);
625 if (valid) { continue; }
626 bufs.get (*t, out).silence (nframes, offset);
632 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
633 if ((*i)->connect_and_run(bufs, in_map[pc], out_map[pc], nframes, offset)) {
638 // TODO optimize: store "unconnected" in a fixed set.
639 // it only changes on reconfiguration.
640 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
641 for (uint32_t out = 0; out < bufs.count().get (*t); ++out) {
643 if (*t == DataType::MIDI && out == 0 && has_midi_bypass ()) {
644 mapped = true; // in-place Midi bypass
646 for (uint32_t pc = 0; pc < get_count() && !mapped; ++pc) {
647 for (uint32_t o = 0; o < natural_output_streams().get (*t); ++o) {
649 uint32_t idx = out_map[pc].get (*t, o, &valid);
650 if (valid && idx == out) {
657 bufs.get (*t, out).silence (nframes, offset);
663 if (collect_signal_nframes > 0) {
665 //std::cerr << " output, bufs " << bufs.count().n_audio() << " count, " << bufs.available().n_audio() << " available" << std::endl;
666 //std::cerr << " streams " << internal_output_streams().n_audio() << std::endl;
668 _signal_analysis_outputs.set_count(internal_output_streams());
670 for (uint32_t i = 0; i < internal_output_streams().n_audio(); ++i) {
671 _signal_analysis_outputs.get_audio(i).read_from(
673 collect_signal_nframes,
674 _signal_analysis_collected_nframes); // offset is for target buffer
677 _signal_analysis_collected_nframes += collect_signal_nframes;
678 assert(_signal_analysis_collected_nframes <= _signal_analysis_collect_nframes_max);
680 if (_signal_analysis_collected_nframes == _signal_analysis_collect_nframes_max) {
681 _signal_analysis_collect_nframes_max = 0;
682 _signal_analysis_collected_nframes = 0;
684 AnalysisDataGathered(&_signal_analysis_inputs,
685 &_signal_analysis_outputs);
691 PluginInsert::silence (framecnt_t nframes)
697 ChanMapping in_map (natural_input_streams ());
698 ChanMapping out_map (natural_output_streams ());
700 // TODO run sidechain (delaylines)
701 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
702 (*i)->connect_and_run (_session.get_scratch_buffers ((*i)->get_info()->n_inputs, true), in_map, out_map, nframes, 0);
707 PluginInsert::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool)
709 if (_pending_active) {
710 /* run as normal if we are active or moving from inactive to active */
713 // collect sidechain input for complete cycle (!)
714 // TODO we need delaylines here for latency compensation
715 _sidechain->run (bufs, start_frame, end_frame, nframes, true);
718 if (_session.transport_rolling() || _session.bounce_processing()) {
719 automation_run (bufs, start_frame, nframes);
721 connect_and_run (bufs, nframes, 0, false);
725 // TODO use mapping in bypassed mode ?!
726 // -> do we bypass the processor or the plugin
728 // TODO include sidechain??
730 uint32_t in = input_streams ().n_audio ();
731 uint32_t out = output_streams().n_audio ();
733 if (has_no_audio_inputs() || in == 0) {
735 /* silence all (audio) outputs. Should really declick
736 * at the transitions of "active"
739 for (uint32_t n = 0; n < out; ++n) {
740 bufs.get_audio (n).silence (nframes);
743 } else if (out > in) {
745 /* not active, but something has make up for any channel count increase
746 * for now , simply replicate last buffer
748 for (uint32_t n = in; n < out; ++n) {
749 bufs.get_audio(n).read_from(bufs.get_audio(in - 1), nframes);
753 bufs.count().set_audio (out);
756 _active = _pending_active;
758 /* we have no idea whether the plugin generated silence or not, so mark
759 * all buffers appropriately.
764 PluginInsert::automation_run (BufferSet& bufs, framepos_t start, pframes_t nframes)
766 Evoral::ControlEvent next_event (0, 0.0f);
767 framepos_t now = start;
768 framepos_t end = now + nframes;
769 framecnt_t offset = 0;
771 Glib::Threads::Mutex::Lock lm (control_lock(), Glib::Threads::TRY_LOCK);
774 connect_and_run (bufs, nframes, offset, false);
778 if (!find_next_event (now, end, next_event) || _plugins.front()->requires_fixed_sized_buffers()) {
780 /* no events have a time within the relevant range */
782 connect_and_run (bufs, nframes, offset, true, now);
788 framecnt_t cnt = min (((framecnt_t) ceil (next_event.when) - now), (framecnt_t) nframes);
790 connect_and_run (bufs, cnt, offset, true, now);
796 if (!find_next_event (now, end, next_event)) {
801 /* cleanup anything that is left to do */
804 connect_and_run (bufs, nframes, offset, true, now);
809 PluginInsert::default_parameter_value (const Evoral::Parameter& param)
811 if (param.type() != PluginAutomation)
814 if (_plugins.empty()) {
815 fatal << _("programming error: ") << X_("PluginInsert::default_parameter_value() called with no plugin")
817 abort(); /*NOTREACHED*/
820 return _plugins[0]->default_value (param.id());
825 PluginInsert::can_reset_all_parameters ()
829 for (uint32_t par = 0; par < _plugins[0]->parameter_count(); ++par) {
831 const uint32_t cid = _plugins[0]->nth_parameter (par, ok);
833 if (!ok || !_plugins[0]->parameter_is_input(cid)) {
837 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, cid));
843 if (ac->automation_state() & Play) {
848 return all && (params > 0);
852 PluginInsert::reset_parameters_to_default ()
856 for (uint32_t par = 0; par < _plugins[0]->parameter_count(); ++par) {
858 const uint32_t cid = _plugins[0]->nth_parameter (par, ok);
860 if (!ok || !_plugins[0]->parameter_is_input(cid)) {
864 const float dflt = _plugins[0]->default_value (cid);
865 const float curr = _plugins[0]->get_parameter (cid);
871 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, cid));
876 if (ac->automation_state() & Play) {
881 ac->set_value (dflt, Controllable::NoGroup);
886 boost::shared_ptr<Plugin>
887 PluginInsert::plugin_factory (boost::shared_ptr<Plugin> other)
889 boost::shared_ptr<LadspaPlugin> lp;
890 boost::shared_ptr<LuaProc> lua;
892 boost::shared_ptr<LV2Plugin> lv2p;
894 #ifdef WINDOWS_VST_SUPPORT
895 boost::shared_ptr<WindowsVSTPlugin> vp;
898 boost::shared_ptr<LXVSTPlugin> lxvp;
900 #ifdef AUDIOUNIT_SUPPORT
901 boost::shared_ptr<AUPlugin> ap;
904 if ((lp = boost::dynamic_pointer_cast<LadspaPlugin> (other)) != 0) {
905 return boost::shared_ptr<Plugin> (new LadspaPlugin (*lp));
906 } else if ((lua = boost::dynamic_pointer_cast<LuaProc> (other)) != 0) {
907 return boost::shared_ptr<Plugin> (new LuaProc (*lua));
909 } else if ((lv2p = boost::dynamic_pointer_cast<LV2Plugin> (other)) != 0) {
910 return boost::shared_ptr<Plugin> (new LV2Plugin (*lv2p));
912 #ifdef WINDOWS_VST_SUPPORT
913 } else if ((vp = boost::dynamic_pointer_cast<WindowsVSTPlugin> (other)) != 0) {
914 return boost::shared_ptr<Plugin> (new WindowsVSTPlugin (*vp));
917 } else if ((lxvp = boost::dynamic_pointer_cast<LXVSTPlugin> (other)) != 0) {
918 return boost::shared_ptr<Plugin> (new LXVSTPlugin (*lxvp));
920 #ifdef AUDIOUNIT_SUPPORT
921 } else if ((ap = boost::dynamic_pointer_cast<AUPlugin> (other)) != 0) {
922 return boost::shared_ptr<Plugin> (new AUPlugin (*ap));
926 fatal << string_compose (_("programming error: %1"),
927 X_("unknown plugin type in PluginInsert::plugin_factory"))
929 abort(); /*NOTREACHED*/
930 return boost::shared_ptr<Plugin> ((Plugin*) 0);
934 PluginInsert::set_input_map (uint32_t num, ChanMapping m) {
935 if (num < _in_map.size()) {
936 bool changed = _in_map[num] != m;
940 PluginMapChanged (); /* EMIT SIGNAL */
946 PluginInsert::set_output_map (uint32_t num, ChanMapping m) {
947 if (num < _out_map.size()) {
948 bool changed = _out_map[num] != m;
952 PluginMapChanged (); /* EMIT SIGNAL */
958 PluginInsert::input_map () const
962 for (PinMappings::const_iterator i = _in_map.begin (); i != _in_map.end (); ++i, ++pc) {
963 ChanMapping m (i->second);
964 const ChanMapping::Mappings& mp ((*i).second.mappings());
965 for (ChanMapping::Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
966 for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
967 rv.set (tm->first, i->first + pc * natural_input_streams().get(tm->first), i->second);
975 PluginInsert::output_map () const
979 for (PinMappings::const_iterator i = _out_map.begin (); i != _out_map.end (); ++i, ++pc) {
980 ChanMapping m (i->second);
981 const ChanMapping::Mappings& mp ((*i).second.mappings());
982 for (ChanMapping::Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
983 for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
984 rv.set (tm->first, i->first + pc * natural_output_streams().get(tm->first), i->second);
988 if (has_midi_bypass ()) {
989 rv.set (DataType::MIDI, 0, 0);
996 PluginInsert::has_midi_bypass () const
998 if (_configured_in.n_midi () == 1 && _configured_out.n_midi () == 1
999 && natural_output_streams ().n_midi () == 0) {
1006 PluginInsert::has_midi_thru () const
1008 if (_configured_in.n_midi () == 1 && _configured_out.n_midi () == 1
1009 && natural_input_streams ().n_midi () == 0 && natural_output_streams ().n_midi () == 0) {
1017 PluginInsert::is_channelstrip () const {
1018 return _plugins.front()->is_channelstrip();
1023 PluginInsert::sanitize_maps ()
1025 bool changed = false;
1026 /* strip dead wood */
1027 PinMappings new_ins;
1028 PinMappings new_outs;
1029 for (uint32_t pc = 0; pc < get_count(); ++pc) {
1031 ChanMapping new_out;
1032 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1033 for (uint32_t i = 0; i < natural_input_streams().get (*t); ++i) {
1035 uint32_t idx = _in_map[pc].get (*t, i, &valid);
1036 if (valid && idx < _configured_internal.get (*t)) {
1037 new_in.set (*t, i, idx);
1040 for (uint32_t o = 0; o < natural_output_streams().get (*t); ++o) {
1042 uint32_t idx = _out_map[pc].get (*t, o, &valid);
1043 if (valid && idx < _configured_out.get (*t)) {
1044 new_out.set (*t, o, idx);
1048 if (_in_map[pc] != new_in || _out_map[pc] != new_out) {
1051 new_ins[pc] = new_in;
1052 new_outs[pc] = new_out;
1054 /* prevent dup output assignments */
1055 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1056 for (uint32_t o = 0; o < _configured_out.get (*t); ++o) {
1057 bool mapped = false;
1058 for (uint32_t pc = 0; pc < get_count(); ++pc) {
1060 uint32_t idx = new_outs[pc].get_src (*t, o, &valid);
1061 if (valid && mapped) {
1062 new_outs[pc].unset (*t, idx);
1070 if (_in_map != new_ins || _out_map != new_outs) {
1074 _out_map = new_outs;
1080 PluginInsert::reset_map (bool emit)
1083 const PinMappings old_in (_in_map);
1084 const PinMappings old_out (_out_map);
1088 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
1089 ChanCount ns_inputs = natural_input_streams() - sidechain_input_pins ();
1090 if (_match.method == Split) {
1091 _in_map[pc] = ChanMapping ();
1092 /* connect no sidechain sinks in round-robin fashion */
1093 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1094 const uint32_t cend = _configured_in.get (*t);
1095 if (cend == 0) { continue; }
1097 for (uint32_t in = 0; in < ns_inputs.get (*t); ++in) {
1098 _in_map[pc].set (*t, in, c);
1103 _in_map[pc] = ChanMapping (ChanCount::min (ns_inputs, _configured_in));
1105 _out_map[pc] = ChanMapping (ChanCount::min (natural_output_streams(), _configured_out));
1107 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1108 const uint32_t nis = natural_input_streams ().get(*t);
1109 const uint32_t stride = nis - sidechain_input_pins().get (*t);
1110 _in_map[pc].offset_to(*t, stride * pc);
1111 _out_map[pc].offset_to(*t, pc * natural_output_streams().get(*t));
1113 // connect side-chains
1114 const uint32_t sc_start = _configured_in.get (*t);
1115 const uint32_t sc_len = _configured_internal.get (*t) - sc_start;
1116 if (sc_len == 0) { continue; }
1118 for (uint32_t in = ns_inputs.get (*t); in < nis; ++in) {
1119 _in_map[pc].set (*t, in, sc_start + c);
1120 c = (c + 1) % sc_len;
1125 if (old_in == _in_map && old_out == _out_map) {
1129 PluginMapChanged (); /* EMIT SIGNAL */
1135 PluginInsert::configure_io (ChanCount in, ChanCount out)
1137 Match old_match = _match;
1139 ChanCount old_internal;
1143 old_in = _configured_in;
1144 old_internal = _configured_internal;
1145 old_out = _configured_out;
1148 _configured_in = in;
1149 _configured_internal = in;
1150 _configured_out = out;
1153 /* TODO hide midi-bypass, and custom outs. Best /fake/ "out" here.
1154 * (currently _sidechain->configure_io always succeeds
1155 * since Processor::configure_io() succeeds)
1157 if (!_sidechain->configure_io (in, out)) {
1158 DEBUG_TRACE (DEBUG::ChanMapping, "Sidechain configuration failed\n");
1161 _configured_internal += _sidechain->input()->n_ports();
1164 /* get plugin configuration */
1165 _match = private_can_support_io_configuration (in, out);
1167 if (DEBUG_ENABLED(DEBUG::ChanMapping)) {
1169 DEBUG_STR_APPEND(a, string_compose ("Match '%1': ", name()));
1170 DEBUG_STR_APPEND(a, _match);
1171 DEBUG_TRACE (DEBUG::ChanMapping, DEBUG_STR(a).str());
1175 /* set the matching method and number of plugins that we will use to meet this configuration */
1176 if (set_count (_match.plugins) == false) {
1177 PluginIoReConfigure (); /* EMIT SIGNAL */
1178 _configured = false;
1182 /* configure plugins */
1183 switch (_match.method) {
1186 if (_plugins.front()->configure_io (natural_input_streams(), out) == false) {
1187 PluginIoReConfigure (); /* EMIT SIGNAL */
1188 _configured = false;
1196 bool const r = _plugins.front()->can_support_io_configuration (in, dout, &useins);
1198 assert (_match.strict_io || dout.n_audio() == out.n_audio()); // sans midi bypass
1199 if (useins.n_audio() == 0) {
1202 if (_plugins.front()->configure_io (useins, dout) == false) {
1203 PluginIoReConfigure (); /* EMIT SIGNAL */
1204 _configured = false;
1210 if (_plugins.front()->configure_io (in, out) == false) {
1211 PluginIoReConfigure (); /* EMIT SIGNAL */
1212 _configured = false;
1218 bool mapping_changed = false;
1219 if (old_in == in && old_out == out
1221 && old_match.method == _match.method
1222 && _in_map.size() == _out_map.size()
1223 && _in_map.size() == get_count ()
1225 /* If the configuration has not changed, keep the mapping */
1226 if (old_internal != _configured_internal) {
1227 mapping_changed = sanitize_maps ();
1229 } else if (_match.custom_cfg && _configured) {
1230 mapping_changed = sanitize_maps ();
1232 if (_maps_from_state) {
1233 _maps_from_state = false;
1234 mapping_changed = true;
1237 /* generate a new mapping */
1238 mapping_changed = reset_map (false);
1242 if (mapping_changed) {
1243 PluginMapChanged (); /* EMIT SIGNAL */
1246 if (DEBUG_ENABLED(DEBUG::ChanMapping)) {
1249 DEBUG_STR_APPEND(a, "\n--------<<--------\n");
1250 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
1252 DEBUG_STR_APPEND(a, "----><----\n");
1254 DEBUG_STR_APPEND(a, string_compose ("Channel Map for %1 plugin %2\n", name(), pc));
1255 DEBUG_STR_APPEND(a, " * Inputs:\n");
1256 DEBUG_STR_APPEND(a, _in_map[pc]);
1257 DEBUG_STR_APPEND(a, " * Outputs:\n");
1258 DEBUG_STR_APPEND(a, _out_map[pc]);
1260 DEBUG_STR_APPEND(a, "-------->>--------\n");
1261 DEBUG_TRACE (DEBUG::ChanMapping, DEBUG_STR(a).str());
1266 // auto-detect if inplace processing is possible
1267 bool inplace_ok = true;
1268 for (uint32_t pc = 0; pc < get_count() && inplace_ok ; ++pc) {
1269 if (!_in_map[pc].is_monotonic ()) {
1272 if (!_out_map[pc].is_monotonic ()) {
1276 _no_inplace = !inplace_ok || _plugins.front()->inplace_broken ();
1278 if (old_in != in || old_out != out || old_internal != _configured_internal
1279 || (old_match.method != _match.method && (old_match.method == Split || _match.method == Split))
1281 PluginIoReConfigure (); /* EMIT SIGNAL */
1284 // we don't know the analysis window size, so we must work with the
1285 // current buffer size here. each request for data fills in these
1286 // buffers and the analyser makes sure it gets enough data for the
1288 session().ensure_buffer_set (_signal_analysis_inputs, in);
1289 //_signal_analysis_inputs.set_count (in);
1291 session().ensure_buffer_set (_signal_analysis_outputs, out);
1292 //_signal_analysis_outputs.set_count (out);
1294 // std::cerr << "set counts to i" << in.n_audio() << "/o" << out.n_audio() << std::endl;
1297 return Processor::configure_io (in, out);
1300 /** Decide whether this PluginInsert can support a given IO configuration.
1301 * To do this, we run through a set of possible solutions in rough order of
1304 * @param in Required input channel count.
1305 * @param out Filled in with the output channel count if we return true.
1306 * @return true if the given IO configuration can be supported.
1309 PluginInsert::can_support_io_configuration (const ChanCount& in, ChanCount& out)
1312 _sidechain->can_support_io_configuration (in, out); // never fails, sets "out"
1314 return private_can_support_io_configuration (in, out).method != Impossible;
1317 /** A private version of can_support_io_configuration which returns the method
1318 * by which the configuration can be matched, rather than just whether or not
1322 PluginInsert::private_can_support_io_configuration (ChanCount const & inx, ChanCount& out) const
1324 if (_plugins.empty()) {
1328 /* if a user specified a custom cfg, so be it. */
1331 return Match (ExactMatch, get_count(), _strict_io, true); // XXX
1334 /* try automatic configuration */
1335 Match m = PluginInsert::automatic_can_support_io_configuration (inx, out);
1337 PluginInfoPtr info = _plugins.front()->get_info();
1338 ChanCount inputs = info->n_inputs;
1339 ChanCount outputs = info->n_outputs;
1341 /* handle case strict-i/o */
1342 if (_strict_io && m.method != Impossible) {
1345 /* special case MIDI instruments */
1346 if (is_midi_instrument()) {
1347 // output = midi-bypass + at most master-out channels.
1348 ChanCount max_out (DataType::AUDIO, 2); // TODO use master-out
1349 max_out.set (DataType::MIDI, out.get(DataType::MIDI));
1350 out = ChanCount::min (out, max_out);
1351 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("special case strict-i/o instrument: %1\n", name()));
1357 if (inx.n_audio () != out.n_audio ()) { // ignore midi bypass
1358 /* replicate processor to match output count (generators and such)
1359 * at least enough to feed every output port. */
1360 uint32_t f = 1; // at least one. e.g. control data filters, no in, no out.
1361 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1362 uint32_t nout = outputs.get (*t);
1363 if (nout == 0 || inx.get(*t) == 0) { continue; }
1364 f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nout));
1367 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("special case strict-i/o generator: %1\n", name()));
1368 return Match (Replicate, f, _strict_io);
1379 if (m.method != Impossible) {
1384 if (is_channelstrip ()) {
1385 return Match (Replicate, 1, _strict_io);
1389 ChanCount ns_inputs = inputs - sidechain_input_pins ();
1391 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("resolving 'Impossible' match for %1\n", name()));
1393 if (info->reconfigurable_io()) {
1395 // TODO add sidechains here
1396 bool const r = _plugins.front()->can_support_io_configuration (inx, out, &useins);
1398 // houston, we have a problem.
1399 return Match (Impossible, 0);
1401 return Match (Delegate, 1, _strict_io);
1404 ChanCount midi_bypass;
1405 if (inx.get(DataType::MIDI) == 1 && outputs.get(DataType::MIDI) == 0) {
1406 midi_bypass.set (DataType::MIDI, 1);
1409 // add at least as many plugins so that output count matches input count (w/o sidechain pins)
1411 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1412 uint32_t nin = ns_inputs.get (*t);
1413 uint32_t nout = outputs.get (*t);
1414 if (nin == 0 || inx.get(*t) == 0) { continue; }
1415 // prefer floor() so the count won't overly increase IFF (nin < nout)
1416 f = max (f, (uint32_t) floor (inx.get(*t) / (float)nout));
1418 if (f > 0 && outputs * f >= _configured_out) {
1419 out = outputs * f + midi_bypass;
1420 return Match (Replicate, f, _strict_io);
1423 // add at least as many plugins needed to connect all inputs (w/o sidechain pins)
1425 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1426 uint32_t nin = ns_inputs.get (*t);
1427 if (nin == 0 || inx.get(*t) == 0) { continue; }
1428 f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nin));
1431 out = outputs * f + midi_bypass;
1432 return Match (Replicate, f, _strict_io);
1435 // add at least as many plugins needed to connect all inputs
1437 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1438 uint32_t nin = inputs.get (*t);
1439 if (nin == 0 || inx.get(*t) == 0) { continue; }
1440 f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nin));
1442 out = outputs * f + midi_bypass;
1443 return Match (Replicate, f, _strict_io);
1446 /* this is the original Ardour 3/4 behavior, mainly for backwards compatibility */
1448 PluginInsert::automatic_can_support_io_configuration (ChanCount const & inx, ChanCount& out) const
1450 if (_plugins.empty()) {
1454 PluginInfoPtr info = _plugins.front()->get_info();
1455 ChanCount in; in += inx;
1456 ChanCount midi_bypass;
1458 if (info->reconfigurable_io()) {
1459 /* Plugin has flexible I/O, so delegate to it */
1460 bool const r = _plugins.front()->can_support_io_configuration (in, out);
1462 return Match (Impossible, 0);
1464 return Match (Delegate, 1);
1467 ChanCount inputs = info->n_inputs;
1468 ChanCount outputs = info->n_outputs;
1469 ChanCount ns_inputs = inputs - sidechain_input_pins ();
1471 if (in.get(DataType::MIDI) == 1 && outputs.get(DataType::MIDI) == 0) {
1472 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("bypassing midi-data around %1\n", name()));
1473 midi_bypass.set (DataType::MIDI, 1);
1475 if (in.get(DataType::MIDI) == 1 && inputs.get(DataType::MIDI) == 0) {
1476 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("hiding midi-port from plugin %1\n", name()));
1477 in.set(DataType::MIDI, 0);
1480 // add internally provided sidechain ports
1481 ChanCount insc = in + sidechain_input_ports ();
1483 bool no_inputs = true;
1484 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1485 if (inputs.get (*t) != 0) {
1492 /* no inputs so we can take any input configuration since we throw it away */
1493 out = outputs + midi_bypass;
1494 return Match (NoInputs, 1);
1497 /* Plugin inputs match requested inputs + side-chain-ports exactly */
1498 if (inputs == insc) {
1499 out = outputs + midi_bypass;
1500 return Match (ExactMatch, 1);
1503 /* Plugin inputs matches without side-chain-pins */
1504 if (ns_inputs == in) {
1505 out = outputs + midi_bypass;
1506 return Match (ExactMatch, 1);
1509 /* We may be able to run more than one copy of the plugin within this insert
1510 to cope with the insert having more inputs than the plugin.
1511 We allow replication only for plugins with either zero or 1 inputs and outputs
1512 for every valid data type.
1516 bool can_replicate = true;
1518 if (is_channelstrip ()) {
1519 can_replicate = false;
1522 for (DataType::iterator t = DataType::begin(); t != DataType::end() && can_replicate; ++t) {
1524 // ignore side-chains
1525 uint32_t nin = ns_inputs.get (*t);
1527 // No inputs of this type
1528 if (nin == 0 && in.get(*t) == 0) {
1532 if (nin != 1 || outputs.get (*t) != 1) {
1533 can_replicate = false;
1537 // Potential factor not set yet
1539 f = in.get(*t) / nin;
1542 // Factor for this type does not match another type, can not replicate
1543 if (f != (in.get(*t) / nin)) {
1544 can_replicate = false;
1549 if (can_replicate && f > 0) {
1550 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1551 out.set (*t, outputs.get(*t) * f);
1554 return Match (Replicate, f);
1557 /* If the processor has exactly one input of a given type, and
1558 the plugin has more, we can feed the single processor input
1559 to some or all of the plugin inputs. This is rather
1560 special-case-y, but the 1-to-many case is by far the
1561 simplest. How do I split thy 2 processor inputs to 3
1562 plugin inputs? Let me count the ways ...
1565 bool can_split = true;
1566 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1568 bool const can_split_type = (in.get (*t) == 1 && ns_inputs.get (*t) > 1);
1569 bool const nothing_to_do_for_type = (in.get (*t) == 0 && inputs.get (*t) == 0);
1571 if (!can_split_type && !nothing_to_do_for_type) {
1577 out = outputs + midi_bypass;
1578 return Match (Split, 1);
1581 /* If the plugin has more inputs than we want, we can `hide' some of them
1582 by feeding them silence.
1585 bool could_hide = false;
1586 bool cannot_hide = false;
1587 ChanCount hide_channels;
1589 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1590 if (inputs.get(*t) > in.get(*t)) {
1591 /* there is potential to hide, since the plugin has more inputs of type t than the insert */
1592 hide_channels.set (*t, inputs.get(*t) - in.get(*t));
1594 } else if (inputs.get(*t) < in.get(*t)) {
1595 /* we definitely cannot hide, since the plugin has fewer inputs of type t than the insert */
1600 if (could_hide && !cannot_hide) {
1601 out = outputs + midi_bypass;
1602 return Match (Hide, 1, false, false, hide_channels);
1605 return Match (Impossible, 0);
1610 PluginInsert::get_state ()
1612 return state (true);
1616 PluginInsert::state (bool full)
1618 XMLNode& node = Processor::state (full);
1620 node.add_property("type", _plugins[0]->state_node_name());
1621 node.add_property("unique-id", _plugins[0]->unique_id());
1622 node.add_property("count", string_compose("%1", _plugins.size()));
1624 /* remember actual i/o configuration (for later placeholder
1625 * in case the plugin goes missing) */
1626 node.add_child_nocopy (* _configured_in.state (X_("ConfiguredInput")));
1627 node.add_child_nocopy (* _configured_out.state (X_("ConfiguredOutput")));
1629 /* save custom i/o config */
1630 node.add_property("custom", _custom_cfg ? "yes" : "no");
1631 for (uint32_t pc = 0; pc < get_count(); ++pc) {
1633 snprintf (tmp, sizeof(tmp), "InputMap-%d", pc);
1634 node.add_child_nocopy (* _in_map[pc].state (tmp));
1635 snprintf (tmp, sizeof(tmp), "OutputMap-%d", pc);
1636 node.add_child_nocopy (* _out_map[pc].state (tmp));
1640 node.add_child_nocopy (_sidechain->state (full));
1643 _plugins[0]->set_insert_id(this->id());
1644 node.add_child_nocopy (_plugins[0]->get_state());
1646 for (Controls::iterator c = controls().begin(); c != controls().end(); ++c) {
1647 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> ((*c).second);
1649 node.add_child_nocopy (ac->get_state());
1657 PluginInsert::set_control_ids (const XMLNode& node, int version)
1659 const XMLNodeList& nlist = node.children();
1660 XMLNodeConstIterator iter;
1661 set<Evoral::Parameter>::const_iterator p;
1663 for (iter = nlist.begin(); iter != nlist.end(); ++iter) {
1664 if ((*iter)->name() == Controllable::xml_node_name) {
1665 const XMLProperty* prop;
1667 uint32_t p = (uint32_t)-1;
1669 if ((prop = (*iter)->property (X_("symbol"))) != 0) {
1670 boost::shared_ptr<LV2Plugin> lv2plugin = boost::dynamic_pointer_cast<LV2Plugin> (_plugins[0]);
1672 p = lv2plugin->port_index(prop->value().c_str());
1676 if (p == (uint32_t)-1 && (prop = (*iter)->property (X_("parameter"))) != 0) {
1677 p = atoi (prop->value());
1680 if (p != (uint32_t)-1) {
1682 /* this may create the new controllable */
1684 boost::shared_ptr<Evoral::Control> c = control (Evoral::Parameter (PluginAutomation, 0, p));
1686 #ifndef NO_PLUGIN_STATE
1690 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> (c);
1692 ac->set_state (**iter, version);
1701 PluginInsert::set_state(const XMLNode& node, int version)
1703 XMLNodeList nlist = node.children();
1704 XMLNodeIterator niter;
1705 XMLPropertyList plist;
1706 const XMLProperty *prop;
1707 ARDOUR::PluginType type;
1709 if ((prop = node.property ("type")) == 0) {
1710 error << _("XML node describing plugin is missing the `type' field") << endmsg;
1714 if (prop->value() == X_("ladspa") || prop->value() == X_("Ladspa")) { /* handle old school sessions */
1715 type = ARDOUR::LADSPA;
1716 } else if (prop->value() == X_("lv2")) {
1718 } else if (prop->value() == X_("windows-vst")) {
1719 type = ARDOUR::Windows_VST;
1720 } else if (prop->value() == X_("lxvst")) {
1721 type = ARDOUR::LXVST;
1722 } else if (prop->value() == X_("audiounit")) {
1723 type = ARDOUR::AudioUnit;
1724 } else if (prop->value() == X_("luaproc")) {
1727 error << string_compose (_("unknown plugin type %1 in plugin insert state"),
1733 prop = node.property ("unique-id");
1736 #ifdef WINDOWS_VST_SUPPORT
1737 /* older sessions contain VST plugins with only an "id" field.
1740 if (type == ARDOUR::Windows_VST) {
1741 prop = node.property ("id");
1745 #ifdef LXVST_SUPPORT
1746 /*There shouldn't be any older sessions with linuxVST support.. but anyway..*/
1748 if (type == ARDOUR::LXVST) {
1749 prop = node.property ("id");
1755 error << _("Plugin has no unique ID field") << endmsg;
1760 boost::shared_ptr<Plugin> plugin = find_plugin (_session, prop->value(), type);
1762 /* treat linux and windows VST plugins equivalent if they have the same uniqueID
1763 * allow to move sessions windows <> linux */
1764 #ifdef LXVST_SUPPORT
1765 if (plugin == 0 && type == ARDOUR::Windows_VST) {
1766 type = ARDOUR::LXVST;
1767 plugin = find_plugin (_session, prop->value(), type);
1771 #ifdef WINDOWS_VST_SUPPORT
1772 if (plugin == 0 && type == ARDOUR::LXVST) {
1773 type = ARDOUR::Windows_VST;
1774 plugin = find_plugin (_session, prop->value(), type);
1779 error << string_compose(
1780 _("Found a reference to a plugin (\"%1\") that is unknown.\n"
1781 "Perhaps it was removed or moved since it was last used."),
1787 if (type == ARDOUR::Lua) {
1788 XMLNode *ls = node.child (plugin->state_node_name().c_str());
1789 // we need to load the script to set the name and parameters.
1790 boost::shared_ptr<LuaProc> lp = boost::dynamic_pointer_cast<LuaProc>(plugin);
1792 lp->set_script_from_state (*ls);
1796 // The name of the PluginInsert comes from the plugin, nothing else
1797 _name = plugin->get_info()->name;
1801 // Processor::set_state() will set this, but too late
1802 // for it to be available when setting up plugin
1803 // state. We can't call Processor::set_state() until
1804 // the plugins themselves are created and added.
1808 if (_plugins.empty()) {
1809 /* if we are adding the first plugin, we will need to set
1810 up automatable controls.
1812 add_plugin (plugin);
1813 create_automatable_parameters ();
1814 set_control_ids (node, version);
1817 if ((prop = node.property ("count")) != 0) {
1818 sscanf (prop->value().c_str(), "%u", &count);
1821 if (_plugins.size() != count) {
1822 for (uint32_t n = 1; n < count; ++n) {
1823 add_plugin (plugin_factory (plugin));
1827 Processor::set_state (node, version);
1829 PBD::ID new_id = this->id();
1830 PBD::ID old_id = this->id();
1832 if ((prop = node.property ("id")) != 0) {
1833 old_id = prop->value ();
1836 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1838 /* find the node with the type-specific node name ("lv2", "ladspa", etc)
1839 and set all plugins to the same state.
1842 if ((*niter)->name() == plugin->state_node_name()) {
1844 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1845 /* Plugin state can include external files which are named after the ID.
1847 * If regenerate_xml_or_string_ids() is set, the ID will already have
1848 * been changed, so we need to use the old ID from the XML to load the
1849 * state and then update the ID.
1851 * When copying a plugin-state, route_ui takes care of of updating the ID,
1852 * but we need to call set_insert_id() to clear the cached plugin-state
1853 * and force a change.
1855 if (!regenerate_xml_or_string_ids ()) {
1856 (*i)->set_insert_id (new_id);
1858 (*i)->set_insert_id (old_id);
1861 (*i)->set_state (**niter, version);
1863 if (regenerate_xml_or_string_ids ()) {
1864 (*i)->set_insert_id (new_id);
1872 if (version < 3000) {
1874 /* Only 2.X sessions need a call to set_parameter_state() - in 3.X and above
1875 this is all handled by Automatable
1878 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1879 if ((*niter)->name() == "Redirect") {
1880 /* XXX do we need to tackle placement? i think not (pd; oct 16 2009) */
1881 Processor::set_state (**niter, version);
1886 set_parameter_state_2X (node, version);
1889 if ((prop = node.property (X_("custom"))) != 0) {
1890 _custom_cfg = string_is_affirmative (prop->value());
1893 // TODO load/add sidechain
1895 uint32_t in_maps = 0;
1896 uint32_t out_maps = 0;
1897 XMLNodeList kids = node.children ();
1898 for (XMLNodeIterator i = kids.begin(); i != kids.end(); ++i) {
1899 if ((*i)->name() == X_("ConfiguredOutput")) {
1900 _custom_out = ChanCount(**i);
1902 if (strncmp ((*i)->name ().c_str(), X_("InputMap-"), 9) == 0) {
1903 long pc = atol (&((*i)->name().c_str()[9]));
1904 if (pc >=0 && pc <= get_count()) {
1905 _in_map[pc] = ChanMapping (**i);
1909 if (strncmp ((*i)->name ().c_str(), X_("OutputMap-"), 10) == 0) {
1910 long pc = atol (&((*i)->name().c_str()[10]));
1911 if (pc >=0 && pc <= get_count()) {
1912 _out_map[pc] = ChanMapping (**i);
1916 if ((*i)->name () == Processor::state_node_name) {
1920 _sidechain->set_state (**i, version);
1924 if (in_maps == out_maps && out_maps >0 && out_maps == get_count()) {
1925 _maps_from_state = true;
1928 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1932 (*i)->deactivate ();
1940 PluginInsert::update_id (PBD::ID id)
1943 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1944 (*i)->set_insert_id (id);
1949 PluginInsert::set_state_dir (const std::string& d)
1951 // state() only saves the state of the first plugin
1952 _plugins[0]->set_state_dir (d);
1956 PluginInsert::set_parameter_state_2X (const XMLNode& node, int version)
1958 XMLNodeList nlist = node.children();
1959 XMLNodeIterator niter;
1961 /* look for port automation node */
1963 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1965 if ((*niter)->name() != port_automation_node_name) {
1971 XMLNodeConstIterator iter;
1976 cnodes = (*niter)->children ("port");
1978 for (iter = cnodes.begin(); iter != cnodes.end(); ++iter){
1982 if ((cprop = child->property("number")) != 0) {
1983 port = cprop->value().c_str();
1985 warning << _("PluginInsert: Auto: no ladspa port number") << endmsg;
1989 sscanf (port, "%" PRIu32, &port_id);
1991 if (port_id >= _plugins[0]->parameter_count()) {
1992 warning << _("PluginInsert: Auto: port id out of range") << endmsg;
1996 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(
1997 control(Evoral::Parameter(PluginAutomation, 0, port_id), true));
1999 if (c && c->alist()) {
2000 if (!child->children().empty()) {
2001 c->alist()->set_state (*child->children().front(), version);
2003 /* In some cases 2.X saves lists with min_yval and max_yval
2004 being FLT_MIN and FLT_MAX respectively. This causes problems
2005 in A3 because these min/max values are used to compute
2006 where GUI control points should be drawn. If we see such
2007 values, `correct' them to the min/max of the appropriate
2011 float min_y = c->alist()->get_min_y ();
2012 float max_y = c->alist()->get_max_y ();
2014 ParameterDescriptor desc;
2015 _plugins.front()->get_parameter_descriptor (port_id, desc);
2017 if (min_y == FLT_MIN) {
2021 if (max_y == FLT_MAX) {
2025 c->alist()->set_yrange (min_y, max_y);
2028 error << string_compose (_("PluginInsert: automatable control %1 not found - ignored"), port_id) << endmsg;
2040 PluginInsert::describe_parameter (Evoral::Parameter param)
2042 if (param.type() == PluginAutomation) {
2043 return _plugins[0]->describe_parameter (param);
2044 } else if (param.type() == PluginPropertyAutomation) {
2045 boost::shared_ptr<AutomationControl> c(automation_control(param));
2046 if (c && !c->desc().label.empty()) {
2047 return c->desc().label;
2050 return Automatable::describe_parameter(param);
2054 PluginInsert::signal_latency() const
2056 if (_user_latency) {
2057 return _user_latency;
2060 return _plugins[0]->signal_latency ();
2064 PluginInsert::type ()
2066 return plugin()->get_info()->type;
2069 PluginInsert::PluginControl::PluginControl (PluginInsert* p,
2070 const Evoral::Parameter& param,
2071 const ParameterDescriptor& desc,
2072 boost::shared_ptr<AutomationList> list)
2073 : AutomationControl (p->session(), param, desc, list, p->describe_parameter(param))
2077 alist()->reset_default (desc.normal);
2079 list->set_interpolation(Evoral::ControlList::Discrete);
2084 set_flags(Controllable::Toggle);
2088 /** @param val `user' value */
2090 PluginInsert::PluginControl::set_value (double user_val, PBD::Controllable::GroupControlDisposition group_override)
2093 _set_value (user_val, group_override);
2097 PluginInsert::PluginControl::set_value_unchecked (double user_val)
2099 /* used only by automation playback */
2100 _set_value (user_val, Controllable::NoGroup);
2104 PluginInsert::PluginControl::_set_value (double user_val, PBD::Controllable::GroupControlDisposition group_override)
2106 /* FIXME: probably should be taking out some lock here.. */
2108 for (Plugins::iterator i = _plugin->_plugins.begin(); i != _plugin->_plugins.end(); ++i) {
2109 (*i)->set_parameter (_list->parameter().id(), user_val);
2112 boost::shared_ptr<Plugin> iasp = _plugin->_impulseAnalysisPlugin.lock();
2114 iasp->set_parameter (_list->parameter().id(), user_val);
2117 AutomationControl::set_value (user_val, group_override);
2121 PluginInsert::PluginControl::catch_up_with_external_value (double user_val)
2123 AutomationControl::set_value (user_val, Controllable::NoGroup);
2127 PluginInsert::PluginControl::get_state ()
2131 XMLNode& node (AutomationControl::get_state());
2132 ss << parameter().id();
2133 node.add_property (X_("parameter"), ss.str());
2135 boost::shared_ptr<LV2Plugin> lv2plugin = boost::dynamic_pointer_cast<LV2Plugin> (_plugin->_plugins[0]);
2137 node.add_property (X_("symbol"), lv2plugin->port_symbol (parameter().id()));
2144 /** @return `user' val */
2146 PluginInsert::PluginControl::get_value () const
2148 boost::shared_ptr<Plugin> plugin = _plugin->plugin (0);
2154 return plugin->get_parameter (_list->parameter().id());
2157 PluginInsert::PluginPropertyControl::PluginPropertyControl (PluginInsert* p,
2158 const Evoral::Parameter& param,
2159 const ParameterDescriptor& desc,
2160 boost::shared_ptr<AutomationList> list)
2161 : AutomationControl (p->session(), param, desc, list)
2165 alist()->set_yrange (desc.lower, desc.upper);
2166 alist()->reset_default (desc.normal);
2170 set_flags(Controllable::Toggle);
2175 PluginInsert::PluginPropertyControl::set_value (double user_val, PBD::Controllable::GroupControlDisposition /* group_override*/)
2178 set_value_unchecked (user_val);
2183 PluginInsert::PluginPropertyControl::set_value_unchecked (double user_val)
2185 /* Old numeric set_value(), coerce to appropriate datatype if possible.
2186 This is lossy, but better than nothing until Ardour's automation system
2187 can handle various datatypes all the way down. */
2188 const Variant value(_desc.datatype, user_val);
2189 if (value.type() == Variant::NOTHING) {
2190 error << "set_value(double) called for non-numeric property" << endmsg;
2194 for (Plugins::iterator i = _plugin->_plugins.begin(); i != _plugin->_plugins.end(); ++i) {
2195 (*i)->set_property(_list->parameter().id(), value);
2199 AutomationControl::set_value (user_val, Controllable::NoGroup);
2203 PluginInsert::PluginPropertyControl::get_state ()
2207 XMLNode& node (AutomationControl::get_state());
2208 ss << parameter().id();
2209 node.add_property (X_("property"), ss.str());
2210 node.remove_property (X_("value"));
2216 PluginInsert::PluginPropertyControl::get_value () const
2218 return _value.to_double();
2221 boost::shared_ptr<Plugin>
2222 PluginInsert::get_impulse_analysis_plugin()
2224 boost::shared_ptr<Plugin> ret;
2225 if (_impulseAnalysisPlugin.expired()) {
2226 ret = plugin_factory(_plugins[0]);
2227 ret->configure_io (internal_input_streams (), internal_output_streams ());
2228 _impulseAnalysisPlugin = ret;
2230 ret = _impulseAnalysisPlugin.lock();
2237 PluginInsert::collect_signal_for_analysis (framecnt_t nframes)
2239 // called from outside the audio thread, so this should be safe
2240 // only do audio as analysis is (currently) only for audio plugins
2241 _signal_analysis_inputs.ensure_buffers( DataType::AUDIO, internal_input_streams().n_audio(), nframes);
2242 _signal_analysis_outputs.ensure_buffers( DataType::AUDIO, internal_output_streams().n_audio(), nframes);
2244 _signal_analysis_collected_nframes = 0;
2245 _signal_analysis_collect_nframes_max = nframes;
2248 /** Add a plugin to our list */
2250 PluginInsert::add_plugin (boost::shared_ptr<Plugin> plugin)
2252 plugin->set_insert_id (this->id());
2254 if (_plugins.empty()) {
2255 /* first (and probably only) plugin instance - connect to relevant signals */
2257 plugin->ParameterChangedExternally.connect_same_thread (*this, boost::bind (&PluginInsert::parameter_changed_externally, this, _1, _2));
2258 plugin->StartTouch.connect_same_thread (*this, boost::bind (&PluginInsert::start_touch, this, _1));
2259 plugin->EndTouch.connect_same_thread (*this, boost::bind (&PluginInsert::end_touch, this, _1));
2260 // cache sidechain ports
2261 _cached_sidechain_pins.reset ();
2262 const ChanCount& nis (plugin->get_info()->n_inputs);
2263 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2264 for (uint32_t in = 0; in < nis.get (*t); ++in) {
2265 const Plugin::IOPortDescription& iod (plugin->describe_io_port (*t, true, in));
2266 if (iod.is_sidechain) {
2267 _cached_sidechain_pins.set (*t, 1 + _cached_sidechain_pins.n(*t));
2272 _plugins.push_back (plugin);
2276 PluginInsert::realtime_handle_transport_stopped ()
2278 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2279 (*i)->realtime_handle_transport_stopped ();
2284 PluginInsert::realtime_locate ()
2286 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2287 (*i)->realtime_locate ();
2292 PluginInsert::monitoring_changed ()
2294 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2295 (*i)->monitoring_changed ();
2300 PluginInsert::start_touch (uint32_t param_id)
2302 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id));
2304 ac->start_touch (session().audible_frame());
2309 PluginInsert::end_touch (uint32_t param_id)
2311 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id));
2313 ac->stop_touch (true, session().audible_frame());
2317 std::ostream& operator<<(std::ostream& o, const ARDOUR::PluginInsert::Match& m)
2320 case PluginInsert::Impossible: o << "Impossible"; break;
2321 case PluginInsert::Delegate: o << "Delegate"; break;
2322 case PluginInsert::NoInputs: o << "NoInputs"; break;
2323 case PluginInsert::ExactMatch: o << "ExactMatch"; break;
2324 case PluginInsert::Replicate: o << "Replicate"; break;
2325 case PluginInsert::Split: o << "Split"; break;
2326 case PluginInsert::Hide: o << "Hide"; break;
2328 o << " cnt: " << m.plugins
2329 << (m.strict_io ? " strict-io" : "")
2330 << (m.custom_cfg ? " custom-cfg" : "");
2331 if (m.method == PluginInsert::Hide) {
2332 o << " hide: " << m.hide;