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)
1135 _delaybuffers.flush ();
1137 ChanMapping in_map (natural_input_streams ());
1138 ChanMapping out_map (natural_output_streams ());
1139 ChanCount maxbuf = ChanCount::max (natural_input_streams (), natural_output_streams());
1141 if (is_channelstrip ()) {
1142 if (_configured_in.n_audio() > 0) {
1143 _plugins.front()->connect_and_run (_session.get_scratch_buffers (maxbuf, true), start_frame, start_frame + nframes, 1.0, in_map, out_map, nframes, 0);
1147 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1148 (*i)->connect_and_run (_session.get_scratch_buffers (maxbuf, true), start_frame, start_frame + nframes, 1.0, in_map, out_map, nframes, 0);
1153 PluginInsert::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, double speed, pframes_t nframes, bool)
1156 // collect sidechain input for complete cycle (!)
1157 // TODO we need delaylines here for latency compensation
1158 _sidechain->run (bufs, start_frame, end_frame, speed, nframes, true);
1161 if (_pending_active) {
1162 /* run as normal if we are active or moving from inactive to active */
1164 if (_session.transport_rolling() || _session.bounce_processing()) {
1165 automate_and_run (bufs, start_frame, end_frame, speed, nframes);
1167 Glib::Threads::Mutex::Lock lm (control_lock(), Glib::Threads::TRY_LOCK);
1168 connect_and_run (bufs, start_frame, end_frame, speed, nframes, 0, lm.locked());
1172 bypass (bufs, nframes);
1173 automation_run (start_frame, nframes);
1174 _delaybuffers.flush ();
1177 _active = _pending_active;
1179 /* we have no idea whether the plugin generated silence or not, so mark
1180 * all buffers appropriately.
1185 PluginInsert::automate_and_run (BufferSet& bufs, framepos_t start, framepos_t end, double speed, pframes_t nframes)
1187 Evoral::ControlEvent next_event (0, 0.0f);
1188 framecnt_t offset = 0;
1190 Glib::Threads::Mutex::Lock lm (control_lock(), Glib::Threads::TRY_LOCK);
1193 connect_and_run (bufs, start, end, speed, nframes, offset, false);
1197 if (!find_next_event (start, end, next_event) || _plugins.front()->requires_fixed_sized_buffers()) {
1199 /* no events have a time within the relevant range */
1201 connect_and_run (bufs, start, end, speed, nframes, offset, true);
1207 framecnt_t cnt = min (((framecnt_t) ceil (next_event.when) - start), (framecnt_t) nframes);
1209 connect_and_run (bufs, start, start + cnt, speed, cnt, offset, true); // XXX (start + cnt) * speed
1215 if (!find_next_event (start, end, next_event)) {
1220 /* cleanup anything that is left to do */
1223 connect_and_run (bufs, start, start + nframes, speed, nframes, offset, true);
1228 PluginInsert::default_parameter_value (const Evoral::Parameter& param)
1230 if (param.type() != PluginAutomation)
1233 if (_plugins.empty()) {
1234 fatal << _("programming error: ") << X_("PluginInsert::default_parameter_value() called with no plugin")
1236 abort(); /*NOTREACHED*/
1239 return _plugins[0]->default_value (param.id());
1244 PluginInsert::can_reset_all_parameters ()
1247 uint32_t params = 0;
1248 for (uint32_t par = 0; par < _plugins[0]->parameter_count(); ++par) {
1250 const uint32_t cid = _plugins[0]->nth_parameter (par, ok);
1252 if (!ok || !_plugins[0]->parameter_is_input(cid)) {
1256 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, cid));
1262 if (ac->automation_state() & Play) {
1267 return all && (params > 0);
1271 PluginInsert::reset_parameters_to_default ()
1275 for (uint32_t par = 0; par < _plugins[0]->parameter_count(); ++par) {
1277 const uint32_t cid = _plugins[0]->nth_parameter (par, ok);
1279 if (!ok || !_plugins[0]->parameter_is_input(cid)) {
1283 const float dflt = _plugins[0]->default_value (cid);
1284 const float curr = _plugins[0]->get_parameter (cid);
1290 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, cid));
1295 if (ac->automation_state() & Play) {
1300 ac->set_value (dflt, Controllable::NoGroup);
1305 boost::shared_ptr<Plugin>
1306 PluginInsert::plugin_factory (boost::shared_ptr<Plugin> other)
1308 boost::shared_ptr<LadspaPlugin> lp;
1309 boost::shared_ptr<LuaProc> lua;
1311 boost::shared_ptr<LV2Plugin> lv2p;
1313 #ifdef WINDOWS_VST_SUPPORT
1314 boost::shared_ptr<WindowsVSTPlugin> vp;
1316 #ifdef LXVST_SUPPORT
1317 boost::shared_ptr<LXVSTPlugin> lxvp;
1319 #ifdef MACVST_SUPPORT
1320 boost::shared_ptr<MacVSTPlugin> mvp;
1322 #ifdef AUDIOUNIT_SUPPORT
1323 boost::shared_ptr<AUPlugin> ap;
1326 if ((lp = boost::dynamic_pointer_cast<LadspaPlugin> (other)) != 0) {
1327 return boost::shared_ptr<Plugin> (new LadspaPlugin (*lp));
1328 } else if ((lua = boost::dynamic_pointer_cast<LuaProc> (other)) != 0) {
1329 return boost::shared_ptr<Plugin> (new LuaProc (*lua));
1331 } else if ((lv2p = boost::dynamic_pointer_cast<LV2Plugin> (other)) != 0) {
1332 return boost::shared_ptr<Plugin> (new LV2Plugin (*lv2p));
1334 #ifdef WINDOWS_VST_SUPPORT
1335 } else if ((vp = boost::dynamic_pointer_cast<WindowsVSTPlugin> (other)) != 0) {
1336 return boost::shared_ptr<Plugin> (new WindowsVSTPlugin (*vp));
1338 #ifdef LXVST_SUPPORT
1339 } else if ((lxvp = boost::dynamic_pointer_cast<LXVSTPlugin> (other)) != 0) {
1340 return boost::shared_ptr<Plugin> (new LXVSTPlugin (*lxvp));
1342 #ifdef MACVST_SUPPORT
1343 } else if ((mvp = boost::dynamic_pointer_cast<MacVSTPlugin> (other)) != 0) {
1344 return boost::shared_ptr<Plugin> (new MacVSTPlugin (*mvp));
1346 #ifdef AUDIOUNIT_SUPPORT
1347 } else if ((ap = boost::dynamic_pointer_cast<AUPlugin> (other)) != 0) {
1348 return boost::shared_ptr<Plugin> (new AUPlugin (*ap));
1352 fatal << string_compose (_("programming error: %1"),
1353 X_("unknown plugin type in PluginInsert::plugin_factory"))
1355 abort(); /*NOTREACHED*/
1356 return boost::shared_ptr<Plugin> ((Plugin*) 0);
1360 PluginInsert::set_input_map (uint32_t num, ChanMapping m) {
1361 if (num < _in_map.size()) {
1362 bool changed = _in_map[num] != m;
1364 changed |= sanitize_maps ();
1366 PluginMapChanged (); /* EMIT SIGNAL */
1367 _mapping_changed = true;
1368 _session.set_dirty();
1374 PluginInsert::set_output_map (uint32_t num, ChanMapping m) {
1375 if (num < _out_map.size()) {
1376 bool changed = _out_map[num] != m;
1378 changed |= sanitize_maps ();
1380 PluginMapChanged (); /* EMIT SIGNAL */
1381 _mapping_changed = true;
1382 _session.set_dirty();
1388 PluginInsert::set_thru_map (ChanMapping m) {
1389 bool changed = _thru_map != m;
1391 changed |= sanitize_maps ();
1393 PluginMapChanged (); /* EMIT SIGNAL */
1394 _mapping_changed = true;
1395 _session.set_dirty();
1400 PluginInsert::pre_seed (const ChanCount& in, const ChanCount& out,
1401 const ChanMapping& im, const ChanMapping& om, const ChanMapping& tm)
1403 if (_configured) { return false; }
1404 _configured_in = in;
1405 _configured_out = out;
1409 _maps_from_state = in.n_total () > 0 && out.n_total () > 0;
1414 PluginInsert::input_map () const
1418 for (PinMappings::const_iterator i = _in_map.begin (); i != _in_map.end (); ++i, ++pc) {
1419 ChanMapping m (i->second);
1420 const ChanMapping::Mappings& mp ((*i).second.mappings());
1421 for (ChanMapping::Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
1422 for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
1423 rv.set (tm->first, i->first + pc * natural_input_streams().get(tm->first), i->second);
1432 PluginInsert::no_sc_input_map () const
1436 for (PinMappings::const_iterator i = _in_map.begin (); i != _in_map.end (); ++i, ++pc) {
1437 ChanMapping m (i->second);
1438 const ChanMapping::Mappings& mp ((*i).second.mappings());
1439 for (ChanMapping::Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
1440 uint32_t ins = natural_input_streams().get(tm->first) - _cached_sidechain_pins.get(tm->first);
1441 for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
1442 if (i->first < ins) {
1443 rv.set (tm->first, i->first + pc * ins, i->second);
1452 PluginInsert::output_map () const
1456 for (PinMappings::const_iterator i = _out_map.begin (); i != _out_map.end (); ++i, ++pc) {
1457 ChanMapping m (i->second);
1458 const ChanMapping::Mappings& mp ((*i).second.mappings());
1459 for (ChanMapping::Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
1460 for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
1461 rv.set (tm->first, i->first + pc * natural_output_streams().get(tm->first), i->second);
1465 if (has_midi_bypass ()) {
1466 rv.set (DataType::MIDI, 0, 0);
1473 PluginInsert::has_midi_bypass () const
1475 if (_configured_in.n_midi () == 1 && _configured_out.n_midi () == 1
1476 && natural_output_streams ().n_midi () == 0) {
1483 PluginInsert::has_midi_thru () const
1485 if (_configured_in.n_midi () == 1 && _configured_out.n_midi () == 1
1486 && natural_input_streams ().n_midi () == 0 && natural_output_streams ().n_midi () == 0) {
1494 PluginInsert::is_channelstrip () const {
1495 return _plugins.front()->is_channelstrip();
1500 PluginInsert::check_inplace ()
1502 bool inplace_ok = !_plugins.front()->inplace_broken ();
1504 if (_thru_map.n_total () > 0) {
1505 // TODO once midi-bypass is part of the mapping, ignore it
1509 if (_match.method == Split && inplace_ok) {
1510 assert (get_count() == 1);
1511 assert (_in_map.size () == 1);
1512 if (!_out_map[0].is_monotonic ()) {
1515 if (_configured_internal != _configured_in) {
1516 /* no sidechain -- TODO we could allow this with
1517 * some more logic in PluginInsert::connect_and_run().
1519 * PluginInsert::reset_map() already maps it.
1524 for (DataType::iterator t = DataType::begin(); t != DataType::end() && inplace_ok; ++t) {
1525 if (_configured_internal.get (*t) == 0) {
1529 uint32_t first_idx = _in_map[0].get (*t, 0, &valid);
1530 if (!valid || first_idx != 0) {
1531 // so far only allow to copy the *first* stream's buffer to others
1534 for (uint32_t i = 1; i < natural_input_streams ().get (*t); ++i) {
1535 uint32_t idx = _in_map[0].get (*t, i, &valid);
1536 if (valid && idx != first_idx) {
1545 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: In Place Split Map\n", name()));
1550 for (uint32_t pc = 0; pc < get_count() && inplace_ok ; ++pc) {
1551 if (!_in_map[pc].is_monotonic ()) {
1554 if (!_out_map[pc].is_monotonic ()) {
1560 /* check if every output is fed by the corresponding input
1562 * this prevents in-port 1 -> sink-pin 2 || source-pin 1 -> out port 1, source-pin 2 -> out port 2
1563 * (with in-place, source-pin 1 -> out port 1 overwrites in-port 1)
1565 * but allows in-port 1 -> sink-pin 2 || source-pin 2 -> out port 1
1567 ChanMapping in_map (input_map ());
1568 const ChanMapping::Mappings out_m (output_map ().mappings ());
1569 for (ChanMapping::Mappings::const_iterator t = out_m.begin (); t != out_m.end () && inplace_ok; ++t) {
1570 for (ChanMapping::TypeMapping::const_iterator c = (*t).second.begin (); c != (*t).second.end () ; ++c) {
1571 /* src-pin: c->first, out-port: c->second */
1573 uint32_t in_port = in_map.get (t->first, c->first, &valid);
1574 if (valid && in_port != c->second) {
1582 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: %2\n", name(), inplace_ok ? "In-Place" : "No Inplace Processing"));
1583 return !inplace_ok; // no-inplace
1587 PluginInsert::sanitize_maps ()
1589 bool changed = false;
1590 /* strip dead wood */
1591 PinMappings new_ins;
1592 PinMappings new_outs;
1593 ChanMapping new_thru;
1595 for (uint32_t pc = 0; pc < get_count(); ++pc) {
1597 ChanMapping new_out;
1598 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1599 for (uint32_t i = 0; i < natural_input_streams().get (*t); ++i) {
1601 uint32_t idx = _in_map[pc].get (*t, i, &valid);
1602 if (valid && idx < _configured_internal.get (*t)) {
1603 new_in.set (*t, i, idx);
1606 for (uint32_t o = 0; o < natural_output_streams().get (*t); ++o) {
1608 uint32_t idx = _out_map[pc].get (*t, o, &valid);
1609 if (valid && idx < _configured_out.get (*t)) {
1610 new_out.set (*t, o, idx);
1614 if (_in_map[pc] != new_in || _out_map[pc] != new_out) {
1617 new_ins[pc] = new_in;
1618 new_outs[pc] = new_out;
1621 /* prevent dup output assignments */
1622 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1623 for (uint32_t o = 0; o < _configured_out.get (*t); ++o) {
1624 bool mapped = false;
1625 for (uint32_t pc = 0; pc < get_count(); ++pc) {
1627 uint32_t idx = new_outs[pc].get_src (*t, o, &valid);
1628 if (valid && mapped) {
1629 new_outs[pc].unset (*t, idx);
1637 /* remove excess thru */
1638 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1639 for (uint32_t o = 0; o < _configured_out.get (*t); ++o) {
1641 uint32_t idx = _thru_map.get (*t, o, &valid);
1642 if (valid && idx < _configured_internal.get (*t)) {
1643 new_thru.set (*t, o, idx);
1648 /* prevent out + thru, existing plugin outputs override thru */
1649 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1650 for (uint32_t o = 0; o < _configured_out.get (*t); ++o) {
1651 bool mapped = false;
1653 for (uint32_t pc = 0; pc < get_count(); ++pc) {
1654 new_outs[pc].get_src (*t, o, &mapped);
1655 if (mapped) { break; }
1657 if (!mapped) { continue; }
1658 uint32_t idx = new_thru.get (*t, o, &valid);
1660 new_thru.unset (*t, idx);
1665 if (has_midi_bypass ()) {
1666 // TODO: include midi-bypass in the thru set,
1667 // remove dedicated handling.
1668 new_thru.unset (DataType::MIDI, 0);
1671 if (_in_map != new_ins || _out_map != new_outs || _thru_map != new_thru) {
1675 _out_map = new_outs;
1676 _thru_map = new_thru;
1682 PluginInsert::reset_map (bool emit)
1684 const PinMappings old_in (_in_map);
1685 const PinMappings old_out (_out_map);
1689 _thru_map = ChanMapping ();
1691 /* build input map */
1692 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1693 uint32_t sc = 0; // side-chain round-robin (all instances)
1695 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
1696 const uint32_t nis = natural_input_streams ().get(*t);
1697 const uint32_t stride = nis - sidechain_input_pins().get (*t);
1699 /* SC inputs are last in the plugin-insert.. */
1700 const uint32_t sc_start = _configured_in.get (*t);
1701 const uint32_t sc_len = _configured_internal.get (*t) - sc_start;
1702 /* ...but may not be at the end of the plugin ports.
1703 * in case the side-chain is not the last port, shift connections back.
1704 * and connect to side-chain
1707 uint32_t ic = 0; // split inputs
1708 const uint32_t cend = _configured_in.get (*t);
1710 for (uint32_t in = 0; in < nis; ++in) {
1711 const Plugin::IOPortDescription& iod (_plugins[pc]->describe_io_port (*t, true, in));
1712 if (iod.is_sidechain) {
1713 /* connect sidechain sinks to sidechain inputs in round-robin fashion */
1714 if (sc_len > 0) {// side-chain may be hidden
1715 _in_map[pc].set (*t, in, sc_start + sc);
1716 sc = (sc + 1) % sc_len;
1720 if (_match.method == Split) {
1721 if (cend == 0) { continue; }
1722 if (_strict_io && ic + stride * pc >= cend) {
1725 /* connect *no* sidechain sinks in round-robin fashion */
1726 _in_map[pc].set (*t, in, ic + stride * pc);
1727 if (_strict_io && (ic + 1) == cend) {
1730 ic = (ic + 1) % cend;
1732 uint32_t s = in - shift;
1733 if (stride * pc + s < cend) {
1734 _in_map[pc].set (*t, in, s + stride * pc);
1742 /* build output map */
1744 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
1745 _out_map[pc] = ChanMapping (ChanCount::min (natural_output_streams(), _configured_out));
1746 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1747 _out_map[pc].offset_to(*t, pc * natural_output_streams().get(*t));
1752 if (old_in == _in_map && old_out == _out_map) {
1756 PluginMapChanged (); /* EMIT SIGNAL */
1757 _mapping_changed = true;
1758 _session.set_dirty();
1764 PluginInsert::configure_io (ChanCount in, ChanCount out)
1766 Match old_match = _match;
1768 ChanCount old_internal;
1772 old_pins = natural_input_streams();
1773 old_in = _configured_in;
1774 old_out = _configured_out;
1775 old_internal = _configured_internal;
1777 _configured_in = in;
1778 _configured_internal = in;
1779 _configured_out = out;
1782 /* TODO hide midi-bypass, and custom outs. Best /fake/ "out" here.
1783 * (currently _sidechain->configure_io always succeeds
1784 * since Processor::configure_io() succeeds)
1786 if (!_sidechain->configure_io (in, out)) {
1787 DEBUG_TRACE (DEBUG::ChanMapping, "Sidechain configuration failed\n");
1790 _configured_internal += _sidechain->input()->n_ports();
1792 // include (static_cast<Route*>owner())->name() ??
1793 _sidechain->input ()-> set_pretty_name (string_compose (_("SC %1"), name ()));
1796 /* get plugin configuration */
1797 _match = private_can_support_io_configuration (in, out);
1799 if (DEBUG_ENABLED(DEBUG::ChanMapping)) {
1801 DEBUG_STR_APPEND(a, string_compose ("%1: ", name()));
1802 DEBUG_STR_APPEND(a, _match);
1803 DEBUG_TRACE (DEBUG::ChanMapping, DEBUG_STR(a).str());
1807 /* set the matching method and number of plugins that we will use to meet this configuration */
1808 if (set_count (_match.plugins) == false) {
1809 PluginIoReConfigure (); /* EMIT SIGNAL */
1810 _configured = false;
1814 /* configure plugins */
1815 switch (_match.method) {
1818 if (_plugins.front()->configure_io (natural_input_streams(), out) == false) {
1819 PluginIoReConfigure (); /* EMIT SIGNAL */
1820 _configured = false;
1826 ChanCount din (_configured_internal);
1827 ChanCount dout (din); // hint
1829 if (_custom_sinks.n_total () > 0) {
1830 din = _custom_sinks;
1833 } else if (_preset_out.n_audio () > 0) {
1834 dout.set (DataType::AUDIO, _preset_out.n_audio ());
1835 } else if (dout.n_midi () > 0 && dout.n_audio () == 0) {
1836 dout.set (DataType::AUDIO, 2);
1838 if (out.n_audio () == 0) { out.set (DataType::AUDIO, 1); }
1840 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: Delegate lookup : %2 %3\n", name(), din, dout));
1841 bool const r = _plugins.front()->can_support_io_configuration (din, dout, &useins);
1843 if (useins.n_audio() == 0) {
1846 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: Delegate configuration: %2 %3\n", name(), useins, dout));
1848 if (_plugins.front()->configure_io (useins, dout) == false) {
1849 PluginIoReConfigure (); /* EMIT SIGNAL */
1850 _configured = false;
1854 _custom_sinks = din;
1859 if (_plugins.front()->configure_io (in, out) == false) {
1860 PluginIoReConfigure (); /* EMIT SIGNAL */
1861 _configured = false;
1867 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",
1869 _configured ? "Y" : "N",
1870 _maps_from_state ? "Y" : "N",
1871 old_in == in ? "==" : "!=",
1872 old_out == out ? "==" : "!=",
1873 old_pins == natural_input_streams () ? "==" : "!=",
1874 old_match.method == _match.method ? "==" : "!=",
1875 old_match.custom_cfg == _match.custom_cfg ? "==" : "!=",
1876 _in_map.size() == get_count () ? "==" : "!=",
1877 _out_map.size() == get_count () ? "==" : "!="
1880 bool mapping_changed = false;
1881 if (old_in == in && old_out == out
1883 && old_pins == natural_input_streams ()
1884 && old_match.method == _match.method
1885 && old_match.custom_cfg == _match.custom_cfg
1886 && _in_map.size() == _out_map.size()
1887 && _in_map.size() == get_count ()
1889 /* If the configuration has not changed, keep the mapping */
1890 mapping_changed = sanitize_maps ();
1891 } else if (_match.custom_cfg && _configured) {
1892 /* don't touch the map in manual mode */
1893 mapping_changed = sanitize_maps ();
1896 if (is_channelstrip ()) {
1897 /* fake channel map - for wire display */
1900 _thru_map = ChanMapping ();
1901 _in_map[0] = ChanMapping (ChanCount::min (_configured_in, ChanCount (DataType::AUDIO, 2)));
1902 _out_map[0] = ChanMapping (ChanCount::min (_configured_out, ChanCount (DataType::AUDIO, 2)));
1903 /* set "thru" map for in-place forward of audio */
1904 for (uint32_t i = 2; i < _configured_in.n_audio(); ++i) {
1905 _thru_map.set (DataType::AUDIO, i, i);
1907 /* and midi (after implicit 1st channel bypass) */
1908 for (uint32_t i = 1; i < _configured_in.n_midi(); ++i) {
1909 _thru_map.set (DataType::MIDI, i, i);
1913 if (_maps_from_state && old_in == in && old_out == out) {
1914 mapping_changed = true;
1917 /* generate a new mapping */
1918 mapping_changed = reset_map (false);
1920 _maps_from_state = false;
1923 if (mapping_changed) {
1924 PluginMapChanged (); /* EMIT SIGNAL */
1927 if (DEBUG_ENABLED(DEBUG::ChanMapping)) {
1930 DEBUG_STR_APPEND(a, "\n--------<<--------\n");
1931 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
1933 DEBUG_STR_APPEND(a, "----><----\n");
1935 DEBUG_STR_APPEND(a, string_compose ("Channel Map for %1 plugin %2\n", name(), pc));
1936 DEBUG_STR_APPEND(a, " * Inputs:\n");
1937 DEBUG_STR_APPEND(a, _in_map[pc]);
1938 DEBUG_STR_APPEND(a, " * Outputs:\n");
1939 DEBUG_STR_APPEND(a, _out_map[pc]);
1941 DEBUG_STR_APPEND(a, " * Thru:\n");
1942 DEBUG_STR_APPEND(a, _thru_map);
1943 DEBUG_STR_APPEND(a, "-------->>--------\n");
1944 DEBUG_TRACE (DEBUG::ChanMapping, DEBUG_STR(a).str());
1949 _no_inplace = check_inplace ();
1950 _mapping_changed = false;
1952 /* only the "noinplace_buffers" thread buffers need to be this large,
1953 * this can be optimized. other buffers are fine with
1954 * ChanCount::max (natural_input_streams (), natural_output_streams())
1955 * and route.cc's max (configured_in, configured_out)
1957 * no-inplace copies "thru" outputs (to emulate in-place) for
1958 * all outputs (to prevent overwrite) into a temporary space
1959 * which also holds input buffers (in case the plugin does process
1960 * in-place and overwrites those).
1962 * this buffers need to be at least as
1963 * natural_input_streams () + possible outputs.
1965 * sidechain inputs add a constraint on the input:
1966 * configured input + sidechain (=_configured_internal)
1968 * NB. this also satisfies
1969 * max (natural_input_streams(), natural_output_streams())
1970 * which is needed for silence runs
1972 _required_buffers = ChanCount::max (_configured_internal,
1973 natural_input_streams () + ChanCount::max (_configured_out, natural_output_streams () * get_count ()));
1975 if (old_in != in || old_out != out || old_internal != _configured_internal
1976 || old_pins != natural_input_streams ()
1977 || (old_match.method != _match.method && (old_match.method == Split || _match.method == Split))
1979 PluginIoReConfigure (); /* EMIT SIGNAL */
1982 _delaybuffers.configure (_configured_out, _plugins.front ()->max_latency ());
1983 _latency_changed = true;
1985 // we don't know the analysis window size, so we must work with the
1986 // current buffer size here. each request for data fills in these
1987 // buffers and the analyser makes sure it gets enough data for the
1989 session().ensure_buffer_set (_signal_analysis_inputs, in);
1990 _signal_analysis_inputs.set_count (in);
1992 session().ensure_buffer_set (_signal_analysis_outputs, out);
1993 _signal_analysis_outputs.set_count (out);
1995 // std::cerr << "set counts to i" << in.n_audio() << "/o" << out.n_audio() << std::endl;
1998 return Processor::configure_io (in, out);
2001 /** Decide whether this PluginInsert can support a given IO configuration.
2002 * To do this, we run through a set of possible solutions in rough order of
2005 * @param in Required input channel count.
2006 * @param out Filled in with the output channel count if we return true.
2007 * @return true if the given IO configuration can be supported.
2010 PluginInsert::can_support_io_configuration (const ChanCount& in, ChanCount& out)
2013 _sidechain->can_support_io_configuration (in, out); // never fails, sets "out"
2015 return private_can_support_io_configuration (in, out).method != Impossible;
2019 PluginInsert::private_can_support_io_configuration (ChanCount const& in, ChanCount& out) const
2021 if (!_custom_cfg && _preset_out.n_audio () > 0) {
2022 // preseed hint (for variable i/o)
2023 out.set (DataType::AUDIO, _preset_out.n_audio ());
2026 Match rv = internal_can_support_io_configuration (in, out);
2028 if (!_custom_cfg && _preset_out.n_audio () > 0) {
2029 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: using output preset: %2\n", name(), _preset_out));
2030 out.set (DataType::AUDIO, _preset_out.n_audio ());
2035 /** A private version of can_support_io_configuration which returns the method
2036 * by which the configuration can be matched, rather than just whether or not
2040 PluginInsert::internal_can_support_io_configuration (ChanCount const & inx, ChanCount& out) const
2042 if (_plugins.empty()) {
2047 if (is_channelstrip ()) {
2049 return Match (ExactMatch, 1);
2053 /* if a user specified a custom cfg, so be it. */
2055 PluginInfoPtr info = _plugins.front()->get_info();
2057 if (info->reconfigurable_io()) {
2058 return Match (Delegate, 1, _strict_io, true);
2060 return Match (ExactMatch, get_count(), _strict_io, true);
2064 /* try automatic configuration */
2065 Match m = PluginInsert::automatic_can_support_io_configuration (inx, out);
2067 PluginInfoPtr info = _plugins.front()->get_info();
2068 ChanCount inputs = info->n_inputs;
2069 ChanCount outputs = info->n_outputs;
2071 /* handle case strict-i/o */
2072 if (_strict_io && m.method != Impossible) {
2075 /* special case MIDI instruments */
2076 if (is_instrument ()) {
2077 // output = midi-bypass + at most master-out channels.
2078 ChanCount max_out (DataType::AUDIO, 2); // TODO use master-out
2079 max_out.set (DataType::MIDI, out.get(DataType::MIDI));
2080 out = ChanCount::min (out, max_out);
2081 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: special case strict-i/o instrument\n", name()));
2087 if (inx.n_audio () != out.n_audio ()) { // ignore midi bypass
2088 /* replicate processor to match output count (generators and such)
2089 * at least enough to feed every output port. */
2090 uint32_t f = 1; // at least one. e.g. control data filters, no in, no out.
2091 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2092 uint32_t nout = outputs.get (*t);
2093 if (nout == 0 || inx.get(*t) == 0) { continue; }
2094 f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nout));
2097 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: special case strict-i/o for generator\n", name()));
2098 return Match (Replicate, f, _strict_io);
2109 if (m.method != Impossible) {
2113 ChanCount ns_inputs = inputs - sidechain_input_pins ();
2115 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: resolving 'Impossible' match...\n", name()));
2117 if (info->reconfigurable_io()) {
2120 if (out.n_midi () > 0 && out.n_audio () == 0) { out.set (DataType::AUDIO, 2); }
2121 if (out.n_audio () == 0) { out.set (DataType::AUDIO, 1); }
2122 bool const r = _plugins.front()->can_support_io_configuration (inx + sidechain_input_pins (), out, &useins);
2124 // houston, we have a problem.
2125 return Match (Impossible, 0);
2128 if (inx.n_midi () > 0 && out.n_midi () == 0) { out.set (DataType::MIDI, 1); }
2129 return Match (Delegate, 1, _strict_io);
2132 ChanCount midi_bypass;
2133 if (inx.get(DataType::MIDI) == 1 && outputs.get(DataType::MIDI) == 0) {
2134 midi_bypass.set (DataType::MIDI, 1);
2137 // add at least as many plugins so that output count matches input count (w/o sidechain pins)
2139 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2140 uint32_t nin = ns_inputs.get (*t);
2141 uint32_t nout = outputs.get (*t);
2142 if (nin == 0 || inx.get(*t) == 0) { continue; }
2143 // prefer floor() so the count won't overly increase IFF (nin < nout)
2144 f = max (f, (uint32_t) floor (inx.get(*t) / (float)nout));
2146 if (f > 0 && outputs * f >= _configured_out) {
2147 out = outputs * f + midi_bypass;
2148 return Match (Replicate, f, _strict_io);
2151 // add at least as many plugins needed to connect all inputs (w/o sidechain pins)
2153 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2154 uint32_t nin = ns_inputs.get (*t);
2155 if (nin == 0 || inx.get(*t) == 0) { continue; }
2156 f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nin));
2159 out = outputs * f + midi_bypass;
2160 return Match (Replicate, f, _strict_io);
2163 // add at least as many plugins needed to connect all inputs
2165 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2166 uint32_t nin = inputs.get (*t);
2167 if (nin == 0 || inx.get(*t) == 0) { continue; }
2168 f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nin));
2170 out = outputs * f + midi_bypass;
2171 return Match (Replicate, f, _strict_io);
2174 /* this is the original Ardour 3/4 behavior, mainly for backwards compatibility */
2176 PluginInsert::automatic_can_support_io_configuration (ChanCount const & inx, ChanCount& out) const
2178 if (_plugins.empty()) {
2182 PluginInfoPtr info = _plugins.front()->get_info();
2183 ChanCount in; in += inx;
2184 ChanCount midi_bypass;
2186 if (info->reconfigurable_io()) {
2187 /* Plugin has flexible I/O, so delegate to it
2188 * pre-seed outputs, plugin tries closest match
2191 if (out.n_midi () > 0 && out.n_audio () == 0) { out.set (DataType::AUDIO, 2); }
2192 if (out.n_audio () == 0) { out.set (DataType::AUDIO, 1); }
2193 bool const r = _plugins.front()->can_support_io_configuration (in + sidechain_input_pins (), out);
2195 return Match (Impossible, 0);
2198 if (in.n_midi () > 0 && out.n_midi () == 0) { out.set (DataType::MIDI, 1); }
2199 return Match (Delegate, 1);
2202 ChanCount inputs = info->n_inputs;
2203 ChanCount outputs = info->n_outputs;
2204 ChanCount ns_inputs = inputs - sidechain_input_pins ();
2206 if (in.get(DataType::MIDI) == 1 && outputs.get(DataType::MIDI) == 0) {
2207 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: bypassing midi-data\n", name()));
2208 midi_bypass.set (DataType::MIDI, 1);
2210 if (in.get(DataType::MIDI) == 1 && inputs.get(DataType::MIDI) == 0) {
2211 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: hiding midi-port from plugin\n", name()));
2212 in.set(DataType::MIDI, 0);
2215 // add internally provided sidechain ports
2216 ChanCount insc = in + sidechain_input_ports ();
2218 bool no_inputs = true;
2219 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2220 if (inputs.get (*t) != 0) {
2227 /* no inputs so we can take any input configuration since we throw it away */
2228 out = outputs + midi_bypass;
2229 return Match (NoInputs, 1);
2232 /* Plugin inputs match requested inputs + side-chain-ports exactly */
2233 if (inputs == insc) {
2234 out = outputs + midi_bypass;
2235 return Match (ExactMatch, 1);
2238 /* Plugin inputs matches without side-chain-pins */
2239 if (ns_inputs == in) {
2240 out = outputs + midi_bypass;
2241 return Match (ExactMatch, 1);
2244 /* We may be able to run more than one copy of the plugin within this insert
2245 to cope with the insert having more inputs than the plugin.
2246 We allow replication only for plugins with either zero or 1 inputs and outputs
2247 for every valid data type.
2251 bool can_replicate = true;
2252 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2254 // ignore side-chains
2255 uint32_t nin = ns_inputs.get (*t);
2257 // No inputs of this type
2258 if (nin == 0 && in.get(*t) == 0) {
2262 if (nin != 1 || outputs.get (*t) != 1) {
2263 can_replicate = false;
2267 // Potential factor not set yet
2269 f = in.get(*t) / nin;
2272 // Factor for this type does not match another type, can not replicate
2273 if (f != (in.get(*t) / nin)) {
2274 can_replicate = false;
2279 if (can_replicate && f > 0) {
2280 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2281 out.set (*t, outputs.get(*t) * f);
2284 return Match (Replicate, f);
2287 /* If the processor has exactly one input of a given type, and
2288 the plugin has more, we can feed the single processor input
2289 to some or all of the plugin inputs. This is rather
2290 special-case-y, but the 1-to-many case is by far the
2291 simplest. How do I split thy 2 processor inputs to 3
2292 plugin inputs? Let me count the ways ...
2295 bool can_split = true;
2296 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2298 bool const can_split_type = (in.get (*t) == 1 && ns_inputs.get (*t) > 1);
2299 bool const nothing_to_do_for_type = (in.get (*t) == 0 && inputs.get (*t) == 0);
2301 if (!can_split_type && !nothing_to_do_for_type) {
2307 out = outputs + midi_bypass;
2308 return Match (Split, 1);
2311 /* If the plugin has more inputs than we want, we can `hide' some of them
2312 by feeding them silence.
2315 bool could_hide = false;
2316 bool cannot_hide = false;
2317 ChanCount hide_channels;
2319 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2320 if (inputs.get(*t) > in.get(*t)) {
2321 /* there is potential to hide, since the plugin has more inputs of type t than the insert */
2322 hide_channels.set (*t, inputs.get(*t) - in.get(*t));
2324 } else if (inputs.get(*t) < in.get(*t)) {
2325 /* we definitely cannot hide, since the plugin has fewer inputs of type t than the insert */
2330 if (could_hide && !cannot_hide) {
2331 out = outputs + midi_bypass;
2332 return Match (Hide, 1, false, false, hide_channels);
2335 return Match (Impossible, 0);
2340 PluginInsert::get_state ()
2342 return state (true);
2346 PluginInsert::state (bool full)
2348 XMLNode& node = Processor::state (full);
2350 node.set_property("type", _plugins[0]->state_node_name());
2351 node.set_property("unique-id", _plugins[0]->unique_id());
2352 node.set_property("count", (uint32_t)_plugins.size());
2354 /* remember actual i/o configuration (for later placeholder
2355 * in case the plugin goes missing) */
2356 node.add_child_nocopy (* _configured_in.state (X_("ConfiguredInput")));
2357 node.add_child_nocopy (* _custom_sinks.state (X_("CustomSinks")));
2358 node.add_child_nocopy (* _configured_out.state (X_("ConfiguredOutput")));
2359 node.add_child_nocopy (* _preset_out.state (X_("PresetOutput")));
2361 /* save custom i/o config */
2362 node.set_property("custom", _custom_cfg);
2363 for (uint32_t pc = 0; pc < get_count(); ++pc) {
2365 snprintf (tmp, sizeof(tmp), "InputMap-%d", pc);
2366 node.add_child_nocopy (* _in_map[pc].state (tmp));
2367 snprintf (tmp, sizeof(tmp), "OutputMap-%d", pc);
2368 node.add_child_nocopy (* _out_map[pc].state (tmp));
2370 node.add_child_nocopy (* _thru_map.state ("ThruMap"));
2373 node.add_child_nocopy (_sidechain->state (full));
2376 _plugins[0]->set_insert_id(this->id());
2377 node.add_child_nocopy (_plugins[0]->get_state());
2379 for (Controls::iterator c = controls().begin(); c != controls().end(); ++c) {
2380 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> ((*c).second);
2382 node.add_child_nocopy (ac->get_state());
2390 PluginInsert::set_control_ids (const XMLNode& node, int version)
2392 const XMLNodeList& nlist = node.children();
2393 XMLNodeConstIterator iter;
2394 set<Evoral::Parameter>::const_iterator p;
2396 for (iter = nlist.begin(); iter != nlist.end(); ++iter) {
2397 if ((*iter)->name() == Controllable::xml_node_name) {
2399 uint32_t p = (uint32_t)-1;
2402 if ((*iter)->get_property (X_("symbol"), str)) {
2403 boost::shared_ptr<LV2Plugin> lv2plugin = boost::dynamic_pointer_cast<LV2Plugin> (_plugins[0]);
2405 p = lv2plugin->port_index(str.c_str());
2409 if (p == (uint32_t)-1) {
2410 (*iter)->get_property (X_("parameter"), p);
2413 if (p != (uint32_t)-1) {
2415 /* this may create the new controllable */
2417 boost::shared_ptr<Evoral::Control> c = control (Evoral::Parameter (PluginAutomation, 0, p));
2419 #ifndef NO_PLUGIN_STATE
2423 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> (c);
2425 ac->set_state (**iter, version);
2434 PluginInsert::set_state(const XMLNode& node, int version)
2436 XMLNodeList nlist = node.children();
2437 XMLNodeIterator niter;
2438 XMLPropertyList plist;
2439 ARDOUR::PluginType type;
2442 if (!node.get_property ("type", str)) {
2443 error << _("XML node describing plugin is missing the `type' field") << endmsg;
2447 if (str == X_("ladspa") || str == X_("Ladspa")) { /* handle old school sessions */
2448 type = ARDOUR::LADSPA;
2449 } else if (str == X_("lv2")) {
2451 } else if (str == X_("windows-vst")) {
2452 type = ARDOUR::Windows_VST;
2453 } else if (str == X_("lxvst")) {
2454 type = ARDOUR::LXVST;
2455 } else if (str == X_("mac-vst")) {
2456 type = ARDOUR::MacVST;
2457 } else if (str == X_("audiounit")) {
2458 type = ARDOUR::AudioUnit;
2459 } else if (str == X_("luaproc")) {
2462 error << string_compose (_("unknown plugin type %1 in plugin insert state"), str) << endmsg;
2466 XMLProperty const * prop = node.property ("unique-id");
2469 #ifdef WINDOWS_VST_SUPPORT
2470 /* older sessions contain VST plugins with only an "id" field. */
2471 if (type == ARDOUR::Windows_VST) {
2472 prop = node.property ("id");
2476 #ifdef LXVST_SUPPORT
2477 /*There shouldn't be any older sessions with linuxVST support.. but anyway..*/
2478 if (type == ARDOUR::LXVST) {
2479 prop = node.property ("id");
2486 error << _("Plugin has no unique ID field") << endmsg;
2491 boost::shared_ptr<Plugin> plugin = find_plugin (_session, prop->value(), type);
2492 bool any_vst = false;
2494 /* treat VST plugins equivalent if they have the same uniqueID
2495 * allow to move sessions windows <> linux */
2496 #ifdef LXVST_SUPPORT
2497 if (plugin == 0 && (type == ARDOUR::Windows_VST || type == ARDOUR::MacVST)) {
2498 type = ARDOUR::LXVST;
2499 plugin = find_plugin (_session, prop->value(), type);
2500 if (plugin) { any_vst = true; }
2504 #ifdef WINDOWS_VST_SUPPORT
2505 if (plugin == 0 && (type == ARDOUR::LXVST || type == ARDOUR::MacVST)) {
2506 type = ARDOUR::Windows_VST;
2507 plugin = find_plugin (_session, prop->value(), type);
2508 if (plugin) { any_vst = true; }
2512 #ifdef MACVST_SUPPORT
2513 if (plugin == 0 && (type == ARDOUR::Windows_VST || type == ARDOUR::LXVST)) {
2514 type = ARDOUR::MacVST;
2515 plugin = find_plugin (_session, prop->value(), type);
2516 if (plugin) { any_vst = true; }
2520 if (plugin == 0 && type == ARDOUR::Lua) {
2521 /* unique ID (sha1 of script) was not found,
2522 * load the plugin from the serialized version in the
2523 * session-file instead.
2525 boost::shared_ptr<LuaProc> lp (new LuaProc (_session.engine(), _session, ""));
2526 XMLNode *ls = node.child (lp->state_node_name().c_str());
2528 lp->set_script_from_state (*ls);
2534 error << string_compose(
2535 _("Found a reference to a plugin (\"%1\") that is unknown.\n"
2536 "Perhaps it was removed or moved since it was last used."),
2542 // The name of the PluginInsert comes from the plugin, nothing else
2543 _name = plugin->get_info()->name;
2547 // Processor::set_state() will set this, but too late
2548 // for it to be available when setting up plugin
2549 // state. We can't call Processor::set_state() until
2550 // the plugins themselves are created and added.
2554 if (_plugins.empty()) {
2555 /* if we are adding the first plugin, we will need to set
2556 up automatable controls.
2558 add_plugin (plugin);
2559 create_automatable_parameters ();
2560 set_control_ids (node, version);
2563 node.get_property ("count", count);
2565 if (_plugins.size() != count) {
2566 for (uint32_t n = 1; n < count; ++n) {
2567 add_plugin (plugin_factory (plugin));
2571 Processor::set_state (node, version);
2573 PBD::ID new_id = this->id();
2574 PBD::ID old_id = this->id();
2576 node.get_property ("id", old_id);
2578 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2580 /* find the node with the type-specific node name ("lv2", "ladspa", etc)
2581 and set all plugins to the same state.
2584 if ( ((*niter)->name() == plugin->state_node_name())
2585 || (any_vst && ((*niter)->name() == "lxvst" || (*niter)->name() == "windows-vst" || (*niter)->name() == "mac-vst"))
2588 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2589 /* Plugin state can include external files which are named after the ID.
2591 * If regenerate_xml_or_string_ids() is set, the ID will already have
2592 * been changed, so we need to use the old ID from the XML to load the
2593 * state and then update the ID.
2595 * When copying a plugin-state, route_ui takes care of of updating the ID,
2596 * but we need to call set_insert_id() to clear the cached plugin-state
2597 * and force a change.
2599 if (!regenerate_xml_or_string_ids ()) {
2600 (*i)->set_insert_id (new_id);
2602 (*i)->set_insert_id (old_id);
2605 (*i)->set_state (**niter, version);
2607 if (regenerate_xml_or_string_ids ()) {
2608 (*i)->set_insert_id (new_id);
2612 /* when copying plugin state, notify UI */
2613 for (Controls::const_iterator li = controls().begin(); li != controls().end(); ++li) {
2614 boost::shared_ptr<PBD::Controllable> c = boost::dynamic_pointer_cast<PBD::Controllable> (li->second);
2616 c->Changed (false, Controllable::NoGroup); /* EMIT SIGNAL */
2624 if (version < 3000) {
2626 /* Only 2.X sessions need a call to set_parameter_state() - in 3.X and above
2627 this is all handled by Automatable
2630 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2631 if ((*niter)->name() == "Redirect") {
2632 /* XXX do we need to tackle placement? i think not (pd; oct 16 2009) */
2633 Processor::set_state (**niter, version);
2638 set_parameter_state_2X (node, version);
2641 node.get_property (X_("custom"), _custom_cfg);
2643 uint32_t in_maps = 0;
2644 uint32_t out_maps = 0;
2645 XMLNodeList kids = node.children ();
2646 for (XMLNodeIterator i = kids.begin(); i != kids.end(); ++i) {
2647 if ((*i)->name() == X_("ConfiguredInput")) {
2648 _configured_in = ChanCount(**i);
2650 if ((*i)->name() == X_("CustomSinks")) {
2651 _custom_sinks = ChanCount(**i);
2653 if ((*i)->name() == X_("ConfiguredOutput")) {
2654 _custom_out = ChanCount(**i);
2655 _configured_out = ChanCount(**i);
2657 if ((*i)->name() == X_("PresetOutput")) {
2658 _preset_out = ChanCount(**i);
2660 if (strncmp ((*i)->name ().c_str(), X_("InputMap-"), 9) == 0) {
2661 long pc = atol (&((*i)->name().c_str()[9]));
2662 if (pc >= 0 && pc <= (long) get_count()) {
2663 _in_map[pc] = ChanMapping (**i);
2667 if (strncmp ((*i)->name ().c_str(), X_("OutputMap-"), 10) == 0) {
2668 long pc = atol (&((*i)->name().c_str()[10]));
2669 if (pc >= 0 && pc <= (long) get_count()) {
2670 _out_map[pc] = ChanMapping (**i);
2674 if ((*i)->name () == "ThruMap") {
2675 _thru_map = ChanMapping (**i);
2678 // sidechain is a Processor (IO)
2679 if ((*i)->name () == Processor::state_node_name) {
2683 if (!regenerate_xml_or_string_ids ()) {
2684 _sidechain->set_state (**i, version);
2689 if (in_maps == out_maps && out_maps >0 && out_maps == get_count()) {
2690 _maps_from_state = true;
2693 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2697 (*i)->deactivate ();
2701 PluginConfigChanged (); /* EMIT SIGNAL */
2706 PluginInsert::update_id (PBD::ID id)
2709 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2710 (*i)->set_insert_id (id);
2715 PluginInsert::set_owner (SessionObject* o)
2717 Processor::set_owner (o);
2718 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2719 (*i)->set_owner (o);
2724 PluginInsert::set_state_dir (const std::string& d)
2726 // state() only saves the state of the first plugin
2727 _plugins[0]->set_state_dir (d);
2731 PluginInsert::set_parameter_state_2X (const XMLNode& node, int version)
2733 XMLNodeList nlist = node.children();
2734 XMLNodeIterator niter;
2736 /* look for port automation node */
2738 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2740 if ((*niter)->name() != port_automation_node_name) {
2745 XMLNodeConstIterator iter;
2749 cnodes = (*niter)->children ("port");
2751 for (iter = cnodes.begin(); iter != cnodes.end(); ++iter){
2755 if (!child->get_property("number", port_id)) {
2756 warning << _("PluginInsert: Auto: no ladspa port number") << endmsg;
2760 if (port_id >= _plugins[0]->parameter_count()) {
2761 warning << _("PluginInsert: Auto: port id out of range") << endmsg;
2765 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(
2766 control(Evoral::Parameter(PluginAutomation, 0, port_id), true));
2768 if (c && c->alist()) {
2769 if (!child->children().empty()) {
2770 c->alist()->set_state (*child->children().front(), version);
2773 error << string_compose (_("PluginInsert: automatable control %1 not found - ignored"), port_id) << endmsg;
2783 boost::shared_ptr<ReadOnlyControl>
2784 PluginInsert::control_output (uint32_t num) const
2786 CtrlOutMap::const_iterator i = _control_outputs.find (num);
2787 if (i == _control_outputs.end ()) {
2788 return boost::shared_ptr<ReadOnlyControl> ();
2795 PluginInsert::describe_parameter (Evoral::Parameter param)
2797 if (param.type() == PluginAutomation) {
2798 return _plugins[0]->describe_parameter (param);
2799 } else if (param.type() == PluginPropertyAutomation) {
2800 boost::shared_ptr<AutomationControl> c(automation_control(param));
2801 if (c && !c->desc().label.empty()) {
2802 return c->desc().label;
2805 return Automatable::describe_parameter(param);
2809 PluginInsert::signal_latency() const
2811 if (!_pending_active) {
2814 if (_user_latency) {
2815 return _user_latency;
2818 return _plugins[0]->signal_latency ();
2822 PluginInsert::type ()
2824 return plugin()->get_info()->type;
2827 PluginInsert::PluginControl::PluginControl (PluginInsert* p,
2828 const Evoral::Parameter& param,
2829 const ParameterDescriptor& desc,
2830 boost::shared_ptr<AutomationList> list)
2831 : AutomationControl (p->session(), param, desc, list, p->describe_parameter(param))
2836 list->set_interpolation(Evoral::ControlList::Discrete);
2841 /** @param val `user' value */
2844 PluginInsert::PluginControl::actually_set_value (double user_val, PBD::Controllable::GroupControlDisposition group_override)
2846 /* FIXME: probably should be taking out some lock here.. */
2848 for (Plugins::iterator i = _plugin->_plugins.begin(); i != _plugin->_plugins.end(); ++i) {
2849 (*i)->set_parameter (_list->parameter().id(), user_val);
2852 boost::shared_ptr<Plugin> iasp = _plugin->_impulseAnalysisPlugin.lock();
2854 iasp->set_parameter (_list->parameter().id(), user_val);
2857 AutomationControl::actually_set_value (user_val, group_override);
2861 PluginInsert::PluginControl::catch_up_with_external_value (double user_val)
2863 AutomationControl::actually_set_value (user_val, Controllable::NoGroup);
2867 PluginInsert::PluginControl::get_state ()
2869 XMLNode& node (AutomationControl::get_state());
2870 node.set_property (X_("parameter"), parameter().id());
2872 boost::shared_ptr<LV2Plugin> lv2plugin = boost::dynamic_pointer_cast<LV2Plugin> (_plugin->_plugins[0]);
2874 node.set_property (X_("symbol"), lv2plugin->port_symbol (parameter().id()));
2881 /** @return `user' val */
2883 PluginInsert::PluginControl::get_value () const
2885 boost::shared_ptr<Plugin> plugin = _plugin->plugin (0);
2891 return plugin->get_parameter (_list->parameter().id());
2894 PluginInsert::PluginPropertyControl::PluginPropertyControl (PluginInsert* p,
2895 const Evoral::Parameter& param,
2896 const ParameterDescriptor& desc,
2897 boost::shared_ptr<AutomationList> list)
2898 : AutomationControl (p->session(), param, desc, list)
2904 PluginInsert::PluginPropertyControl::actually_set_value (double user_val, Controllable::GroupControlDisposition gcd)
2906 /* Old numeric set_value(), coerce to appropriate datatype if possible.
2907 This is lossy, but better than nothing until Ardour's automation system
2908 can handle various datatypes all the way down. */
2909 const Variant value(_desc.datatype, user_val);
2910 if (value.type() == Variant::NOTHING) {
2911 error << "set_value(double) called for non-numeric property" << endmsg;
2915 for (Plugins::iterator i = _plugin->_plugins.begin(); i != _plugin->_plugins.end(); ++i) {
2916 (*i)->set_property(_list->parameter().id(), value);
2921 AutomationControl::actually_set_value (user_val, gcd);
2925 PluginInsert::PluginPropertyControl::get_state ()
2927 XMLNode& node (AutomationControl::get_state());
2928 node.set_property (X_("property"), parameter().id());
2929 node.remove_property (X_("value"));
2935 PluginInsert::PluginPropertyControl::get_value () const
2937 return _value.to_double();
2940 boost::shared_ptr<Plugin>
2941 PluginInsert::get_impulse_analysis_plugin()
2943 boost::shared_ptr<Plugin> ret;
2944 if (_impulseAnalysisPlugin.expired()) {
2945 // LV2 in particular uses various _session params
2946 // during init() -- most notably block_size..
2948 ret = plugin_factory(_plugins[0]);
2949 ChanCount out (internal_output_streams ());
2950 if (ret->get_info ()->reconfigurable_io ()) {
2951 // populate get_info ()->n_inputs and ->n_outputs
2953 ret->can_support_io_configuration (internal_input_streams (), out, &useins);
2954 assert (out == internal_output_streams ());
2956 ret->configure_io (internal_input_streams (), out);
2957 ret->set_owner (_owner);
2958 _impulseAnalysisPlugin = ret;
2960 ret = _impulseAnalysisPlugin.lock();
2967 PluginInsert::collect_signal_for_analysis (framecnt_t nframes)
2969 // called from outside the audio thread, so this should be safe
2970 // only do audio as analysis is (currently) only for audio plugins
2971 _signal_analysis_inputs.ensure_buffers (DataType::AUDIO, input_streams().n_audio(), nframes);
2972 _signal_analysis_outputs.ensure_buffers (DataType::AUDIO, output_streams().n_audio(), nframes);
2974 _signal_analysis_collected_nframes = 0;
2975 _signal_analysis_collect_nframes_max = nframes;
2978 /** Add a plugin to our list */
2980 PluginInsert::add_plugin (boost::shared_ptr<Plugin> plugin)
2982 plugin->set_insert_id (this->id());
2983 plugin->set_owner (_owner);
2985 if (_plugins.empty()) {
2986 /* first (and probably only) plugin instance - connect to relevant signals */
2988 plugin->ParameterChangedExternally.connect_same_thread (*this, boost::bind (&PluginInsert::parameter_changed_externally, this, _1, _2));
2989 plugin->StartTouch.connect_same_thread (*this, boost::bind (&PluginInsert::start_touch, this, _1));
2990 plugin->EndTouch.connect_same_thread (*this, boost::bind (&PluginInsert::end_touch, this, _1));
2991 _custom_sinks = plugin->get_info()->n_inputs;
2992 // cache sidechain port count
2993 _cached_sidechain_pins.reset ();
2994 const ChanCount& nis (plugin->get_info()->n_inputs);
2995 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2996 for (uint32_t in = 0; in < nis.get (*t); ++in) {
2997 const Plugin::IOPortDescription& iod (plugin->describe_io_port (*t, true, in));
2998 if (iod.is_sidechain) {
2999 _cached_sidechain_pins.set (*t, 1 + _cached_sidechain_pins.n(*t));
3004 #if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT || defined MACVST_SUPPORT)
3005 boost::shared_ptr<VSTPlugin> vst = boost::dynamic_pointer_cast<VSTPlugin> (plugin);
3007 vst->set_insert (this, _plugins.size ());
3011 _plugins.push_back (plugin);
3015 PluginInsert::load_preset (ARDOUR::Plugin::PresetRecord pr)
3018 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
3019 if (! (*i)->load_preset (pr)) {
3027 PluginInsert::realtime_handle_transport_stopped ()
3029 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
3030 (*i)->realtime_handle_transport_stopped ();
3035 PluginInsert::realtime_locate ()
3037 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
3038 (*i)->realtime_locate ();
3043 PluginInsert::monitoring_changed ()
3045 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
3046 (*i)->monitoring_changed ();
3051 PluginInsert::latency_changed ()
3053 // this is called in RT context, LatencyChanged is emitted after run()
3054 _latency_changed = true;
3055 // XXX This also needs a proper API not an owner() hack.
3057 static_cast<Route*>(owner ())->processor_latency_changed (); /* EMIT SIGNAL */
3061 PluginInsert::start_touch (uint32_t param_id)
3063 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id));
3065 // ToDo subtract _plugin_signal_latency from audible_frame() when rolling, assert > 0
3066 ac->start_touch (session().audible_frame());
3071 PluginInsert::end_touch (uint32_t param_id)
3073 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id));
3075 // ToDo subtract _plugin_signal_latency from audible_frame() when rolling, assert > 0
3076 ac->stop_touch (true, session().audible_frame());
3080 std::ostream& operator<<(std::ostream& o, const ARDOUR::PluginInsert::Match& m)
3083 case PluginInsert::Impossible: o << "Impossible"; break;
3084 case PluginInsert::Delegate: o << "Delegate"; break;
3085 case PluginInsert::NoInputs: o << "NoInputs"; break;
3086 case PluginInsert::ExactMatch: o << "ExactMatch"; break;
3087 case PluginInsert::Replicate: o << "Replicate"; break;
3088 case PluginInsert::Split: o << "Split"; break;
3089 case PluginInsert::Hide: o << "Hide"; break;
3091 o << " cnt: " << m.plugins
3092 << (m.strict_io ? " strict-io" : "")
3093 << (m.custom_cfg ? " custom-cfg" : "");
3094 if (m.method == PluginInsert::Hide) {
3095 o << " hide: " << m.hide;