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 ()) {
433 if (!is_instrument ()) {
440 PluginInsert::create_automatable_parameters ()
442 assert (!_plugins.empty());
444 boost::shared_ptr<Plugin> plugin = _plugins.front();
445 set<Evoral::Parameter> a = _plugins.front()->automatable ();
447 for (uint32_t i = 0; i < plugin->parameter_count(); ++i) {
448 if (!plugin->parameter_is_control (i) || !plugin->parameter_is_input (i)) {
451 Evoral::Parameter param (PluginAutomation, 0, i);
453 ParameterDescriptor desc;
454 plugin->get_parameter_descriptor(i, desc);
456 const bool automatable = a.find(param) != a.end();
459 can_automate (param);
461 boost::shared_ptr<AutomationList> list(new AutomationList(param, desc));
462 boost::shared_ptr<AutomationControl> c (new PluginControl(this, param, desc, list));
464 c->set_flags (Controllable::Flag ((int)c->flags() | Controllable::NotAutomatable));
467 plugin->set_automation_control (i, c);
471 const Plugin::PropertyDescriptors& pdl (plugin->get_supported_properties ());
472 for (Plugin::PropertyDescriptors::const_iterator p = pdl.begin(); p != pdl.end(); ++p) {
473 Evoral::Parameter param (PluginPropertyAutomation, 0, p->first);
474 const ParameterDescriptor& desc = plugin->get_property_descriptor(param.id());
475 if (desc.datatype != Variant::NOTHING) {
476 boost::shared_ptr<AutomationList> list;
477 if (Variant::type_is_numeric(desc.datatype)) {
478 list = boost::shared_ptr<AutomationList>(new AutomationList(param, desc));
480 add_control (boost::shared_ptr<AutomationControl> (new PluginPropertyControl(this, param, desc, list)));
484 _bypass_port = plugin->designated_bypass_port ();
486 if (_bypass_port != UINT32_MAX) {
487 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, _bypass_port));
488 if (0 == (ac->flags () & Controllable::NotAutomatable)) {
489 ac->alist()->automation_state_changed.connect_same_thread (*this, boost::bind (&PluginInsert::bypassable_changed, this));
490 ac->Changed.connect_same_thread (*this, boost::bind (&PluginInsert::enable_changed, this));
493 plugin->PresetPortSetValue.connect_same_thread (*this, boost::bind (&PluginInsert::preset_load_set_value, this, _1, _2));
496 /** Called when something outside of this host has modified a plugin
497 * parameter. Responsible for propagating the change to two places:
499 * 1) anything listening to the Control itself
500 * 2) any replicated plugins that make up this PluginInsert.
502 * The PluginInsert is connected to the ParameterChangedExternally signal for
503 * the first (primary) plugin, and here broadcasts that change to any others.
505 * XXX We should probably drop this whole replication idea (Paul, October 2015)
506 * since it isn't used by sensible plugin APIs (AU, LV2).
509 PluginInsert::parameter_changed_externally (uint32_t which, float val)
511 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, which));
513 /* First propagation: alter the underlying value of the control,
514 * without telling the plugin(s) that own/use it to set it.
521 boost::shared_ptr<PluginControl> pc = boost::dynamic_pointer_cast<PluginControl> (ac);
524 pc->catch_up_with_external_value (val);
527 /* Second propagation: tell all plugins except the first to
528 update the value of this parameter. For sane plugin APIs,
529 there are no other plugins, so this is a no-op in those
533 Plugins::iterator i = _plugins.begin();
535 /* don't set the first plugin, just all the slaves */
537 if (i != _plugins.end()) {
539 for (; i != _plugins.end(); ++i) {
540 (*i)->set_parameter (which, val);
546 PluginInsert::set_block_size (pframes_t nframes)
549 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
550 if ((*i)->set_block_size (nframes) != 0) {
558 PluginInsert::activate ()
560 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
564 Processor::activate ();
565 /* when setting state e.g ProcessorBox::paste_processor_state ()
566 * the plugin is not yet owned by a route.
567 * but no matter. Route::add_processors() will call activate () again
572 if (_plugin_signal_latency != signal_latency ()) {
573 _plugin_signal_latency = signal_latency ();
579 PluginInsert::deactivate ()
581 Processor::deactivate ();
583 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
586 if (_plugin_signal_latency != signal_latency ()) {
587 _plugin_signal_latency = signal_latency ();
593 PluginInsert::flush ()
595 for (vector<boost::shared_ptr<Plugin> >::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
601 PluginInsert::enable (bool yn)
603 if (_bypass_port == UINT32_MAX) {
610 if (!_pending_active) {
613 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, _bypass_port));
614 ac->set_value (yn ? 1.0 : 0.0, Controllable::NoGroup);
620 PluginInsert::enabled () const
622 if (_bypass_port == UINT32_MAX) {
623 return Processor::enabled ();
625 boost::shared_ptr<const AutomationControl> ac = boost::const_pointer_cast<AutomationControl> (automation_control (Evoral::Parameter (PluginAutomation, 0, _bypass_port)));
626 return (ac->get_value () > 0 && _pending_active);
631 PluginInsert::bypassable () const
633 if (_bypass_port == UINT32_MAX) {
636 boost::shared_ptr<const AutomationControl> ac = boost::const_pointer_cast<AutomationControl> (automation_control (Evoral::Parameter (PluginAutomation, 0, _bypass_port)));
638 return !ac->automation_playback ();
643 PluginInsert::enable_changed ()
649 PluginInsert::bypassable_changed ()
651 BypassableChanged ();
655 PluginInsert::preset_load_set_value (uint32_t p, float v)
657 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, p));
662 if (ac->automation_state() & Play) {
667 ac->set_value (v, Controllable::NoGroup);
672 PluginInsert::inplace_silence_unconnected (BufferSet& bufs, const PinMappings& out_map, framecnt_t nframes, framecnt_t offset) const
674 // TODO optimize: store "unconnected" in a fixed set.
675 // it only changes on reconfiguration.
676 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
677 for (uint32_t out = 0; out < bufs.count().get (*t); ++out) {
679 if (*t == DataType::MIDI && out == 0 && has_midi_bypass ()) {
680 mapped = true; // in-place Midi bypass
682 for (uint32_t pc = 0; pc < get_count() && !mapped; ++pc) {
683 PinMappings::const_iterator i = out_map.find (pc);
684 if (i == out_map.end ()) {
687 const ChanMapping& outmap (i->second);
688 for (uint32_t o = 0; o < natural_output_streams().get (*t); ++o) {
690 uint32_t idx = outmap.get (*t, o, &valid);
691 if (valid && idx == out) {
698 bufs.get (*t, out).silence (nframes, offset);
705 PluginInsert::connect_and_run (BufferSet& bufs, framepos_t start, framepos_t end, double speed, pframes_t nframes, framecnt_t offset, bool with_auto)
707 // TODO: atomically copy maps & _no_inplace
708 PinMappings in_map (_in_map);
709 PinMappings out_map (_out_map);
710 ChanMapping thru_map (_thru_map);
711 if (_mapping_changed) { // ToDo use a counters, increment until match.
712 _no_inplace = check_inplace ();
713 _mapping_changed = false;
716 if (_latency_changed) {
717 /* delaylines are configured with the max possible latency (as reported by the plugin)
718 * so this won't allocate memory (unless the plugin lied about its max latency)
719 * It may still 'click' though, since the fixed delaylines are not de-clicked.
720 * Then again plugin-latency changes are not click-free to begin with.
722 * This is also worst case, there is currently no concept of per-stream latency.
724 * e.g. Two identical latent plugins:
725 * 1st plugin: process left (latent), bypass right.
726 * 2nd plugin: bypass left, process right (latent).
727 * -> currently this yields 2 times latency of the plugin,
729 _latency_changed = false;
730 _delaybuffers.set (ChanCount::max(bufs.count(), _configured_out), plugin_latency ());
733 if (_match.method == Split && !_no_inplace) {
734 // TODO: also use this optimization if one source-buffer
735 // feeds _all_ *connected* inputs.
736 // currently this is *first* buffer to all only --
737 // see PluginInsert::check_inplace
738 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
739 if (_configured_internal.get (*t) == 0) {
743 uint32_t first_idx = in_map[0].get (*t, 0, &valid);
744 assert (valid && first_idx == 0); // check_inplace ensures this
745 /* copy the first stream's buffer contents to the others */
746 for (uint32_t i = 1; i < natural_input_streams ().get (*t); ++i) {
747 uint32_t idx = in_map[0].get (*t, i, &valid);
750 bufs.get (*t, i).read_from (bufs.get (*t, first_idx), nframes, offset, offset);
754 /* the copy operation produces a linear monotonic input map */
755 in_map[0] = ChanMapping (natural_input_streams ());
758 bufs.set_count(ChanCount::max(bufs.count(), _configured_internal));
759 bufs.set_count(ChanCount::max(bufs.count(), _configured_out));
765 for (Controls::iterator li = controls().begin(); li != controls().end(); ++li, ++n) {
767 boost::shared_ptr<AutomationControl> c
768 = boost::dynamic_pointer_cast<AutomationControl>(li->second);
770 if (c->list() && c->automation_playback()) {
773 const float val = c->list()->rt_safe_eval (start, valid);
776 /* This is the ONLY place where we are
778 * AutomationControl::set_value_unchecked(). We
779 * know that the control is in
780 * automation playback mode, so no
781 * check on writable() is required
782 * (which must be done in AutomationControl::set_value()
785 c->set_value_unchecked(val);
792 /* Calculate if, and how many frames we need to collect for analysis */
793 framecnt_t collect_signal_nframes = (_signal_analysis_collect_nframes_max -
794 _signal_analysis_collected_nframes);
795 if (nframes < collect_signal_nframes) { // we might not get all frames now
796 collect_signal_nframes = nframes;
799 if (collect_signal_nframes > 0) {
801 //std::cerr << "collect input, bufs " << bufs.count().n_audio() << " count, " << bufs.available().n_audio() << " available" << std::endl;
802 //std::cerr << " streams " << internal_input_streams().n_audio() << std::endl;
803 //std::cerr << "filling buffer with " << collect_signal_nframes << " frames at " << _signal_analysis_collected_nframes << std::endl;
805 _signal_analysis_inputs.set_count(input_streams());
807 for (uint32_t i = 0; i < input_streams().n_audio(); ++i) {
808 _signal_analysis_inputs.get_audio(i).read_from (
810 collect_signal_nframes,
811 _signal_analysis_collected_nframes); // offset is for target buffer
816 if (is_channelstrip ()) {
817 if (_configured_in.n_audio() > 0) {
818 ChanMapping mb_in_map (ChanCount::min (_configured_in, ChanCount (DataType::AUDIO, 2)));
819 ChanMapping mb_out_map (ChanCount::min (_configured_out, ChanCount (DataType::AUDIO, 2)));
821 _plugins.front()->connect_and_run (bufs, start, end, speed, mb_in_map, mb_out_map, nframes, offset);
823 for (uint32_t out = _configured_in.n_audio (); out < bufs.count().get (DataType::AUDIO); ++out) {
824 bufs.get (DataType::AUDIO, out).silence (nframes, offset);
830 // TODO optimize -- build maps once.
832 BufferSet& inplace_bufs = _session.get_noinplace_buffers();
833 ARDOUR::ChanMapping used_outputs;
835 assert (inplace_bufs.count () >= natural_input_streams () + _configured_out);
837 /* build used-output map */
838 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
839 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
840 for (uint32_t out = 0; out < natural_output_streams().get (*t); ++out) {
842 uint32_t out_idx = out_map[pc].get (*t, out, &valid);
844 used_outputs.set (*t, out_idx, 1); // mark as used
849 /* copy thru data to outputs before processing in-place */
850 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
851 for (uint32_t out = 0; out < bufs.count().get (*t); ++out) {
853 uint32_t in_idx = thru_map.get (*t, out, &valid);
854 uint32_t m = out + natural_input_streams ().get (*t);
856 _delaybuffers.delay (*t, out, inplace_bufs.get (*t, m), bufs.get (*t, in_idx), nframes, offset, offset);
857 used_outputs.set (*t, out, 1); // mark as used
859 used_outputs.get (*t, out, &valid);
861 /* the plugin is expected to write here, but may not :(
862 * (e.g. drumgizmo w/o kit loaded)
864 inplace_bufs.get (*t, m).silence (nframes);
871 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
873 ARDOUR::ChanMapping i_in_map (natural_input_streams());
874 ARDOUR::ChanMapping i_out_map (out_map[pc]);
875 ARDOUR::ChanCount mapped;
877 /* map inputs sequentially */
878 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
879 for (uint32_t in = 0; in < natural_input_streams().get (*t); ++in) {
881 uint32_t in_idx = in_map[pc].get (*t, in, &valid);
882 uint32_t m = mapped.get (*t);
884 inplace_bufs.get (*t, m).read_from (bufs.get (*t, in_idx), nframes, offset, offset);
886 inplace_bufs.get (*t, m).silence (nframes, offset);
888 mapped.set (*t, m + 1);
892 /* outputs are mapped to inplace_bufs after the inputs */
893 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
894 i_out_map.offset_to (*t, natural_input_streams ().get (*t));
897 if ((*i)->connect_and_run (inplace_bufs, start, end, speed, i_in_map, i_out_map, nframes, offset)) {
902 /* all instances have completed, now copy data that was written
903 * and zero unconnected buffers */
904 ARDOUR::ChanMapping nonzero_out (used_outputs);
905 if (has_midi_bypass ()) {
906 nonzero_out.set (DataType::MIDI, 0, 1); // Midi bypass.
908 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
909 for (uint32_t out = 0; out < bufs.count().get (*t); ++out) {
911 used_outputs.get (*t, out, &valid);
913 nonzero_out.get (*t, out, &valid);
915 bufs.get (*t, out).silence (nframes, offset);
918 uint32_t m = out + natural_input_streams ().get (*t);
919 bufs.get (*t, out).read_from (inplace_bufs.get (*t, m), nframes, offset, offset);
924 /* in-place processing */
926 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
927 if ((*i)->connect_and_run(bufs, start, end, speed, in_map[pc], out_map[pc], nframes, offset)) {
931 // now silence unconnected outputs
932 inplace_silence_unconnected (bufs, _out_map, nframes, offset);
935 if (collect_signal_nframes > 0) {
937 //std::cerr << " output, bufs " << bufs.count().n_audio() << " count, " << bufs.available().n_audio() << " available" << std::endl;
938 //std::cerr << " streams " << internal_output_streams().n_audio() << std::endl;
940 _signal_analysis_outputs.set_count(output_streams());
942 for (uint32_t i = 0; i < output_streams().n_audio(); ++i) {
943 _signal_analysis_outputs.get_audio(i).read_from(
945 collect_signal_nframes,
946 _signal_analysis_collected_nframes); // offset is for target buffer
949 _signal_analysis_collected_nframes += collect_signal_nframes;
950 assert(_signal_analysis_collected_nframes <= _signal_analysis_collect_nframes_max);
952 if (_signal_analysis_collected_nframes == _signal_analysis_collect_nframes_max) {
953 _signal_analysis_collect_nframes_max = 0;
954 _signal_analysis_collected_nframes = 0;
956 AnalysisDataGathered(&_signal_analysis_inputs,
957 &_signal_analysis_outputs);
961 if (_plugin_signal_latency != signal_latency ()) {
962 _plugin_signal_latency = signal_latency ();
968 PluginInsert::bypass (BufferSet& bufs, pframes_t nframes)
970 /* bypass the plugin(s) not the whole processor.
971 * -> use mappings just like connect_and_run
974 // TODO: atomically copy maps & _no_inplace
975 const ChanMapping in_map (no_sc_input_map ());
976 const ChanMapping out_map (output_map ());
977 if (_mapping_changed) {
978 _no_inplace = check_inplace ();
979 _mapping_changed = false;
982 bufs.set_count(ChanCount::max(bufs.count(), _configured_internal));
983 bufs.set_count(ChanCount::max(bufs.count(), _configured_out));
986 ChanMapping thru_map (_thru_map);
988 BufferSet& inplace_bufs = _session.get_noinplace_buffers();
990 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
991 for (uint32_t in = 0; in < _configured_internal.get (*t); ++in) {
992 inplace_bufs.get (*t, in).read_from (bufs.get (*t, in), nframes, 0, 0);
995 ARDOUR::ChanMapping used_outputs;
997 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
998 for (uint32_t out = 0; out < _configured_out.get (*t); ++out) {
1000 uint32_t in_idx = thru_map.get (*t, out, &valid);
1002 bufs.get (*t, out).read_from (inplace_bufs.get (*t, in_idx), nframes, 0, 0);
1003 used_outputs.set (*t, out, 1); // mark as used
1007 // plugin no-op: assume every plugin has an internal identity map
1008 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1009 for (uint32_t out = 0; out < _configured_out.get (*t); ++out) {
1011 uint32_t src_idx = out_map.get_src (*t, out, &valid);
1015 uint32_t in_idx = in_map.get (*t, src_idx, &valid);
1019 bufs.get (*t, out).read_from (inplace_bufs.get (*t, in_idx), nframes, 0, 0);
1020 used_outputs.set (*t, out, 1); // mark as used
1023 // now silence all unused outputs
1024 if (has_midi_bypass ()) {
1025 used_outputs.set (DataType::MIDI, 0, 1); // Midi bypass.
1027 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1028 for (uint32_t out = 0; out < _configured_out.get (*t); ++out) {
1030 used_outputs.get (*t, out, &valid);
1032 bufs.get (*t, out).silence (nframes, 0);
1037 if (_match.method == Split) {
1038 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1039 if (_configured_internal.get (*t) == 0) {
1042 // copy/feeds _all_ *connected* inputs, copy the first buffer
1044 uint32_t first_idx = in_map.get (*t, 0, &valid);
1045 assert (valid && first_idx == 0); // check_inplace ensures this
1046 for (uint32_t i = 1; i < natural_input_streams ().get (*t); ++i) {
1047 uint32_t idx = in_map.get (*t, i, &valid);
1050 bufs.get (*t, i).read_from (bufs.get (*t, first_idx), nframes, 0, 0);
1056 // apply output map and/or monotonic but not identity i/o mappings
1057 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1058 for (uint32_t out = 0; out < _configured_out.get (*t); ++out) {
1060 uint32_t src_idx = out_map.get_src (*t, out, &valid);
1062 bufs.get (*t, out).silence (nframes, 0);
1065 uint32_t in_idx = in_map.get (*t, src_idx, &valid);
1067 bufs.get (*t, out).silence (nframes, 0);
1070 if (in_idx != src_idx) {
1071 bufs.get (*t, out).read_from (bufs.get (*t, in_idx), nframes, 0, 0);
1079 PluginInsert::silence (framecnt_t nframes, framepos_t start_frame)
1085 _delaybuffers.flush ();
1087 ChanMapping in_map (natural_input_streams ());
1088 ChanMapping out_map (natural_output_streams ());
1089 ChanCount maxbuf = ChanCount::max (natural_input_streams (), natural_output_streams());
1091 if (is_channelstrip ()) {
1092 if (_configured_in.n_audio() > 0) {
1093 _plugins.front()->connect_and_run (_session.get_scratch_buffers (maxbuf, true), start_frame, start_frame + nframes, 1.0, in_map, out_map, nframes, 0);
1097 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1098 (*i)->connect_and_run (_session.get_scratch_buffers (maxbuf, true), start_frame, start_frame + nframes, 1.0, in_map, out_map, nframes, 0);
1103 PluginInsert::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, double speed, pframes_t nframes, bool)
1106 // collect sidechain input for complete cycle (!)
1107 // TODO we need delaylines here for latency compensation
1108 _sidechain->run (bufs, start_frame, end_frame, speed, nframes, true);
1111 if (_pending_active) {
1112 /* run as normal if we are active or moving from inactive to active */
1114 if (_session.transport_rolling() || _session.bounce_processing()) {
1115 automation_run (bufs, start_frame, end_frame, speed, nframes);
1117 Glib::Threads::Mutex::Lock lm (control_lock(), Glib::Threads::TRY_LOCK);
1118 connect_and_run (bufs, start_frame, end_frame, speed, nframes, 0, lm.locked());
1122 bypass (bufs, nframes);
1123 _delaybuffers.flush ();
1126 _active = _pending_active;
1128 /* we have no idea whether the plugin generated silence or not, so mark
1129 * all buffers appropriately.
1134 PluginInsert::automation_run (BufferSet& bufs, framepos_t start, framepos_t end, double speed, pframes_t nframes)
1136 Evoral::ControlEvent next_event (0, 0.0f);
1137 framecnt_t offset = 0;
1139 Glib::Threads::Mutex::Lock lm (control_lock(), Glib::Threads::TRY_LOCK);
1142 connect_and_run (bufs, start, end, speed, nframes, offset, false);
1146 if (!find_next_event (start, end, next_event) || _plugins.front()->requires_fixed_sized_buffers()) {
1148 /* no events have a time within the relevant range */
1150 connect_and_run (bufs, start, end, speed, nframes, offset, true);
1156 framecnt_t cnt = min (((framecnt_t) ceil (next_event.when) - start), (framecnt_t) nframes);
1158 connect_and_run (bufs, start, start + cnt, speed, cnt, offset, true); // XXX (start + cnt) * speed
1164 if (!find_next_event (start, end, next_event)) {
1169 /* cleanup anything that is left to do */
1172 connect_and_run (bufs, start, start + nframes, speed, nframes, offset, true);
1177 PluginInsert::default_parameter_value (const Evoral::Parameter& param)
1179 if (param.type() != PluginAutomation)
1182 if (_plugins.empty()) {
1183 fatal << _("programming error: ") << X_("PluginInsert::default_parameter_value() called with no plugin")
1185 abort(); /*NOTREACHED*/
1188 return _plugins[0]->default_value (param.id());
1193 PluginInsert::can_reset_all_parameters ()
1196 uint32_t params = 0;
1197 for (uint32_t par = 0; par < _plugins[0]->parameter_count(); ++par) {
1199 const uint32_t cid = _plugins[0]->nth_parameter (par, ok);
1201 if (!ok || !_plugins[0]->parameter_is_input(cid)) {
1205 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, cid));
1211 if (ac->automation_state() & Play) {
1216 return all && (params > 0);
1220 PluginInsert::reset_parameters_to_default ()
1224 for (uint32_t par = 0; par < _plugins[0]->parameter_count(); ++par) {
1226 const uint32_t cid = _plugins[0]->nth_parameter (par, ok);
1228 if (!ok || !_plugins[0]->parameter_is_input(cid)) {
1232 const float dflt = _plugins[0]->default_value (cid);
1233 const float curr = _plugins[0]->get_parameter (cid);
1239 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, cid));
1244 if (ac->automation_state() & Play) {
1249 ac->set_value (dflt, Controllable::NoGroup);
1254 boost::shared_ptr<Plugin>
1255 PluginInsert::plugin_factory (boost::shared_ptr<Plugin> other)
1257 boost::shared_ptr<LadspaPlugin> lp;
1258 boost::shared_ptr<LuaProc> lua;
1260 boost::shared_ptr<LV2Plugin> lv2p;
1262 #ifdef WINDOWS_VST_SUPPORT
1263 boost::shared_ptr<WindowsVSTPlugin> vp;
1265 #ifdef LXVST_SUPPORT
1266 boost::shared_ptr<LXVSTPlugin> lxvp;
1268 #ifdef MACVST_SUPPORT
1269 boost::shared_ptr<MacVSTPlugin> mvp;
1271 #ifdef AUDIOUNIT_SUPPORT
1272 boost::shared_ptr<AUPlugin> ap;
1275 if ((lp = boost::dynamic_pointer_cast<LadspaPlugin> (other)) != 0) {
1276 return boost::shared_ptr<Plugin> (new LadspaPlugin (*lp));
1277 } else if ((lua = boost::dynamic_pointer_cast<LuaProc> (other)) != 0) {
1278 return boost::shared_ptr<Plugin> (new LuaProc (*lua));
1280 } else if ((lv2p = boost::dynamic_pointer_cast<LV2Plugin> (other)) != 0) {
1281 return boost::shared_ptr<Plugin> (new LV2Plugin (*lv2p));
1283 #ifdef WINDOWS_VST_SUPPORT
1284 } else if ((vp = boost::dynamic_pointer_cast<WindowsVSTPlugin> (other)) != 0) {
1285 return boost::shared_ptr<Plugin> (new WindowsVSTPlugin (*vp));
1287 #ifdef LXVST_SUPPORT
1288 } else if ((lxvp = boost::dynamic_pointer_cast<LXVSTPlugin> (other)) != 0) {
1289 return boost::shared_ptr<Plugin> (new LXVSTPlugin (*lxvp));
1291 #ifdef MACVST_SUPPORT
1292 } else if ((mvp = boost::dynamic_pointer_cast<MacVSTPlugin> (other)) != 0) {
1293 return boost::shared_ptr<Plugin> (new MacVSTPlugin (*mvp));
1295 #ifdef AUDIOUNIT_SUPPORT
1296 } else if ((ap = boost::dynamic_pointer_cast<AUPlugin> (other)) != 0) {
1297 return boost::shared_ptr<Plugin> (new AUPlugin (*ap));
1301 fatal << string_compose (_("programming error: %1"),
1302 X_("unknown plugin type in PluginInsert::plugin_factory"))
1304 abort(); /*NOTREACHED*/
1305 return boost::shared_ptr<Plugin> ((Plugin*) 0);
1309 PluginInsert::set_input_map (uint32_t num, ChanMapping m) {
1310 if (num < _in_map.size()) {
1311 bool changed = _in_map[num] != m;
1313 changed |= sanitize_maps ();
1315 PluginMapChanged (); /* EMIT SIGNAL */
1316 _mapping_changed = true;
1317 _session.set_dirty();
1323 PluginInsert::set_output_map (uint32_t num, ChanMapping m) {
1324 if (num < _out_map.size()) {
1325 bool changed = _out_map[num] != m;
1327 changed |= sanitize_maps ();
1329 PluginMapChanged (); /* EMIT SIGNAL */
1330 _mapping_changed = true;
1331 _session.set_dirty();
1337 PluginInsert::set_thru_map (ChanMapping m) {
1338 bool changed = _thru_map != m;
1340 changed |= sanitize_maps ();
1342 PluginMapChanged (); /* EMIT SIGNAL */
1343 _mapping_changed = true;
1344 _session.set_dirty();
1349 PluginInsert::pre_seed (const ChanCount& in, const ChanCount& out,
1350 const ChanMapping& im, const ChanMapping& om, const ChanMapping& tm)
1352 if (_configured) { return false; }
1353 _configured_in = in;
1354 _configured_out = out;
1358 _maps_from_state = in.n_total () > 0 && out.n_total () > 0;
1363 PluginInsert::input_map () const
1367 for (PinMappings::const_iterator i = _in_map.begin (); i != _in_map.end (); ++i, ++pc) {
1368 ChanMapping m (i->second);
1369 const ChanMapping::Mappings& mp ((*i).second.mappings());
1370 for (ChanMapping::Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
1371 for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
1372 rv.set (tm->first, i->first + pc * natural_input_streams().get(tm->first), i->second);
1381 PluginInsert::no_sc_input_map () const
1385 for (PinMappings::const_iterator i = _in_map.begin (); i != _in_map.end (); ++i, ++pc) {
1386 ChanMapping m (i->second);
1387 const ChanMapping::Mappings& mp ((*i).second.mappings());
1388 for (ChanMapping::Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
1389 uint32_t ins = natural_input_streams().get(tm->first) - _cached_sidechain_pins.get(tm->first);
1390 for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
1391 if (i->first < ins) {
1392 rv.set (tm->first, i->first + pc * ins, i->second);
1401 PluginInsert::output_map () const
1405 for (PinMappings::const_iterator i = _out_map.begin (); i != _out_map.end (); ++i, ++pc) {
1406 ChanMapping m (i->second);
1407 const ChanMapping::Mappings& mp ((*i).second.mappings());
1408 for (ChanMapping::Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
1409 for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
1410 rv.set (tm->first, i->first + pc * natural_output_streams().get(tm->first), i->second);
1414 if (has_midi_bypass ()) {
1415 rv.set (DataType::MIDI, 0, 0);
1422 PluginInsert::has_midi_bypass () const
1424 if (_configured_in.n_midi () == 1 && _configured_out.n_midi () == 1
1425 && natural_output_streams ().n_midi () == 0) {
1432 PluginInsert::has_midi_thru () const
1434 if (_configured_in.n_midi () == 1 && _configured_out.n_midi () == 1
1435 && natural_input_streams ().n_midi () == 0 && natural_output_streams ().n_midi () == 0) {
1443 PluginInsert::is_channelstrip () const {
1444 return _plugins.front()->is_channelstrip();
1449 PluginInsert::check_inplace ()
1451 bool inplace_ok = !_plugins.front()->inplace_broken ();
1453 if (_thru_map.n_total () > 0) {
1454 // TODO once midi-bypass is part of the mapping, ignore it
1458 if (_match.method == Split && inplace_ok) {
1459 assert (get_count() == 1);
1460 assert (_in_map.size () == 1);
1461 if (!_out_map[0].is_monotonic ()) {
1464 if (_configured_internal != _configured_in) {
1465 /* no sidechain -- TODO we could allow this with
1466 * some more logic in PluginInsert::connect_and_run().
1468 * PluginInsert::reset_map() already maps it.
1473 for (DataType::iterator t = DataType::begin(); t != DataType::end() && inplace_ok; ++t) {
1474 if (_configured_internal.get (*t) == 0) {
1478 uint32_t first_idx = _in_map[0].get (*t, 0, &valid);
1479 if (!valid || first_idx != 0) {
1480 // so far only allow to copy the *first* stream's buffer to others
1483 for (uint32_t i = 1; i < natural_input_streams ().get (*t); ++i) {
1484 uint32_t idx = _in_map[0].get (*t, i, &valid);
1485 if (valid && idx != first_idx) {
1494 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: In Place Split Map\n", name()));
1499 for (uint32_t pc = 0; pc < get_count() && inplace_ok ; ++pc) {
1500 if (!_in_map[pc].is_monotonic ()) {
1503 if (!_out_map[pc].is_monotonic ()) {
1509 /* check if every output is fed by the corresponding input
1511 * this prevents in-port 1 -> sink-pin 2 || source-pin 1 -> out port 1, source-pin 2 -> out port 2
1512 * (with in-place, source-pin 1 -> out port 1 overwrites in-port 1)
1514 * but allows in-port 1 -> sink-pin 2 || source-pin 2 -> out port 1
1516 ChanMapping in_map (input_map ());
1517 const ChanMapping::Mappings out_m (output_map ().mappings ());
1518 for (ChanMapping::Mappings::const_iterator t = out_m.begin (); t != out_m.end () && inplace_ok; ++t) {
1519 for (ChanMapping::TypeMapping::const_iterator c = (*t).second.begin (); c != (*t).second.end () ; ++c) {
1520 /* src-pin: c->first, out-port: c->second */
1522 uint32_t in_port = in_map.get (t->first, c->first, &valid);
1523 if (valid && in_port != c->second) {
1531 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: %2\n", name(), inplace_ok ? "In-Place" : "No Inplace Processing"));
1532 return !inplace_ok; // no-inplace
1536 PluginInsert::sanitize_maps ()
1538 bool changed = false;
1539 /* strip dead wood */
1540 PinMappings new_ins;
1541 PinMappings new_outs;
1542 ChanMapping new_thru;
1544 for (uint32_t pc = 0; pc < get_count(); ++pc) {
1546 ChanMapping new_out;
1547 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1548 for (uint32_t i = 0; i < natural_input_streams().get (*t); ++i) {
1550 uint32_t idx = _in_map[pc].get (*t, i, &valid);
1551 if (valid && idx < _configured_internal.get (*t)) {
1552 new_in.set (*t, i, idx);
1555 for (uint32_t o = 0; o < natural_output_streams().get (*t); ++o) {
1557 uint32_t idx = _out_map[pc].get (*t, o, &valid);
1558 if (valid && idx < _configured_out.get (*t)) {
1559 new_out.set (*t, o, idx);
1563 if (_in_map[pc] != new_in || _out_map[pc] != new_out) {
1566 new_ins[pc] = new_in;
1567 new_outs[pc] = new_out;
1570 /* prevent dup output assignments */
1571 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1572 for (uint32_t o = 0; o < _configured_out.get (*t); ++o) {
1573 bool mapped = false;
1574 for (uint32_t pc = 0; pc < get_count(); ++pc) {
1576 uint32_t idx = new_outs[pc].get_src (*t, o, &valid);
1577 if (valid && mapped) {
1578 new_outs[pc].unset (*t, idx);
1586 /* remove excess thru */
1587 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1588 for (uint32_t o = 0; o < _configured_out.get (*t); ++o) {
1590 uint32_t idx = _thru_map.get (*t, o, &valid);
1591 if (valid && idx < _configured_internal.get (*t)) {
1592 new_thru.set (*t, o, idx);
1597 /* prevent out + thru, existing plugin outputs override thru */
1598 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1599 for (uint32_t o = 0; o < _configured_out.get (*t); ++o) {
1600 bool mapped = false;
1602 for (uint32_t pc = 0; pc < get_count(); ++pc) {
1603 new_outs[pc].get_src (*t, o, &mapped);
1604 if (mapped) { break; }
1606 if (!mapped) { continue; }
1607 uint32_t idx = new_thru.get (*t, o, &valid);
1609 new_thru.unset (*t, idx);
1614 if (has_midi_bypass ()) {
1615 // TODO: include midi-bypass in the thru set,
1616 // remove dedicated handling.
1617 new_thru.unset (DataType::MIDI, 0);
1620 if (_in_map != new_ins || _out_map != new_outs || _thru_map != new_thru) {
1624 _out_map = new_outs;
1625 _thru_map = new_thru;
1631 PluginInsert::reset_map (bool emit)
1633 const PinMappings old_in (_in_map);
1634 const PinMappings old_out (_out_map);
1638 _thru_map = ChanMapping ();
1640 /* build input map */
1641 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1642 uint32_t sc = 0; // side-chain round-robin (all instances)
1644 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
1645 const uint32_t nis = natural_input_streams ().get(*t);
1646 const uint32_t stride = nis - sidechain_input_pins().get (*t);
1648 /* SC inputs are last in the plugin-insert.. */
1649 const uint32_t sc_start = _configured_in.get (*t);
1650 const uint32_t sc_len = _configured_internal.get (*t) - sc_start;
1651 /* ...but may not be at the end of the plugin ports.
1652 * in case the side-chain is not the last port, shift connections back.
1653 * and connect to side-chain
1656 uint32_t ic = 0; // split inputs
1657 const uint32_t cend = _configured_in.get (*t);
1659 for (uint32_t in = 0; in < nis; ++in) {
1660 const Plugin::IOPortDescription& iod (_plugins[pc]->describe_io_port (*t, true, in));
1661 if (iod.is_sidechain) {
1662 /* connect sidechain sinks to sidechain inputs in round-robin fashion */
1663 if (sc_len > 0) {// side-chain may be hidden
1664 _in_map[pc].set (*t, in, sc_start + sc);
1665 sc = (sc + 1) % sc_len;
1669 if (_match.method == Split) {
1670 if (cend == 0) { continue; }
1671 if (_strict_io && ic + stride * pc >= cend) {
1674 /* connect *no* sidechain sinks in round-robin fashion */
1675 _in_map[pc].set (*t, in, ic + stride * pc);
1676 if (_strict_io && (ic + 1) == cend) {
1679 ic = (ic + 1) % cend;
1681 uint32_t s = in - shift;
1682 if (stride * pc + s < cend) {
1683 _in_map[pc].set (*t, in, s + stride * pc);
1691 /* build output map */
1693 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
1694 _out_map[pc] = ChanMapping (ChanCount::min (natural_output_streams(), _configured_out));
1695 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1696 _out_map[pc].offset_to(*t, pc * natural_output_streams().get(*t));
1701 if (old_in == _in_map && old_out == _out_map) {
1705 PluginMapChanged (); /* EMIT SIGNAL */
1706 _mapping_changed = true;
1707 _session.set_dirty();
1713 PluginInsert::configure_io (ChanCount in, ChanCount out)
1715 Match old_match = _match;
1717 ChanCount old_internal;
1721 old_pins = natural_input_streams();
1722 old_in = _configured_in;
1723 old_out = _configured_out;
1724 old_internal = _configured_internal;
1726 _configured_in = in;
1727 _configured_internal = in;
1728 _configured_out = out;
1731 /* TODO hide midi-bypass, and custom outs. Best /fake/ "out" here.
1732 * (currently _sidechain->configure_io always succeeds
1733 * since Processor::configure_io() succeeds)
1735 if (!_sidechain->configure_io (in, out)) {
1736 DEBUG_TRACE (DEBUG::ChanMapping, "Sidechain configuration failed\n");
1739 _configured_internal += _sidechain->input()->n_ports();
1741 // include (static_cast<Route*>owner())->name() ??
1742 _sidechain->input ()-> set_pretty_name (string_compose (_("SC %1"), name ()));
1745 /* get plugin configuration */
1746 _match = private_can_support_io_configuration (in, out);
1748 if (DEBUG_ENABLED(DEBUG::ChanMapping)) {
1750 DEBUG_STR_APPEND(a, string_compose ("%1: ", name()));
1751 DEBUG_STR_APPEND(a, _match);
1752 DEBUG_TRACE (DEBUG::ChanMapping, DEBUG_STR(a).str());
1756 /* set the matching method and number of plugins that we will use to meet this configuration */
1757 if (set_count (_match.plugins) == false) {
1758 PluginIoReConfigure (); /* EMIT SIGNAL */
1759 _configured = false;
1763 /* configure plugins */
1764 switch (_match.method) {
1767 if (_plugins.front()->configure_io (natural_input_streams(), out) == false) {
1768 PluginIoReConfigure (); /* EMIT SIGNAL */
1769 _configured = false;
1775 ChanCount din (_configured_internal);
1776 ChanCount dout (din); // hint
1778 if (_custom_sinks.n_total () > 0) {
1779 din = _custom_sinks;
1782 } else if (_preset_out.n_audio () > 0) {
1783 dout.set (DataType::AUDIO, _preset_out.n_audio ());
1784 } else if (dout.n_midi () > 0 && dout.n_audio () == 0) {
1785 dout.set (DataType::AUDIO, 2);
1787 if (out.n_audio () == 0) { out.set (DataType::AUDIO, 1); }
1789 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: Delegate lookup : %2 %3\n", name(), din, dout));
1790 bool const r = _plugins.front()->can_support_io_configuration (din, dout, &useins);
1792 if (useins.n_audio() == 0) {
1795 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: Delegate configuration: %2 %3\n", name(), useins, dout));
1797 if (_plugins.front()->configure_io (useins, dout) == false) {
1798 PluginIoReConfigure (); /* EMIT SIGNAL */
1799 _configured = false;
1803 _custom_sinks = din;
1808 if (_plugins.front()->configure_io (in, out) == false) {
1809 PluginIoReConfigure (); /* EMIT SIGNAL */
1810 _configured = false;
1816 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",
1818 _configured ? "Y" : "N",
1819 _maps_from_state ? "Y" : "N",
1820 old_in == in ? "==" : "!=",
1821 old_out == out ? "==" : "!=",
1822 old_pins == natural_input_streams () ? "==" : "!=",
1823 old_match.method == _match.method ? "==" : "!=",
1824 old_match.custom_cfg == _match.custom_cfg ? "==" : "!=",
1825 _in_map.size() == get_count () ? "==" : "!=",
1826 _out_map.size() == get_count () ? "==" : "!="
1829 bool mapping_changed = false;
1830 if (old_in == in && old_out == out
1832 && old_pins == natural_input_streams ()
1833 && old_match.method == _match.method
1834 && old_match.custom_cfg == _match.custom_cfg
1835 && _in_map.size() == _out_map.size()
1836 && _in_map.size() == get_count ()
1838 /* If the configuration has not changed, keep the mapping */
1839 mapping_changed = sanitize_maps ();
1840 } else if (_match.custom_cfg && _configured) {
1841 /* don't touch the map in manual mode */
1842 mapping_changed = sanitize_maps ();
1845 if (is_channelstrip ()) {
1846 /* fake channel map - for wire display */
1849 _thru_map = ChanMapping ();
1850 _in_map[0] = ChanMapping (ChanCount::min (_configured_in, ChanCount (DataType::AUDIO, 2)));
1851 _out_map[0] = ChanMapping (ChanCount::min (_configured_out, ChanCount (DataType::AUDIO, 2)));
1852 /* set "thru" map for in-place forward of audio */
1853 for (uint32_t i = 2; i < _configured_in.n_audio(); ++i) {
1854 _thru_map.set (DataType::AUDIO, i, i);
1856 /* and midi (after implicit 1st channel bypass) */
1857 for (uint32_t i = 1; i < _configured_in.n_midi(); ++i) {
1858 _thru_map.set (DataType::MIDI, i, i);
1862 if (_maps_from_state && old_in == in && old_out == out) {
1863 mapping_changed = true;
1866 /* generate a new mapping */
1867 mapping_changed = reset_map (false);
1869 _maps_from_state = false;
1872 if (mapping_changed) {
1873 PluginMapChanged (); /* EMIT SIGNAL */
1876 if (DEBUG_ENABLED(DEBUG::ChanMapping)) {
1879 DEBUG_STR_APPEND(a, "\n--------<<--------\n");
1880 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
1882 DEBUG_STR_APPEND(a, "----><----\n");
1884 DEBUG_STR_APPEND(a, string_compose ("Channel Map for %1 plugin %2\n", name(), pc));
1885 DEBUG_STR_APPEND(a, " * Inputs:\n");
1886 DEBUG_STR_APPEND(a, _in_map[pc]);
1887 DEBUG_STR_APPEND(a, " * Outputs:\n");
1888 DEBUG_STR_APPEND(a, _out_map[pc]);
1890 DEBUG_STR_APPEND(a, " * Thru:\n");
1891 DEBUG_STR_APPEND(a, _thru_map);
1892 DEBUG_STR_APPEND(a, "-------->>--------\n");
1893 DEBUG_TRACE (DEBUG::ChanMapping, DEBUG_STR(a).str());
1898 _no_inplace = check_inplace ();
1899 _mapping_changed = false;
1901 /* only the "noinplace_buffers" thread buffers need to be this large,
1902 * this can be optimized. other buffers are fine with
1903 * ChanCount::max (natural_input_streams (), natural_output_streams())
1904 * and route.cc's max (configured_in, configured_out)
1906 * no-inplace copies "thru" outputs (to emulate in-place) for
1907 * all outputs (to prevent overwrite) into a temporary space
1908 * which also holds input buffers (in case the plugin does process
1909 * in-place and overwrites those).
1911 * this buffers need to be at least as
1912 * natural_input_streams () + possible outputs.
1914 * sidechain inputs add a constraint on the input:
1915 * configured input + sidechain (=_configured_internal)
1917 * NB. this also satisfies
1918 * max (natural_input_streams(), natural_output_streams())
1919 * which is needed for silence runs
1921 _required_buffers = ChanCount::max (_configured_internal,
1922 natural_input_streams () + ChanCount::max (_configured_out, natural_output_streams () * get_count ()));
1924 if (old_in != in || old_out != out || old_internal != _configured_internal
1925 || old_pins != natural_input_streams ()
1926 || (old_match.method != _match.method && (old_match.method == Split || _match.method == Split))
1928 PluginIoReConfigure (); /* EMIT SIGNAL */
1931 _delaybuffers.configure (_configured_out, _plugins.front ()->max_latency ());
1932 _latency_changed = true;
1934 // we don't know the analysis window size, so we must work with the
1935 // current buffer size here. each request for data fills in these
1936 // buffers and the analyser makes sure it gets enough data for the
1938 session().ensure_buffer_set (_signal_analysis_inputs, in);
1939 _signal_analysis_inputs.set_count (in);
1941 session().ensure_buffer_set (_signal_analysis_outputs, out);
1942 _signal_analysis_outputs.set_count (out);
1944 // std::cerr << "set counts to i" << in.n_audio() << "/o" << out.n_audio() << std::endl;
1947 return Processor::configure_io (in, out);
1950 /** Decide whether this PluginInsert can support a given IO configuration.
1951 * To do this, we run through a set of possible solutions in rough order of
1954 * @param in Required input channel count.
1955 * @param out Filled in with the output channel count if we return true.
1956 * @return true if the given IO configuration can be supported.
1959 PluginInsert::can_support_io_configuration (const ChanCount& in, ChanCount& out)
1962 _sidechain->can_support_io_configuration (in, out); // never fails, sets "out"
1964 return private_can_support_io_configuration (in, out).method != Impossible;
1968 PluginInsert::private_can_support_io_configuration (ChanCount const& in, ChanCount& out) const
1970 if (!_custom_cfg && _preset_out.n_audio () > 0) {
1971 // preseed hint (for variable i/o)
1972 out.set (DataType::AUDIO, _preset_out.n_audio ());
1975 Match rv = internal_can_support_io_configuration (in, out);
1977 if (!_custom_cfg && _preset_out.n_audio () > 0) {
1978 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: using output preset: %2\n", name(), _preset_out));
1979 out.set (DataType::AUDIO, _preset_out.n_audio ());
1984 /** A private version of can_support_io_configuration which returns the method
1985 * by which the configuration can be matched, rather than just whether or not
1989 PluginInsert::internal_can_support_io_configuration (ChanCount const & inx, ChanCount& out) const
1991 if (_plugins.empty()) {
1996 if (is_channelstrip ()) {
1998 return Match (ExactMatch, 1);
2002 /* if a user specified a custom cfg, so be it. */
2004 PluginInfoPtr info = _plugins.front()->get_info();
2006 if (info->reconfigurable_io()) {
2007 return Match (Delegate, 1, _strict_io, true);
2009 return Match (ExactMatch, get_count(), _strict_io, true);
2013 /* try automatic configuration */
2014 Match m = PluginInsert::automatic_can_support_io_configuration (inx, out);
2016 PluginInfoPtr info = _plugins.front()->get_info();
2017 ChanCount inputs = info->n_inputs;
2018 ChanCount outputs = info->n_outputs;
2020 /* handle case strict-i/o */
2021 if (_strict_io && m.method != Impossible) {
2024 /* special case MIDI instruments */
2025 if (is_instrument ()) {
2026 // output = midi-bypass + at most master-out channels.
2027 ChanCount max_out (DataType::AUDIO, 2); // TODO use master-out
2028 max_out.set (DataType::MIDI, out.get(DataType::MIDI));
2029 out = ChanCount::min (out, max_out);
2030 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: special case strict-i/o instrument\n", name()));
2036 if (inx.n_audio () != out.n_audio ()) { // ignore midi bypass
2037 /* replicate processor to match output count (generators and such)
2038 * at least enough to feed every output port. */
2039 uint32_t f = 1; // at least one. e.g. control data filters, no in, no out.
2040 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2041 uint32_t nout = outputs.get (*t);
2042 if (nout == 0 || inx.get(*t) == 0) { continue; }
2043 f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nout));
2046 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: special case strict-i/o for generator\n", name()));
2047 return Match (Replicate, f, _strict_io);
2058 if (m.method != Impossible) {
2062 ChanCount ns_inputs = inputs - sidechain_input_pins ();
2064 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: resolving 'Impossible' match...\n", name()));
2066 if (info->reconfigurable_io()) {
2069 if (out.n_midi () > 0 && out.n_audio () == 0) { out.set (DataType::AUDIO, 2); }
2070 if (out.n_audio () == 0) { out.set (DataType::AUDIO, 1); }
2071 bool const r = _plugins.front()->can_support_io_configuration (inx + sidechain_input_pins (), out, &useins);
2073 // houston, we have a problem.
2074 return Match (Impossible, 0);
2077 if (inx.n_midi () > 0 && out.n_midi () == 0) { out.set (DataType::MIDI, 1); }
2078 return Match (Delegate, 1, _strict_io);
2081 ChanCount midi_bypass;
2082 if (inx.get(DataType::MIDI) == 1 && outputs.get(DataType::MIDI) == 0) {
2083 midi_bypass.set (DataType::MIDI, 1);
2086 // add at least as many plugins so that output count matches input count (w/o sidechain pins)
2088 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2089 uint32_t nin = ns_inputs.get (*t);
2090 uint32_t nout = outputs.get (*t);
2091 if (nin == 0 || inx.get(*t) == 0) { continue; }
2092 // prefer floor() so the count won't overly increase IFF (nin < nout)
2093 f = max (f, (uint32_t) floor (inx.get(*t) / (float)nout));
2095 if (f > 0 && outputs * f >= _configured_out) {
2096 out = outputs * f + midi_bypass;
2097 return Match (Replicate, f, _strict_io);
2100 // add at least as many plugins needed to connect all inputs (w/o sidechain pins)
2102 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2103 uint32_t nin = ns_inputs.get (*t);
2104 if (nin == 0 || inx.get(*t) == 0) { continue; }
2105 f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nin));
2108 out = outputs * f + midi_bypass;
2109 return Match (Replicate, f, _strict_io);
2112 // add at least as many plugins needed to connect all inputs
2114 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2115 uint32_t nin = inputs.get (*t);
2116 if (nin == 0 || inx.get(*t) == 0) { continue; }
2117 f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nin));
2119 out = outputs * f + midi_bypass;
2120 return Match (Replicate, f, _strict_io);
2123 /* this is the original Ardour 3/4 behavior, mainly for backwards compatibility */
2125 PluginInsert::automatic_can_support_io_configuration (ChanCount const & inx, ChanCount& out) const
2127 if (_plugins.empty()) {
2131 PluginInfoPtr info = _plugins.front()->get_info();
2132 ChanCount in; in += inx;
2133 ChanCount midi_bypass;
2135 if (info->reconfigurable_io()) {
2136 /* Plugin has flexible I/O, so delegate to it
2137 * pre-seed outputs, plugin tries closest match
2140 if (out.n_midi () > 0 && out.n_audio () == 0) { out.set (DataType::AUDIO, 2); }
2141 if (out.n_audio () == 0) { out.set (DataType::AUDIO, 1); }
2142 bool const r = _plugins.front()->can_support_io_configuration (in + sidechain_input_pins (), out);
2144 return Match (Impossible, 0);
2147 if (in.n_midi () > 0 && out.n_midi () == 0) { out.set (DataType::MIDI, 1); }
2148 return Match (Delegate, 1);
2151 ChanCount inputs = info->n_inputs;
2152 ChanCount outputs = info->n_outputs;
2153 ChanCount ns_inputs = inputs - sidechain_input_pins ();
2155 if (in.get(DataType::MIDI) == 1 && outputs.get(DataType::MIDI) == 0) {
2156 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: bypassing midi-data\n", name()));
2157 midi_bypass.set (DataType::MIDI, 1);
2159 if (in.get(DataType::MIDI) == 1 && inputs.get(DataType::MIDI) == 0) {
2160 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: hiding midi-port from plugin\n", name()));
2161 in.set(DataType::MIDI, 0);
2164 // add internally provided sidechain ports
2165 ChanCount insc = in + sidechain_input_ports ();
2167 bool no_inputs = true;
2168 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2169 if (inputs.get (*t) != 0) {
2176 /* no inputs so we can take any input configuration since we throw it away */
2177 out = outputs + midi_bypass;
2178 return Match (NoInputs, 1);
2181 /* Plugin inputs match requested inputs + side-chain-ports exactly */
2182 if (inputs == insc) {
2183 out = outputs + midi_bypass;
2184 return Match (ExactMatch, 1);
2187 /* Plugin inputs matches without side-chain-pins */
2188 if (ns_inputs == in) {
2189 out = outputs + midi_bypass;
2190 return Match (ExactMatch, 1);
2193 /* We may be able to run more than one copy of the plugin within this insert
2194 to cope with the insert having more inputs than the plugin.
2195 We allow replication only for plugins with either zero or 1 inputs and outputs
2196 for every valid data type.
2200 bool can_replicate = true;
2201 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2203 // ignore side-chains
2204 uint32_t nin = ns_inputs.get (*t);
2206 // No inputs of this type
2207 if (nin == 0 && in.get(*t) == 0) {
2211 if (nin != 1 || outputs.get (*t) != 1) {
2212 can_replicate = false;
2216 // Potential factor not set yet
2218 f = in.get(*t) / nin;
2221 // Factor for this type does not match another type, can not replicate
2222 if (f != (in.get(*t) / nin)) {
2223 can_replicate = false;
2228 if (can_replicate && f > 0) {
2229 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2230 out.set (*t, outputs.get(*t) * f);
2233 return Match (Replicate, f);
2236 /* If the processor has exactly one input of a given type, and
2237 the plugin has more, we can feed the single processor input
2238 to some or all of the plugin inputs. This is rather
2239 special-case-y, but the 1-to-many case is by far the
2240 simplest. How do I split thy 2 processor inputs to 3
2241 plugin inputs? Let me count the ways ...
2244 bool can_split = true;
2245 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2247 bool const can_split_type = (in.get (*t) == 1 && ns_inputs.get (*t) > 1);
2248 bool const nothing_to_do_for_type = (in.get (*t) == 0 && inputs.get (*t) == 0);
2250 if (!can_split_type && !nothing_to_do_for_type) {
2256 out = outputs + midi_bypass;
2257 return Match (Split, 1);
2260 /* If the plugin has more inputs than we want, we can `hide' some of them
2261 by feeding them silence.
2264 bool could_hide = false;
2265 bool cannot_hide = false;
2266 ChanCount hide_channels;
2268 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2269 if (inputs.get(*t) > in.get(*t)) {
2270 /* there is potential to hide, since the plugin has more inputs of type t than the insert */
2271 hide_channels.set (*t, inputs.get(*t) - in.get(*t));
2273 } else if (inputs.get(*t) < in.get(*t)) {
2274 /* we definitely cannot hide, since the plugin has fewer inputs of type t than the insert */
2279 if (could_hide && !cannot_hide) {
2280 out = outputs + midi_bypass;
2281 return Match (Hide, 1, false, false, hide_channels);
2284 return Match (Impossible, 0);
2289 PluginInsert::get_state ()
2291 return state (true);
2295 PluginInsert::state (bool full)
2297 XMLNode& node = Processor::state (full);
2299 node.add_property("type", _plugins[0]->state_node_name());
2300 node.add_property("unique-id", _plugins[0]->unique_id());
2301 node.add_property("count", string_compose("%1", _plugins.size()));
2303 /* remember actual i/o configuration (for later placeholder
2304 * in case the plugin goes missing) */
2305 node.add_child_nocopy (* _configured_in.state (X_("ConfiguredInput")));
2306 node.add_child_nocopy (* _custom_sinks.state (X_("CustomSinks")));
2307 node.add_child_nocopy (* _configured_out.state (X_("ConfiguredOutput")));
2308 node.add_child_nocopy (* _preset_out.state (X_("PresetOutput")));
2310 /* save custom i/o config */
2311 node.add_property("custom", _custom_cfg ? "yes" : "no");
2312 for (uint32_t pc = 0; pc < get_count(); ++pc) {
2314 snprintf (tmp, sizeof(tmp), "InputMap-%d", pc);
2315 node.add_child_nocopy (* _in_map[pc].state (tmp));
2316 snprintf (tmp, sizeof(tmp), "OutputMap-%d", pc);
2317 node.add_child_nocopy (* _out_map[pc].state (tmp));
2319 node.add_child_nocopy (* _thru_map.state ("ThruMap"));
2322 node.add_child_nocopy (_sidechain->state (full));
2325 _plugins[0]->set_insert_id(this->id());
2326 node.add_child_nocopy (_plugins[0]->get_state());
2328 for (Controls::iterator c = controls().begin(); c != controls().end(); ++c) {
2329 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> ((*c).second);
2331 node.add_child_nocopy (ac->get_state());
2339 PluginInsert::set_control_ids (const XMLNode& node, int version)
2341 const XMLNodeList& nlist = node.children();
2342 XMLNodeConstIterator iter;
2343 set<Evoral::Parameter>::const_iterator p;
2345 for (iter = nlist.begin(); iter != nlist.end(); ++iter) {
2346 if ((*iter)->name() == Controllable::xml_node_name) {
2347 XMLProperty const * prop;
2349 uint32_t p = (uint32_t)-1;
2351 if ((prop = (*iter)->property (X_("symbol"))) != 0) {
2352 boost::shared_ptr<LV2Plugin> lv2plugin = boost::dynamic_pointer_cast<LV2Plugin> (_plugins[0]);
2354 p = lv2plugin->port_index(prop->value().c_str());
2358 if (p == (uint32_t)-1 && (prop = (*iter)->property (X_("parameter"))) != 0) {
2359 p = atoi (prop->value());
2362 if (p != (uint32_t)-1) {
2364 /* this may create the new controllable */
2366 boost::shared_ptr<Evoral::Control> c = control (Evoral::Parameter (PluginAutomation, 0, p));
2368 #ifndef NO_PLUGIN_STATE
2372 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> (c);
2374 ac->set_state (**iter, version);
2383 PluginInsert::set_state(const XMLNode& node, int version)
2385 XMLNodeList nlist = node.children();
2386 XMLNodeIterator niter;
2387 XMLPropertyList plist;
2388 XMLProperty const * prop;
2389 ARDOUR::PluginType type;
2391 if ((prop = node.property ("type")) == 0) {
2392 error << _("XML node describing plugin is missing the `type' field") << endmsg;
2396 if (prop->value() == X_("ladspa") || prop->value() == X_("Ladspa")) { /* handle old school sessions */
2397 type = ARDOUR::LADSPA;
2398 } else if (prop->value() == X_("lv2")) {
2400 } else if (prop->value() == X_("windows-vst")) {
2401 type = ARDOUR::Windows_VST;
2402 } else if (prop->value() == X_("lxvst")) {
2403 type = ARDOUR::LXVST;
2404 } else if (prop->value() == X_("mac-vst")) {
2405 type = ARDOUR::MacVST;
2406 } else if (prop->value() == X_("audiounit")) {
2407 type = ARDOUR::AudioUnit;
2408 } else if (prop->value() == X_("luaproc")) {
2411 error << string_compose (_("unknown plugin type %1 in plugin insert state"),
2417 prop = node.property ("unique-id");
2420 #ifdef WINDOWS_VST_SUPPORT
2421 /* older sessions contain VST plugins with only an "id" field. */
2422 if (type == ARDOUR::Windows_VST) {
2423 prop = node.property ("id");
2427 #ifdef LXVST_SUPPORT
2428 /*There shouldn't be any older sessions with linuxVST support.. but anyway..*/
2429 if (type == ARDOUR::LXVST) {
2430 prop = node.property ("id");
2437 error << _("Plugin has no unique ID field") << endmsg;
2442 boost::shared_ptr<Plugin> plugin = find_plugin (_session, prop->value(), type);
2444 /* treat VST plugins equivalent if they have the same uniqueID
2445 * allow to move sessions windows <> linux */
2446 #ifdef LXVST_SUPPORT
2447 if (plugin == 0 && (type == ARDOUR::Windows_VST || type == ARDOUR::MacVST)) {
2448 type = ARDOUR::LXVST;
2449 plugin = find_plugin (_session, prop->value(), type);
2453 #ifdef WINDOWS_VST_SUPPORT
2454 if (plugin == 0 && (type == ARDOUR::LXVST || type == ARDOUR::MacVST)) {
2455 type = ARDOUR::Windows_VST;
2456 plugin = find_plugin (_session, prop->value(), type);
2460 #ifdef MACVST_SUPPORT
2461 if (plugin == 0 && (type == ARDOUR::Windows_VST || type == ARDOUR::LXVST)) {
2462 type = ARDOUR::MacVST;
2463 plugin = find_plugin (_session, prop->value(), type);
2467 if (plugin == 0 && type == ARDOUR::Lua) {
2468 /* unique ID (sha1 of script) was not found,
2469 * load the plugin from the serialized version in the
2470 * session-file instead.
2472 boost::shared_ptr<LuaProc> lp (new LuaProc (_session.engine(), _session, ""));
2473 XMLNode *ls = node.child (lp->state_node_name().c_str());
2475 lp->set_script_from_state (*ls);
2481 error << string_compose(
2482 _("Found a reference to a plugin (\"%1\") that is unknown.\n"
2483 "Perhaps it was removed or moved since it was last used."),
2489 // The name of the PluginInsert comes from the plugin, nothing else
2490 _name = plugin->get_info()->name;
2494 // Processor::set_state() will set this, but too late
2495 // for it to be available when setting up plugin
2496 // state. We can't call Processor::set_state() until
2497 // the plugins themselves are created and added.
2501 if (_plugins.empty()) {
2502 /* if we are adding the first plugin, we will need to set
2503 up automatable controls.
2505 add_plugin (plugin);
2506 create_automatable_parameters ();
2507 set_control_ids (node, version);
2510 if ((prop = node.property ("count")) != 0) {
2511 sscanf (prop->value().c_str(), "%u", &count);
2514 if (_plugins.size() != count) {
2515 for (uint32_t n = 1; n < count; ++n) {
2516 add_plugin (plugin_factory (plugin));
2520 Processor::set_state (node, version);
2522 PBD::ID new_id = this->id();
2523 PBD::ID old_id = this->id();
2525 if ((prop = node.property ("id")) != 0) {
2526 old_id = prop->value ();
2529 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2531 /* find the node with the type-specific node name ("lv2", "ladspa", etc)
2532 and set all plugins to the same state.
2535 if ((*niter)->name() == plugin->state_node_name()) {
2537 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2538 /* Plugin state can include external files which are named after the ID.
2540 * If regenerate_xml_or_string_ids() is set, the ID will already have
2541 * been changed, so we need to use the old ID from the XML to load the
2542 * state and then update the ID.
2544 * When copying a plugin-state, route_ui takes care of of updating the ID,
2545 * but we need to call set_insert_id() to clear the cached plugin-state
2546 * and force a change.
2548 if (!regenerate_xml_or_string_ids ()) {
2549 (*i)->set_insert_id (new_id);
2551 (*i)->set_insert_id (old_id);
2554 (*i)->set_state (**niter, version);
2556 if (regenerate_xml_or_string_ids ()) {
2557 (*i)->set_insert_id (new_id);
2565 if (version < 3000) {
2567 /* Only 2.X sessions need a call to set_parameter_state() - in 3.X and above
2568 this is all handled by Automatable
2571 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2572 if ((*niter)->name() == "Redirect") {
2573 /* XXX do we need to tackle placement? i think not (pd; oct 16 2009) */
2574 Processor::set_state (**niter, version);
2579 set_parameter_state_2X (node, version);
2582 if ((prop = node.property (X_("custom"))) != 0) {
2583 _custom_cfg = string_is_affirmative (prop->value());
2586 uint32_t in_maps = 0;
2587 uint32_t out_maps = 0;
2588 XMLNodeList kids = node.children ();
2589 for (XMLNodeIterator i = kids.begin(); i != kids.end(); ++i) {
2590 if ((*i)->name() == X_("ConfiguredInput")) {
2591 _configured_in = ChanCount(**i);
2593 if ((*i)->name() == X_("CustomSinks")) {
2594 _custom_sinks = ChanCount(**i);
2596 if ((*i)->name() == X_("ConfiguredOutput")) {
2597 _custom_out = ChanCount(**i);
2598 _configured_out = ChanCount(**i);
2600 if ((*i)->name() == X_("PresetOutput")) {
2601 _preset_out = ChanCount(**i);
2603 if (strncmp ((*i)->name ().c_str(), X_("InputMap-"), 9) == 0) {
2604 long pc = atol (&((*i)->name().c_str()[9]));
2605 if (pc >= 0 && pc <= (long) get_count()) {
2606 _in_map[pc] = ChanMapping (**i);
2610 if (strncmp ((*i)->name ().c_str(), X_("OutputMap-"), 10) == 0) {
2611 long pc = atol (&((*i)->name().c_str()[10]));
2612 if (pc >= 0 && pc <= (long) get_count()) {
2613 _out_map[pc] = ChanMapping (**i);
2617 if ((*i)->name () == "ThruMap") {
2618 _thru_map = ChanMapping (**i);
2621 // sidechain is a Processor (IO)
2622 if ((*i)->name () == Processor::state_node_name) {
2626 if (!regenerate_xml_or_string_ids ()) {
2627 _sidechain->set_state (**i, version);
2632 if (in_maps == out_maps && out_maps >0 && out_maps == get_count()) {
2633 _maps_from_state = true;
2636 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2640 (*i)->deactivate ();
2644 PluginConfigChanged (); /* EMIT SIGNAL */
2649 PluginInsert::update_id (PBD::ID id)
2652 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2653 (*i)->set_insert_id (id);
2658 PluginInsert::set_owner (SessionObject* o)
2660 Processor::set_owner (o);
2661 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2662 (*i)->set_owner (o);
2667 PluginInsert::set_state_dir (const std::string& d)
2669 // state() only saves the state of the first plugin
2670 _plugins[0]->set_state_dir (d);
2674 PluginInsert::set_parameter_state_2X (const XMLNode& node, int version)
2676 XMLNodeList nlist = node.children();
2677 XMLNodeIterator niter;
2679 /* look for port automation node */
2681 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2683 if ((*niter)->name() != port_automation_node_name) {
2688 XMLProperty const * cprop;
2689 XMLNodeConstIterator iter;
2694 cnodes = (*niter)->children ("port");
2696 for (iter = cnodes.begin(); iter != cnodes.end(); ++iter){
2700 if ((cprop = child->property("number")) != 0) {
2701 port = cprop->value().c_str();
2703 warning << _("PluginInsert: Auto: no ladspa port number") << endmsg;
2707 sscanf (port, "%" PRIu32, &port_id);
2709 if (port_id >= _plugins[0]->parameter_count()) {
2710 warning << _("PluginInsert: Auto: port id out of range") << endmsg;
2714 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(
2715 control(Evoral::Parameter(PluginAutomation, 0, port_id), true));
2717 if (c && c->alist()) {
2718 if (!child->children().empty()) {
2719 c->alist()->set_state (*child->children().front(), version);
2721 /* In some cases 2.X saves lists with min_yval and max_yval
2722 being FLT_MIN and FLT_MAX respectively. This causes problems
2723 in A3 because these min/max values are used to compute
2724 where GUI control points should be drawn. If we see such
2725 values, `correct' them to the min/max of the appropriate
2729 float min_y = c->alist()->get_min_y ();
2730 float max_y = c->alist()->get_max_y ();
2732 ParameterDescriptor desc;
2733 _plugins.front()->get_parameter_descriptor (port_id, desc);
2735 if (min_y == FLT_MIN) {
2739 if (max_y == FLT_MAX) {
2743 c->alist()->set_yrange (min_y, max_y);
2746 error << string_compose (_("PluginInsert: automatable control %1 not found - ignored"), port_id) << endmsg;
2758 PluginInsert::describe_parameter (Evoral::Parameter param)
2760 if (param.type() == PluginAutomation) {
2761 return _plugins[0]->describe_parameter (param);
2762 } else if (param.type() == PluginPropertyAutomation) {
2763 boost::shared_ptr<AutomationControl> c(automation_control(param));
2764 if (c && !c->desc().label.empty()) {
2765 return c->desc().label;
2768 return Automatable::describe_parameter(param);
2772 PluginInsert::signal_latency() const
2774 if (!_pending_active) {
2777 if (_user_latency) {
2778 return _user_latency;
2781 return _plugins[0]->signal_latency ();
2785 PluginInsert::type ()
2787 return plugin()->get_info()->type;
2790 PluginInsert::PluginControl::PluginControl (PluginInsert* p,
2791 const Evoral::Parameter& param,
2792 const ParameterDescriptor& desc,
2793 boost::shared_ptr<AutomationList> list)
2794 : AutomationControl (p->session(), param, desc, list, p->describe_parameter(param))
2798 alist()->reset_default (desc.normal);
2800 list->set_interpolation(Evoral::ControlList::Discrete);
2805 /** @param val `user' value */
2808 PluginInsert::PluginControl::actually_set_value (double user_val, PBD::Controllable::GroupControlDisposition group_override)
2810 /* FIXME: probably should be taking out some lock here.. */
2812 for (Plugins::iterator i = _plugin->_plugins.begin(); i != _plugin->_plugins.end(); ++i) {
2813 (*i)->set_parameter (_list->parameter().id(), user_val);
2816 boost::shared_ptr<Plugin> iasp = _plugin->_impulseAnalysisPlugin.lock();
2818 iasp->set_parameter (_list->parameter().id(), user_val);
2821 AutomationControl::actually_set_value (user_val, group_override);
2825 PluginInsert::PluginControl::catch_up_with_external_value (double user_val)
2827 AutomationControl::actually_set_value (user_val, Controllable::NoGroup);
2831 PluginInsert::PluginControl::get_state ()
2835 XMLNode& node (AutomationControl::get_state());
2836 ss << parameter().id();
2837 node.add_property (X_("parameter"), ss.str());
2839 boost::shared_ptr<LV2Plugin> lv2plugin = boost::dynamic_pointer_cast<LV2Plugin> (_plugin->_plugins[0]);
2841 node.add_property (X_("symbol"), lv2plugin->port_symbol (parameter().id()));
2848 /** @return `user' val */
2850 PluginInsert::PluginControl::get_value () const
2852 boost::shared_ptr<Plugin> plugin = _plugin->plugin (0);
2858 return plugin->get_parameter (_list->parameter().id());
2861 PluginInsert::PluginPropertyControl::PluginPropertyControl (PluginInsert* p,
2862 const Evoral::Parameter& param,
2863 const ParameterDescriptor& desc,
2864 boost::shared_ptr<AutomationList> list)
2865 : AutomationControl (p->session(), param, desc, list)
2869 alist()->set_yrange (desc.lower, desc.upper);
2870 alist()->reset_default (desc.normal);
2875 PluginInsert::PluginPropertyControl::actually_set_value (double user_val, Controllable::GroupControlDisposition gcd)
2877 /* Old numeric set_value(), coerce to appropriate datatype if possible.
2878 This is lossy, but better than nothing until Ardour's automation system
2879 can handle various datatypes all the way down. */
2880 const Variant value(_desc.datatype, user_val);
2881 if (value.type() == Variant::NOTHING) {
2882 error << "set_value(double) called for non-numeric property" << endmsg;
2886 for (Plugins::iterator i = _plugin->_plugins.begin(); i != _plugin->_plugins.end(); ++i) {
2887 (*i)->set_property(_list->parameter().id(), value);
2892 AutomationControl::actually_set_value (user_val, gcd);
2896 PluginInsert::PluginPropertyControl::get_state ()
2900 XMLNode& node (AutomationControl::get_state());
2901 ss << parameter().id();
2902 node.add_property (X_("property"), ss.str());
2903 node.remove_property (X_("value"));
2909 PluginInsert::PluginPropertyControl::get_value () const
2911 return _value.to_double();
2914 boost::shared_ptr<Plugin>
2915 PluginInsert::get_impulse_analysis_plugin()
2917 boost::shared_ptr<Plugin> ret;
2918 if (_impulseAnalysisPlugin.expired()) {
2919 // LV2 in particular uses various _session params
2920 // during init() -- most notably block_size..
2922 ret = plugin_factory(_plugins[0]);
2923 ChanCount out (internal_output_streams ());
2924 if (ret->get_info ()->reconfigurable_io ()) {
2925 // populate get_info ()->n_inputs and ->n_outputs
2927 ret->can_support_io_configuration (internal_input_streams (), out, &useins);
2928 assert (out == internal_output_streams ());
2930 ret->configure_io (internal_input_streams (), out);
2931 _impulseAnalysisPlugin = ret;
2933 ret = _impulseAnalysisPlugin.lock();
2940 PluginInsert::collect_signal_for_analysis (framecnt_t nframes)
2942 // called from outside the audio thread, so this should be safe
2943 // only do audio as analysis is (currently) only for audio plugins
2944 _signal_analysis_inputs.ensure_buffers (DataType::AUDIO, input_streams().n_audio(), nframes);
2945 _signal_analysis_outputs.ensure_buffers (DataType::AUDIO, output_streams().n_audio(), nframes);
2947 _signal_analysis_collected_nframes = 0;
2948 _signal_analysis_collect_nframes_max = nframes;
2951 /** Add a plugin to our list */
2953 PluginInsert::add_plugin (boost::shared_ptr<Plugin> plugin)
2955 plugin->set_insert_id (this->id());
2956 plugin->set_owner (_owner);
2958 if (_plugins.empty()) {
2959 /* first (and probably only) plugin instance - connect to relevant signals */
2961 plugin->ParameterChangedExternally.connect_same_thread (*this, boost::bind (&PluginInsert::parameter_changed_externally, this, _1, _2));
2962 plugin->StartTouch.connect_same_thread (*this, boost::bind (&PluginInsert::start_touch, this, _1));
2963 plugin->EndTouch.connect_same_thread (*this, boost::bind (&PluginInsert::end_touch, this, _1));
2964 _custom_sinks = plugin->get_info()->n_inputs;
2965 // cache sidechain port count
2966 _cached_sidechain_pins.reset ();
2967 const ChanCount& nis (plugin->get_info()->n_inputs);
2968 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2969 for (uint32_t in = 0; in < nis.get (*t); ++in) {
2970 const Plugin::IOPortDescription& iod (plugin->describe_io_port (*t, true, in));
2971 if (iod.is_sidechain) {
2972 _cached_sidechain_pins.set (*t, 1 + _cached_sidechain_pins.n(*t));
2977 #if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT || defined MACVST_SUPPORT)
2978 boost::shared_ptr<VSTPlugin> vst = boost::dynamic_pointer_cast<VSTPlugin> (plugin);
2980 vst->set_insert (this, _plugins.size ());
2984 _plugins.push_back (plugin);
2988 PluginInsert::load_preset (ARDOUR::Plugin::PresetRecord pr)
2991 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2992 if (! (*i)->load_preset (pr)) {
3000 PluginInsert::realtime_handle_transport_stopped ()
3002 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
3003 (*i)->realtime_handle_transport_stopped ();
3008 PluginInsert::realtime_locate ()
3010 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
3011 (*i)->realtime_locate ();
3016 PluginInsert::monitoring_changed ()
3018 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
3019 (*i)->monitoring_changed ();
3024 PluginInsert::latency_changed ()
3026 // this is called in RT context, LatencyChanged is emitted after run()
3027 _latency_changed = true;
3028 // XXX This also needs a proper API not an owner() hack.
3030 static_cast<Route*>(owner ())->processor_latency_changed (); /* EMIT SIGNAL */
3034 PluginInsert::start_touch (uint32_t param_id)
3036 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id));
3038 // ToDo subtract _plugin_signal_latency from audible_frame() when rolling, assert > 0
3039 ac->start_touch (session().audible_frame());
3044 PluginInsert::end_touch (uint32_t param_id)
3046 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id));
3048 // ToDo subtract _plugin_signal_latency from audible_frame() when rolling, assert > 0
3049 ac->stop_touch (true, session().audible_frame());
3053 std::ostream& operator<<(std::ostream& o, const ARDOUR::PluginInsert::Match& m)
3056 case PluginInsert::Impossible: o << "Impossible"; break;
3057 case PluginInsert::Delegate: o << "Delegate"; break;
3058 case PluginInsert::NoInputs: o << "NoInputs"; break;
3059 case PluginInsert::ExactMatch: o << "ExactMatch"; break;
3060 case PluginInsert::Replicate: o << "Replicate"; break;
3061 case PluginInsert::Split: o << "Split"; break;
3062 case PluginInsert::Hide: o << "Hide"; break;
3064 o << " cnt: " << m.plugins
3065 << (m.strict_io ? " strict-io" : "")
3066 << (m.custom_cfg ? " custom-cfg" : "");
3067 if (m.method == PluginInsert::Hide) {
3068 o << " hide: " << m.hide;