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 , _signal_analysis_collected_nframes(0)
71 , _signal_analysis_collect_nframes_max(0)
76 , _maps_from_state (false)
78 /* the first is the master */
82 create_automatable_parameters ();
83 const ChanCount& sc (sidechain_input_pins ());
84 if (sc.n_audio () > 0) {
85 add_sidechain (sc.n_audio ());
90 PluginInsert::~PluginInsert ()
95 PluginInsert::set_strict_io (bool b)
97 bool changed = _strict_io != b;
100 PluginConfigChanged (); /* EMIT SIGNAL */
105 PluginInsert::set_count (uint32_t num)
107 bool require_state = !_plugins.empty();
109 /* this is a bad idea.... we shouldn't do this while active.
110 only a route holding their redirect_lock should be calling this
115 } else if (num > _plugins.size()) {
116 uint32_t diff = num - _plugins.size();
118 for (uint32_t n = 0; n < diff; ++n) {
119 boost::shared_ptr<Plugin> p = plugin_factory (_plugins[0]);
123 XMLNode& state = _plugins[0]->get_state ();
124 p->set_state (state, Stateful::loading_state_version);
131 PluginConfigChanged (); /* EMIT SIGNAL */
133 } else if (num < _plugins.size()) {
134 uint32_t diff = _plugins.size() - num;
135 for (uint32_t n= 0; n < diff; ++n) {
138 PluginConfigChanged (); /* EMIT SIGNAL */
146 PluginInsert::set_outputs (const ChanCount& c)
148 bool changed = (_custom_out != c) && _custom_cfg;
151 PluginConfigChanged (); /* EMIT SIGNAL */
156 PluginInsert::set_custom_cfg (bool b)
158 bool changed = _custom_cfg != b;
161 PluginConfigChanged (); /* EMIT SIGNAL */
166 PluginInsert::set_preset_out (const ChanCount& c)
168 bool changed = _preset_out != c;
170 if (changed && !_custom_cfg) {
171 PluginConfigChanged (); /* EMIT SIGNAL */
177 PluginInsert::add_sidechain (uint32_t n_audio)
179 // caller must hold process lock
183 std::ostringstream n;
185 n << "Sidechain " << Session::next_name_id ();
187 n << "TO BE RESET FROM XML";
189 SideChain *sc = new SideChain (_session, n.str ());
190 _sidechain = boost::shared_ptr<SideChain> (sc);
191 _sidechain->activate ();
192 for (uint32_t n = 0; n < n_audio; ++n) {
193 _sidechain->input()->add_port ("", owner()); // add a port, don't connect.
195 PluginConfigChanged (); /* EMIT SIGNAL */
200 PluginInsert::del_sidechain ()
206 PluginConfigChanged (); /* EMIT SIGNAL */
211 PluginInsert::control_list_automation_state_changed (Evoral::Parameter which, AutoState s)
213 if (which.type() != PluginAutomation)
216 boost::shared_ptr<AutomationControl> c
217 = boost::dynamic_pointer_cast<AutomationControl>(control (which));
220 _plugins[0]->set_parameter (which.id(), c->list()->eval (_session.transport_frame()));
225 PluginInsert::output_streams() const
227 assert (_configured);
228 return _configured_out;
232 PluginInsert::input_streams() const
234 assert (_configured);
235 return _configured_in;
239 PluginInsert::internal_streams() const
241 assert (_configured);
242 return _configured_internal;
246 PluginInsert::internal_output_streams() const
248 assert (!_plugins.empty());
250 PluginInfoPtr info = _plugins.front()->get_info();
252 if (info->reconfigurable_io()) {
253 ChanCount out = _plugins.front()->output_streams ();
254 // DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, reconfigur(able) output streams = %1\n", out));
257 ChanCount out = info->n_outputs;
258 // DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, static output streams = %1 for %2 plugins\n", out, _plugins.size()));
259 out.set_audio (out.n_audio() * _plugins.size());
260 out.set_midi (out.n_midi() * _plugins.size());
266 PluginInsert::internal_input_streams() const
268 assert (!_plugins.empty());
272 PluginInfoPtr info = _plugins.front()->get_info();
274 if (info->reconfigurable_io()) {
275 in = _plugins.front()->input_streams();
280 DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, input streams = %1, match using %2\n", in, _match.method));
282 if (_match.method == Split) {
284 /* we are splitting 1 processor input to multiple plugin inputs,
285 so we have a maximum of 1 stream of each type.
287 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
288 if (in.get (*t) > 1) {
294 } else if (_match.method == Hide) {
296 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
297 in.set (*t, in.get (*t) - _match.hide.get (*t));
303 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
304 in.set (*t, in.get (*t) * _plugins.size ());
312 PluginInsert::natural_output_streams() const
315 if (is_channelstrip ()) {
316 return _configured_out;
319 return _plugins[0]->get_info()->n_outputs;
323 PluginInsert::natural_input_streams() const
326 if (is_channelstrip ()) {
327 return _configured_in;
330 return _plugins[0]->get_info()->n_inputs;
334 PluginInsert::sidechain_input_pins() const
336 return _cached_sidechain_pins;
340 PluginInsert::has_no_inputs() const
342 return _plugins[0]->get_info()->n_inputs == ChanCount::ZERO;
346 PluginInsert::has_no_audio_inputs() const
348 return _plugins[0]->get_info()->n_inputs.n_audio() == 0;
352 PluginInsert::plugin_latency () const {
353 return _plugins.front()->signal_latency ();
357 PluginInsert::needs_midi_input() const
359 PluginInfoPtr pip = _plugins[0]->get_info();
360 if (pip->needs_midi_input ()) {
363 return pip->n_inputs.n_midi() != 0 && pip->n_outputs.n_audio() != 0;
367 PluginInsert::create_automatable_parameters ()
369 assert (!_plugins.empty());
371 set<Evoral::Parameter> a = _plugins.front()->automatable ();
373 for (set<Evoral::Parameter>::iterator i = a.begin(); i != a.end(); ++i) {
374 if (i->type() == PluginAutomation) {
376 Evoral::Parameter param(*i);
378 ParameterDescriptor desc;
379 _plugins.front()->get_parameter_descriptor(i->id(), desc);
381 can_automate (param);
382 boost::shared_ptr<AutomationList> list(new AutomationList(param, desc));
383 boost::shared_ptr<AutomationControl> c (new PluginControl(this, param, desc, list));
385 _plugins.front()->set_automation_control (i->id(), c);
386 } else if (i->type() == PluginPropertyAutomation) {
387 Evoral::Parameter param(*i);
388 const ParameterDescriptor& desc = _plugins.front()->get_property_descriptor(param.id());
389 if (desc.datatype != Variant::NOTHING) {
390 boost::shared_ptr<AutomationList> list;
391 if (Variant::type_is_numeric(desc.datatype)) {
392 list = boost::shared_ptr<AutomationList>(new AutomationList(param, desc));
394 add_control (boost::shared_ptr<AutomationControl> (new PluginPropertyControl(this, param, desc, list)));
399 /** Called when something outside of this host has modified a plugin
400 * parameter. Responsible for propagating the change to two places:
402 * 1) anything listening to the Control itself
403 * 2) any replicated plugins that make up this PluginInsert.
405 * The PluginInsert is connected to the ParameterChangedExternally signal for
406 * the first (primary) plugin, and here broadcasts that change to any others.
408 * XXX We should probably drop this whole replication idea (Paul, October 2015)
409 * since it isn't used by sensible plugin APIs (AU, LV2).
412 PluginInsert::parameter_changed_externally (uint32_t which, float val)
414 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, which));
416 /* First propagation: alter the underlying value of the control,
417 * without telling the plugin(s) that own/use it to set it.
424 boost::shared_ptr<PluginControl> pc = boost::dynamic_pointer_cast<PluginControl> (ac);
427 pc->catch_up_with_external_value (val);
430 /* Second propagation: tell all plugins except the first to
431 update the value of this parameter. For sane plugin APIs,
432 there are no other plugins, so this is a no-op in those
436 Plugins::iterator i = _plugins.begin();
438 /* don't set the first plugin, just all the slaves */
440 if (i != _plugins.end()) {
442 for (; i != _plugins.end(); ++i) {
443 (*i)->set_parameter (which, val);
449 PluginInsert::set_block_size (pframes_t nframes)
452 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
453 if ((*i)->set_block_size (nframes) != 0) {
461 PluginInsert::activate ()
463 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
467 Processor::activate ();
471 PluginInsert::deactivate ()
473 Processor::deactivate ();
475 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
481 PluginInsert::flush ()
483 for (vector<boost::shared_ptr<Plugin> >::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
489 PluginInsert::connect_and_run (BufferSet& bufs, pframes_t nframes, framecnt_t offset, bool with_auto, framepos_t now)
491 // TODO: atomically copy maps & _no_inplace
492 PinMappings in_map (_in_map);
493 PinMappings out_map (_out_map);
494 ChanMapping thru_map (_thru_map);
495 if (_mapping_changed) { // ToDo use a counters, increment until match.
496 _no_inplace = check_inplace ();
497 _mapping_changed = false;
500 if (_latency_changed) {
501 /* delaylines are configured with the max possible latency (as reported by the plugin)
502 * so this won't allocate memory (unless the plugin lied about its max latency)
503 * It may still 'click' though, since the fixed delaylines are not de-clicked.
504 * Then again plugin-latency changes are not click-free to begin with.
506 * This is also worst case, there is currently no concept of per-stream latency.
508 * e.g. Two identical latent plugins:
509 * 1st plugin: process left (latent), bypass right.
510 * 2nd plugin: bypass left, process right (latent).
511 * -> currently this yields 2 times latency of the plugin,
513 _latency_changed = false;
514 _delaybuffers.set (ChanCount::max(bufs.count(), _configured_out), plugin_latency ());
517 if (_match.method == Split && !_no_inplace) {
518 // TODO: also use this optimization if one source-buffer
519 // feeds _all_ *connected* inputs.
520 // currently this is *first* buffer to all only --
521 // see PluginInsert::check_inplace
522 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
523 if (_configured_internal.get (*t) == 0) {
527 uint32_t first_idx = in_map[0].get (*t, 0, &valid);
528 assert (valid && first_idx == 0); // check_inplace ensures this
529 /* copy the first stream's buffer contents to the others */
530 for (uint32_t i = 1; i < natural_input_streams ().get (*t); ++i) {
531 uint32_t idx = in_map[0].get (*t, i, &valid);
534 bufs.get (*t, i).read_from (bufs.get (*t, first_idx), nframes, offset, offset);
538 /* the copy operation produces a linear monotonic input map */
539 in_map[0] = ChanMapping (natural_input_streams ());
542 bufs.set_count(ChanCount::max(bufs.count(), _configured_internal));
543 bufs.set_count(ChanCount::max(bufs.count(), _configured_out));
549 for (Controls::iterator li = controls().begin(); li != controls().end(); ++li, ++n) {
551 boost::shared_ptr<AutomationControl> c
552 = boost::dynamic_pointer_cast<AutomationControl>(li->second);
554 if (c->list() && c->automation_playback()) {
557 const float val = c->list()->rt_safe_eval (now, valid);
560 /* This is the ONLY place where we are
562 * AutomationControl::set_value_unchecked(). We
563 * know that the control is in
564 * automation playback mode, so no
565 * check on writable() is required
566 * (which must be done in AutomationControl::set_value()
569 c->set_value_unchecked(val);
576 /* Calculate if, and how many frames we need to collect for analysis */
577 framecnt_t collect_signal_nframes = (_signal_analysis_collect_nframes_max -
578 _signal_analysis_collected_nframes);
579 if (nframes < collect_signal_nframes) { // we might not get all frames now
580 collect_signal_nframes = nframes;
583 if (collect_signal_nframes > 0) {
585 //std::cerr << "collect input, bufs " << bufs.count().n_audio() << " count, " << bufs.available().n_audio() << " available" << std::endl;
586 //std::cerr << " streams " << internal_input_streams().n_audio() << std::endl;
587 //std::cerr << "filling buffer with " << collect_signal_nframes << " frames at " << _signal_analysis_collected_nframes << std::endl;
589 _signal_analysis_inputs.set_count(internal_input_streams());
591 for (uint32_t i = 0; i < internal_input_streams().n_audio(); ++i) {
592 _signal_analysis_inputs.get_audio(i).read_from(
594 collect_signal_nframes,
595 _signal_analysis_collected_nframes); // offset is for target buffer
600 if (is_channelstrip ()) {
601 if (_configured_in.n_audio() > 0) {
602 ChanMapping mb_in_map (ChanCount::min (_configured_in, ChanCount (DataType::AUDIO, 2)));
603 ChanMapping mb_out_map (ChanCount::min (_configured_out, ChanCount (DataType::AUDIO, 2)));
605 _plugins.front()->connect_and_run (bufs, mb_in_map, mb_out_map, nframes, offset);
607 for (uint32_t out = _configured_in.n_audio (); out < bufs.count().get (DataType::AUDIO); ++out) {
608 bufs.get (DataType::AUDIO, out).silence (nframes, offset);
614 // TODO optimize -- build maps once.
616 BufferSet& inplace_bufs = _session.get_noinplace_buffers();
617 ARDOUR::ChanMapping used_outputs;
619 assert (inplace_bufs.count () >= natural_input_streams () + _configured_out);
621 /* build used-output map */
622 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
623 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
624 for (uint32_t out = 0; out < natural_output_streams().get (*t); ++out) {
626 uint32_t out_idx = out_map[pc].get (*t, out, &valid);
628 used_outputs.set (*t, out_idx, 1); // mark as used
633 /* copy thru data to outputs before processing in-place */
634 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
635 for (uint32_t out = 0; out < bufs.count().get (*t); ++out) {
637 uint32_t in_idx = thru_map.get (*t, out, &valid);
639 uint32_t m = out + natural_input_streams ().get (*t);
640 _delaybuffers.delay (*t, out, inplace_bufs.get (*t, m), bufs.get (*t, in_idx), nframes, offset, offset);
641 used_outputs.set (*t, out, 1); // mark as used
647 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
649 ARDOUR::ChanMapping i_in_map (natural_input_streams());
650 ARDOUR::ChanMapping i_out_map (out_map[pc]);
651 ARDOUR::ChanCount mapped;
653 /* map inputs sequentially */
654 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
655 for (uint32_t in = 0; in < natural_input_streams().get (*t); ++in) {
657 uint32_t in_idx = in_map[pc].get (*t, in, &valid);
658 uint32_t m = mapped.get (*t);
660 inplace_bufs.get (*t, m).read_from (bufs.get (*t, in_idx), nframes, offset, offset);
662 inplace_bufs.get (*t, m).silence (nframes, offset);
664 mapped.set (*t, m + 1);
668 /* outputs are mapped to inplace_bufs after the inputs */
669 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
670 i_out_map.offset_to (*t, natural_input_streams ().get (*t));
673 if ((*i)->connect_and_run (inplace_bufs, i_in_map, i_out_map, nframes, offset)) {
678 /* all instances have completed, now copy data that was written
679 * and zero unconnected buffers */
680 ARDOUR::ChanMapping nonzero_out (used_outputs);
681 if (has_midi_bypass ()) {
682 nonzero_out.set (DataType::MIDI, 0, 1); // Midi bypass.
684 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
685 for (uint32_t out = 0; out < bufs.count().get (*t); ++out) {
687 used_outputs.get (*t, out, &valid);
689 nonzero_out.get (*t, out, &valid);
691 bufs.get (*t, out).silence (nframes, offset);
694 uint32_t m = out + natural_input_streams ().get (*t);
695 bufs.get (*t, out).read_from (inplace_bufs.get (*t, m), nframes, offset, offset);
700 /* in-place processing */
702 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
703 if ((*i)->connect_and_run(bufs, in_map[pc], out_map[pc], nframes, offset)) {
708 // TODO optimize: store "unconnected" in a fixed set.
709 // it only changes on reconfiguration.
710 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
711 for (uint32_t out = 0; out < bufs.count().get (*t); ++out) {
713 if (*t == DataType::MIDI && out == 0 && has_midi_bypass ()) {
714 mapped = true; // in-place Midi bypass
716 for (uint32_t pc = 0; pc < get_count() && !mapped; ++pc) {
717 for (uint32_t o = 0; o < natural_output_streams().get (*t); ++o) {
719 uint32_t idx = out_map[pc].get (*t, o, &valid);
720 if (valid && idx == out) {
727 bufs.get (*t, out).silence (nframes, offset);
733 if (collect_signal_nframes > 0) {
735 //std::cerr << " output, bufs " << bufs.count().n_audio() << " count, " << bufs.available().n_audio() << " available" << std::endl;
736 //std::cerr << " streams " << internal_output_streams().n_audio() << std::endl;
738 _signal_analysis_outputs.set_count(internal_output_streams());
740 for (uint32_t i = 0; i < internal_output_streams().n_audio(); ++i) {
741 _signal_analysis_outputs.get_audio(i).read_from(
743 collect_signal_nframes,
744 _signal_analysis_collected_nframes); // offset is for target buffer
747 _signal_analysis_collected_nframes += collect_signal_nframes;
748 assert(_signal_analysis_collected_nframes <= _signal_analysis_collect_nframes_max);
750 if (_signal_analysis_collected_nframes == _signal_analysis_collect_nframes_max) {
751 _signal_analysis_collect_nframes_max = 0;
752 _signal_analysis_collected_nframes = 0;
754 AnalysisDataGathered(&_signal_analysis_inputs,
755 &_signal_analysis_outputs);
761 PluginInsert::silence (framecnt_t nframes)
767 _delaybuffers.flush ();
770 if (is_channelstrip ()) {
771 if (_configured_in.n_audio() > 0) {
772 ChanCount maxbuf = ChanCount::min (_configured_in, ChanCount (DataType::AUDIO, 2));
773 ChanMapping mb_in_map (ChanCount::min (_configured_in, ChanCount (DataType::AUDIO, 2)));
774 ChanMapping mb_out_map (ChanCount::min (_configured_out, ChanCount (DataType::AUDIO, 2)));
775 _plugins.front()->connect_and_run (_session.get_scratch_buffers (maxbuf, true), mb_in_map, mb_out_map, nframes, 0);
780 ChanMapping in_map (natural_input_streams ());
781 ChanMapping out_map (natural_output_streams ());
782 ChanCount maxbuf = ChanCount::max (natural_input_streams (), natural_output_streams());
783 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
784 (*i)->connect_and_run (_session.get_scratch_buffers (maxbuf, true), in_map, out_map, nframes, 0);
790 PluginInsert::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool)
792 if (_pending_active) {
793 /* run as normal if we are active or moving from inactive to active */
796 // collect sidechain input for complete cycle (!)
797 // TODO we need delaylines here for latency compensation
798 _sidechain->run (bufs, start_frame, end_frame, nframes, true);
801 if (_session.transport_rolling() || _session.bounce_processing()) {
802 automation_run (bufs, start_frame, nframes);
804 connect_and_run (bufs, nframes, 0, false);
808 // TODO use mapping in bypassed mode ?!
809 // -> do we bypass the processor or the plugin
811 // TODO include sidechain??
813 uint32_t in = input_streams ().n_audio ();
814 uint32_t out = output_streams().n_audio ();
816 if (has_no_audio_inputs() || in == 0) {
818 /* silence all (audio) outputs. Should really declick
819 * at the transitions of "active"
822 for (uint32_t n = 0; n < out; ++n) {
823 bufs.get_audio (n).silence (nframes);
826 } else if (out > in) {
828 /* not active, but something has make up for any channel count increase
829 * for now , simply replicate last buffer
831 for (uint32_t n = in; n < out; ++n) {
832 bufs.get_audio(n).read_from(bufs.get_audio(in - 1), nframes);
836 bufs.count().set_audio (out);
839 _active = _pending_active;
841 /* we have no idea whether the plugin generated silence or not, so mark
842 * all buffers appropriately.
847 PluginInsert::automation_run (BufferSet& bufs, framepos_t start, pframes_t nframes)
849 Evoral::ControlEvent next_event (0, 0.0f);
850 framepos_t now = start;
851 framepos_t end = now + nframes;
852 framecnt_t offset = 0;
854 Glib::Threads::Mutex::Lock lm (control_lock(), Glib::Threads::TRY_LOCK);
857 connect_and_run (bufs, nframes, offset, false);
861 if (!find_next_event (now, end, next_event) || _plugins.front()->requires_fixed_sized_buffers()) {
863 /* no events have a time within the relevant range */
865 connect_and_run (bufs, nframes, offset, true, now);
871 framecnt_t cnt = min (((framecnt_t) ceil (next_event.when) - now), (framecnt_t) nframes);
873 connect_and_run (bufs, cnt, offset, true, now);
879 if (!find_next_event (now, end, next_event)) {
884 /* cleanup anything that is left to do */
887 connect_and_run (bufs, nframes, offset, true, now);
892 PluginInsert::default_parameter_value (const Evoral::Parameter& param)
894 if (param.type() != PluginAutomation)
897 if (_plugins.empty()) {
898 fatal << _("programming error: ") << X_("PluginInsert::default_parameter_value() called with no plugin")
900 abort(); /*NOTREACHED*/
903 return _plugins[0]->default_value (param.id());
908 PluginInsert::can_reset_all_parameters ()
912 for (uint32_t par = 0; par < _plugins[0]->parameter_count(); ++par) {
914 const uint32_t cid = _plugins[0]->nth_parameter (par, ok);
916 if (!ok || !_plugins[0]->parameter_is_input(cid)) {
920 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, cid));
926 if (ac->automation_state() & Play) {
931 return all && (params > 0);
935 PluginInsert::reset_parameters_to_default ()
939 for (uint32_t par = 0; par < _plugins[0]->parameter_count(); ++par) {
941 const uint32_t cid = _plugins[0]->nth_parameter (par, ok);
943 if (!ok || !_plugins[0]->parameter_is_input(cid)) {
947 const float dflt = _plugins[0]->default_value (cid);
948 const float curr = _plugins[0]->get_parameter (cid);
954 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, cid));
959 if (ac->automation_state() & Play) {
964 ac->set_value (dflt, Controllable::NoGroup);
969 boost::shared_ptr<Plugin>
970 PluginInsert::plugin_factory (boost::shared_ptr<Plugin> other)
972 boost::shared_ptr<LadspaPlugin> lp;
973 boost::shared_ptr<LuaProc> lua;
975 boost::shared_ptr<LV2Plugin> lv2p;
977 #ifdef WINDOWS_VST_SUPPORT
978 boost::shared_ptr<WindowsVSTPlugin> vp;
981 boost::shared_ptr<LXVSTPlugin> lxvp;
983 #ifdef AUDIOUNIT_SUPPORT
984 boost::shared_ptr<AUPlugin> ap;
987 if ((lp = boost::dynamic_pointer_cast<LadspaPlugin> (other)) != 0) {
988 return boost::shared_ptr<Plugin> (new LadspaPlugin (*lp));
989 } else if ((lua = boost::dynamic_pointer_cast<LuaProc> (other)) != 0) {
990 return boost::shared_ptr<Plugin> (new LuaProc (*lua));
992 } else if ((lv2p = boost::dynamic_pointer_cast<LV2Plugin> (other)) != 0) {
993 return boost::shared_ptr<Plugin> (new LV2Plugin (*lv2p));
995 #ifdef WINDOWS_VST_SUPPORT
996 } else if ((vp = boost::dynamic_pointer_cast<WindowsVSTPlugin> (other)) != 0) {
997 return boost::shared_ptr<Plugin> (new WindowsVSTPlugin (*vp));
1000 } else if ((lxvp = boost::dynamic_pointer_cast<LXVSTPlugin> (other)) != 0) {
1001 return boost::shared_ptr<Plugin> (new LXVSTPlugin (*lxvp));
1003 #ifdef AUDIOUNIT_SUPPORT
1004 } else if ((ap = boost::dynamic_pointer_cast<AUPlugin> (other)) != 0) {
1005 return boost::shared_ptr<Plugin> (new AUPlugin (*ap));
1009 fatal << string_compose (_("programming error: %1"),
1010 X_("unknown plugin type in PluginInsert::plugin_factory"))
1012 abort(); /*NOTREACHED*/
1013 return boost::shared_ptr<Plugin> ((Plugin*) 0);
1017 PluginInsert::set_input_map (uint32_t num, ChanMapping m) {
1018 if (num < _in_map.size()) {
1019 bool changed = _in_map[num] != m;
1021 changed |= sanitize_maps ();
1023 PluginMapChanged (); /* EMIT SIGNAL */
1024 _mapping_changed = true;
1025 _session.set_dirty();
1031 PluginInsert::set_output_map (uint32_t num, ChanMapping m) {
1032 if (num < _out_map.size()) {
1033 bool changed = _out_map[num] != m;
1035 changed |= sanitize_maps ();
1037 PluginMapChanged (); /* EMIT SIGNAL */
1038 _mapping_changed = true;
1039 _session.set_dirty();
1045 PluginInsert::set_thru_map (ChanMapping m) {
1046 bool changed = _thru_map != m;
1048 changed |= sanitize_maps ();
1050 PluginMapChanged (); /* EMIT SIGNAL */
1051 _mapping_changed = true;
1052 _session.set_dirty();
1057 PluginInsert::input_map () const
1061 for (PinMappings::const_iterator i = _in_map.begin (); i != _in_map.end (); ++i, ++pc) {
1062 ChanMapping m (i->second);
1063 const ChanMapping::Mappings& mp ((*i).second.mappings());
1064 for (ChanMapping::Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
1065 for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
1066 rv.set (tm->first, i->first + pc * natural_input_streams().get(tm->first), i->second);
1074 PluginInsert::output_map () const
1078 for (PinMappings::const_iterator i = _out_map.begin (); i != _out_map.end (); ++i, ++pc) {
1079 ChanMapping m (i->second);
1080 const ChanMapping::Mappings& mp ((*i).second.mappings());
1081 for (ChanMapping::Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
1082 for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
1083 rv.set (tm->first, i->first + pc * natural_output_streams().get(tm->first), i->second);
1087 if (has_midi_bypass ()) {
1088 rv.set (DataType::MIDI, 0, 0);
1095 PluginInsert::has_midi_bypass () const
1097 if (_configured_in.n_midi () == 1 && _configured_out.n_midi () == 1
1098 && natural_output_streams ().n_midi () == 0) {
1105 PluginInsert::has_midi_thru () const
1107 if (_configured_in.n_midi () == 1 && _configured_out.n_midi () == 1
1108 && natural_input_streams ().n_midi () == 0 && natural_output_streams ().n_midi () == 0) {
1116 PluginInsert::is_channelstrip () const {
1117 return _plugins.front()->is_channelstrip();
1122 PluginInsert::check_inplace ()
1124 bool inplace_ok = !_plugins.front()->inplace_broken ();
1126 if (_thru_map.n_total () > 0) {
1127 // TODO once midi-bypass is part of the mapping, ignore it
1131 if (_match.method == Split && inplace_ok) {
1132 assert (get_count() == 1);
1133 assert (_in_map.size () == 1);
1134 if (!_out_map[0].is_monotonic ()) {
1137 if (_configured_internal != _configured_in) {
1138 /* no sidechain -- TODO we could allow this with
1139 * some more logic in PluginInsert::connect_and_run().
1141 * PluginInsert::reset_map() already maps it.
1146 for (DataType::iterator t = DataType::begin(); t != DataType::end() && inplace_ok; ++t) {
1147 if (_configured_internal.get (*t) == 0) {
1151 uint32_t first_idx = _in_map[0].get (*t, 0, &valid);
1152 if (!valid || first_idx != 0) {
1153 // so far only allow to copy the *first* stream's buffer to others
1156 for (uint32_t i = 1; i < natural_input_streams ().get (*t); ++i) {
1157 uint32_t idx = _in_map[0].get (*t, i, &valid);
1158 if (valid && idx != first_idx) {
1167 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: In Place Split Map\n", name()));
1172 for (uint32_t pc = 0; pc < get_count() && inplace_ok ; ++pc) {
1173 if (!_in_map[pc].is_monotonic ()) {
1176 if (!_out_map[pc].is_monotonic ()) {
1180 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: %2\n", name(), inplace_ok ? "In-Place" : "No Inplace Processing"));
1181 return !inplace_ok; // no-inplace
1185 PluginInsert::sanitize_maps ()
1187 bool changed = false;
1188 /* strip dead wood */
1189 PinMappings new_ins;
1190 PinMappings new_outs;
1191 ChanMapping new_thru;
1193 for (uint32_t pc = 0; pc < get_count(); ++pc) {
1195 ChanMapping new_out;
1196 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1197 for (uint32_t i = 0; i < natural_input_streams().get (*t); ++i) {
1199 uint32_t idx = _in_map[pc].get (*t, i, &valid);
1200 if (valid && idx < _configured_internal.get (*t)) {
1201 new_in.set (*t, i, idx);
1204 for (uint32_t o = 0; o < natural_output_streams().get (*t); ++o) {
1206 uint32_t idx = _out_map[pc].get (*t, o, &valid);
1207 if (valid && idx < _configured_out.get (*t)) {
1208 new_out.set (*t, o, idx);
1212 if (_in_map[pc] != new_in || _out_map[pc] != new_out) {
1215 new_ins[pc] = new_in;
1216 new_outs[pc] = new_out;
1219 /* prevent dup output assignments */
1220 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1221 for (uint32_t o = 0; o < _configured_out.get (*t); ++o) {
1222 bool mapped = false;
1223 for (uint32_t pc = 0; pc < get_count(); ++pc) {
1225 uint32_t idx = new_outs[pc].get_src (*t, o, &valid);
1226 if (valid && mapped) {
1227 new_outs[pc].unset (*t, idx);
1235 /* remove excess thru */
1236 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1237 for (uint32_t o = 0; o < _configured_out.get (*t); ++o) {
1239 uint32_t idx = _thru_map.get (*t, o, &valid);
1240 if (valid && idx < _configured_internal.get (*t)) {
1241 new_thru.set (*t, o, idx);
1246 /* prevent out + thru, existing plugin outputs override thru */
1247 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1248 for (uint32_t o = 0; o < _configured_out.get (*t); ++o) {
1249 bool mapped = false;
1251 for (uint32_t pc = 0; pc < get_count(); ++pc) {
1252 new_outs[pc].get_src (*t, o, &mapped);
1253 if (mapped) { break; }
1255 if (!mapped) { continue; }
1256 uint32_t idx = new_thru.get (*t, o, &valid);
1258 new_thru.unset (*t, idx);
1263 if (has_midi_bypass ()) {
1264 // TODO: include midi-bypass in the thru set,
1265 // remove dedicated handling.
1266 new_thru.unset (DataType::MIDI, 0);
1269 if (_in_map != new_ins || _out_map != new_outs || _thru_map != new_thru) {
1273 _out_map = new_outs;
1274 _thru_map = new_thru;
1280 PluginInsert::reset_map (bool emit)
1282 const PinMappings old_in (_in_map);
1283 const PinMappings old_out (_out_map);
1287 _thru_map = ChanMapping ();
1289 /* build input map */
1290 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1291 uint32_t sc = 0; // side-chain round-robin (all instances)
1293 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
1294 const uint32_t nis = natural_input_streams ().get(*t);
1295 const uint32_t stride = nis - sidechain_input_pins().get (*t);
1297 /* SC inputs are last in the plugin-insert.. */
1298 const uint32_t sc_start = _configured_in.get (*t);
1299 const uint32_t sc_len = _configured_internal.get (*t) - sc_start;
1300 /* ...but may not be at the end of the plugin ports.
1301 * in case the side-chain is not the last port, shift connections back.
1302 * and connect to side-chain
1305 uint32_t ic = 0; // split inputs
1306 const uint32_t cend = _configured_in.get (*t);
1308 for (uint32_t in = 0; in < nis; ++in) {
1309 const Plugin::IOPortDescription& iod (_plugins[pc]->describe_io_port (*t, true, in));
1310 if (iod.is_sidechain) {
1311 /* connect sidechain sinks to sidechain inputs in round-robin fashion */
1312 if (sc_len > 0) {// side-chain may be hidden
1313 _in_map[pc].set (*t, in, sc_start + sc);
1314 sc = (sc + 1) % sc_len;
1318 if (_match.method == Split) {
1319 if (cend == 0) { continue; }
1320 if (_strict_io && ic + stride * pc >= cend) {
1323 /* connect *no* sidechain sinks in round-robin fashion */
1324 _in_map[pc].set (*t, in, ic + stride * pc);
1325 if (_strict_io && (ic + 1) == cend) {
1328 ic = (ic + 1) % cend;
1330 uint32_t s = in - shift;
1331 if (stride * pc + s < cend) {
1332 _in_map[pc].set (*t, in, s + stride * pc);
1340 /* build output map */
1342 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
1343 _out_map[pc] = ChanMapping (ChanCount::min (natural_output_streams(), _configured_out));
1344 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1345 _out_map[pc].offset_to(*t, pc * natural_output_streams().get(*t));
1350 if (old_in == _in_map && old_out == _out_map) {
1354 PluginMapChanged (); /* EMIT SIGNAL */
1355 _mapping_changed = true;
1356 _session.set_dirty();
1362 PluginInsert::configure_io (ChanCount in, ChanCount out)
1364 Match old_match = _match;
1366 ChanCount old_internal;
1370 old_in = _configured_in;
1371 old_internal = _configured_internal;
1372 old_out = _configured_out;
1375 _configured_in = in;
1376 _configured_internal = in;
1377 _configured_out = out;
1380 /* TODO hide midi-bypass, and custom outs. Best /fake/ "out" here.
1381 * (currently _sidechain->configure_io always succeeds
1382 * since Processor::configure_io() succeeds)
1384 if (!_sidechain->configure_io (in, out)) {
1385 DEBUG_TRACE (DEBUG::ChanMapping, "Sidechain configuration failed\n");
1388 _configured_internal += _sidechain->input()->n_ports();
1390 // include (static_cast<Route*>owner())->name() ??
1391 _sidechain->input ()-> set_pretty_name (string_compose (_("SC %1"), name ()));
1394 /* get plugin configuration */
1395 _match = private_can_support_io_configuration (in, out);
1397 if (DEBUG_ENABLED(DEBUG::ChanMapping)) {
1399 DEBUG_STR_APPEND(a, string_compose ("Match '%1': ", name()));
1400 DEBUG_STR_APPEND(a, _match);
1401 DEBUG_TRACE (DEBUG::ChanMapping, DEBUG_STR(a).str());
1405 /* set the matching method and number of plugins that we will use to meet this configuration */
1406 if (set_count (_match.plugins) == false) {
1407 PluginIoReConfigure (); /* EMIT SIGNAL */
1408 _configured = false;
1412 /* configure plugins */
1413 switch (_match.method) {
1416 if (_plugins.front()->configure_io (natural_input_streams(), out) == false) {
1417 PluginIoReConfigure (); /* EMIT SIGNAL */
1418 _configured = false;
1424 ChanCount dout (in); // hint
1427 } else if (_preset_out.n_audio () > 0) {
1428 dout.set (DataType::AUDIO, _preset_out.n_audio ());
1429 } else if (dout.n_midi () > 0 && dout.n_audio () == 0) {
1430 dout.set (DataType::AUDIO, 2);
1432 if (out.n_audio () == 0) { out.set (DataType::AUDIO, 1); }
1434 bool const r = _plugins.front()->can_support_io_configuration (in, dout, &useins);
1436 if (useins.n_audio() == 0) {
1439 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("Delegate configuration: %1 %2 %3\n", name(), useins, dout));
1441 if (_plugins.front()->configure_io (useins, dout) == false) {
1442 PluginIoReConfigure (); /* EMIT SIGNAL */
1443 _configured = false;
1449 if (_plugins.front()->configure_io (in, out) == false) {
1450 PluginIoReConfigure (); /* EMIT SIGNAL */
1451 _configured = false;
1457 bool mapping_changed = false;
1458 if (old_in == in && old_out == out
1460 && old_match.method == _match.method
1461 && _in_map.size() == _out_map.size()
1462 && _in_map.size() == get_count ()
1464 assert (_maps_from_state == false);
1465 /* If the configuration has not changed, keep the mapping */
1466 if (old_internal != _configured_internal) {
1467 mapping_changed = sanitize_maps ();
1469 } else if (_match.custom_cfg && _configured) {
1470 assert (_maps_from_state == false);
1471 mapping_changed = sanitize_maps ();
1474 if (is_channelstrip ()) { _maps_from_state = false; }
1476 if (_maps_from_state) {
1477 _maps_from_state = false;
1478 mapping_changed = true;
1481 /* generate a new mapping */
1482 mapping_changed = reset_map (false);
1486 if (mapping_changed) {
1487 PluginMapChanged (); /* EMIT SIGNAL */
1490 if (DEBUG_ENABLED(DEBUG::ChanMapping)) {
1493 DEBUG_STR_APPEND(a, "\n--------<<--------\n");
1494 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
1496 DEBUG_STR_APPEND(a, "----><----\n");
1498 DEBUG_STR_APPEND(a, string_compose ("Channel Map for %1 plugin %2\n", name(), pc));
1499 DEBUG_STR_APPEND(a, " * Inputs:\n");
1500 DEBUG_STR_APPEND(a, _in_map[pc]);
1501 DEBUG_STR_APPEND(a, " * Outputs:\n");
1502 DEBUG_STR_APPEND(a, _out_map[pc]);
1504 DEBUG_STR_APPEND(a, " * Thru:\n");
1505 DEBUG_STR_APPEND(a, _thru_map);
1506 DEBUG_STR_APPEND(a, "-------->>--------\n");
1507 DEBUG_TRACE (DEBUG::ChanMapping, DEBUG_STR(a).str());
1512 _no_inplace = check_inplace ();
1513 _mapping_changed = false;
1515 /* only the "noinplace_buffers" thread buffers need to be this large,
1516 * this can be optimized. other buffers are fine with
1517 * ChanCount::max (natural_input_streams (), natural_output_streams())
1518 * and route.cc's max (configured_in, configured_out)
1520 * no-inplace copies "thru" outputs (to emulate in-place) for
1521 * all outputs (to prevent overwrite) into a temporary space
1522 * which also holds input buffers (in case the plugin does process
1523 * in-place and overwrites those).
1525 * this buffers need to be at least as
1526 * natural_input_streams () + possible outputs.
1528 * sidechain inputs add a constraint on the input:
1529 * configured input + sidechain (=_configured_internal)
1531 * NB. this also satisfies
1532 * max (natural_input_streams(), natural_output_streams())
1533 * which is needed for silence runs
1535 _required_buffers = ChanCount::max (_configured_internal,
1536 natural_input_streams () + ChanCount::max (_configured_out, natural_output_streams () * get_count ()));
1538 if (old_in != in || old_out != out || old_internal != _configured_internal
1539 || (old_match.method != _match.method && (old_match.method == Split || _match.method == Split))
1541 PluginIoReConfigure (); /* EMIT SIGNAL */
1544 _delaybuffers.configure (_configured_out, _plugins.front ()->max_latency ());
1545 _latency_changed = true;
1547 // we don't know the analysis window size, so we must work with the
1548 // current buffer size here. each request for data fills in these
1549 // buffers and the analyser makes sure it gets enough data for the
1551 session().ensure_buffer_set (_signal_analysis_inputs, in);
1552 //_signal_analysis_inputs.set_count (in);
1554 session().ensure_buffer_set (_signal_analysis_outputs, out);
1555 //_signal_analysis_outputs.set_count (out);
1557 // std::cerr << "set counts to i" << in.n_audio() << "/o" << out.n_audio() << std::endl;
1560 return Processor::configure_io (in, out);
1563 /** Decide whether this PluginInsert can support a given IO configuration.
1564 * To do this, we run through a set of possible solutions in rough order of
1567 * @param in Required input channel count.
1568 * @param out Filled in with the output channel count if we return true.
1569 * @return true if the given IO configuration can be supported.
1572 PluginInsert::can_support_io_configuration (const ChanCount& in, ChanCount& out)
1575 _sidechain->can_support_io_configuration (in, out); // never fails, sets "out"
1577 return private_can_support_io_configuration (in, out).method != Impossible;
1581 PluginInsert::private_can_support_io_configuration (ChanCount const& in, ChanCount& out) const
1583 if (!_custom_cfg && _preset_out.n_audio () > 0) {
1584 // preseed hint (for variable i/o)
1585 out.set (DataType::AUDIO, _preset_out.n_audio ());
1588 Match rv = internal_can_support_io_configuration (in, out);
1590 if (!_custom_cfg && _preset_out.n_audio () > 0) {
1591 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("using output preset: %1 %2\n", name(), _preset_out));
1592 out.set (DataType::AUDIO, _preset_out.n_audio ());
1597 /** A private version of can_support_io_configuration which returns the method
1598 * by which the configuration can be matched, rather than just whether or not
1602 PluginInsert::internal_can_support_io_configuration (ChanCount const & inx, ChanCount& out) const
1604 if (_plugins.empty()) {
1609 if (is_channelstrip ()) {
1611 return Match (ExactMatch, 1);
1615 /* if a user specified a custom cfg, so be it. */
1617 PluginInfoPtr info = _plugins.front()->get_info();
1619 if (info->reconfigurable_io()) {
1620 return Match (Delegate, get_count(), _strict_io, true);
1622 return Match (ExactMatch, get_count(), _strict_io, true);
1626 /* try automatic configuration */
1627 Match m = PluginInsert::automatic_can_support_io_configuration (inx, out);
1629 PluginInfoPtr info = _plugins.front()->get_info();
1630 ChanCount inputs = info->n_inputs;
1631 ChanCount outputs = info->n_outputs;
1633 /* handle case strict-i/o */
1634 if (_strict_io && m.method != Impossible) {
1637 /* special case MIDI instruments */
1638 if (needs_midi_input ()) {
1639 // output = midi-bypass + at most master-out channels.
1640 ChanCount max_out (DataType::AUDIO, 2); // TODO use master-out
1641 max_out.set (DataType::MIDI, out.get(DataType::MIDI));
1642 out = ChanCount::min (out, max_out);
1643 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("special case strict-i/o instrument: %1\n", name()));
1649 if (inx.n_audio () != out.n_audio ()) { // ignore midi bypass
1650 /* replicate processor to match output count (generators and such)
1651 * at least enough to feed every output port. */
1652 uint32_t f = 1; // at least one. e.g. control data filters, no in, no out.
1653 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1654 uint32_t nout = outputs.get (*t);
1655 if (nout == 0 || inx.get(*t) == 0) { continue; }
1656 f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nout));
1659 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("special case strict-i/o generator: %1\n", name()));
1660 return Match (Replicate, f, _strict_io);
1671 if (m.method != Impossible) {
1675 ChanCount ns_inputs = inputs - sidechain_input_pins ();
1677 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("resolving 'Impossible' match for %1\n", name()));
1679 if (info->reconfigurable_io()) {
1682 if (out.n_midi () > 0 && out.n_audio () == 0) { out.set (DataType::AUDIO, 2); }
1683 if (out.n_audio () == 0) { out.set (DataType::AUDIO, 1); }
1684 bool const r = _plugins.front()->can_support_io_configuration (inx, out, &useins);
1686 // houston, we have a problem.
1687 return Match (Impossible, 0);
1689 return Match (Delegate, 1, _strict_io);
1692 ChanCount midi_bypass;
1693 if (inx.get(DataType::MIDI) == 1 && outputs.get(DataType::MIDI) == 0) {
1694 midi_bypass.set (DataType::MIDI, 1);
1697 // add at least as many plugins so that output count matches input count (w/o sidechain pins)
1699 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1700 uint32_t nin = ns_inputs.get (*t);
1701 uint32_t nout = outputs.get (*t);
1702 if (nin == 0 || inx.get(*t) == 0) { continue; }
1703 // prefer floor() so the count won't overly increase IFF (nin < nout)
1704 f = max (f, (uint32_t) floor (inx.get(*t) / (float)nout));
1706 if (f > 0 && outputs * f >= _configured_out) {
1707 out = outputs * f + midi_bypass;
1708 return Match (Replicate, f, _strict_io);
1711 // add at least as many plugins needed to connect all inputs (w/o sidechain pins)
1713 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1714 uint32_t nin = ns_inputs.get (*t);
1715 if (nin == 0 || inx.get(*t) == 0) { continue; }
1716 f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nin));
1719 out = outputs * f + midi_bypass;
1720 return Match (Replicate, f, _strict_io);
1723 // add at least as many plugins needed to connect all inputs
1725 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1726 uint32_t nin = inputs.get (*t);
1727 if (nin == 0 || inx.get(*t) == 0) { continue; }
1728 f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nin));
1730 out = outputs * f + midi_bypass;
1731 return Match (Replicate, f, _strict_io);
1734 /* this is the original Ardour 3/4 behavior, mainly for backwards compatibility */
1736 PluginInsert::automatic_can_support_io_configuration (ChanCount const & inx, ChanCount& out) const
1738 if (_plugins.empty()) {
1742 PluginInfoPtr info = _plugins.front()->get_info();
1743 ChanCount in; in += inx;
1744 ChanCount midi_bypass;
1746 if (info->reconfigurable_io()) {
1747 /* Plugin has flexible I/O, so delegate to it
1748 * pre-seed outputs, plugin tries closest match
1751 if (out.n_midi () > 0 && out.n_audio () == 0) { out.set (DataType::AUDIO, 2); }
1752 if (out.n_audio () == 0) { out.set (DataType::AUDIO, 1); }
1753 bool const r = _plugins.front()->can_support_io_configuration (in, out);
1755 return Match (Impossible, 0);
1757 return Match (Delegate, 1);
1760 ChanCount inputs = info->n_inputs;
1761 ChanCount outputs = info->n_outputs;
1762 ChanCount ns_inputs = inputs - sidechain_input_pins ();
1764 if (in.get(DataType::MIDI) == 1 && outputs.get(DataType::MIDI) == 0) {
1765 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("bypassing midi-data around %1\n", name()));
1766 midi_bypass.set (DataType::MIDI, 1);
1768 if (in.get(DataType::MIDI) == 1 && inputs.get(DataType::MIDI) == 0) {
1769 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("hiding midi-port from plugin %1\n", name()));
1770 in.set(DataType::MIDI, 0);
1773 // add internally provided sidechain ports
1774 ChanCount insc = in + sidechain_input_ports ();
1776 bool no_inputs = true;
1777 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1778 if (inputs.get (*t) != 0) {
1785 /* no inputs so we can take any input configuration since we throw it away */
1786 out = outputs + midi_bypass;
1787 return Match (NoInputs, 1);
1790 /* Plugin inputs match requested inputs + side-chain-ports exactly */
1791 if (inputs == insc) {
1792 out = outputs + midi_bypass;
1793 return Match (ExactMatch, 1);
1796 /* Plugin inputs matches without side-chain-pins */
1797 if (ns_inputs == in) {
1798 out = outputs + midi_bypass;
1799 return Match (ExactMatch, 1);
1802 /* We may be able to run more than one copy of the plugin within this insert
1803 to cope with the insert having more inputs than the plugin.
1804 We allow replication only for plugins with either zero or 1 inputs and outputs
1805 for every valid data type.
1809 bool can_replicate = true;
1810 for (DataType::iterator t = DataType::begin(); t != DataType::end() && can_replicate; ++t) {
1812 // ignore side-chains
1813 uint32_t nin = ns_inputs.get (*t);
1815 // No inputs of this type
1816 if (nin == 0 && in.get(*t) == 0) {
1820 if (nin != 1 || outputs.get (*t) != 1) {
1821 can_replicate = false;
1825 // Potential factor not set yet
1827 f = in.get(*t) / nin;
1830 // Factor for this type does not match another type, can not replicate
1831 if (f != (in.get(*t) / nin)) {
1832 can_replicate = false;
1837 if (can_replicate && f > 0) {
1838 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1839 out.set (*t, outputs.get(*t) * f);
1842 return Match (Replicate, f);
1845 /* If the processor has exactly one input of a given type, and
1846 the plugin has more, we can feed the single processor input
1847 to some or all of the plugin inputs. This is rather
1848 special-case-y, but the 1-to-many case is by far the
1849 simplest. How do I split thy 2 processor inputs to 3
1850 plugin inputs? Let me count the ways ...
1853 bool can_split = true;
1854 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1856 bool const can_split_type = (in.get (*t) == 1 && ns_inputs.get (*t) > 1);
1857 bool const nothing_to_do_for_type = (in.get (*t) == 0 && inputs.get (*t) == 0);
1859 if (!can_split_type && !nothing_to_do_for_type) {
1865 out = outputs + midi_bypass;
1866 return Match (Split, 1);
1869 /* If the plugin has more inputs than we want, we can `hide' some of them
1870 by feeding them silence.
1873 bool could_hide = false;
1874 bool cannot_hide = false;
1875 ChanCount hide_channels;
1877 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1878 if (inputs.get(*t) > in.get(*t)) {
1879 /* there is potential to hide, since the plugin has more inputs of type t than the insert */
1880 hide_channels.set (*t, inputs.get(*t) - in.get(*t));
1882 } else if (inputs.get(*t) < in.get(*t)) {
1883 /* we definitely cannot hide, since the plugin has fewer inputs of type t than the insert */
1888 if (could_hide && !cannot_hide) {
1889 out = outputs + midi_bypass;
1890 return Match (Hide, 1, false, false, hide_channels);
1893 return Match (Impossible, 0);
1898 PluginInsert::get_state ()
1900 return state (true);
1904 PluginInsert::state (bool full)
1906 XMLNode& node = Processor::state (full);
1908 node.add_property("type", _plugins[0]->state_node_name());
1909 node.add_property("unique-id", _plugins[0]->unique_id());
1910 node.add_property("count", string_compose("%1", _plugins.size()));
1912 /* remember actual i/o configuration (for later placeholder
1913 * in case the plugin goes missing) */
1914 node.add_child_nocopy (* _configured_in.state (X_("ConfiguredInput")));
1915 node.add_child_nocopy (* _configured_out.state (X_("ConfiguredOutput")));
1916 node.add_child_nocopy (* _preset_out.state (X_("PresetOutput")));
1918 /* save custom i/o config */
1919 node.add_property("custom", _custom_cfg ? "yes" : "no");
1920 for (uint32_t pc = 0; pc < get_count(); ++pc) {
1922 snprintf (tmp, sizeof(tmp), "InputMap-%d", pc);
1923 node.add_child_nocopy (* _in_map[pc].state (tmp));
1924 snprintf (tmp, sizeof(tmp), "OutputMap-%d", pc);
1925 node.add_child_nocopy (* _out_map[pc].state (tmp));
1927 node.add_child_nocopy (* _thru_map.state ("ThruMap"));
1930 node.add_child_nocopy (_sidechain->state (full));
1933 _plugins[0]->set_insert_id(this->id());
1934 node.add_child_nocopy (_plugins[0]->get_state());
1936 for (Controls::iterator c = controls().begin(); c != controls().end(); ++c) {
1937 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> ((*c).second);
1939 node.add_child_nocopy (ac->get_state());
1947 PluginInsert::set_control_ids (const XMLNode& node, int version)
1949 const XMLNodeList& nlist = node.children();
1950 XMLNodeConstIterator iter;
1951 set<Evoral::Parameter>::const_iterator p;
1953 for (iter = nlist.begin(); iter != nlist.end(); ++iter) {
1954 if ((*iter)->name() == Controllable::xml_node_name) {
1955 const XMLProperty* prop;
1957 uint32_t p = (uint32_t)-1;
1959 if ((prop = (*iter)->property (X_("symbol"))) != 0) {
1960 boost::shared_ptr<LV2Plugin> lv2plugin = boost::dynamic_pointer_cast<LV2Plugin> (_plugins[0]);
1962 p = lv2plugin->port_index(prop->value().c_str());
1966 if (p == (uint32_t)-1 && (prop = (*iter)->property (X_("parameter"))) != 0) {
1967 p = atoi (prop->value());
1970 if (p != (uint32_t)-1) {
1972 /* this may create the new controllable */
1974 boost::shared_ptr<Evoral::Control> c = control (Evoral::Parameter (PluginAutomation, 0, p));
1976 #ifndef NO_PLUGIN_STATE
1980 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> (c);
1982 ac->set_state (**iter, version);
1991 PluginInsert::set_state(const XMLNode& node, int version)
1993 XMLNodeList nlist = node.children();
1994 XMLNodeIterator niter;
1995 XMLPropertyList plist;
1996 const XMLProperty *prop;
1997 ARDOUR::PluginType type;
1999 if ((prop = node.property ("type")) == 0) {
2000 error << _("XML node describing plugin is missing the `type' field") << endmsg;
2004 if (prop->value() == X_("ladspa") || prop->value() == X_("Ladspa")) { /* handle old school sessions */
2005 type = ARDOUR::LADSPA;
2006 } else if (prop->value() == X_("lv2")) {
2008 } else if (prop->value() == X_("windows-vst")) {
2009 type = ARDOUR::Windows_VST;
2010 } else if (prop->value() == X_("lxvst")) {
2011 type = ARDOUR::LXVST;
2012 } else if (prop->value() == X_("audiounit")) {
2013 type = ARDOUR::AudioUnit;
2014 } else if (prop->value() == X_("luaproc")) {
2017 error << string_compose (_("unknown plugin type %1 in plugin insert state"),
2023 prop = node.property ("unique-id");
2026 #ifdef WINDOWS_VST_SUPPORT
2027 /* older sessions contain VST plugins with only an "id" field.
2030 if (type == ARDOUR::Windows_VST) {
2031 prop = node.property ("id");
2035 #ifdef LXVST_SUPPORT
2036 /*There shouldn't be any older sessions with linuxVST support.. but anyway..*/
2038 if (type == ARDOUR::LXVST) {
2039 prop = node.property ("id");
2045 error << _("Plugin has no unique ID field") << endmsg;
2050 boost::shared_ptr<Plugin> plugin = find_plugin (_session, prop->value(), type);
2052 /* treat linux and windows VST plugins equivalent if they have the same uniqueID
2053 * allow to move sessions windows <> linux */
2054 #ifdef LXVST_SUPPORT
2055 if (plugin == 0 && type == ARDOUR::Windows_VST) {
2056 type = ARDOUR::LXVST;
2057 plugin = find_plugin (_session, prop->value(), type);
2061 #ifdef WINDOWS_VST_SUPPORT
2062 if (plugin == 0 && type == ARDOUR::LXVST) {
2063 type = ARDOUR::Windows_VST;
2064 plugin = find_plugin (_session, prop->value(), type);
2069 error << string_compose(
2070 _("Found a reference to a plugin (\"%1\") that is unknown.\n"
2071 "Perhaps it was removed or moved since it was last used."),
2077 if (type == ARDOUR::Lua) {
2078 XMLNode *ls = node.child (plugin->state_node_name().c_str());
2079 // we need to load the script to set the name and parameters.
2080 boost::shared_ptr<LuaProc> lp = boost::dynamic_pointer_cast<LuaProc>(plugin);
2082 lp->set_script_from_state (*ls);
2086 // The name of the PluginInsert comes from the plugin, nothing else
2087 _name = plugin->get_info()->name;
2091 // Processor::set_state() will set this, but too late
2092 // for it to be available when setting up plugin
2093 // state. We can't call Processor::set_state() until
2094 // the plugins themselves are created and added.
2098 if (_plugins.empty()) {
2099 /* if we are adding the first plugin, we will need to set
2100 up automatable controls.
2102 add_plugin (plugin);
2103 create_automatable_parameters ();
2104 set_control_ids (node, version);
2107 if ((prop = node.property ("count")) != 0) {
2108 sscanf (prop->value().c_str(), "%u", &count);
2111 if (_plugins.size() != count) {
2112 for (uint32_t n = 1; n < count; ++n) {
2113 add_plugin (plugin_factory (plugin));
2117 Processor::set_state (node, version);
2119 PBD::ID new_id = this->id();
2120 PBD::ID old_id = this->id();
2122 if ((prop = node.property ("id")) != 0) {
2123 old_id = prop->value ();
2126 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2128 /* find the node with the type-specific node name ("lv2", "ladspa", etc)
2129 and set all plugins to the same state.
2132 if ((*niter)->name() == plugin->state_node_name()) {
2134 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2135 /* Plugin state can include external files which are named after the ID.
2137 * If regenerate_xml_or_string_ids() is set, the ID will already have
2138 * been changed, so we need to use the old ID from the XML to load the
2139 * state and then update the ID.
2141 * When copying a plugin-state, route_ui takes care of of updating the ID,
2142 * but we need to call set_insert_id() to clear the cached plugin-state
2143 * and force a change.
2145 if (!regenerate_xml_or_string_ids ()) {
2146 (*i)->set_insert_id (new_id);
2148 (*i)->set_insert_id (old_id);
2151 (*i)->set_state (**niter, version);
2153 if (regenerate_xml_or_string_ids ()) {
2154 (*i)->set_insert_id (new_id);
2162 if (version < 3000) {
2164 /* Only 2.X sessions need a call to set_parameter_state() - in 3.X and above
2165 this is all handled by Automatable
2168 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2169 if ((*niter)->name() == "Redirect") {
2170 /* XXX do we need to tackle placement? i think not (pd; oct 16 2009) */
2171 Processor::set_state (**niter, version);
2176 set_parameter_state_2X (node, version);
2179 if ((prop = node.property (X_("custom"))) != 0) {
2180 _custom_cfg = string_is_affirmative (prop->value());
2183 uint32_t in_maps = 0;
2184 uint32_t out_maps = 0;
2185 XMLNodeList kids = node.children ();
2186 for (XMLNodeIterator i = kids.begin(); i != kids.end(); ++i) {
2187 if ((*i)->name() == X_("ConfiguredOutput")) {
2188 _custom_out = ChanCount(**i);
2190 if ((*i)->name() == X_("PresetOutput")) {
2191 _preset_out = ChanCount(**i);
2193 if (strncmp ((*i)->name ().c_str(), X_("InputMap-"), 9) == 0) {
2194 long pc = atol (&((*i)->name().c_str()[9]));
2195 if (pc >=0 && pc <= get_count()) {
2196 _in_map[pc] = ChanMapping (**i);
2200 if (strncmp ((*i)->name ().c_str(), X_("OutputMap-"), 10) == 0) {
2201 long pc = atol (&((*i)->name().c_str()[10]));
2202 if (pc >=0 && pc <= get_count()) {
2203 _out_map[pc] = ChanMapping (**i);
2207 if ((*i)->name () == "ThruMap") {
2208 _thru_map = ChanMapping (**i);
2211 // sidechain is a Processor (IO)
2212 if ((*i)->name () == Processor::state_node_name) {
2216 _sidechain->set_state (**i, version);
2220 if (in_maps == out_maps && out_maps >0 && out_maps == get_count()) {
2221 _maps_from_state = true;
2224 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2228 (*i)->deactivate ();
2232 PluginConfigChanged (); /* EMIT SIGNAL */
2237 PluginInsert::update_id (PBD::ID id)
2240 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2241 (*i)->set_insert_id (id);
2246 PluginInsert::set_state_dir (const std::string& d)
2248 // state() only saves the state of the first plugin
2249 _plugins[0]->set_state_dir (d);
2253 PluginInsert::set_parameter_state_2X (const XMLNode& node, int version)
2255 XMLNodeList nlist = node.children();
2256 XMLNodeIterator niter;
2258 /* look for port automation node */
2260 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2262 if ((*niter)->name() != port_automation_node_name) {
2268 XMLNodeConstIterator iter;
2273 cnodes = (*niter)->children ("port");
2275 for (iter = cnodes.begin(); iter != cnodes.end(); ++iter){
2279 if ((cprop = child->property("number")) != 0) {
2280 port = cprop->value().c_str();
2282 warning << _("PluginInsert: Auto: no ladspa port number") << endmsg;
2286 sscanf (port, "%" PRIu32, &port_id);
2288 if (port_id >= _plugins[0]->parameter_count()) {
2289 warning << _("PluginInsert: Auto: port id out of range") << endmsg;
2293 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(
2294 control(Evoral::Parameter(PluginAutomation, 0, port_id), true));
2296 if (c && c->alist()) {
2297 if (!child->children().empty()) {
2298 c->alist()->set_state (*child->children().front(), version);
2300 /* In some cases 2.X saves lists with min_yval and max_yval
2301 being FLT_MIN and FLT_MAX respectively. This causes problems
2302 in A3 because these min/max values are used to compute
2303 where GUI control points should be drawn. If we see such
2304 values, `correct' them to the min/max of the appropriate
2308 float min_y = c->alist()->get_min_y ();
2309 float max_y = c->alist()->get_max_y ();
2311 ParameterDescriptor desc;
2312 _plugins.front()->get_parameter_descriptor (port_id, desc);
2314 if (min_y == FLT_MIN) {
2318 if (max_y == FLT_MAX) {
2322 c->alist()->set_yrange (min_y, max_y);
2325 error << string_compose (_("PluginInsert: automatable control %1 not found - ignored"), port_id) << endmsg;
2337 PluginInsert::describe_parameter (Evoral::Parameter param)
2339 if (param.type() == PluginAutomation) {
2340 return _plugins[0]->describe_parameter (param);
2341 } else if (param.type() == PluginPropertyAutomation) {
2342 boost::shared_ptr<AutomationControl> c(automation_control(param));
2343 if (c && !c->desc().label.empty()) {
2344 return c->desc().label;
2347 return Automatable::describe_parameter(param);
2351 PluginInsert::signal_latency() const
2353 if (_user_latency) {
2354 return _user_latency;
2357 return _plugins[0]->signal_latency ();
2361 PluginInsert::type ()
2363 return plugin()->get_info()->type;
2366 PluginInsert::PluginControl::PluginControl (PluginInsert* p,
2367 const Evoral::Parameter& param,
2368 const ParameterDescriptor& desc,
2369 boost::shared_ptr<AutomationList> list)
2370 : AutomationControl (p->session(), param, desc, list, p->describe_parameter(param))
2374 alist()->reset_default (desc.normal);
2376 list->set_interpolation(Evoral::ControlList::Discrete);
2381 set_flags(Controllable::Toggle);
2385 /** @param val `user' value */
2387 PluginInsert::PluginControl::set_value (double user_val, PBD::Controllable::GroupControlDisposition group_override)
2390 _set_value (user_val, group_override);
2394 PluginInsert::PluginControl::set_value_unchecked (double user_val)
2396 /* used only by automation playback */
2397 _set_value (user_val, Controllable::NoGroup);
2401 PluginInsert::PluginControl::_set_value (double user_val, PBD::Controllable::GroupControlDisposition group_override)
2403 /* FIXME: probably should be taking out some lock here.. */
2405 for (Plugins::iterator i = _plugin->_plugins.begin(); i != _plugin->_plugins.end(); ++i) {
2406 (*i)->set_parameter (_list->parameter().id(), user_val);
2409 boost::shared_ptr<Plugin> iasp = _plugin->_impulseAnalysisPlugin.lock();
2411 iasp->set_parameter (_list->parameter().id(), user_val);
2414 AutomationControl::set_value (user_val, group_override);
2418 PluginInsert::PluginControl::catch_up_with_external_value (double user_val)
2420 AutomationControl::set_value (user_val, Controllable::NoGroup);
2424 PluginInsert::PluginControl::get_state ()
2428 XMLNode& node (AutomationControl::get_state());
2429 ss << parameter().id();
2430 node.add_property (X_("parameter"), ss.str());
2432 boost::shared_ptr<LV2Plugin> lv2plugin = boost::dynamic_pointer_cast<LV2Plugin> (_plugin->_plugins[0]);
2434 node.add_property (X_("symbol"), lv2plugin->port_symbol (parameter().id()));
2441 /** @return `user' val */
2443 PluginInsert::PluginControl::get_value () const
2445 boost::shared_ptr<Plugin> plugin = _plugin->plugin (0);
2451 return plugin->get_parameter (_list->parameter().id());
2454 PluginInsert::PluginPropertyControl::PluginPropertyControl (PluginInsert* p,
2455 const Evoral::Parameter& param,
2456 const ParameterDescriptor& desc,
2457 boost::shared_ptr<AutomationList> list)
2458 : AutomationControl (p->session(), param, desc, list)
2462 alist()->set_yrange (desc.lower, desc.upper);
2463 alist()->reset_default (desc.normal);
2467 set_flags(Controllable::Toggle);
2472 PluginInsert::PluginPropertyControl::set_value (double user_val, PBD::Controllable::GroupControlDisposition /* group_override*/)
2475 set_value_unchecked (user_val);
2480 PluginInsert::PluginPropertyControl::set_value_unchecked (double user_val)
2482 /* Old numeric set_value(), coerce to appropriate datatype if possible.
2483 This is lossy, but better than nothing until Ardour's automation system
2484 can handle various datatypes all the way down. */
2485 const Variant value(_desc.datatype, user_val);
2486 if (value.type() == Variant::NOTHING) {
2487 error << "set_value(double) called for non-numeric property" << endmsg;
2491 for (Plugins::iterator i = _plugin->_plugins.begin(); i != _plugin->_plugins.end(); ++i) {
2492 (*i)->set_property(_list->parameter().id(), value);
2496 AutomationControl::set_value (user_val, Controllable::NoGroup);
2500 PluginInsert::PluginPropertyControl::get_state ()
2504 XMLNode& node (AutomationControl::get_state());
2505 ss << parameter().id();
2506 node.add_property (X_("property"), ss.str());
2507 node.remove_property (X_("value"));
2513 PluginInsert::PluginPropertyControl::get_value () const
2515 return _value.to_double();
2518 boost::shared_ptr<Plugin>
2519 PluginInsert::get_impulse_analysis_plugin()
2521 boost::shared_ptr<Plugin> ret;
2522 if (_impulseAnalysisPlugin.expired()) {
2523 // LV2 in particular uses various _session params
2524 // during init() -- most notably block_size..
2526 ret = plugin_factory(_plugins[0]);
2527 ret->configure_io (internal_input_streams (), internal_output_streams ());
2528 _impulseAnalysisPlugin = ret;
2530 ret = _impulseAnalysisPlugin.lock();
2537 PluginInsert::collect_signal_for_analysis (framecnt_t nframes)
2539 // called from outside the audio thread, so this should be safe
2540 // only do audio as analysis is (currently) only for audio plugins
2541 _signal_analysis_inputs.ensure_buffers( DataType::AUDIO, internal_input_streams().n_audio(), nframes);
2542 _signal_analysis_outputs.ensure_buffers( DataType::AUDIO, internal_output_streams().n_audio(), nframes);
2544 _signal_analysis_collected_nframes = 0;
2545 _signal_analysis_collect_nframes_max = nframes;
2548 /** Add a plugin to our list */
2550 PluginInsert::add_plugin (boost::shared_ptr<Plugin> plugin)
2552 plugin->set_insert_id (this->id());
2554 if (_plugins.empty()) {
2555 /* first (and probably only) plugin instance - connect to relevant signals */
2557 plugin->ParameterChangedExternally.connect_same_thread (*this, boost::bind (&PluginInsert::parameter_changed_externally, this, _1, _2));
2558 plugin->StartTouch.connect_same_thread (*this, boost::bind (&PluginInsert::start_touch, this, _1));
2559 plugin->EndTouch.connect_same_thread (*this, boost::bind (&PluginInsert::end_touch, this, _1));
2560 plugin->LatencyChanged.connect_same_thread (*this, boost::bind (&PluginInsert::latency_changed, this, _1, _2));
2561 // cache sidechain port count
2562 _cached_sidechain_pins.reset ();
2563 const ChanCount& nis (plugin->get_info()->n_inputs);
2564 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2565 for (uint32_t in = 0; in < nis.get (*t); ++in) {
2566 const Plugin::IOPortDescription& iod (plugin->describe_io_port (*t, true, in));
2567 if (iod.is_sidechain) {
2568 _cached_sidechain_pins.set (*t, 1 + _cached_sidechain_pins.n(*t));
2573 #if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT)
2574 boost::shared_ptr<VSTPlugin> vst = boost::dynamic_pointer_cast<VSTPlugin> (plugin);
2576 vst->set_insert (this, _plugins.size ());
2579 _plugins.push_back (plugin);
2583 PluginInsert::realtime_handle_transport_stopped ()
2585 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2586 (*i)->realtime_handle_transport_stopped ();
2591 PluginInsert::realtime_locate ()
2593 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2594 (*i)->realtime_locate ();
2599 PluginInsert::monitoring_changed ()
2601 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2602 (*i)->monitoring_changed ();
2607 PluginInsert::latency_changed (framecnt_t, framecnt_t)
2609 // this is called in RT context, LatencyChanged is emitted after run()
2610 _latency_changed = true;
2614 PluginInsert::start_touch (uint32_t param_id)
2616 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id));
2618 ac->start_touch (session().audible_frame());
2623 PluginInsert::end_touch (uint32_t param_id)
2625 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id));
2627 ac->stop_touch (true, session().audible_frame());
2631 std::ostream& operator<<(std::ostream& o, const ARDOUR::PluginInsert::Match& m)
2634 case PluginInsert::Impossible: o << "Impossible"; break;
2635 case PluginInsert::Delegate: o << "Delegate"; break;
2636 case PluginInsert::NoInputs: o << "NoInputs"; break;
2637 case PluginInsert::ExactMatch: o << "ExactMatch"; break;
2638 case PluginInsert::Replicate: o << "Replicate"; break;
2639 case PluginInsert::Split: o << "Split"; break;
2640 case PluginInsert::Hide: o << "Hide"; break;
2642 o << " cnt: " << m.plugins
2643 << (m.strict_io ? " strict-io" : "")
2644 << (m.custom_cfg ? " custom-cfg" : "");
2645 if (m.method == PluginInsert::Hide) {
2646 o << " hide: " << m.hide;