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));
494 /** Called when something outside of this host has modified a plugin
495 * parameter. Responsible for propagating the change to two places:
497 * 1) anything listening to the Control itself
498 * 2) any replicated plugins that make up this PluginInsert.
500 * The PluginInsert is connected to the ParameterChangedExternally signal for
501 * the first (primary) plugin, and here broadcasts that change to any others.
503 * XXX We should probably drop this whole replication idea (Paul, October 2015)
504 * since it isn't used by sensible plugin APIs (AU, LV2).
507 PluginInsert::parameter_changed_externally (uint32_t which, float val)
509 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, which));
511 /* First propagation: alter the underlying value of the control,
512 * without telling the plugin(s) that own/use it to set it.
519 boost::shared_ptr<PluginControl> pc = boost::dynamic_pointer_cast<PluginControl> (ac);
522 pc->catch_up_with_external_value (val);
525 /* Second propagation: tell all plugins except the first to
526 update the value of this parameter. For sane plugin APIs,
527 there are no other plugins, so this is a no-op in those
531 Plugins::iterator i = _plugins.begin();
533 /* don't set the first plugin, just all the slaves */
535 if (i != _plugins.end()) {
537 for (; i != _plugins.end(); ++i) {
538 (*i)->set_parameter (which, val);
544 PluginInsert::set_block_size (pframes_t nframes)
547 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
548 if ((*i)->set_block_size (nframes) != 0) {
556 PluginInsert::activate ()
558 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
562 Processor::activate ();
563 /* when setting state e.g ProcessorBox::paste_processor_state ()
564 * the plugin is not yet owned by a route.
565 * but no matter. Route::add_processors() will call activate () again
570 if (_plugin_signal_latency != signal_latency ()) {
571 _plugin_signal_latency = signal_latency ();
577 PluginInsert::deactivate ()
579 Processor::deactivate ();
581 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
584 if (_plugin_signal_latency != signal_latency ()) {
585 _plugin_signal_latency = signal_latency ();
591 PluginInsert::flush ()
593 for (vector<boost::shared_ptr<Plugin> >::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
599 PluginInsert::enable (bool yn)
601 if (_bypass_port == UINT32_MAX) {
608 if (!_pending_active) {
611 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, _bypass_port));
612 ac->set_value (yn ? 1.0 : 0.0, Controllable::NoGroup);
618 PluginInsert::enabled () const
620 if (_bypass_port == UINT32_MAX) {
621 return Processor::enabled ();
623 boost::shared_ptr<const AutomationControl> ac = boost::const_pointer_cast<AutomationControl> (automation_control (Evoral::Parameter (PluginAutomation, 0, _bypass_port)));
624 return (ac->get_value () > 0 && _pending_active);
629 PluginInsert::bypassable () const
631 if (_bypass_port == UINT32_MAX) {
634 boost::shared_ptr<const AutomationControl> ac = boost::const_pointer_cast<AutomationControl> (automation_control (Evoral::Parameter (PluginAutomation, 0, _bypass_port)));
636 return !ac->automation_playback ();
641 PluginInsert::enable_changed ()
647 PluginInsert::bypassable_changed ()
649 BypassableChanged ();
653 PluginInsert::inplace_silence_unconnected (BufferSet& bufs, const PinMappings& out_map, framecnt_t nframes, framecnt_t offset) const
655 // TODO optimize: store "unconnected" in a fixed set.
656 // it only changes on reconfiguration.
657 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
658 for (uint32_t out = 0; out < bufs.count().get (*t); ++out) {
660 if (*t == DataType::MIDI && out == 0 && has_midi_bypass ()) {
661 mapped = true; // in-place Midi bypass
663 for (uint32_t pc = 0; pc < get_count() && !mapped; ++pc) {
664 PinMappings::const_iterator i = out_map.find (pc);
665 if (i == out_map.end ()) {
668 const ChanMapping& outmap (i->second);
669 for (uint32_t o = 0; o < natural_output_streams().get (*t); ++o) {
671 uint32_t idx = outmap.get (*t, o, &valid);
672 if (valid && idx == out) {
679 bufs.get (*t, out).silence (nframes, offset);
686 PluginInsert::connect_and_run (BufferSet& bufs, framepos_t start, framepos_t end, double speed, pframes_t nframes, framecnt_t offset, bool with_auto)
688 // TODO: atomically copy maps & _no_inplace
689 PinMappings in_map (_in_map);
690 PinMappings out_map (_out_map);
691 ChanMapping thru_map (_thru_map);
692 if (_mapping_changed) { // ToDo use a counters, increment until match.
693 _no_inplace = check_inplace ();
694 _mapping_changed = false;
697 if (_latency_changed) {
698 /* delaylines are configured with the max possible latency (as reported by the plugin)
699 * so this won't allocate memory (unless the plugin lied about its max latency)
700 * It may still 'click' though, since the fixed delaylines are not de-clicked.
701 * Then again plugin-latency changes are not click-free to begin with.
703 * This is also worst case, there is currently no concept of per-stream latency.
705 * e.g. Two identical latent plugins:
706 * 1st plugin: process left (latent), bypass right.
707 * 2nd plugin: bypass left, process right (latent).
708 * -> currently this yields 2 times latency of the plugin,
710 _latency_changed = false;
711 _delaybuffers.set (ChanCount::max(bufs.count(), _configured_out), plugin_latency ());
714 if (_match.method == Split && !_no_inplace) {
715 // TODO: also use this optimization if one source-buffer
716 // feeds _all_ *connected* inputs.
717 // currently this is *first* buffer to all only --
718 // see PluginInsert::check_inplace
719 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
720 if (_configured_internal.get (*t) == 0) {
724 uint32_t first_idx = in_map[0].get (*t, 0, &valid);
725 assert (valid && first_idx == 0); // check_inplace ensures this
726 /* copy the first stream's buffer contents to the others */
727 for (uint32_t i = 1; i < natural_input_streams ().get (*t); ++i) {
728 uint32_t idx = in_map[0].get (*t, i, &valid);
731 bufs.get (*t, i).read_from (bufs.get (*t, first_idx), nframes, offset, offset);
735 /* the copy operation produces a linear monotonic input map */
736 in_map[0] = ChanMapping (natural_input_streams ());
739 bufs.set_count(ChanCount::max(bufs.count(), _configured_internal));
740 bufs.set_count(ChanCount::max(bufs.count(), _configured_out));
746 for (Controls::iterator li = controls().begin(); li != controls().end(); ++li, ++n) {
748 boost::shared_ptr<AutomationControl> c
749 = boost::dynamic_pointer_cast<AutomationControl>(li->second);
751 if (c->list() && c->automation_playback()) {
754 const float val = c->list()->rt_safe_eval (start, valid);
757 /* This is the ONLY place where we are
759 * AutomationControl::set_value_unchecked(). We
760 * know that the control is in
761 * automation playback mode, so no
762 * check on writable() is required
763 * (which must be done in AutomationControl::set_value()
766 c->set_value_unchecked(val);
773 /* Calculate if, and how many frames we need to collect for analysis */
774 framecnt_t collect_signal_nframes = (_signal_analysis_collect_nframes_max -
775 _signal_analysis_collected_nframes);
776 if (nframes < collect_signal_nframes) { // we might not get all frames now
777 collect_signal_nframes = nframes;
780 if (collect_signal_nframes > 0) {
782 //std::cerr << "collect input, bufs " << bufs.count().n_audio() << " count, " << bufs.available().n_audio() << " available" << std::endl;
783 //std::cerr << " streams " << internal_input_streams().n_audio() << std::endl;
784 //std::cerr << "filling buffer with " << collect_signal_nframes << " frames at " << _signal_analysis_collected_nframes << std::endl;
786 _signal_analysis_inputs.set_count(input_streams());
788 for (uint32_t i = 0; i < input_streams().n_audio(); ++i) {
789 _signal_analysis_inputs.get_audio(i).read_from (
791 collect_signal_nframes,
792 _signal_analysis_collected_nframes); // offset is for target buffer
797 if (is_channelstrip ()) {
798 if (_configured_in.n_audio() > 0) {
799 ChanMapping mb_in_map (ChanCount::min (_configured_in, ChanCount (DataType::AUDIO, 2)));
800 ChanMapping mb_out_map (ChanCount::min (_configured_out, ChanCount (DataType::AUDIO, 2)));
802 _plugins.front()->connect_and_run (bufs, start, end, speed, mb_in_map, mb_out_map, nframes, offset);
804 for (uint32_t out = _configured_in.n_audio (); out < bufs.count().get (DataType::AUDIO); ++out) {
805 bufs.get (DataType::AUDIO, out).silence (nframes, offset);
811 // TODO optimize -- build maps once.
813 BufferSet& inplace_bufs = _session.get_noinplace_buffers();
814 ARDOUR::ChanMapping used_outputs;
816 assert (inplace_bufs.count () >= natural_input_streams () + _configured_out);
818 /* build used-output map */
819 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
820 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
821 for (uint32_t out = 0; out < natural_output_streams().get (*t); ++out) {
823 uint32_t out_idx = out_map[pc].get (*t, out, &valid);
825 used_outputs.set (*t, out_idx, 1); // mark as used
830 /* copy thru data to outputs before processing in-place */
831 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
832 for (uint32_t out = 0; out < bufs.count().get (*t); ++out) {
834 uint32_t in_idx = thru_map.get (*t, out, &valid);
835 uint32_t m = out + natural_input_streams ().get (*t);
837 _delaybuffers.delay (*t, out, inplace_bufs.get (*t, m), bufs.get (*t, in_idx), nframes, offset, offset);
838 used_outputs.set (*t, out, 1); // mark as used
840 used_outputs.get (*t, out, &valid);
842 /* the plugin is expected to write here, but may not :(
843 * (e.g. drumgizmo w/o kit loaded)
845 inplace_bufs.get (*t, m).silence (nframes);
852 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
854 ARDOUR::ChanMapping i_in_map (natural_input_streams());
855 ARDOUR::ChanMapping i_out_map (out_map[pc]);
856 ARDOUR::ChanCount mapped;
858 /* map inputs sequentially */
859 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
860 for (uint32_t in = 0; in < natural_input_streams().get (*t); ++in) {
862 uint32_t in_idx = in_map[pc].get (*t, in, &valid);
863 uint32_t m = mapped.get (*t);
865 inplace_bufs.get (*t, m).read_from (bufs.get (*t, in_idx), nframes, offset, offset);
867 inplace_bufs.get (*t, m).silence (nframes, offset);
869 mapped.set (*t, m + 1);
873 /* outputs are mapped to inplace_bufs after the inputs */
874 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
875 i_out_map.offset_to (*t, natural_input_streams ().get (*t));
878 if ((*i)->connect_and_run (inplace_bufs, start, end, speed, i_in_map, i_out_map, nframes, offset)) {
883 /* all instances have completed, now copy data that was written
884 * and zero unconnected buffers */
885 ARDOUR::ChanMapping nonzero_out (used_outputs);
886 if (has_midi_bypass ()) {
887 nonzero_out.set (DataType::MIDI, 0, 1); // Midi bypass.
889 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
890 for (uint32_t out = 0; out < bufs.count().get (*t); ++out) {
892 used_outputs.get (*t, out, &valid);
894 nonzero_out.get (*t, out, &valid);
896 bufs.get (*t, out).silence (nframes, offset);
899 uint32_t m = out + natural_input_streams ().get (*t);
900 bufs.get (*t, out).read_from (inplace_bufs.get (*t, m), nframes, offset, offset);
905 /* in-place processing */
907 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
908 if ((*i)->connect_and_run(bufs, start, end, speed, in_map[pc], out_map[pc], nframes, offset)) {
912 // now silence unconnected outputs
913 inplace_silence_unconnected (bufs, _out_map, nframes, offset);
916 if (collect_signal_nframes > 0) {
918 //std::cerr << " output, bufs " << bufs.count().n_audio() << " count, " << bufs.available().n_audio() << " available" << std::endl;
919 //std::cerr << " streams " << internal_output_streams().n_audio() << std::endl;
921 _signal_analysis_outputs.set_count(output_streams());
923 for (uint32_t i = 0; i < output_streams().n_audio(); ++i) {
924 _signal_analysis_outputs.get_audio(i).read_from(
926 collect_signal_nframes,
927 _signal_analysis_collected_nframes); // offset is for target buffer
930 _signal_analysis_collected_nframes += collect_signal_nframes;
931 assert(_signal_analysis_collected_nframes <= _signal_analysis_collect_nframes_max);
933 if (_signal_analysis_collected_nframes == _signal_analysis_collect_nframes_max) {
934 _signal_analysis_collect_nframes_max = 0;
935 _signal_analysis_collected_nframes = 0;
937 AnalysisDataGathered(&_signal_analysis_inputs,
938 &_signal_analysis_outputs);
942 if (_plugin_signal_latency != signal_latency ()) {
943 _plugin_signal_latency = signal_latency ();
949 PluginInsert::bypass (BufferSet& bufs, pframes_t nframes)
951 /* bypass the plugin(s) not the whole processor.
952 * -> use mappings just like connect_and_run
955 // TODO: atomically copy maps & _no_inplace
956 const ChanMapping in_map (no_sc_input_map ());
957 const ChanMapping out_map (output_map ());
958 if (_mapping_changed) {
959 _no_inplace = check_inplace ();
960 _mapping_changed = false;
963 bufs.set_count(ChanCount::max(bufs.count(), _configured_internal));
964 bufs.set_count(ChanCount::max(bufs.count(), _configured_out));
967 ChanMapping thru_map (_thru_map);
969 BufferSet& inplace_bufs = _session.get_noinplace_buffers();
971 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
972 for (uint32_t in = 0; in < _configured_internal.get (*t); ++in) {
973 inplace_bufs.get (*t, in).read_from (bufs.get (*t, in), nframes, 0, 0);
976 ARDOUR::ChanMapping used_outputs;
978 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
979 for (uint32_t out = 0; out < _configured_out.get (*t); ++out) {
981 uint32_t in_idx = thru_map.get (*t, out, &valid);
983 bufs.get (*t, out).read_from (inplace_bufs.get (*t, in_idx), nframes, 0, 0);
984 used_outputs.set (*t, out, 1); // mark as used
988 // plugin no-op: assume every plugin has an internal identity map
989 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
990 for (uint32_t out = 0; out < _configured_out.get (*t); ++out) {
992 uint32_t src_idx = out_map.get_src (*t, out, &valid);
996 uint32_t in_idx = in_map.get (*t, src_idx, &valid);
1000 bufs.get (*t, out).read_from (inplace_bufs.get (*t, in_idx), nframes, 0, 0);
1001 used_outputs.set (*t, out, 1); // mark as used
1004 // now silence all unused outputs
1005 if (has_midi_bypass ()) {
1006 used_outputs.set (DataType::MIDI, 0, 1); // Midi bypass.
1008 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1009 for (uint32_t out = 0; out < _configured_out.get (*t); ++out) {
1011 used_outputs.get (*t, out, &valid);
1013 bufs.get (*t, out).silence (nframes, 0);
1018 if (_match.method == Split) {
1019 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1020 if (_configured_internal.get (*t) == 0) {
1023 // copy/feeds _all_ *connected* inputs, copy the first buffer
1025 uint32_t first_idx = in_map.get (*t, 0, &valid);
1026 assert (valid && first_idx == 0); // check_inplace ensures this
1027 for (uint32_t i = 1; i < natural_input_streams ().get (*t); ++i) {
1028 uint32_t idx = in_map.get (*t, i, &valid);
1031 bufs.get (*t, i).read_from (bufs.get (*t, first_idx), nframes, 0, 0);
1037 // apply output map and/or monotonic but not identity i/o mappings
1038 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1039 for (uint32_t out = 0; out < _configured_out.get (*t); ++out) {
1041 uint32_t src_idx = out_map.get_src (*t, out, &valid);
1043 bufs.get (*t, out).silence (nframes, 0);
1046 uint32_t in_idx = in_map.get (*t, src_idx, &valid);
1048 bufs.get (*t, out).silence (nframes, 0);
1051 if (in_idx != src_idx) {
1052 bufs.get (*t, out).read_from (bufs.get (*t, in_idx), nframes, 0, 0);
1060 PluginInsert::silence (framecnt_t nframes, framepos_t start_frame)
1066 _delaybuffers.flush ();
1068 ChanMapping in_map (natural_input_streams ());
1069 ChanMapping out_map (natural_output_streams ());
1070 ChanCount maxbuf = ChanCount::max (natural_input_streams (), natural_output_streams());
1072 if (is_channelstrip ()) {
1073 if (_configured_in.n_audio() > 0) {
1074 _plugins.front()->connect_and_run (_session.get_scratch_buffers (maxbuf, true), start_frame, start_frame + nframes, 1.0, in_map, out_map, nframes, 0);
1078 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1079 (*i)->connect_and_run (_session.get_scratch_buffers (maxbuf, true), start_frame, start_frame + nframes, 1.0, in_map, out_map, nframes, 0);
1084 PluginInsert::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, double speed, pframes_t nframes, bool)
1087 // collect sidechain input for complete cycle (!)
1088 // TODO we need delaylines here for latency compensation
1089 _sidechain->run (bufs, start_frame, end_frame, speed, nframes, true);
1092 if (_pending_active) {
1093 /* run as normal if we are active or moving from inactive to active */
1095 if (_session.transport_rolling() || _session.bounce_processing()) {
1096 automation_run (bufs, start_frame, end_frame, speed, nframes);
1098 Glib::Threads::Mutex::Lock lm (control_lock(), Glib::Threads::TRY_LOCK);
1099 connect_and_run (bufs, start_frame, end_frame, speed, nframes, 0, lm.locked());
1103 bypass (bufs, nframes);
1104 _delaybuffers.flush ();
1107 _active = _pending_active;
1109 /* we have no idea whether the plugin generated silence or not, so mark
1110 * all buffers appropriately.
1115 PluginInsert::automation_run (BufferSet& bufs, framepos_t start, framepos_t end, double speed, pframes_t nframes)
1117 Evoral::ControlEvent next_event (0, 0.0f);
1118 framecnt_t offset = 0;
1120 Glib::Threads::Mutex::Lock lm (control_lock(), Glib::Threads::TRY_LOCK);
1123 connect_and_run (bufs, start, end, speed, nframes, offset, false);
1127 if (!find_next_event (start, end, next_event) || _plugins.front()->requires_fixed_sized_buffers()) {
1129 /* no events have a time within the relevant range */
1131 connect_and_run (bufs, start, end, speed, nframes, offset, true);
1137 framecnt_t cnt = min (((framecnt_t) ceil (next_event.when) - start), (framecnt_t) nframes);
1139 connect_and_run (bufs, start, start + cnt, speed, cnt, offset, true); // XXX (start + cnt) * speed
1145 if (!find_next_event (start, end, next_event)) {
1150 /* cleanup anything that is left to do */
1153 connect_and_run (bufs, start, start + nframes, speed, nframes, offset, true);
1158 PluginInsert::default_parameter_value (const Evoral::Parameter& param)
1160 if (param.type() != PluginAutomation)
1163 if (_plugins.empty()) {
1164 fatal << _("programming error: ") << X_("PluginInsert::default_parameter_value() called with no plugin")
1166 abort(); /*NOTREACHED*/
1169 return _plugins[0]->default_value (param.id());
1174 PluginInsert::can_reset_all_parameters ()
1177 uint32_t params = 0;
1178 for (uint32_t par = 0; par < _plugins[0]->parameter_count(); ++par) {
1180 const uint32_t cid = _plugins[0]->nth_parameter (par, ok);
1182 if (!ok || !_plugins[0]->parameter_is_input(cid)) {
1186 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, cid));
1192 if (ac->automation_state() & Play) {
1197 return all && (params > 0);
1201 PluginInsert::reset_parameters_to_default ()
1205 for (uint32_t par = 0; par < _plugins[0]->parameter_count(); ++par) {
1207 const uint32_t cid = _plugins[0]->nth_parameter (par, ok);
1209 if (!ok || !_plugins[0]->parameter_is_input(cid)) {
1213 const float dflt = _plugins[0]->default_value (cid);
1214 const float curr = _plugins[0]->get_parameter (cid);
1220 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, cid));
1225 if (ac->automation_state() & Play) {
1230 ac->set_value (dflt, Controllable::NoGroup);
1235 boost::shared_ptr<Plugin>
1236 PluginInsert::plugin_factory (boost::shared_ptr<Plugin> other)
1238 boost::shared_ptr<LadspaPlugin> lp;
1239 boost::shared_ptr<LuaProc> lua;
1241 boost::shared_ptr<LV2Plugin> lv2p;
1243 #ifdef WINDOWS_VST_SUPPORT
1244 boost::shared_ptr<WindowsVSTPlugin> vp;
1246 #ifdef LXVST_SUPPORT
1247 boost::shared_ptr<LXVSTPlugin> lxvp;
1249 #ifdef MACVST_SUPPORT
1250 boost::shared_ptr<MacVSTPlugin> mvp;
1252 #ifdef AUDIOUNIT_SUPPORT
1253 boost::shared_ptr<AUPlugin> ap;
1256 if ((lp = boost::dynamic_pointer_cast<LadspaPlugin> (other)) != 0) {
1257 return boost::shared_ptr<Plugin> (new LadspaPlugin (*lp));
1258 } else if ((lua = boost::dynamic_pointer_cast<LuaProc> (other)) != 0) {
1259 return boost::shared_ptr<Plugin> (new LuaProc (*lua));
1261 } else if ((lv2p = boost::dynamic_pointer_cast<LV2Plugin> (other)) != 0) {
1262 return boost::shared_ptr<Plugin> (new LV2Plugin (*lv2p));
1264 #ifdef WINDOWS_VST_SUPPORT
1265 } else if ((vp = boost::dynamic_pointer_cast<WindowsVSTPlugin> (other)) != 0) {
1266 return boost::shared_ptr<Plugin> (new WindowsVSTPlugin (*vp));
1268 #ifdef LXVST_SUPPORT
1269 } else if ((lxvp = boost::dynamic_pointer_cast<LXVSTPlugin> (other)) != 0) {
1270 return boost::shared_ptr<Plugin> (new LXVSTPlugin (*lxvp));
1272 #ifdef MACVST_SUPPORT
1273 } else if ((mvp = boost::dynamic_pointer_cast<MacVSTPlugin> (other)) != 0) {
1274 return boost::shared_ptr<Plugin> (new MacVSTPlugin (*mvp));
1276 #ifdef AUDIOUNIT_SUPPORT
1277 } else if ((ap = boost::dynamic_pointer_cast<AUPlugin> (other)) != 0) {
1278 return boost::shared_ptr<Plugin> (new AUPlugin (*ap));
1282 fatal << string_compose (_("programming error: %1"),
1283 X_("unknown plugin type in PluginInsert::plugin_factory"))
1285 abort(); /*NOTREACHED*/
1286 return boost::shared_ptr<Plugin> ((Plugin*) 0);
1290 PluginInsert::set_input_map (uint32_t num, ChanMapping m) {
1291 if (num < _in_map.size()) {
1292 bool changed = _in_map[num] != m;
1294 changed |= sanitize_maps ();
1296 PluginMapChanged (); /* EMIT SIGNAL */
1297 _mapping_changed = true;
1298 _session.set_dirty();
1304 PluginInsert::set_output_map (uint32_t num, ChanMapping m) {
1305 if (num < _out_map.size()) {
1306 bool changed = _out_map[num] != m;
1308 changed |= sanitize_maps ();
1310 PluginMapChanged (); /* EMIT SIGNAL */
1311 _mapping_changed = true;
1312 _session.set_dirty();
1318 PluginInsert::set_thru_map (ChanMapping m) {
1319 bool changed = _thru_map != m;
1321 changed |= sanitize_maps ();
1323 PluginMapChanged (); /* EMIT SIGNAL */
1324 _mapping_changed = true;
1325 _session.set_dirty();
1330 PluginInsert::pre_seed (const ChanCount& in, const ChanCount& out,
1331 const ChanMapping& im, const ChanMapping& om, const ChanMapping& tm)
1333 if (_configured) { return false; }
1334 _configured_in = in;
1335 _configured_out = out;
1339 _maps_from_state = in.n_total () > 0 && out.n_total () > 0;
1344 PluginInsert::input_map () const
1348 for (PinMappings::const_iterator i = _in_map.begin (); i != _in_map.end (); ++i, ++pc) {
1349 ChanMapping m (i->second);
1350 const ChanMapping::Mappings& mp ((*i).second.mappings());
1351 for (ChanMapping::Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
1352 for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
1353 rv.set (tm->first, i->first + pc * natural_input_streams().get(tm->first), i->second);
1362 PluginInsert::no_sc_input_map () const
1366 for (PinMappings::const_iterator i = _in_map.begin (); i != _in_map.end (); ++i, ++pc) {
1367 ChanMapping m (i->second);
1368 const ChanMapping::Mappings& mp ((*i).second.mappings());
1369 for (ChanMapping::Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
1370 uint32_t ins = natural_input_streams().get(tm->first) - _cached_sidechain_pins.get(tm->first);
1371 for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
1372 if (i->first < ins) {
1373 rv.set (tm->first, i->first + pc * ins, i->second);
1382 PluginInsert::output_map () const
1386 for (PinMappings::const_iterator i = _out_map.begin (); i != _out_map.end (); ++i, ++pc) {
1387 ChanMapping m (i->second);
1388 const ChanMapping::Mappings& mp ((*i).second.mappings());
1389 for (ChanMapping::Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
1390 for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
1391 rv.set (tm->first, i->first + pc * natural_output_streams().get(tm->first), i->second);
1395 if (has_midi_bypass ()) {
1396 rv.set (DataType::MIDI, 0, 0);
1403 PluginInsert::has_midi_bypass () const
1405 if (_configured_in.n_midi () == 1 && _configured_out.n_midi () == 1
1406 && natural_output_streams ().n_midi () == 0) {
1413 PluginInsert::has_midi_thru () const
1415 if (_configured_in.n_midi () == 1 && _configured_out.n_midi () == 1
1416 && natural_input_streams ().n_midi () == 0 && natural_output_streams ().n_midi () == 0) {
1424 PluginInsert::is_channelstrip () const {
1425 return _plugins.front()->is_channelstrip();
1430 PluginInsert::check_inplace ()
1432 bool inplace_ok = !_plugins.front()->inplace_broken ();
1434 if (_thru_map.n_total () > 0) {
1435 // TODO once midi-bypass is part of the mapping, ignore it
1439 if (_match.method == Split && inplace_ok) {
1440 assert (get_count() == 1);
1441 assert (_in_map.size () == 1);
1442 if (!_out_map[0].is_monotonic ()) {
1445 if (_configured_internal != _configured_in) {
1446 /* no sidechain -- TODO we could allow this with
1447 * some more logic in PluginInsert::connect_and_run().
1449 * PluginInsert::reset_map() already maps it.
1454 for (DataType::iterator t = DataType::begin(); t != DataType::end() && inplace_ok; ++t) {
1455 if (_configured_internal.get (*t) == 0) {
1459 uint32_t first_idx = _in_map[0].get (*t, 0, &valid);
1460 if (!valid || first_idx != 0) {
1461 // so far only allow to copy the *first* stream's buffer to others
1464 for (uint32_t i = 1; i < natural_input_streams ().get (*t); ++i) {
1465 uint32_t idx = _in_map[0].get (*t, i, &valid);
1466 if (valid && idx != first_idx) {
1475 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: In Place Split Map\n", name()));
1480 for (uint32_t pc = 0; pc < get_count() && inplace_ok ; ++pc) {
1481 if (!_in_map[pc].is_monotonic ()) {
1484 if (!_out_map[pc].is_monotonic ()) {
1490 /* check if every output is fed by the corresponding input
1492 * this prevents in-port 1 -> sink-pin 2 || source-pin 1 -> out port 1, source-pin 2 -> out port 2
1493 * (with in-place, source-pin 1 -> out port 1 overwrites in-port 1)
1495 * but allows in-port 1 -> sink-pin 2 || source-pin 2 -> out port 1
1497 ChanMapping in_map (input_map ());
1498 const ChanMapping::Mappings out_m (output_map ().mappings ());
1499 for (ChanMapping::Mappings::const_iterator t = out_m.begin (); t != out_m.end () && inplace_ok; ++t) {
1500 for (ChanMapping::TypeMapping::const_iterator c = (*t).second.begin (); c != (*t).second.end () ; ++c) {
1501 /* src-pin: c->first, out-port: c->second */
1503 uint32_t in_port = in_map.get (t->first, c->first, &valid);
1504 if (valid && in_port != c->second) {
1512 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: %2\n", name(), inplace_ok ? "In-Place" : "No Inplace Processing"));
1513 return !inplace_ok; // no-inplace
1517 PluginInsert::sanitize_maps ()
1519 bool changed = false;
1520 /* strip dead wood */
1521 PinMappings new_ins;
1522 PinMappings new_outs;
1523 ChanMapping new_thru;
1525 for (uint32_t pc = 0; pc < get_count(); ++pc) {
1527 ChanMapping new_out;
1528 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1529 for (uint32_t i = 0; i < natural_input_streams().get (*t); ++i) {
1531 uint32_t idx = _in_map[pc].get (*t, i, &valid);
1532 if (valid && idx < _configured_internal.get (*t)) {
1533 new_in.set (*t, i, idx);
1536 for (uint32_t o = 0; o < natural_output_streams().get (*t); ++o) {
1538 uint32_t idx = _out_map[pc].get (*t, o, &valid);
1539 if (valid && idx < _configured_out.get (*t)) {
1540 new_out.set (*t, o, idx);
1544 if (_in_map[pc] != new_in || _out_map[pc] != new_out) {
1547 new_ins[pc] = new_in;
1548 new_outs[pc] = new_out;
1551 /* prevent dup output assignments */
1552 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1553 for (uint32_t o = 0; o < _configured_out.get (*t); ++o) {
1554 bool mapped = false;
1555 for (uint32_t pc = 0; pc < get_count(); ++pc) {
1557 uint32_t idx = new_outs[pc].get_src (*t, o, &valid);
1558 if (valid && mapped) {
1559 new_outs[pc].unset (*t, idx);
1567 /* remove excess thru */
1568 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1569 for (uint32_t o = 0; o < _configured_out.get (*t); ++o) {
1571 uint32_t idx = _thru_map.get (*t, o, &valid);
1572 if (valid && idx < _configured_internal.get (*t)) {
1573 new_thru.set (*t, o, idx);
1578 /* prevent out + thru, existing plugin outputs override thru */
1579 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1580 for (uint32_t o = 0; o < _configured_out.get (*t); ++o) {
1581 bool mapped = false;
1583 for (uint32_t pc = 0; pc < get_count(); ++pc) {
1584 new_outs[pc].get_src (*t, o, &mapped);
1585 if (mapped) { break; }
1587 if (!mapped) { continue; }
1588 uint32_t idx = new_thru.get (*t, o, &valid);
1590 new_thru.unset (*t, idx);
1595 if (has_midi_bypass ()) {
1596 // TODO: include midi-bypass in the thru set,
1597 // remove dedicated handling.
1598 new_thru.unset (DataType::MIDI, 0);
1601 if (_in_map != new_ins || _out_map != new_outs || _thru_map != new_thru) {
1605 _out_map = new_outs;
1606 _thru_map = new_thru;
1612 PluginInsert::reset_map (bool emit)
1614 const PinMappings old_in (_in_map);
1615 const PinMappings old_out (_out_map);
1619 _thru_map = ChanMapping ();
1621 /* build input map */
1622 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1623 uint32_t sc = 0; // side-chain round-robin (all instances)
1625 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
1626 const uint32_t nis = natural_input_streams ().get(*t);
1627 const uint32_t stride = nis - sidechain_input_pins().get (*t);
1629 /* SC inputs are last in the plugin-insert.. */
1630 const uint32_t sc_start = _configured_in.get (*t);
1631 const uint32_t sc_len = _configured_internal.get (*t) - sc_start;
1632 /* ...but may not be at the end of the plugin ports.
1633 * in case the side-chain is not the last port, shift connections back.
1634 * and connect to side-chain
1637 uint32_t ic = 0; // split inputs
1638 const uint32_t cend = _configured_in.get (*t);
1640 for (uint32_t in = 0; in < nis; ++in) {
1641 const Plugin::IOPortDescription& iod (_plugins[pc]->describe_io_port (*t, true, in));
1642 if (iod.is_sidechain) {
1643 /* connect sidechain sinks to sidechain inputs in round-robin fashion */
1644 if (sc_len > 0) {// side-chain may be hidden
1645 _in_map[pc].set (*t, in, sc_start + sc);
1646 sc = (sc + 1) % sc_len;
1650 if (_match.method == Split) {
1651 if (cend == 0) { continue; }
1652 if (_strict_io && ic + stride * pc >= cend) {
1655 /* connect *no* sidechain sinks in round-robin fashion */
1656 _in_map[pc].set (*t, in, ic + stride * pc);
1657 if (_strict_io && (ic + 1) == cend) {
1660 ic = (ic + 1) % cend;
1662 uint32_t s = in - shift;
1663 if (stride * pc + s < cend) {
1664 _in_map[pc].set (*t, in, s + stride * pc);
1672 /* build output map */
1674 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
1675 _out_map[pc] = ChanMapping (ChanCount::min (natural_output_streams(), _configured_out));
1676 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1677 _out_map[pc].offset_to(*t, pc * natural_output_streams().get(*t));
1682 if (old_in == _in_map && old_out == _out_map) {
1686 PluginMapChanged (); /* EMIT SIGNAL */
1687 _mapping_changed = true;
1688 _session.set_dirty();
1694 PluginInsert::configure_io (ChanCount in, ChanCount out)
1696 Match old_match = _match;
1698 ChanCount old_internal;
1702 old_pins = natural_input_streams();
1703 old_in = _configured_in;
1704 old_out = _configured_out;
1705 old_internal = _configured_internal;
1707 _configured_in = in;
1708 _configured_internal = in;
1709 _configured_out = out;
1712 /* TODO hide midi-bypass, and custom outs. Best /fake/ "out" here.
1713 * (currently _sidechain->configure_io always succeeds
1714 * since Processor::configure_io() succeeds)
1716 if (!_sidechain->configure_io (in, out)) {
1717 DEBUG_TRACE (DEBUG::ChanMapping, "Sidechain configuration failed\n");
1720 _configured_internal += _sidechain->input()->n_ports();
1722 // include (static_cast<Route*>owner())->name() ??
1723 _sidechain->input ()-> set_pretty_name (string_compose (_("SC %1"), name ()));
1726 /* get plugin configuration */
1727 _match = private_can_support_io_configuration (in, out);
1729 if (DEBUG_ENABLED(DEBUG::ChanMapping)) {
1731 DEBUG_STR_APPEND(a, string_compose ("%1: ", name()));
1732 DEBUG_STR_APPEND(a, _match);
1733 DEBUG_TRACE (DEBUG::ChanMapping, DEBUG_STR(a).str());
1737 /* set the matching method and number of plugins that we will use to meet this configuration */
1738 if (set_count (_match.plugins) == false) {
1739 PluginIoReConfigure (); /* EMIT SIGNAL */
1740 _configured = false;
1744 /* configure plugins */
1745 switch (_match.method) {
1748 if (_plugins.front()->configure_io (natural_input_streams(), out) == false) {
1749 PluginIoReConfigure (); /* EMIT SIGNAL */
1750 _configured = false;
1756 ChanCount din (_configured_internal);
1757 ChanCount dout (din); // hint
1759 if (_custom_sinks.n_total () > 0) {
1760 din = _custom_sinks;
1763 } else if (_preset_out.n_audio () > 0) {
1764 dout.set (DataType::AUDIO, _preset_out.n_audio ());
1765 } else if (dout.n_midi () > 0 && dout.n_audio () == 0) {
1766 dout.set (DataType::AUDIO, 2);
1768 if (out.n_audio () == 0) { out.set (DataType::AUDIO, 1); }
1770 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: Delegate lookup : %2 %3\n", name(), din, dout));
1771 bool const r = _plugins.front()->can_support_io_configuration (din, dout, &useins);
1773 if (useins.n_audio() == 0) {
1776 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: Delegate configuration: %2 %3\n", name(), useins, dout));
1778 if (_plugins.front()->configure_io (useins, dout) == false) {
1779 PluginIoReConfigure (); /* EMIT SIGNAL */
1780 _configured = false;
1784 _custom_sinks = din;
1789 if (_plugins.front()->configure_io (in, out) == false) {
1790 PluginIoReConfigure (); /* EMIT SIGNAL */
1791 _configured = false;
1797 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",
1799 _configured ? "Y" : "N",
1800 _maps_from_state ? "Y" : "N",
1801 old_in == in ? "==" : "!=",
1802 old_out == out ? "==" : "!=",
1803 old_pins == natural_input_streams () ? "==" : "!=",
1804 old_match.method == _match.method ? "==" : "!=",
1805 old_match.custom_cfg == _match.custom_cfg ? "==" : "!=",
1806 _in_map.size() == get_count () ? "==" : "!=",
1807 _out_map.size() == get_count () ? "==" : "!="
1810 bool mapping_changed = false;
1811 if (old_in == in && old_out == out
1813 && old_pins == natural_input_streams ()
1814 && old_match.method == _match.method
1815 && old_match.custom_cfg == _match.custom_cfg
1816 && _in_map.size() == _out_map.size()
1817 && _in_map.size() == get_count ()
1819 /* If the configuration has not changed, keep the mapping */
1820 mapping_changed = sanitize_maps ();
1821 } else if (_match.custom_cfg && _configured) {
1822 /* don't touch the map in manual mode */
1823 mapping_changed = sanitize_maps ();
1826 if (is_channelstrip ()) {
1827 /* fake channel map - for wire display */
1830 _thru_map = ChanMapping ();
1831 _in_map[0] = ChanMapping (ChanCount::min (_configured_in, ChanCount (DataType::AUDIO, 2)));
1832 _out_map[0] = ChanMapping (ChanCount::min (_configured_out, ChanCount (DataType::AUDIO, 2)));
1833 /* set "thru" map for in-place forward of audio */
1834 for (uint32_t i = 2; i < _configured_in.n_audio(); ++i) {
1835 _thru_map.set (DataType::AUDIO, i, i);
1837 /* and midi (after implicit 1st channel bypass) */
1838 for (uint32_t i = 1; i < _configured_in.n_midi(); ++i) {
1839 _thru_map.set (DataType::MIDI, i, i);
1843 if (_maps_from_state && old_in == in && old_out == out) {
1844 mapping_changed = true;
1847 /* generate a new mapping */
1848 mapping_changed = reset_map (false);
1850 _maps_from_state = false;
1853 if (mapping_changed) {
1854 PluginMapChanged (); /* EMIT SIGNAL */
1857 if (DEBUG_ENABLED(DEBUG::ChanMapping)) {
1860 DEBUG_STR_APPEND(a, "\n--------<<--------\n");
1861 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
1863 DEBUG_STR_APPEND(a, "----><----\n");
1865 DEBUG_STR_APPEND(a, string_compose ("Channel Map for %1 plugin %2\n", name(), pc));
1866 DEBUG_STR_APPEND(a, " * Inputs:\n");
1867 DEBUG_STR_APPEND(a, _in_map[pc]);
1868 DEBUG_STR_APPEND(a, " * Outputs:\n");
1869 DEBUG_STR_APPEND(a, _out_map[pc]);
1871 DEBUG_STR_APPEND(a, " * Thru:\n");
1872 DEBUG_STR_APPEND(a, _thru_map);
1873 DEBUG_STR_APPEND(a, "-------->>--------\n");
1874 DEBUG_TRACE (DEBUG::ChanMapping, DEBUG_STR(a).str());
1879 _no_inplace = check_inplace ();
1880 _mapping_changed = false;
1882 /* only the "noinplace_buffers" thread buffers need to be this large,
1883 * this can be optimized. other buffers are fine with
1884 * ChanCount::max (natural_input_streams (), natural_output_streams())
1885 * and route.cc's max (configured_in, configured_out)
1887 * no-inplace copies "thru" outputs (to emulate in-place) for
1888 * all outputs (to prevent overwrite) into a temporary space
1889 * which also holds input buffers (in case the plugin does process
1890 * in-place and overwrites those).
1892 * this buffers need to be at least as
1893 * natural_input_streams () + possible outputs.
1895 * sidechain inputs add a constraint on the input:
1896 * configured input + sidechain (=_configured_internal)
1898 * NB. this also satisfies
1899 * max (natural_input_streams(), natural_output_streams())
1900 * which is needed for silence runs
1902 _required_buffers = ChanCount::max (_configured_internal,
1903 natural_input_streams () + ChanCount::max (_configured_out, natural_output_streams () * get_count ()));
1905 if (old_in != in || old_out != out || old_internal != _configured_internal
1906 || old_pins != natural_input_streams ()
1907 || (old_match.method != _match.method && (old_match.method == Split || _match.method == Split))
1909 PluginIoReConfigure (); /* EMIT SIGNAL */
1912 _delaybuffers.configure (_configured_out, _plugins.front ()->max_latency ());
1913 _latency_changed = true;
1915 // we don't know the analysis window size, so we must work with the
1916 // current buffer size here. each request for data fills in these
1917 // buffers and the analyser makes sure it gets enough data for the
1919 session().ensure_buffer_set (_signal_analysis_inputs, in);
1920 _signal_analysis_inputs.set_count (in);
1922 session().ensure_buffer_set (_signal_analysis_outputs, out);
1923 _signal_analysis_outputs.set_count (out);
1925 // std::cerr << "set counts to i" << in.n_audio() << "/o" << out.n_audio() << std::endl;
1928 return Processor::configure_io (in, out);
1931 /** Decide whether this PluginInsert can support a given IO configuration.
1932 * To do this, we run through a set of possible solutions in rough order of
1935 * @param in Required input channel count.
1936 * @param out Filled in with the output channel count if we return true.
1937 * @return true if the given IO configuration can be supported.
1940 PluginInsert::can_support_io_configuration (const ChanCount& in, ChanCount& out)
1943 _sidechain->can_support_io_configuration (in, out); // never fails, sets "out"
1945 return private_can_support_io_configuration (in, out).method != Impossible;
1949 PluginInsert::private_can_support_io_configuration (ChanCount const& in, ChanCount& out) const
1951 if (!_custom_cfg && _preset_out.n_audio () > 0) {
1952 // preseed hint (for variable i/o)
1953 out.set (DataType::AUDIO, _preset_out.n_audio ());
1956 Match rv = internal_can_support_io_configuration (in, out);
1958 if (!_custom_cfg && _preset_out.n_audio () > 0) {
1959 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: using output preset: %2\n", name(), _preset_out));
1960 out.set (DataType::AUDIO, _preset_out.n_audio ());
1965 /** A private version of can_support_io_configuration which returns the method
1966 * by which the configuration can be matched, rather than just whether or not
1970 PluginInsert::internal_can_support_io_configuration (ChanCount const & inx, ChanCount& out) const
1972 if (_plugins.empty()) {
1977 if (is_channelstrip ()) {
1979 return Match (ExactMatch, 1);
1983 /* if a user specified a custom cfg, so be it. */
1985 PluginInfoPtr info = _plugins.front()->get_info();
1987 if (info->reconfigurable_io()) {
1988 return Match (Delegate, 1, _strict_io, true);
1990 return Match (ExactMatch, get_count(), _strict_io, true);
1994 /* try automatic configuration */
1995 Match m = PluginInsert::automatic_can_support_io_configuration (inx, out);
1997 PluginInfoPtr info = _plugins.front()->get_info();
1998 ChanCount inputs = info->n_inputs;
1999 ChanCount outputs = info->n_outputs;
2001 /* handle case strict-i/o */
2002 if (_strict_io && m.method != Impossible) {
2005 /* special case MIDI instruments */
2006 if (is_instrument ()) {
2007 // output = midi-bypass + at most master-out channels.
2008 ChanCount max_out (DataType::AUDIO, 2); // TODO use master-out
2009 max_out.set (DataType::MIDI, out.get(DataType::MIDI));
2010 out = ChanCount::min (out, max_out);
2011 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: special case strict-i/o instrument\n", name()));
2017 if (inx.n_audio () != out.n_audio ()) { // ignore midi bypass
2018 /* replicate processor to match output count (generators and such)
2019 * at least enough to feed every output port. */
2020 uint32_t f = 1; // at least one. e.g. control data filters, no in, no out.
2021 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2022 uint32_t nout = outputs.get (*t);
2023 if (nout == 0 || inx.get(*t) == 0) { continue; }
2024 f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nout));
2027 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: special case strict-i/o for generator\n", name()));
2028 return Match (Replicate, f, _strict_io);
2039 if (m.method != Impossible) {
2043 ChanCount ns_inputs = inputs - sidechain_input_pins ();
2045 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: resolving 'Impossible' match...\n", name()));
2047 if (info->reconfigurable_io()) {
2050 if (out.n_midi () > 0 && out.n_audio () == 0) { out.set (DataType::AUDIO, 2); }
2051 if (out.n_audio () == 0) { out.set (DataType::AUDIO, 1); }
2052 bool const r = _plugins.front()->can_support_io_configuration (inx + sidechain_input_pins (), out, &useins);
2054 // houston, we have a problem.
2055 return Match (Impossible, 0);
2058 if (inx.n_midi () > 0 && out.n_midi () == 0) { out.set (DataType::MIDI, 1); }
2059 return Match (Delegate, 1, _strict_io);
2062 ChanCount midi_bypass;
2063 if (inx.get(DataType::MIDI) == 1 && outputs.get(DataType::MIDI) == 0) {
2064 midi_bypass.set (DataType::MIDI, 1);
2067 // add at least as many plugins so that output count matches input count (w/o sidechain pins)
2069 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2070 uint32_t nin = ns_inputs.get (*t);
2071 uint32_t nout = outputs.get (*t);
2072 if (nin == 0 || inx.get(*t) == 0) { continue; }
2073 // prefer floor() so the count won't overly increase IFF (nin < nout)
2074 f = max (f, (uint32_t) floor (inx.get(*t) / (float)nout));
2076 if (f > 0 && outputs * f >= _configured_out) {
2077 out = outputs * f + midi_bypass;
2078 return Match (Replicate, f, _strict_io);
2081 // add at least as many plugins needed to connect all inputs (w/o sidechain pins)
2083 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2084 uint32_t nin = ns_inputs.get (*t);
2085 if (nin == 0 || inx.get(*t) == 0) { continue; }
2086 f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nin));
2089 out = outputs * f + midi_bypass;
2090 return Match (Replicate, f, _strict_io);
2093 // add at least as many plugins needed to connect all inputs
2095 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2096 uint32_t nin = inputs.get (*t);
2097 if (nin == 0 || inx.get(*t) == 0) { continue; }
2098 f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nin));
2100 out = outputs * f + midi_bypass;
2101 return Match (Replicate, f, _strict_io);
2104 /* this is the original Ardour 3/4 behavior, mainly for backwards compatibility */
2106 PluginInsert::automatic_can_support_io_configuration (ChanCount const & inx, ChanCount& out) const
2108 if (_plugins.empty()) {
2112 PluginInfoPtr info = _plugins.front()->get_info();
2113 ChanCount in; in += inx;
2114 ChanCount midi_bypass;
2116 if (info->reconfigurable_io()) {
2117 /* Plugin has flexible I/O, so delegate to it
2118 * pre-seed outputs, plugin tries closest match
2121 if (out.n_midi () > 0 && out.n_audio () == 0) { out.set (DataType::AUDIO, 2); }
2122 if (out.n_audio () == 0) { out.set (DataType::AUDIO, 1); }
2123 bool const r = _plugins.front()->can_support_io_configuration (in + sidechain_input_pins (), out);
2125 return Match (Impossible, 0);
2128 if (in.n_midi () > 0 && out.n_midi () == 0) { out.set (DataType::MIDI, 1); }
2129 return Match (Delegate, 1);
2132 ChanCount inputs = info->n_inputs;
2133 ChanCount outputs = info->n_outputs;
2134 ChanCount ns_inputs = inputs - sidechain_input_pins ();
2136 if (in.get(DataType::MIDI) == 1 && outputs.get(DataType::MIDI) == 0) {
2137 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: bypassing midi-data\n", name()));
2138 midi_bypass.set (DataType::MIDI, 1);
2140 if (in.get(DataType::MIDI) == 1 && inputs.get(DataType::MIDI) == 0) {
2141 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: hiding midi-port from plugin\n", name()));
2142 in.set(DataType::MIDI, 0);
2145 // add internally provided sidechain ports
2146 ChanCount insc = in + sidechain_input_ports ();
2148 bool no_inputs = true;
2149 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2150 if (inputs.get (*t) != 0) {
2157 /* no inputs so we can take any input configuration since we throw it away */
2158 out = outputs + midi_bypass;
2159 return Match (NoInputs, 1);
2162 /* Plugin inputs match requested inputs + side-chain-ports exactly */
2163 if (inputs == insc) {
2164 out = outputs + midi_bypass;
2165 return Match (ExactMatch, 1);
2168 /* Plugin inputs matches without side-chain-pins */
2169 if (ns_inputs == in) {
2170 out = outputs + midi_bypass;
2171 return Match (ExactMatch, 1);
2174 /* We may be able to run more than one copy of the plugin within this insert
2175 to cope with the insert having more inputs than the plugin.
2176 We allow replication only for plugins with either zero or 1 inputs and outputs
2177 for every valid data type.
2181 bool can_replicate = true;
2182 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2184 // ignore side-chains
2185 uint32_t nin = ns_inputs.get (*t);
2187 // No inputs of this type
2188 if (nin == 0 && in.get(*t) == 0) {
2192 if (nin != 1 || outputs.get (*t) != 1) {
2193 can_replicate = false;
2197 // Potential factor not set yet
2199 f = in.get(*t) / nin;
2202 // Factor for this type does not match another type, can not replicate
2203 if (f != (in.get(*t) / nin)) {
2204 can_replicate = false;
2209 if (can_replicate && f > 0) {
2210 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2211 out.set (*t, outputs.get(*t) * f);
2214 return Match (Replicate, f);
2217 /* If the processor has exactly one input of a given type, and
2218 the plugin has more, we can feed the single processor input
2219 to some or all of the plugin inputs. This is rather
2220 special-case-y, but the 1-to-many case is by far the
2221 simplest. How do I split thy 2 processor inputs to 3
2222 plugin inputs? Let me count the ways ...
2225 bool can_split = true;
2226 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2228 bool const can_split_type = (in.get (*t) == 1 && ns_inputs.get (*t) > 1);
2229 bool const nothing_to_do_for_type = (in.get (*t) == 0 && inputs.get (*t) == 0);
2231 if (!can_split_type && !nothing_to_do_for_type) {
2237 out = outputs + midi_bypass;
2238 return Match (Split, 1);
2241 /* If the plugin has more inputs than we want, we can `hide' some of them
2242 by feeding them silence.
2245 bool could_hide = false;
2246 bool cannot_hide = false;
2247 ChanCount hide_channels;
2249 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2250 if (inputs.get(*t) > in.get(*t)) {
2251 /* there is potential to hide, since the plugin has more inputs of type t than the insert */
2252 hide_channels.set (*t, inputs.get(*t) - in.get(*t));
2254 } else if (inputs.get(*t) < in.get(*t)) {
2255 /* we definitely cannot hide, since the plugin has fewer inputs of type t than the insert */
2260 if (could_hide && !cannot_hide) {
2261 out = outputs + midi_bypass;
2262 return Match (Hide, 1, false, false, hide_channels);
2265 return Match (Impossible, 0);
2270 PluginInsert::get_state ()
2272 return state (true);
2276 PluginInsert::state (bool full)
2278 XMLNode& node = Processor::state (full);
2280 node.add_property("type", _plugins[0]->state_node_name());
2281 node.add_property("unique-id", _plugins[0]->unique_id());
2282 node.add_property("count", string_compose("%1", _plugins.size()));
2284 /* remember actual i/o configuration (for later placeholder
2285 * in case the plugin goes missing) */
2286 node.add_child_nocopy (* _configured_in.state (X_("ConfiguredInput")));
2287 node.add_child_nocopy (* _custom_sinks.state (X_("CustomSinks")));
2288 node.add_child_nocopy (* _configured_out.state (X_("ConfiguredOutput")));
2289 node.add_child_nocopy (* _preset_out.state (X_("PresetOutput")));
2291 /* save custom i/o config */
2292 node.add_property("custom", _custom_cfg ? "yes" : "no");
2293 for (uint32_t pc = 0; pc < get_count(); ++pc) {
2295 snprintf (tmp, sizeof(tmp), "InputMap-%d", pc);
2296 node.add_child_nocopy (* _in_map[pc].state (tmp));
2297 snprintf (tmp, sizeof(tmp), "OutputMap-%d", pc);
2298 node.add_child_nocopy (* _out_map[pc].state (tmp));
2300 node.add_child_nocopy (* _thru_map.state ("ThruMap"));
2303 node.add_child_nocopy (_sidechain->state (full));
2306 _plugins[0]->set_insert_id(this->id());
2307 node.add_child_nocopy (_plugins[0]->get_state());
2309 for (Controls::iterator c = controls().begin(); c != controls().end(); ++c) {
2310 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> ((*c).second);
2312 node.add_child_nocopy (ac->get_state());
2320 PluginInsert::set_control_ids (const XMLNode& node, int version)
2322 const XMLNodeList& nlist = node.children();
2323 XMLNodeConstIterator iter;
2324 set<Evoral::Parameter>::const_iterator p;
2326 for (iter = nlist.begin(); iter != nlist.end(); ++iter) {
2327 if ((*iter)->name() == Controllable::xml_node_name) {
2328 XMLProperty const * prop;
2330 uint32_t p = (uint32_t)-1;
2332 if ((prop = (*iter)->property (X_("symbol"))) != 0) {
2333 boost::shared_ptr<LV2Plugin> lv2plugin = boost::dynamic_pointer_cast<LV2Plugin> (_plugins[0]);
2335 p = lv2plugin->port_index(prop->value().c_str());
2339 if (p == (uint32_t)-1 && (prop = (*iter)->property (X_("parameter"))) != 0) {
2340 p = atoi (prop->value());
2343 if (p != (uint32_t)-1) {
2345 /* this may create the new controllable */
2347 boost::shared_ptr<Evoral::Control> c = control (Evoral::Parameter (PluginAutomation, 0, p));
2349 #ifndef NO_PLUGIN_STATE
2353 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> (c);
2355 ac->set_state (**iter, version);
2364 PluginInsert::set_state(const XMLNode& node, int version)
2366 XMLNodeList nlist = node.children();
2367 XMLNodeIterator niter;
2368 XMLPropertyList plist;
2369 XMLProperty const * prop;
2370 ARDOUR::PluginType type;
2372 if ((prop = node.property ("type")) == 0) {
2373 error << _("XML node describing plugin is missing the `type' field") << endmsg;
2377 if (prop->value() == X_("ladspa") || prop->value() == X_("Ladspa")) { /* handle old school sessions */
2378 type = ARDOUR::LADSPA;
2379 } else if (prop->value() == X_("lv2")) {
2381 } else if (prop->value() == X_("windows-vst")) {
2382 type = ARDOUR::Windows_VST;
2383 } else if (prop->value() == X_("lxvst")) {
2384 type = ARDOUR::LXVST;
2385 } else if (prop->value() == X_("mac-vst")) {
2386 type = ARDOUR::MacVST;
2387 } else if (prop->value() == X_("audiounit")) {
2388 type = ARDOUR::AudioUnit;
2389 } else if (prop->value() == X_("luaproc")) {
2392 error << string_compose (_("unknown plugin type %1 in plugin insert state"),
2398 prop = node.property ("unique-id");
2401 #ifdef WINDOWS_VST_SUPPORT
2402 /* older sessions contain VST plugins with only an "id" field. */
2403 if (type == ARDOUR::Windows_VST) {
2404 prop = node.property ("id");
2408 #ifdef LXVST_SUPPORT
2409 /*There shouldn't be any older sessions with linuxVST support.. but anyway..*/
2410 if (type == ARDOUR::LXVST) {
2411 prop = node.property ("id");
2418 error << _("Plugin has no unique ID field") << endmsg;
2423 boost::shared_ptr<Plugin> plugin = find_plugin (_session, prop->value(), type);
2425 /* treat VST plugins equivalent if they have the same uniqueID
2426 * allow to move sessions windows <> linux */
2427 #ifdef LXVST_SUPPORT
2428 if (plugin == 0 && (type == ARDOUR::Windows_VST || type == ARDOUR::MacVST)) {
2429 type = ARDOUR::LXVST;
2430 plugin = find_plugin (_session, prop->value(), type);
2434 #ifdef WINDOWS_VST_SUPPORT
2435 if (plugin == 0 && (type == ARDOUR::LXVST || type == ARDOUR::MacVST)) {
2436 type = ARDOUR::Windows_VST;
2437 plugin = find_plugin (_session, prop->value(), type);
2441 #ifdef MACVST_SUPPORT
2442 if (plugin == 0 && (type == ARDOUR::Windows_VST || type == ARDOUR::LXVST)) {
2443 type = ARDOUR::MacVST;
2444 plugin = find_plugin (_session, prop->value(), type);
2448 if (plugin == 0 && type == ARDOUR::Lua) {
2449 /* unique ID (sha1 of script) was not found,
2450 * load the plugin from the serialized version in the
2451 * session-file instead.
2453 boost::shared_ptr<LuaProc> lp (new LuaProc (_session.engine(), _session, ""));
2454 XMLNode *ls = node.child (lp->state_node_name().c_str());
2456 lp->set_script_from_state (*ls);
2462 error << string_compose(
2463 _("Found a reference to a plugin (\"%1\") that is unknown.\n"
2464 "Perhaps it was removed or moved since it was last used."),
2470 // The name of the PluginInsert comes from the plugin, nothing else
2471 _name = plugin->get_info()->name;
2475 // Processor::set_state() will set this, but too late
2476 // for it to be available when setting up plugin
2477 // state. We can't call Processor::set_state() until
2478 // the plugins themselves are created and added.
2482 if (_plugins.empty()) {
2483 /* if we are adding the first plugin, we will need to set
2484 up automatable controls.
2486 add_plugin (plugin);
2487 create_automatable_parameters ();
2488 set_control_ids (node, version);
2491 if ((prop = node.property ("count")) != 0) {
2492 sscanf (prop->value().c_str(), "%u", &count);
2495 if (_plugins.size() != count) {
2496 for (uint32_t n = 1; n < count; ++n) {
2497 add_plugin (plugin_factory (plugin));
2501 Processor::set_state (node, version);
2503 PBD::ID new_id = this->id();
2504 PBD::ID old_id = this->id();
2506 if ((prop = node.property ("id")) != 0) {
2507 old_id = prop->value ();
2510 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2512 /* find the node with the type-specific node name ("lv2", "ladspa", etc)
2513 and set all plugins to the same state.
2516 if ((*niter)->name() == plugin->state_node_name()) {
2518 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2519 /* Plugin state can include external files which are named after the ID.
2521 * If regenerate_xml_or_string_ids() is set, the ID will already have
2522 * been changed, so we need to use the old ID from the XML to load the
2523 * state and then update the ID.
2525 * When copying a plugin-state, route_ui takes care of of updating the ID,
2526 * but we need to call set_insert_id() to clear the cached plugin-state
2527 * and force a change.
2529 if (!regenerate_xml_or_string_ids ()) {
2530 (*i)->set_insert_id (new_id);
2532 (*i)->set_insert_id (old_id);
2535 (*i)->set_state (**niter, version);
2537 if (regenerate_xml_or_string_ids ()) {
2538 (*i)->set_insert_id (new_id);
2546 if (version < 3000) {
2548 /* Only 2.X sessions need a call to set_parameter_state() - in 3.X and above
2549 this is all handled by Automatable
2552 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2553 if ((*niter)->name() == "Redirect") {
2554 /* XXX do we need to tackle placement? i think not (pd; oct 16 2009) */
2555 Processor::set_state (**niter, version);
2560 set_parameter_state_2X (node, version);
2563 if ((prop = node.property (X_("custom"))) != 0) {
2564 _custom_cfg = string_is_affirmative (prop->value());
2567 uint32_t in_maps = 0;
2568 uint32_t out_maps = 0;
2569 XMLNodeList kids = node.children ();
2570 for (XMLNodeIterator i = kids.begin(); i != kids.end(); ++i) {
2571 if ((*i)->name() == X_("ConfiguredInput")) {
2572 _configured_in = ChanCount(**i);
2574 if ((*i)->name() == X_("CustomSinks")) {
2575 _custom_sinks = ChanCount(**i);
2577 if ((*i)->name() == X_("ConfiguredOutput")) {
2578 _custom_out = ChanCount(**i);
2579 _configured_out = ChanCount(**i);
2581 if ((*i)->name() == X_("PresetOutput")) {
2582 _preset_out = ChanCount(**i);
2584 if (strncmp ((*i)->name ().c_str(), X_("InputMap-"), 9) == 0) {
2585 long pc = atol (&((*i)->name().c_str()[9]));
2586 if (pc >= 0 && pc <= (long) get_count()) {
2587 _in_map[pc] = ChanMapping (**i);
2591 if (strncmp ((*i)->name ().c_str(), X_("OutputMap-"), 10) == 0) {
2592 long pc = atol (&((*i)->name().c_str()[10]));
2593 if (pc >= 0 && pc <= (long) get_count()) {
2594 _out_map[pc] = ChanMapping (**i);
2598 if ((*i)->name () == "ThruMap") {
2599 _thru_map = ChanMapping (**i);
2602 // sidechain is a Processor (IO)
2603 if ((*i)->name () == Processor::state_node_name) {
2607 if (!regenerate_xml_or_string_ids ()) {
2608 _sidechain->set_state (**i, version);
2613 if (in_maps == out_maps && out_maps >0 && out_maps == get_count()) {
2614 _maps_from_state = true;
2617 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2621 (*i)->deactivate ();
2625 PluginConfigChanged (); /* EMIT SIGNAL */
2630 PluginInsert::update_id (PBD::ID id)
2633 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2634 (*i)->set_insert_id (id);
2639 PluginInsert::set_owner (SessionObject* o)
2641 Processor::set_owner (o);
2642 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2643 (*i)->set_owner (o);
2648 PluginInsert::set_state_dir (const std::string& d)
2650 // state() only saves the state of the first plugin
2651 _plugins[0]->set_state_dir (d);
2655 PluginInsert::set_parameter_state_2X (const XMLNode& node, int version)
2657 XMLNodeList nlist = node.children();
2658 XMLNodeIterator niter;
2660 /* look for port automation node */
2662 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2664 if ((*niter)->name() != port_automation_node_name) {
2669 XMLProperty const * cprop;
2670 XMLNodeConstIterator iter;
2675 cnodes = (*niter)->children ("port");
2677 for (iter = cnodes.begin(); iter != cnodes.end(); ++iter){
2681 if ((cprop = child->property("number")) != 0) {
2682 port = cprop->value().c_str();
2684 warning << _("PluginInsert: Auto: no ladspa port number") << endmsg;
2688 sscanf (port, "%" PRIu32, &port_id);
2690 if (port_id >= _plugins[0]->parameter_count()) {
2691 warning << _("PluginInsert: Auto: port id out of range") << endmsg;
2695 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(
2696 control(Evoral::Parameter(PluginAutomation, 0, port_id), true));
2698 if (c && c->alist()) {
2699 if (!child->children().empty()) {
2700 c->alist()->set_state (*child->children().front(), version);
2702 /* In some cases 2.X saves lists with min_yval and max_yval
2703 being FLT_MIN and FLT_MAX respectively. This causes problems
2704 in A3 because these min/max values are used to compute
2705 where GUI control points should be drawn. If we see such
2706 values, `correct' them to the min/max of the appropriate
2710 float min_y = c->alist()->get_min_y ();
2711 float max_y = c->alist()->get_max_y ();
2713 ParameterDescriptor desc;
2714 _plugins.front()->get_parameter_descriptor (port_id, desc);
2716 if (min_y == FLT_MIN) {
2720 if (max_y == FLT_MAX) {
2724 c->alist()->set_yrange (min_y, max_y);
2727 error << string_compose (_("PluginInsert: automatable control %1 not found - ignored"), port_id) << endmsg;
2739 PluginInsert::describe_parameter (Evoral::Parameter param)
2741 if (param.type() == PluginAutomation) {
2742 return _plugins[0]->describe_parameter (param);
2743 } else if (param.type() == PluginPropertyAutomation) {
2744 boost::shared_ptr<AutomationControl> c(automation_control(param));
2745 if (c && !c->desc().label.empty()) {
2746 return c->desc().label;
2749 return Automatable::describe_parameter(param);
2753 PluginInsert::signal_latency() const
2755 if (!_pending_active) {
2758 if (_user_latency) {
2759 return _user_latency;
2762 return _plugins[0]->signal_latency ();
2766 PluginInsert::type ()
2768 return plugin()->get_info()->type;
2771 PluginInsert::PluginControl::PluginControl (PluginInsert* p,
2772 const Evoral::Parameter& param,
2773 const ParameterDescriptor& desc,
2774 boost::shared_ptr<AutomationList> list)
2775 : AutomationControl (p->session(), param, desc, list, p->describe_parameter(param))
2779 alist()->reset_default (desc.normal);
2781 list->set_interpolation(Evoral::ControlList::Discrete);
2786 /** @param val `user' value */
2789 PluginInsert::PluginControl::actually_set_value (double user_val, PBD::Controllable::GroupControlDisposition group_override)
2791 /* FIXME: probably should be taking out some lock here.. */
2793 for (Plugins::iterator i = _plugin->_plugins.begin(); i != _plugin->_plugins.end(); ++i) {
2794 (*i)->set_parameter (_list->parameter().id(), user_val);
2797 boost::shared_ptr<Plugin> iasp = _plugin->_impulseAnalysisPlugin.lock();
2799 iasp->set_parameter (_list->parameter().id(), user_val);
2802 AutomationControl::actually_set_value (user_val, group_override);
2806 PluginInsert::PluginControl::catch_up_with_external_value (double user_val)
2808 AutomationControl::actually_set_value (user_val, Controllable::NoGroup);
2812 PluginInsert::PluginControl::get_state ()
2816 XMLNode& node (AutomationControl::get_state());
2817 ss << parameter().id();
2818 node.add_property (X_("parameter"), ss.str());
2820 boost::shared_ptr<LV2Plugin> lv2plugin = boost::dynamic_pointer_cast<LV2Plugin> (_plugin->_plugins[0]);
2822 node.add_property (X_("symbol"), lv2plugin->port_symbol (parameter().id()));
2829 /** @return `user' val */
2831 PluginInsert::PluginControl::get_value () const
2833 boost::shared_ptr<Plugin> plugin = _plugin->plugin (0);
2839 return plugin->get_parameter (_list->parameter().id());
2842 PluginInsert::PluginPropertyControl::PluginPropertyControl (PluginInsert* p,
2843 const Evoral::Parameter& param,
2844 const ParameterDescriptor& desc,
2845 boost::shared_ptr<AutomationList> list)
2846 : AutomationControl (p->session(), param, desc, list)
2850 alist()->set_yrange (desc.lower, desc.upper);
2851 alist()->reset_default (desc.normal);
2856 PluginInsert::PluginPropertyControl::actually_set_value (double user_val, Controllable::GroupControlDisposition gcd)
2858 /* Old numeric set_value(), coerce to appropriate datatype if possible.
2859 This is lossy, but better than nothing until Ardour's automation system
2860 can handle various datatypes all the way down. */
2861 const Variant value(_desc.datatype, user_val);
2862 if (value.type() == Variant::NOTHING) {
2863 error << "set_value(double) called for non-numeric property" << endmsg;
2867 for (Plugins::iterator i = _plugin->_plugins.begin(); i != _plugin->_plugins.end(); ++i) {
2868 (*i)->set_property(_list->parameter().id(), value);
2873 AutomationControl::actually_set_value (user_val, gcd);
2877 PluginInsert::PluginPropertyControl::get_state ()
2881 XMLNode& node (AutomationControl::get_state());
2882 ss << parameter().id();
2883 node.add_property (X_("property"), ss.str());
2884 node.remove_property (X_("value"));
2890 PluginInsert::PluginPropertyControl::get_value () const
2892 return _value.to_double();
2895 boost::shared_ptr<Plugin>
2896 PluginInsert::get_impulse_analysis_plugin()
2898 boost::shared_ptr<Plugin> ret;
2899 if (_impulseAnalysisPlugin.expired()) {
2900 // LV2 in particular uses various _session params
2901 // during init() -- most notably block_size..
2903 ret = plugin_factory(_plugins[0]);
2904 ChanCount out (internal_output_streams ());
2905 if (ret->get_info ()->reconfigurable_io ()) {
2906 // populate get_info ()->n_inputs and ->n_outputs
2908 ret->can_support_io_configuration (internal_input_streams (), out, &useins);
2909 assert (out == internal_output_streams ());
2911 ret->configure_io (internal_input_streams (), out);
2912 _impulseAnalysisPlugin = ret;
2914 ret = _impulseAnalysisPlugin.lock();
2921 PluginInsert::collect_signal_for_analysis (framecnt_t nframes)
2923 // called from outside the audio thread, so this should be safe
2924 // only do audio as analysis is (currently) only for audio plugins
2925 _signal_analysis_inputs.ensure_buffers (DataType::AUDIO, input_streams().n_audio(), nframes);
2926 _signal_analysis_outputs.ensure_buffers (DataType::AUDIO, output_streams().n_audio(), nframes);
2928 _signal_analysis_collected_nframes = 0;
2929 _signal_analysis_collect_nframes_max = nframes;
2932 /** Add a plugin to our list */
2934 PluginInsert::add_plugin (boost::shared_ptr<Plugin> plugin)
2936 plugin->set_insert_id (this->id());
2937 plugin->set_owner (_owner);
2939 if (_plugins.empty()) {
2940 /* first (and probably only) plugin instance - connect to relevant signals */
2942 plugin->ParameterChangedExternally.connect_same_thread (*this, boost::bind (&PluginInsert::parameter_changed_externally, this, _1, _2));
2943 plugin->StartTouch.connect_same_thread (*this, boost::bind (&PluginInsert::start_touch, this, _1));
2944 plugin->EndTouch.connect_same_thread (*this, boost::bind (&PluginInsert::end_touch, this, _1));
2945 _custom_sinks = plugin->get_info()->n_inputs;
2946 // cache sidechain port count
2947 _cached_sidechain_pins.reset ();
2948 const ChanCount& nis (plugin->get_info()->n_inputs);
2949 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2950 for (uint32_t in = 0; in < nis.get (*t); ++in) {
2951 const Plugin::IOPortDescription& iod (plugin->describe_io_port (*t, true, in));
2952 if (iod.is_sidechain) {
2953 _cached_sidechain_pins.set (*t, 1 + _cached_sidechain_pins.n(*t));
2958 #if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT || defined MACVST_SUPPORT)
2959 boost::shared_ptr<VSTPlugin> vst = boost::dynamic_pointer_cast<VSTPlugin> (plugin);
2961 vst->set_insert (this, _plugins.size ());
2965 _plugins.push_back (plugin);
2969 PluginInsert::load_preset (ARDOUR::Plugin::PresetRecord pr)
2972 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2973 if (! (*i)->load_preset (pr)) {
2981 PluginInsert::realtime_handle_transport_stopped ()
2983 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2984 (*i)->realtime_handle_transport_stopped ();
2989 PluginInsert::realtime_locate ()
2991 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2992 (*i)->realtime_locate ();
2997 PluginInsert::monitoring_changed ()
2999 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
3000 (*i)->monitoring_changed ();
3005 PluginInsert::latency_changed ()
3007 // this is called in RT context, LatencyChanged is emitted after run()
3008 _latency_changed = true;
3009 // XXX This also needs a proper API not an owner() hack.
3011 static_cast<Route*>(owner ())->processor_latency_changed (); /* EMIT SIGNAL */
3015 PluginInsert::start_touch (uint32_t param_id)
3017 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id));
3019 ac->start_touch (session().audible_frame());
3024 PluginInsert::end_touch (uint32_t param_id)
3026 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id));
3028 ac->stop_touch (true, session().audible_frame());
3032 std::ostream& operator<<(std::ostream& o, const ARDOUR::PluginInsert::Match& m)
3035 case PluginInsert::Impossible: o << "Impossible"; break;
3036 case PluginInsert::Delegate: o << "Delegate"; break;
3037 case PluginInsert::NoInputs: o << "NoInputs"; break;
3038 case PluginInsert::ExactMatch: o << "ExactMatch"; break;
3039 case PluginInsert::Replicate: o << "Replicate"; break;
3040 case PluginInsert::Split: o << "Split"; break;
3041 case PluginInsert::Hide: o << "Hide"; break;
3043 o << " cnt: " << m.plugins
3044 << (m.strict_io ? " strict-io" : "")
3045 << (m.custom_cfg ? " custom-cfg" : "");
3046 if (m.method == PluginInsert::Hide) {
3047 o << " hide: " << m.hide;