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/types_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"
39 #include "ardour/port.h"
42 #include "ardour/lv2_plugin.h"
45 #ifdef WINDOWS_VST_SUPPORT
46 #include "ardour/windows_vst_plugin.h"
50 #include "ardour/lxvst_plugin.h"
54 #include "ardour/mac_vst_plugin.h"
57 #ifdef AUDIOUNIT_SUPPORT
58 #include "ardour/audio_unit.h"
61 #include "ardour/session.h"
62 #include "ardour/types.h"
67 using namespace ARDOUR;
70 const string PluginInsert::port_automation_node_name = "PortAutomation";
72 PluginInsert::PluginInsert (Session& s, boost::shared_ptr<Plugin> plug)
73 : Processor (s, (plug ? plug->name() : string ("toBeRenamed")))
74 , _sc_playback_latency (0)
75 , _sc_capture_latency (0)
76 , _plugin_signal_latency (0)
77 , _signal_analysis_collected_nframes(0)
78 , _signal_analysis_collect_nframes_max(0)
83 , _maps_from_state (false)
84 , _latency_changed (false)
85 , _bypass_port (UINT32_MAX)
87 /* the first is the master */
91 create_automatable_parameters ();
92 const ChanCount& sc (sidechain_input_pins ());
93 if (sc.n_audio () > 0 || sc.n_midi () > 0) {
94 add_sidechain (sc.n_audio (), sc.n_midi ());
99 PluginInsert::~PluginInsert ()
101 for (CtrlOutMap::const_iterator i = _control_outputs.begin(); i != _control_outputs.end(); ++i) {
102 boost::dynamic_pointer_cast<ReadOnlyControl>(i->second)->drop_references ();
107 PluginInsert::set_strict_io (bool b)
109 bool changed = _strict_io != b;
112 PluginConfigChanged (); /* EMIT SIGNAL */
117 PluginInsert::set_count (uint32_t num)
119 bool require_state = !_plugins.empty();
121 if (require_state && num > 1 && plugin (0)->get_info ()->type == ARDOUR::AudioUnit) {
122 // we don't allow to replicate AUs
126 /* this is a bad idea.... we shouldn't do this while active.
127 * only a route holding their redirect_lock should be calling this
132 } else if (num > _plugins.size()) {
133 uint32_t diff = num - _plugins.size();
135 for (uint32_t n = 0; n < diff; ++n) {
136 boost::shared_ptr<Plugin> p = plugin_factory (_plugins[0]);
140 XMLNode& state = _plugins[0]->get_state ();
141 p->set_state (state, Stateful::loading_state_version);
148 PluginConfigChanged (); /* EMIT SIGNAL */
150 } else if (num < _plugins.size()) {
151 uint32_t diff = _plugins.size() - num;
152 for (uint32_t n= 0; n < diff; ++n) {
155 PluginConfigChanged (); /* EMIT SIGNAL */
163 PluginInsert::set_sinks (const ChanCount& c)
166 /* no signal, change will only be visible after re-config */
170 PluginInsert::set_outputs (const ChanCount& c)
172 bool changed = (_custom_out != c) && _custom_cfg;
175 PluginConfigChanged (); /* EMIT SIGNAL */
180 PluginInsert::set_custom_cfg (bool b)
182 bool changed = _custom_cfg != b;
185 PluginConfigChanged (); /* EMIT SIGNAL */
190 PluginInsert::set_preset_out (const ChanCount& c)
192 bool changed = _preset_out != c;
194 if (changed && !_custom_cfg) {
195 PluginConfigChanged (); /* EMIT SIGNAL */
201 PluginInsert::add_sidechain (uint32_t n_audio, uint32_t n_midi)
203 // caller must hold process lock
207 std::ostringstream n;
208 if (n_audio > 0 || n_midi > 0) {
209 n << "Sidechain " << Session::next_name_id ();
211 n << "TO BE RESET FROM XML";
213 SideChain *sc = new SideChain (_session, n.str ());
214 _sidechain = boost::shared_ptr<SideChain> (sc);
215 _sidechain->activate ();
216 for (uint32_t n = 0; n < n_audio; ++n) {
217 _sidechain->input()->add_port ("", owner(), DataType::AUDIO); // add a port, don't connect.
219 for (uint32_t n = 0; n < n_midi; ++n) {
220 _sidechain->input()->add_port ("", owner(), DataType::MIDI); // add a port, don't connect.
222 PluginConfigChanged (); /* EMIT SIGNAL */
227 PluginInsert::del_sidechain ()
233 _sc_playback_latency = 0;
234 _sc_capture_latency = 0;
235 PluginConfigChanged (); /* EMIT SIGNAL */
240 PluginInsert::set_sidechain_latency (uint32_t capture, uint32_t playback)
243 (_sc_playback_latency != playback || _sc_capture_latency != capture)) {
244 _sc_capture_latency = capture;
245 _sc_playback_latency = playback;
246 LatencyRange pl; pl.min = pl.max = playback;
247 LatencyRange cl; cl.min = cl.max = capture;
248 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: capture %2 playback; %3\n", _sidechain->name (), capture, playback));
249 PortSet& ps (_sidechain->input ()->ports ());
250 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
251 p->set_private_latency_range (pl, true);
252 p->set_private_latency_range (cl, false);
258 PluginInsert::control_list_automation_state_changed (Evoral::Parameter which, AutoState s)
260 if (which.type() != PluginAutomation)
263 boost::shared_ptr<AutomationControl> c
264 = boost::dynamic_pointer_cast<AutomationControl>(control (which));
267 _plugins[0]->set_parameter (which.id(), c->list()->eval (_session.transport_frame()));
272 PluginInsert::output_streams() const
274 assert (_configured);
275 return _configured_out;
279 PluginInsert::input_streams() const
281 assert (_configured);
282 return _configured_in;
286 PluginInsert::internal_streams() const
288 assert (_configured);
289 return _configured_internal;
293 PluginInsert::internal_output_streams() const
295 assert (!_plugins.empty());
297 PluginInfoPtr info = _plugins.front()->get_info();
299 if (info->reconfigurable_io()) {
300 ChanCount out = _plugins.front()->output_streams ();
301 // DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, reconfigur(able) output streams = %1\n", out));
304 ChanCount out = info->n_outputs;
305 // DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, static output streams = %1 for %2 plugins\n", out, _plugins.size()));
306 out.set_audio (out.n_audio() * _plugins.size());
307 out.set_midi (out.n_midi() * _plugins.size());
313 PluginInsert::internal_input_streams() const
315 assert (!_plugins.empty());
319 PluginInfoPtr info = _plugins.front()->get_info();
321 if (info->reconfigurable_io()) {
322 in = _plugins.front()->input_streams();
327 DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, input streams = %1, match using %2\n", in, _match.method));
329 if (_match.method == Split) {
331 /* we are splitting 1 processor input to multiple plugin inputs,
332 so we have a maximum of 1 stream of each type.
334 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
335 if (in.get (*t) > 1) {
341 } else if (_match.method == Hide) {
343 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
344 in.set (*t, in.get (*t) - _match.hide.get (*t));
350 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
351 in.set (*t, in.get (*t) * _plugins.size ());
359 PluginInsert::natural_output_streams() const
362 if (is_channelstrip ()) {
363 return ChanCount::min (_configured_out, ChanCount (DataType::AUDIO, 2));
366 return _plugins[0]->get_info()->n_outputs;
370 PluginInsert::natural_input_streams() const
373 if (is_channelstrip ()) {
374 return ChanCount::min (_configured_in, ChanCount (DataType::AUDIO, 2));
377 return _plugins[0]->get_info()->n_inputs;
381 PluginInsert::sidechain_input_pins() const
383 return _cached_sidechain_pins;
387 PluginInsert::has_no_inputs() const
389 return _plugins[0]->get_info()->n_inputs == ChanCount::ZERO;
393 PluginInsert::has_no_audio_inputs() const
395 return _plugins[0]->get_info()->n_inputs.n_audio() == 0;
399 PluginInsert::plugin_latency () const {
400 return _plugins.front()->signal_latency ();
404 PluginInsert::is_instrument() const
406 PluginInfoPtr pip = _plugins[0]->get_info();
407 if (pip->is_instrument ()) {
410 return pip->n_inputs.n_midi () != 0 && pip->n_outputs.n_audio () > 0 && pip->n_inputs.n_audio () == 0;
414 PluginInsert::has_output_presets (ChanCount in, ChanCount out)
416 if (!_configured && _plugins[0]->get_info ()->reconfigurable_io ()) {
417 // collect possible configurations, prefer given in/out
418 _plugins[0]->can_support_io_configuration (in, out);
421 PluginOutputConfiguration ppc (_plugins[0]->possible_output ());
423 if (ppc.size () == 0) {
426 if (!strict_io () && ppc.size () == 1) {
430 if (strict_io () && ppc.size () == 1) {
431 // "stereo" is currently preferred default for instruments
432 if (ppc.find (2) != ppc.end ()) {
437 if (ppc.size () == 1 && ppc.find (0) != ppc.end () && !_plugins[0]->get_info ()->reconfigurable_io ()) {
438 // some midi-sequencer (e.g. QMidiArp) or other midi-out plugin
439 // pretending to be an "Instrument"
443 if (!is_instrument ()) {
450 PluginInsert::create_automatable_parameters ()
452 assert (!_plugins.empty());
454 boost::shared_ptr<Plugin> plugin = _plugins.front();
455 set<Evoral::Parameter> a = _plugins.front()->automatable ();
457 for (uint32_t i = 0; i < plugin->parameter_count(); ++i) {
458 if (!plugin->parameter_is_control (i)) {
462 ParameterDescriptor desc;
463 plugin->get_parameter_descriptor(i, desc);
465 if (!plugin->parameter_is_input (i)) {
466 _control_outputs[i] = boost::shared_ptr<ReadOnlyControl> (new ReadOnlyControl (plugin, desc, i));
469 Evoral::Parameter param (PluginAutomation, 0, i);
471 const bool automatable = a.find(param) != a.end();
474 can_automate (param);
476 boost::shared_ptr<AutomationList> list(new AutomationList(param, desc));
477 boost::shared_ptr<AutomationControl> c (new PluginControl(this, param, desc, list));
479 c->set_flags (Controllable::Flag ((int)c->flags() | Controllable::NotAutomatable));
482 plugin->set_automation_control (i, c);
486 const Plugin::PropertyDescriptors& pdl (plugin->get_supported_properties ());
487 for (Plugin::PropertyDescriptors::const_iterator p = pdl.begin(); p != pdl.end(); ++p) {
488 Evoral::Parameter param (PluginPropertyAutomation, 0, p->first);
489 const ParameterDescriptor& desc = plugin->get_property_descriptor(param.id());
490 if (desc.datatype != Variant::NOTHING) {
491 boost::shared_ptr<AutomationList> list;
492 if (Variant::type_is_numeric(desc.datatype)) {
493 list = boost::shared_ptr<AutomationList>(new AutomationList(param, desc));
495 add_control (boost::shared_ptr<AutomationControl> (new PluginPropertyControl(this, param, desc, list)));
499 _bypass_port = plugin->designated_bypass_port ();
501 /* special case VST effSetBypass */
502 if (_bypass_port == UINT32_MAX -1) {
503 // emulate VST Bypass
504 Evoral::Parameter param (PluginAutomation, 0, _bypass_port);
505 ParameterDescriptor desc;
506 desc.label = _("Plugin Enable");
511 boost::shared_ptr<AutomationList> list(new AutomationList(param, desc));
512 boost::shared_ptr<AutomationControl> c (new PluginControl(this, param, desc, list));
516 if (_bypass_port != UINT32_MAX) {
517 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, _bypass_port));
518 if (0 == (ac->flags () & Controllable::NotAutomatable)) {
519 ac->alist()->automation_state_changed.connect_same_thread (*this, boost::bind (&PluginInsert::bypassable_changed, this));
520 ac->Changed.connect_same_thread (*this, boost::bind (&PluginInsert::enable_changed, this));
523 plugin->PresetPortSetValue.connect_same_thread (*this, boost::bind (&PluginInsert::preset_load_set_value, this, _1, _2));
526 /** Called when something outside of this host has modified a plugin
527 * parameter. Responsible for propagating the change to two places:
529 * 1) anything listening to the Control itself
530 * 2) any replicated plugins that make up this PluginInsert.
532 * The PluginInsert is connected to the ParameterChangedExternally signal for
533 * the first (primary) plugin, and here broadcasts that change to any others.
535 * XXX We should probably drop this whole replication idea (Paul, October 2015)
536 * since it isn't used by sensible plugin APIs (AU, LV2).
539 PluginInsert::parameter_changed_externally (uint32_t which, float val)
541 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, which));
543 /* First propagation: alter the underlying value of the control,
544 * without telling the plugin(s) that own/use it to set it.
551 boost::shared_ptr<PluginControl> pc = boost::dynamic_pointer_cast<PluginControl> (ac);
554 pc->catch_up_with_external_value (val);
557 /* Second propagation: tell all plugins except the first to
558 update the value of this parameter. For sane plugin APIs,
559 there are no other plugins, so this is a no-op in those
563 Plugins::iterator i = _plugins.begin();
565 /* don't set the first plugin, just all the slaves */
567 if (i != _plugins.end()) {
569 for (; i != _plugins.end(); ++i) {
570 (*i)->set_parameter (which, val);
576 PluginInsert::set_block_size (pframes_t nframes)
579 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
580 if ((*i)->set_block_size (nframes) != 0) {
588 PluginInsert::activate ()
590 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
594 Processor::activate ();
595 /* when setting state e.g ProcessorBox::paste_processor_state ()
596 * the plugin is not yet owned by a route.
597 * but no matter. Route::add_processors() will call activate () again
602 if (_plugin_signal_latency != signal_latency ()) {
603 _plugin_signal_latency = signal_latency ();
609 PluginInsert::deactivate ()
611 Processor::deactivate ();
613 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
616 if (_plugin_signal_latency != signal_latency ()) {
617 _plugin_signal_latency = signal_latency ();
623 PluginInsert::flush ()
625 for (vector<boost::shared_ptr<Plugin> >::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
631 PluginInsert::enable (bool yn)
633 if (_bypass_port == UINT32_MAX) {
640 if (!_pending_active) {
643 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, _bypass_port));
644 const double val = yn ? 1.0 : 0.0;
645 ac->set_value (val, Controllable::NoGroup);
647 #ifdef ALLOW_VST_BYPASS_TO_FAIL // yet unused, see also vst_plugin.cc
648 /* special case VST.. bypass may fail */
649 if (_bypass_port == UINT32_MAX - 1) {
650 /* check if bypass worked */
651 if (ac->get_value () != val) {
652 warning << _("PluginInsert: VST Bypass failed, falling back to host bypass.") << endmsg;
653 // set plugin to enabled (not-byassed)
654 ac->set_value (1.0, Controllable::NoGroup);
655 // ..and use host-provided hard-bypass
670 PluginInsert::enabled () const
672 if (_bypass_port == UINT32_MAX) {
673 return Processor::enabled ();
675 boost::shared_ptr<const AutomationControl> ac = boost::const_pointer_cast<AutomationControl> (automation_control (Evoral::Parameter (PluginAutomation, 0, _bypass_port)));
676 return (ac->get_value () > 0 && _pending_active);
681 PluginInsert::bypassable () const
683 if (_bypass_port == UINT32_MAX) {
686 boost::shared_ptr<const AutomationControl> ac = boost::const_pointer_cast<AutomationControl> (automation_control (Evoral::Parameter (PluginAutomation, 0, _bypass_port)));
688 return !ac->automation_playback ();
693 PluginInsert::enable_changed ()
699 PluginInsert::bypassable_changed ()
701 BypassableChanged ();
705 PluginInsert::preset_load_set_value (uint32_t p, float v)
707 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, p));
712 if (ac->automation_state() & Play) {
717 ac->set_value (v, Controllable::NoGroup);
722 PluginInsert::inplace_silence_unconnected (BufferSet& bufs, const PinMappings& out_map, framecnt_t nframes, framecnt_t offset) const
724 // TODO optimize: store "unconnected" in a fixed set.
725 // it only changes on reconfiguration.
726 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
727 for (uint32_t out = 0; out < bufs.count().get (*t); ++out) {
729 if (*t == DataType::MIDI && out == 0 && has_midi_bypass ()) {
730 mapped = true; // in-place Midi bypass
732 for (uint32_t pc = 0; pc < get_count() && !mapped; ++pc) {
733 PinMappings::const_iterator i = out_map.find (pc);
734 if (i == out_map.end ()) {
737 const ChanMapping& outmap (i->second);
738 for (uint32_t o = 0; o < natural_output_streams().get (*t); ++o) {
740 uint32_t idx = outmap.get (*t, o, &valid);
741 if (valid && idx == out) {
748 bufs.get (*t, out).silence (nframes, offset);
755 PluginInsert::connect_and_run (BufferSet& bufs, framepos_t start, framepos_t end, double speed, pframes_t nframes, framecnt_t offset, bool with_auto)
757 // TODO: atomically copy maps & _no_inplace
758 PinMappings in_map (_in_map);
759 PinMappings out_map (_out_map);
760 ChanMapping thru_map (_thru_map);
761 if (_mapping_changed) { // ToDo use a counters, increment until match.
762 _no_inplace = check_inplace ();
763 _mapping_changed = false;
766 if (_latency_changed) {
767 /* delaylines are configured with the max possible latency (as reported by the plugin)
768 * so this won't allocate memory (unless the plugin lied about its max latency)
769 * It may still 'click' though, since the fixed delaylines are not de-clicked.
770 * Then again plugin-latency changes are not click-free to begin with.
772 * This is also worst case, there is currently no concept of per-stream latency.
774 * e.g. Two identical latent plugins:
775 * 1st plugin: process left (latent), bypass right.
776 * 2nd plugin: bypass left, process right (latent).
777 * -> currently this yields 2 times latency of the plugin,
779 _latency_changed = false;
780 _delaybuffers.set (ChanCount::max(bufs.count(), _configured_out), plugin_latency ());
783 if (_match.method == Split && !_no_inplace) {
784 // TODO: also use this optimization if one source-buffer
785 // feeds _all_ *connected* inputs.
786 // currently this is *first* buffer to all only --
787 // see PluginInsert::check_inplace
788 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
789 if (_configured_internal.get (*t) == 0) {
793 uint32_t first_idx = in_map[0].get (*t, 0, &valid);
794 assert (valid && first_idx == 0); // check_inplace ensures this
795 /* copy the first stream's buffer contents to the others */
796 for (uint32_t i = 1; i < natural_input_streams ().get (*t); ++i) {
797 uint32_t idx = in_map[0].get (*t, i, &valid);
800 bufs.get (*t, i).read_from (bufs.get (*t, first_idx), nframes, offset, offset);
804 /* the copy operation produces a linear monotonic input map */
805 in_map[0] = ChanMapping (natural_input_streams ());
808 bufs.set_count(ChanCount::max(bufs.count(), _configured_internal));
809 bufs.set_count(ChanCount::max(bufs.count(), _configured_out));
815 for (Controls::iterator li = controls().begin(); li != controls().end(); ++li, ++n) {
817 boost::shared_ptr<AutomationControl> c
818 = boost::dynamic_pointer_cast<AutomationControl>(li->second);
820 if (c->list() && c->automation_playback()) {
823 const float val = c->list()->rt_safe_eval (start, valid);
826 /* This is the ONLY place where we are
828 * AutomationControl::set_value_unchecked(). We
829 * know that the control is in
830 * automation playback mode, so no
831 * check on writable() is required
832 * (which must be done in AutomationControl::set_value()
835 c->set_value_unchecked(val);
842 /* Calculate if, and how many frames we need to collect for analysis */
843 framecnt_t collect_signal_nframes = (_signal_analysis_collect_nframes_max -
844 _signal_analysis_collected_nframes);
845 if (nframes < collect_signal_nframes) { // we might not get all frames now
846 collect_signal_nframes = nframes;
849 if (collect_signal_nframes > 0) {
851 //std::cerr << "collect input, bufs " << bufs.count().n_audio() << " count, " << bufs.available().n_audio() << " available" << std::endl;
852 //std::cerr << " streams " << internal_input_streams().n_audio() << std::endl;
853 //std::cerr << "filling buffer with " << collect_signal_nframes << " frames at " << _signal_analysis_collected_nframes << std::endl;
855 _signal_analysis_inputs.set_count(input_streams());
857 for (uint32_t i = 0; i < input_streams().n_audio(); ++i) {
858 _signal_analysis_inputs.get_audio(i).read_from (
860 collect_signal_nframes,
861 _signal_analysis_collected_nframes); // offset is for target buffer
866 if (is_channelstrip ()) {
867 if (_configured_in.n_audio() > 0) {
868 ChanMapping mb_in_map (ChanCount::min (_configured_in, ChanCount (DataType::AUDIO, 2)));
869 ChanMapping mb_out_map (ChanCount::min (_configured_out, ChanCount (DataType::AUDIO, 2)));
871 _plugins.front()->connect_and_run (bufs, start, end, speed, mb_in_map, mb_out_map, nframes, offset);
873 for (uint32_t out = _configured_in.n_audio (); out < bufs.count().get (DataType::AUDIO); ++out) {
874 bufs.get (DataType::AUDIO, out).silence (nframes, offset);
880 // TODO optimize -- build maps once.
882 BufferSet& inplace_bufs = _session.get_noinplace_buffers();
883 ARDOUR::ChanMapping used_outputs;
885 assert (inplace_bufs.count () >= natural_input_streams () + _configured_out);
887 /* build used-output map */
888 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
889 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
890 for (uint32_t out = 0; out < natural_output_streams().get (*t); ++out) {
892 uint32_t out_idx = out_map[pc].get (*t, out, &valid);
894 used_outputs.set (*t, out_idx, 1); // mark as used
899 /* copy thru data to outputs before processing in-place */
900 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
901 for (uint32_t out = 0; out < bufs.count().get (*t); ++out) {
903 uint32_t in_idx = thru_map.get (*t, out, &valid);
904 uint32_t m = out + natural_input_streams ().get (*t);
906 _delaybuffers.delay (*t, out, inplace_bufs.get (*t, m), bufs.get (*t, in_idx), nframes, offset, offset);
907 used_outputs.set (*t, out, 1); // mark as used
909 used_outputs.get (*t, out, &valid);
911 /* the plugin is expected to write here, but may not :(
912 * (e.g. drumgizmo w/o kit loaded)
914 inplace_bufs.get (*t, m).silence (nframes);
921 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
923 ARDOUR::ChanMapping i_in_map (natural_input_streams());
924 ARDOUR::ChanMapping i_out_map (out_map[pc]);
925 ARDOUR::ChanCount mapped;
927 /* map inputs sequentially */
928 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
929 for (uint32_t in = 0; in < natural_input_streams().get (*t); ++in) {
931 uint32_t in_idx = in_map[pc].get (*t, in, &valid);
932 uint32_t m = mapped.get (*t);
934 inplace_bufs.get (*t, m).read_from (bufs.get (*t, in_idx), nframes, offset, offset);
936 inplace_bufs.get (*t, m).silence (nframes, offset);
938 mapped.set (*t, m + 1);
942 /* outputs are mapped to inplace_bufs after the inputs */
943 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
944 i_out_map.offset_to (*t, natural_input_streams ().get (*t));
947 if ((*i)->connect_and_run (inplace_bufs, start, end, speed, i_in_map, i_out_map, nframes, offset)) {
952 /* all instances have completed, now copy data that was written
953 * and zero unconnected buffers */
954 ARDOUR::ChanMapping nonzero_out (used_outputs);
955 if (has_midi_bypass ()) {
956 nonzero_out.set (DataType::MIDI, 0, 1); // Midi bypass.
958 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
959 for (uint32_t out = 0; out < bufs.count().get (*t); ++out) {
961 used_outputs.get (*t, out, &valid);
963 nonzero_out.get (*t, out, &valid);
965 bufs.get (*t, out).silence (nframes, offset);
968 uint32_t m = out + natural_input_streams ().get (*t);
969 bufs.get (*t, out).read_from (inplace_bufs.get (*t, m), nframes, offset, offset);
974 /* in-place processing */
976 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
977 if ((*i)->connect_and_run(bufs, start, end, speed, in_map[pc], out_map[pc], nframes, offset)) {
981 // now silence unconnected outputs
982 inplace_silence_unconnected (bufs, _out_map, nframes, offset);
985 if (collect_signal_nframes > 0) {
987 //std::cerr << " output, bufs " << bufs.count().n_audio() << " count, " << bufs.available().n_audio() << " available" << std::endl;
988 //std::cerr << " streams " << internal_output_streams().n_audio() << std::endl;
990 _signal_analysis_outputs.set_count(output_streams());
992 for (uint32_t i = 0; i < output_streams().n_audio(); ++i) {
993 _signal_analysis_outputs.get_audio(i).read_from(
995 collect_signal_nframes,
996 _signal_analysis_collected_nframes); // offset is for target buffer
999 _signal_analysis_collected_nframes += collect_signal_nframes;
1000 assert(_signal_analysis_collected_nframes <= _signal_analysis_collect_nframes_max);
1002 if (_signal_analysis_collected_nframes == _signal_analysis_collect_nframes_max) {
1003 _signal_analysis_collect_nframes_max = 0;
1004 _signal_analysis_collected_nframes = 0;
1006 AnalysisDataGathered(&_signal_analysis_inputs,
1007 &_signal_analysis_outputs);
1011 if (_plugin_signal_latency != signal_latency ()) {
1012 _plugin_signal_latency = signal_latency ();
1018 PluginInsert::bypass (BufferSet& bufs, pframes_t nframes)
1020 /* bypass the plugin(s) not the whole processor.
1021 * -> use mappings just like connect_and_run
1024 // TODO: atomically copy maps & _no_inplace
1025 const ChanMapping in_map (no_sc_input_map ());
1026 const ChanMapping out_map (output_map ());
1027 if (_mapping_changed) {
1028 _no_inplace = check_inplace ();
1029 _mapping_changed = false;
1032 bufs.set_count(ChanCount::max(bufs.count(), _configured_internal));
1033 bufs.set_count(ChanCount::max(bufs.count(), _configured_out));
1036 ChanMapping thru_map (_thru_map);
1038 BufferSet& inplace_bufs = _session.get_noinplace_buffers();
1040 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1041 for (uint32_t in = 0; in < _configured_internal.get (*t); ++in) {
1042 inplace_bufs.get (*t, in).read_from (bufs.get (*t, in), nframes, 0, 0);
1045 ARDOUR::ChanMapping used_outputs;
1047 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1048 for (uint32_t out = 0; out < _configured_out.get (*t); ++out) {
1050 uint32_t in_idx = thru_map.get (*t, out, &valid);
1052 bufs.get (*t, out).read_from (inplace_bufs.get (*t, in_idx), nframes, 0, 0);
1053 used_outputs.set (*t, out, 1); // mark as used
1057 // plugin no-op: assume every plugin has an internal identity map
1058 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1059 for (uint32_t out = 0; out < _configured_out.get (*t); ++out) {
1061 uint32_t src_idx = out_map.get_src (*t, out, &valid);
1065 uint32_t in_idx = in_map.get (*t, src_idx, &valid);
1069 bufs.get (*t, out).read_from (inplace_bufs.get (*t, in_idx), nframes, 0, 0);
1070 used_outputs.set (*t, out, 1); // mark as used
1073 // now silence all unused outputs
1074 if (has_midi_bypass ()) {
1075 used_outputs.set (DataType::MIDI, 0, 1); // Midi bypass.
1077 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1078 for (uint32_t out = 0; out < _configured_out.get (*t); ++out) {
1080 used_outputs.get (*t, out, &valid);
1082 bufs.get (*t, out).silence (nframes, 0);
1087 if (_match.method == Split) {
1088 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1089 if (_configured_internal.get (*t) == 0) {
1092 // copy/feeds _all_ *connected* inputs, copy the first buffer
1094 uint32_t first_idx = in_map.get (*t, 0, &valid);
1095 assert (valid && first_idx == 0); // check_inplace ensures this
1096 for (uint32_t i = 1; i < natural_input_streams ().get (*t); ++i) {
1097 uint32_t idx = in_map.get (*t, i, &valid);
1100 bufs.get (*t, i).read_from (bufs.get (*t, first_idx), nframes, 0, 0);
1106 // apply output map and/or monotonic but not identity i/o mappings
1107 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1108 for (uint32_t out = 0; out < _configured_out.get (*t); ++out) {
1110 uint32_t src_idx = out_map.get_src (*t, out, &valid);
1112 bufs.get (*t, out).silence (nframes, 0);
1115 uint32_t in_idx = in_map.get (*t, src_idx, &valid);
1117 bufs.get (*t, out).silence (nframes, 0);
1120 if (in_idx != src_idx) {
1121 bufs.get (*t, out).read_from (bufs.get (*t, in_idx), nframes, 0, 0);
1129 PluginInsert::silence (framecnt_t nframes, framepos_t start_frame)
1131 // XXX This method is never called, Route::silence skips PIs
1132 // we should probably use it during bypass ()
1133 // and call automation_run()
1137 // XXX delaybuffers need to be offset by nframes
1141 _delaybuffers.flush ();
1143 ChanMapping in_map (natural_input_streams ());
1144 ChanMapping out_map (natural_output_streams ());
1145 ChanCount maxbuf = ChanCount::max (natural_input_streams (), natural_output_streams());
1147 if (is_channelstrip ()) {
1148 if (_configured_in.n_audio() > 0) {
1149 _plugins.front()->connect_and_run (_session.get_scratch_buffers (maxbuf, true), start_frame, start_frame + nframes, 1.0, in_map, out_map, nframes, 0);
1153 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1154 (*i)->connect_and_run (_session.get_scratch_buffers (maxbuf, true), start_frame, start_frame + nframes, 1.0, in_map, out_map, nframes, 0);
1159 PluginInsert::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, double speed, pframes_t nframes, bool)
1162 // collect sidechain input for complete cycle (!)
1163 // TODO we need delaylines here for latency compensation
1164 _sidechain->run (bufs, start_frame, end_frame, speed, nframes, true);
1167 if (_pending_active) {
1168 /* run as normal if we are active or moving from inactive to active */
1170 if (_session.transport_rolling() || _session.bounce_processing()) {
1171 automate_and_run (bufs, start_frame, end_frame, speed, nframes);
1173 Glib::Threads::Mutex::Lock lm (control_lock(), Glib::Threads::TRY_LOCK);
1174 connect_and_run (bufs, start_frame, end_frame, speed, nframes, 0, lm.locked());
1178 // XXX should call ::silence() to run plugin(s) for consistent load.
1179 // We'll need to change this anyway when bypass can be automated
1180 bypass (bufs, nframes);
1181 automation_run (start_frame, nframes); // evaluate automation only
1182 _delaybuffers.flush ();
1185 _active = _pending_active;
1187 /* we have no idea whether the plugin generated silence or not, so mark
1188 * all buffers appropriately.
1193 PluginInsert::automate_and_run (BufferSet& bufs, framepos_t start, framepos_t end, double speed, pframes_t nframes)
1195 Evoral::ControlEvent next_event (0, 0.0f);
1196 framecnt_t offset = 0;
1198 Glib::Threads::Mutex::Lock lm (control_lock(), Glib::Threads::TRY_LOCK);
1201 connect_and_run (bufs, start, end, speed, nframes, offset, false);
1205 if (!find_next_event (start, end, next_event) || _plugins.front()->requires_fixed_sized_buffers()) {
1207 /* no events have a time within the relevant range */
1209 connect_and_run (bufs, start, end, speed, nframes, offset, true);
1215 framecnt_t cnt = min (((framecnt_t) ceil (next_event.when) - start), (framecnt_t) nframes);
1217 connect_and_run (bufs, start, start + cnt, speed, cnt, offset, true); // XXX (start + cnt) * speed
1223 if (!find_next_event (start, end, next_event)) {
1228 /* cleanup anything that is left to do */
1231 connect_and_run (bufs, start, start + nframes, speed, nframes, offset, true);
1236 PluginInsert::default_parameter_value (const Evoral::Parameter& param)
1238 if (param.type() != PluginAutomation)
1241 if (_plugins.empty()) {
1242 fatal << _("programming error: ") << X_("PluginInsert::default_parameter_value() called with no plugin")
1244 abort(); /*NOTREACHED*/
1247 return _plugins[0]->default_value (param.id());
1252 PluginInsert::can_reset_all_parameters ()
1255 uint32_t params = 0;
1256 for (uint32_t par = 0; par < _plugins[0]->parameter_count(); ++par) {
1258 const uint32_t cid = _plugins[0]->nth_parameter (par, ok);
1260 if (!ok || !_plugins[0]->parameter_is_input(cid)) {
1264 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, cid));
1270 if (ac->automation_state() & Play) {
1275 return all && (params > 0);
1279 PluginInsert::reset_parameters_to_default ()
1283 for (uint32_t par = 0; par < _plugins[0]->parameter_count(); ++par) {
1285 const uint32_t cid = _plugins[0]->nth_parameter (par, ok);
1287 if (!ok || !_plugins[0]->parameter_is_input(cid)) {
1291 const float dflt = _plugins[0]->default_value (cid);
1292 const float curr = _plugins[0]->get_parameter (cid);
1298 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, cid));
1303 if (ac->automation_state() & Play) {
1308 ac->set_value (dflt, Controllable::NoGroup);
1313 boost::shared_ptr<Plugin>
1314 PluginInsert::plugin_factory (boost::shared_ptr<Plugin> other)
1316 boost::shared_ptr<LadspaPlugin> lp;
1317 boost::shared_ptr<LuaProc> lua;
1319 boost::shared_ptr<LV2Plugin> lv2p;
1321 #ifdef WINDOWS_VST_SUPPORT
1322 boost::shared_ptr<WindowsVSTPlugin> vp;
1324 #ifdef LXVST_SUPPORT
1325 boost::shared_ptr<LXVSTPlugin> lxvp;
1327 #ifdef MACVST_SUPPORT
1328 boost::shared_ptr<MacVSTPlugin> mvp;
1330 #ifdef AUDIOUNIT_SUPPORT
1331 boost::shared_ptr<AUPlugin> ap;
1334 if ((lp = boost::dynamic_pointer_cast<LadspaPlugin> (other)) != 0) {
1335 return boost::shared_ptr<Plugin> (new LadspaPlugin (*lp));
1336 } else if ((lua = boost::dynamic_pointer_cast<LuaProc> (other)) != 0) {
1337 return boost::shared_ptr<Plugin> (new LuaProc (*lua));
1339 } else if ((lv2p = boost::dynamic_pointer_cast<LV2Plugin> (other)) != 0) {
1340 return boost::shared_ptr<Plugin> (new LV2Plugin (*lv2p));
1342 #ifdef WINDOWS_VST_SUPPORT
1343 } else if ((vp = boost::dynamic_pointer_cast<WindowsVSTPlugin> (other)) != 0) {
1344 return boost::shared_ptr<Plugin> (new WindowsVSTPlugin (*vp));
1346 #ifdef LXVST_SUPPORT
1347 } else if ((lxvp = boost::dynamic_pointer_cast<LXVSTPlugin> (other)) != 0) {
1348 return boost::shared_ptr<Plugin> (new LXVSTPlugin (*lxvp));
1350 #ifdef MACVST_SUPPORT
1351 } else if ((mvp = boost::dynamic_pointer_cast<MacVSTPlugin> (other)) != 0) {
1352 return boost::shared_ptr<Plugin> (new MacVSTPlugin (*mvp));
1354 #ifdef AUDIOUNIT_SUPPORT
1355 } else if ((ap = boost::dynamic_pointer_cast<AUPlugin> (other)) != 0) {
1356 return boost::shared_ptr<Plugin> (new AUPlugin (*ap));
1360 fatal << string_compose (_("programming error: %1"),
1361 X_("unknown plugin type in PluginInsert::plugin_factory"))
1363 abort(); /*NOTREACHED*/
1364 return boost::shared_ptr<Plugin> ((Plugin*) 0);
1368 PluginInsert::set_input_map (uint32_t num, ChanMapping m) {
1369 if (num < _in_map.size()) {
1370 bool changed = _in_map[num] != m;
1372 changed |= sanitize_maps ();
1374 PluginMapChanged (); /* EMIT SIGNAL */
1375 _mapping_changed = true;
1376 _session.set_dirty();
1382 PluginInsert::set_output_map (uint32_t num, ChanMapping m) {
1383 if (num < _out_map.size()) {
1384 bool changed = _out_map[num] != m;
1386 changed |= sanitize_maps ();
1388 PluginMapChanged (); /* EMIT SIGNAL */
1389 _mapping_changed = true;
1390 _session.set_dirty();
1396 PluginInsert::set_thru_map (ChanMapping m) {
1397 bool changed = _thru_map != m;
1399 changed |= sanitize_maps ();
1401 PluginMapChanged (); /* EMIT SIGNAL */
1402 _mapping_changed = true;
1403 _session.set_dirty();
1408 PluginInsert::pre_seed (const ChanCount& in, const ChanCount& out,
1409 const ChanMapping& im, const ChanMapping& om, const ChanMapping& tm)
1411 if (_configured) { return false; }
1412 _configured_in = in;
1413 _configured_out = out;
1417 _maps_from_state = in.n_total () > 0 && out.n_total () > 0;
1422 PluginInsert::input_map () const
1426 for (PinMappings::const_iterator i = _in_map.begin (); i != _in_map.end (); ++i, ++pc) {
1427 ChanMapping m (i->second);
1428 const ChanMapping::Mappings& mp ((*i).second.mappings());
1429 for (ChanMapping::Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
1430 for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
1431 rv.set (tm->first, i->first + pc * natural_input_streams().get(tm->first), i->second);
1440 PluginInsert::no_sc_input_map () const
1444 for (PinMappings::const_iterator i = _in_map.begin (); i != _in_map.end (); ++i, ++pc) {
1445 ChanMapping m (i->second);
1446 const ChanMapping::Mappings& mp ((*i).second.mappings());
1447 for (ChanMapping::Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
1448 uint32_t ins = natural_input_streams().get(tm->first) - _cached_sidechain_pins.get(tm->first);
1449 for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
1450 if (i->first < ins) {
1451 rv.set (tm->first, i->first + pc * ins, i->second);
1460 PluginInsert::output_map () const
1464 for (PinMappings::const_iterator i = _out_map.begin (); i != _out_map.end (); ++i, ++pc) {
1465 ChanMapping m (i->second);
1466 const ChanMapping::Mappings& mp ((*i).second.mappings());
1467 for (ChanMapping::Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
1468 for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
1469 rv.set (tm->first, i->first + pc * natural_output_streams().get(tm->first), i->second);
1473 if (has_midi_bypass ()) {
1474 rv.set (DataType::MIDI, 0, 0);
1481 PluginInsert::has_midi_bypass () const
1483 if (_configured_in.n_midi () == 1 && _configured_out.n_midi () == 1
1484 && natural_output_streams ().n_midi () == 0) {
1491 PluginInsert::has_midi_thru () const
1493 if (_configured_in.n_midi () == 1 && _configured_out.n_midi () == 1
1494 && natural_input_streams ().n_midi () == 0 && natural_output_streams ().n_midi () == 0) {
1502 PluginInsert::is_channelstrip () const {
1503 return _plugins.front()->is_channelstrip();
1508 PluginInsert::check_inplace ()
1510 bool inplace_ok = !_plugins.front()->inplace_broken ();
1512 if (_thru_map.n_total () > 0) {
1513 // TODO once midi-bypass is part of the mapping, ignore it
1517 if (_match.method == Split && inplace_ok) {
1518 assert (get_count() == 1);
1519 assert (_in_map.size () == 1);
1520 if (!_out_map[0].is_monotonic ()) {
1523 if (_configured_internal != _configured_in) {
1524 /* no sidechain -- TODO we could allow this with
1525 * some more logic in PluginInsert::connect_and_run().
1527 * PluginInsert::reset_map() already maps it.
1532 for (DataType::iterator t = DataType::begin(); t != DataType::end() && inplace_ok; ++t) {
1533 if (_configured_internal.get (*t) == 0) {
1537 uint32_t first_idx = _in_map[0].get (*t, 0, &valid);
1538 if (!valid || first_idx != 0) {
1539 // so far only allow to copy the *first* stream's buffer to others
1542 for (uint32_t i = 1; i < natural_input_streams ().get (*t); ++i) {
1543 uint32_t idx = _in_map[0].get (*t, i, &valid);
1544 if (valid && idx != first_idx) {
1553 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: In Place Split Map\n", name()));
1558 for (uint32_t pc = 0; pc < get_count() && inplace_ok ; ++pc) {
1559 if (!_in_map[pc].is_monotonic ()) {
1562 if (!_out_map[pc].is_monotonic ()) {
1568 /* check if every output is fed by the corresponding input
1570 * this prevents in-port 1 -> sink-pin 2 || source-pin 1 -> out port 1, source-pin 2 -> out port 2
1571 * (with in-place, source-pin 1 -> out port 1 overwrites in-port 1)
1573 * but allows in-port 1 -> sink-pin 2 || source-pin 2 -> out port 1
1575 ChanMapping in_map (input_map ());
1576 const ChanMapping::Mappings out_m (output_map ().mappings ());
1577 for (ChanMapping::Mappings::const_iterator t = out_m.begin (); t != out_m.end () && inplace_ok; ++t) {
1578 for (ChanMapping::TypeMapping::const_iterator c = (*t).second.begin (); c != (*t).second.end () ; ++c) {
1579 /* src-pin: c->first, out-port: c->second */
1581 uint32_t in_port = in_map.get (t->first, c->first, &valid);
1582 if (valid && in_port != c->second) {
1590 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: %2\n", name(), inplace_ok ? "In-Place" : "No Inplace Processing"));
1591 return !inplace_ok; // no-inplace
1595 PluginInsert::sanitize_maps ()
1597 bool changed = false;
1598 /* strip dead wood */
1599 PinMappings new_ins;
1600 PinMappings new_outs;
1601 ChanMapping new_thru;
1603 for (uint32_t pc = 0; pc < get_count(); ++pc) {
1605 ChanMapping new_out;
1606 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1607 for (uint32_t i = 0; i < natural_input_streams().get (*t); ++i) {
1609 uint32_t idx = _in_map[pc].get (*t, i, &valid);
1610 if (valid && idx < _configured_internal.get (*t)) {
1611 new_in.set (*t, i, idx);
1614 for (uint32_t o = 0; o < natural_output_streams().get (*t); ++o) {
1616 uint32_t idx = _out_map[pc].get (*t, o, &valid);
1617 if (valid && idx < _configured_out.get (*t)) {
1618 new_out.set (*t, o, idx);
1622 if (_in_map[pc] != new_in || _out_map[pc] != new_out) {
1625 new_ins[pc] = new_in;
1626 new_outs[pc] = new_out;
1629 /* prevent dup output assignments */
1630 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1631 for (uint32_t o = 0; o < _configured_out.get (*t); ++o) {
1632 bool mapped = false;
1633 for (uint32_t pc = 0; pc < get_count(); ++pc) {
1635 uint32_t idx = new_outs[pc].get_src (*t, o, &valid);
1636 if (valid && mapped) {
1637 new_outs[pc].unset (*t, idx);
1645 /* remove excess thru */
1646 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1647 for (uint32_t o = 0; o < _configured_out.get (*t); ++o) {
1649 uint32_t idx = _thru_map.get (*t, o, &valid);
1650 if (valid && idx < _configured_internal.get (*t)) {
1651 new_thru.set (*t, o, idx);
1656 /* prevent out + thru, existing plugin outputs override thru */
1657 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1658 for (uint32_t o = 0; o < _configured_out.get (*t); ++o) {
1659 bool mapped = false;
1661 for (uint32_t pc = 0; pc < get_count(); ++pc) {
1662 new_outs[pc].get_src (*t, o, &mapped);
1663 if (mapped) { break; }
1665 if (!mapped) { continue; }
1666 uint32_t idx = new_thru.get (*t, o, &valid);
1668 new_thru.unset (*t, idx);
1673 if (has_midi_bypass ()) {
1674 // TODO: include midi-bypass in the thru set,
1675 // remove dedicated handling.
1676 new_thru.unset (DataType::MIDI, 0);
1679 if (_in_map != new_ins || _out_map != new_outs || _thru_map != new_thru) {
1683 _out_map = new_outs;
1684 _thru_map = new_thru;
1690 PluginInsert::reset_map (bool emit)
1692 const PinMappings old_in (_in_map);
1693 const PinMappings old_out (_out_map);
1697 _thru_map = ChanMapping ();
1699 /* build input map */
1700 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1701 uint32_t sc = 0; // side-chain round-robin (all instances)
1703 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
1704 const uint32_t nis = natural_input_streams ().get(*t);
1705 const uint32_t stride = nis - sidechain_input_pins().get (*t);
1707 /* SC inputs are last in the plugin-insert.. */
1708 const uint32_t sc_start = _configured_in.get (*t);
1709 const uint32_t sc_len = _configured_internal.get (*t) - sc_start;
1710 /* ...but may not be at the end of the plugin ports.
1711 * in case the side-chain is not the last port, shift connections back.
1712 * and connect to side-chain
1715 uint32_t ic = 0; // split inputs
1716 const uint32_t cend = _configured_in.get (*t);
1718 for (uint32_t in = 0; in < nis; ++in) {
1719 const Plugin::IOPortDescription& iod (_plugins[pc]->describe_io_port (*t, true, in));
1720 if (iod.is_sidechain) {
1721 /* connect sidechain sinks to sidechain inputs in round-robin fashion */
1722 if (sc_len > 0) {// side-chain may be hidden
1723 _in_map[pc].set (*t, in, sc_start + sc);
1724 sc = (sc + 1) % sc_len;
1728 if (_match.method == Split) {
1729 if (cend == 0) { continue; }
1730 if (_strict_io && ic + stride * pc >= cend) {
1733 /* connect *no* sidechain sinks in round-robin fashion */
1734 _in_map[pc].set (*t, in, ic + stride * pc);
1735 if (_strict_io && (ic + 1) == cend) {
1738 ic = (ic + 1) % cend;
1740 uint32_t s = in - shift;
1741 if (stride * pc + s < cend) {
1742 _in_map[pc].set (*t, in, s + stride * pc);
1750 /* build output map */
1752 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
1753 _out_map[pc] = ChanMapping (ChanCount::min (natural_output_streams(), _configured_out));
1754 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1755 _out_map[pc].offset_to(*t, pc * natural_output_streams().get(*t));
1760 if (old_in == _in_map && old_out == _out_map) {
1764 PluginMapChanged (); /* EMIT SIGNAL */
1765 _mapping_changed = true;
1766 _session.set_dirty();
1772 PluginInsert::configure_io (ChanCount in, ChanCount out)
1774 Match old_match = _match;
1776 ChanCount old_internal;
1780 old_pins = natural_input_streams();
1781 old_in = _configured_in;
1782 old_out = _configured_out;
1783 old_internal = _configured_internal;
1785 _configured_in = in;
1786 _configured_internal = in;
1787 _configured_out = out;
1790 /* TODO hide midi-bypass, and custom outs. Best /fake/ "out" here.
1791 * (currently _sidechain->configure_io always succeeds
1792 * since Processor::configure_io() succeeds)
1794 if (!_sidechain->configure_io (in, out)) {
1795 DEBUG_TRACE (DEBUG::ChanMapping, "Sidechain configuration failed\n");
1798 _configured_internal += _sidechain->input()->n_ports();
1800 // include (static_cast<Route*>owner())->name() ??
1801 _sidechain->input ()-> set_pretty_name (string_compose (_("SC %1"), name ()));
1804 /* get plugin configuration */
1805 _match = private_can_support_io_configuration (in, out);
1807 if (DEBUG_ENABLED(DEBUG::ChanMapping)) {
1809 DEBUG_STR_APPEND(a, string_compose ("%1: ", name()));
1810 DEBUG_STR_APPEND(a, _match);
1811 DEBUG_TRACE (DEBUG::ChanMapping, DEBUG_STR(a).str());
1815 /* set the matching method and number of plugins that we will use to meet this configuration */
1816 if (set_count (_match.plugins) == false) {
1817 PluginIoReConfigure (); /* EMIT SIGNAL */
1818 _configured = false;
1822 /* configure plugins */
1823 switch (_match.method) {
1826 if (_plugins.front()->configure_io (natural_input_streams(), out) == false) {
1827 PluginIoReConfigure (); /* EMIT SIGNAL */
1828 _configured = false;
1834 ChanCount din (_configured_internal);
1835 ChanCount dout (din); // hint
1837 if (_custom_sinks.n_total () > 0) {
1838 din = _custom_sinks;
1841 } else if (_preset_out.n_audio () > 0) {
1842 dout.set (DataType::AUDIO, _preset_out.n_audio ());
1843 } else if (dout.n_midi () > 0 && dout.n_audio () == 0) {
1844 dout.set (DataType::AUDIO, 2);
1846 if (out.n_audio () == 0) { out.set (DataType::AUDIO, 1); }
1848 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: Delegate lookup : %2 %3\n", name(), din, dout));
1849 bool const r = _plugins.front()->can_support_io_configuration (din, dout, &useins);
1851 if (useins.n_audio() == 0) {
1854 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: Delegate configuration: %2 %3\n", name(), useins, dout));
1856 if (_plugins.front()->configure_io (useins, dout) == false) {
1857 PluginIoReConfigure (); /* EMIT SIGNAL */
1858 _configured = false;
1862 _custom_sinks = din;
1867 if (_plugins.front()->configure_io (in, out) == false) {
1868 PluginIoReConfigure (); /* EMIT SIGNAL */
1869 _configured = false;
1875 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: cfg:%2 state:%3 chn-in:%4 chn-out:%5 inpin:%6 match:%7 cust:%8 size-in:%9 size-out:%10\n",
1877 _configured ? "Y" : "N",
1878 _maps_from_state ? "Y" : "N",
1879 old_in == in ? "==" : "!=",
1880 old_out == out ? "==" : "!=",
1881 old_pins == natural_input_streams () ? "==" : "!=",
1882 old_match.method == _match.method ? "==" : "!=",
1883 old_match.custom_cfg == _match.custom_cfg ? "==" : "!=",
1884 _in_map.size() == get_count () ? "==" : "!=",
1885 _out_map.size() == get_count () ? "==" : "!="
1888 bool mapping_changed = false;
1889 if (old_in == in && old_out == out
1891 && old_pins == natural_input_streams ()
1892 && old_match.method == _match.method
1893 && old_match.custom_cfg == _match.custom_cfg
1894 && _in_map.size() == _out_map.size()
1895 && _in_map.size() == get_count ()
1897 /* If the configuration has not changed, keep the mapping */
1898 mapping_changed = sanitize_maps ();
1899 } else if (_match.custom_cfg && _configured) {
1900 /* don't touch the map in manual mode */
1901 mapping_changed = sanitize_maps ();
1904 if (is_channelstrip ()) {
1905 /* fake channel map - for wire display */
1908 _thru_map = ChanMapping ();
1909 _in_map[0] = ChanMapping (ChanCount::min (_configured_in, ChanCount (DataType::AUDIO, 2)));
1910 _out_map[0] = ChanMapping (ChanCount::min (_configured_out, ChanCount (DataType::AUDIO, 2)));
1911 /* set "thru" map for in-place forward of audio */
1912 for (uint32_t i = 2; i < _configured_in.n_audio(); ++i) {
1913 _thru_map.set (DataType::AUDIO, i, i);
1915 /* and midi (after implicit 1st channel bypass) */
1916 for (uint32_t i = 1; i < _configured_in.n_midi(); ++i) {
1917 _thru_map.set (DataType::MIDI, i, i);
1921 if (_maps_from_state && old_in == in && old_out == out) {
1922 mapping_changed = true;
1925 /* generate a new mapping */
1926 mapping_changed = reset_map (false);
1928 _maps_from_state = false;
1931 if (mapping_changed) {
1932 PluginMapChanged (); /* EMIT SIGNAL */
1935 if (DEBUG_ENABLED(DEBUG::ChanMapping)) {
1938 DEBUG_STR_APPEND(a, "\n--------<<--------\n");
1939 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
1941 DEBUG_STR_APPEND(a, "----><----\n");
1943 DEBUG_STR_APPEND(a, string_compose ("Channel Map for %1 plugin %2\n", name(), pc));
1944 DEBUG_STR_APPEND(a, " * Inputs:\n");
1945 DEBUG_STR_APPEND(a, _in_map[pc]);
1946 DEBUG_STR_APPEND(a, " * Outputs:\n");
1947 DEBUG_STR_APPEND(a, _out_map[pc]);
1949 DEBUG_STR_APPEND(a, " * Thru:\n");
1950 DEBUG_STR_APPEND(a, _thru_map);
1951 DEBUG_STR_APPEND(a, "-------->>--------\n");
1952 DEBUG_TRACE (DEBUG::ChanMapping, DEBUG_STR(a).str());
1957 _no_inplace = check_inplace ();
1958 _mapping_changed = false;
1960 /* only the "noinplace_buffers" thread buffers need to be this large,
1961 * this can be optimized. other buffers are fine with
1962 * ChanCount::max (natural_input_streams (), natural_output_streams())
1963 * and route.cc's max (configured_in, configured_out)
1965 * no-inplace copies "thru" outputs (to emulate in-place) for
1966 * all outputs (to prevent overwrite) into a temporary space
1967 * which also holds input buffers (in case the plugin does process
1968 * in-place and overwrites those).
1970 * this buffers need to be at least as
1971 * natural_input_streams () + possible outputs.
1973 * sidechain inputs add a constraint on the input:
1974 * configured input + sidechain (=_configured_internal)
1976 * NB. this also satisfies
1977 * max (natural_input_streams(), natural_output_streams())
1978 * which is needed for silence runs
1980 _required_buffers = ChanCount::max (_configured_internal,
1981 natural_input_streams () + ChanCount::max (_configured_out, natural_output_streams () * get_count ()));
1983 if (old_in != in || old_out != out || old_internal != _configured_internal
1984 || old_pins != natural_input_streams ()
1985 || (old_match.method != _match.method && (old_match.method == Split || _match.method == Split))
1987 PluginIoReConfigure (); /* EMIT SIGNAL */
1990 _delaybuffers.configure (_configured_out, _plugins.front ()->max_latency ());
1991 _latency_changed = true;
1993 // we don't know the analysis window size, so we must work with the
1994 // current buffer size here. each request for data fills in these
1995 // buffers and the analyser makes sure it gets enough data for the
1997 session().ensure_buffer_set (_signal_analysis_inputs, in);
1998 _signal_analysis_inputs.set_count (in);
2000 session().ensure_buffer_set (_signal_analysis_outputs, out);
2001 _signal_analysis_outputs.set_count (out);
2003 // std::cerr << "set counts to i" << in.n_audio() << "/o" << out.n_audio() << std::endl;
2006 return Processor::configure_io (in, out);
2009 /** Decide whether this PluginInsert can support a given IO configuration.
2010 * To do this, we run through a set of possible solutions in rough order of
2013 * @param in Required input channel count.
2014 * @param out Filled in with the output channel count if we return true.
2015 * @return true if the given IO configuration can be supported.
2018 PluginInsert::can_support_io_configuration (const ChanCount& in, ChanCount& out)
2021 _sidechain->can_support_io_configuration (in, out); // never fails, sets "out"
2023 return private_can_support_io_configuration (in, out).method != Impossible;
2027 PluginInsert::private_can_support_io_configuration (ChanCount const& in, ChanCount& out) const
2029 if (!_custom_cfg && _preset_out.n_audio () > 0) {
2030 // preseed hint (for variable i/o)
2031 out.set (DataType::AUDIO, _preset_out.n_audio ());
2034 Match rv = internal_can_support_io_configuration (in, out);
2036 if (!_custom_cfg && _preset_out.n_audio () > 0) {
2037 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: using output preset: %2\n", name(), _preset_out));
2038 out.set (DataType::AUDIO, _preset_out.n_audio ());
2043 /** A private version of can_support_io_configuration which returns the method
2044 * by which the configuration can be matched, rather than just whether or not
2048 PluginInsert::internal_can_support_io_configuration (ChanCount const & inx, ChanCount& out) const
2050 if (_plugins.empty()) {
2055 if (is_channelstrip ()) {
2057 return Match (ExactMatch, 1);
2061 /* if a user specified a custom cfg, so be it. */
2063 PluginInfoPtr info = _plugins.front()->get_info();
2065 if (info->reconfigurable_io()) {
2066 return Match (Delegate, 1, _strict_io, true);
2068 return Match (ExactMatch, get_count(), _strict_io, true);
2072 /* try automatic configuration */
2073 Match m = PluginInsert::automatic_can_support_io_configuration (inx, out);
2075 PluginInfoPtr info = _plugins.front()->get_info();
2076 ChanCount inputs = info->n_inputs;
2077 ChanCount outputs = info->n_outputs;
2079 /* handle case strict-i/o */
2080 if (_strict_io && m.method != Impossible) {
2083 /* special case MIDI instruments */
2084 if (is_instrument ()) {
2085 // output = midi-bypass + at most master-out channels.
2086 ChanCount max_out (DataType::AUDIO, 2); // TODO use master-out
2087 max_out.set (DataType::MIDI, out.get(DataType::MIDI));
2088 out = ChanCount::min (out, max_out);
2089 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: special case strict-i/o instrument\n", name()));
2095 if (inx.n_audio () != out.n_audio ()) { // ignore midi bypass
2096 /* replicate processor to match output count (generators and such)
2097 * at least enough to feed every output port. */
2098 uint32_t f = 1; // at least one. e.g. control data filters, no in, no out.
2099 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2100 uint32_t nout = outputs.get (*t);
2101 if (nout == 0 || inx.get(*t) == 0) { continue; }
2102 f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nout));
2105 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: special case strict-i/o for generator\n", name()));
2106 return Match (Replicate, f, _strict_io);
2117 if (m.method != Impossible) {
2121 ChanCount ns_inputs = inputs - sidechain_input_pins ();
2123 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: resolving 'Impossible' match...\n", name()));
2125 if (info->reconfigurable_io()) {
2128 if (out.n_midi () > 0 && out.n_audio () == 0) { out.set (DataType::AUDIO, 2); }
2129 if (out.n_audio () == 0) { out.set (DataType::AUDIO, 1); }
2130 bool const r = _plugins.front()->can_support_io_configuration (inx + sidechain_input_pins (), out, &useins);
2132 // houston, we have a problem.
2133 return Match (Impossible, 0);
2136 if (inx.n_midi () > 0 && out.n_midi () == 0) { out.set (DataType::MIDI, 1); }
2137 return Match (Delegate, 1, _strict_io);
2140 ChanCount midi_bypass;
2141 if (inx.get(DataType::MIDI) == 1 && outputs.get(DataType::MIDI) == 0) {
2142 midi_bypass.set (DataType::MIDI, 1);
2145 // add at least as many plugins so that output count matches input count (w/o sidechain pins)
2147 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2148 uint32_t nin = ns_inputs.get (*t);
2149 uint32_t nout = outputs.get (*t);
2150 if (nin == 0 || inx.get(*t) == 0) { continue; }
2151 // prefer floor() so the count won't overly increase IFF (nin < nout)
2152 f = max (f, (uint32_t) floor (inx.get(*t) / (float)nout));
2154 if (f > 0 && outputs * f >= _configured_out) {
2155 out = outputs * f + midi_bypass;
2156 return Match (Replicate, f, _strict_io);
2159 // add at least as many plugins needed to connect all inputs (w/o sidechain pins)
2161 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2162 uint32_t nin = ns_inputs.get (*t);
2163 if (nin == 0 || inx.get(*t) == 0) { continue; }
2164 f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nin));
2167 out = outputs * f + midi_bypass;
2168 return Match (Replicate, f, _strict_io);
2171 // add at least as many plugins needed to connect all inputs
2173 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2174 uint32_t nin = inputs.get (*t);
2175 if (nin == 0 || inx.get(*t) == 0) { continue; }
2176 f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nin));
2178 out = outputs * f + midi_bypass;
2179 return Match (Replicate, f, _strict_io);
2182 /* this is the original Ardour 3/4 behavior, mainly for backwards compatibility */
2184 PluginInsert::automatic_can_support_io_configuration (ChanCount const & inx, ChanCount& out) const
2186 if (_plugins.empty()) {
2190 PluginInfoPtr info = _plugins.front()->get_info();
2191 ChanCount in; in += inx;
2192 ChanCount midi_bypass;
2194 if (info->reconfigurable_io()) {
2195 /* Plugin has flexible I/O, so delegate to it
2196 * pre-seed outputs, plugin tries closest match
2199 if (out.n_midi () > 0 && out.n_audio () == 0) { out.set (DataType::AUDIO, 2); }
2200 if (out.n_audio () == 0) { out.set (DataType::AUDIO, 1); }
2201 bool const r = _plugins.front()->can_support_io_configuration (in + sidechain_input_pins (), out);
2203 return Match (Impossible, 0);
2206 if (in.n_midi () > 0 && out.n_midi () == 0) { out.set (DataType::MIDI, 1); }
2207 return Match (Delegate, 1);
2210 ChanCount inputs = info->n_inputs;
2211 ChanCount outputs = info->n_outputs;
2212 ChanCount ns_inputs = inputs - sidechain_input_pins ();
2214 if (in.get(DataType::MIDI) == 1 && outputs.get(DataType::MIDI) == 0) {
2215 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: bypassing midi-data\n", name()));
2216 midi_bypass.set (DataType::MIDI, 1);
2218 if (in.get(DataType::MIDI) == 1 && inputs.get(DataType::MIDI) == 0) {
2219 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: hiding midi-port from plugin\n", name()));
2220 in.set(DataType::MIDI, 0);
2223 // add internally provided sidechain ports
2224 ChanCount insc = in + sidechain_input_ports ();
2226 bool no_inputs = true;
2227 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2228 if (inputs.get (*t) != 0) {
2235 /* no inputs so we can take any input configuration since we throw it away */
2236 out = outputs + midi_bypass;
2237 return Match (NoInputs, 1);
2240 /* Plugin inputs match requested inputs + side-chain-ports exactly */
2241 if (inputs == insc) {
2242 out = outputs + midi_bypass;
2243 return Match (ExactMatch, 1);
2246 /* Plugin inputs matches without side-chain-pins */
2247 if (ns_inputs == in) {
2248 out = outputs + midi_bypass;
2249 return Match (ExactMatch, 1);
2252 /* We may be able to run more than one copy of the plugin within this insert
2253 to cope with the insert having more inputs than the plugin.
2254 We allow replication only for plugins with either zero or 1 inputs and outputs
2255 for every valid data type.
2259 bool can_replicate = true;
2260 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2262 // ignore side-chains
2263 uint32_t nin = ns_inputs.get (*t);
2265 // No inputs of this type
2266 if (nin == 0 && in.get(*t) == 0) {
2270 if (nin != 1 || outputs.get (*t) != 1) {
2271 can_replicate = false;
2275 // Potential factor not set yet
2277 f = in.get(*t) / nin;
2280 // Factor for this type does not match another type, can not replicate
2281 if (f != (in.get(*t) / nin)) {
2282 can_replicate = false;
2287 if (can_replicate && f > 0) {
2288 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2289 out.set (*t, outputs.get(*t) * f);
2292 return Match (Replicate, f);
2295 /* If the processor has exactly one input of a given type, and
2296 the plugin has more, we can feed the single processor input
2297 to some or all of the plugin inputs. This is rather
2298 special-case-y, but the 1-to-many case is by far the
2299 simplest. How do I split thy 2 processor inputs to 3
2300 plugin inputs? Let me count the ways ...
2303 bool can_split = true;
2304 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2306 bool const can_split_type = (in.get (*t) == 1 && ns_inputs.get (*t) > 1);
2307 bool const nothing_to_do_for_type = (in.get (*t) == 0 && inputs.get (*t) == 0);
2309 if (!can_split_type && !nothing_to_do_for_type) {
2315 out = outputs + midi_bypass;
2316 return Match (Split, 1);
2319 /* If the plugin has more inputs than we want, we can `hide' some of them
2320 by feeding them silence.
2323 bool could_hide = false;
2324 bool cannot_hide = false;
2325 ChanCount hide_channels;
2327 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2328 if (inputs.get(*t) > in.get(*t)) {
2329 /* there is potential to hide, since the plugin has more inputs of type t than the insert */
2330 hide_channels.set (*t, inputs.get(*t) - in.get(*t));
2332 } else if (inputs.get(*t) < in.get(*t)) {
2333 /* we definitely cannot hide, since the plugin has fewer inputs of type t than the insert */
2338 if (could_hide && !cannot_hide) {
2339 out = outputs + midi_bypass;
2340 return Match (Hide, 1, false, false, hide_channels);
2343 return Match (Impossible, 0);
2348 PluginInsert::get_state ()
2350 return state (true);
2354 PluginInsert::state (bool full)
2356 XMLNode& node = Processor::state (full);
2358 node.set_property("type", _plugins[0]->state_node_name());
2359 node.set_property("unique-id", _plugins[0]->unique_id());
2360 node.set_property("count", (uint32_t)_plugins.size());
2362 /* remember actual i/o configuration (for later placeholder
2363 * in case the plugin goes missing) */
2364 node.add_child_nocopy (* _configured_in.state (X_("ConfiguredInput")));
2365 node.add_child_nocopy (* _custom_sinks.state (X_("CustomSinks")));
2366 node.add_child_nocopy (* _configured_out.state (X_("ConfiguredOutput")));
2367 node.add_child_nocopy (* _preset_out.state (X_("PresetOutput")));
2369 /* save custom i/o config */
2370 node.set_property("custom", _custom_cfg);
2371 for (uint32_t pc = 0; pc < get_count(); ++pc) {
2373 snprintf (tmp, sizeof(tmp), "InputMap-%d", pc);
2374 node.add_child_nocopy (* _in_map[pc].state (tmp));
2375 snprintf (tmp, sizeof(tmp), "OutputMap-%d", pc);
2376 node.add_child_nocopy (* _out_map[pc].state (tmp));
2378 node.add_child_nocopy (* _thru_map.state ("ThruMap"));
2381 node.add_child_nocopy (_sidechain->state (full));
2384 _plugins[0]->set_insert_id(this->id());
2385 node.add_child_nocopy (_plugins[0]->get_state());
2387 for (Controls::iterator c = controls().begin(); c != controls().end(); ++c) {
2388 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> ((*c).second);
2390 node.add_child_nocopy (ac->get_state());
2398 PluginInsert::set_control_ids (const XMLNode& node, int version)
2400 const XMLNodeList& nlist = node.children();
2401 XMLNodeConstIterator iter;
2402 set<Evoral::Parameter>::const_iterator p;
2404 for (iter = nlist.begin(); iter != nlist.end(); ++iter) {
2405 if ((*iter)->name() == Controllable::xml_node_name) {
2407 uint32_t p = (uint32_t)-1;
2410 if ((*iter)->get_property (X_("symbol"), str)) {
2411 boost::shared_ptr<LV2Plugin> lv2plugin = boost::dynamic_pointer_cast<LV2Plugin> (_plugins[0]);
2413 p = lv2plugin->port_index(str.c_str());
2417 if (p == (uint32_t)-1) {
2418 (*iter)->get_property (X_("parameter"), p);
2421 if (p != (uint32_t)-1) {
2423 /* this may create the new controllable */
2425 boost::shared_ptr<Evoral::Control> c = control (Evoral::Parameter (PluginAutomation, 0, p));
2427 #ifndef NO_PLUGIN_STATE
2431 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> (c);
2433 ac->set_state (**iter, version);
2442 PluginInsert::set_state(const XMLNode& node, int version)
2444 XMLNodeList nlist = node.children();
2445 XMLNodeIterator niter;
2446 XMLPropertyList plist;
2447 ARDOUR::PluginType type;
2450 if (!node.get_property ("type", str)) {
2451 error << _("XML node describing plugin is missing the `type' field") << endmsg;
2455 if (str == X_("ladspa") || str == X_("Ladspa")) { /* handle old school sessions */
2456 type = ARDOUR::LADSPA;
2457 } else if (str == X_("lv2")) {
2459 } else if (str == X_("windows-vst")) {
2460 type = ARDOUR::Windows_VST;
2461 } else if (str == X_("lxvst")) {
2462 type = ARDOUR::LXVST;
2463 } else if (str == X_("mac-vst")) {
2464 type = ARDOUR::MacVST;
2465 } else if (str == X_("audiounit")) {
2466 type = ARDOUR::AudioUnit;
2467 } else if (str == X_("luaproc")) {
2470 error << string_compose (_("unknown plugin type %1 in plugin insert state"), str) << endmsg;
2474 XMLProperty const * prop = node.property ("unique-id");
2477 #ifdef WINDOWS_VST_SUPPORT
2478 /* older sessions contain VST plugins with only an "id" field. */
2479 if (type == ARDOUR::Windows_VST) {
2480 prop = node.property ("id");
2484 #ifdef LXVST_SUPPORT
2485 /*There shouldn't be any older sessions with linuxVST support.. but anyway..*/
2486 if (type == ARDOUR::LXVST) {
2487 prop = node.property ("id");
2494 error << _("Plugin has no unique ID field") << endmsg;
2499 boost::shared_ptr<Plugin> plugin = find_plugin (_session, prop->value(), type);
2500 bool any_vst = false;
2502 /* treat VST plugins equivalent if they have the same uniqueID
2503 * allow to move sessions windows <> linux */
2504 #ifdef LXVST_SUPPORT
2505 if (plugin == 0 && (type == ARDOUR::Windows_VST || type == ARDOUR::MacVST)) {
2506 type = ARDOUR::LXVST;
2507 plugin = find_plugin (_session, prop->value(), type);
2508 if (plugin) { any_vst = true; }
2512 #ifdef WINDOWS_VST_SUPPORT
2513 if (plugin == 0 && (type == ARDOUR::LXVST || type == ARDOUR::MacVST)) {
2514 type = ARDOUR::Windows_VST;
2515 plugin = find_plugin (_session, prop->value(), type);
2516 if (plugin) { any_vst = true; }
2520 #ifdef MACVST_SUPPORT
2521 if (plugin == 0 && (type == ARDOUR::Windows_VST || type == ARDOUR::LXVST)) {
2522 type = ARDOUR::MacVST;
2523 plugin = find_plugin (_session, prop->value(), type);
2524 if (plugin) { any_vst = true; }
2528 if (plugin == 0 && type == ARDOUR::Lua) {
2529 /* unique ID (sha1 of script) was not found,
2530 * load the plugin from the serialized version in the
2531 * session-file instead.
2533 boost::shared_ptr<LuaProc> lp (new LuaProc (_session.engine(), _session, ""));
2534 XMLNode *ls = node.child (lp->state_node_name().c_str());
2536 lp->set_script_from_state (*ls);
2542 error << string_compose(
2543 _("Found a reference to a plugin (\"%1\") that is unknown.\n"
2544 "Perhaps it was removed or moved since it was last used."),
2550 // The name of the PluginInsert comes from the plugin, nothing else
2551 _name = plugin->get_info()->name;
2555 // Processor::set_state() will set this, but too late
2556 // for it to be available when setting up plugin
2557 // state. We can't call Processor::set_state() until
2558 // the plugins themselves are created and added.
2562 if (_plugins.empty()) {
2563 /* if we are adding the first plugin, we will need to set
2564 up automatable controls.
2566 add_plugin (plugin);
2567 create_automatable_parameters ();
2568 set_control_ids (node, version);
2571 node.get_property ("count", count);
2573 if (_plugins.size() != count) {
2574 for (uint32_t n = 1; n < count; ++n) {
2575 add_plugin (plugin_factory (plugin));
2579 Processor::set_state (node, version);
2581 PBD::ID new_id = this->id();
2582 PBD::ID old_id = this->id();
2584 node.get_property ("id", old_id);
2586 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2588 /* find the node with the type-specific node name ("lv2", "ladspa", etc)
2589 and set all plugins to the same state.
2592 if ( ((*niter)->name() == plugin->state_node_name())
2593 || (any_vst && ((*niter)->name() == "lxvst" || (*niter)->name() == "windows-vst" || (*niter)->name() == "mac-vst"))
2596 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2597 /* Plugin state can include external files which are named after the ID.
2599 * If regenerate_xml_or_string_ids() is set, the ID will already have
2600 * been changed, so we need to use the old ID from the XML to load the
2601 * state and then update the ID.
2603 * When copying a plugin-state, route_ui takes care of of updating the ID,
2604 * but we need to call set_insert_id() to clear the cached plugin-state
2605 * and force a change.
2607 if (!regenerate_xml_or_string_ids ()) {
2608 (*i)->set_insert_id (new_id);
2610 (*i)->set_insert_id (old_id);
2613 (*i)->set_state (**niter, version);
2615 if (regenerate_xml_or_string_ids ()) {
2616 (*i)->set_insert_id (new_id);
2620 /* when copying plugin state, notify UI */
2621 for (Controls::const_iterator li = controls().begin(); li != controls().end(); ++li) {
2622 boost::shared_ptr<PBD::Controllable> c = boost::dynamic_pointer_cast<PBD::Controllable> (li->second);
2624 c->Changed (false, Controllable::NoGroup); /* EMIT SIGNAL */
2632 if (version < 3000) {
2634 /* Only 2.X sessions need a call to set_parameter_state() - in 3.X and above
2635 this is all handled by Automatable
2638 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2639 if ((*niter)->name() == "Redirect") {
2640 /* XXX do we need to tackle placement? i think not (pd; oct 16 2009) */
2641 Processor::set_state (**niter, version);
2646 set_parameter_state_2X (node, version);
2649 node.get_property (X_("custom"), _custom_cfg);
2651 uint32_t in_maps = 0;
2652 uint32_t out_maps = 0;
2653 XMLNodeList kids = node.children ();
2654 for (XMLNodeIterator i = kids.begin(); i != kids.end(); ++i) {
2655 if ((*i)->name() == X_("ConfiguredInput")) {
2656 _configured_in = ChanCount(**i);
2658 if ((*i)->name() == X_("CustomSinks")) {
2659 _custom_sinks = ChanCount(**i);
2661 if ((*i)->name() == X_("ConfiguredOutput")) {
2662 _custom_out = ChanCount(**i);
2663 _configured_out = ChanCount(**i);
2665 if ((*i)->name() == X_("PresetOutput")) {
2666 _preset_out = ChanCount(**i);
2668 if (strncmp ((*i)->name ().c_str(), X_("InputMap-"), 9) == 0) {
2669 long pc = atol (&((*i)->name().c_str()[9]));
2670 if (pc >= 0 && pc <= (long) get_count()) {
2671 _in_map[pc] = ChanMapping (**i);
2675 if (strncmp ((*i)->name ().c_str(), X_("OutputMap-"), 10) == 0) {
2676 long pc = atol (&((*i)->name().c_str()[10]));
2677 if (pc >= 0 && pc <= (long) get_count()) {
2678 _out_map[pc] = ChanMapping (**i);
2682 if ((*i)->name () == "ThruMap") {
2683 _thru_map = ChanMapping (**i);
2686 // sidechain is a Processor (IO)
2687 if ((*i)->name () == Processor::state_node_name) {
2691 if (!regenerate_xml_or_string_ids ()) {
2692 _sidechain->set_state (**i, version);
2697 if (in_maps == out_maps && out_maps >0 && out_maps == get_count()) {
2698 _maps_from_state = true;
2701 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2705 (*i)->deactivate ();
2709 PluginConfigChanged (); /* EMIT SIGNAL */
2714 PluginInsert::update_id (PBD::ID id)
2717 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2718 (*i)->set_insert_id (id);
2723 PluginInsert::set_owner (SessionObject* o)
2725 Processor::set_owner (o);
2726 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2727 (*i)->set_owner (o);
2732 PluginInsert::set_state_dir (const std::string& d)
2734 // state() only saves the state of the first plugin
2735 _plugins[0]->set_state_dir (d);
2739 PluginInsert::set_parameter_state_2X (const XMLNode& node, int version)
2741 XMLNodeList nlist = node.children();
2742 XMLNodeIterator niter;
2744 /* look for port automation node */
2746 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2748 if ((*niter)->name() != port_automation_node_name) {
2753 XMLNodeConstIterator iter;
2757 cnodes = (*niter)->children ("port");
2759 for (iter = cnodes.begin(); iter != cnodes.end(); ++iter){
2763 if (!child->get_property("number", port_id)) {
2764 warning << _("PluginInsert: Auto: no ladspa port number") << endmsg;
2768 if (port_id >= _plugins[0]->parameter_count()) {
2769 warning << _("PluginInsert: Auto: port id out of range") << endmsg;
2773 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(
2774 control(Evoral::Parameter(PluginAutomation, 0, port_id), true));
2776 if (c && c->alist()) {
2777 if (!child->children().empty()) {
2778 c->alist()->set_state (*child->children().front(), version);
2781 error << string_compose (_("PluginInsert: automatable control %1 not found - ignored"), port_id) << endmsg;
2791 boost::shared_ptr<ReadOnlyControl>
2792 PluginInsert::control_output (uint32_t num) const
2794 CtrlOutMap::const_iterator i = _control_outputs.find (num);
2795 if (i == _control_outputs.end ()) {
2796 return boost::shared_ptr<ReadOnlyControl> ();
2803 PluginInsert::describe_parameter (Evoral::Parameter param)
2805 if (param.type() == PluginAutomation) {
2806 return _plugins[0]->describe_parameter (param);
2807 } else if (param.type() == PluginPropertyAutomation) {
2808 boost::shared_ptr<AutomationControl> c(automation_control(param));
2809 if (c && !c->desc().label.empty()) {
2810 return c->desc().label;
2813 return Automatable::describe_parameter(param);
2817 PluginInsert::signal_latency() const
2819 if (!_pending_active) {
2822 if (_user_latency) {
2823 return _user_latency;
2826 return _plugins[0]->signal_latency ();
2830 PluginInsert::type ()
2832 return plugin()->get_info()->type;
2835 PluginInsert::PluginControl::PluginControl (PluginInsert* p,
2836 const Evoral::Parameter& param,
2837 const ParameterDescriptor& desc,
2838 boost::shared_ptr<AutomationList> list)
2839 : AutomationControl (p->session(), param, desc, list, p->describe_parameter(param))
2844 list->set_interpolation(Evoral::ControlList::Discrete);
2849 /** @param val `user' value */
2852 PluginInsert::PluginControl::actually_set_value (double user_val, PBD::Controllable::GroupControlDisposition group_override)
2854 /* FIXME: probably should be taking out some lock here.. */
2856 for (Plugins::iterator i = _plugin->_plugins.begin(); i != _plugin->_plugins.end(); ++i) {
2857 (*i)->set_parameter (_list->parameter().id(), user_val);
2860 boost::shared_ptr<Plugin> iasp = _plugin->_impulseAnalysisPlugin.lock();
2862 iasp->set_parameter (_list->parameter().id(), user_val);
2865 AutomationControl::actually_set_value (user_val, group_override);
2869 PluginInsert::PluginControl::catch_up_with_external_value (double user_val)
2871 AutomationControl::actually_set_value (user_val, Controllable::NoGroup);
2875 PluginInsert::PluginControl::get_state ()
2877 XMLNode& node (AutomationControl::get_state());
2878 node.set_property (X_("parameter"), parameter().id());
2880 boost::shared_ptr<LV2Plugin> lv2plugin = boost::dynamic_pointer_cast<LV2Plugin> (_plugin->_plugins[0]);
2882 node.set_property (X_("symbol"), lv2plugin->port_symbol (parameter().id()));
2889 /** @return `user' val */
2891 PluginInsert::PluginControl::get_value () const
2893 boost::shared_ptr<Plugin> plugin = _plugin->plugin (0);
2899 return plugin->get_parameter (_list->parameter().id());
2902 PluginInsert::PluginPropertyControl::PluginPropertyControl (PluginInsert* p,
2903 const Evoral::Parameter& param,
2904 const ParameterDescriptor& desc,
2905 boost::shared_ptr<AutomationList> list)
2906 : AutomationControl (p->session(), param, desc, list)
2912 PluginInsert::PluginPropertyControl::actually_set_value (double user_val, Controllable::GroupControlDisposition gcd)
2914 /* Old numeric set_value(), coerce to appropriate datatype if possible.
2915 This is lossy, but better than nothing until Ardour's automation system
2916 can handle various datatypes all the way down. */
2917 const Variant value(_desc.datatype, user_val);
2918 if (value.type() == Variant::NOTHING) {
2919 error << "set_value(double) called for non-numeric property" << endmsg;
2923 for (Plugins::iterator i = _plugin->_plugins.begin(); i != _plugin->_plugins.end(); ++i) {
2924 (*i)->set_property(_list->parameter().id(), value);
2929 AutomationControl::actually_set_value (user_val, gcd);
2933 PluginInsert::PluginPropertyControl::get_state ()
2935 XMLNode& node (AutomationControl::get_state());
2936 node.set_property (X_("property"), parameter().id());
2937 node.remove_property (X_("value"));
2943 PluginInsert::PluginPropertyControl::get_value () const
2945 return _value.to_double();
2948 boost::shared_ptr<Plugin>
2949 PluginInsert::get_impulse_analysis_plugin()
2951 boost::shared_ptr<Plugin> ret;
2952 if (_impulseAnalysisPlugin.expired()) {
2953 // LV2 in particular uses various _session params
2954 // during init() -- most notably block_size..
2956 ret = plugin_factory(_plugins[0]);
2957 ChanCount out (internal_output_streams ());
2958 if (ret->get_info ()->reconfigurable_io ()) {
2959 // populate get_info ()->n_inputs and ->n_outputs
2961 ret->can_support_io_configuration (internal_input_streams (), out, &useins);
2962 assert (out == internal_output_streams ());
2964 ret->configure_io (internal_input_streams (), out);
2965 ret->set_owner (_owner);
2966 _impulseAnalysisPlugin = ret;
2968 ret = _impulseAnalysisPlugin.lock();
2975 PluginInsert::collect_signal_for_analysis (framecnt_t nframes)
2977 // called from outside the audio thread, so this should be safe
2978 // only do audio as analysis is (currently) only for audio plugins
2979 _signal_analysis_inputs.ensure_buffers (DataType::AUDIO, input_streams().n_audio(), nframes);
2980 _signal_analysis_outputs.ensure_buffers (DataType::AUDIO, output_streams().n_audio(), nframes);
2982 _signal_analysis_collected_nframes = 0;
2983 _signal_analysis_collect_nframes_max = nframes;
2986 /** Add a plugin to our list */
2988 PluginInsert::add_plugin (boost::shared_ptr<Plugin> plugin)
2990 plugin->set_insert_id (this->id());
2991 plugin->set_owner (_owner);
2993 if (_plugins.empty()) {
2994 /* first (and probably only) plugin instance - connect to relevant signals */
2996 plugin->ParameterChangedExternally.connect_same_thread (*this, boost::bind (&PluginInsert::parameter_changed_externally, this, _1, _2));
2997 plugin->StartTouch.connect_same_thread (*this, boost::bind (&PluginInsert::start_touch, this, _1));
2998 plugin->EndTouch.connect_same_thread (*this, boost::bind (&PluginInsert::end_touch, this, _1));
2999 _custom_sinks = plugin->get_info()->n_inputs;
3000 // cache sidechain port count
3001 _cached_sidechain_pins.reset ();
3002 const ChanCount& nis (plugin->get_info()->n_inputs);
3003 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3004 for (uint32_t in = 0; in < nis.get (*t); ++in) {
3005 const Plugin::IOPortDescription& iod (plugin->describe_io_port (*t, true, in));
3006 if (iod.is_sidechain) {
3007 _cached_sidechain_pins.set (*t, 1 + _cached_sidechain_pins.n(*t));
3012 #if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT || defined MACVST_SUPPORT)
3013 boost::shared_ptr<VSTPlugin> vst = boost::dynamic_pointer_cast<VSTPlugin> (plugin);
3015 vst->set_insert (this, _plugins.size ());
3019 _plugins.push_back (plugin);
3023 PluginInsert::load_preset (ARDOUR::Plugin::PresetRecord pr)
3026 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
3027 if (! (*i)->load_preset (pr)) {
3035 PluginInsert::realtime_handle_transport_stopped ()
3037 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
3038 (*i)->realtime_handle_transport_stopped ();
3043 PluginInsert::realtime_locate ()
3045 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
3046 (*i)->realtime_locate ();
3051 PluginInsert::monitoring_changed ()
3053 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
3054 (*i)->monitoring_changed ();
3059 PluginInsert::latency_changed ()
3061 // this is called in RT context, LatencyChanged is emitted after run()
3062 _latency_changed = true;
3063 // XXX This also needs a proper API not an owner() hack.
3065 static_cast<Route*>(owner ())->processor_latency_changed (); /* EMIT SIGNAL */
3069 PluginInsert::start_touch (uint32_t param_id)
3071 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id));
3073 // ToDo subtract _plugin_signal_latency from audible_frame() when rolling, assert > 0
3074 ac->start_touch (session().audible_frame());
3079 PluginInsert::end_touch (uint32_t param_id)
3081 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id));
3083 // ToDo subtract _plugin_signal_latency from audible_frame() when rolling, assert > 0
3084 ac->stop_touch (true, session().audible_frame());
3088 std::ostream& operator<<(std::ostream& o, const ARDOUR::PluginInsert::Match& m)
3091 case PluginInsert::Impossible: o << "Impossible"; break;
3092 case PluginInsert::Delegate: o << "Delegate"; break;
3093 case PluginInsert::NoInputs: o << "NoInputs"; break;
3094 case PluginInsert::ExactMatch: o << "ExactMatch"; break;
3095 case PluginInsert::Replicate: o << "Replicate"; break;
3096 case PluginInsert::Split: o << "Split"; break;
3097 case PluginInsert::Hide: o << "Hide"; break;
3099 o << " cnt: " << m.plugins
3100 << (m.strict_io ? " strict-io" : "")
3101 << (m.custom_cfg ? " custom-cfg" : "");
3102 if (m.method == PluginInsert::Hide) {
3103 o << " hide: " << m.hide;