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 // TODO: atomically copy maps & _no_inplace
472 PinMappings in_map (_in_map);
473 PinMappings out_map (_out_map);
474 if (_mapping_changed) {
475 _no_inplace = check_inplace ();
476 _mapping_changed = false;
480 // TODO optimize special case.
481 // Currently this never triggers because the in_map for "Split" triggeres no_inplace.
482 if (_match.method == Split && !_no_inplace) {
483 assert (in_map.size () == 1);
484 in_map[0] = ChanMapping (ChanCount::max (natural_input_streams (), _configured_in)); // no sidechain
485 ChanCount const in_streams = internal_input_streams ();
486 /* copy the first stream's audio buffer contents to the others */
488 uint32_t first_idx = in_map[0].get (DataType::AUDIO, 0, &valid);
490 for (uint32_t i = in_streams.n_audio(); i < natural_input_streams().n_audio(); ++i) {
491 uint32_t idx = in_map[0].get (DataType::AUDIO, i, &valid);
493 bufs.get_audio(idx).read_from(bufs.get_audio(first_idx), nframes, offset, offset);
500 bufs.set_count(ChanCount::max(bufs.count(), _configured_internal));
501 bufs.set_count(ChanCount::max(bufs.count(), _configured_out));
507 for (Controls::iterator li = controls().begin(); li != controls().end(); ++li, ++n) {
509 boost::shared_ptr<AutomationControl> c
510 = boost::dynamic_pointer_cast<AutomationControl>(li->second);
512 if (c->list() && c->automation_playback()) {
515 const float val = c->list()->rt_safe_eval (now, valid);
518 /* This is the ONLY place where we are
520 * AutomationControl::set_value_unchecked(). We
521 * know that the control is in
522 * automation playback mode, so no
523 * check on writable() is required
524 * (which must be done in AutomationControl::set_value()
527 c->set_value_unchecked(val);
534 /* Calculate if, and how many frames we need to collect for analysis */
535 framecnt_t collect_signal_nframes = (_signal_analysis_collect_nframes_max -
536 _signal_analysis_collected_nframes);
537 if (nframes < collect_signal_nframes) { // we might not get all frames now
538 collect_signal_nframes = nframes;
541 if (collect_signal_nframes > 0) {
543 //std::cerr << "collect input, bufs " << bufs.count().n_audio() << " count, " << bufs.available().n_audio() << " available" << std::endl;
544 //std::cerr << " streams " << internal_input_streams().n_audio() << std::endl;
545 //std::cerr << "filling buffer with " << collect_signal_nframes << " frames at " << _signal_analysis_collected_nframes << std::endl;
547 _signal_analysis_inputs.set_count(internal_input_streams());
549 for (uint32_t i = 0; i < internal_input_streams().n_audio(); ++i) {
550 _signal_analysis_inputs.get_audio(i).read_from(
552 collect_signal_nframes,
553 _signal_analysis_collected_nframes); // offset is for target buffer
558 if (is_channelstrip ()) {
559 if (_configured_in.n_audio() > 0) {
560 ChanMapping mb_in_map (ChanCount::min (_configured_in, ChanCount (DataType::AUDIO, 2)));
561 ChanMapping mb_out_map (ChanCount::min (_configured_out, ChanCount (DataType::AUDIO, 2)));
563 _plugins.front()->connect_and_run (bufs, mb_in_map, mb_out_map, nframes, offset);
565 for (uint32_t out = _configured_in.n_audio (); out < bufs.count().get (DataType::AUDIO); ++out) {
566 bufs.get (DataType::AUDIO, out).silence (nframes, offset);
572 BufferSet& inplace_bufs = _session.get_noinplace_buffers();
573 ARDOUR::ChanMapping used_outputs;
576 // TODO optimize this flow. prepare during configure_io()
577 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
579 ARDOUR::ChanMapping i_in_map (natural_input_streams());
580 ARDOUR::ChanMapping i_out_map;
581 ARDOUR::ChanCount mapped;
582 ARDOUR::ChanCount backmap;
584 // map inputs sequentially
585 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
586 for (uint32_t in = 0; in < natural_input_streams().get (*t); ++in) {
588 uint32_t in_idx = in_map[pc].get (*t, in, &valid);
589 uint32_t m = mapped.get (*t);
591 inplace_bufs.get (*t, m).read_from (bufs.get (*t, in_idx), nframes, offset, offset);
593 inplace_bufs.get (*t, m).silence (nframes, offset);
595 mapped.set (*t, m + 1);
599 // TODO use map_offset_to() instead ??
603 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
604 for (uint32_t out = 0; out < natural_output_streams().get (*t); ++out) {
605 uint32_t m = mapped.get (*t);
606 inplace_bufs.get (*t, m).silence (nframes, offset);
607 i_out_map.set (*t, out, m);
608 mapped.set (*t, m + 1);
612 if ((*i)->connect_and_run(inplace_bufs, i_in_map, i_out_map, nframes, offset)) {
617 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
618 for (uint32_t out = 0; out < natural_output_streams().get (*t); ++out) {
619 uint32_t m = backmap.get (*t);
621 uint32_t out_idx = out_map[pc].get (*t, out, &valid);
623 bufs.get (*t, out_idx).read_from (inplace_bufs.get (*t, m), nframes, offset, offset);
624 used_outputs.set (*t, out_idx, 1); // mark as used
626 backmap.set (*t, m + 1);
630 /* all instances have completed, now clear outputs that have not been written to.
631 * (except midi bypass)
633 if (has_midi_bypass ()) {
634 used_outputs.set (DataType::MIDI, 0, 1); // Midi bypass.
636 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
637 for (uint32_t out = 0; out < bufs.count().get (*t); ++out) {
639 used_outputs.get (*t, out, &valid);
640 if (valid) { continue; }
641 bufs.get (*t, out).silence (nframes, offset);
647 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
648 if ((*i)->connect_and_run(bufs, in_map[pc], out_map[pc], nframes, offset)) {
653 // TODO optimize: store "unconnected" in a fixed set.
654 // it only changes on reconfiguration.
655 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
656 for (uint32_t out = 0; out < bufs.count().get (*t); ++out) {
658 if (*t == DataType::MIDI && out == 0 && has_midi_bypass ()) {
659 mapped = true; // in-place Midi bypass
661 for (uint32_t pc = 0; pc < get_count() && !mapped; ++pc) {
662 for (uint32_t o = 0; o < natural_output_streams().get (*t); ++o) {
664 uint32_t idx = out_map[pc].get (*t, o, &valid);
665 if (valid && idx == out) {
672 bufs.get (*t, out).silence (nframes, offset);
678 if (collect_signal_nframes > 0) {
680 //std::cerr << " output, bufs " << bufs.count().n_audio() << " count, " << bufs.available().n_audio() << " available" << std::endl;
681 //std::cerr << " streams " << internal_output_streams().n_audio() << std::endl;
683 _signal_analysis_outputs.set_count(internal_output_streams());
685 for (uint32_t i = 0; i < internal_output_streams().n_audio(); ++i) {
686 _signal_analysis_outputs.get_audio(i).read_from(
688 collect_signal_nframes,
689 _signal_analysis_collected_nframes); // offset is for target buffer
692 _signal_analysis_collected_nframes += collect_signal_nframes;
693 assert(_signal_analysis_collected_nframes <= _signal_analysis_collect_nframes_max);
695 if (_signal_analysis_collected_nframes == _signal_analysis_collect_nframes_max) {
696 _signal_analysis_collect_nframes_max = 0;
697 _signal_analysis_collected_nframes = 0;
699 AnalysisDataGathered(&_signal_analysis_inputs,
700 &_signal_analysis_outputs);
706 PluginInsert::silence (framecnt_t nframes)
712 ChanMapping in_map (natural_input_streams ());
713 ChanMapping out_map (natural_output_streams ());
715 // TODO run sidechain (delaylines)
716 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
717 (*i)->connect_and_run (_session.get_scratch_buffers ((*i)->get_info()->n_inputs, true), in_map, out_map, nframes, 0);
722 PluginInsert::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool)
724 if (_pending_active) {
725 /* run as normal if we are active or moving from inactive to active */
728 // collect sidechain input for complete cycle (!)
729 // TODO we need delaylines here for latency compensation
730 _sidechain->run (bufs, start_frame, end_frame, nframes, true);
733 if (_session.transport_rolling() || _session.bounce_processing()) {
734 automation_run (bufs, start_frame, nframes);
736 connect_and_run (bufs, nframes, 0, false);
740 // TODO use mapping in bypassed mode ?!
741 // -> do we bypass the processor or the plugin
743 // TODO include sidechain??
745 uint32_t in = input_streams ().n_audio ();
746 uint32_t out = output_streams().n_audio ();
748 if (has_no_audio_inputs() || in == 0) {
750 /* silence all (audio) outputs. Should really declick
751 * at the transitions of "active"
754 for (uint32_t n = 0; n < out; ++n) {
755 bufs.get_audio (n).silence (nframes);
758 } else if (out > in) {
760 /* not active, but something has make up for any channel count increase
761 * for now , simply replicate last buffer
763 for (uint32_t n = in; n < out; ++n) {
764 bufs.get_audio(n).read_from(bufs.get_audio(in - 1), nframes);
768 bufs.count().set_audio (out);
771 _active = _pending_active;
773 /* we have no idea whether the plugin generated silence or not, so mark
774 * all buffers appropriately.
779 PluginInsert::automation_run (BufferSet& bufs, framepos_t start, pframes_t nframes)
781 Evoral::ControlEvent next_event (0, 0.0f);
782 framepos_t now = start;
783 framepos_t end = now + nframes;
784 framecnt_t offset = 0;
786 Glib::Threads::Mutex::Lock lm (control_lock(), Glib::Threads::TRY_LOCK);
789 connect_and_run (bufs, nframes, offset, false);
793 if (!find_next_event (now, end, next_event) || _plugins.front()->requires_fixed_sized_buffers()) {
795 /* no events have a time within the relevant range */
797 connect_and_run (bufs, nframes, offset, true, now);
803 framecnt_t cnt = min (((framecnt_t) ceil (next_event.when) - now), (framecnt_t) nframes);
805 connect_and_run (bufs, cnt, offset, true, now);
811 if (!find_next_event (now, end, next_event)) {
816 /* cleanup anything that is left to do */
819 connect_and_run (bufs, nframes, offset, true, now);
824 PluginInsert::default_parameter_value (const Evoral::Parameter& param)
826 if (param.type() != PluginAutomation)
829 if (_plugins.empty()) {
830 fatal << _("programming error: ") << X_("PluginInsert::default_parameter_value() called with no plugin")
832 abort(); /*NOTREACHED*/
835 return _plugins[0]->default_value (param.id());
840 PluginInsert::can_reset_all_parameters ()
844 for (uint32_t par = 0; par < _plugins[0]->parameter_count(); ++par) {
846 const uint32_t cid = _plugins[0]->nth_parameter (par, ok);
848 if (!ok || !_plugins[0]->parameter_is_input(cid)) {
852 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, cid));
858 if (ac->automation_state() & Play) {
863 return all && (params > 0);
867 PluginInsert::reset_parameters_to_default ()
871 for (uint32_t par = 0; par < _plugins[0]->parameter_count(); ++par) {
873 const uint32_t cid = _plugins[0]->nth_parameter (par, ok);
875 if (!ok || !_plugins[0]->parameter_is_input(cid)) {
879 const float dflt = _plugins[0]->default_value (cid);
880 const float curr = _plugins[0]->get_parameter (cid);
886 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, cid));
891 if (ac->automation_state() & Play) {
896 ac->set_value (dflt, Controllable::NoGroup);
901 boost::shared_ptr<Plugin>
902 PluginInsert::plugin_factory (boost::shared_ptr<Plugin> other)
904 boost::shared_ptr<LadspaPlugin> lp;
905 boost::shared_ptr<LuaProc> lua;
907 boost::shared_ptr<LV2Plugin> lv2p;
909 #ifdef WINDOWS_VST_SUPPORT
910 boost::shared_ptr<WindowsVSTPlugin> vp;
913 boost::shared_ptr<LXVSTPlugin> lxvp;
915 #ifdef AUDIOUNIT_SUPPORT
916 boost::shared_ptr<AUPlugin> ap;
919 if ((lp = boost::dynamic_pointer_cast<LadspaPlugin> (other)) != 0) {
920 return boost::shared_ptr<Plugin> (new LadspaPlugin (*lp));
921 } else if ((lua = boost::dynamic_pointer_cast<LuaProc> (other)) != 0) {
922 return boost::shared_ptr<Plugin> (new LuaProc (*lua));
924 } else if ((lv2p = boost::dynamic_pointer_cast<LV2Plugin> (other)) != 0) {
925 return boost::shared_ptr<Plugin> (new LV2Plugin (*lv2p));
927 #ifdef WINDOWS_VST_SUPPORT
928 } else if ((vp = boost::dynamic_pointer_cast<WindowsVSTPlugin> (other)) != 0) {
929 return boost::shared_ptr<Plugin> (new WindowsVSTPlugin (*vp));
932 } else if ((lxvp = boost::dynamic_pointer_cast<LXVSTPlugin> (other)) != 0) {
933 return boost::shared_ptr<Plugin> (new LXVSTPlugin (*lxvp));
935 #ifdef AUDIOUNIT_SUPPORT
936 } else if ((ap = boost::dynamic_pointer_cast<AUPlugin> (other)) != 0) {
937 return boost::shared_ptr<Plugin> (new AUPlugin (*ap));
941 fatal << string_compose (_("programming error: %1"),
942 X_("unknown plugin type in PluginInsert::plugin_factory"))
944 abort(); /*NOTREACHED*/
945 return boost::shared_ptr<Plugin> ((Plugin*) 0);
949 PluginInsert::set_input_map (uint32_t num, ChanMapping m) {
950 if (num < _in_map.size()) {
951 bool changed = _in_map[num] != m;
955 PluginMapChanged (); /* EMIT SIGNAL */
956 _mapping_changed = true;
962 PluginInsert::set_output_map (uint32_t num, ChanMapping m) {
963 if (num < _out_map.size()) {
964 bool changed = _out_map[num] != m;
968 PluginMapChanged (); /* EMIT SIGNAL */
969 _mapping_changed = true;
975 PluginInsert::input_map () const
979 for (PinMappings::const_iterator i = _in_map.begin (); i != _in_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_input_streams().get(tm->first), i->second);
992 PluginInsert::output_map () const
996 for (PinMappings::const_iterator i = _out_map.begin (); i != _out_map.end (); ++i, ++pc) {
997 ChanMapping m (i->second);
998 const ChanMapping::Mappings& mp ((*i).second.mappings());
999 for (ChanMapping::Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
1000 for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
1001 rv.set (tm->first, i->first + pc * natural_output_streams().get(tm->first), i->second);
1005 if (has_midi_bypass ()) {
1006 rv.set (DataType::MIDI, 0, 0);
1013 PluginInsert::has_midi_bypass () const
1015 if (_configured_in.n_midi () == 1 && _configured_out.n_midi () == 1
1016 && natural_output_streams ().n_midi () == 0) {
1023 PluginInsert::has_midi_thru () const
1025 if (_configured_in.n_midi () == 1 && _configured_out.n_midi () == 1
1026 && natural_input_streams ().n_midi () == 0 && natural_output_streams ().n_midi () == 0) {
1034 PluginInsert::is_channelstrip () const {
1035 return _plugins.front()->is_channelstrip();
1040 PluginInsert::check_inplace ()
1042 // auto-detect if inplace processing is possible
1043 bool inplace_ok = true;
1044 for (uint32_t pc = 0; pc < get_count() && inplace_ok ; ++pc) {
1045 if (!_in_map[pc].is_monotonic ()) {
1048 if (!_out_map[pc].is_monotonic ()) {
1052 bool no_inplace = !inplace_ok || _plugins.front()->inplace_broken ();
1053 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1 %2\n", name(), no_inplace ? "No Inplace Processing" : "In-Place"));
1058 PluginInsert::sanitize_maps ()
1060 bool changed = false;
1061 /* strip dead wood */
1062 PinMappings new_ins;
1063 PinMappings new_outs;
1064 for (uint32_t pc = 0; pc < get_count(); ++pc) {
1066 ChanMapping new_out;
1067 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1068 for (uint32_t i = 0; i < natural_input_streams().get (*t); ++i) {
1070 uint32_t idx = _in_map[pc].get (*t, i, &valid);
1071 if (valid && idx < _configured_internal.get (*t)) {
1072 new_in.set (*t, i, idx);
1075 for (uint32_t o = 0; o < natural_output_streams().get (*t); ++o) {
1077 uint32_t idx = _out_map[pc].get (*t, o, &valid);
1078 if (valid && idx < _configured_out.get (*t)) {
1079 new_out.set (*t, o, idx);
1083 if (_in_map[pc] != new_in || _out_map[pc] != new_out) {
1086 new_ins[pc] = new_in;
1087 new_outs[pc] = new_out;
1089 /* prevent dup output assignments */
1090 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1091 for (uint32_t o = 0; o < _configured_out.get (*t); ++o) {
1092 bool mapped = false;
1093 for (uint32_t pc = 0; pc < get_count(); ++pc) {
1095 uint32_t idx = new_outs[pc].get_src (*t, o, &valid);
1096 if (valid && mapped) {
1097 new_outs[pc].unset (*t, idx);
1105 if (_in_map != new_ins || _out_map != new_outs) {
1109 _out_map = new_outs;
1115 PluginInsert::reset_map (bool emit)
1118 const PinMappings old_in (_in_map);
1119 const PinMappings old_out (_out_map);
1123 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
1124 ChanCount ns_inputs = natural_input_streams() - sidechain_input_pins ();
1125 if (_match.method == Split) {
1126 _in_map[pc] = ChanMapping ();
1127 /* connect no sidechain sinks in round-robin fashion */
1128 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1129 const uint32_t cend = _configured_in.get (*t);
1130 if (cend == 0) { continue; }
1132 for (uint32_t in = 0; in < ns_inputs.get (*t); ++in) {
1133 _in_map[pc].set (*t, in, c);
1138 _in_map[pc] = ChanMapping (ChanCount::min (ns_inputs, _configured_in));
1140 _out_map[pc] = ChanMapping (ChanCount::min (natural_output_streams(), _configured_out));
1142 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1143 const uint32_t nis = natural_input_streams ().get(*t);
1144 const uint32_t stride = nis - sidechain_input_pins().get (*t);
1145 _in_map[pc].offset_to(*t, stride * pc);
1146 _out_map[pc].offset_to(*t, pc * natural_output_streams().get(*t));
1148 // connect side-chains
1149 const uint32_t sc_start = _configured_in.get (*t);
1150 const uint32_t sc_len = _configured_internal.get (*t) - sc_start;
1151 if (sc_len == 0) { continue; }
1153 for (uint32_t in = ns_inputs.get (*t); in < nis; ++in) {
1154 _in_map[pc].set (*t, in, sc_start + c);
1155 c = (c + 1) % sc_len;
1160 if (old_in == _in_map && old_out == _out_map) {
1164 PluginMapChanged (); /* EMIT SIGNAL */
1165 _mapping_changed = true;
1171 PluginInsert::configure_io (ChanCount in, ChanCount out)
1173 Match old_match = _match;
1175 ChanCount old_internal;
1179 old_in = _configured_in;
1180 old_internal = _configured_internal;
1181 old_out = _configured_out;
1184 _configured_in = in;
1185 _configured_internal = in;
1186 _configured_out = out;
1189 /* TODO hide midi-bypass, and custom outs. Best /fake/ "out" here.
1190 * (currently _sidechain->configure_io always succeeds
1191 * since Processor::configure_io() succeeds)
1193 if (!_sidechain->configure_io (in, out)) {
1194 DEBUG_TRACE (DEBUG::ChanMapping, "Sidechain configuration failed\n");
1197 _configured_internal += _sidechain->input()->n_ports();
1200 /* get plugin configuration */
1201 _match = private_can_support_io_configuration (in, out);
1203 if (DEBUG_ENABLED(DEBUG::ChanMapping)) {
1205 DEBUG_STR_APPEND(a, string_compose ("Match '%1': ", name()));
1206 DEBUG_STR_APPEND(a, _match);
1207 DEBUG_TRACE (DEBUG::ChanMapping, DEBUG_STR(a).str());
1211 /* set the matching method and number of plugins that we will use to meet this configuration */
1212 if (set_count (_match.plugins) == false) {
1213 PluginIoReConfigure (); /* EMIT SIGNAL */
1214 _configured = false;
1218 /* configure plugins */
1219 switch (_match.method) {
1222 if (_plugins.front()->configure_io (natural_input_streams(), out) == false) {
1223 PluginIoReConfigure (); /* EMIT SIGNAL */
1224 _configured = false;
1232 bool const r = _plugins.front()->can_support_io_configuration (in, dout, &useins);
1234 assert (_match.strict_io || dout.n_audio() == out.n_audio()); // sans midi bypass
1235 if (useins.n_audio() == 0) {
1238 if (_plugins.front()->configure_io (useins, dout) == false) {
1239 PluginIoReConfigure (); /* EMIT SIGNAL */
1240 _configured = false;
1246 if (_plugins.front()->configure_io (in, out) == false) {
1247 PluginIoReConfigure (); /* EMIT SIGNAL */
1248 _configured = false;
1254 bool mapping_changed = false;
1255 if (old_in == in && old_out == out
1257 && old_match.method == _match.method
1258 && _in_map.size() == _out_map.size()
1259 && _in_map.size() == get_count ()
1261 /* If the configuration has not changed, keep the mapping */
1262 if (old_internal != _configured_internal) {
1263 mapping_changed = sanitize_maps ();
1265 } else if (_match.custom_cfg && _configured) {
1266 mapping_changed = sanitize_maps ();
1269 if (is_channelstrip ()) { _maps_from_state = false; }
1271 if (_maps_from_state) {
1272 _maps_from_state = false;
1273 mapping_changed = true;
1276 /* generate a new mapping */
1277 mapping_changed = reset_map (false);
1281 if (mapping_changed) {
1282 PluginMapChanged (); /* EMIT SIGNAL */
1285 if (DEBUG_ENABLED(DEBUG::ChanMapping)) {
1288 DEBUG_STR_APPEND(a, "\n--------<<--------\n");
1289 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
1291 DEBUG_STR_APPEND(a, "----><----\n");
1293 DEBUG_STR_APPEND(a, string_compose ("Channel Map for %1 plugin %2\n", name(), pc));
1294 DEBUG_STR_APPEND(a, " * Inputs:\n");
1295 DEBUG_STR_APPEND(a, _in_map[pc]);
1296 DEBUG_STR_APPEND(a, " * Outputs:\n");
1297 DEBUG_STR_APPEND(a, _out_map[pc]);
1299 DEBUG_STR_APPEND(a, "-------->>--------\n");
1300 DEBUG_TRACE (DEBUG::ChanMapping, DEBUG_STR(a).str());
1305 _no_inplace = check_inplace ();
1306 _mapping_changed = false;
1307 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1 %2\n", name(), _no_inplace ? "No Inplace Processing" : "In-Place"));
1309 if (old_in != in || old_out != out || old_internal != _configured_internal
1310 || (old_match.method != _match.method && (old_match.method == Split || _match.method == Split))
1312 PluginIoReConfigure (); /* EMIT SIGNAL */
1315 // we don't know the analysis window size, so we must work with the
1316 // current buffer size here. each request for data fills in these
1317 // buffers and the analyser makes sure it gets enough data for the
1319 session().ensure_buffer_set (_signal_analysis_inputs, in);
1320 //_signal_analysis_inputs.set_count (in);
1322 session().ensure_buffer_set (_signal_analysis_outputs, out);
1323 //_signal_analysis_outputs.set_count (out);
1325 // std::cerr << "set counts to i" << in.n_audio() << "/o" << out.n_audio() << std::endl;
1328 return Processor::configure_io (in, out);
1331 /** Decide whether this PluginInsert can support a given IO configuration.
1332 * To do this, we run through a set of possible solutions in rough order of
1335 * @param in Required input channel count.
1336 * @param out Filled in with the output channel count if we return true.
1337 * @return true if the given IO configuration can be supported.
1340 PluginInsert::can_support_io_configuration (const ChanCount& in, ChanCount& out)
1343 _sidechain->can_support_io_configuration (in, out); // never fails, sets "out"
1345 return private_can_support_io_configuration (in, out).method != Impossible;
1348 /** A private version of can_support_io_configuration which returns the method
1349 * by which the configuration can be matched, rather than just whether or not
1353 PluginInsert::private_can_support_io_configuration (ChanCount const & inx, ChanCount& out) const
1355 if (_plugins.empty()) {
1360 if (is_channelstrip ()) {
1362 return Match (ExactMatch, 1);
1366 /* if a user specified a custom cfg, so be it. */
1369 return Match (ExactMatch, get_count(), _strict_io, true); // XXX
1372 /* try automatic configuration */
1373 Match m = PluginInsert::automatic_can_support_io_configuration (inx, out);
1375 PluginInfoPtr info = _plugins.front()->get_info();
1376 ChanCount inputs = info->n_inputs;
1377 ChanCount outputs = info->n_outputs;
1379 /* handle case strict-i/o */
1380 if (_strict_io && m.method != Impossible) {
1383 /* special case MIDI instruments */
1384 if (is_midi_instrument()) {
1385 // output = midi-bypass + at most master-out channels.
1386 ChanCount max_out (DataType::AUDIO, 2); // TODO use master-out
1387 max_out.set (DataType::MIDI, out.get(DataType::MIDI));
1388 out = ChanCount::min (out, max_out);
1389 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("special case strict-i/o instrument: %1\n", name()));
1395 if (inx.n_audio () != out.n_audio ()) { // ignore midi bypass
1396 /* replicate processor to match output count (generators and such)
1397 * at least enough to feed every output port. */
1398 uint32_t f = 1; // at least one. e.g. control data filters, no in, no out.
1399 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1400 uint32_t nout = outputs.get (*t);
1401 if (nout == 0 || inx.get(*t) == 0) { continue; }
1402 f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nout));
1405 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("special case strict-i/o generator: %1\n", name()));
1406 return Match (Replicate, f, _strict_io);
1417 if (m.method != Impossible) {
1421 ChanCount ns_inputs = inputs - sidechain_input_pins ();
1423 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("resolving 'Impossible' match for %1\n", name()));
1425 if (info->reconfigurable_io()) {
1427 // TODO add sidechains here
1428 bool const r = _plugins.front()->can_support_io_configuration (inx, out, &useins);
1430 // houston, we have a problem.
1431 return Match (Impossible, 0);
1433 return Match (Delegate, 1, _strict_io);
1436 ChanCount midi_bypass;
1437 if (inx.get(DataType::MIDI) == 1 && outputs.get(DataType::MIDI) == 0) {
1438 midi_bypass.set (DataType::MIDI, 1);
1441 // add at least as many plugins so that output count matches input count (w/o sidechain pins)
1443 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1444 uint32_t nin = ns_inputs.get (*t);
1445 uint32_t nout = outputs.get (*t);
1446 if (nin == 0 || inx.get(*t) == 0) { continue; }
1447 // prefer floor() so the count won't overly increase IFF (nin < nout)
1448 f = max (f, (uint32_t) floor (inx.get(*t) / (float)nout));
1450 if (f > 0 && outputs * f >= _configured_out) {
1451 out = outputs * f + midi_bypass;
1452 return Match (Replicate, f, _strict_io);
1455 // add at least as many plugins needed to connect all inputs (w/o sidechain pins)
1457 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1458 uint32_t nin = ns_inputs.get (*t);
1459 if (nin == 0 || inx.get(*t) == 0) { continue; }
1460 f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nin));
1463 out = outputs * f + midi_bypass;
1464 return Match (Replicate, f, _strict_io);
1467 // add at least as many plugins needed to connect all inputs
1469 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1470 uint32_t nin = inputs.get (*t);
1471 if (nin == 0 || inx.get(*t) == 0) { continue; }
1472 f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nin));
1474 out = outputs * f + midi_bypass;
1475 return Match (Replicate, f, _strict_io);
1478 /* this is the original Ardour 3/4 behavior, mainly for backwards compatibility */
1480 PluginInsert::automatic_can_support_io_configuration (ChanCount const & inx, ChanCount& out) const
1482 if (_plugins.empty()) {
1486 PluginInfoPtr info = _plugins.front()->get_info();
1487 ChanCount in; in += inx;
1488 ChanCount midi_bypass;
1490 if (info->reconfigurable_io()) {
1491 /* Plugin has flexible I/O, so delegate to it */
1492 bool const r = _plugins.front()->can_support_io_configuration (in, out);
1494 return Match (Impossible, 0);
1496 return Match (Delegate, 1);
1499 ChanCount inputs = info->n_inputs;
1500 ChanCount outputs = info->n_outputs;
1501 ChanCount ns_inputs = inputs - sidechain_input_pins ();
1503 if (in.get(DataType::MIDI) == 1 && outputs.get(DataType::MIDI) == 0) {
1504 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("bypassing midi-data around %1\n", name()));
1505 midi_bypass.set (DataType::MIDI, 1);
1507 if (in.get(DataType::MIDI) == 1 && inputs.get(DataType::MIDI) == 0) {
1508 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("hiding midi-port from plugin %1\n", name()));
1509 in.set(DataType::MIDI, 0);
1512 // add internally provided sidechain ports
1513 ChanCount insc = in + sidechain_input_ports ();
1515 bool no_inputs = true;
1516 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1517 if (inputs.get (*t) != 0) {
1524 /* no inputs so we can take any input configuration since we throw it away */
1525 out = outputs + midi_bypass;
1526 return Match (NoInputs, 1);
1529 /* Plugin inputs match requested inputs + side-chain-ports exactly */
1530 if (inputs == insc) {
1531 out = outputs + midi_bypass;
1532 return Match (ExactMatch, 1);
1535 /* Plugin inputs matches without side-chain-pins */
1536 if (ns_inputs == in) {
1537 out = outputs + midi_bypass;
1538 return Match (ExactMatch, 1);
1541 /* We may be able to run more than one copy of the plugin within this insert
1542 to cope with the insert having more inputs than the plugin.
1543 We allow replication only for plugins with either zero or 1 inputs and outputs
1544 for every valid data type.
1548 bool can_replicate = true;
1549 for (DataType::iterator t = DataType::begin(); t != DataType::end() && can_replicate; ++t) {
1551 // ignore side-chains
1552 uint32_t nin = ns_inputs.get (*t);
1554 // No inputs of this type
1555 if (nin == 0 && in.get(*t) == 0) {
1559 if (nin != 1 || outputs.get (*t) != 1) {
1560 can_replicate = false;
1564 // Potential factor not set yet
1566 f = in.get(*t) / nin;
1569 // Factor for this type does not match another type, can not replicate
1570 if (f != (in.get(*t) / nin)) {
1571 can_replicate = false;
1576 if (can_replicate && f > 0) {
1577 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1578 out.set (*t, outputs.get(*t) * f);
1581 return Match (Replicate, f);
1584 /* If the processor has exactly one input of a given type, and
1585 the plugin has more, we can feed the single processor input
1586 to some or all of the plugin inputs. This is rather
1587 special-case-y, but the 1-to-many case is by far the
1588 simplest. How do I split thy 2 processor inputs to 3
1589 plugin inputs? Let me count the ways ...
1592 bool can_split = true;
1593 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1595 bool const can_split_type = (in.get (*t) == 1 && ns_inputs.get (*t) > 1);
1596 bool const nothing_to_do_for_type = (in.get (*t) == 0 && inputs.get (*t) == 0);
1598 if (!can_split_type && !nothing_to_do_for_type) {
1604 out = outputs + midi_bypass;
1605 return Match (Split, 1);
1608 /* If the plugin has more inputs than we want, we can `hide' some of them
1609 by feeding them silence.
1612 bool could_hide = false;
1613 bool cannot_hide = false;
1614 ChanCount hide_channels;
1616 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1617 if (inputs.get(*t) > in.get(*t)) {
1618 /* there is potential to hide, since the plugin has more inputs of type t than the insert */
1619 hide_channels.set (*t, inputs.get(*t) - in.get(*t));
1621 } else if (inputs.get(*t) < in.get(*t)) {
1622 /* we definitely cannot hide, since the plugin has fewer inputs of type t than the insert */
1627 if (could_hide && !cannot_hide) {
1628 out = outputs + midi_bypass;
1629 return Match (Hide, 1, false, false, hide_channels);
1632 return Match (Impossible, 0);
1637 PluginInsert::get_state ()
1639 return state (true);
1643 PluginInsert::state (bool full)
1645 XMLNode& node = Processor::state (full);
1647 node.add_property("type", _plugins[0]->state_node_name());
1648 node.add_property("unique-id", _plugins[0]->unique_id());
1649 node.add_property("count", string_compose("%1", _plugins.size()));
1651 /* remember actual i/o configuration (for later placeholder
1652 * in case the plugin goes missing) */
1653 node.add_child_nocopy (* _configured_in.state (X_("ConfiguredInput")));
1654 node.add_child_nocopy (* _configured_out.state (X_("ConfiguredOutput")));
1656 /* save custom i/o config */
1657 node.add_property("custom", _custom_cfg ? "yes" : "no");
1658 for (uint32_t pc = 0; pc < get_count(); ++pc) {
1660 snprintf (tmp, sizeof(tmp), "InputMap-%d", pc);
1661 node.add_child_nocopy (* _in_map[pc].state (tmp));
1662 snprintf (tmp, sizeof(tmp), "OutputMap-%d", pc);
1663 node.add_child_nocopy (* _out_map[pc].state (tmp));
1667 node.add_child_nocopy (_sidechain->state (full));
1670 _plugins[0]->set_insert_id(this->id());
1671 node.add_child_nocopy (_plugins[0]->get_state());
1673 for (Controls::iterator c = controls().begin(); c != controls().end(); ++c) {
1674 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> ((*c).second);
1676 node.add_child_nocopy (ac->get_state());
1684 PluginInsert::set_control_ids (const XMLNode& node, int version)
1686 const XMLNodeList& nlist = node.children();
1687 XMLNodeConstIterator iter;
1688 set<Evoral::Parameter>::const_iterator p;
1690 for (iter = nlist.begin(); iter != nlist.end(); ++iter) {
1691 if ((*iter)->name() == Controllable::xml_node_name) {
1692 const XMLProperty* prop;
1694 uint32_t p = (uint32_t)-1;
1696 if ((prop = (*iter)->property (X_("symbol"))) != 0) {
1697 boost::shared_ptr<LV2Plugin> lv2plugin = boost::dynamic_pointer_cast<LV2Plugin> (_plugins[0]);
1699 p = lv2plugin->port_index(prop->value().c_str());
1703 if (p == (uint32_t)-1 && (prop = (*iter)->property (X_("parameter"))) != 0) {
1704 p = atoi (prop->value());
1707 if (p != (uint32_t)-1) {
1709 /* this may create the new controllable */
1711 boost::shared_ptr<Evoral::Control> c = control (Evoral::Parameter (PluginAutomation, 0, p));
1713 #ifndef NO_PLUGIN_STATE
1717 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> (c);
1719 ac->set_state (**iter, version);
1728 PluginInsert::set_state(const XMLNode& node, int version)
1730 XMLNodeList nlist = node.children();
1731 XMLNodeIterator niter;
1732 XMLPropertyList plist;
1733 const XMLProperty *prop;
1734 ARDOUR::PluginType type;
1736 if ((prop = node.property ("type")) == 0) {
1737 error << _("XML node describing plugin is missing the `type' field") << endmsg;
1741 if (prop->value() == X_("ladspa") || prop->value() == X_("Ladspa")) { /* handle old school sessions */
1742 type = ARDOUR::LADSPA;
1743 } else if (prop->value() == X_("lv2")) {
1745 } else if (prop->value() == X_("windows-vst")) {
1746 type = ARDOUR::Windows_VST;
1747 } else if (prop->value() == X_("lxvst")) {
1748 type = ARDOUR::LXVST;
1749 } else if (prop->value() == X_("audiounit")) {
1750 type = ARDOUR::AudioUnit;
1751 } else if (prop->value() == X_("luaproc")) {
1754 error << string_compose (_("unknown plugin type %1 in plugin insert state"),
1760 prop = node.property ("unique-id");
1763 #ifdef WINDOWS_VST_SUPPORT
1764 /* older sessions contain VST plugins with only an "id" field.
1767 if (type == ARDOUR::Windows_VST) {
1768 prop = node.property ("id");
1772 #ifdef LXVST_SUPPORT
1773 /*There shouldn't be any older sessions with linuxVST support.. but anyway..*/
1775 if (type == ARDOUR::LXVST) {
1776 prop = node.property ("id");
1782 error << _("Plugin has no unique ID field") << endmsg;
1787 boost::shared_ptr<Plugin> plugin = find_plugin (_session, prop->value(), type);
1789 /* treat linux and windows VST plugins equivalent if they have the same uniqueID
1790 * allow to move sessions windows <> linux */
1791 #ifdef LXVST_SUPPORT
1792 if (plugin == 0 && type == ARDOUR::Windows_VST) {
1793 type = ARDOUR::LXVST;
1794 plugin = find_plugin (_session, prop->value(), type);
1798 #ifdef WINDOWS_VST_SUPPORT
1799 if (plugin == 0 && type == ARDOUR::LXVST) {
1800 type = ARDOUR::Windows_VST;
1801 plugin = find_plugin (_session, prop->value(), type);
1806 error << string_compose(
1807 _("Found a reference to a plugin (\"%1\") that is unknown.\n"
1808 "Perhaps it was removed or moved since it was last used."),
1814 if (type == ARDOUR::Lua) {
1815 XMLNode *ls = node.child (plugin->state_node_name().c_str());
1816 // we need to load the script to set the name and parameters.
1817 boost::shared_ptr<LuaProc> lp = boost::dynamic_pointer_cast<LuaProc>(plugin);
1819 lp->set_script_from_state (*ls);
1823 // The name of the PluginInsert comes from the plugin, nothing else
1824 _name = plugin->get_info()->name;
1828 // Processor::set_state() will set this, but too late
1829 // for it to be available when setting up plugin
1830 // state. We can't call Processor::set_state() until
1831 // the plugins themselves are created and added.
1835 if (_plugins.empty()) {
1836 /* if we are adding the first plugin, we will need to set
1837 up automatable controls.
1839 add_plugin (plugin);
1840 create_automatable_parameters ();
1841 set_control_ids (node, version);
1844 if ((prop = node.property ("count")) != 0) {
1845 sscanf (prop->value().c_str(), "%u", &count);
1848 if (_plugins.size() != count) {
1849 for (uint32_t n = 1; n < count; ++n) {
1850 add_plugin (plugin_factory (plugin));
1854 Processor::set_state (node, version);
1856 PBD::ID new_id = this->id();
1857 PBD::ID old_id = this->id();
1859 if ((prop = node.property ("id")) != 0) {
1860 old_id = prop->value ();
1863 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1865 /* find the node with the type-specific node name ("lv2", "ladspa", etc)
1866 and set all plugins to the same state.
1869 if ((*niter)->name() == plugin->state_node_name()) {
1871 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1872 /* Plugin state can include external files which are named after the ID.
1874 * If regenerate_xml_or_string_ids() is set, the ID will already have
1875 * been changed, so we need to use the old ID from the XML to load the
1876 * state and then update the ID.
1878 * When copying a plugin-state, route_ui takes care of of updating the ID,
1879 * but we need to call set_insert_id() to clear the cached plugin-state
1880 * and force a change.
1882 if (!regenerate_xml_or_string_ids ()) {
1883 (*i)->set_insert_id (new_id);
1885 (*i)->set_insert_id (old_id);
1888 (*i)->set_state (**niter, version);
1890 if (regenerate_xml_or_string_ids ()) {
1891 (*i)->set_insert_id (new_id);
1899 if (version < 3000) {
1901 /* Only 2.X sessions need a call to set_parameter_state() - in 3.X and above
1902 this is all handled by Automatable
1905 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1906 if ((*niter)->name() == "Redirect") {
1907 /* XXX do we need to tackle placement? i think not (pd; oct 16 2009) */
1908 Processor::set_state (**niter, version);
1913 set_parameter_state_2X (node, version);
1916 if ((prop = node.property (X_("custom"))) != 0) {
1917 _custom_cfg = string_is_affirmative (prop->value());
1920 // TODO load/add sidechain
1922 uint32_t in_maps = 0;
1923 uint32_t out_maps = 0;
1924 XMLNodeList kids = node.children ();
1925 for (XMLNodeIterator i = kids.begin(); i != kids.end(); ++i) {
1926 if ((*i)->name() == X_("ConfiguredOutput")) {
1927 _custom_out = ChanCount(**i);
1929 if (strncmp ((*i)->name ().c_str(), X_("InputMap-"), 9) == 0) {
1930 long pc = atol (&((*i)->name().c_str()[9]));
1931 if (pc >=0 && pc <= get_count()) {
1932 _in_map[pc] = ChanMapping (**i);
1936 if (strncmp ((*i)->name ().c_str(), X_("OutputMap-"), 10) == 0) {
1937 long pc = atol (&((*i)->name().c_str()[10]));
1938 if (pc >=0 && pc <= get_count()) {
1939 _out_map[pc] = ChanMapping (**i);
1943 if ((*i)->name () == Processor::state_node_name) {
1947 _sidechain->set_state (**i, version);
1951 if (in_maps == out_maps && out_maps >0 && out_maps == get_count()) {
1952 _maps_from_state = true;
1955 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1959 (*i)->deactivate ();
1967 PluginInsert::update_id (PBD::ID id)
1970 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1971 (*i)->set_insert_id (id);
1976 PluginInsert::set_state_dir (const std::string& d)
1978 // state() only saves the state of the first plugin
1979 _plugins[0]->set_state_dir (d);
1983 PluginInsert::set_parameter_state_2X (const XMLNode& node, int version)
1985 XMLNodeList nlist = node.children();
1986 XMLNodeIterator niter;
1988 /* look for port automation node */
1990 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1992 if ((*niter)->name() != port_automation_node_name) {
1998 XMLNodeConstIterator iter;
2003 cnodes = (*niter)->children ("port");
2005 for (iter = cnodes.begin(); iter != cnodes.end(); ++iter){
2009 if ((cprop = child->property("number")) != 0) {
2010 port = cprop->value().c_str();
2012 warning << _("PluginInsert: Auto: no ladspa port number") << endmsg;
2016 sscanf (port, "%" PRIu32, &port_id);
2018 if (port_id >= _plugins[0]->parameter_count()) {
2019 warning << _("PluginInsert: Auto: port id out of range") << endmsg;
2023 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(
2024 control(Evoral::Parameter(PluginAutomation, 0, port_id), true));
2026 if (c && c->alist()) {
2027 if (!child->children().empty()) {
2028 c->alist()->set_state (*child->children().front(), version);
2030 /* In some cases 2.X saves lists with min_yval and max_yval
2031 being FLT_MIN and FLT_MAX respectively. This causes problems
2032 in A3 because these min/max values are used to compute
2033 where GUI control points should be drawn. If we see such
2034 values, `correct' them to the min/max of the appropriate
2038 float min_y = c->alist()->get_min_y ();
2039 float max_y = c->alist()->get_max_y ();
2041 ParameterDescriptor desc;
2042 _plugins.front()->get_parameter_descriptor (port_id, desc);
2044 if (min_y == FLT_MIN) {
2048 if (max_y == FLT_MAX) {
2052 c->alist()->set_yrange (min_y, max_y);
2055 error << string_compose (_("PluginInsert: automatable control %1 not found - ignored"), port_id) << endmsg;
2067 PluginInsert::describe_parameter (Evoral::Parameter param)
2069 if (param.type() == PluginAutomation) {
2070 return _plugins[0]->describe_parameter (param);
2071 } else if (param.type() == PluginPropertyAutomation) {
2072 boost::shared_ptr<AutomationControl> c(automation_control(param));
2073 if (c && !c->desc().label.empty()) {
2074 return c->desc().label;
2077 return Automatable::describe_parameter(param);
2081 PluginInsert::signal_latency() const
2083 if (_user_latency) {
2084 return _user_latency;
2087 return _plugins[0]->signal_latency ();
2091 PluginInsert::type ()
2093 return plugin()->get_info()->type;
2096 PluginInsert::PluginControl::PluginControl (PluginInsert* p,
2097 const Evoral::Parameter& param,
2098 const ParameterDescriptor& desc,
2099 boost::shared_ptr<AutomationList> list)
2100 : AutomationControl (p->session(), param, desc, list, p->describe_parameter(param))
2104 alist()->reset_default (desc.normal);
2106 list->set_interpolation(Evoral::ControlList::Discrete);
2111 set_flags(Controllable::Toggle);
2115 /** @param val `user' value */
2117 PluginInsert::PluginControl::set_value (double user_val, PBD::Controllable::GroupControlDisposition group_override)
2120 _set_value (user_val, group_override);
2124 PluginInsert::PluginControl::set_value_unchecked (double user_val)
2126 /* used only by automation playback */
2127 _set_value (user_val, Controllable::NoGroup);
2131 PluginInsert::PluginControl::_set_value (double user_val, PBD::Controllable::GroupControlDisposition group_override)
2133 /* FIXME: probably should be taking out some lock here.. */
2135 for (Plugins::iterator i = _plugin->_plugins.begin(); i != _plugin->_plugins.end(); ++i) {
2136 (*i)->set_parameter (_list->parameter().id(), user_val);
2139 boost::shared_ptr<Plugin> iasp = _plugin->_impulseAnalysisPlugin.lock();
2141 iasp->set_parameter (_list->parameter().id(), user_val);
2144 AutomationControl::set_value (user_val, group_override);
2148 PluginInsert::PluginControl::catch_up_with_external_value (double user_val)
2150 AutomationControl::set_value (user_val, Controllable::NoGroup);
2154 PluginInsert::PluginControl::get_state ()
2158 XMLNode& node (AutomationControl::get_state());
2159 ss << parameter().id();
2160 node.add_property (X_("parameter"), ss.str());
2162 boost::shared_ptr<LV2Plugin> lv2plugin = boost::dynamic_pointer_cast<LV2Plugin> (_plugin->_plugins[0]);
2164 node.add_property (X_("symbol"), lv2plugin->port_symbol (parameter().id()));
2171 /** @return `user' val */
2173 PluginInsert::PluginControl::get_value () const
2175 boost::shared_ptr<Plugin> plugin = _plugin->plugin (0);
2181 return plugin->get_parameter (_list->parameter().id());
2184 PluginInsert::PluginPropertyControl::PluginPropertyControl (PluginInsert* p,
2185 const Evoral::Parameter& param,
2186 const ParameterDescriptor& desc,
2187 boost::shared_ptr<AutomationList> list)
2188 : AutomationControl (p->session(), param, desc, list)
2192 alist()->set_yrange (desc.lower, desc.upper);
2193 alist()->reset_default (desc.normal);
2197 set_flags(Controllable::Toggle);
2202 PluginInsert::PluginPropertyControl::set_value (double user_val, PBD::Controllable::GroupControlDisposition /* group_override*/)
2205 set_value_unchecked (user_val);
2210 PluginInsert::PluginPropertyControl::set_value_unchecked (double user_val)
2212 /* Old numeric set_value(), coerce to appropriate datatype if possible.
2213 This is lossy, but better than nothing until Ardour's automation system
2214 can handle various datatypes all the way down. */
2215 const Variant value(_desc.datatype, user_val);
2216 if (value.type() == Variant::NOTHING) {
2217 error << "set_value(double) called for non-numeric property" << endmsg;
2221 for (Plugins::iterator i = _plugin->_plugins.begin(); i != _plugin->_plugins.end(); ++i) {
2222 (*i)->set_property(_list->parameter().id(), value);
2226 AutomationControl::set_value (user_val, Controllable::NoGroup);
2230 PluginInsert::PluginPropertyControl::get_state ()
2234 XMLNode& node (AutomationControl::get_state());
2235 ss << parameter().id();
2236 node.add_property (X_("property"), ss.str());
2237 node.remove_property (X_("value"));
2243 PluginInsert::PluginPropertyControl::get_value () const
2245 return _value.to_double();
2248 boost::shared_ptr<Plugin>
2249 PluginInsert::get_impulse_analysis_plugin()
2251 boost::shared_ptr<Plugin> ret;
2252 if (_impulseAnalysisPlugin.expired()) {
2253 ret = plugin_factory(_plugins[0]);
2254 ret->configure_io (internal_input_streams (), internal_output_streams ());
2255 _impulseAnalysisPlugin = ret;
2257 ret = _impulseAnalysisPlugin.lock();
2264 PluginInsert::collect_signal_for_analysis (framecnt_t nframes)
2266 // called from outside the audio thread, so this should be safe
2267 // only do audio as analysis is (currently) only for audio plugins
2268 _signal_analysis_inputs.ensure_buffers( DataType::AUDIO, internal_input_streams().n_audio(), nframes);
2269 _signal_analysis_outputs.ensure_buffers( DataType::AUDIO, internal_output_streams().n_audio(), nframes);
2271 _signal_analysis_collected_nframes = 0;
2272 _signal_analysis_collect_nframes_max = nframes;
2275 /** Add a plugin to our list */
2277 PluginInsert::add_plugin (boost::shared_ptr<Plugin> plugin)
2279 plugin->set_insert_id (this->id());
2281 if (_plugins.empty()) {
2282 /* first (and probably only) plugin instance - connect to relevant signals */
2284 plugin->ParameterChangedExternally.connect_same_thread (*this, boost::bind (&PluginInsert::parameter_changed_externally, this, _1, _2));
2285 plugin->StartTouch.connect_same_thread (*this, boost::bind (&PluginInsert::start_touch, this, _1));
2286 plugin->EndTouch.connect_same_thread (*this, boost::bind (&PluginInsert::end_touch, this, _1));
2287 // cache sidechain ports
2288 _cached_sidechain_pins.reset ();
2289 const ChanCount& nis (plugin->get_info()->n_inputs);
2290 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2291 for (uint32_t in = 0; in < nis.get (*t); ++in) {
2292 const Plugin::IOPortDescription& iod (plugin->describe_io_port (*t, true, in));
2293 if (iod.is_sidechain) {
2294 _cached_sidechain_pins.set (*t, 1 + _cached_sidechain_pins.n(*t));
2299 _plugins.push_back (plugin);
2303 PluginInsert::realtime_handle_transport_stopped ()
2305 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2306 (*i)->realtime_handle_transport_stopped ();
2311 PluginInsert::realtime_locate ()
2313 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2314 (*i)->realtime_locate ();
2319 PluginInsert::monitoring_changed ()
2321 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2322 (*i)->monitoring_changed ();
2327 PluginInsert::start_touch (uint32_t param_id)
2329 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id));
2331 ac->start_touch (session().audible_frame());
2336 PluginInsert::end_touch (uint32_t param_id)
2338 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id));
2340 ac->stop_touch (true, session().audible_frame());
2344 std::ostream& operator<<(std::ostream& o, const ARDOUR::PluginInsert::Match& m)
2347 case PluginInsert::Impossible: o << "Impossible"; break;
2348 case PluginInsert::Delegate: o << "Delegate"; break;
2349 case PluginInsert::NoInputs: o << "NoInputs"; break;
2350 case PluginInsert::ExactMatch: o << "ExactMatch"; break;
2351 case PluginInsert::Replicate: o << "Replicate"; break;
2352 case PluginInsert::Split: o << "Split"; break;
2353 case PluginInsert::Hide: o << "Hide"; break;
2355 o << " cnt: " << m.plugins
2356 << (m.strict_io ? " strict-io" : "")
2357 << (m.custom_cfg ? " custom-cfg" : "");
2358 if (m.method == PluginInsert::Hide) {
2359 o << " hide: " << m.hide;