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"
53 #ifdef AUDIOUNIT_SUPPORT
54 #include "ardour/audio_unit.h"
57 #include "ardour/session.h"
58 #include "ardour/types.h"
63 using namespace ARDOUR;
66 const string PluginInsert::port_automation_node_name = "PortAutomation";
68 PluginInsert::PluginInsert (Session& s, boost::shared_ptr<Plugin> plug)
69 : Processor (s, (plug ? plug->name() : string ("toBeRenamed")))
70 , _sc_playback_latency (0)
71 , _sc_capture_latency (0)
72 , _plugin_signal_latency (0)
73 , _signal_analysis_collected_nframes(0)
74 , _signal_analysis_collect_nframes_max(0)
79 , _maps_from_state (false)
80 , _latency_changed (false)
81 , _bypass_port (UINT32_MAX)
83 /* the first is the master */
87 create_automatable_parameters ();
88 const ChanCount& sc (sidechain_input_pins ());
89 if (sc.n_audio () > 0 || sc.n_midi () > 0) {
90 add_sidechain (sc.n_audio (), sc.n_midi ());
95 PluginInsert::~PluginInsert ()
100 PluginInsert::set_strict_io (bool b)
102 bool changed = _strict_io != b;
105 PluginConfigChanged (); /* EMIT SIGNAL */
110 PluginInsert::set_count (uint32_t num)
112 bool require_state = !_plugins.empty();
114 if (require_state && num > 1 && plugin (0)->get_info ()->type == ARDOUR::AudioUnit) {
115 // we don't allow to replicate AUs
119 /* this is a bad idea.... we shouldn't do this while active.
120 * only a route holding their redirect_lock should be calling this
125 } else if (num > _plugins.size()) {
126 uint32_t diff = num - _plugins.size();
128 for (uint32_t n = 0; n < diff; ++n) {
129 boost::shared_ptr<Plugin> p = plugin_factory (_plugins[0]);
133 XMLNode& state = _plugins[0]->get_state ();
134 p->set_state (state, Stateful::loading_state_version);
141 PluginConfigChanged (); /* EMIT SIGNAL */
143 } else if (num < _plugins.size()) {
144 uint32_t diff = _plugins.size() - num;
145 for (uint32_t n= 0; n < diff; ++n) {
148 PluginConfigChanged (); /* EMIT SIGNAL */
156 PluginInsert::set_sinks (const ChanCount& c)
159 /* no signal, change will only be visible after re-config */
163 PluginInsert::set_outputs (const ChanCount& c)
165 bool changed = (_custom_out != c) && _custom_cfg;
168 PluginConfigChanged (); /* EMIT SIGNAL */
173 PluginInsert::set_custom_cfg (bool b)
175 bool changed = _custom_cfg != b;
178 PluginConfigChanged (); /* EMIT SIGNAL */
183 PluginInsert::set_preset_out (const ChanCount& c)
185 bool changed = _preset_out != c;
187 if (changed && !_custom_cfg) {
188 PluginConfigChanged (); /* EMIT SIGNAL */
194 PluginInsert::add_sidechain (uint32_t n_audio, uint32_t n_midi)
196 // caller must hold process lock
200 std::ostringstream n;
201 if (n_audio > 0 || n_midi > 0) {
202 n << "Sidechain " << Session::next_name_id ();
204 n << "TO BE RESET FROM XML";
206 SideChain *sc = new SideChain (_session, n.str ());
207 _sidechain = boost::shared_ptr<SideChain> (sc);
208 _sidechain->activate ();
209 for (uint32_t n = 0; n < n_audio; ++n) {
210 _sidechain->input()->add_port ("", owner(), DataType::AUDIO); // add a port, don't connect.
212 for (uint32_t n = 0; n < n_midi; ++n) {
213 _sidechain->input()->add_port ("", owner(), DataType::MIDI); // add a port, don't connect.
215 PluginConfigChanged (); /* EMIT SIGNAL */
220 PluginInsert::del_sidechain ()
226 _sc_playback_latency = 0;
227 _sc_capture_latency = 0;
228 PluginConfigChanged (); /* EMIT SIGNAL */
233 PluginInsert::set_sidechain_latency (uint32_t capture, uint32_t playback)
236 (_sc_playback_latency != playback || _sc_capture_latency != capture)) {
237 _sc_capture_latency = capture;
238 _sc_playback_latency = playback;
239 LatencyRange pl; pl.min = pl.max = playback;
240 LatencyRange cl; cl.min = cl.max = capture;
241 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: capture %2 playback; %3\n", _sidechain->name (), capture, playback));
242 PortSet& ps (_sidechain->input ()->ports ());
243 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
244 p->set_private_latency_range (pl, true);
245 p->set_private_latency_range (cl, false);
251 PluginInsert::control_list_automation_state_changed (Evoral::Parameter which, AutoState s)
253 if (which.type() != PluginAutomation)
256 boost::shared_ptr<AutomationControl> c
257 = boost::dynamic_pointer_cast<AutomationControl>(control (which));
260 _plugins[0]->set_parameter (which.id(), c->list()->eval (_session.transport_frame()));
265 PluginInsert::output_streams() const
267 assert (_configured);
268 return _configured_out;
272 PluginInsert::input_streams() const
274 assert (_configured);
275 return _configured_in;
279 PluginInsert::internal_streams() const
281 assert (_configured);
282 return _configured_internal;
286 PluginInsert::internal_output_streams() const
288 assert (!_plugins.empty());
290 PluginInfoPtr info = _plugins.front()->get_info();
292 if (info->reconfigurable_io()) {
293 ChanCount out = _plugins.front()->output_streams ();
294 // DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, reconfigur(able) output streams = %1\n", out));
297 ChanCount out = info->n_outputs;
298 // DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, static output streams = %1 for %2 plugins\n", out, _plugins.size()));
299 out.set_audio (out.n_audio() * _plugins.size());
300 out.set_midi (out.n_midi() * _plugins.size());
306 PluginInsert::internal_input_streams() const
308 assert (!_plugins.empty());
312 PluginInfoPtr info = _plugins.front()->get_info();
314 if (info->reconfigurable_io()) {
315 in = _plugins.front()->input_streams();
320 DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, input streams = %1, match using %2\n", in, _match.method));
322 if (_match.method == Split) {
324 /* we are splitting 1 processor input to multiple plugin inputs,
325 so we have a maximum of 1 stream of each type.
327 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
328 if (in.get (*t) > 1) {
334 } else if (_match.method == Hide) {
336 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
337 in.set (*t, in.get (*t) - _match.hide.get (*t));
343 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
344 in.set (*t, in.get (*t) * _plugins.size ());
352 PluginInsert::natural_output_streams() const
355 if (is_channelstrip ()) {
356 return ChanCount::min (_configured_out, ChanCount (DataType::AUDIO, 2));
359 return _plugins[0]->get_info()->n_outputs;
363 PluginInsert::natural_input_streams() const
366 if (is_channelstrip ()) {
367 return ChanCount::min (_configured_in, ChanCount (DataType::AUDIO, 2));
370 return _plugins[0]->get_info()->n_inputs;
374 PluginInsert::sidechain_input_pins() const
376 return _cached_sidechain_pins;
380 PluginInsert::has_no_inputs() const
382 return _plugins[0]->get_info()->n_inputs == ChanCount::ZERO;
386 PluginInsert::has_no_audio_inputs() const
388 return _plugins[0]->get_info()->n_inputs.n_audio() == 0;
392 PluginInsert::plugin_latency () const {
393 return _plugins.front()->signal_latency ();
397 PluginInsert::needs_midi_input() const
399 PluginInfoPtr pip = _plugins[0]->get_info();
400 if (pip->needs_midi_input ()) {
403 return pip->n_inputs.n_midi() != 0 && pip->n_outputs.n_audio() != 0;
407 PluginInsert::has_output_presets (ChanCount in, ChanCount out)
409 if (!_configured && _plugins[0]->get_info ()->reconfigurable_io ()) {
410 // collect possible configurations, prefer given in/out
411 _plugins[0]->can_support_io_configuration (in, out);
414 PluginOutputConfiguration ppc (_plugins[0]->possible_output ());
416 if (ppc.size () == 0) {
419 if (!strict_io () && ppc.size () == 1) {
423 if (strict_io () && ppc.size () == 1) {
424 // "stereo" is currently preferred default for instruments
425 if (ppc.find (2) != ppc.end ()) {
429 if (!needs_midi_input ()) {
436 PluginInsert::create_automatable_parameters ()
438 assert (!_plugins.empty());
440 boost::shared_ptr<Plugin> plugin = _plugins.front();
441 set<Evoral::Parameter> a = _plugins.front()->automatable ();
443 for (uint32_t i = 0; i < plugin->parameter_count(); ++i) {
444 if (!plugin->parameter_is_control (i) || !plugin->parameter_is_input (i)) {
447 Evoral::Parameter param (PluginAutomation, 0, i);
449 ParameterDescriptor desc;
450 plugin->get_parameter_descriptor(i, desc);
452 const bool automatable = a.find(param) != a.end();
455 can_automate (param);
457 boost::shared_ptr<AutomationList> list(new AutomationList(param, desc));
458 boost::shared_ptr<AutomationControl> c (new PluginControl(this, param, desc, list));
460 c->set_flags (Controllable::Flag ((int)c->flags() | Controllable::NotAutomatable));
463 plugin->set_automation_control (i, c);
467 const Plugin::PropertyDescriptors& pdl (plugin->get_supported_properties ());
468 for (Plugin::PropertyDescriptors::const_iterator p = pdl.begin(); p != pdl.end(); ++p) {
469 Evoral::Parameter param (PluginPropertyAutomation, 0, p->first);
470 const ParameterDescriptor& desc = plugin->get_property_descriptor(param.id());
471 if (desc.datatype != Variant::NOTHING) {
472 boost::shared_ptr<AutomationList> list;
473 if (Variant::type_is_numeric(desc.datatype)) {
474 list = boost::shared_ptr<AutomationList>(new AutomationList(param, desc));
476 add_control (boost::shared_ptr<AutomationControl> (new PluginPropertyControl(this, param, desc, list)));
480 _bypass_port = plugin->designated_bypass_port ();
482 if (_bypass_port != UINT32_MAX) {
483 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, _bypass_port));
484 if (0 == (ac->flags () & Controllable::NotAutomatable)) {
485 ac->alist()->automation_state_changed.connect_same_thread (*this, boost::bind (&PluginInsert::bypassable_changed, this));
486 ac->Changed.connect_same_thread (*this, boost::bind (&PluginInsert::enable_changed, this));
490 /** Called when something outside of this host has modified a plugin
491 * parameter. Responsible for propagating the change to two places:
493 * 1) anything listening to the Control itself
494 * 2) any replicated plugins that make up this PluginInsert.
496 * The PluginInsert is connected to the ParameterChangedExternally signal for
497 * the first (primary) plugin, and here broadcasts that change to any others.
499 * XXX We should probably drop this whole replication idea (Paul, October 2015)
500 * since it isn't used by sensible plugin APIs (AU, LV2).
503 PluginInsert::parameter_changed_externally (uint32_t which, float val)
505 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, which));
507 /* First propagation: alter the underlying value of the control,
508 * without telling the plugin(s) that own/use it to set it.
515 boost::shared_ptr<PluginControl> pc = boost::dynamic_pointer_cast<PluginControl> (ac);
518 pc->catch_up_with_external_value (val);
521 /* Second propagation: tell all plugins except the first to
522 update the value of this parameter. For sane plugin APIs,
523 there are no other plugins, so this is a no-op in those
527 Plugins::iterator i = _plugins.begin();
529 /* don't set the first plugin, just all the slaves */
531 if (i != _plugins.end()) {
533 for (; i != _plugins.end(); ++i) {
534 (*i)->set_parameter (which, val);
540 PluginInsert::set_block_size (pframes_t nframes)
543 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
544 if ((*i)->set_block_size (nframes) != 0) {
552 PluginInsert::activate ()
554 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
558 Processor::activate ();
559 /* when setting state e.g ProcessorBox::paste_processor_state ()
560 * the plugin is not yet owned by a route.
561 * but no matter. Route::add_processors() will call activate () again
566 if (_plugin_signal_latency != signal_latency ()) {
567 _plugin_signal_latency = signal_latency ();
573 PluginInsert::deactivate ()
575 Processor::deactivate ();
577 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
580 if (_plugin_signal_latency != signal_latency ()) {
581 _plugin_signal_latency = signal_latency ();
587 PluginInsert::flush ()
589 for (vector<boost::shared_ptr<Plugin> >::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
595 PluginInsert::enable (bool yn)
597 if (_bypass_port == UINT32_MAX) {
604 if (!_pending_active) {
607 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, _bypass_port));
608 ac->set_value (yn ? 1.0 : 0.0, Controllable::NoGroup);
614 PluginInsert::enabled () const
616 if (_bypass_port == UINT32_MAX) {
617 return Processor::enabled ();
619 boost::shared_ptr<const AutomationControl> ac = boost::const_pointer_cast<AutomationControl> (automation_control (Evoral::Parameter (PluginAutomation, 0, _bypass_port)));
620 return (ac->get_value () > 0 && _pending_active);
625 PluginInsert::bypassable () const
627 if (_bypass_port == UINT32_MAX) {
630 boost::shared_ptr<const AutomationControl> ac = boost::const_pointer_cast<AutomationControl> (automation_control (Evoral::Parameter (PluginAutomation, 0, _bypass_port)));
632 return !ac->automation_playback ();
637 PluginInsert::enable_changed ()
643 PluginInsert::bypassable_changed ()
645 BypassableChanged ();
649 PluginInsert::inplace_silence_unconnected (BufferSet& bufs, const PinMappings& out_map, framecnt_t nframes, framecnt_t offset) const
651 // TODO optimize: store "unconnected" in a fixed set.
652 // it only changes on reconfiguration.
653 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
654 for (uint32_t out = 0; out < bufs.count().get (*t); ++out) {
656 if (*t == DataType::MIDI && out == 0 && has_midi_bypass ()) {
657 mapped = true; // in-place Midi bypass
659 for (uint32_t pc = 0; pc < get_count() && !mapped; ++pc) {
660 PinMappings::const_iterator i = out_map.find (pc);
661 if (i == out_map.end ()) {
664 const ChanMapping& outmap (i->second);
665 for (uint32_t o = 0; o < natural_output_streams().get (*t); ++o) {
667 uint32_t idx = outmap.get (*t, o, &valid);
668 if (valid && idx == out) {
675 bufs.get (*t, out).silence (nframes, offset);
682 PluginInsert::connect_and_run (BufferSet& bufs, framepos_t start, framepos_t end, double speed, pframes_t nframes, framecnt_t offset, bool with_auto)
684 // TODO: atomically copy maps & _no_inplace
685 PinMappings in_map (_in_map);
686 PinMappings out_map (_out_map);
687 ChanMapping thru_map (_thru_map);
688 if (_mapping_changed) { // ToDo use a counters, increment until match.
689 _no_inplace = check_inplace ();
690 _mapping_changed = false;
693 if (_latency_changed) {
694 /* delaylines are configured with the max possible latency (as reported by the plugin)
695 * so this won't allocate memory (unless the plugin lied about its max latency)
696 * It may still 'click' though, since the fixed delaylines are not de-clicked.
697 * Then again plugin-latency changes are not click-free to begin with.
699 * This is also worst case, there is currently no concept of per-stream latency.
701 * e.g. Two identical latent plugins:
702 * 1st plugin: process left (latent), bypass right.
703 * 2nd plugin: bypass left, process right (latent).
704 * -> currently this yields 2 times latency of the plugin,
706 _latency_changed = false;
707 _delaybuffers.set (ChanCount::max(bufs.count(), _configured_out), plugin_latency ());
710 if (_match.method == Split && !_no_inplace) {
711 // TODO: also use this optimization if one source-buffer
712 // feeds _all_ *connected* inputs.
713 // currently this is *first* buffer to all only --
714 // see PluginInsert::check_inplace
715 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
716 if (_configured_internal.get (*t) == 0) {
720 uint32_t first_idx = in_map[0].get (*t, 0, &valid);
721 assert (valid && first_idx == 0); // check_inplace ensures this
722 /* copy the first stream's buffer contents to the others */
723 for (uint32_t i = 1; i < natural_input_streams ().get (*t); ++i) {
724 uint32_t idx = in_map[0].get (*t, i, &valid);
727 bufs.get (*t, i).read_from (bufs.get (*t, first_idx), nframes, offset, offset);
731 /* the copy operation produces a linear monotonic input map */
732 in_map[0] = ChanMapping (natural_input_streams ());
735 bufs.set_count(ChanCount::max(bufs.count(), _configured_internal));
736 bufs.set_count(ChanCount::max(bufs.count(), _configured_out));
742 for (Controls::iterator li = controls().begin(); li != controls().end(); ++li, ++n) {
744 boost::shared_ptr<AutomationControl> c
745 = boost::dynamic_pointer_cast<AutomationControl>(li->second);
747 if (c->list() && c->automation_playback()) {
750 const float val = c->list()->rt_safe_eval (start, valid);
753 /* This is the ONLY place where we are
755 * AutomationControl::set_value_unchecked(). We
756 * know that the control is in
757 * automation playback mode, so no
758 * check on writable() is required
759 * (which must be done in AutomationControl::set_value()
762 c->set_value_unchecked(val);
769 /* Calculate if, and how many frames we need to collect for analysis */
770 framecnt_t collect_signal_nframes = (_signal_analysis_collect_nframes_max -
771 _signal_analysis_collected_nframes);
772 if (nframes < collect_signal_nframes) { // we might not get all frames now
773 collect_signal_nframes = nframes;
776 if (collect_signal_nframes > 0) {
778 //std::cerr << "collect input, bufs " << bufs.count().n_audio() << " count, " << bufs.available().n_audio() << " available" << std::endl;
779 //std::cerr << " streams " << internal_input_streams().n_audio() << std::endl;
780 //std::cerr << "filling buffer with " << collect_signal_nframes << " frames at " << _signal_analysis_collected_nframes << std::endl;
782 _signal_analysis_inputs.set_count(input_streams());
784 for (uint32_t i = 0; i < input_streams().n_audio(); ++i) {
785 _signal_analysis_inputs.get_audio(i).read_from (
787 collect_signal_nframes,
788 _signal_analysis_collected_nframes); // offset is for target buffer
793 if (is_channelstrip ()) {
794 if (_configured_in.n_audio() > 0) {
795 ChanMapping mb_in_map (ChanCount::min (_configured_in, ChanCount (DataType::AUDIO, 2)));
796 ChanMapping mb_out_map (ChanCount::min (_configured_out, ChanCount (DataType::AUDIO, 2)));
798 _plugins.front()->connect_and_run (bufs, start, end, speed, mb_in_map, mb_out_map, nframes, offset);
800 for (uint32_t out = _configured_in.n_audio (); out < bufs.count().get (DataType::AUDIO); ++out) {
801 bufs.get (DataType::AUDIO, out).silence (nframes, offset);
807 // TODO optimize -- build maps once.
809 BufferSet& inplace_bufs = _session.get_noinplace_buffers();
810 ARDOUR::ChanMapping used_outputs;
812 assert (inplace_bufs.count () >= natural_input_streams () + _configured_out);
814 /* build used-output map */
815 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
816 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
817 for (uint32_t out = 0; out < natural_output_streams().get (*t); ++out) {
819 uint32_t out_idx = out_map[pc].get (*t, out, &valid);
821 used_outputs.set (*t, out_idx, 1); // mark as used
826 /* copy thru data to outputs before processing in-place */
827 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
828 for (uint32_t out = 0; out < bufs.count().get (*t); ++out) {
830 uint32_t in_idx = thru_map.get (*t, out, &valid);
831 uint32_t m = out + natural_input_streams ().get (*t);
833 _delaybuffers.delay (*t, out, inplace_bufs.get (*t, m), bufs.get (*t, in_idx), nframes, offset, offset);
834 used_outputs.set (*t, out, 1); // mark as used
836 used_outputs.get (*t, out, &valid);
838 /* the plugin is expected to write here, but may not :(
839 * (e.g. drumgizmo w/o kit loaded)
841 inplace_bufs.get (*t, m).silence (nframes);
848 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
850 ARDOUR::ChanMapping i_in_map (natural_input_streams());
851 ARDOUR::ChanMapping i_out_map (out_map[pc]);
852 ARDOUR::ChanCount mapped;
854 /* map inputs sequentially */
855 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
856 for (uint32_t in = 0; in < natural_input_streams().get (*t); ++in) {
858 uint32_t in_idx = in_map[pc].get (*t, in, &valid);
859 uint32_t m = mapped.get (*t);
861 inplace_bufs.get (*t, m).read_from (bufs.get (*t, in_idx), nframes, offset, offset);
863 inplace_bufs.get (*t, m).silence (nframes, offset);
865 mapped.set (*t, m + 1);
869 /* outputs are mapped to inplace_bufs after the inputs */
870 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
871 i_out_map.offset_to (*t, natural_input_streams ().get (*t));
874 if ((*i)->connect_and_run (inplace_bufs, start, end, speed, i_in_map, i_out_map, nframes, offset)) {
879 /* all instances have completed, now copy data that was written
880 * and zero unconnected buffers */
881 ARDOUR::ChanMapping nonzero_out (used_outputs);
882 if (has_midi_bypass ()) {
883 nonzero_out.set (DataType::MIDI, 0, 1); // Midi bypass.
885 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
886 for (uint32_t out = 0; out < bufs.count().get (*t); ++out) {
888 used_outputs.get (*t, out, &valid);
890 nonzero_out.get (*t, out, &valid);
892 bufs.get (*t, out).silence (nframes, offset);
895 uint32_t m = out + natural_input_streams ().get (*t);
896 bufs.get (*t, out).read_from (inplace_bufs.get (*t, m), nframes, offset, offset);
901 /* in-place processing */
903 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
904 if ((*i)->connect_and_run(bufs, start, end, speed, in_map[pc], out_map[pc], nframes, offset)) {
908 // now silence unconnected outputs
909 inplace_silence_unconnected (bufs, _out_map, nframes, offset);
912 if (collect_signal_nframes > 0) {
914 //std::cerr << " output, bufs " << bufs.count().n_audio() << " count, " << bufs.available().n_audio() << " available" << std::endl;
915 //std::cerr << " streams " << internal_output_streams().n_audio() << std::endl;
917 _signal_analysis_outputs.set_count(output_streams());
919 for (uint32_t i = 0; i < output_streams().n_audio(); ++i) {
920 _signal_analysis_outputs.get_audio(i).read_from(
922 collect_signal_nframes,
923 _signal_analysis_collected_nframes); // offset is for target buffer
926 _signal_analysis_collected_nframes += collect_signal_nframes;
927 assert(_signal_analysis_collected_nframes <= _signal_analysis_collect_nframes_max);
929 if (_signal_analysis_collected_nframes == _signal_analysis_collect_nframes_max) {
930 _signal_analysis_collect_nframes_max = 0;
931 _signal_analysis_collected_nframes = 0;
933 AnalysisDataGathered(&_signal_analysis_inputs,
934 &_signal_analysis_outputs);
938 if (_plugin_signal_latency != signal_latency ()) {
939 _plugin_signal_latency = signal_latency ();
945 PluginInsert::bypass (BufferSet& bufs, pframes_t nframes)
947 /* bypass the plugin(s) not the whole processor.
948 * -> use mappings just like connect_and_run
951 // TODO: atomically copy maps & _no_inplace
952 const ChanMapping in_map (no_sc_input_map ());
953 const ChanMapping out_map (output_map ());
954 if (_mapping_changed) {
955 _no_inplace = check_inplace ();
956 _mapping_changed = false;
959 bufs.set_count(ChanCount::max(bufs.count(), _configured_internal));
960 bufs.set_count(ChanCount::max(bufs.count(), _configured_out));
963 ChanMapping thru_map (_thru_map);
965 BufferSet& inplace_bufs = _session.get_noinplace_buffers();
967 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
968 for (uint32_t in = 0; in < _configured_internal.get (*t); ++in) {
969 inplace_bufs.get (*t, in).read_from (bufs.get (*t, in), nframes, 0, 0);
972 ARDOUR::ChanMapping used_outputs;
974 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
975 for (uint32_t out = 0; out < _configured_out.get (*t); ++out) {
977 uint32_t in_idx = thru_map.get (*t, out, &valid);
979 bufs.get (*t, out).read_from (inplace_bufs.get (*t, in_idx), nframes, 0, 0);
980 used_outputs.set (*t, out, 1); // mark as used
984 // plugin no-op: assume every plugin has an internal identity map
985 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
986 for (uint32_t out = 0; out < _configured_out.get (*t); ++out) {
988 uint32_t src_idx = out_map.get_src (*t, out, &valid);
992 uint32_t in_idx = in_map.get (*t, src_idx, &valid);
996 bufs.get (*t, out).read_from (inplace_bufs.get (*t, in_idx), nframes, 0, 0);
997 used_outputs.set (*t, out, 1); // mark as used
1000 // now silence all unused outputs
1001 if (has_midi_bypass ()) {
1002 used_outputs.set (DataType::MIDI, 0, 1); // Midi bypass.
1004 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1005 for (uint32_t out = 0; out < _configured_out.get (*t); ++out) {
1007 used_outputs.get (*t, out, &valid);
1009 bufs.get (*t, out).silence (nframes, 0);
1014 if (_match.method == Split) {
1015 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1016 if (_configured_internal.get (*t) == 0) {
1019 // copy/feeds _all_ *connected* inputs, copy the first buffer
1021 uint32_t first_idx = in_map.get (*t, 0, &valid);
1022 assert (valid && first_idx == 0); // check_inplace ensures this
1023 for (uint32_t i = 1; i < natural_input_streams ().get (*t); ++i) {
1024 uint32_t idx = in_map.get (*t, i, &valid);
1027 bufs.get (*t, i).read_from (bufs.get (*t, first_idx), nframes, 0, 0);
1033 // apply output map and/or monotonic but not identity i/o mappings
1034 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1035 for (uint32_t out = 0; out < _configured_out.get (*t); ++out) {
1037 uint32_t src_idx = out_map.get_src (*t, out, &valid);
1039 bufs.get (*t, out).silence (nframes, 0);
1042 uint32_t in_idx = in_map.get (*t, src_idx, &valid);
1044 bufs.get (*t, out).silence (nframes, 0);
1047 if (in_idx != src_idx) {
1048 bufs.get (*t, out).read_from (bufs.get (*t, in_idx), nframes, 0, 0);
1056 PluginInsert::silence (framecnt_t nframes, framepos_t start_frame)
1062 _delaybuffers.flush ();
1064 ChanMapping in_map (natural_input_streams ());
1065 ChanMapping out_map (natural_output_streams ());
1066 ChanCount maxbuf = ChanCount::max (natural_input_streams (), natural_output_streams());
1068 if (is_channelstrip ()) {
1069 if (_configured_in.n_audio() > 0) {
1070 _plugins.front()->connect_and_run (_session.get_scratch_buffers (maxbuf, true), start_frame, start_frame + nframes, 1.0, in_map, out_map, nframes, 0);
1074 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1075 (*i)->connect_and_run (_session.get_scratch_buffers (maxbuf, true), start_frame, start_frame + nframes, 1.0, in_map, out_map, nframes, 0);
1080 PluginInsert::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, double speed, pframes_t nframes, bool)
1083 // collect sidechain input for complete cycle (!)
1084 // TODO we need delaylines here for latency compensation
1085 _sidechain->run (bufs, start_frame, end_frame, speed, nframes, true);
1088 if (_pending_active) {
1089 /* run as normal if we are active or moving from inactive to active */
1091 if (_session.transport_rolling() || _session.bounce_processing()) {
1092 automation_run (bufs, start_frame, end_frame, speed, nframes);
1094 Glib::Threads::Mutex::Lock lm (control_lock(), Glib::Threads::TRY_LOCK);
1095 connect_and_run (bufs, start_frame, end_frame, speed, nframes, 0, lm.locked());
1099 bypass (bufs, nframes);
1100 _delaybuffers.flush ();
1103 _active = _pending_active;
1105 /* we have no idea whether the plugin generated silence or not, so mark
1106 * all buffers appropriately.
1111 PluginInsert::automation_run (BufferSet& bufs, framepos_t start, framepos_t end, double speed, pframes_t nframes)
1113 Evoral::ControlEvent next_event (0, 0.0f);
1114 framecnt_t offset = 0;
1116 Glib::Threads::Mutex::Lock lm (control_lock(), Glib::Threads::TRY_LOCK);
1119 connect_and_run (bufs, start, end, speed, nframes, offset, false);
1123 if (!find_next_event (start, end, next_event) || _plugins.front()->requires_fixed_sized_buffers()) {
1125 /* no events have a time within the relevant range */
1127 connect_and_run (bufs, start, end, speed, nframes, offset, true);
1133 framecnt_t cnt = min (((framecnt_t) ceil (next_event.when) - start), (framecnt_t) nframes);
1135 connect_and_run (bufs, start, start + cnt, speed, cnt, offset, true); // XXX (start + cnt) * speed
1141 if (!find_next_event (start, end, next_event)) {
1146 /* cleanup anything that is left to do */
1149 connect_and_run (bufs, start, start + nframes, speed, nframes, offset, true);
1154 PluginInsert::default_parameter_value (const Evoral::Parameter& param)
1156 if (param.type() != PluginAutomation)
1159 if (_plugins.empty()) {
1160 fatal << _("programming error: ") << X_("PluginInsert::default_parameter_value() called with no plugin")
1162 abort(); /*NOTREACHED*/
1165 return _plugins[0]->default_value (param.id());
1170 PluginInsert::can_reset_all_parameters ()
1173 uint32_t params = 0;
1174 for (uint32_t par = 0; par < _plugins[0]->parameter_count(); ++par) {
1176 const uint32_t cid = _plugins[0]->nth_parameter (par, ok);
1178 if (!ok || !_plugins[0]->parameter_is_input(cid)) {
1182 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, cid));
1188 if (ac->automation_state() & Play) {
1193 return all && (params > 0);
1197 PluginInsert::reset_parameters_to_default ()
1201 for (uint32_t par = 0; par < _plugins[0]->parameter_count(); ++par) {
1203 const uint32_t cid = _plugins[0]->nth_parameter (par, ok);
1205 if (!ok || !_plugins[0]->parameter_is_input(cid)) {
1209 const float dflt = _plugins[0]->default_value (cid);
1210 const float curr = _plugins[0]->get_parameter (cid);
1216 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, cid));
1221 if (ac->automation_state() & Play) {
1226 ac->set_value (dflt, Controllable::NoGroup);
1231 boost::shared_ptr<Plugin>
1232 PluginInsert::plugin_factory (boost::shared_ptr<Plugin> other)
1234 boost::shared_ptr<LadspaPlugin> lp;
1235 boost::shared_ptr<LuaProc> lua;
1237 boost::shared_ptr<LV2Plugin> lv2p;
1239 #ifdef WINDOWS_VST_SUPPORT
1240 boost::shared_ptr<WindowsVSTPlugin> vp;
1242 #ifdef LXVST_SUPPORT
1243 boost::shared_ptr<LXVSTPlugin> lxvp;
1245 #ifdef AUDIOUNIT_SUPPORT
1246 boost::shared_ptr<AUPlugin> ap;
1249 if ((lp = boost::dynamic_pointer_cast<LadspaPlugin> (other)) != 0) {
1250 return boost::shared_ptr<Plugin> (new LadspaPlugin (*lp));
1251 } else if ((lua = boost::dynamic_pointer_cast<LuaProc> (other)) != 0) {
1252 return boost::shared_ptr<Plugin> (new LuaProc (*lua));
1254 } else if ((lv2p = boost::dynamic_pointer_cast<LV2Plugin> (other)) != 0) {
1255 return boost::shared_ptr<Plugin> (new LV2Plugin (*lv2p));
1257 #ifdef WINDOWS_VST_SUPPORT
1258 } else if ((vp = boost::dynamic_pointer_cast<WindowsVSTPlugin> (other)) != 0) {
1259 return boost::shared_ptr<Plugin> (new WindowsVSTPlugin (*vp));
1261 #ifdef LXVST_SUPPORT
1262 } else if ((lxvp = boost::dynamic_pointer_cast<LXVSTPlugin> (other)) != 0) {
1263 return boost::shared_ptr<Plugin> (new LXVSTPlugin (*lxvp));
1265 #ifdef AUDIOUNIT_SUPPORT
1266 } else if ((ap = boost::dynamic_pointer_cast<AUPlugin> (other)) != 0) {
1267 return boost::shared_ptr<Plugin> (new AUPlugin (*ap));
1271 fatal << string_compose (_("programming error: %1"),
1272 X_("unknown plugin type in PluginInsert::plugin_factory"))
1274 abort(); /*NOTREACHED*/
1275 return boost::shared_ptr<Plugin> ((Plugin*) 0);
1279 PluginInsert::set_input_map (uint32_t num, ChanMapping m) {
1280 if (num < _in_map.size()) {
1281 bool changed = _in_map[num] != m;
1283 changed |= sanitize_maps ();
1285 PluginMapChanged (); /* EMIT SIGNAL */
1286 _mapping_changed = true;
1287 _session.set_dirty();
1293 PluginInsert::set_output_map (uint32_t num, ChanMapping m) {
1294 if (num < _out_map.size()) {
1295 bool changed = _out_map[num] != m;
1297 changed |= sanitize_maps ();
1299 PluginMapChanged (); /* EMIT SIGNAL */
1300 _mapping_changed = true;
1301 _session.set_dirty();
1307 PluginInsert::set_thru_map (ChanMapping m) {
1308 bool changed = _thru_map != m;
1310 changed |= sanitize_maps ();
1312 PluginMapChanged (); /* EMIT SIGNAL */
1313 _mapping_changed = true;
1314 _session.set_dirty();
1319 PluginInsert::pre_seed (const ChanCount& in, const ChanCount& out,
1320 const ChanMapping& im, const ChanMapping& om, const ChanMapping& tm)
1322 if (_configured) { return false; }
1323 _configured_in = in;
1324 _configured_out = out;
1328 _maps_from_state = in.n_total () > 0 && out.n_total () > 0;
1333 PluginInsert::input_map () const
1337 for (PinMappings::const_iterator i = _in_map.begin (); i != _in_map.end (); ++i, ++pc) {
1338 ChanMapping m (i->second);
1339 const ChanMapping::Mappings& mp ((*i).second.mappings());
1340 for (ChanMapping::Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
1341 for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
1342 rv.set (tm->first, i->first + pc * natural_input_streams().get(tm->first), i->second);
1351 PluginInsert::no_sc_input_map () const
1355 for (PinMappings::const_iterator i = _in_map.begin (); i != _in_map.end (); ++i, ++pc) {
1356 ChanMapping m (i->second);
1357 const ChanMapping::Mappings& mp ((*i).second.mappings());
1358 for (ChanMapping::Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
1359 uint32_t ins = natural_input_streams().get(tm->first) - _cached_sidechain_pins.get(tm->first);
1360 for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
1361 if (i->first < ins) {
1362 rv.set (tm->first, i->first + pc * ins, i->second);
1371 PluginInsert::output_map () const
1375 for (PinMappings::const_iterator i = _out_map.begin (); i != _out_map.end (); ++i, ++pc) {
1376 ChanMapping m (i->second);
1377 const ChanMapping::Mappings& mp ((*i).second.mappings());
1378 for (ChanMapping::Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
1379 for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
1380 rv.set (tm->first, i->first + pc * natural_output_streams().get(tm->first), i->second);
1384 if (has_midi_bypass ()) {
1385 rv.set (DataType::MIDI, 0, 0);
1392 PluginInsert::has_midi_bypass () const
1394 if (_configured_in.n_midi () == 1 && _configured_out.n_midi () == 1
1395 && natural_output_streams ().n_midi () == 0) {
1402 PluginInsert::has_midi_thru () const
1404 if (_configured_in.n_midi () == 1 && _configured_out.n_midi () == 1
1405 && natural_input_streams ().n_midi () == 0 && natural_output_streams ().n_midi () == 0) {
1413 PluginInsert::is_channelstrip () const {
1414 return _plugins.front()->is_channelstrip();
1419 PluginInsert::check_inplace ()
1421 bool inplace_ok = !_plugins.front()->inplace_broken ();
1423 if (_thru_map.n_total () > 0) {
1424 // TODO once midi-bypass is part of the mapping, ignore it
1428 if (_match.method == Split && inplace_ok) {
1429 assert (get_count() == 1);
1430 assert (_in_map.size () == 1);
1431 if (!_out_map[0].is_monotonic ()) {
1434 if (_configured_internal != _configured_in) {
1435 /* no sidechain -- TODO we could allow this with
1436 * some more logic in PluginInsert::connect_and_run().
1438 * PluginInsert::reset_map() already maps it.
1443 for (DataType::iterator t = DataType::begin(); t != DataType::end() && inplace_ok; ++t) {
1444 if (_configured_internal.get (*t) == 0) {
1448 uint32_t first_idx = _in_map[0].get (*t, 0, &valid);
1449 if (!valid || first_idx != 0) {
1450 // so far only allow to copy the *first* stream's buffer to others
1453 for (uint32_t i = 1; i < natural_input_streams ().get (*t); ++i) {
1454 uint32_t idx = _in_map[0].get (*t, i, &valid);
1455 if (valid && idx != first_idx) {
1464 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: In Place Split Map\n", name()));
1469 for (uint32_t pc = 0; pc < get_count() && inplace_ok ; ++pc) {
1470 if (!_in_map[pc].is_monotonic ()) {
1473 if (!_out_map[pc].is_monotonic ()) {
1479 /* check if every output is fed by the corresponding input
1481 * this prevents in-port 1 -> sink-pin 2 || source-pin 1 -> out port 1, source-pin 2 -> out port 2
1482 * (with in-place, source-pin 1 -> out port 1 overwrites in-port 1)
1484 * but allows in-port 1 -> sink-pin 2 || source-pin 2 -> out port 1
1486 ChanMapping in_map (input_map ());
1487 const ChanMapping::Mappings out_m (output_map ().mappings ());
1488 for (ChanMapping::Mappings::const_iterator t = out_m.begin (); t != out_m.end () && inplace_ok; ++t) {
1489 for (ChanMapping::TypeMapping::const_iterator c = (*t).second.begin (); c != (*t).second.end () ; ++c) {
1490 /* src-pin: c->first, out-port: c->second */
1492 uint32_t in_port = in_map.get (t->first, c->first, &valid);
1493 if (valid && in_port != c->second) {
1501 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: %2\n", name(), inplace_ok ? "In-Place" : "No Inplace Processing"));
1502 return !inplace_ok; // no-inplace
1506 PluginInsert::sanitize_maps ()
1508 bool changed = false;
1509 /* strip dead wood */
1510 PinMappings new_ins;
1511 PinMappings new_outs;
1512 ChanMapping new_thru;
1514 for (uint32_t pc = 0; pc < get_count(); ++pc) {
1516 ChanMapping new_out;
1517 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1518 for (uint32_t i = 0; i < natural_input_streams().get (*t); ++i) {
1520 uint32_t idx = _in_map[pc].get (*t, i, &valid);
1521 if (valid && idx < _configured_internal.get (*t)) {
1522 new_in.set (*t, i, idx);
1525 for (uint32_t o = 0; o < natural_output_streams().get (*t); ++o) {
1527 uint32_t idx = _out_map[pc].get (*t, o, &valid);
1528 if (valid && idx < _configured_out.get (*t)) {
1529 new_out.set (*t, o, idx);
1533 if (_in_map[pc] != new_in || _out_map[pc] != new_out) {
1536 new_ins[pc] = new_in;
1537 new_outs[pc] = new_out;
1540 /* prevent dup output assignments */
1541 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1542 for (uint32_t o = 0; o < _configured_out.get (*t); ++o) {
1543 bool mapped = false;
1544 for (uint32_t pc = 0; pc < get_count(); ++pc) {
1546 uint32_t idx = new_outs[pc].get_src (*t, o, &valid);
1547 if (valid && mapped) {
1548 new_outs[pc].unset (*t, idx);
1556 /* remove excess thru */
1557 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1558 for (uint32_t o = 0; o < _configured_out.get (*t); ++o) {
1560 uint32_t idx = _thru_map.get (*t, o, &valid);
1561 if (valid && idx < _configured_internal.get (*t)) {
1562 new_thru.set (*t, o, idx);
1567 /* prevent out + thru, existing plugin outputs override thru */
1568 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1569 for (uint32_t o = 0; o < _configured_out.get (*t); ++o) {
1570 bool mapped = false;
1572 for (uint32_t pc = 0; pc < get_count(); ++pc) {
1573 new_outs[pc].get_src (*t, o, &mapped);
1574 if (mapped) { break; }
1576 if (!mapped) { continue; }
1577 uint32_t idx = new_thru.get (*t, o, &valid);
1579 new_thru.unset (*t, idx);
1584 if (has_midi_bypass ()) {
1585 // TODO: include midi-bypass in the thru set,
1586 // remove dedicated handling.
1587 new_thru.unset (DataType::MIDI, 0);
1590 if (_in_map != new_ins || _out_map != new_outs || _thru_map != new_thru) {
1594 _out_map = new_outs;
1595 _thru_map = new_thru;
1601 PluginInsert::reset_map (bool emit)
1603 const PinMappings old_in (_in_map);
1604 const PinMappings old_out (_out_map);
1608 _thru_map = ChanMapping ();
1610 /* build input map */
1611 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1612 uint32_t sc = 0; // side-chain round-robin (all instances)
1614 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
1615 const uint32_t nis = natural_input_streams ().get(*t);
1616 const uint32_t stride = nis - sidechain_input_pins().get (*t);
1618 /* SC inputs are last in the plugin-insert.. */
1619 const uint32_t sc_start = _configured_in.get (*t);
1620 const uint32_t sc_len = _configured_internal.get (*t) - sc_start;
1621 /* ...but may not be at the end of the plugin ports.
1622 * in case the side-chain is not the last port, shift connections back.
1623 * and connect to side-chain
1626 uint32_t ic = 0; // split inputs
1627 const uint32_t cend = _configured_in.get (*t);
1629 for (uint32_t in = 0; in < nis; ++in) {
1630 const Plugin::IOPortDescription& iod (_plugins[pc]->describe_io_port (*t, true, in));
1631 if (iod.is_sidechain) {
1632 /* connect sidechain sinks to sidechain inputs in round-robin fashion */
1633 if (sc_len > 0) {// side-chain may be hidden
1634 _in_map[pc].set (*t, in, sc_start + sc);
1635 sc = (sc + 1) % sc_len;
1639 if (_match.method == Split) {
1640 if (cend == 0) { continue; }
1641 if (_strict_io && ic + stride * pc >= cend) {
1644 /* connect *no* sidechain sinks in round-robin fashion */
1645 _in_map[pc].set (*t, in, ic + stride * pc);
1646 if (_strict_io && (ic + 1) == cend) {
1649 ic = (ic + 1) % cend;
1651 uint32_t s = in - shift;
1652 if (stride * pc + s < cend) {
1653 _in_map[pc].set (*t, in, s + stride * pc);
1661 /* build output map */
1663 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
1664 _out_map[pc] = ChanMapping (ChanCount::min (natural_output_streams(), _configured_out));
1665 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1666 _out_map[pc].offset_to(*t, pc * natural_output_streams().get(*t));
1671 if (old_in == _in_map && old_out == _out_map) {
1675 PluginMapChanged (); /* EMIT SIGNAL */
1676 _mapping_changed = true;
1677 _session.set_dirty();
1683 PluginInsert::configure_io (ChanCount in, ChanCount out)
1685 Match old_match = _match;
1687 ChanCount old_internal;
1691 old_pins = natural_input_streams();
1692 old_in = _configured_in;
1693 old_out = _configured_out;
1694 old_internal = _configured_internal;
1696 _configured_in = in;
1697 _configured_internal = in;
1698 _configured_out = out;
1701 /* TODO hide midi-bypass, and custom outs. Best /fake/ "out" here.
1702 * (currently _sidechain->configure_io always succeeds
1703 * since Processor::configure_io() succeeds)
1705 if (!_sidechain->configure_io (in, out)) {
1706 DEBUG_TRACE (DEBUG::ChanMapping, "Sidechain configuration failed\n");
1709 _configured_internal += _sidechain->input()->n_ports();
1711 // include (static_cast<Route*>owner())->name() ??
1712 _sidechain->input ()-> set_pretty_name (string_compose (_("SC %1"), name ()));
1715 /* get plugin configuration */
1716 _match = private_can_support_io_configuration (in, out);
1718 if (DEBUG_ENABLED(DEBUG::ChanMapping)) {
1720 DEBUG_STR_APPEND(a, string_compose ("%1: ", name()));
1721 DEBUG_STR_APPEND(a, _match);
1722 DEBUG_TRACE (DEBUG::ChanMapping, DEBUG_STR(a).str());
1726 /* set the matching method and number of plugins that we will use to meet this configuration */
1727 if (set_count (_match.plugins) == false) {
1728 PluginIoReConfigure (); /* EMIT SIGNAL */
1729 _configured = false;
1733 /* configure plugins */
1734 switch (_match.method) {
1737 if (_plugins.front()->configure_io (natural_input_streams(), out) == false) {
1738 PluginIoReConfigure (); /* EMIT SIGNAL */
1739 _configured = false;
1745 ChanCount din (_configured_internal);
1746 ChanCount dout (din); // hint
1748 if (_custom_sinks.n_total () > 0) {
1749 din = _custom_sinks;
1752 } else if (_preset_out.n_audio () > 0) {
1753 dout.set (DataType::AUDIO, _preset_out.n_audio ());
1754 } else if (dout.n_midi () > 0 && dout.n_audio () == 0) {
1755 dout.set (DataType::AUDIO, 2);
1757 if (out.n_audio () == 0) { out.set (DataType::AUDIO, 1); }
1759 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: Delegate lookup : %2 %3\n", name(), din, dout));
1760 bool const r = _plugins.front()->can_support_io_configuration (din, dout, &useins);
1762 if (useins.n_audio() == 0) {
1765 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: Delegate configuration: %2 %3\n", name(), useins, dout));
1767 if (_plugins.front()->configure_io (useins, dout) == false) {
1768 PluginIoReConfigure (); /* EMIT SIGNAL */
1769 _configured = false;
1773 _custom_sinks = din;
1778 if (_plugins.front()->configure_io (in, out) == false) {
1779 PluginIoReConfigure (); /* EMIT SIGNAL */
1780 _configured = false;
1786 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",
1788 _configured ? "Y" : "N",
1789 _maps_from_state ? "Y" : "N",
1790 old_in == in ? "==" : "!=",
1791 old_out == out ? "==" : "!=",
1792 old_pins == natural_input_streams () ? "==" : "!=",
1793 old_match.method == _match.method ? "==" : "!=",
1794 old_match.custom_cfg == _match.custom_cfg ? "==" : "!=",
1795 _in_map.size() == get_count () ? "==" : "!=",
1796 _out_map.size() == get_count () ? "==" : "!="
1799 bool mapping_changed = false;
1800 if (old_in == in && old_out == out
1802 && old_pins == natural_input_streams ()
1803 && old_match.method == _match.method
1804 && old_match.custom_cfg == _match.custom_cfg
1805 && _in_map.size() == _out_map.size()
1806 && _in_map.size() == get_count ()
1808 assert (_maps_from_state == false);
1809 /* If the configuration has not changed, keep the mapping */
1810 mapping_changed = sanitize_maps ();
1811 } else if (_match.custom_cfg && _configured) {
1812 assert (_maps_from_state == false);
1813 /* don't touch the map in manual mode */
1814 mapping_changed = sanitize_maps ();
1817 if (is_channelstrip ()) {
1818 /* fake channel map - for wire display */
1821 _thru_map = ChanMapping ();
1822 _in_map[0] = ChanMapping (ChanCount::min (_configured_in, ChanCount (DataType::AUDIO, 2)));
1823 _out_map[0] = ChanMapping (ChanCount::min (_configured_out, ChanCount (DataType::AUDIO, 2)));
1824 /* set "thru" map for in-place forward of audio */
1825 for (uint32_t i = 2; i < _configured_in.n_audio(); ++i) {
1826 _thru_map.set (DataType::AUDIO, i, i);
1828 /* and midi (after implicit 1st channel bypass) */
1829 for (uint32_t i = 1; i < _configured_in.n_midi(); ++i) {
1830 _thru_map.set (DataType::MIDI, i, i);
1834 if (_maps_from_state && old_in == in && old_out == out) {
1835 mapping_changed = true;
1838 /* generate a new mapping */
1839 mapping_changed = reset_map (false);
1841 _maps_from_state = false;
1844 if (mapping_changed) {
1845 PluginMapChanged (); /* EMIT SIGNAL */
1848 if (DEBUG_ENABLED(DEBUG::ChanMapping)) {
1851 DEBUG_STR_APPEND(a, "\n--------<<--------\n");
1852 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
1854 DEBUG_STR_APPEND(a, "----><----\n");
1856 DEBUG_STR_APPEND(a, string_compose ("Channel Map for %1 plugin %2\n", name(), pc));
1857 DEBUG_STR_APPEND(a, " * Inputs:\n");
1858 DEBUG_STR_APPEND(a, _in_map[pc]);
1859 DEBUG_STR_APPEND(a, " * Outputs:\n");
1860 DEBUG_STR_APPEND(a, _out_map[pc]);
1862 DEBUG_STR_APPEND(a, " * Thru:\n");
1863 DEBUG_STR_APPEND(a, _thru_map);
1864 DEBUG_STR_APPEND(a, "-------->>--------\n");
1865 DEBUG_TRACE (DEBUG::ChanMapping, DEBUG_STR(a).str());
1870 _no_inplace = check_inplace ();
1871 _mapping_changed = false;
1873 /* only the "noinplace_buffers" thread buffers need to be this large,
1874 * this can be optimized. other buffers are fine with
1875 * ChanCount::max (natural_input_streams (), natural_output_streams())
1876 * and route.cc's max (configured_in, configured_out)
1878 * no-inplace copies "thru" outputs (to emulate in-place) for
1879 * all outputs (to prevent overwrite) into a temporary space
1880 * which also holds input buffers (in case the plugin does process
1881 * in-place and overwrites those).
1883 * this buffers need to be at least as
1884 * natural_input_streams () + possible outputs.
1886 * sidechain inputs add a constraint on the input:
1887 * configured input + sidechain (=_configured_internal)
1889 * NB. this also satisfies
1890 * max (natural_input_streams(), natural_output_streams())
1891 * which is needed for silence runs
1893 _required_buffers = ChanCount::max (_configured_internal,
1894 natural_input_streams () + ChanCount::max (_configured_out, natural_output_streams () * get_count ()));
1896 if (old_in != in || old_out != out || old_internal != _configured_internal
1897 || old_pins != natural_input_streams ()
1898 || (old_match.method != _match.method && (old_match.method == Split || _match.method == Split))
1900 PluginIoReConfigure (); /* EMIT SIGNAL */
1903 _delaybuffers.configure (_configured_out, _plugins.front ()->max_latency ());
1904 _latency_changed = true;
1906 // we don't know the analysis window size, so we must work with the
1907 // current buffer size here. each request for data fills in these
1908 // buffers and the analyser makes sure it gets enough data for the
1910 session().ensure_buffer_set (_signal_analysis_inputs, in);
1911 _signal_analysis_inputs.set_count (in);
1913 session().ensure_buffer_set (_signal_analysis_outputs, out);
1914 _signal_analysis_outputs.set_count (out);
1916 // std::cerr << "set counts to i" << in.n_audio() << "/o" << out.n_audio() << std::endl;
1919 return Processor::configure_io (in, out);
1922 /** Decide whether this PluginInsert can support a given IO configuration.
1923 * To do this, we run through a set of possible solutions in rough order of
1926 * @param in Required input channel count.
1927 * @param out Filled in with the output channel count if we return true.
1928 * @return true if the given IO configuration can be supported.
1931 PluginInsert::can_support_io_configuration (const ChanCount& in, ChanCount& out)
1934 _sidechain->can_support_io_configuration (in, out); // never fails, sets "out"
1936 return private_can_support_io_configuration (in, out).method != Impossible;
1940 PluginInsert::private_can_support_io_configuration (ChanCount const& in, ChanCount& out) const
1942 if (!_custom_cfg && _preset_out.n_audio () > 0) {
1943 // preseed hint (for variable i/o)
1944 out.set (DataType::AUDIO, _preset_out.n_audio ());
1947 Match rv = internal_can_support_io_configuration (in, out);
1949 if (!_custom_cfg && _preset_out.n_audio () > 0) {
1950 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: using output preset: %2\n", name(), _preset_out));
1951 out.set (DataType::AUDIO, _preset_out.n_audio ());
1956 /** A private version of can_support_io_configuration which returns the method
1957 * by which the configuration can be matched, rather than just whether or not
1961 PluginInsert::internal_can_support_io_configuration (ChanCount const & inx, ChanCount& out) const
1963 if (_plugins.empty()) {
1968 if (is_channelstrip ()) {
1970 return Match (ExactMatch, 1);
1974 /* if a user specified a custom cfg, so be it. */
1976 PluginInfoPtr info = _plugins.front()->get_info();
1978 if (info->reconfigurable_io()) {
1979 return Match (Delegate, 1, _strict_io, true);
1981 return Match (ExactMatch, get_count(), _strict_io, true);
1985 /* try automatic configuration */
1986 Match m = PluginInsert::automatic_can_support_io_configuration (inx, out);
1988 PluginInfoPtr info = _plugins.front()->get_info();
1989 ChanCount inputs = info->n_inputs;
1990 ChanCount outputs = info->n_outputs;
1992 /* handle case strict-i/o */
1993 if (_strict_io && m.method != Impossible) {
1996 /* special case MIDI instruments */
1997 if (needs_midi_input ()) {
1998 // output = midi-bypass + at most master-out channels.
1999 ChanCount max_out (DataType::AUDIO, 2); // TODO use master-out
2000 max_out.set (DataType::MIDI, out.get(DataType::MIDI));
2001 out = ChanCount::min (out, max_out);
2002 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: special case strict-i/o instrument\n", name()));
2008 if (inx.n_audio () != out.n_audio ()) { // ignore midi bypass
2009 /* replicate processor to match output count (generators and such)
2010 * at least enough to feed every output port. */
2011 uint32_t f = 1; // at least one. e.g. control data filters, no in, no out.
2012 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2013 uint32_t nout = outputs.get (*t);
2014 if (nout == 0 || inx.get(*t) == 0) { continue; }
2015 f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nout));
2018 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: special case strict-i/o for generator\n", name()));
2019 return Match (Replicate, f, _strict_io);
2030 if (m.method != Impossible) {
2034 ChanCount ns_inputs = inputs - sidechain_input_pins ();
2036 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: resolving 'Impossible' match...\n", name()));
2038 if (info->reconfigurable_io()) {
2041 if (out.n_midi () > 0 && out.n_audio () == 0) { out.set (DataType::AUDIO, 2); }
2042 if (out.n_audio () == 0) { out.set (DataType::AUDIO, 1); }
2043 bool const r = _plugins.front()->can_support_io_configuration (inx + sidechain_input_pins (), out, &useins);
2045 // houston, we have a problem.
2046 return Match (Impossible, 0);
2049 if (inx.n_midi () > 0 && out.n_midi () == 0) { out.set (DataType::MIDI, 1); }
2050 return Match (Delegate, 1, _strict_io);
2053 ChanCount midi_bypass;
2054 if (inx.get(DataType::MIDI) == 1 && outputs.get(DataType::MIDI) == 0) {
2055 midi_bypass.set (DataType::MIDI, 1);
2058 // add at least as many plugins so that output count matches input count (w/o sidechain pins)
2060 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2061 uint32_t nin = ns_inputs.get (*t);
2062 uint32_t nout = outputs.get (*t);
2063 if (nin == 0 || inx.get(*t) == 0) { continue; }
2064 // prefer floor() so the count won't overly increase IFF (nin < nout)
2065 f = max (f, (uint32_t) floor (inx.get(*t) / (float)nout));
2067 if (f > 0 && outputs * f >= _configured_out) {
2068 out = outputs * f + midi_bypass;
2069 return Match (Replicate, f, _strict_io);
2072 // add at least as many plugins needed to connect all inputs (w/o sidechain pins)
2074 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2075 uint32_t nin = ns_inputs.get (*t);
2076 if (nin == 0 || inx.get(*t) == 0) { continue; }
2077 f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nin));
2080 out = outputs * f + midi_bypass;
2081 return Match (Replicate, f, _strict_io);
2084 // add at least as many plugins needed to connect all inputs
2086 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2087 uint32_t nin = inputs.get (*t);
2088 if (nin == 0 || inx.get(*t) == 0) { continue; }
2089 f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nin));
2091 out = outputs * f + midi_bypass;
2092 return Match (Replicate, f, _strict_io);
2095 /* this is the original Ardour 3/4 behavior, mainly for backwards compatibility */
2097 PluginInsert::automatic_can_support_io_configuration (ChanCount const & inx, ChanCount& out) const
2099 if (_plugins.empty()) {
2103 PluginInfoPtr info = _plugins.front()->get_info();
2104 ChanCount in; in += inx;
2105 ChanCount midi_bypass;
2107 if (info->reconfigurable_io()) {
2108 /* Plugin has flexible I/O, so delegate to it
2109 * pre-seed outputs, plugin tries closest match
2112 if (out.n_midi () > 0 && out.n_audio () == 0) { out.set (DataType::AUDIO, 2); }
2113 if (out.n_audio () == 0) { out.set (DataType::AUDIO, 1); }
2114 bool const r = _plugins.front()->can_support_io_configuration (in + sidechain_input_pins (), out);
2116 return Match (Impossible, 0);
2119 if (in.n_midi () > 0 && out.n_midi () == 0) { out.set (DataType::MIDI, 1); }
2120 return Match (Delegate, 1);
2123 ChanCount inputs = info->n_inputs;
2124 ChanCount outputs = info->n_outputs;
2125 ChanCount ns_inputs = inputs - sidechain_input_pins ();
2127 if (in.get(DataType::MIDI) == 1 && outputs.get(DataType::MIDI) == 0) {
2128 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: bypassing midi-data\n", name()));
2129 midi_bypass.set (DataType::MIDI, 1);
2131 if (in.get(DataType::MIDI) == 1 && inputs.get(DataType::MIDI) == 0) {
2132 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: hiding midi-port from plugin\n", name()));
2133 in.set(DataType::MIDI, 0);
2136 // add internally provided sidechain ports
2137 ChanCount insc = in + sidechain_input_ports ();
2139 bool no_inputs = true;
2140 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2141 if (inputs.get (*t) != 0) {
2148 /* no inputs so we can take any input configuration since we throw it away */
2149 out = outputs + midi_bypass;
2150 return Match (NoInputs, 1);
2153 /* Plugin inputs match requested inputs + side-chain-ports exactly */
2154 if (inputs == insc) {
2155 out = outputs + midi_bypass;
2156 return Match (ExactMatch, 1);
2159 /* Plugin inputs matches without side-chain-pins */
2160 if (ns_inputs == in) {
2161 out = outputs + midi_bypass;
2162 return Match (ExactMatch, 1);
2165 /* We may be able to run more than one copy of the plugin within this insert
2166 to cope with the insert having more inputs than the plugin.
2167 We allow replication only for plugins with either zero or 1 inputs and outputs
2168 for every valid data type.
2172 bool can_replicate = true;
2173 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2175 // ignore side-chains
2176 uint32_t nin = ns_inputs.get (*t);
2178 // No inputs of this type
2179 if (nin == 0 && in.get(*t) == 0) {
2183 if (nin != 1 || outputs.get (*t) != 1) {
2184 can_replicate = false;
2188 // Potential factor not set yet
2190 f = in.get(*t) / nin;
2193 // Factor for this type does not match another type, can not replicate
2194 if (f != (in.get(*t) / nin)) {
2195 can_replicate = false;
2200 if (can_replicate && f > 0) {
2201 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2202 out.set (*t, outputs.get(*t) * f);
2205 return Match (Replicate, f);
2208 /* If the processor has exactly one input of a given type, and
2209 the plugin has more, we can feed the single processor input
2210 to some or all of the plugin inputs. This is rather
2211 special-case-y, but the 1-to-many case is by far the
2212 simplest. How do I split thy 2 processor inputs to 3
2213 plugin inputs? Let me count the ways ...
2216 bool can_split = true;
2217 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2219 bool const can_split_type = (in.get (*t) == 1 && ns_inputs.get (*t) > 1);
2220 bool const nothing_to_do_for_type = (in.get (*t) == 0 && inputs.get (*t) == 0);
2222 if (!can_split_type && !nothing_to_do_for_type) {
2228 out = outputs + midi_bypass;
2229 return Match (Split, 1);
2232 /* If the plugin has more inputs than we want, we can `hide' some of them
2233 by feeding them silence.
2236 bool could_hide = false;
2237 bool cannot_hide = false;
2238 ChanCount hide_channels;
2240 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2241 if (inputs.get(*t) > in.get(*t)) {
2242 /* there is potential to hide, since the plugin has more inputs of type t than the insert */
2243 hide_channels.set (*t, inputs.get(*t) - in.get(*t));
2245 } else if (inputs.get(*t) < in.get(*t)) {
2246 /* we definitely cannot hide, since the plugin has fewer inputs of type t than the insert */
2251 if (could_hide && !cannot_hide) {
2252 out = outputs + midi_bypass;
2253 return Match (Hide, 1, false, false, hide_channels);
2256 return Match (Impossible, 0);
2261 PluginInsert::get_state ()
2263 return state (true);
2267 PluginInsert::state (bool full)
2269 XMLNode& node = Processor::state (full);
2271 node.add_property("type", _plugins[0]->state_node_name());
2272 node.add_property("unique-id", _plugins[0]->unique_id());
2273 node.add_property("count", string_compose("%1", _plugins.size()));
2275 /* remember actual i/o configuration (for later placeholder
2276 * in case the plugin goes missing) */
2277 node.add_child_nocopy (* _configured_in.state (X_("ConfiguredInput")));
2278 node.add_child_nocopy (* _custom_sinks.state (X_("CustomSinks")));
2279 node.add_child_nocopy (* _configured_out.state (X_("ConfiguredOutput")));
2280 node.add_child_nocopy (* _preset_out.state (X_("PresetOutput")));
2282 /* save custom i/o config */
2283 node.add_property("custom", _custom_cfg ? "yes" : "no");
2284 for (uint32_t pc = 0; pc < get_count(); ++pc) {
2286 snprintf (tmp, sizeof(tmp), "InputMap-%d", pc);
2287 node.add_child_nocopy (* _in_map[pc].state (tmp));
2288 snprintf (tmp, sizeof(tmp), "OutputMap-%d", pc);
2289 node.add_child_nocopy (* _out_map[pc].state (tmp));
2291 node.add_child_nocopy (* _thru_map.state ("ThruMap"));
2294 node.add_child_nocopy (_sidechain->state (full));
2297 _plugins[0]->set_insert_id(this->id());
2298 node.add_child_nocopy (_plugins[0]->get_state());
2300 for (Controls::iterator c = controls().begin(); c != controls().end(); ++c) {
2301 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> ((*c).second);
2303 node.add_child_nocopy (ac->get_state());
2311 PluginInsert::set_control_ids (const XMLNode& node, int version)
2313 const XMLNodeList& nlist = node.children();
2314 XMLNodeConstIterator iter;
2315 set<Evoral::Parameter>::const_iterator p;
2317 for (iter = nlist.begin(); iter != nlist.end(); ++iter) {
2318 if ((*iter)->name() == Controllable::xml_node_name) {
2319 XMLProperty const * prop;
2321 uint32_t p = (uint32_t)-1;
2323 if ((prop = (*iter)->property (X_("symbol"))) != 0) {
2324 boost::shared_ptr<LV2Plugin> lv2plugin = boost::dynamic_pointer_cast<LV2Plugin> (_plugins[0]);
2326 p = lv2plugin->port_index(prop->value().c_str());
2330 if (p == (uint32_t)-1 && (prop = (*iter)->property (X_("parameter"))) != 0) {
2331 p = atoi (prop->value());
2334 if (p != (uint32_t)-1) {
2336 /* this may create the new controllable */
2338 boost::shared_ptr<Evoral::Control> c = control (Evoral::Parameter (PluginAutomation, 0, p));
2340 #ifndef NO_PLUGIN_STATE
2344 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> (c);
2346 ac->set_state (**iter, version);
2355 PluginInsert::set_state(const XMLNode& node, int version)
2357 XMLNodeList nlist = node.children();
2358 XMLNodeIterator niter;
2359 XMLPropertyList plist;
2360 XMLProperty const * prop;
2361 ARDOUR::PluginType type;
2363 if ((prop = node.property ("type")) == 0) {
2364 error << _("XML node describing plugin is missing the `type' field") << endmsg;
2368 if (prop->value() == X_("ladspa") || prop->value() == X_("Ladspa")) { /* handle old school sessions */
2369 type = ARDOUR::LADSPA;
2370 } else if (prop->value() == X_("lv2")) {
2372 } else if (prop->value() == X_("windows-vst")) {
2373 type = ARDOUR::Windows_VST;
2374 } else if (prop->value() == X_("lxvst")) {
2375 type = ARDOUR::LXVST;
2376 } else if (prop->value() == X_("audiounit")) {
2377 type = ARDOUR::AudioUnit;
2378 } else if (prop->value() == X_("luaproc")) {
2381 error << string_compose (_("unknown plugin type %1 in plugin insert state"),
2387 prop = node.property ("unique-id");
2390 #ifdef WINDOWS_VST_SUPPORT
2391 /* older sessions contain VST plugins with only an "id" field.
2394 if (type == ARDOUR::Windows_VST) {
2395 prop = node.property ("id");
2399 #ifdef LXVST_SUPPORT
2400 /*There shouldn't be any older sessions with linuxVST support.. but anyway..*/
2402 if (type == ARDOUR::LXVST) {
2403 prop = node.property ("id");
2409 error << _("Plugin has no unique ID field") << endmsg;
2414 boost::shared_ptr<Plugin> plugin = find_plugin (_session, prop->value(), type);
2416 /* treat linux and windows VST plugins equivalent if they have the same uniqueID
2417 * allow to move sessions windows <> linux */
2418 #ifdef LXVST_SUPPORT
2419 if (plugin == 0 && type == ARDOUR::Windows_VST) {
2420 type = ARDOUR::LXVST;
2421 plugin = find_plugin (_session, prop->value(), type);
2425 #ifdef WINDOWS_VST_SUPPORT
2426 if (plugin == 0 && type == ARDOUR::LXVST) {
2427 type = ARDOUR::Windows_VST;
2428 plugin = find_plugin (_session, prop->value(), type);
2432 if (plugin == 0 && type == ARDOUR::Lua) {
2433 /* unique ID (sha1 of script) was not found,
2434 * load the plugin from the serialized version in the
2435 * session-file instead.
2437 boost::shared_ptr<LuaProc> lp (new LuaProc (_session.engine(), _session, ""));
2438 XMLNode *ls = node.child (lp->state_node_name().c_str());
2440 lp->set_script_from_state (*ls);
2446 error << string_compose(
2447 _("Found a reference to a plugin (\"%1\") that is unknown.\n"
2448 "Perhaps it was removed or moved since it was last used."),
2454 // The name of the PluginInsert comes from the plugin, nothing else
2455 _name = plugin->get_info()->name;
2459 // Processor::set_state() will set this, but too late
2460 // for it to be available when setting up plugin
2461 // state. We can't call Processor::set_state() until
2462 // the plugins themselves are created and added.
2466 if (_plugins.empty()) {
2467 /* if we are adding the first plugin, we will need to set
2468 up automatable controls.
2470 add_plugin (plugin);
2471 create_automatable_parameters ();
2472 set_control_ids (node, version);
2475 if ((prop = node.property ("count")) != 0) {
2476 sscanf (prop->value().c_str(), "%u", &count);
2479 if (_plugins.size() != count) {
2480 for (uint32_t n = 1; n < count; ++n) {
2481 add_plugin (plugin_factory (plugin));
2485 Processor::set_state (node, version);
2487 PBD::ID new_id = this->id();
2488 PBD::ID old_id = this->id();
2490 if ((prop = node.property ("id")) != 0) {
2491 old_id = prop->value ();
2494 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2496 /* find the node with the type-specific node name ("lv2", "ladspa", etc)
2497 and set all plugins to the same state.
2500 if ((*niter)->name() == plugin->state_node_name()) {
2502 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2503 /* Plugin state can include external files which are named after the ID.
2505 * If regenerate_xml_or_string_ids() is set, the ID will already have
2506 * been changed, so we need to use the old ID from the XML to load the
2507 * state and then update the ID.
2509 * When copying a plugin-state, route_ui takes care of of updating the ID,
2510 * but we need to call set_insert_id() to clear the cached plugin-state
2511 * and force a change.
2513 if (!regenerate_xml_or_string_ids ()) {
2514 (*i)->set_insert_id (new_id);
2516 (*i)->set_insert_id (old_id);
2519 (*i)->set_state (**niter, version);
2521 if (regenerate_xml_or_string_ids ()) {
2522 (*i)->set_insert_id (new_id);
2530 if (version < 3000) {
2532 /* Only 2.X sessions need a call to set_parameter_state() - in 3.X and above
2533 this is all handled by Automatable
2536 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2537 if ((*niter)->name() == "Redirect") {
2538 /* XXX do we need to tackle placement? i think not (pd; oct 16 2009) */
2539 Processor::set_state (**niter, version);
2544 set_parameter_state_2X (node, version);
2547 if ((prop = node.property (X_("custom"))) != 0) {
2548 _custom_cfg = string_is_affirmative (prop->value());
2551 uint32_t in_maps = 0;
2552 uint32_t out_maps = 0;
2553 XMLNodeList kids = node.children ();
2554 for (XMLNodeIterator i = kids.begin(); i != kids.end(); ++i) {
2555 if ((*i)->name() == X_("ConfiguredInput")) {
2556 _configured_in = ChanCount(**i);
2558 if ((*i)->name() == X_("CustomSinks")) {
2559 _custom_sinks = ChanCount(**i);
2561 if ((*i)->name() == X_("ConfiguredOutput")) {
2562 _custom_out = ChanCount(**i);
2563 _configured_out = ChanCount(**i);
2565 if ((*i)->name() == X_("PresetOutput")) {
2566 _preset_out = ChanCount(**i);
2568 if (strncmp ((*i)->name ().c_str(), X_("InputMap-"), 9) == 0) {
2569 long pc = atol (&((*i)->name().c_str()[9]));
2570 if (pc >= 0 && pc <= (long) get_count()) {
2571 _in_map[pc] = ChanMapping (**i);
2575 if (strncmp ((*i)->name ().c_str(), X_("OutputMap-"), 10) == 0) {
2576 long pc = atol (&((*i)->name().c_str()[10]));
2577 if (pc >= 0 && pc <= (long) get_count()) {
2578 _out_map[pc] = ChanMapping (**i);
2582 if ((*i)->name () == "ThruMap") {
2583 _thru_map = ChanMapping (**i);
2586 // sidechain is a Processor (IO)
2587 if ((*i)->name () == Processor::state_node_name) {
2591 _sidechain->set_state (**i, version);
2595 if (in_maps == out_maps && out_maps >0 && out_maps == get_count()) {
2596 _maps_from_state = true;
2599 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2603 (*i)->deactivate ();
2607 PluginConfigChanged (); /* EMIT SIGNAL */
2612 PluginInsert::update_id (PBD::ID id)
2615 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2616 (*i)->set_insert_id (id);
2621 PluginInsert::set_state_dir (const std::string& d)
2623 // state() only saves the state of the first plugin
2624 _plugins[0]->set_state_dir (d);
2628 PluginInsert::set_parameter_state_2X (const XMLNode& node, int version)
2630 XMLNodeList nlist = node.children();
2631 XMLNodeIterator niter;
2633 /* look for port automation node */
2635 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2637 if ((*niter)->name() != port_automation_node_name) {
2642 XMLProperty const * cprop;
2643 XMLNodeConstIterator iter;
2648 cnodes = (*niter)->children ("port");
2650 for (iter = cnodes.begin(); iter != cnodes.end(); ++iter){
2654 if ((cprop = child->property("number")) != 0) {
2655 port = cprop->value().c_str();
2657 warning << _("PluginInsert: Auto: no ladspa port number") << endmsg;
2661 sscanf (port, "%" PRIu32, &port_id);
2663 if (port_id >= _plugins[0]->parameter_count()) {
2664 warning << _("PluginInsert: Auto: port id out of range") << endmsg;
2668 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(
2669 control(Evoral::Parameter(PluginAutomation, 0, port_id), true));
2671 if (c && c->alist()) {
2672 if (!child->children().empty()) {
2673 c->alist()->set_state (*child->children().front(), version);
2675 /* In some cases 2.X saves lists with min_yval and max_yval
2676 being FLT_MIN and FLT_MAX respectively. This causes problems
2677 in A3 because these min/max values are used to compute
2678 where GUI control points should be drawn. If we see such
2679 values, `correct' them to the min/max of the appropriate
2683 float min_y = c->alist()->get_min_y ();
2684 float max_y = c->alist()->get_max_y ();
2686 ParameterDescriptor desc;
2687 _plugins.front()->get_parameter_descriptor (port_id, desc);
2689 if (min_y == FLT_MIN) {
2693 if (max_y == FLT_MAX) {
2697 c->alist()->set_yrange (min_y, max_y);
2700 error << string_compose (_("PluginInsert: automatable control %1 not found - ignored"), port_id) << endmsg;
2712 PluginInsert::describe_parameter (Evoral::Parameter param)
2714 if (param.type() == PluginAutomation) {
2715 return _plugins[0]->describe_parameter (param);
2716 } else if (param.type() == PluginPropertyAutomation) {
2717 boost::shared_ptr<AutomationControl> c(automation_control(param));
2718 if (c && !c->desc().label.empty()) {
2719 return c->desc().label;
2722 return Automatable::describe_parameter(param);
2726 PluginInsert::signal_latency() const
2728 if (!_pending_active) {
2731 if (_user_latency) {
2732 return _user_latency;
2735 return _plugins[0]->signal_latency ();
2739 PluginInsert::type ()
2741 return plugin()->get_info()->type;
2744 PluginInsert::PluginControl::PluginControl (PluginInsert* p,
2745 const Evoral::Parameter& param,
2746 const ParameterDescriptor& desc,
2747 boost::shared_ptr<AutomationList> list)
2748 : AutomationControl (p->session(), param, desc, list, p->describe_parameter(param))
2752 alist()->reset_default (desc.normal);
2754 list->set_interpolation(Evoral::ControlList::Discrete);
2759 /** @param val `user' value */
2762 PluginInsert::PluginControl::actually_set_value (double user_val, PBD::Controllable::GroupControlDisposition group_override)
2764 /* FIXME: probably should be taking out some lock here.. */
2766 for (Plugins::iterator i = _plugin->_plugins.begin(); i != _plugin->_plugins.end(); ++i) {
2767 (*i)->set_parameter (_list->parameter().id(), user_val);
2770 boost::shared_ptr<Plugin> iasp = _plugin->_impulseAnalysisPlugin.lock();
2772 iasp->set_parameter (_list->parameter().id(), user_val);
2775 AutomationControl::actually_set_value (user_val, group_override);
2779 PluginInsert::PluginControl::catch_up_with_external_value (double user_val)
2781 AutomationControl::actually_set_value (user_val, Controllable::NoGroup);
2785 PluginInsert::PluginControl::get_state ()
2789 XMLNode& node (AutomationControl::get_state());
2790 ss << parameter().id();
2791 node.add_property (X_("parameter"), ss.str());
2793 boost::shared_ptr<LV2Plugin> lv2plugin = boost::dynamic_pointer_cast<LV2Plugin> (_plugin->_plugins[0]);
2795 node.add_property (X_("symbol"), lv2plugin->port_symbol (parameter().id()));
2802 /** @return `user' val */
2804 PluginInsert::PluginControl::get_value () const
2806 boost::shared_ptr<Plugin> plugin = _plugin->plugin (0);
2812 return plugin->get_parameter (_list->parameter().id());
2815 PluginInsert::PluginPropertyControl::PluginPropertyControl (PluginInsert* p,
2816 const Evoral::Parameter& param,
2817 const ParameterDescriptor& desc,
2818 boost::shared_ptr<AutomationList> list)
2819 : AutomationControl (p->session(), param, desc, list)
2823 alist()->set_yrange (desc.lower, desc.upper);
2824 alist()->reset_default (desc.normal);
2829 PluginInsert::PluginPropertyControl::actually_set_value (double user_val, Controllable::GroupControlDisposition gcd)
2831 /* Old numeric set_value(), coerce to appropriate datatype if possible.
2832 This is lossy, but better than nothing until Ardour's automation system
2833 can handle various datatypes all the way down. */
2834 const Variant value(_desc.datatype, user_val);
2835 if (value.type() == Variant::NOTHING) {
2836 error << "set_value(double) called for non-numeric property" << endmsg;
2840 for (Plugins::iterator i = _plugin->_plugins.begin(); i != _plugin->_plugins.end(); ++i) {
2841 (*i)->set_property(_list->parameter().id(), value);
2846 AutomationControl::actually_set_value (user_val, gcd);
2850 PluginInsert::PluginPropertyControl::get_state ()
2854 XMLNode& node (AutomationControl::get_state());
2855 ss << parameter().id();
2856 node.add_property (X_("property"), ss.str());
2857 node.remove_property (X_("value"));
2863 PluginInsert::PluginPropertyControl::get_value () const
2865 return _value.to_double();
2868 boost::shared_ptr<Plugin>
2869 PluginInsert::get_impulse_analysis_plugin()
2871 boost::shared_ptr<Plugin> ret;
2872 if (_impulseAnalysisPlugin.expired()) {
2873 // LV2 in particular uses various _session params
2874 // during init() -- most notably block_size..
2876 ret = plugin_factory(_plugins[0]);
2877 ChanCount out (internal_output_streams ());
2878 if (ret->get_info ()->reconfigurable_io ()) {
2879 // populate get_info ()->n_inputs and ->n_outputs
2881 ret->can_support_io_configuration (internal_input_streams (), out, &useins);
2882 assert (out == internal_output_streams ());
2884 ret->configure_io (internal_input_streams (), out);
2885 _impulseAnalysisPlugin = ret;
2887 ret = _impulseAnalysisPlugin.lock();
2894 PluginInsert::collect_signal_for_analysis (framecnt_t nframes)
2896 // called from outside the audio thread, so this should be safe
2897 // only do audio as analysis is (currently) only for audio plugins
2898 _signal_analysis_inputs.ensure_buffers (DataType::AUDIO, input_streams().n_audio(), nframes);
2899 _signal_analysis_outputs.ensure_buffers (DataType::AUDIO, output_streams().n_audio(), nframes);
2901 _signal_analysis_collected_nframes = 0;
2902 _signal_analysis_collect_nframes_max = nframes;
2905 /** Add a plugin to our list */
2907 PluginInsert::add_plugin (boost::shared_ptr<Plugin> plugin)
2909 plugin->set_insert_id (this->id());
2911 if (_plugins.empty()) {
2912 /* first (and probably only) plugin instance - connect to relevant signals */
2914 plugin->ParameterChangedExternally.connect_same_thread (*this, boost::bind (&PluginInsert::parameter_changed_externally, this, _1, _2));
2915 plugin->StartTouch.connect_same_thread (*this, boost::bind (&PluginInsert::start_touch, this, _1));
2916 plugin->EndTouch.connect_same_thread (*this, boost::bind (&PluginInsert::end_touch, this, _1));
2917 _custom_sinks = plugin->get_info()->n_inputs;
2918 // cache sidechain port count
2919 _cached_sidechain_pins.reset ();
2920 const ChanCount& nis (plugin->get_info()->n_inputs);
2921 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2922 for (uint32_t in = 0; in < nis.get (*t); ++in) {
2923 const Plugin::IOPortDescription& iod (plugin->describe_io_port (*t, true, in));
2924 if (iod.is_sidechain) {
2925 _cached_sidechain_pins.set (*t, 1 + _cached_sidechain_pins.n(*t));
2930 #if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT)
2931 boost::shared_ptr<VSTPlugin> vst = boost::dynamic_pointer_cast<VSTPlugin> (plugin);
2933 vst->set_insert (this, _plugins.size ());
2937 _plugins.push_back (plugin);
2941 PluginInsert::load_preset (ARDOUR::Plugin::PresetRecord pr)
2944 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2945 if (! (*i)->load_preset (pr)) {
2953 PluginInsert::realtime_handle_transport_stopped ()
2955 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2956 (*i)->realtime_handle_transport_stopped ();
2961 PluginInsert::realtime_locate ()
2963 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2964 (*i)->realtime_locate ();
2969 PluginInsert::monitoring_changed ()
2971 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2972 (*i)->monitoring_changed ();
2977 PluginInsert::latency_changed ()
2979 // this is called in RT context, LatencyChanged is emitted after run()
2980 _latency_changed = true;
2981 // XXX This also needs a proper API not an owner() hack.
2983 static_cast<Route*>(owner ())->processor_latency_changed (); /* EMIT SIGNAL */
2987 PluginInsert::start_touch (uint32_t param_id)
2989 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id));
2991 ac->start_touch (session().audible_frame());
2996 PluginInsert::end_touch (uint32_t param_id)
2998 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id));
3000 ac->stop_touch (true, session().audible_frame());
3004 std::ostream& operator<<(std::ostream& o, const ARDOUR::PluginInsert::Match& m)
3007 case PluginInsert::Impossible: o << "Impossible"; break;
3008 case PluginInsert::Delegate: o << "Delegate"; break;
3009 case PluginInsert::NoInputs: o << "NoInputs"; break;
3010 case PluginInsert::ExactMatch: o << "ExactMatch"; break;
3011 case PluginInsert::Replicate: o << "Replicate"; break;
3012 case PluginInsert::Split: o << "Split"; break;
3013 case PluginInsert::Hide: o << "Hide"; break;
3015 o << " cnt: " << m.plugins
3016 << (m.strict_io ? " strict-io" : "")
3017 << (m.custom_cfg ? " custom-cfg" : "");
3018 if (m.method == PluginInsert::Hide) {
3019 o << " hide: " << m.hide;