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
298 if (is_channelstrip ()) {
299 return _configured_out;
302 return _plugins[0]->get_info()->n_outputs;
306 PluginInsert::natural_input_streams() const
309 if (is_channelstrip ()) {
310 return _configured_in;
313 return _plugins[0]->get_info()->n_inputs;
317 PluginInsert::sidechain_input_pins() const
319 return _cached_sidechain_pins;
323 PluginInsert::has_no_inputs() const
325 return _plugins[0]->get_info()->n_inputs == ChanCount::ZERO;
329 PluginInsert::has_no_audio_inputs() const
331 return _plugins[0]->get_info()->n_inputs.n_audio() == 0;
335 PluginInsert::is_midi_instrument() const
337 /* XXX more finesse is possible here. VST plugins have a
338 a specific "instrument" flag, for example.
340 PluginInfoPtr pi = _plugins[0]->get_info();
342 return pi->n_inputs.n_midi() != 0 &&
343 pi->n_outputs.n_audio() > 0;
347 PluginInsert::create_automatable_parameters ()
349 assert (!_plugins.empty());
351 set<Evoral::Parameter> a = _plugins.front()->automatable ();
353 for (set<Evoral::Parameter>::iterator i = a.begin(); i != a.end(); ++i) {
354 if (i->type() == PluginAutomation) {
356 Evoral::Parameter param(*i);
358 ParameterDescriptor desc;
359 _plugins.front()->get_parameter_descriptor(i->id(), desc);
361 can_automate (param);
362 boost::shared_ptr<AutomationList> list(new AutomationList(param, desc));
363 boost::shared_ptr<AutomationControl> c (new PluginControl(this, param, desc, list));
365 _plugins.front()->set_automation_control (i->id(), c);
366 } else if (i->type() == PluginPropertyAutomation) {
367 Evoral::Parameter param(*i);
368 const ParameterDescriptor& desc = _plugins.front()->get_property_descriptor(param.id());
369 if (desc.datatype != Variant::NOTHING) {
370 boost::shared_ptr<AutomationList> list;
371 if (Variant::type_is_numeric(desc.datatype)) {
372 list = boost::shared_ptr<AutomationList>(new AutomationList(param, desc));
374 add_control (boost::shared_ptr<AutomationControl> (new PluginPropertyControl(this, param, desc, list)));
379 /** Called when something outside of this host has modified a plugin
380 * parameter. Responsible for propagating the change to two places:
382 * 1) anything listening to the Control itself
383 * 2) any replicated plugins that make up this PluginInsert.
385 * The PluginInsert is connected to the ParameterChangedExternally signal for
386 * the first (primary) plugin, and here broadcasts that change to any others.
388 * XXX We should probably drop this whole replication idea (Paul, October 2015)
389 * since it isn't used by sensible plugin APIs (AU, LV2).
392 PluginInsert::parameter_changed_externally (uint32_t which, float val)
394 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, which));
396 /* First propagation: alter the underlying value of the control,
397 * without telling the plugin(s) that own/use it to set it.
404 boost::shared_ptr<PluginControl> pc = boost::dynamic_pointer_cast<PluginControl> (ac);
407 pc->catch_up_with_external_value (val);
410 /* Second propagation: tell all plugins except the first to
411 update the value of this parameter. For sane plugin APIs,
412 there are no other plugins, so this is a no-op in those
416 Plugins::iterator i = _plugins.begin();
418 /* don't set the first plugin, just all the slaves */
420 if (i != _plugins.end()) {
422 for (; i != _plugins.end(); ++i) {
423 (*i)->set_parameter (which, val);
429 PluginInsert::set_block_size (pframes_t nframes)
432 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
433 if ((*i)->set_block_size (nframes) != 0) {
441 PluginInsert::activate ()
443 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
447 Processor::activate ();
451 PluginInsert::deactivate ()
453 Processor::deactivate ();
455 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
461 PluginInsert::flush ()
463 for (vector<boost::shared_ptr<Plugin> >::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
469 PluginInsert::connect_and_run (BufferSet& bufs, pframes_t nframes, framecnt_t offset, bool with_auto, framepos_t now)
471 PinMappings in_map (_in_map);
472 PinMappings out_map (_out_map);
475 // TODO optimize special case.
476 // Currently this never triggers because the in_map for "Split" triggeres no_inplace.
477 if (_match.method == Split && !_no_inplace) {
478 assert (in_map.size () == 1);
479 in_map[0] = ChanMapping (ChanCount::max (natural_input_streams (), _configured_in)); // no sidechain
480 ChanCount const in_streams = internal_input_streams ();
481 /* copy the first stream's audio buffer contents to the others */
483 uint32_t first_idx = in_map[0].get (DataType::AUDIO, 0, &valid);
485 for (uint32_t i = in_streams.n_audio(); i < natural_input_streams().n_audio(); ++i) {
486 uint32_t idx = in_map[0].get (DataType::AUDIO, i, &valid);
488 bufs.get_audio(idx).read_from(bufs.get_audio(first_idx), nframes, offset, offset);
495 bufs.set_count(ChanCount::max(bufs.count(), _configured_internal));
496 bufs.set_count(ChanCount::max(bufs.count(), _configured_out));
502 for (Controls::iterator li = controls().begin(); li != controls().end(); ++li, ++n) {
504 boost::shared_ptr<AutomationControl> c
505 = boost::dynamic_pointer_cast<AutomationControl>(li->second);
507 if (c->list() && c->automation_playback()) {
510 const float val = c->list()->rt_safe_eval (now, valid);
513 /* This is the ONLY place where we are
515 * AutomationControl::set_value_unchecked(). We
516 * know that the control is in
517 * automation playback mode, so no
518 * check on writable() is required
519 * (which must be done in AutomationControl::set_value()
522 c->set_value_unchecked(val);
529 /* Calculate if, and how many frames we need to collect for analysis */
530 framecnt_t collect_signal_nframes = (_signal_analysis_collect_nframes_max -
531 _signal_analysis_collected_nframes);
532 if (nframes < collect_signal_nframes) { // we might not get all frames now
533 collect_signal_nframes = nframes;
536 if (collect_signal_nframes > 0) {
538 //std::cerr << "collect input, bufs " << bufs.count().n_audio() << " count, " << bufs.available().n_audio() << " available" << std::endl;
539 //std::cerr << " streams " << internal_input_streams().n_audio() << std::endl;
540 //std::cerr << "filling buffer with " << collect_signal_nframes << " frames at " << _signal_analysis_collected_nframes << std::endl;
542 _signal_analysis_inputs.set_count(internal_input_streams());
544 for (uint32_t i = 0; i < internal_input_streams().n_audio(); ++i) {
545 _signal_analysis_inputs.get_audio(i).read_from(
547 collect_signal_nframes,
548 _signal_analysis_collected_nframes); // offset is for target buffer
553 if (is_channelstrip ()) {
554 if (_configured_in.n_audio() > 0) {
555 ChanMapping mb_in_map (ChanCount::min (_configured_in, ChanCount (DataType::AUDIO, 2)));
556 ChanMapping mb_out_map (ChanCount::min (_configured_out, ChanCount (DataType::AUDIO, 2)));
558 _plugins.front()->connect_and_run (bufs, mb_in_map, mb_out_map, nframes, offset);
560 for (uint32_t out = _configured_in.n_audio (); out < bufs.count().get (DataType::AUDIO); ++out) {
561 bufs.get (DataType::AUDIO, out).silence (nframes, offset);
567 BufferSet& inplace_bufs = _session.get_noinplace_buffers();
568 ARDOUR::ChanMapping used_outputs;
571 // TODO optimize this flow. prepare during configure_io()
572 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
574 ARDOUR::ChanMapping i_in_map (natural_input_streams());
575 ARDOUR::ChanMapping i_out_map;
576 ARDOUR::ChanCount mapped;
577 ARDOUR::ChanCount backmap;
579 // map inputs sequentially
580 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
581 for (uint32_t in = 0; in < natural_input_streams().get (*t); ++in) {
583 uint32_t in_idx = in_map[pc].get (*t, in, &valid);
584 uint32_t m = mapped.get (*t);
586 inplace_bufs.get (*t, m).read_from (bufs.get (*t, in_idx), nframes, offset, offset);
588 inplace_bufs.get (*t, m).silence (nframes, offset);
590 mapped.set (*t, m + 1);
594 // TODO use map_offset_to() instead ??
598 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
599 for (uint32_t out = 0; out < natural_output_streams().get (*t); ++out) {
600 uint32_t m = mapped.get (*t);
601 inplace_bufs.get (*t, m).silence (nframes, offset);
602 i_out_map.set (*t, out, m);
603 mapped.set (*t, m + 1);
607 if ((*i)->connect_and_run(inplace_bufs, i_in_map, i_out_map, nframes, offset)) {
612 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
613 for (uint32_t out = 0; out < natural_output_streams().get (*t); ++out) {
614 uint32_t m = backmap.get (*t);
616 uint32_t out_idx = out_map[pc].get (*t, out, &valid);
618 bufs.get (*t, out_idx).read_from (inplace_bufs.get (*t, m), nframes, offset, offset);
619 used_outputs.set (*t, out_idx, 1); // mark as used
621 backmap.set (*t, m + 1);
625 /* all instances have completed, now clear outputs that have not been written to.
626 * (except midi bypass)
628 if (has_midi_bypass ()) {
629 used_outputs.set (DataType::MIDI, 0, 1); // Midi bypass.
631 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
632 for (uint32_t out = 0; out < bufs.count().get (*t); ++out) {
634 used_outputs.get (*t, out, &valid);
635 if (valid) { continue; }
636 bufs.get (*t, out).silence (nframes, offset);
642 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
643 if ((*i)->connect_and_run(bufs, in_map[pc], out_map[pc], nframes, offset)) {
648 // TODO optimize: store "unconnected" in a fixed set.
649 // it only changes on reconfiguration.
650 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
651 for (uint32_t out = 0; out < bufs.count().get (*t); ++out) {
653 if (*t == DataType::MIDI && out == 0 && has_midi_bypass ()) {
654 mapped = true; // in-place Midi bypass
656 for (uint32_t pc = 0; pc < get_count() && !mapped; ++pc) {
657 for (uint32_t o = 0; o < natural_output_streams().get (*t); ++o) {
659 uint32_t idx = out_map[pc].get (*t, o, &valid);
660 if (valid && idx == out) {
667 bufs.get (*t, out).silence (nframes, offset);
673 if (collect_signal_nframes > 0) {
675 //std::cerr << " output, bufs " << bufs.count().n_audio() << " count, " << bufs.available().n_audio() << " available" << std::endl;
676 //std::cerr << " streams " << internal_output_streams().n_audio() << std::endl;
678 _signal_analysis_outputs.set_count(internal_output_streams());
680 for (uint32_t i = 0; i < internal_output_streams().n_audio(); ++i) {
681 _signal_analysis_outputs.get_audio(i).read_from(
683 collect_signal_nframes,
684 _signal_analysis_collected_nframes); // offset is for target buffer
687 _signal_analysis_collected_nframes += collect_signal_nframes;
688 assert(_signal_analysis_collected_nframes <= _signal_analysis_collect_nframes_max);
690 if (_signal_analysis_collected_nframes == _signal_analysis_collect_nframes_max) {
691 _signal_analysis_collect_nframes_max = 0;
692 _signal_analysis_collected_nframes = 0;
694 AnalysisDataGathered(&_signal_analysis_inputs,
695 &_signal_analysis_outputs);
701 PluginInsert::silence (framecnt_t nframes)
707 ChanMapping in_map (natural_input_streams ());
708 ChanMapping out_map (natural_output_streams ());
710 // TODO run sidechain (delaylines)
711 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
712 (*i)->connect_and_run (_session.get_scratch_buffers ((*i)->get_info()->n_inputs, true), in_map, out_map, nframes, 0);
717 PluginInsert::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool)
719 if (_pending_active) {
720 /* run as normal if we are active or moving from inactive to active */
723 // collect sidechain input for complete cycle (!)
724 // TODO we need delaylines here for latency compensation
725 _sidechain->run (bufs, start_frame, end_frame, nframes, true);
728 if (_session.transport_rolling() || _session.bounce_processing()) {
729 automation_run (bufs, start_frame, nframes);
731 connect_and_run (bufs, nframes, 0, false);
735 // TODO use mapping in bypassed mode ?!
736 // -> do we bypass the processor or the plugin
738 // TODO include sidechain??
740 uint32_t in = input_streams ().n_audio ();
741 uint32_t out = output_streams().n_audio ();
743 if (has_no_audio_inputs() || in == 0) {
745 /* silence all (audio) outputs. Should really declick
746 * at the transitions of "active"
749 for (uint32_t n = 0; n < out; ++n) {
750 bufs.get_audio (n).silence (nframes);
753 } else if (out > in) {
755 /* not active, but something has make up for any channel count increase
756 * for now , simply replicate last buffer
758 for (uint32_t n = in; n < out; ++n) {
759 bufs.get_audio(n).read_from(bufs.get_audio(in - 1), nframes);
763 bufs.count().set_audio (out);
766 _active = _pending_active;
768 /* we have no idea whether the plugin generated silence or not, so mark
769 * all buffers appropriately.
774 PluginInsert::automation_run (BufferSet& bufs, framepos_t start, pframes_t nframes)
776 Evoral::ControlEvent next_event (0, 0.0f);
777 framepos_t now = start;
778 framepos_t end = now + nframes;
779 framecnt_t offset = 0;
781 Glib::Threads::Mutex::Lock lm (control_lock(), Glib::Threads::TRY_LOCK);
784 connect_and_run (bufs, nframes, offset, false);
788 if (!find_next_event (now, end, next_event) || _plugins.front()->requires_fixed_sized_buffers()) {
790 /* no events have a time within the relevant range */
792 connect_and_run (bufs, nframes, offset, true, now);
798 framecnt_t cnt = min (((framecnt_t) ceil (next_event.when) - now), (framecnt_t) nframes);
800 connect_and_run (bufs, cnt, offset, true, now);
806 if (!find_next_event (now, end, next_event)) {
811 /* cleanup anything that is left to do */
814 connect_and_run (bufs, nframes, offset, true, now);
819 PluginInsert::default_parameter_value (const Evoral::Parameter& param)
821 if (param.type() != PluginAutomation)
824 if (_plugins.empty()) {
825 fatal << _("programming error: ") << X_("PluginInsert::default_parameter_value() called with no plugin")
827 abort(); /*NOTREACHED*/
830 return _plugins[0]->default_value (param.id());
835 PluginInsert::can_reset_all_parameters ()
839 for (uint32_t par = 0; par < _plugins[0]->parameter_count(); ++par) {
841 const uint32_t cid = _plugins[0]->nth_parameter (par, ok);
843 if (!ok || !_plugins[0]->parameter_is_input(cid)) {
847 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, cid));
853 if (ac->automation_state() & Play) {
858 return all && (params > 0);
862 PluginInsert::reset_parameters_to_default ()
866 for (uint32_t par = 0; par < _plugins[0]->parameter_count(); ++par) {
868 const uint32_t cid = _plugins[0]->nth_parameter (par, ok);
870 if (!ok || !_plugins[0]->parameter_is_input(cid)) {
874 const float dflt = _plugins[0]->default_value (cid);
875 const float curr = _plugins[0]->get_parameter (cid);
881 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, cid));
886 if (ac->automation_state() & Play) {
891 ac->set_value (dflt, Controllable::NoGroup);
896 boost::shared_ptr<Plugin>
897 PluginInsert::plugin_factory (boost::shared_ptr<Plugin> other)
899 boost::shared_ptr<LadspaPlugin> lp;
900 boost::shared_ptr<LuaProc> lua;
902 boost::shared_ptr<LV2Plugin> lv2p;
904 #ifdef WINDOWS_VST_SUPPORT
905 boost::shared_ptr<WindowsVSTPlugin> vp;
908 boost::shared_ptr<LXVSTPlugin> lxvp;
910 #ifdef AUDIOUNIT_SUPPORT
911 boost::shared_ptr<AUPlugin> ap;
914 if ((lp = boost::dynamic_pointer_cast<LadspaPlugin> (other)) != 0) {
915 return boost::shared_ptr<Plugin> (new LadspaPlugin (*lp));
916 } else if ((lua = boost::dynamic_pointer_cast<LuaProc> (other)) != 0) {
917 return boost::shared_ptr<Plugin> (new LuaProc (*lua));
919 } else if ((lv2p = boost::dynamic_pointer_cast<LV2Plugin> (other)) != 0) {
920 return boost::shared_ptr<Plugin> (new LV2Plugin (*lv2p));
922 #ifdef WINDOWS_VST_SUPPORT
923 } else if ((vp = boost::dynamic_pointer_cast<WindowsVSTPlugin> (other)) != 0) {
924 return boost::shared_ptr<Plugin> (new WindowsVSTPlugin (*vp));
927 } else if ((lxvp = boost::dynamic_pointer_cast<LXVSTPlugin> (other)) != 0) {
928 return boost::shared_ptr<Plugin> (new LXVSTPlugin (*lxvp));
930 #ifdef AUDIOUNIT_SUPPORT
931 } else if ((ap = boost::dynamic_pointer_cast<AUPlugin> (other)) != 0) {
932 return boost::shared_ptr<Plugin> (new AUPlugin (*ap));
936 fatal << string_compose (_("programming error: %1"),
937 X_("unknown plugin type in PluginInsert::plugin_factory"))
939 abort(); /*NOTREACHED*/
940 return boost::shared_ptr<Plugin> ((Plugin*) 0);
944 PluginInsert::set_input_map (uint32_t num, ChanMapping m) {
945 if (num < _in_map.size()) {
946 bool changed = _in_map[num] != m;
950 PluginMapChanged (); /* EMIT SIGNAL */
956 PluginInsert::set_output_map (uint32_t num, ChanMapping m) {
957 if (num < _out_map.size()) {
958 bool changed = _out_map[num] != m;
962 PluginMapChanged (); /* EMIT SIGNAL */
968 PluginInsert::input_map () const
972 for (PinMappings::const_iterator i = _in_map.begin (); i != _in_map.end (); ++i, ++pc) {
973 ChanMapping m (i->second);
974 const ChanMapping::Mappings& mp ((*i).second.mappings());
975 for (ChanMapping::Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
976 for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
977 rv.set (tm->first, i->first + pc * natural_input_streams().get(tm->first), i->second);
985 PluginInsert::output_map () const
989 for (PinMappings::const_iterator i = _out_map.begin (); i != _out_map.end (); ++i, ++pc) {
990 ChanMapping m (i->second);
991 const ChanMapping::Mappings& mp ((*i).second.mappings());
992 for (ChanMapping::Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
993 for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
994 rv.set (tm->first, i->first + pc * natural_output_streams().get(tm->first), i->second);
998 if (has_midi_bypass ()) {
999 rv.set (DataType::MIDI, 0, 0);
1006 PluginInsert::has_midi_bypass () const
1008 if (_configured_in.n_midi () == 1 && _configured_out.n_midi () == 1
1009 && natural_output_streams ().n_midi () == 0) {
1016 PluginInsert::has_midi_thru () const
1018 if (_configured_in.n_midi () == 1 && _configured_out.n_midi () == 1
1019 && natural_input_streams ().n_midi () == 0 && natural_output_streams ().n_midi () == 0) {
1027 PluginInsert::is_channelstrip () const {
1028 return _plugins.front()->is_channelstrip();
1033 PluginInsert::sanitize_maps ()
1035 bool changed = false;
1036 /* strip dead wood */
1037 PinMappings new_ins;
1038 PinMappings new_outs;
1039 for (uint32_t pc = 0; pc < get_count(); ++pc) {
1041 ChanMapping new_out;
1042 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1043 for (uint32_t i = 0; i < natural_input_streams().get (*t); ++i) {
1045 uint32_t idx = _in_map[pc].get (*t, i, &valid);
1046 if (valid && idx < _configured_internal.get (*t)) {
1047 new_in.set (*t, i, idx);
1050 for (uint32_t o = 0; o < natural_output_streams().get (*t); ++o) {
1052 uint32_t idx = _out_map[pc].get (*t, o, &valid);
1053 if (valid && idx < _configured_out.get (*t)) {
1054 new_out.set (*t, o, idx);
1058 if (_in_map[pc] != new_in || _out_map[pc] != new_out) {
1061 new_ins[pc] = new_in;
1062 new_outs[pc] = new_out;
1064 /* prevent dup output assignments */
1065 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1066 for (uint32_t o = 0; o < _configured_out.get (*t); ++o) {
1067 bool mapped = false;
1068 for (uint32_t pc = 0; pc < get_count(); ++pc) {
1070 uint32_t idx = new_outs[pc].get_src (*t, o, &valid);
1071 if (valid && mapped) {
1072 new_outs[pc].unset (*t, idx);
1080 if (_in_map != new_ins || _out_map != new_outs) {
1084 _out_map = new_outs;
1090 PluginInsert::reset_map (bool emit)
1093 const PinMappings old_in (_in_map);
1094 const PinMappings old_out (_out_map);
1098 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
1099 ChanCount ns_inputs = natural_input_streams() - sidechain_input_pins ();
1100 if (_match.method == Split) {
1101 _in_map[pc] = ChanMapping ();
1102 /* connect no sidechain sinks in round-robin fashion */
1103 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1104 const uint32_t cend = _configured_in.get (*t);
1105 if (cend == 0) { continue; }
1107 for (uint32_t in = 0; in < ns_inputs.get (*t); ++in) {
1108 _in_map[pc].set (*t, in, c);
1113 _in_map[pc] = ChanMapping (ChanCount::min (ns_inputs, _configured_in));
1115 _out_map[pc] = ChanMapping (ChanCount::min (natural_output_streams(), _configured_out));
1117 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1118 const uint32_t nis = natural_input_streams ().get(*t);
1119 const uint32_t stride = nis - sidechain_input_pins().get (*t);
1120 _in_map[pc].offset_to(*t, stride * pc);
1121 _out_map[pc].offset_to(*t, pc * natural_output_streams().get(*t));
1123 // connect side-chains
1124 const uint32_t sc_start = _configured_in.get (*t);
1125 const uint32_t sc_len = _configured_internal.get (*t) - sc_start;
1126 if (sc_len == 0) { continue; }
1128 for (uint32_t in = ns_inputs.get (*t); in < nis; ++in) {
1129 _in_map[pc].set (*t, in, sc_start + c);
1130 c = (c + 1) % sc_len;
1135 if (old_in == _in_map && old_out == _out_map) {
1139 PluginMapChanged (); /* EMIT SIGNAL */
1145 PluginInsert::configure_io (ChanCount in, ChanCount out)
1147 Match old_match = _match;
1149 ChanCount old_internal;
1153 old_in = _configured_in;
1154 old_internal = _configured_internal;
1155 old_out = _configured_out;
1158 _configured_in = in;
1159 _configured_internal = in;
1160 _configured_out = out;
1163 /* TODO hide midi-bypass, and custom outs. Best /fake/ "out" here.
1164 * (currently _sidechain->configure_io always succeeds
1165 * since Processor::configure_io() succeeds)
1167 if (!_sidechain->configure_io (in, out)) {
1168 DEBUG_TRACE (DEBUG::ChanMapping, "Sidechain configuration failed\n");
1171 _configured_internal += _sidechain->input()->n_ports();
1174 /* get plugin configuration */
1175 _match = private_can_support_io_configuration (in, out);
1177 if (DEBUG_ENABLED(DEBUG::ChanMapping)) {
1179 DEBUG_STR_APPEND(a, string_compose ("Match '%1': ", name()));
1180 DEBUG_STR_APPEND(a, _match);
1181 DEBUG_TRACE (DEBUG::ChanMapping, DEBUG_STR(a).str());
1185 /* set the matching method and number of plugins that we will use to meet this configuration */
1186 if (set_count (_match.plugins) == false) {
1187 PluginIoReConfigure (); /* EMIT SIGNAL */
1188 _configured = false;
1192 /* configure plugins */
1193 switch (_match.method) {
1196 if (_plugins.front()->configure_io (natural_input_streams(), out) == false) {
1197 PluginIoReConfigure (); /* EMIT SIGNAL */
1198 _configured = false;
1206 bool const r = _plugins.front()->can_support_io_configuration (in, dout, &useins);
1208 assert (_match.strict_io || dout.n_audio() == out.n_audio()); // sans midi bypass
1209 if (useins.n_audio() == 0) {
1212 if (_plugins.front()->configure_io (useins, dout) == false) {
1213 PluginIoReConfigure (); /* EMIT SIGNAL */
1214 _configured = false;
1220 if (_plugins.front()->configure_io (in, out) == false) {
1221 PluginIoReConfigure (); /* EMIT SIGNAL */
1222 _configured = false;
1228 bool mapping_changed = false;
1229 if (old_in == in && old_out == out
1231 && old_match.method == _match.method
1232 && _in_map.size() == _out_map.size()
1233 && _in_map.size() == get_count ()
1235 /* If the configuration has not changed, keep the mapping */
1236 if (old_internal != _configured_internal) {
1237 mapping_changed = sanitize_maps ();
1239 } else if (_match.custom_cfg && _configured) {
1240 mapping_changed = sanitize_maps ();
1243 if (is_channelstrip ()) { _maps_from_state = false; }
1245 if (_maps_from_state) {
1246 _maps_from_state = false;
1247 mapping_changed = true;
1250 /* generate a new mapping */
1251 mapping_changed = reset_map (false);
1255 if (mapping_changed) {
1256 PluginMapChanged (); /* EMIT SIGNAL */
1259 if (DEBUG_ENABLED(DEBUG::ChanMapping)) {
1262 DEBUG_STR_APPEND(a, "\n--------<<--------\n");
1263 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
1265 DEBUG_STR_APPEND(a, "----><----\n");
1267 DEBUG_STR_APPEND(a, string_compose ("Channel Map for %1 plugin %2\n", name(), pc));
1268 DEBUG_STR_APPEND(a, " * Inputs:\n");
1269 DEBUG_STR_APPEND(a, _in_map[pc]);
1270 DEBUG_STR_APPEND(a, " * Outputs:\n");
1271 DEBUG_STR_APPEND(a, _out_map[pc]);
1273 DEBUG_STR_APPEND(a, "-------->>--------\n");
1274 DEBUG_TRACE (DEBUG::ChanMapping, DEBUG_STR(a).str());
1279 // auto-detect if inplace processing is possible
1280 bool inplace_ok = true;
1281 for (uint32_t pc = 0; pc < get_count() && inplace_ok ; ++pc) {
1282 if (!_in_map[pc].is_monotonic ()) {
1285 if (!_out_map[pc].is_monotonic ()) {
1289 _no_inplace = !inplace_ok || _plugins.front()->inplace_broken ();
1291 if (old_in != in || old_out != out || old_internal != _configured_internal
1292 || (old_match.method != _match.method && (old_match.method == Split || _match.method == Split))
1294 PluginIoReConfigure (); /* EMIT SIGNAL */
1297 // we don't know the analysis window size, so we must work with the
1298 // current buffer size here. each request for data fills in these
1299 // buffers and the analyser makes sure it gets enough data for the
1301 session().ensure_buffer_set (_signal_analysis_inputs, in);
1302 //_signal_analysis_inputs.set_count (in);
1304 session().ensure_buffer_set (_signal_analysis_outputs, out);
1305 //_signal_analysis_outputs.set_count (out);
1307 // std::cerr << "set counts to i" << in.n_audio() << "/o" << out.n_audio() << std::endl;
1310 return Processor::configure_io (in, out);
1313 /** Decide whether this PluginInsert can support a given IO configuration.
1314 * To do this, we run through a set of possible solutions in rough order of
1317 * @param in Required input channel count.
1318 * @param out Filled in with the output channel count if we return true.
1319 * @return true if the given IO configuration can be supported.
1322 PluginInsert::can_support_io_configuration (const ChanCount& in, ChanCount& out)
1325 _sidechain->can_support_io_configuration (in, out); // never fails, sets "out"
1327 return private_can_support_io_configuration (in, out).method != Impossible;
1330 /** A private version of can_support_io_configuration which returns the method
1331 * by which the configuration can be matched, rather than just whether or not
1335 PluginInsert::private_can_support_io_configuration (ChanCount const & inx, ChanCount& out) const
1337 if (_plugins.empty()) {
1342 if (is_channelstrip ()) {
1344 return Match (ExactMatch, 1);
1348 /* if a user specified a custom cfg, so be it. */
1351 return Match (ExactMatch, get_count(), _strict_io, true); // XXX
1354 /* try automatic configuration */
1355 Match m = PluginInsert::automatic_can_support_io_configuration (inx, out);
1357 PluginInfoPtr info = _plugins.front()->get_info();
1358 ChanCount inputs = info->n_inputs;
1359 ChanCount outputs = info->n_outputs;
1361 /* handle case strict-i/o */
1362 if (_strict_io && m.method != Impossible) {
1365 /* special case MIDI instruments */
1366 if (is_midi_instrument()) {
1367 // output = midi-bypass + at most master-out channels.
1368 ChanCount max_out (DataType::AUDIO, 2); // TODO use master-out
1369 max_out.set (DataType::MIDI, out.get(DataType::MIDI));
1370 out = ChanCount::min (out, max_out);
1371 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("special case strict-i/o instrument: %1\n", name()));
1377 if (inx.n_audio () != out.n_audio ()) { // ignore midi bypass
1378 /* replicate processor to match output count (generators and such)
1379 * at least enough to feed every output port. */
1380 uint32_t f = 1; // at least one. e.g. control data filters, no in, no out.
1381 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1382 uint32_t nout = outputs.get (*t);
1383 if (nout == 0 || inx.get(*t) == 0) { continue; }
1384 f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nout));
1387 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("special case strict-i/o generator: %1\n", name()));
1388 return Match (Replicate, f, _strict_io);
1399 if (m.method != Impossible) {
1403 ChanCount ns_inputs = inputs - sidechain_input_pins ();
1405 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("resolving 'Impossible' match for %1\n", name()));
1407 if (info->reconfigurable_io()) {
1409 // TODO add sidechains here
1410 bool const r = _plugins.front()->can_support_io_configuration (inx, out, &useins);
1412 // houston, we have a problem.
1413 return Match (Impossible, 0);
1415 return Match (Delegate, 1, _strict_io);
1418 ChanCount midi_bypass;
1419 if (inx.get(DataType::MIDI) == 1 && outputs.get(DataType::MIDI) == 0) {
1420 midi_bypass.set (DataType::MIDI, 1);
1423 // add at least as many plugins so that output count matches input count (w/o sidechain pins)
1425 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1426 uint32_t nin = ns_inputs.get (*t);
1427 uint32_t nout = outputs.get (*t);
1428 if (nin == 0 || inx.get(*t) == 0) { continue; }
1429 // prefer floor() so the count won't overly increase IFF (nin < nout)
1430 f = max (f, (uint32_t) floor (inx.get(*t) / (float)nout));
1432 if (f > 0 && outputs * f >= _configured_out) {
1433 out = outputs * f + midi_bypass;
1434 return Match (Replicate, f, _strict_io);
1437 // add at least as many plugins needed to connect all inputs (w/o sidechain pins)
1439 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1440 uint32_t nin = ns_inputs.get (*t);
1441 if (nin == 0 || inx.get(*t) == 0) { continue; }
1442 f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nin));
1445 out = outputs * f + midi_bypass;
1446 return Match (Replicate, f, _strict_io);
1449 // add at least as many plugins needed to connect all inputs
1451 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1452 uint32_t nin = inputs.get (*t);
1453 if (nin == 0 || inx.get(*t) == 0) { continue; }
1454 f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nin));
1456 out = outputs * f + midi_bypass;
1457 return Match (Replicate, f, _strict_io);
1460 /* this is the original Ardour 3/4 behavior, mainly for backwards compatibility */
1462 PluginInsert::automatic_can_support_io_configuration (ChanCount const & inx, ChanCount& out) const
1464 if (_plugins.empty()) {
1468 PluginInfoPtr info = _plugins.front()->get_info();
1469 ChanCount in; in += inx;
1470 ChanCount midi_bypass;
1472 if (info->reconfigurable_io()) {
1473 /* Plugin has flexible I/O, so delegate to it */
1474 bool const r = _plugins.front()->can_support_io_configuration (in, out);
1476 return Match (Impossible, 0);
1478 return Match (Delegate, 1);
1481 ChanCount inputs = info->n_inputs;
1482 ChanCount outputs = info->n_outputs;
1483 ChanCount ns_inputs = inputs - sidechain_input_pins ();
1485 if (in.get(DataType::MIDI) == 1 && outputs.get(DataType::MIDI) == 0) {
1486 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("bypassing midi-data around %1\n", name()));
1487 midi_bypass.set (DataType::MIDI, 1);
1489 if (in.get(DataType::MIDI) == 1 && inputs.get(DataType::MIDI) == 0) {
1490 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("hiding midi-port from plugin %1\n", name()));
1491 in.set(DataType::MIDI, 0);
1494 // add internally provided sidechain ports
1495 ChanCount insc = in + sidechain_input_ports ();
1497 bool no_inputs = true;
1498 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1499 if (inputs.get (*t) != 0) {
1506 /* no inputs so we can take any input configuration since we throw it away */
1507 out = outputs + midi_bypass;
1508 return Match (NoInputs, 1);
1511 /* Plugin inputs match requested inputs + side-chain-ports exactly */
1512 if (inputs == insc) {
1513 out = outputs + midi_bypass;
1514 return Match (ExactMatch, 1);
1517 /* Plugin inputs matches without side-chain-pins */
1518 if (ns_inputs == in) {
1519 out = outputs + midi_bypass;
1520 return Match (ExactMatch, 1);
1523 /* We may be able to run more than one copy of the plugin within this insert
1524 to cope with the insert having more inputs than the plugin.
1525 We allow replication only for plugins with either zero or 1 inputs and outputs
1526 for every valid data type.
1530 bool can_replicate = true;
1531 for (DataType::iterator t = DataType::begin(); t != DataType::end() && can_replicate; ++t) {
1533 // ignore side-chains
1534 uint32_t nin = ns_inputs.get (*t);
1536 // No inputs of this type
1537 if (nin == 0 && in.get(*t) == 0) {
1541 if (nin != 1 || outputs.get (*t) != 1) {
1542 can_replicate = false;
1546 // Potential factor not set yet
1548 f = in.get(*t) / nin;
1551 // Factor for this type does not match another type, can not replicate
1552 if (f != (in.get(*t) / nin)) {
1553 can_replicate = false;
1558 if (can_replicate && f > 0) {
1559 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1560 out.set (*t, outputs.get(*t) * f);
1563 return Match (Replicate, f);
1566 /* If the processor has exactly one input of a given type, and
1567 the plugin has more, we can feed the single processor input
1568 to some or all of the plugin inputs. This is rather
1569 special-case-y, but the 1-to-many case is by far the
1570 simplest. How do I split thy 2 processor inputs to 3
1571 plugin inputs? Let me count the ways ...
1574 bool can_split = true;
1575 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1577 bool const can_split_type = (in.get (*t) == 1 && ns_inputs.get (*t) > 1);
1578 bool const nothing_to_do_for_type = (in.get (*t) == 0 && inputs.get (*t) == 0);
1580 if (!can_split_type && !nothing_to_do_for_type) {
1586 out = outputs + midi_bypass;
1587 return Match (Split, 1);
1590 /* If the plugin has more inputs than we want, we can `hide' some of them
1591 by feeding them silence.
1594 bool could_hide = false;
1595 bool cannot_hide = false;
1596 ChanCount hide_channels;
1598 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1599 if (inputs.get(*t) > in.get(*t)) {
1600 /* there is potential to hide, since the plugin has more inputs of type t than the insert */
1601 hide_channels.set (*t, inputs.get(*t) - in.get(*t));
1603 } else if (inputs.get(*t) < in.get(*t)) {
1604 /* we definitely cannot hide, since the plugin has fewer inputs of type t than the insert */
1609 if (could_hide && !cannot_hide) {
1610 out = outputs + midi_bypass;
1611 return Match (Hide, 1, false, false, hide_channels);
1614 return Match (Impossible, 0);
1619 PluginInsert::get_state ()
1621 return state (true);
1625 PluginInsert::state (bool full)
1627 XMLNode& node = Processor::state (full);
1629 node.add_property("type", _plugins[0]->state_node_name());
1630 node.add_property("unique-id", _plugins[0]->unique_id());
1631 node.add_property("count", string_compose("%1", _plugins.size()));
1633 /* remember actual i/o configuration (for later placeholder
1634 * in case the plugin goes missing) */
1635 node.add_child_nocopy (* _configured_in.state (X_("ConfiguredInput")));
1636 node.add_child_nocopy (* _configured_out.state (X_("ConfiguredOutput")));
1638 /* save custom i/o config */
1639 node.add_property("custom", _custom_cfg ? "yes" : "no");
1640 for (uint32_t pc = 0; pc < get_count(); ++pc) {
1642 snprintf (tmp, sizeof(tmp), "InputMap-%d", pc);
1643 node.add_child_nocopy (* _in_map[pc].state (tmp));
1644 snprintf (tmp, sizeof(tmp), "OutputMap-%d", pc);
1645 node.add_child_nocopy (* _out_map[pc].state (tmp));
1649 node.add_child_nocopy (_sidechain->state (full));
1652 _plugins[0]->set_insert_id(this->id());
1653 node.add_child_nocopy (_plugins[0]->get_state());
1655 for (Controls::iterator c = controls().begin(); c != controls().end(); ++c) {
1656 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> ((*c).second);
1658 node.add_child_nocopy (ac->get_state());
1666 PluginInsert::set_control_ids (const XMLNode& node, int version)
1668 const XMLNodeList& nlist = node.children();
1669 XMLNodeConstIterator iter;
1670 set<Evoral::Parameter>::const_iterator p;
1672 for (iter = nlist.begin(); iter != nlist.end(); ++iter) {
1673 if ((*iter)->name() == Controllable::xml_node_name) {
1674 const XMLProperty* prop;
1676 uint32_t p = (uint32_t)-1;
1678 if ((prop = (*iter)->property (X_("symbol"))) != 0) {
1679 boost::shared_ptr<LV2Plugin> lv2plugin = boost::dynamic_pointer_cast<LV2Plugin> (_plugins[0]);
1681 p = lv2plugin->port_index(prop->value().c_str());
1685 if (p == (uint32_t)-1 && (prop = (*iter)->property (X_("parameter"))) != 0) {
1686 p = atoi (prop->value());
1689 if (p != (uint32_t)-1) {
1691 /* this may create the new controllable */
1693 boost::shared_ptr<Evoral::Control> c = control (Evoral::Parameter (PluginAutomation, 0, p));
1695 #ifndef NO_PLUGIN_STATE
1699 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> (c);
1701 ac->set_state (**iter, version);
1710 PluginInsert::set_state(const XMLNode& node, int version)
1712 XMLNodeList nlist = node.children();
1713 XMLNodeIterator niter;
1714 XMLPropertyList plist;
1715 const XMLProperty *prop;
1716 ARDOUR::PluginType type;
1718 if ((prop = node.property ("type")) == 0) {
1719 error << _("XML node describing plugin is missing the `type' field") << endmsg;
1723 if (prop->value() == X_("ladspa") || prop->value() == X_("Ladspa")) { /* handle old school sessions */
1724 type = ARDOUR::LADSPA;
1725 } else if (prop->value() == X_("lv2")) {
1727 } else if (prop->value() == X_("windows-vst")) {
1728 type = ARDOUR::Windows_VST;
1729 } else if (prop->value() == X_("lxvst")) {
1730 type = ARDOUR::LXVST;
1731 } else if (prop->value() == X_("audiounit")) {
1732 type = ARDOUR::AudioUnit;
1733 } else if (prop->value() == X_("luaproc")) {
1736 error << string_compose (_("unknown plugin type %1 in plugin insert state"),
1742 prop = node.property ("unique-id");
1745 #ifdef WINDOWS_VST_SUPPORT
1746 /* older sessions contain VST plugins with only an "id" field.
1749 if (type == ARDOUR::Windows_VST) {
1750 prop = node.property ("id");
1754 #ifdef LXVST_SUPPORT
1755 /*There shouldn't be any older sessions with linuxVST support.. but anyway..*/
1757 if (type == ARDOUR::LXVST) {
1758 prop = node.property ("id");
1764 error << _("Plugin has no unique ID field") << endmsg;
1769 boost::shared_ptr<Plugin> plugin = find_plugin (_session, prop->value(), type);
1771 /* treat linux and windows VST plugins equivalent if they have the same uniqueID
1772 * allow to move sessions windows <> linux */
1773 #ifdef LXVST_SUPPORT
1774 if (plugin == 0 && type == ARDOUR::Windows_VST) {
1775 type = ARDOUR::LXVST;
1776 plugin = find_plugin (_session, prop->value(), type);
1780 #ifdef WINDOWS_VST_SUPPORT
1781 if (plugin == 0 && type == ARDOUR::LXVST) {
1782 type = ARDOUR::Windows_VST;
1783 plugin = find_plugin (_session, prop->value(), type);
1788 error << string_compose(
1789 _("Found a reference to a plugin (\"%1\") that is unknown.\n"
1790 "Perhaps it was removed or moved since it was last used."),
1796 if (type == ARDOUR::Lua) {
1797 XMLNode *ls = node.child (plugin->state_node_name().c_str());
1798 // we need to load the script to set the name and parameters.
1799 boost::shared_ptr<LuaProc> lp = boost::dynamic_pointer_cast<LuaProc>(plugin);
1801 lp->set_script_from_state (*ls);
1805 // The name of the PluginInsert comes from the plugin, nothing else
1806 _name = plugin->get_info()->name;
1810 // Processor::set_state() will set this, but too late
1811 // for it to be available when setting up plugin
1812 // state. We can't call Processor::set_state() until
1813 // the plugins themselves are created and added.
1817 if (_plugins.empty()) {
1818 /* if we are adding the first plugin, we will need to set
1819 up automatable controls.
1821 add_plugin (plugin);
1822 create_automatable_parameters ();
1823 set_control_ids (node, version);
1826 if ((prop = node.property ("count")) != 0) {
1827 sscanf (prop->value().c_str(), "%u", &count);
1830 if (_plugins.size() != count) {
1831 for (uint32_t n = 1; n < count; ++n) {
1832 add_plugin (plugin_factory (plugin));
1836 Processor::set_state (node, version);
1838 PBD::ID new_id = this->id();
1839 PBD::ID old_id = this->id();
1841 if ((prop = node.property ("id")) != 0) {
1842 old_id = prop->value ();
1845 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1847 /* find the node with the type-specific node name ("lv2", "ladspa", etc)
1848 and set all plugins to the same state.
1851 if ((*niter)->name() == plugin->state_node_name()) {
1853 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1854 /* Plugin state can include external files which are named after the ID.
1856 * If regenerate_xml_or_string_ids() is set, the ID will already have
1857 * been changed, so we need to use the old ID from the XML to load the
1858 * state and then update the ID.
1860 * When copying a plugin-state, route_ui takes care of of updating the ID,
1861 * but we need to call set_insert_id() to clear the cached plugin-state
1862 * and force a change.
1864 if (!regenerate_xml_or_string_ids ()) {
1865 (*i)->set_insert_id (new_id);
1867 (*i)->set_insert_id (old_id);
1870 (*i)->set_state (**niter, version);
1872 if (regenerate_xml_or_string_ids ()) {
1873 (*i)->set_insert_id (new_id);
1881 if (version < 3000) {
1883 /* Only 2.X sessions need a call to set_parameter_state() - in 3.X and above
1884 this is all handled by Automatable
1887 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1888 if ((*niter)->name() == "Redirect") {
1889 /* XXX do we need to tackle placement? i think not (pd; oct 16 2009) */
1890 Processor::set_state (**niter, version);
1895 set_parameter_state_2X (node, version);
1898 if ((prop = node.property (X_("custom"))) != 0) {
1899 _custom_cfg = string_is_affirmative (prop->value());
1902 // TODO load/add sidechain
1904 uint32_t in_maps = 0;
1905 uint32_t out_maps = 0;
1906 XMLNodeList kids = node.children ();
1907 for (XMLNodeIterator i = kids.begin(); i != kids.end(); ++i) {
1908 if ((*i)->name() == X_("ConfiguredOutput")) {
1909 _custom_out = ChanCount(**i);
1911 if (strncmp ((*i)->name ().c_str(), X_("InputMap-"), 9) == 0) {
1912 long pc = atol (&((*i)->name().c_str()[9]));
1913 if (pc >=0 && pc <= get_count()) {
1914 _in_map[pc] = ChanMapping (**i);
1918 if (strncmp ((*i)->name ().c_str(), X_("OutputMap-"), 10) == 0) {
1919 long pc = atol (&((*i)->name().c_str()[10]));
1920 if (pc >=0 && pc <= get_count()) {
1921 _out_map[pc] = ChanMapping (**i);
1925 if ((*i)->name () == Processor::state_node_name) {
1929 _sidechain->set_state (**i, version);
1933 if (in_maps == out_maps && out_maps >0 && out_maps == get_count()) {
1934 _maps_from_state = true;
1937 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1941 (*i)->deactivate ();
1949 PluginInsert::update_id (PBD::ID id)
1952 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1953 (*i)->set_insert_id (id);
1958 PluginInsert::set_state_dir (const std::string& d)
1960 // state() only saves the state of the first plugin
1961 _plugins[0]->set_state_dir (d);
1965 PluginInsert::set_parameter_state_2X (const XMLNode& node, int version)
1967 XMLNodeList nlist = node.children();
1968 XMLNodeIterator niter;
1970 /* look for port automation node */
1972 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1974 if ((*niter)->name() != port_automation_node_name) {
1980 XMLNodeConstIterator iter;
1985 cnodes = (*niter)->children ("port");
1987 for (iter = cnodes.begin(); iter != cnodes.end(); ++iter){
1991 if ((cprop = child->property("number")) != 0) {
1992 port = cprop->value().c_str();
1994 warning << _("PluginInsert: Auto: no ladspa port number") << endmsg;
1998 sscanf (port, "%" PRIu32, &port_id);
2000 if (port_id >= _plugins[0]->parameter_count()) {
2001 warning << _("PluginInsert: Auto: port id out of range") << endmsg;
2005 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(
2006 control(Evoral::Parameter(PluginAutomation, 0, port_id), true));
2008 if (c && c->alist()) {
2009 if (!child->children().empty()) {
2010 c->alist()->set_state (*child->children().front(), version);
2012 /* In some cases 2.X saves lists with min_yval and max_yval
2013 being FLT_MIN and FLT_MAX respectively. This causes problems
2014 in A3 because these min/max values are used to compute
2015 where GUI control points should be drawn. If we see such
2016 values, `correct' them to the min/max of the appropriate
2020 float min_y = c->alist()->get_min_y ();
2021 float max_y = c->alist()->get_max_y ();
2023 ParameterDescriptor desc;
2024 _plugins.front()->get_parameter_descriptor (port_id, desc);
2026 if (min_y == FLT_MIN) {
2030 if (max_y == FLT_MAX) {
2034 c->alist()->set_yrange (min_y, max_y);
2037 error << string_compose (_("PluginInsert: automatable control %1 not found - ignored"), port_id) << endmsg;
2049 PluginInsert::describe_parameter (Evoral::Parameter param)
2051 if (param.type() == PluginAutomation) {
2052 return _plugins[0]->describe_parameter (param);
2053 } else if (param.type() == PluginPropertyAutomation) {
2054 boost::shared_ptr<AutomationControl> c(automation_control(param));
2055 if (c && !c->desc().label.empty()) {
2056 return c->desc().label;
2059 return Automatable::describe_parameter(param);
2063 PluginInsert::signal_latency() const
2065 if (_user_latency) {
2066 return _user_latency;
2069 return _plugins[0]->signal_latency ();
2073 PluginInsert::type ()
2075 return plugin()->get_info()->type;
2078 PluginInsert::PluginControl::PluginControl (PluginInsert* p,
2079 const Evoral::Parameter& param,
2080 const ParameterDescriptor& desc,
2081 boost::shared_ptr<AutomationList> list)
2082 : AutomationControl (p->session(), param, desc, list, p->describe_parameter(param))
2086 alist()->reset_default (desc.normal);
2088 list->set_interpolation(Evoral::ControlList::Discrete);
2093 set_flags(Controllable::Toggle);
2097 /** @param val `user' value */
2099 PluginInsert::PluginControl::set_value (double user_val, PBD::Controllable::GroupControlDisposition group_override)
2102 _set_value (user_val, group_override);
2106 PluginInsert::PluginControl::set_value_unchecked (double user_val)
2108 /* used only by automation playback */
2109 _set_value (user_val, Controllable::NoGroup);
2113 PluginInsert::PluginControl::_set_value (double user_val, PBD::Controllable::GroupControlDisposition group_override)
2115 /* FIXME: probably should be taking out some lock here.. */
2117 for (Plugins::iterator i = _plugin->_plugins.begin(); i != _plugin->_plugins.end(); ++i) {
2118 (*i)->set_parameter (_list->parameter().id(), user_val);
2121 boost::shared_ptr<Plugin> iasp = _plugin->_impulseAnalysisPlugin.lock();
2123 iasp->set_parameter (_list->parameter().id(), user_val);
2126 AutomationControl::set_value (user_val, group_override);
2130 PluginInsert::PluginControl::catch_up_with_external_value (double user_val)
2132 AutomationControl::set_value (user_val, Controllable::NoGroup);
2136 PluginInsert::PluginControl::get_state ()
2140 XMLNode& node (AutomationControl::get_state());
2141 ss << parameter().id();
2142 node.add_property (X_("parameter"), ss.str());
2144 boost::shared_ptr<LV2Plugin> lv2plugin = boost::dynamic_pointer_cast<LV2Plugin> (_plugin->_plugins[0]);
2146 node.add_property (X_("symbol"), lv2plugin->port_symbol (parameter().id()));
2153 /** @return `user' val */
2155 PluginInsert::PluginControl::get_value () const
2157 boost::shared_ptr<Plugin> plugin = _plugin->plugin (0);
2163 return plugin->get_parameter (_list->parameter().id());
2166 PluginInsert::PluginPropertyControl::PluginPropertyControl (PluginInsert* p,
2167 const Evoral::Parameter& param,
2168 const ParameterDescriptor& desc,
2169 boost::shared_ptr<AutomationList> list)
2170 : AutomationControl (p->session(), param, desc, list)
2174 alist()->set_yrange (desc.lower, desc.upper);
2175 alist()->reset_default (desc.normal);
2179 set_flags(Controllable::Toggle);
2184 PluginInsert::PluginPropertyControl::set_value (double user_val, PBD::Controllable::GroupControlDisposition /* group_override*/)
2187 set_value_unchecked (user_val);
2192 PluginInsert::PluginPropertyControl::set_value_unchecked (double user_val)
2194 /* Old numeric set_value(), coerce to appropriate datatype if possible.
2195 This is lossy, but better than nothing until Ardour's automation system
2196 can handle various datatypes all the way down. */
2197 const Variant value(_desc.datatype, user_val);
2198 if (value.type() == Variant::NOTHING) {
2199 error << "set_value(double) called for non-numeric property" << endmsg;
2203 for (Plugins::iterator i = _plugin->_plugins.begin(); i != _plugin->_plugins.end(); ++i) {
2204 (*i)->set_property(_list->parameter().id(), value);
2208 AutomationControl::set_value (user_val, Controllable::NoGroup);
2212 PluginInsert::PluginPropertyControl::get_state ()
2216 XMLNode& node (AutomationControl::get_state());
2217 ss << parameter().id();
2218 node.add_property (X_("property"), ss.str());
2219 node.remove_property (X_("value"));
2225 PluginInsert::PluginPropertyControl::get_value () const
2227 return _value.to_double();
2230 boost::shared_ptr<Plugin>
2231 PluginInsert::get_impulse_analysis_plugin()
2233 boost::shared_ptr<Plugin> ret;
2234 if (_impulseAnalysisPlugin.expired()) {
2235 ret = plugin_factory(_plugins[0]);
2236 ret->configure_io (internal_input_streams (), internal_output_streams ());
2237 _impulseAnalysisPlugin = ret;
2239 ret = _impulseAnalysisPlugin.lock();
2246 PluginInsert::collect_signal_for_analysis (framecnt_t nframes)
2248 // called from outside the audio thread, so this should be safe
2249 // only do audio as analysis is (currently) only for audio plugins
2250 _signal_analysis_inputs.ensure_buffers( DataType::AUDIO, internal_input_streams().n_audio(), nframes);
2251 _signal_analysis_outputs.ensure_buffers( DataType::AUDIO, internal_output_streams().n_audio(), nframes);
2253 _signal_analysis_collected_nframes = 0;
2254 _signal_analysis_collect_nframes_max = nframes;
2257 /** Add a plugin to our list */
2259 PluginInsert::add_plugin (boost::shared_ptr<Plugin> plugin)
2261 plugin->set_insert_id (this->id());
2263 if (_plugins.empty()) {
2264 /* first (and probably only) plugin instance - connect to relevant signals */
2266 plugin->ParameterChangedExternally.connect_same_thread (*this, boost::bind (&PluginInsert::parameter_changed_externally, this, _1, _2));
2267 plugin->StartTouch.connect_same_thread (*this, boost::bind (&PluginInsert::start_touch, this, _1));
2268 plugin->EndTouch.connect_same_thread (*this, boost::bind (&PluginInsert::end_touch, this, _1));
2269 // cache sidechain ports
2270 _cached_sidechain_pins.reset ();
2271 const ChanCount& nis (plugin->get_info()->n_inputs);
2272 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2273 for (uint32_t in = 0; in < nis.get (*t); ++in) {
2274 const Plugin::IOPortDescription& iod (plugin->describe_io_port (*t, true, in));
2275 if (iod.is_sidechain) {
2276 _cached_sidechain_pins.set (*t, 1 + _cached_sidechain_pins.n(*t));
2281 _plugins.push_back (plugin);
2285 PluginInsert::realtime_handle_transport_stopped ()
2287 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2288 (*i)->realtime_handle_transport_stopped ();
2293 PluginInsert::realtime_locate ()
2295 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2296 (*i)->realtime_locate ();
2301 PluginInsert::monitoring_changed ()
2303 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2304 (*i)->monitoring_changed ();
2309 PluginInsert::start_touch (uint32_t param_id)
2311 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id));
2313 ac->start_touch (session().audible_frame());
2318 PluginInsert::end_touch (uint32_t param_id)
2320 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id));
2322 ac->stop_touch (true, session().audible_frame());
2326 std::ostream& operator<<(std::ostream& o, const ARDOUR::PluginInsert::Match& m)
2329 case PluginInsert::Impossible: o << "Impossible"; break;
2330 case PluginInsert::Delegate: o << "Delegate"; break;
2331 case PluginInsert::NoInputs: o << "NoInputs"; break;
2332 case PluginInsert::ExactMatch: o << "ExactMatch"; break;
2333 case PluginInsert::Replicate: o << "Replicate"; break;
2334 case PluginInsert::Split: o << "Split"; break;
2335 case PluginInsert::Hide: o << "Hide"; break;
2337 o << " cnt: " << m.plugins
2338 << (m.strict_io ? " strict-io" : "")
2339 << (m.custom_cfg ? " custom-cfg" : "");
2340 if (m.method == PluginInsert::Hide) {
2341 o << " hide: " << m.hide;