2 Copyright (C) 2000 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 #include "libardour-config.h"
26 #include "pbd/failed_constructor.h"
27 #include "pbd/xml++.h"
28 #include "pbd/convert.h"
30 #include "ardour/audio_buffer.h"
31 #include "ardour/automation_list.h"
32 #include "ardour/buffer_set.h"
33 #include "ardour/debug.h"
34 #include "ardour/event_type_map.h"
35 #include "ardour/ladspa_plugin.h"
36 #include "ardour/luaproc.h"
37 #include "ardour/plugin.h"
38 #include "ardour/plugin_insert.h"
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 ()
104 PluginInsert::set_strict_io (bool b)
106 bool changed = _strict_io != b;
109 PluginConfigChanged (); /* EMIT SIGNAL */
114 PluginInsert::set_count (uint32_t num)
116 bool require_state = !_plugins.empty();
118 if (require_state && num > 1 && plugin (0)->get_info ()->type == ARDOUR::AudioUnit) {
119 // we don't allow to replicate AUs
123 /* this is a bad idea.... we shouldn't do this while active.
124 * only a route holding their redirect_lock should be calling this
129 } else if (num > _plugins.size()) {
130 uint32_t diff = num - _plugins.size();
132 for (uint32_t n = 0; n < diff; ++n) {
133 boost::shared_ptr<Plugin> p = plugin_factory (_plugins[0]);
137 XMLNode& state = _plugins[0]->get_state ();
138 p->set_state (state, Stateful::loading_state_version);
145 PluginConfigChanged (); /* EMIT SIGNAL */
147 } else if (num < _plugins.size()) {
148 uint32_t diff = _plugins.size() - num;
149 for (uint32_t n= 0; n < diff; ++n) {
152 PluginConfigChanged (); /* EMIT SIGNAL */
160 PluginInsert::set_sinks (const ChanCount& c)
163 /* no signal, change will only be visible after re-config */
167 PluginInsert::set_outputs (const ChanCount& c)
169 bool changed = (_custom_out != c) && _custom_cfg;
172 PluginConfigChanged (); /* EMIT SIGNAL */
177 PluginInsert::set_custom_cfg (bool b)
179 bool changed = _custom_cfg != b;
182 PluginConfigChanged (); /* EMIT SIGNAL */
187 PluginInsert::set_preset_out (const ChanCount& c)
189 bool changed = _preset_out != c;
191 if (changed && !_custom_cfg) {
192 PluginConfigChanged (); /* EMIT SIGNAL */
198 PluginInsert::add_sidechain (uint32_t n_audio, uint32_t n_midi)
200 // caller must hold process lock
204 std::ostringstream n;
205 if (n_audio > 0 || n_midi > 0) {
206 n << "Sidechain " << Session::next_name_id ();
208 n << "TO BE RESET FROM XML";
210 SideChain *sc = new SideChain (_session, n.str ());
211 _sidechain = boost::shared_ptr<SideChain> (sc);
212 _sidechain->activate ();
213 for (uint32_t n = 0; n < n_audio; ++n) {
214 _sidechain->input()->add_port ("", owner(), DataType::AUDIO); // add a port, don't connect.
216 for (uint32_t n = 0; n < n_midi; ++n) {
217 _sidechain->input()->add_port ("", owner(), DataType::MIDI); // add a port, don't connect.
219 PluginConfigChanged (); /* EMIT SIGNAL */
224 PluginInsert::del_sidechain ()
230 _sc_playback_latency = 0;
231 _sc_capture_latency = 0;
232 PluginConfigChanged (); /* EMIT SIGNAL */
237 PluginInsert::set_sidechain_latency (uint32_t capture, uint32_t playback)
240 (_sc_playback_latency != playback || _sc_capture_latency != capture)) {
241 _sc_capture_latency = capture;
242 _sc_playback_latency = playback;
243 LatencyRange pl; pl.min = pl.max = playback;
244 LatencyRange cl; cl.min = cl.max = capture;
245 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: capture %2 playback; %3\n", _sidechain->name (), capture, playback));
246 PortSet& ps (_sidechain->input ()->ports ());
247 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
248 p->set_private_latency_range (pl, true);
249 p->set_private_latency_range (cl, false);
255 PluginInsert::control_list_automation_state_changed (Evoral::Parameter which, AutoState s)
257 if (which.type() != PluginAutomation)
260 boost::shared_ptr<AutomationControl> c
261 = boost::dynamic_pointer_cast<AutomationControl>(control (which));
264 _plugins[0]->set_parameter (which.id(), c->list()->eval (_session.transport_frame()));
269 PluginInsert::output_streams() const
271 assert (_configured);
272 return _configured_out;
276 PluginInsert::input_streams() const
278 assert (_configured);
279 return _configured_in;
283 PluginInsert::internal_streams() const
285 assert (_configured);
286 return _configured_internal;
290 PluginInsert::internal_output_streams() const
292 assert (!_plugins.empty());
294 PluginInfoPtr info = _plugins.front()->get_info();
296 if (info->reconfigurable_io()) {
297 ChanCount out = _plugins.front()->output_streams ();
298 // DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, reconfigur(able) output streams = %1\n", out));
301 ChanCount out = info->n_outputs;
302 // DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, static output streams = %1 for %2 plugins\n", out, _plugins.size()));
303 out.set_audio (out.n_audio() * _plugins.size());
304 out.set_midi (out.n_midi() * _plugins.size());
310 PluginInsert::internal_input_streams() const
312 assert (!_plugins.empty());
316 PluginInfoPtr info = _plugins.front()->get_info();
318 if (info->reconfigurable_io()) {
319 in = _plugins.front()->input_streams();
324 DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, input streams = %1, match using %2\n", in, _match.method));
326 if (_match.method == Split) {
328 /* we are splitting 1 processor input to multiple plugin inputs,
329 so we have a maximum of 1 stream of each type.
331 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
332 if (in.get (*t) > 1) {
338 } else if (_match.method == Hide) {
340 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
341 in.set (*t, in.get (*t) - _match.hide.get (*t));
347 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
348 in.set (*t, in.get (*t) * _plugins.size ());
356 PluginInsert::natural_output_streams() const
359 if (is_channelstrip ()) {
360 return ChanCount::min (_configured_out, ChanCount (DataType::AUDIO, 2));
363 return _plugins[0]->get_info()->n_outputs;
367 PluginInsert::natural_input_streams() const
370 if (is_channelstrip ()) {
371 return ChanCount::min (_configured_in, ChanCount (DataType::AUDIO, 2));
374 return _plugins[0]->get_info()->n_inputs;
378 PluginInsert::sidechain_input_pins() const
380 return _cached_sidechain_pins;
384 PluginInsert::has_no_inputs() const
386 return _plugins[0]->get_info()->n_inputs == ChanCount::ZERO;
390 PluginInsert::has_no_audio_inputs() const
392 return _plugins[0]->get_info()->n_inputs.n_audio() == 0;
396 PluginInsert::plugin_latency () const {
397 return _plugins.front()->signal_latency ();
401 PluginInsert::is_instrument() const
403 PluginInfoPtr pip = _plugins[0]->get_info();
404 if (pip->is_instrument ()) {
407 return pip->n_inputs.n_midi () != 0 && pip->n_outputs.n_audio () > 0 && pip->n_inputs.n_audio () == 0;
411 PluginInsert::has_output_presets (ChanCount in, ChanCount out)
413 if (!_configured && _plugins[0]->get_info ()->reconfigurable_io ()) {
414 // collect possible configurations, prefer given in/out
415 _plugins[0]->can_support_io_configuration (in, out);
418 PluginOutputConfiguration ppc (_plugins[0]->possible_output ());
420 if (ppc.size () == 0) {
423 if (!strict_io () && ppc.size () == 1) {
427 if (strict_io () && ppc.size () == 1) {
428 // "stereo" is currently preferred default for instruments
429 if (ppc.find (2) != ppc.end ()) {
434 if (ppc.size () == 1 && ppc.find (0) != ppc.end () && !_plugins[0]->get_info ()->reconfigurable_io ()) {
435 // some midi-sequencer (e.g. QMidiArp) or other midi-out plugin
436 // pretending to be an "Instrument"
440 if (!is_instrument ()) {
447 PluginInsert::create_automatable_parameters ()
449 assert (!_plugins.empty());
451 boost::shared_ptr<Plugin> plugin = _plugins.front();
452 set<Evoral::Parameter> a = _plugins.front()->automatable ();
454 for (uint32_t i = 0; i < plugin->parameter_count(); ++i) {
455 if (!plugin->parameter_is_control (i) || !plugin->parameter_is_input (i)) {
458 Evoral::Parameter param (PluginAutomation, 0, i);
460 ParameterDescriptor desc;
461 plugin->get_parameter_descriptor(i, desc);
463 const bool automatable = a.find(param) != a.end();
466 can_automate (param);
468 boost::shared_ptr<AutomationList> list(new AutomationList(param, desc));
469 boost::shared_ptr<AutomationControl> c (new PluginControl(this, param, desc, list));
471 c->set_flags (Controllable::Flag ((int)c->flags() | Controllable::NotAutomatable));
474 plugin->set_automation_control (i, c);
478 const Plugin::PropertyDescriptors& pdl (plugin->get_supported_properties ());
479 for (Plugin::PropertyDescriptors::const_iterator p = pdl.begin(); p != pdl.end(); ++p) {
480 Evoral::Parameter param (PluginPropertyAutomation, 0, p->first);
481 const ParameterDescriptor& desc = plugin->get_property_descriptor(param.id());
482 if (desc.datatype != Variant::NOTHING) {
483 boost::shared_ptr<AutomationList> list;
484 if (Variant::type_is_numeric(desc.datatype)) {
485 list = boost::shared_ptr<AutomationList>(new AutomationList(param, desc));
487 add_control (boost::shared_ptr<AutomationControl> (new PluginPropertyControl(this, param, desc, list)));
491 _bypass_port = plugin->designated_bypass_port ();
493 /* special case VST effSetBypass */
494 if (_bypass_port == UINT32_MAX -1) {
495 // emulate VST Bypass
496 Evoral::Parameter param (PluginAutomation, 0, _bypass_port);
497 ParameterDescriptor desc;
498 desc.label = _("Plugin Enable");
503 boost::shared_ptr<AutomationList> list(new AutomationList(param, desc));
504 boost::shared_ptr<AutomationControl> c (new PluginControl(this, param, desc, list));
508 if (_bypass_port != UINT32_MAX) {
509 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, _bypass_port));
510 if (0 == (ac->flags () & Controllable::NotAutomatable)) {
511 ac->alist()->automation_state_changed.connect_same_thread (*this, boost::bind (&PluginInsert::bypassable_changed, this));
512 ac->Changed.connect_same_thread (*this, boost::bind (&PluginInsert::enable_changed, this));
515 plugin->PresetPortSetValue.connect_same_thread (*this, boost::bind (&PluginInsert::preset_load_set_value, this, _1, _2));
518 /** Called when something outside of this host has modified a plugin
519 * parameter. Responsible for propagating the change to two places:
521 * 1) anything listening to the Control itself
522 * 2) any replicated plugins that make up this PluginInsert.
524 * The PluginInsert is connected to the ParameterChangedExternally signal for
525 * the first (primary) plugin, and here broadcasts that change to any others.
527 * XXX We should probably drop this whole replication idea (Paul, October 2015)
528 * since it isn't used by sensible plugin APIs (AU, LV2).
531 PluginInsert::parameter_changed_externally (uint32_t which, float val)
533 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, which));
535 /* First propagation: alter the underlying value of the control,
536 * without telling the plugin(s) that own/use it to set it.
543 boost::shared_ptr<PluginControl> pc = boost::dynamic_pointer_cast<PluginControl> (ac);
546 pc->catch_up_with_external_value (val);
549 /* Second propagation: tell all plugins except the first to
550 update the value of this parameter. For sane plugin APIs,
551 there are no other plugins, so this is a no-op in those
555 Plugins::iterator i = _plugins.begin();
557 /* don't set the first plugin, just all the slaves */
559 if (i != _plugins.end()) {
561 for (; i != _plugins.end(); ++i) {
562 (*i)->set_parameter (which, val);
568 PluginInsert::set_block_size (pframes_t nframes)
571 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
572 if ((*i)->set_block_size (nframes) != 0) {
580 PluginInsert::activate ()
582 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
586 Processor::activate ();
587 /* when setting state e.g ProcessorBox::paste_processor_state ()
588 * the plugin is not yet owned by a route.
589 * but no matter. Route::add_processors() will call activate () again
594 if (_plugin_signal_latency != signal_latency ()) {
595 _plugin_signal_latency = signal_latency ();
601 PluginInsert::deactivate ()
603 Processor::deactivate ();
605 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
608 if (_plugin_signal_latency != signal_latency ()) {
609 _plugin_signal_latency = signal_latency ();
615 PluginInsert::flush ()
617 for (vector<boost::shared_ptr<Plugin> >::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
623 PluginInsert::enable (bool yn)
625 if (_bypass_port == UINT32_MAX) {
632 if (!_pending_active) {
635 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, _bypass_port));
636 ac->set_value (yn ? 1.0 : 0.0, Controllable::NoGroup);
642 PluginInsert::enabled () const
644 if (_bypass_port == UINT32_MAX) {
645 return Processor::enabled ();
647 boost::shared_ptr<const AutomationControl> ac = boost::const_pointer_cast<AutomationControl> (automation_control (Evoral::Parameter (PluginAutomation, 0, _bypass_port)));
648 return (ac->get_value () > 0 && _pending_active);
653 PluginInsert::bypassable () const
655 if (_bypass_port == UINT32_MAX) {
658 boost::shared_ptr<const AutomationControl> ac = boost::const_pointer_cast<AutomationControl> (automation_control (Evoral::Parameter (PluginAutomation, 0, _bypass_port)));
660 return !ac->automation_playback ();
665 PluginInsert::enable_changed ()
671 PluginInsert::bypassable_changed ()
673 BypassableChanged ();
677 PluginInsert::preset_load_set_value (uint32_t p, float v)
679 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, p));
684 if (ac->automation_state() & Play) {
689 ac->set_value (v, Controllable::NoGroup);
694 PluginInsert::inplace_silence_unconnected (BufferSet& bufs, const PinMappings& out_map, framecnt_t nframes, framecnt_t offset) const
696 // TODO optimize: store "unconnected" in a fixed set.
697 // it only changes on reconfiguration.
698 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
699 for (uint32_t out = 0; out < bufs.count().get (*t); ++out) {
701 if (*t == DataType::MIDI && out == 0 && has_midi_bypass ()) {
702 mapped = true; // in-place Midi bypass
704 for (uint32_t pc = 0; pc < get_count() && !mapped; ++pc) {
705 PinMappings::const_iterator i = out_map.find (pc);
706 if (i == out_map.end ()) {
709 const ChanMapping& outmap (i->second);
710 for (uint32_t o = 0; o < natural_output_streams().get (*t); ++o) {
712 uint32_t idx = outmap.get (*t, o, &valid);
713 if (valid && idx == out) {
720 bufs.get (*t, out).silence (nframes, offset);
727 PluginInsert::connect_and_run (BufferSet& bufs, framepos_t start, framepos_t end, double speed, pframes_t nframes, framecnt_t offset, bool with_auto)
729 // TODO: atomically copy maps & _no_inplace
730 PinMappings in_map (_in_map);
731 PinMappings out_map (_out_map);
732 ChanMapping thru_map (_thru_map);
733 if (_mapping_changed) { // ToDo use a counters, increment until match.
734 _no_inplace = check_inplace ();
735 _mapping_changed = false;
738 if (_latency_changed) {
739 /* delaylines are configured with the max possible latency (as reported by the plugin)
740 * so this won't allocate memory (unless the plugin lied about its max latency)
741 * It may still 'click' though, since the fixed delaylines are not de-clicked.
742 * Then again plugin-latency changes are not click-free to begin with.
744 * This is also worst case, there is currently no concept of per-stream latency.
746 * e.g. Two identical latent plugins:
747 * 1st plugin: process left (latent), bypass right.
748 * 2nd plugin: bypass left, process right (latent).
749 * -> currently this yields 2 times latency of the plugin,
751 _latency_changed = false;
752 _delaybuffers.set (ChanCount::max(bufs.count(), _configured_out), plugin_latency ());
755 if (_match.method == Split && !_no_inplace) {
756 // TODO: also use this optimization if one source-buffer
757 // feeds _all_ *connected* inputs.
758 // currently this is *first* buffer to all only --
759 // see PluginInsert::check_inplace
760 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
761 if (_configured_internal.get (*t) == 0) {
765 uint32_t first_idx = in_map[0].get (*t, 0, &valid);
766 assert (valid && first_idx == 0); // check_inplace ensures this
767 /* copy the first stream's buffer contents to the others */
768 for (uint32_t i = 1; i < natural_input_streams ().get (*t); ++i) {
769 uint32_t idx = in_map[0].get (*t, i, &valid);
772 bufs.get (*t, i).read_from (bufs.get (*t, first_idx), nframes, offset, offset);
776 /* the copy operation produces a linear monotonic input map */
777 in_map[0] = ChanMapping (natural_input_streams ());
780 bufs.set_count(ChanCount::max(bufs.count(), _configured_internal));
781 bufs.set_count(ChanCount::max(bufs.count(), _configured_out));
787 for (Controls::iterator li = controls().begin(); li != controls().end(); ++li, ++n) {
789 boost::shared_ptr<AutomationControl> c
790 = boost::dynamic_pointer_cast<AutomationControl>(li->second);
792 if (c->list() && c->automation_playback()) {
795 const float val = c->list()->rt_safe_eval (start, valid);
798 /* This is the ONLY place where we are
800 * AutomationControl::set_value_unchecked(). We
801 * know that the control is in
802 * automation playback mode, so no
803 * check on writable() is required
804 * (which must be done in AutomationControl::set_value()
807 c->set_value_unchecked(val);
814 /* Calculate if, and how many frames we need to collect for analysis */
815 framecnt_t collect_signal_nframes = (_signal_analysis_collect_nframes_max -
816 _signal_analysis_collected_nframes);
817 if (nframes < collect_signal_nframes) { // we might not get all frames now
818 collect_signal_nframes = nframes;
821 if (collect_signal_nframes > 0) {
823 //std::cerr << "collect input, bufs " << bufs.count().n_audio() << " count, " << bufs.available().n_audio() << " available" << std::endl;
824 //std::cerr << " streams " << internal_input_streams().n_audio() << std::endl;
825 //std::cerr << "filling buffer with " << collect_signal_nframes << " frames at " << _signal_analysis_collected_nframes << std::endl;
827 _signal_analysis_inputs.set_count(input_streams());
829 for (uint32_t i = 0; i < input_streams().n_audio(); ++i) {
830 _signal_analysis_inputs.get_audio(i).read_from (
832 collect_signal_nframes,
833 _signal_analysis_collected_nframes); // offset is for target buffer
838 if (is_channelstrip ()) {
839 if (_configured_in.n_audio() > 0) {
840 ChanMapping mb_in_map (ChanCount::min (_configured_in, ChanCount (DataType::AUDIO, 2)));
841 ChanMapping mb_out_map (ChanCount::min (_configured_out, ChanCount (DataType::AUDIO, 2)));
843 _plugins.front()->connect_and_run (bufs, start, end, speed, mb_in_map, mb_out_map, nframes, offset);
845 for (uint32_t out = _configured_in.n_audio (); out < bufs.count().get (DataType::AUDIO); ++out) {
846 bufs.get (DataType::AUDIO, out).silence (nframes, offset);
852 // TODO optimize -- build maps once.
854 BufferSet& inplace_bufs = _session.get_noinplace_buffers();
855 ARDOUR::ChanMapping used_outputs;
857 assert (inplace_bufs.count () >= natural_input_streams () + _configured_out);
859 /* build used-output map */
860 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
861 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
862 for (uint32_t out = 0; out < natural_output_streams().get (*t); ++out) {
864 uint32_t out_idx = out_map[pc].get (*t, out, &valid);
866 used_outputs.set (*t, out_idx, 1); // mark as used
871 /* copy thru data to outputs before processing in-place */
872 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
873 for (uint32_t out = 0; out < bufs.count().get (*t); ++out) {
875 uint32_t in_idx = thru_map.get (*t, out, &valid);
876 uint32_t m = out + natural_input_streams ().get (*t);
878 _delaybuffers.delay (*t, out, inplace_bufs.get (*t, m), bufs.get (*t, in_idx), nframes, offset, offset);
879 used_outputs.set (*t, out, 1); // mark as used
881 used_outputs.get (*t, out, &valid);
883 /* the plugin is expected to write here, but may not :(
884 * (e.g. drumgizmo w/o kit loaded)
886 inplace_bufs.get (*t, m).silence (nframes);
893 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
895 ARDOUR::ChanMapping i_in_map (natural_input_streams());
896 ARDOUR::ChanMapping i_out_map (out_map[pc]);
897 ARDOUR::ChanCount mapped;
899 /* map inputs sequentially */
900 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
901 for (uint32_t in = 0; in < natural_input_streams().get (*t); ++in) {
903 uint32_t in_idx = in_map[pc].get (*t, in, &valid);
904 uint32_t m = mapped.get (*t);
906 inplace_bufs.get (*t, m).read_from (bufs.get (*t, in_idx), nframes, offset, offset);
908 inplace_bufs.get (*t, m).silence (nframes, offset);
910 mapped.set (*t, m + 1);
914 /* outputs are mapped to inplace_bufs after the inputs */
915 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
916 i_out_map.offset_to (*t, natural_input_streams ().get (*t));
919 if ((*i)->connect_and_run (inplace_bufs, start, end, speed, i_in_map, i_out_map, nframes, offset)) {
924 /* all instances have completed, now copy data that was written
925 * and zero unconnected buffers */
926 ARDOUR::ChanMapping nonzero_out (used_outputs);
927 if (has_midi_bypass ()) {
928 nonzero_out.set (DataType::MIDI, 0, 1); // Midi bypass.
930 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
931 for (uint32_t out = 0; out < bufs.count().get (*t); ++out) {
933 used_outputs.get (*t, out, &valid);
935 nonzero_out.get (*t, out, &valid);
937 bufs.get (*t, out).silence (nframes, offset);
940 uint32_t m = out + natural_input_streams ().get (*t);
941 bufs.get (*t, out).read_from (inplace_bufs.get (*t, m), nframes, offset, offset);
946 /* in-place processing */
948 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
949 if ((*i)->connect_and_run(bufs, start, end, speed, in_map[pc], out_map[pc], nframes, offset)) {
953 // now silence unconnected outputs
954 inplace_silence_unconnected (bufs, _out_map, nframes, offset);
957 if (collect_signal_nframes > 0) {
959 //std::cerr << " output, bufs " << bufs.count().n_audio() << " count, " << bufs.available().n_audio() << " available" << std::endl;
960 //std::cerr << " streams " << internal_output_streams().n_audio() << std::endl;
962 _signal_analysis_outputs.set_count(output_streams());
964 for (uint32_t i = 0; i < output_streams().n_audio(); ++i) {
965 _signal_analysis_outputs.get_audio(i).read_from(
967 collect_signal_nframes,
968 _signal_analysis_collected_nframes); // offset is for target buffer
971 _signal_analysis_collected_nframes += collect_signal_nframes;
972 assert(_signal_analysis_collected_nframes <= _signal_analysis_collect_nframes_max);
974 if (_signal_analysis_collected_nframes == _signal_analysis_collect_nframes_max) {
975 _signal_analysis_collect_nframes_max = 0;
976 _signal_analysis_collected_nframes = 0;
978 AnalysisDataGathered(&_signal_analysis_inputs,
979 &_signal_analysis_outputs);
983 if (_plugin_signal_latency != signal_latency ()) {
984 _plugin_signal_latency = signal_latency ();
990 PluginInsert::bypass (BufferSet& bufs, pframes_t nframes)
992 /* bypass the plugin(s) not the whole processor.
993 * -> use mappings just like connect_and_run
996 // TODO: atomically copy maps & _no_inplace
997 const ChanMapping in_map (no_sc_input_map ());
998 const ChanMapping out_map (output_map ());
999 if (_mapping_changed) {
1000 _no_inplace = check_inplace ();
1001 _mapping_changed = false;
1004 bufs.set_count(ChanCount::max(bufs.count(), _configured_internal));
1005 bufs.set_count(ChanCount::max(bufs.count(), _configured_out));
1008 ChanMapping thru_map (_thru_map);
1010 BufferSet& inplace_bufs = _session.get_noinplace_buffers();
1012 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1013 for (uint32_t in = 0; in < _configured_internal.get (*t); ++in) {
1014 inplace_bufs.get (*t, in).read_from (bufs.get (*t, in), nframes, 0, 0);
1017 ARDOUR::ChanMapping used_outputs;
1019 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1020 for (uint32_t out = 0; out < _configured_out.get (*t); ++out) {
1022 uint32_t in_idx = thru_map.get (*t, out, &valid);
1024 bufs.get (*t, out).read_from (inplace_bufs.get (*t, in_idx), nframes, 0, 0);
1025 used_outputs.set (*t, out, 1); // mark as used
1029 // plugin no-op: assume every plugin has an internal identity map
1030 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1031 for (uint32_t out = 0; out < _configured_out.get (*t); ++out) {
1033 uint32_t src_idx = out_map.get_src (*t, out, &valid);
1037 uint32_t in_idx = in_map.get (*t, src_idx, &valid);
1041 bufs.get (*t, out).read_from (inplace_bufs.get (*t, in_idx), nframes, 0, 0);
1042 used_outputs.set (*t, out, 1); // mark as used
1045 // now silence all unused outputs
1046 if (has_midi_bypass ()) {
1047 used_outputs.set (DataType::MIDI, 0, 1); // Midi bypass.
1049 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1050 for (uint32_t out = 0; out < _configured_out.get (*t); ++out) {
1052 used_outputs.get (*t, out, &valid);
1054 bufs.get (*t, out).silence (nframes, 0);
1059 if (_match.method == Split) {
1060 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1061 if (_configured_internal.get (*t) == 0) {
1064 // copy/feeds _all_ *connected* inputs, copy the first buffer
1066 uint32_t first_idx = in_map.get (*t, 0, &valid);
1067 assert (valid && first_idx == 0); // check_inplace ensures this
1068 for (uint32_t i = 1; i < natural_input_streams ().get (*t); ++i) {
1069 uint32_t idx = in_map.get (*t, i, &valid);
1072 bufs.get (*t, i).read_from (bufs.get (*t, first_idx), nframes, 0, 0);
1078 // apply output map and/or monotonic but not identity i/o mappings
1079 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1080 for (uint32_t out = 0; out < _configured_out.get (*t); ++out) {
1082 uint32_t src_idx = out_map.get_src (*t, out, &valid);
1084 bufs.get (*t, out).silence (nframes, 0);
1087 uint32_t in_idx = in_map.get (*t, src_idx, &valid);
1089 bufs.get (*t, out).silence (nframes, 0);
1092 if (in_idx != src_idx) {
1093 bufs.get (*t, out).read_from (bufs.get (*t, in_idx), nframes, 0, 0);
1101 PluginInsert::silence (framecnt_t nframes, framepos_t start_frame)
1107 _delaybuffers.flush ();
1109 ChanMapping in_map (natural_input_streams ());
1110 ChanMapping out_map (natural_output_streams ());
1111 ChanCount maxbuf = ChanCount::max (natural_input_streams (), natural_output_streams());
1113 if (is_channelstrip ()) {
1114 if (_configured_in.n_audio() > 0) {
1115 _plugins.front()->connect_and_run (_session.get_scratch_buffers (maxbuf, true), start_frame, start_frame + nframes, 1.0, in_map, out_map, nframes, 0);
1119 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1120 (*i)->connect_and_run (_session.get_scratch_buffers (maxbuf, true), start_frame, start_frame + nframes, 1.0, in_map, out_map, nframes, 0);
1125 PluginInsert::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, double speed, pframes_t nframes, bool)
1128 // collect sidechain input for complete cycle (!)
1129 // TODO we need delaylines here for latency compensation
1130 _sidechain->run (bufs, start_frame, end_frame, speed, nframes, true);
1133 if (_pending_active) {
1134 /* run as normal if we are active or moving from inactive to active */
1136 if (_session.transport_rolling() || _session.bounce_processing()) {
1137 automation_run (bufs, start_frame, end_frame, speed, nframes);
1139 Glib::Threads::Mutex::Lock lm (control_lock(), Glib::Threads::TRY_LOCK);
1140 connect_and_run (bufs, start_frame, end_frame, speed, nframes, 0, lm.locked());
1144 bypass (bufs, nframes);
1145 _delaybuffers.flush ();
1148 _active = _pending_active;
1150 /* we have no idea whether the plugin generated silence or not, so mark
1151 * all buffers appropriately.
1156 PluginInsert::automation_run (BufferSet& bufs, framepos_t start, framepos_t end, double speed, pframes_t nframes)
1158 Evoral::ControlEvent next_event (0, 0.0f);
1159 framecnt_t offset = 0;
1161 Glib::Threads::Mutex::Lock lm (control_lock(), Glib::Threads::TRY_LOCK);
1164 connect_and_run (bufs, start, end, speed, nframes, offset, false);
1168 if (!find_next_event (start, end, next_event) || _plugins.front()->requires_fixed_sized_buffers()) {
1170 /* no events have a time within the relevant range */
1172 connect_and_run (bufs, start, end, speed, nframes, offset, true);
1178 framecnt_t cnt = min (((framecnt_t) ceil (next_event.when) - start), (framecnt_t) nframes);
1180 connect_and_run (bufs, start, start + cnt, speed, cnt, offset, true); // XXX (start + cnt) * speed
1186 if (!find_next_event (start, end, next_event)) {
1191 /* cleanup anything that is left to do */
1194 connect_and_run (bufs, start, start + nframes, speed, nframes, offset, true);
1199 PluginInsert::default_parameter_value (const Evoral::Parameter& param)
1201 if (param.type() != PluginAutomation)
1204 if (_plugins.empty()) {
1205 fatal << _("programming error: ") << X_("PluginInsert::default_parameter_value() called with no plugin")
1207 abort(); /*NOTREACHED*/
1210 return _plugins[0]->default_value (param.id());
1215 PluginInsert::can_reset_all_parameters ()
1218 uint32_t params = 0;
1219 for (uint32_t par = 0; par < _plugins[0]->parameter_count(); ++par) {
1221 const uint32_t cid = _plugins[0]->nth_parameter (par, ok);
1223 if (!ok || !_plugins[0]->parameter_is_input(cid)) {
1227 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, cid));
1233 if (ac->automation_state() & Play) {
1238 return all && (params > 0);
1242 PluginInsert::reset_parameters_to_default ()
1246 for (uint32_t par = 0; par < _plugins[0]->parameter_count(); ++par) {
1248 const uint32_t cid = _plugins[0]->nth_parameter (par, ok);
1250 if (!ok || !_plugins[0]->parameter_is_input(cid)) {
1254 const float dflt = _plugins[0]->default_value (cid);
1255 const float curr = _plugins[0]->get_parameter (cid);
1261 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, cid));
1266 if (ac->automation_state() & Play) {
1271 ac->set_value (dflt, Controllable::NoGroup);
1276 boost::shared_ptr<Plugin>
1277 PluginInsert::plugin_factory (boost::shared_ptr<Plugin> other)
1279 boost::shared_ptr<LadspaPlugin> lp;
1280 boost::shared_ptr<LuaProc> lua;
1282 boost::shared_ptr<LV2Plugin> lv2p;
1284 #ifdef WINDOWS_VST_SUPPORT
1285 boost::shared_ptr<WindowsVSTPlugin> vp;
1287 #ifdef LXVST_SUPPORT
1288 boost::shared_ptr<LXVSTPlugin> lxvp;
1290 #ifdef MACVST_SUPPORT
1291 boost::shared_ptr<MacVSTPlugin> mvp;
1293 #ifdef AUDIOUNIT_SUPPORT
1294 boost::shared_ptr<AUPlugin> ap;
1297 if ((lp = boost::dynamic_pointer_cast<LadspaPlugin> (other)) != 0) {
1298 return boost::shared_ptr<Plugin> (new LadspaPlugin (*lp));
1299 } else if ((lua = boost::dynamic_pointer_cast<LuaProc> (other)) != 0) {
1300 return boost::shared_ptr<Plugin> (new LuaProc (*lua));
1302 } else if ((lv2p = boost::dynamic_pointer_cast<LV2Plugin> (other)) != 0) {
1303 return boost::shared_ptr<Plugin> (new LV2Plugin (*lv2p));
1305 #ifdef WINDOWS_VST_SUPPORT
1306 } else if ((vp = boost::dynamic_pointer_cast<WindowsVSTPlugin> (other)) != 0) {
1307 return boost::shared_ptr<Plugin> (new WindowsVSTPlugin (*vp));
1309 #ifdef LXVST_SUPPORT
1310 } else if ((lxvp = boost::dynamic_pointer_cast<LXVSTPlugin> (other)) != 0) {
1311 return boost::shared_ptr<Plugin> (new LXVSTPlugin (*lxvp));
1313 #ifdef MACVST_SUPPORT
1314 } else if ((mvp = boost::dynamic_pointer_cast<MacVSTPlugin> (other)) != 0) {
1315 return boost::shared_ptr<Plugin> (new MacVSTPlugin (*mvp));
1317 #ifdef AUDIOUNIT_SUPPORT
1318 } else if ((ap = boost::dynamic_pointer_cast<AUPlugin> (other)) != 0) {
1319 return boost::shared_ptr<Plugin> (new AUPlugin (*ap));
1323 fatal << string_compose (_("programming error: %1"),
1324 X_("unknown plugin type in PluginInsert::plugin_factory"))
1326 abort(); /*NOTREACHED*/
1327 return boost::shared_ptr<Plugin> ((Plugin*) 0);
1331 PluginInsert::set_input_map (uint32_t num, ChanMapping m) {
1332 if (num < _in_map.size()) {
1333 bool changed = _in_map[num] != m;
1335 changed |= sanitize_maps ();
1337 PluginMapChanged (); /* EMIT SIGNAL */
1338 _mapping_changed = true;
1339 _session.set_dirty();
1345 PluginInsert::set_output_map (uint32_t num, ChanMapping m) {
1346 if (num < _out_map.size()) {
1347 bool changed = _out_map[num] != m;
1349 changed |= sanitize_maps ();
1351 PluginMapChanged (); /* EMIT SIGNAL */
1352 _mapping_changed = true;
1353 _session.set_dirty();
1359 PluginInsert::set_thru_map (ChanMapping m) {
1360 bool changed = _thru_map != m;
1362 changed |= sanitize_maps ();
1364 PluginMapChanged (); /* EMIT SIGNAL */
1365 _mapping_changed = true;
1366 _session.set_dirty();
1371 PluginInsert::pre_seed (const ChanCount& in, const ChanCount& out,
1372 const ChanMapping& im, const ChanMapping& om, const ChanMapping& tm)
1374 if (_configured) { return false; }
1375 _configured_in = in;
1376 _configured_out = out;
1380 _maps_from_state = in.n_total () > 0 && out.n_total () > 0;
1385 PluginInsert::input_map () const
1389 for (PinMappings::const_iterator i = _in_map.begin (); i != _in_map.end (); ++i, ++pc) {
1390 ChanMapping m (i->second);
1391 const ChanMapping::Mappings& mp ((*i).second.mappings());
1392 for (ChanMapping::Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
1393 for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
1394 rv.set (tm->first, i->first + pc * natural_input_streams().get(tm->first), i->second);
1403 PluginInsert::no_sc_input_map () const
1407 for (PinMappings::const_iterator i = _in_map.begin (); i != _in_map.end (); ++i, ++pc) {
1408 ChanMapping m (i->second);
1409 const ChanMapping::Mappings& mp ((*i).second.mappings());
1410 for (ChanMapping::Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
1411 uint32_t ins = natural_input_streams().get(tm->first) - _cached_sidechain_pins.get(tm->first);
1412 for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
1413 if (i->first < ins) {
1414 rv.set (tm->first, i->first + pc * ins, i->second);
1423 PluginInsert::output_map () const
1427 for (PinMappings::const_iterator i = _out_map.begin (); i != _out_map.end (); ++i, ++pc) {
1428 ChanMapping m (i->second);
1429 const ChanMapping::Mappings& mp ((*i).second.mappings());
1430 for (ChanMapping::Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
1431 for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
1432 rv.set (tm->first, i->first + pc * natural_output_streams().get(tm->first), i->second);
1436 if (has_midi_bypass ()) {
1437 rv.set (DataType::MIDI, 0, 0);
1444 PluginInsert::has_midi_bypass () const
1446 if (_configured_in.n_midi () == 1 && _configured_out.n_midi () == 1
1447 && natural_output_streams ().n_midi () == 0) {
1454 PluginInsert::has_midi_thru () const
1456 if (_configured_in.n_midi () == 1 && _configured_out.n_midi () == 1
1457 && natural_input_streams ().n_midi () == 0 && natural_output_streams ().n_midi () == 0) {
1465 PluginInsert::is_channelstrip () const {
1466 return _plugins.front()->is_channelstrip();
1471 PluginInsert::check_inplace ()
1473 bool inplace_ok = !_plugins.front()->inplace_broken ();
1475 if (_thru_map.n_total () > 0) {
1476 // TODO once midi-bypass is part of the mapping, ignore it
1480 if (_match.method == Split && inplace_ok) {
1481 assert (get_count() == 1);
1482 assert (_in_map.size () == 1);
1483 if (!_out_map[0].is_monotonic ()) {
1486 if (_configured_internal != _configured_in) {
1487 /* no sidechain -- TODO we could allow this with
1488 * some more logic in PluginInsert::connect_and_run().
1490 * PluginInsert::reset_map() already maps it.
1495 for (DataType::iterator t = DataType::begin(); t != DataType::end() && inplace_ok; ++t) {
1496 if (_configured_internal.get (*t) == 0) {
1500 uint32_t first_idx = _in_map[0].get (*t, 0, &valid);
1501 if (!valid || first_idx != 0) {
1502 // so far only allow to copy the *first* stream's buffer to others
1505 for (uint32_t i = 1; i < natural_input_streams ().get (*t); ++i) {
1506 uint32_t idx = _in_map[0].get (*t, i, &valid);
1507 if (valid && idx != first_idx) {
1516 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: In Place Split Map\n", name()));
1521 for (uint32_t pc = 0; pc < get_count() && inplace_ok ; ++pc) {
1522 if (!_in_map[pc].is_monotonic ()) {
1525 if (!_out_map[pc].is_monotonic ()) {
1531 /* check if every output is fed by the corresponding input
1533 * this prevents in-port 1 -> sink-pin 2 || source-pin 1 -> out port 1, source-pin 2 -> out port 2
1534 * (with in-place, source-pin 1 -> out port 1 overwrites in-port 1)
1536 * but allows in-port 1 -> sink-pin 2 || source-pin 2 -> out port 1
1538 ChanMapping in_map (input_map ());
1539 const ChanMapping::Mappings out_m (output_map ().mappings ());
1540 for (ChanMapping::Mappings::const_iterator t = out_m.begin (); t != out_m.end () && inplace_ok; ++t) {
1541 for (ChanMapping::TypeMapping::const_iterator c = (*t).second.begin (); c != (*t).second.end () ; ++c) {
1542 /* src-pin: c->first, out-port: c->second */
1544 uint32_t in_port = in_map.get (t->first, c->first, &valid);
1545 if (valid && in_port != c->second) {
1553 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: %2\n", name(), inplace_ok ? "In-Place" : "No Inplace Processing"));
1554 return !inplace_ok; // no-inplace
1558 PluginInsert::sanitize_maps ()
1560 bool changed = false;
1561 /* strip dead wood */
1562 PinMappings new_ins;
1563 PinMappings new_outs;
1564 ChanMapping new_thru;
1566 for (uint32_t pc = 0; pc < get_count(); ++pc) {
1568 ChanMapping new_out;
1569 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1570 for (uint32_t i = 0; i < natural_input_streams().get (*t); ++i) {
1572 uint32_t idx = _in_map[pc].get (*t, i, &valid);
1573 if (valid && idx < _configured_internal.get (*t)) {
1574 new_in.set (*t, i, idx);
1577 for (uint32_t o = 0; o < natural_output_streams().get (*t); ++o) {
1579 uint32_t idx = _out_map[pc].get (*t, o, &valid);
1580 if (valid && idx < _configured_out.get (*t)) {
1581 new_out.set (*t, o, idx);
1585 if (_in_map[pc] != new_in || _out_map[pc] != new_out) {
1588 new_ins[pc] = new_in;
1589 new_outs[pc] = new_out;
1592 /* prevent dup output assignments */
1593 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1594 for (uint32_t o = 0; o < _configured_out.get (*t); ++o) {
1595 bool mapped = false;
1596 for (uint32_t pc = 0; pc < get_count(); ++pc) {
1598 uint32_t idx = new_outs[pc].get_src (*t, o, &valid);
1599 if (valid && mapped) {
1600 new_outs[pc].unset (*t, idx);
1608 /* remove excess thru */
1609 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1610 for (uint32_t o = 0; o < _configured_out.get (*t); ++o) {
1612 uint32_t idx = _thru_map.get (*t, o, &valid);
1613 if (valid && idx < _configured_internal.get (*t)) {
1614 new_thru.set (*t, o, idx);
1619 /* prevent out + thru, existing plugin outputs override thru */
1620 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1621 for (uint32_t o = 0; o < _configured_out.get (*t); ++o) {
1622 bool mapped = false;
1624 for (uint32_t pc = 0; pc < get_count(); ++pc) {
1625 new_outs[pc].get_src (*t, o, &mapped);
1626 if (mapped) { break; }
1628 if (!mapped) { continue; }
1629 uint32_t idx = new_thru.get (*t, o, &valid);
1631 new_thru.unset (*t, idx);
1636 if (has_midi_bypass ()) {
1637 // TODO: include midi-bypass in the thru set,
1638 // remove dedicated handling.
1639 new_thru.unset (DataType::MIDI, 0);
1642 if (_in_map != new_ins || _out_map != new_outs || _thru_map != new_thru) {
1646 _out_map = new_outs;
1647 _thru_map = new_thru;
1653 PluginInsert::reset_map (bool emit)
1655 const PinMappings old_in (_in_map);
1656 const PinMappings old_out (_out_map);
1660 _thru_map = ChanMapping ();
1662 /* build input map */
1663 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1664 uint32_t sc = 0; // side-chain round-robin (all instances)
1666 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
1667 const uint32_t nis = natural_input_streams ().get(*t);
1668 const uint32_t stride = nis - sidechain_input_pins().get (*t);
1670 /* SC inputs are last in the plugin-insert.. */
1671 const uint32_t sc_start = _configured_in.get (*t);
1672 const uint32_t sc_len = _configured_internal.get (*t) - sc_start;
1673 /* ...but may not be at the end of the plugin ports.
1674 * in case the side-chain is not the last port, shift connections back.
1675 * and connect to side-chain
1678 uint32_t ic = 0; // split inputs
1679 const uint32_t cend = _configured_in.get (*t);
1681 for (uint32_t in = 0; in < nis; ++in) {
1682 const Plugin::IOPortDescription& iod (_plugins[pc]->describe_io_port (*t, true, in));
1683 if (iod.is_sidechain) {
1684 /* connect sidechain sinks to sidechain inputs in round-robin fashion */
1685 if (sc_len > 0) {// side-chain may be hidden
1686 _in_map[pc].set (*t, in, sc_start + sc);
1687 sc = (sc + 1) % sc_len;
1691 if (_match.method == Split) {
1692 if (cend == 0) { continue; }
1693 if (_strict_io && ic + stride * pc >= cend) {
1696 /* connect *no* sidechain sinks in round-robin fashion */
1697 _in_map[pc].set (*t, in, ic + stride * pc);
1698 if (_strict_io && (ic + 1) == cend) {
1701 ic = (ic + 1) % cend;
1703 uint32_t s = in - shift;
1704 if (stride * pc + s < cend) {
1705 _in_map[pc].set (*t, in, s + stride * pc);
1713 /* build output map */
1715 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
1716 _out_map[pc] = ChanMapping (ChanCount::min (natural_output_streams(), _configured_out));
1717 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1718 _out_map[pc].offset_to(*t, pc * natural_output_streams().get(*t));
1723 if (old_in == _in_map && old_out == _out_map) {
1727 PluginMapChanged (); /* EMIT SIGNAL */
1728 _mapping_changed = true;
1729 _session.set_dirty();
1735 PluginInsert::configure_io (ChanCount in, ChanCount out)
1737 Match old_match = _match;
1739 ChanCount old_internal;
1743 old_pins = natural_input_streams();
1744 old_in = _configured_in;
1745 old_out = _configured_out;
1746 old_internal = _configured_internal;
1748 _configured_in = in;
1749 _configured_internal = in;
1750 _configured_out = out;
1753 /* TODO hide midi-bypass, and custom outs. Best /fake/ "out" here.
1754 * (currently _sidechain->configure_io always succeeds
1755 * since Processor::configure_io() succeeds)
1757 if (!_sidechain->configure_io (in, out)) {
1758 DEBUG_TRACE (DEBUG::ChanMapping, "Sidechain configuration failed\n");
1761 _configured_internal += _sidechain->input()->n_ports();
1763 // include (static_cast<Route*>owner())->name() ??
1764 _sidechain->input ()-> set_pretty_name (string_compose (_("SC %1"), name ()));
1767 /* get plugin configuration */
1768 _match = private_can_support_io_configuration (in, out);
1770 if (DEBUG_ENABLED(DEBUG::ChanMapping)) {
1772 DEBUG_STR_APPEND(a, string_compose ("%1: ", name()));
1773 DEBUG_STR_APPEND(a, _match);
1774 DEBUG_TRACE (DEBUG::ChanMapping, DEBUG_STR(a).str());
1778 /* set the matching method and number of plugins that we will use to meet this configuration */
1779 if (set_count (_match.plugins) == false) {
1780 PluginIoReConfigure (); /* EMIT SIGNAL */
1781 _configured = false;
1785 /* configure plugins */
1786 switch (_match.method) {
1789 if (_plugins.front()->configure_io (natural_input_streams(), out) == false) {
1790 PluginIoReConfigure (); /* EMIT SIGNAL */
1791 _configured = false;
1797 ChanCount din (_configured_internal);
1798 ChanCount dout (din); // hint
1800 if (_custom_sinks.n_total () > 0) {
1801 din = _custom_sinks;
1804 } else if (_preset_out.n_audio () > 0) {
1805 dout.set (DataType::AUDIO, _preset_out.n_audio ());
1806 } else if (dout.n_midi () > 0 && dout.n_audio () == 0) {
1807 dout.set (DataType::AUDIO, 2);
1809 if (out.n_audio () == 0) { out.set (DataType::AUDIO, 1); }
1811 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: Delegate lookup : %2 %3\n", name(), din, dout));
1812 bool const r = _plugins.front()->can_support_io_configuration (din, dout, &useins);
1814 if (useins.n_audio() == 0) {
1817 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: Delegate configuration: %2 %3\n", name(), useins, dout));
1819 if (_plugins.front()->configure_io (useins, dout) == false) {
1820 PluginIoReConfigure (); /* EMIT SIGNAL */
1821 _configured = false;
1825 _custom_sinks = din;
1830 if (_plugins.front()->configure_io (in, out) == false) {
1831 PluginIoReConfigure (); /* EMIT SIGNAL */
1832 _configured = false;
1838 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",
1840 _configured ? "Y" : "N",
1841 _maps_from_state ? "Y" : "N",
1842 old_in == in ? "==" : "!=",
1843 old_out == out ? "==" : "!=",
1844 old_pins == natural_input_streams () ? "==" : "!=",
1845 old_match.method == _match.method ? "==" : "!=",
1846 old_match.custom_cfg == _match.custom_cfg ? "==" : "!=",
1847 _in_map.size() == get_count () ? "==" : "!=",
1848 _out_map.size() == get_count () ? "==" : "!="
1851 bool mapping_changed = false;
1852 if (old_in == in && old_out == out
1854 && old_pins == natural_input_streams ()
1855 && old_match.method == _match.method
1856 && old_match.custom_cfg == _match.custom_cfg
1857 && _in_map.size() == _out_map.size()
1858 && _in_map.size() == get_count ()
1860 /* If the configuration has not changed, keep the mapping */
1861 mapping_changed = sanitize_maps ();
1862 } else if (_match.custom_cfg && _configured) {
1863 /* don't touch the map in manual mode */
1864 mapping_changed = sanitize_maps ();
1867 if (is_channelstrip ()) {
1868 /* fake channel map - for wire display */
1871 _thru_map = ChanMapping ();
1872 _in_map[0] = ChanMapping (ChanCount::min (_configured_in, ChanCount (DataType::AUDIO, 2)));
1873 _out_map[0] = ChanMapping (ChanCount::min (_configured_out, ChanCount (DataType::AUDIO, 2)));
1874 /* set "thru" map for in-place forward of audio */
1875 for (uint32_t i = 2; i < _configured_in.n_audio(); ++i) {
1876 _thru_map.set (DataType::AUDIO, i, i);
1878 /* and midi (after implicit 1st channel bypass) */
1879 for (uint32_t i = 1; i < _configured_in.n_midi(); ++i) {
1880 _thru_map.set (DataType::MIDI, i, i);
1884 if (_maps_from_state && old_in == in && old_out == out) {
1885 mapping_changed = true;
1888 /* generate a new mapping */
1889 mapping_changed = reset_map (false);
1891 _maps_from_state = false;
1894 if (mapping_changed) {
1895 PluginMapChanged (); /* EMIT SIGNAL */
1898 if (DEBUG_ENABLED(DEBUG::ChanMapping)) {
1901 DEBUG_STR_APPEND(a, "\n--------<<--------\n");
1902 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
1904 DEBUG_STR_APPEND(a, "----><----\n");
1906 DEBUG_STR_APPEND(a, string_compose ("Channel Map for %1 plugin %2\n", name(), pc));
1907 DEBUG_STR_APPEND(a, " * Inputs:\n");
1908 DEBUG_STR_APPEND(a, _in_map[pc]);
1909 DEBUG_STR_APPEND(a, " * Outputs:\n");
1910 DEBUG_STR_APPEND(a, _out_map[pc]);
1912 DEBUG_STR_APPEND(a, " * Thru:\n");
1913 DEBUG_STR_APPEND(a, _thru_map);
1914 DEBUG_STR_APPEND(a, "-------->>--------\n");
1915 DEBUG_TRACE (DEBUG::ChanMapping, DEBUG_STR(a).str());
1920 _no_inplace = check_inplace ();
1921 _mapping_changed = false;
1923 /* only the "noinplace_buffers" thread buffers need to be this large,
1924 * this can be optimized. other buffers are fine with
1925 * ChanCount::max (natural_input_streams (), natural_output_streams())
1926 * and route.cc's max (configured_in, configured_out)
1928 * no-inplace copies "thru" outputs (to emulate in-place) for
1929 * all outputs (to prevent overwrite) into a temporary space
1930 * which also holds input buffers (in case the plugin does process
1931 * in-place and overwrites those).
1933 * this buffers need to be at least as
1934 * natural_input_streams () + possible outputs.
1936 * sidechain inputs add a constraint on the input:
1937 * configured input + sidechain (=_configured_internal)
1939 * NB. this also satisfies
1940 * max (natural_input_streams(), natural_output_streams())
1941 * which is needed for silence runs
1943 _required_buffers = ChanCount::max (_configured_internal,
1944 natural_input_streams () + ChanCount::max (_configured_out, natural_output_streams () * get_count ()));
1946 if (old_in != in || old_out != out || old_internal != _configured_internal
1947 || old_pins != natural_input_streams ()
1948 || (old_match.method != _match.method && (old_match.method == Split || _match.method == Split))
1950 PluginIoReConfigure (); /* EMIT SIGNAL */
1953 _delaybuffers.configure (_configured_out, _plugins.front ()->max_latency ());
1954 _latency_changed = true;
1956 // we don't know the analysis window size, so we must work with the
1957 // current buffer size here. each request for data fills in these
1958 // buffers and the analyser makes sure it gets enough data for the
1960 session().ensure_buffer_set (_signal_analysis_inputs, in);
1961 _signal_analysis_inputs.set_count (in);
1963 session().ensure_buffer_set (_signal_analysis_outputs, out);
1964 _signal_analysis_outputs.set_count (out);
1966 // std::cerr << "set counts to i" << in.n_audio() << "/o" << out.n_audio() << std::endl;
1969 return Processor::configure_io (in, out);
1972 /** Decide whether this PluginInsert can support a given IO configuration.
1973 * To do this, we run through a set of possible solutions in rough order of
1976 * @param in Required input channel count.
1977 * @param out Filled in with the output channel count if we return true.
1978 * @return true if the given IO configuration can be supported.
1981 PluginInsert::can_support_io_configuration (const ChanCount& in, ChanCount& out)
1984 _sidechain->can_support_io_configuration (in, out); // never fails, sets "out"
1986 return private_can_support_io_configuration (in, out).method != Impossible;
1990 PluginInsert::private_can_support_io_configuration (ChanCount const& in, ChanCount& out) const
1992 if (!_custom_cfg && _preset_out.n_audio () > 0) {
1993 // preseed hint (for variable i/o)
1994 out.set (DataType::AUDIO, _preset_out.n_audio ());
1997 Match rv = internal_can_support_io_configuration (in, out);
1999 if (!_custom_cfg && _preset_out.n_audio () > 0) {
2000 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: using output preset: %2\n", name(), _preset_out));
2001 out.set (DataType::AUDIO, _preset_out.n_audio ());
2006 /** A private version of can_support_io_configuration which returns the method
2007 * by which the configuration can be matched, rather than just whether or not
2011 PluginInsert::internal_can_support_io_configuration (ChanCount const & inx, ChanCount& out) const
2013 if (_plugins.empty()) {
2018 if (is_channelstrip ()) {
2020 return Match (ExactMatch, 1);
2024 /* if a user specified a custom cfg, so be it. */
2026 PluginInfoPtr info = _plugins.front()->get_info();
2028 if (info->reconfigurable_io()) {
2029 return Match (Delegate, 1, _strict_io, true);
2031 return Match (ExactMatch, get_count(), _strict_io, true);
2035 /* try automatic configuration */
2036 Match m = PluginInsert::automatic_can_support_io_configuration (inx, out);
2038 PluginInfoPtr info = _plugins.front()->get_info();
2039 ChanCount inputs = info->n_inputs;
2040 ChanCount outputs = info->n_outputs;
2042 /* handle case strict-i/o */
2043 if (_strict_io && m.method != Impossible) {
2046 /* special case MIDI instruments */
2047 if (is_instrument ()) {
2048 // output = midi-bypass + at most master-out channels.
2049 ChanCount max_out (DataType::AUDIO, 2); // TODO use master-out
2050 max_out.set (DataType::MIDI, out.get(DataType::MIDI));
2051 out = ChanCount::min (out, max_out);
2052 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: special case strict-i/o instrument\n", name()));
2058 if (inx.n_audio () != out.n_audio ()) { // ignore midi bypass
2059 /* replicate processor to match output count (generators and such)
2060 * at least enough to feed every output port. */
2061 uint32_t f = 1; // at least one. e.g. control data filters, no in, no out.
2062 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2063 uint32_t nout = outputs.get (*t);
2064 if (nout == 0 || inx.get(*t) == 0) { continue; }
2065 f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nout));
2068 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: special case strict-i/o for generator\n", name()));
2069 return Match (Replicate, f, _strict_io);
2080 if (m.method != Impossible) {
2084 ChanCount ns_inputs = inputs - sidechain_input_pins ();
2086 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: resolving 'Impossible' match...\n", name()));
2088 if (info->reconfigurable_io()) {
2091 if (out.n_midi () > 0 && out.n_audio () == 0) { out.set (DataType::AUDIO, 2); }
2092 if (out.n_audio () == 0) { out.set (DataType::AUDIO, 1); }
2093 bool const r = _plugins.front()->can_support_io_configuration (inx + sidechain_input_pins (), out, &useins);
2095 // houston, we have a problem.
2096 return Match (Impossible, 0);
2099 if (inx.n_midi () > 0 && out.n_midi () == 0) { out.set (DataType::MIDI, 1); }
2100 return Match (Delegate, 1, _strict_io);
2103 ChanCount midi_bypass;
2104 if (inx.get(DataType::MIDI) == 1 && outputs.get(DataType::MIDI) == 0) {
2105 midi_bypass.set (DataType::MIDI, 1);
2108 // add at least as many plugins so that output count matches input count (w/o sidechain pins)
2110 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2111 uint32_t nin = ns_inputs.get (*t);
2112 uint32_t nout = outputs.get (*t);
2113 if (nin == 0 || inx.get(*t) == 0) { continue; }
2114 // prefer floor() so the count won't overly increase IFF (nin < nout)
2115 f = max (f, (uint32_t) floor (inx.get(*t) / (float)nout));
2117 if (f > 0 && outputs * f >= _configured_out) {
2118 out = outputs * f + midi_bypass;
2119 return Match (Replicate, f, _strict_io);
2122 // add at least as many plugins needed to connect all inputs (w/o sidechain pins)
2124 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2125 uint32_t nin = ns_inputs.get (*t);
2126 if (nin == 0 || inx.get(*t) == 0) { continue; }
2127 f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nin));
2130 out = outputs * f + midi_bypass;
2131 return Match (Replicate, f, _strict_io);
2134 // add at least as many plugins needed to connect all inputs
2136 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2137 uint32_t nin = inputs.get (*t);
2138 if (nin == 0 || inx.get(*t) == 0) { continue; }
2139 f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nin));
2141 out = outputs * f + midi_bypass;
2142 return Match (Replicate, f, _strict_io);
2145 /* this is the original Ardour 3/4 behavior, mainly for backwards compatibility */
2147 PluginInsert::automatic_can_support_io_configuration (ChanCount const & inx, ChanCount& out) const
2149 if (_plugins.empty()) {
2153 PluginInfoPtr info = _plugins.front()->get_info();
2154 ChanCount in; in += inx;
2155 ChanCount midi_bypass;
2157 if (info->reconfigurable_io()) {
2158 /* Plugin has flexible I/O, so delegate to it
2159 * pre-seed outputs, plugin tries closest match
2162 if (out.n_midi () > 0 && out.n_audio () == 0) { out.set (DataType::AUDIO, 2); }
2163 if (out.n_audio () == 0) { out.set (DataType::AUDIO, 1); }
2164 bool const r = _plugins.front()->can_support_io_configuration (in + sidechain_input_pins (), out);
2166 return Match (Impossible, 0);
2169 if (in.n_midi () > 0 && out.n_midi () == 0) { out.set (DataType::MIDI, 1); }
2170 return Match (Delegate, 1);
2173 ChanCount inputs = info->n_inputs;
2174 ChanCount outputs = info->n_outputs;
2175 ChanCount ns_inputs = inputs - sidechain_input_pins ();
2177 if (in.get(DataType::MIDI) == 1 && outputs.get(DataType::MIDI) == 0) {
2178 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: bypassing midi-data\n", name()));
2179 midi_bypass.set (DataType::MIDI, 1);
2181 if (in.get(DataType::MIDI) == 1 && inputs.get(DataType::MIDI) == 0) {
2182 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: hiding midi-port from plugin\n", name()));
2183 in.set(DataType::MIDI, 0);
2186 // add internally provided sidechain ports
2187 ChanCount insc = in + sidechain_input_ports ();
2189 bool no_inputs = true;
2190 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2191 if (inputs.get (*t) != 0) {
2198 /* no inputs so we can take any input configuration since we throw it away */
2199 out = outputs + midi_bypass;
2200 return Match (NoInputs, 1);
2203 /* Plugin inputs match requested inputs + side-chain-ports exactly */
2204 if (inputs == insc) {
2205 out = outputs + midi_bypass;
2206 return Match (ExactMatch, 1);
2209 /* Plugin inputs matches without side-chain-pins */
2210 if (ns_inputs == in) {
2211 out = outputs + midi_bypass;
2212 return Match (ExactMatch, 1);
2215 /* We may be able to run more than one copy of the plugin within this insert
2216 to cope with the insert having more inputs than the plugin.
2217 We allow replication only for plugins with either zero or 1 inputs and outputs
2218 for every valid data type.
2222 bool can_replicate = true;
2223 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2225 // ignore side-chains
2226 uint32_t nin = ns_inputs.get (*t);
2228 // No inputs of this type
2229 if (nin == 0 && in.get(*t) == 0) {
2233 if (nin != 1 || outputs.get (*t) != 1) {
2234 can_replicate = false;
2238 // Potential factor not set yet
2240 f = in.get(*t) / nin;
2243 // Factor for this type does not match another type, can not replicate
2244 if (f != (in.get(*t) / nin)) {
2245 can_replicate = false;
2250 if (can_replicate && f > 0) {
2251 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2252 out.set (*t, outputs.get(*t) * f);
2255 return Match (Replicate, f);
2258 /* If the processor has exactly one input of a given type, and
2259 the plugin has more, we can feed the single processor input
2260 to some or all of the plugin inputs. This is rather
2261 special-case-y, but the 1-to-many case is by far the
2262 simplest. How do I split thy 2 processor inputs to 3
2263 plugin inputs? Let me count the ways ...
2266 bool can_split = true;
2267 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2269 bool const can_split_type = (in.get (*t) == 1 && ns_inputs.get (*t) > 1);
2270 bool const nothing_to_do_for_type = (in.get (*t) == 0 && inputs.get (*t) == 0);
2272 if (!can_split_type && !nothing_to_do_for_type) {
2278 out = outputs + midi_bypass;
2279 return Match (Split, 1);
2282 /* If the plugin has more inputs than we want, we can `hide' some of them
2283 by feeding them silence.
2286 bool could_hide = false;
2287 bool cannot_hide = false;
2288 ChanCount hide_channels;
2290 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2291 if (inputs.get(*t) > in.get(*t)) {
2292 /* there is potential to hide, since the plugin has more inputs of type t than the insert */
2293 hide_channels.set (*t, inputs.get(*t) - in.get(*t));
2295 } else if (inputs.get(*t) < in.get(*t)) {
2296 /* we definitely cannot hide, since the plugin has fewer inputs of type t than the insert */
2301 if (could_hide && !cannot_hide) {
2302 out = outputs + midi_bypass;
2303 return Match (Hide, 1, false, false, hide_channels);
2306 return Match (Impossible, 0);
2311 PluginInsert::get_state ()
2313 return state (true);
2317 PluginInsert::state (bool full)
2319 XMLNode& node = Processor::state (full);
2321 node.add_property("type", _plugins[0]->state_node_name());
2322 node.add_property("unique-id", _plugins[0]->unique_id());
2323 node.add_property("count", string_compose("%1", _plugins.size()));
2325 /* remember actual i/o configuration (for later placeholder
2326 * in case the plugin goes missing) */
2327 node.add_child_nocopy (* _configured_in.state (X_("ConfiguredInput")));
2328 node.add_child_nocopy (* _custom_sinks.state (X_("CustomSinks")));
2329 node.add_child_nocopy (* _configured_out.state (X_("ConfiguredOutput")));
2330 node.add_child_nocopy (* _preset_out.state (X_("PresetOutput")));
2332 /* save custom i/o config */
2333 node.add_property("custom", _custom_cfg ? "yes" : "no");
2334 for (uint32_t pc = 0; pc < get_count(); ++pc) {
2336 snprintf (tmp, sizeof(tmp), "InputMap-%d", pc);
2337 node.add_child_nocopy (* _in_map[pc].state (tmp));
2338 snprintf (tmp, sizeof(tmp), "OutputMap-%d", pc);
2339 node.add_child_nocopy (* _out_map[pc].state (tmp));
2341 node.add_child_nocopy (* _thru_map.state ("ThruMap"));
2344 node.add_child_nocopy (_sidechain->state (full));
2347 _plugins[0]->set_insert_id(this->id());
2348 node.add_child_nocopy (_plugins[0]->get_state());
2350 for (Controls::iterator c = controls().begin(); c != controls().end(); ++c) {
2351 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> ((*c).second);
2353 node.add_child_nocopy (ac->get_state());
2361 PluginInsert::set_control_ids (const XMLNode& node, int version)
2363 const XMLNodeList& nlist = node.children();
2364 XMLNodeConstIterator iter;
2365 set<Evoral::Parameter>::const_iterator p;
2367 for (iter = nlist.begin(); iter != nlist.end(); ++iter) {
2368 if ((*iter)->name() == Controllable::xml_node_name) {
2369 XMLProperty const * prop;
2371 uint32_t p = (uint32_t)-1;
2373 if ((prop = (*iter)->property (X_("symbol"))) != 0) {
2374 boost::shared_ptr<LV2Plugin> lv2plugin = boost::dynamic_pointer_cast<LV2Plugin> (_plugins[0]);
2376 p = lv2plugin->port_index(prop->value().c_str());
2380 if (p == (uint32_t)-1 && (prop = (*iter)->property (X_("parameter"))) != 0) {
2381 p = atoi (prop->value());
2384 if (p != (uint32_t)-1) {
2386 /* this may create the new controllable */
2388 boost::shared_ptr<Evoral::Control> c = control (Evoral::Parameter (PluginAutomation, 0, p));
2390 #ifndef NO_PLUGIN_STATE
2394 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> (c);
2396 ac->set_state (**iter, version);
2405 PluginInsert::set_state(const XMLNode& node, int version)
2407 XMLNodeList nlist = node.children();
2408 XMLNodeIterator niter;
2409 XMLPropertyList plist;
2410 XMLProperty const * prop;
2411 ARDOUR::PluginType type;
2413 if ((prop = node.property ("type")) == 0) {
2414 error << _("XML node describing plugin is missing the `type' field") << endmsg;
2418 if (prop->value() == X_("ladspa") || prop->value() == X_("Ladspa")) { /* handle old school sessions */
2419 type = ARDOUR::LADSPA;
2420 } else if (prop->value() == X_("lv2")) {
2422 } else if (prop->value() == X_("windows-vst")) {
2423 type = ARDOUR::Windows_VST;
2424 } else if (prop->value() == X_("lxvst")) {
2425 type = ARDOUR::LXVST;
2426 } else if (prop->value() == X_("mac-vst")) {
2427 type = ARDOUR::MacVST;
2428 } else if (prop->value() == X_("audiounit")) {
2429 type = ARDOUR::AudioUnit;
2430 } else if (prop->value() == X_("luaproc")) {
2433 error << string_compose (_("unknown plugin type %1 in plugin insert state"),
2439 prop = node.property ("unique-id");
2442 #ifdef WINDOWS_VST_SUPPORT
2443 /* older sessions contain VST plugins with only an "id" field. */
2444 if (type == ARDOUR::Windows_VST) {
2445 prop = node.property ("id");
2449 #ifdef LXVST_SUPPORT
2450 /*There shouldn't be any older sessions with linuxVST support.. but anyway..*/
2451 if (type == ARDOUR::LXVST) {
2452 prop = node.property ("id");
2459 error << _("Plugin has no unique ID field") << endmsg;
2464 boost::shared_ptr<Plugin> plugin = find_plugin (_session, prop->value(), type);
2466 /* treat VST plugins equivalent if they have the same uniqueID
2467 * allow to move sessions windows <> linux */
2468 #ifdef LXVST_SUPPORT
2469 if (plugin == 0 && (type == ARDOUR::Windows_VST || type == ARDOUR::MacVST)) {
2470 type = ARDOUR::LXVST;
2471 plugin = find_plugin (_session, prop->value(), type);
2475 #ifdef WINDOWS_VST_SUPPORT
2476 if (plugin == 0 && (type == ARDOUR::LXVST || type == ARDOUR::MacVST)) {
2477 type = ARDOUR::Windows_VST;
2478 plugin = find_plugin (_session, prop->value(), type);
2482 #ifdef MACVST_SUPPORT
2483 if (plugin == 0 && (type == ARDOUR::Windows_VST || type == ARDOUR::LXVST)) {
2484 type = ARDOUR::MacVST;
2485 plugin = find_plugin (_session, prop->value(), type);
2489 if (plugin == 0 && type == ARDOUR::Lua) {
2490 /* unique ID (sha1 of script) was not found,
2491 * load the plugin from the serialized version in the
2492 * session-file instead.
2494 boost::shared_ptr<LuaProc> lp (new LuaProc (_session.engine(), _session, ""));
2495 XMLNode *ls = node.child (lp->state_node_name().c_str());
2497 lp->set_script_from_state (*ls);
2503 error << string_compose(
2504 _("Found a reference to a plugin (\"%1\") that is unknown.\n"
2505 "Perhaps it was removed or moved since it was last used."),
2511 // The name of the PluginInsert comes from the plugin, nothing else
2512 _name = plugin->get_info()->name;
2516 // Processor::set_state() will set this, but too late
2517 // for it to be available when setting up plugin
2518 // state. We can't call Processor::set_state() until
2519 // the plugins themselves are created and added.
2523 if (_plugins.empty()) {
2524 /* if we are adding the first plugin, we will need to set
2525 up automatable controls.
2527 add_plugin (plugin);
2528 create_automatable_parameters ();
2529 set_control_ids (node, version);
2532 if ((prop = node.property ("count")) != 0) {
2533 sscanf (prop->value().c_str(), "%u", &count);
2536 if (_plugins.size() != count) {
2537 for (uint32_t n = 1; n < count; ++n) {
2538 add_plugin (plugin_factory (plugin));
2542 Processor::set_state (node, version);
2544 PBD::ID new_id = this->id();
2545 PBD::ID old_id = this->id();
2547 if ((prop = node.property ("id")) != 0) {
2548 old_id = prop->value ();
2551 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2553 /* find the node with the type-specific node name ("lv2", "ladspa", etc)
2554 and set all plugins to the same state.
2557 if ((*niter)->name() == plugin->state_node_name()) {
2559 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2560 /* Plugin state can include external files which are named after the ID.
2562 * If regenerate_xml_or_string_ids() is set, the ID will already have
2563 * been changed, so we need to use the old ID from the XML to load the
2564 * state and then update the ID.
2566 * When copying a plugin-state, route_ui takes care of of updating the ID,
2567 * but we need to call set_insert_id() to clear the cached plugin-state
2568 * and force a change.
2570 if (!regenerate_xml_or_string_ids ()) {
2571 (*i)->set_insert_id (new_id);
2573 (*i)->set_insert_id (old_id);
2576 (*i)->set_state (**niter, version);
2578 if (regenerate_xml_or_string_ids ()) {
2579 (*i)->set_insert_id (new_id);
2583 /* when copying plugin state, notify UI */
2584 for (Controls::const_iterator li = controls().begin(); li != controls().end(); ++li) {
2585 boost::shared_ptr<PBD::Controllable> c = boost::dynamic_pointer_cast<PBD::Controllable> (li->second);
2587 c->Changed (false, Controllable::NoGroup); /* EMIT SIGNAL */
2595 if (version < 3000) {
2597 /* Only 2.X sessions need a call to set_parameter_state() - in 3.X and above
2598 this is all handled by Automatable
2601 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2602 if ((*niter)->name() == "Redirect") {
2603 /* XXX do we need to tackle placement? i think not (pd; oct 16 2009) */
2604 Processor::set_state (**niter, version);
2609 set_parameter_state_2X (node, version);
2612 if ((prop = node.property (X_("custom"))) != 0) {
2613 _custom_cfg = string_is_affirmative (prop->value());
2616 uint32_t in_maps = 0;
2617 uint32_t out_maps = 0;
2618 XMLNodeList kids = node.children ();
2619 for (XMLNodeIterator i = kids.begin(); i != kids.end(); ++i) {
2620 if ((*i)->name() == X_("ConfiguredInput")) {
2621 _configured_in = ChanCount(**i);
2623 if ((*i)->name() == X_("CustomSinks")) {
2624 _custom_sinks = ChanCount(**i);
2626 if ((*i)->name() == X_("ConfiguredOutput")) {
2627 _custom_out = ChanCount(**i);
2628 _configured_out = ChanCount(**i);
2630 if ((*i)->name() == X_("PresetOutput")) {
2631 _preset_out = ChanCount(**i);
2633 if (strncmp ((*i)->name ().c_str(), X_("InputMap-"), 9) == 0) {
2634 long pc = atol (&((*i)->name().c_str()[9]));
2635 if (pc >= 0 && pc <= (long) get_count()) {
2636 _in_map[pc] = ChanMapping (**i);
2640 if (strncmp ((*i)->name ().c_str(), X_("OutputMap-"), 10) == 0) {
2641 long pc = atol (&((*i)->name().c_str()[10]));
2642 if (pc >= 0 && pc <= (long) get_count()) {
2643 _out_map[pc] = ChanMapping (**i);
2647 if ((*i)->name () == "ThruMap") {
2648 _thru_map = ChanMapping (**i);
2651 // sidechain is a Processor (IO)
2652 if ((*i)->name () == Processor::state_node_name) {
2656 if (!regenerate_xml_or_string_ids ()) {
2657 _sidechain->set_state (**i, version);
2662 if (in_maps == out_maps && out_maps >0 && out_maps == get_count()) {
2663 _maps_from_state = true;
2666 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2670 (*i)->deactivate ();
2674 PluginConfigChanged (); /* EMIT SIGNAL */
2679 PluginInsert::update_id (PBD::ID id)
2682 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2683 (*i)->set_insert_id (id);
2688 PluginInsert::set_owner (SessionObject* o)
2690 Processor::set_owner (o);
2691 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2692 (*i)->set_owner (o);
2697 PluginInsert::set_state_dir (const std::string& d)
2699 // state() only saves the state of the first plugin
2700 _plugins[0]->set_state_dir (d);
2704 PluginInsert::set_parameter_state_2X (const XMLNode& node, int version)
2706 XMLNodeList nlist = node.children();
2707 XMLNodeIterator niter;
2709 /* look for port automation node */
2711 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2713 if ((*niter)->name() != port_automation_node_name) {
2718 XMLProperty const * cprop;
2719 XMLNodeConstIterator iter;
2724 cnodes = (*niter)->children ("port");
2726 for (iter = cnodes.begin(); iter != cnodes.end(); ++iter){
2730 if ((cprop = child->property("number")) != 0) {
2731 port = cprop->value().c_str();
2733 warning << _("PluginInsert: Auto: no ladspa port number") << endmsg;
2737 sscanf (port, "%" PRIu32, &port_id);
2739 if (port_id >= _plugins[0]->parameter_count()) {
2740 warning << _("PluginInsert: Auto: port id out of range") << endmsg;
2744 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(
2745 control(Evoral::Parameter(PluginAutomation, 0, port_id), true));
2747 if (c && c->alist()) {
2748 if (!child->children().empty()) {
2749 c->alist()->set_state (*child->children().front(), version);
2751 /* In some cases 2.X saves lists with min_yval and max_yval
2752 being FLT_MIN and FLT_MAX respectively. This causes problems
2753 in A3 because these min/max values are used to compute
2754 where GUI control points should be drawn. If we see such
2755 values, `correct' them to the min/max of the appropriate
2759 float min_y = c->alist()->get_min_y ();
2760 float max_y = c->alist()->get_max_y ();
2762 ParameterDescriptor desc;
2763 _plugins.front()->get_parameter_descriptor (port_id, desc);
2765 if (min_y == FLT_MIN) {
2769 if (max_y == FLT_MAX) {
2773 c->alist()->set_yrange (min_y, max_y);
2776 error << string_compose (_("PluginInsert: automatable control %1 not found - ignored"), port_id) << endmsg;
2788 PluginInsert::describe_parameter (Evoral::Parameter param)
2790 if (param.type() == PluginAutomation) {
2791 return _plugins[0]->describe_parameter (param);
2792 } else if (param.type() == PluginPropertyAutomation) {
2793 boost::shared_ptr<AutomationControl> c(automation_control(param));
2794 if (c && !c->desc().label.empty()) {
2795 return c->desc().label;
2798 return Automatable::describe_parameter(param);
2802 PluginInsert::signal_latency() const
2804 if (!_pending_active) {
2807 if (_user_latency) {
2808 return _user_latency;
2811 return _plugins[0]->signal_latency ();
2815 PluginInsert::type ()
2817 return plugin()->get_info()->type;
2820 PluginInsert::PluginControl::PluginControl (PluginInsert* p,
2821 const Evoral::Parameter& param,
2822 const ParameterDescriptor& desc,
2823 boost::shared_ptr<AutomationList> list)
2824 : AutomationControl (p->session(), param, desc, list, p->describe_parameter(param))
2828 alist()->reset_default (desc.normal);
2830 list->set_interpolation(Evoral::ControlList::Discrete);
2835 /** @param val `user' value */
2838 PluginInsert::PluginControl::actually_set_value (double user_val, PBD::Controllable::GroupControlDisposition group_override)
2840 /* FIXME: probably should be taking out some lock here.. */
2842 for (Plugins::iterator i = _plugin->_plugins.begin(); i != _plugin->_plugins.end(); ++i) {
2843 (*i)->set_parameter (_list->parameter().id(), user_val);
2846 boost::shared_ptr<Plugin> iasp = _plugin->_impulseAnalysisPlugin.lock();
2848 iasp->set_parameter (_list->parameter().id(), user_val);
2851 AutomationControl::actually_set_value (user_val, group_override);
2855 PluginInsert::PluginControl::catch_up_with_external_value (double user_val)
2857 AutomationControl::actually_set_value (user_val, Controllable::NoGroup);
2861 PluginInsert::PluginControl::get_state ()
2865 XMLNode& node (AutomationControl::get_state());
2866 ss << parameter().id();
2867 node.add_property (X_("parameter"), ss.str());
2869 boost::shared_ptr<LV2Plugin> lv2plugin = boost::dynamic_pointer_cast<LV2Plugin> (_plugin->_plugins[0]);
2871 node.add_property (X_("symbol"), lv2plugin->port_symbol (parameter().id()));
2878 /** @return `user' val */
2880 PluginInsert::PluginControl::get_value () const
2882 boost::shared_ptr<Plugin> plugin = _plugin->plugin (0);
2888 return plugin->get_parameter (_list->parameter().id());
2891 PluginInsert::PluginPropertyControl::PluginPropertyControl (PluginInsert* p,
2892 const Evoral::Parameter& param,
2893 const ParameterDescriptor& desc,
2894 boost::shared_ptr<AutomationList> list)
2895 : AutomationControl (p->session(), param, desc, list)
2899 alist()->set_yrange (desc.lower, desc.upper);
2900 alist()->reset_default (desc.normal);
2905 PluginInsert::PluginPropertyControl::actually_set_value (double user_val, Controllable::GroupControlDisposition gcd)
2907 /* Old numeric set_value(), coerce to appropriate datatype if possible.
2908 This is lossy, but better than nothing until Ardour's automation system
2909 can handle various datatypes all the way down. */
2910 const Variant value(_desc.datatype, user_val);
2911 if (value.type() == Variant::NOTHING) {
2912 error << "set_value(double) called for non-numeric property" << endmsg;
2916 for (Plugins::iterator i = _plugin->_plugins.begin(); i != _plugin->_plugins.end(); ++i) {
2917 (*i)->set_property(_list->parameter().id(), value);
2922 AutomationControl::actually_set_value (user_val, gcd);
2926 PluginInsert::PluginPropertyControl::get_state ()
2930 XMLNode& node (AutomationControl::get_state());
2931 ss << parameter().id();
2932 node.add_property (X_("property"), ss.str());
2933 node.remove_property (X_("value"));
2939 PluginInsert::PluginPropertyControl::get_value () const
2941 return _value.to_double();
2944 boost::shared_ptr<Plugin>
2945 PluginInsert::get_impulse_analysis_plugin()
2947 boost::shared_ptr<Plugin> ret;
2948 if (_impulseAnalysisPlugin.expired()) {
2949 // LV2 in particular uses various _session params
2950 // during init() -- most notably block_size..
2952 ret = plugin_factory(_plugins[0]);
2953 ChanCount out (internal_output_streams ());
2954 if (ret->get_info ()->reconfigurable_io ()) {
2955 // populate get_info ()->n_inputs and ->n_outputs
2957 ret->can_support_io_configuration (internal_input_streams (), out, &useins);
2958 assert (out == internal_output_streams ());
2960 ret->configure_io (internal_input_streams (), out);
2961 _impulseAnalysisPlugin = ret;
2963 ret = _impulseAnalysisPlugin.lock();
2970 PluginInsert::collect_signal_for_analysis (framecnt_t nframes)
2972 // called from outside the audio thread, so this should be safe
2973 // only do audio as analysis is (currently) only for audio plugins
2974 _signal_analysis_inputs.ensure_buffers (DataType::AUDIO, input_streams().n_audio(), nframes);
2975 _signal_analysis_outputs.ensure_buffers (DataType::AUDIO, output_streams().n_audio(), nframes);
2977 _signal_analysis_collected_nframes = 0;
2978 _signal_analysis_collect_nframes_max = nframes;
2981 /** Add a plugin to our list */
2983 PluginInsert::add_plugin (boost::shared_ptr<Plugin> plugin)
2985 plugin->set_insert_id (this->id());
2986 plugin->set_owner (_owner);
2988 if (_plugins.empty()) {
2989 /* first (and probably only) plugin instance - connect to relevant signals */
2991 plugin->ParameterChangedExternally.connect_same_thread (*this, boost::bind (&PluginInsert::parameter_changed_externally, this, _1, _2));
2992 plugin->StartTouch.connect_same_thread (*this, boost::bind (&PluginInsert::start_touch, this, _1));
2993 plugin->EndTouch.connect_same_thread (*this, boost::bind (&PluginInsert::end_touch, this, _1));
2994 _custom_sinks = plugin->get_info()->n_inputs;
2995 // cache sidechain port count
2996 _cached_sidechain_pins.reset ();
2997 const ChanCount& nis (plugin->get_info()->n_inputs);
2998 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2999 for (uint32_t in = 0; in < nis.get (*t); ++in) {
3000 const Plugin::IOPortDescription& iod (plugin->describe_io_port (*t, true, in));
3001 if (iod.is_sidechain) {
3002 _cached_sidechain_pins.set (*t, 1 + _cached_sidechain_pins.n(*t));
3007 #if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT || defined MACVST_SUPPORT)
3008 boost::shared_ptr<VSTPlugin> vst = boost::dynamic_pointer_cast<VSTPlugin> (plugin);
3010 vst->set_insert (this, _plugins.size ());
3014 _plugins.push_back (plugin);
3018 PluginInsert::load_preset (ARDOUR::Plugin::PresetRecord pr)
3021 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
3022 if (! (*i)->load_preset (pr)) {
3030 PluginInsert::realtime_handle_transport_stopped ()
3032 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
3033 (*i)->realtime_handle_transport_stopped ();
3038 PluginInsert::realtime_locate ()
3040 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
3041 (*i)->realtime_locate ();
3046 PluginInsert::monitoring_changed ()
3048 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
3049 (*i)->monitoring_changed ();
3054 PluginInsert::latency_changed ()
3056 // this is called in RT context, LatencyChanged is emitted after run()
3057 _latency_changed = true;
3058 // XXX This also needs a proper API not an owner() hack.
3060 static_cast<Route*>(owner ())->processor_latency_changed (); /* EMIT SIGNAL */
3064 PluginInsert::start_touch (uint32_t param_id)
3066 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id));
3068 // ToDo subtract _plugin_signal_latency from audible_frame() when rolling, assert > 0
3069 ac->start_touch (session().audible_frame());
3074 PluginInsert::end_touch (uint32_t param_id)
3076 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id));
3078 // ToDo subtract _plugin_signal_latency from audible_frame() when rolling, assert > 0
3079 ac->stop_touch (true, session().audible_frame());
3083 std::ostream& operator<<(std::ostream& o, const ARDOUR::PluginInsert::Match& m)
3086 case PluginInsert::Impossible: o << "Impossible"; break;
3087 case PluginInsert::Delegate: o << "Delegate"; break;
3088 case PluginInsert::NoInputs: o << "NoInputs"; break;
3089 case PluginInsert::ExactMatch: o << "ExactMatch"; break;
3090 case PluginInsert::Replicate: o << "Replicate"; break;
3091 case PluginInsert::Split: o << "Split"; break;
3092 case PluginInsert::Hide: o << "Hide"; break;
3094 o << " cnt: " << m.plugins
3095 << (m.strict_io ? " strict-io" : "")
3096 << (m.custom_cfg ? " custom-cfg" : "");
3097 if (m.method == PluginInsert::Hide) {
3098 o << " hide: " << m.hide;