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"
41 #include "ardour/lv2_plugin.h"
44 #ifdef WINDOWS_VST_SUPPORT
45 #include "ardour/windows_vst_plugin.h"
49 #include "ardour/lxvst_plugin.h"
52 #ifdef AUDIOUNIT_SUPPORT
53 #include "ardour/audio_unit.h"
56 #include "ardour/session.h"
57 #include "ardour/types.h"
62 using namespace ARDOUR;
65 const string PluginInsert::port_automation_node_name = "PortAutomation";
67 PluginInsert::PluginInsert (Session& s, boost::shared_ptr<Plugin> plug)
68 : Processor (s, (plug ? plug->name() : string ("toBeRenamed")))
69 , _signal_analysis_collected_nframes(0)
70 , _signal_analysis_collect_nframes_max(0)
75 , _pending_no_inplace (false)
77 /* the first is the master */
81 create_automatable_parameters ();
85 PluginInsert::~PluginInsert ()
90 PluginInsert::set_strict_io (bool b)
92 bool changed = _strict_io != b;
95 PluginConfigChanged (); /* EMIT SIGNAL */
100 PluginInsert::set_count (uint32_t num)
102 bool require_state = !_plugins.empty();
104 /* this is a bad idea.... we shouldn't do this while active.
105 only a route holding their redirect_lock should be calling this
110 } else if (num > _plugins.size()) {
111 uint32_t diff = num - _plugins.size();
113 for (uint32_t n = 0; n < diff; ++n) {
114 boost::shared_ptr<Plugin> p = plugin_factory (_plugins[0]);
121 /* XXX do something */
124 PluginConfigChanged (); /* EMIT SIGNAL */
126 } else if (num < _plugins.size()) {
127 uint32_t diff = _plugins.size() - num;
128 for (uint32_t n= 0; n < diff; ++n) {
131 PluginConfigChanged (); /* EMIT SIGNAL */
139 PluginInsert::set_outputs (const ChanCount& c)
141 bool changed = (_custom_out != c) && _custom_cfg;
144 PluginConfigChanged (); /* EMIT SIGNAL */
149 PluginInsert::set_custom_cfg (bool b)
151 bool changed = _custom_cfg != b;
154 PluginConfigChanged (); /* EMIT SIGNAL */
159 PluginInsert::control_list_automation_state_changed (Evoral::Parameter which, AutoState s)
161 if (which.type() != PluginAutomation)
164 boost::shared_ptr<AutomationControl> c
165 = boost::dynamic_pointer_cast<AutomationControl>(control (which));
168 _plugins[0]->set_parameter (which.id(), c->list()->eval (_session.transport_frame()));
173 PluginInsert::output_streams() const
175 assert (_configured);
176 return _configured_out;
180 PluginInsert::input_streams() const
182 assert (_configured);
183 return _configured_in;
187 PluginInsert::internal_output_streams() const
189 assert (!_plugins.empty());
191 PluginInfoPtr info = _plugins.front()->get_info();
193 if (info->reconfigurable_io()) {
194 ChanCount out = _plugins.front()->output_streams ();
195 // DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, reconfigur(able) output streams = %1\n", out));
198 ChanCount out = info->n_outputs;
199 // DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, static output streams = %1 for %2 plugins\n", out, _plugins.size()));
200 out.set_audio (out.n_audio() * _plugins.size());
201 out.set_midi (out.n_midi() * _plugins.size());
207 PluginInsert::internal_input_streams() const
209 assert (!_plugins.empty());
213 PluginInfoPtr info = _plugins.front()->get_info();
215 if (info->reconfigurable_io()) {
216 assert (_plugins.size() == 1);
217 in = _plugins.front()->input_streams();
222 DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, input streams = %1, match using %2\n", in, _match.method));
224 if (_match.method == Split) {
226 /* we are splitting 1 processor input to multiple plugin inputs,
227 so we have a maximum of 1 stream of each type.
229 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
230 if (in.get (*t) > 1) {
236 } else if (_match.method == Hide) {
238 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
239 in.set (*t, in.get (*t) - _match.hide.get (*t));
245 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
246 in.set (*t, in.get (*t) * _plugins.size ());
254 PluginInsert::natural_output_streams() const
256 return _plugins[0]->get_info()->n_outputs;
260 PluginInsert::natural_input_streams() const
262 return _plugins[0]->get_info()->n_inputs;
266 PluginInsert::has_no_inputs() const
268 return _plugins[0]->get_info()->n_inputs == ChanCount::ZERO;
272 PluginInsert::has_no_audio_inputs() const
274 return _plugins[0]->get_info()->n_inputs.n_audio() == 0;
278 PluginInsert::is_midi_instrument() const
280 /* XXX more finesse is possible here. VST plugins have a
281 a specific "instrument" flag, for example.
283 PluginInfoPtr pi = _plugins[0]->get_info();
285 return pi->n_inputs.n_midi() != 0 &&
286 pi->n_outputs.n_audio() > 0;
290 PluginInsert::create_automatable_parameters ()
292 assert (!_plugins.empty());
294 set<Evoral::Parameter> a = _plugins.front()->automatable ();
296 for (set<Evoral::Parameter>::iterator i = a.begin(); i != a.end(); ++i) {
297 if (i->type() == PluginAutomation) {
299 Evoral::Parameter param(*i);
301 ParameterDescriptor desc;
302 _plugins.front()->get_parameter_descriptor(i->id(), desc);
304 can_automate (param);
305 boost::shared_ptr<AutomationList> list(new AutomationList(param, desc));
306 boost::shared_ptr<AutomationControl> c (new PluginControl(this, param, desc, list));
308 _plugins.front()->set_automation_control (i->id(), c);
309 } else if (i->type() == PluginPropertyAutomation) {
310 Evoral::Parameter param(*i);
311 const ParameterDescriptor& desc = _plugins.front()->get_property_descriptor(param.id());
312 if (desc.datatype != Variant::NOTHING) {
313 boost::shared_ptr<AutomationList> list;
314 if (Variant::type_is_numeric(desc.datatype)) {
315 list = boost::shared_ptr<AutomationList>(new AutomationList(param, desc));
317 add_control (boost::shared_ptr<AutomationControl> (new PluginPropertyControl(this, param, desc, list)));
322 /** Called when something outside of this host has modified a plugin
323 * parameter. Responsible for propagating the change to two places:
325 * 1) anything listening to the Control itself
326 * 2) any replicated plugins that make up this PluginInsert.
328 * The PluginInsert is connected to the ParameterChangedExternally signal for
329 * the first (primary) plugin, and here broadcasts that change to any others.
331 * XXX We should probably drop this whole replication idea (Paul, October 2015)
332 * since it isn't used by sensible plugin APIs (AU, LV2).
335 PluginInsert::parameter_changed_externally (uint32_t which, float val)
337 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, which));
339 /* First propagation: alter the underlying value of the control,
340 * without telling the plugin(s) that own/use it to set it.
347 boost::shared_ptr<PluginControl> pc = boost::dynamic_pointer_cast<PluginControl> (ac);
350 pc->catch_up_with_external_value (val);
353 /* Second propagation: tell all plugins except the first to
354 update the value of this parameter. For sane plugin APIs,
355 there are no other plugins, so this is a no-op in those
359 Plugins::iterator i = _plugins.begin();
361 /* don't set the first plugin, just all the slaves */
363 if (i != _plugins.end()) {
365 for (; i != _plugins.end(); ++i) {
366 (*i)->set_parameter (which, val);
372 PluginInsert::set_block_size (pframes_t nframes)
375 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
376 if ((*i)->set_block_size (nframes) != 0) {
384 PluginInsert::activate ()
386 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
390 Processor::activate ();
394 PluginInsert::deactivate ()
396 Processor::deactivate ();
398 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
404 PluginInsert::flush ()
406 for (vector<boost::shared_ptr<Plugin> >::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
412 PluginInsert::connect_and_run (BufferSet& bufs, pframes_t nframes, framecnt_t offset, bool with_auto, framepos_t now)
414 PinMappings in_map (_in_map);
415 PinMappings out_map (_out_map);
418 // auto-detect if inplace processing is possible
419 // TODO: do this once. during configure_io and every time the
420 // plugin-count or mapping changes.
421 bool inplace_ok = true;
422 for (uint32_t pc = 0; pc < get_count() && inplace_ok ; ++pc) {
423 if (!in_map[pc].is_monotonic ()) {
426 if (!out_map[pc].is_monotonic ()) {
431 if (_pending_no_inplace != !inplace_ok) {
432 #ifndef NDEBUG // this 'cerr' needs to go ASAP.
433 cerr << name () << " automatically set : " << (inplace_ok ? "Use Inplace" : "No Inplace") << "\n"; // XXX
435 _pending_no_inplace = !inplace_ok;
439 _no_inplace = _pending_no_inplace || _plugins.front()->inplace_broken ();
443 // TODO optimize special case.
444 // Currently this never triggers because the in_map for "Split" triggeres no_inplace.
445 if (_match.method == Split && !_no_inplace) {
446 assert (in_map.size () == 1);
447 in_map[0] = ChanMapping (ChanCount::max (natural_input_streams (), _configured_in));
448 ChanCount const in_streams = internal_input_streams ();
449 /* copy the first stream's audio buffer contents to the others */
451 uint32_t first_idx = in_map[0].get (DataType::AUDIO, 0, &valid);
453 for (uint32_t i = in_streams.n_audio(); i < natural_input_streams().n_audio(); ++i) {
454 uint32_t idx = in_map[0].get (DataType::AUDIO, i, &valid);
456 bufs.get_audio(idx).read_from(bufs.get_audio(first_idx), nframes, offset, offset);
463 bufs.set_count(ChanCount::max(bufs.count(), _configured_in));
464 bufs.set_count(ChanCount::max(bufs.count(), _configured_out));
470 for (Controls::iterator li = controls().begin(); li != controls().end(); ++li, ++n) {
472 boost::shared_ptr<AutomationControl> c
473 = boost::dynamic_pointer_cast<AutomationControl>(li->second);
475 if (c->list() && c->automation_playback()) {
478 const float val = c->list()->rt_safe_eval (now, valid);
481 /* This is the ONLY place where we are
483 * AutomationControl::set_value_unchecked(). We
484 * know that the control is in
485 * automation playback mode, so no
486 * check on writable() is required
487 * (which must be done in AutomationControl::set_value()
490 c->set_value_unchecked(val);
497 /* Calculate if, and how many frames we need to collect for analysis */
498 framecnt_t collect_signal_nframes = (_signal_analysis_collect_nframes_max -
499 _signal_analysis_collected_nframes);
500 if (nframes < collect_signal_nframes) { // we might not get all frames now
501 collect_signal_nframes = nframes;
504 if (collect_signal_nframes > 0) {
506 //std::cerr << "collect input, bufs " << bufs.count().n_audio() << " count, " << bufs.available().n_audio() << " available" << std::endl;
507 //std::cerr << " streams " << internal_input_streams().n_audio() << std::endl;
508 //std::cerr << "filling buffer with " << collect_signal_nframes << " frames at " << _signal_analysis_collected_nframes << std::endl;
510 _signal_analysis_inputs.set_count(internal_input_streams());
512 for (uint32_t i = 0; i < internal_input_streams().n_audio(); ++i) {
513 _signal_analysis_inputs.get_audio(i).read_from(
515 collect_signal_nframes,
516 _signal_analysis_collected_nframes); // offset is for target buffer
521 if (_plugins.front()->is_channelstrip() ) {
522 if (_configured_in.n_audio() > 0) {
523 ChanMapping mb_in_map (ChanCount::min (_configured_in, ChanCount (DataType::AUDIO, 2)));
524 ChanMapping mb_out_map (ChanCount::min (_configured_out, ChanCount (DataType::AUDIO, 2)));
526 _plugins.front()->connect_and_run (bufs, mb_in_map, mb_out_map, nframes, offset);
528 for (uint32_t out = _configured_in.n_audio (); out < bufs.count().get (DataType::AUDIO); ++out) {
529 bufs.get (DataType::AUDIO, out).silence (nframes, offset);
535 BufferSet& inplace_bufs = _session.get_noinplace_buffers();
536 ARDOUR::ChanMapping used_outputs;
539 // TODO optimize this flow. prepare during configure_io()
540 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
542 ARDOUR::ChanMapping i_in_map (natural_input_streams());
543 ARDOUR::ChanMapping i_out_map;
544 ARDOUR::ChanCount mapped;
545 ARDOUR::ChanCount backmap;
547 // map inputs sequentially
548 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
549 for (uint32_t in = 0; in < natural_input_streams().get (*t); ++in) {
551 uint32_t in_idx = in_map[pc].get (*t, in, &valid);
552 uint32_t m = mapped.get (*t);
554 inplace_bufs.get (*t, m).read_from (bufs.get (*t, in_idx), nframes, offset, offset);
556 inplace_bufs.get (*t, m).silence (nframes, offset);
558 mapped.set (*t, m + 1);
562 // TODO use map_offset_to() instead ??
566 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
567 for (uint32_t out = 0; out < natural_output_streams().get (*t); ++out) {
568 uint32_t m = mapped.get (*t);
569 inplace_bufs.get (*t, m).silence (nframes, offset);
570 i_out_map.set (*t, out, m);
571 mapped.set (*t, m + 1);
575 if ((*i)->connect_and_run(inplace_bufs, i_in_map, i_out_map, nframes, offset)) {
580 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
581 for (uint32_t out = 0; out < natural_output_streams().get (*t); ++out) {
582 uint32_t m = backmap.get (*t);
584 uint32_t out_idx = out_map[pc].get (*t, out, &valid);
586 bufs.get (*t, out_idx).read_from (inplace_bufs.get (*t, m), nframes, offset, offset);
587 used_outputs.set (*t, out_idx, 1); // mark as used
589 backmap.set (*t, m + 1);
593 /* all instances have completed, now clear outputs that have not been written to.
594 * (except midi bypass)
596 if (has_midi_bypass ()) {
597 used_outputs.set (DataType::MIDI, 0, 1); // Midi bypass.
599 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
600 for (uint32_t out = 0; out < bufs.count().get (*t); ++out) {
602 used_outputs.get (*t, out, &valid);
603 if (valid) { continue; }
604 bufs.get (*t, out).silence (nframes, offset);
610 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
611 if ((*i)->connect_and_run(bufs, in_map[pc], out_map[pc], nframes, offset)) {
616 // TODO optimize: store "unconnected" in a fixed set.
617 // it only changes on reconfiguration.
618 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
619 for (uint32_t out = 0; out < bufs.count().get (*t); ++out) {
621 if (*t == DataType::MIDI && out == 0 && has_midi_bypass ()) {
622 mapped = true; // in-place Midi bypass
624 for (uint32_t pc = 0; pc < get_count() && !mapped; ++pc) {
625 for (uint32_t o = 0; o < natural_output_streams().get (*t); ++o) {
627 uint32_t idx = out_map[pc].get (*t, o, &valid);
628 if (valid && idx == out) {
635 bufs.get (*t, out).silence (nframes, offset);
641 if (collect_signal_nframes > 0) {
643 //std::cerr << " output, bufs " << bufs.count().n_audio() << " count, " << bufs.available().n_audio() << " available" << std::endl;
644 //std::cerr << " streams " << internal_output_streams().n_audio() << std::endl;
646 _signal_analysis_outputs.set_count(internal_output_streams());
648 for (uint32_t i = 0; i < internal_output_streams().n_audio(); ++i) {
649 _signal_analysis_outputs.get_audio(i).read_from(
651 collect_signal_nframes,
652 _signal_analysis_collected_nframes); // offset is for target buffer
655 _signal_analysis_collected_nframes += collect_signal_nframes;
656 assert(_signal_analysis_collected_nframes <= _signal_analysis_collect_nframes_max);
658 if (_signal_analysis_collected_nframes == _signal_analysis_collect_nframes_max) {
659 _signal_analysis_collect_nframes_max = 0;
660 _signal_analysis_collected_nframes = 0;
662 AnalysisDataGathered(&_signal_analysis_inputs,
663 &_signal_analysis_outputs);
669 PluginInsert::silence (framecnt_t nframes)
675 ChanMapping in_map (natural_input_streams ());
676 ChanMapping out_map (natural_output_streams ());
678 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
679 (*i)->connect_and_run (_session.get_scratch_buffers ((*i)->get_info()->n_inputs, true), in_map, out_map, nframes, 0);
684 PluginInsert::run (BufferSet& bufs, framepos_t start_frame, framepos_t /*end_frame*/, pframes_t nframes, bool)
686 if (_pending_active) {
687 /* run as normal if we are active or moving from inactive to active */
689 if (_session.transport_rolling() || _session.bounce_processing()) {
690 automation_run (bufs, start_frame, nframes);
692 connect_and_run (bufs, nframes, 0, false);
696 // TODO use mapping in bypassed mode ?!
697 // -> do we bypass the processor or the plugin
699 uint32_t in = input_streams ().n_audio ();
700 uint32_t out = output_streams().n_audio ();
702 if (has_no_audio_inputs() || in == 0) {
704 /* silence all (audio) outputs. Should really declick
705 * at the transitions of "active"
708 for (uint32_t n = 0; n < out; ++n) {
709 bufs.get_audio (n).silence (nframes);
712 } else if (out > in) {
714 /* not active, but something has make up for any channel count increase
715 * for now , simply replicate last buffer
717 for (uint32_t n = in; n < out; ++n) {
718 bufs.get_audio(n).read_from(bufs.get_audio(in - 1), nframes);
722 bufs.count().set_audio (out);
725 _active = _pending_active;
727 /* we have no idea whether the plugin generated silence or not, so mark
728 * all buffers appropriately.
733 PluginInsert::automation_run (BufferSet& bufs, framepos_t start, pframes_t nframes)
735 Evoral::ControlEvent next_event (0, 0.0f);
736 framepos_t now = start;
737 framepos_t end = now + nframes;
738 framecnt_t offset = 0;
740 Glib::Threads::Mutex::Lock lm (control_lock(), Glib::Threads::TRY_LOCK);
743 connect_and_run (bufs, nframes, offset, false);
747 if (!find_next_event (now, end, next_event) || _plugins.front()->requires_fixed_sized_buffers()) {
749 /* no events have a time within the relevant range */
751 connect_and_run (bufs, nframes, offset, true, now);
757 framecnt_t cnt = min (((framecnt_t) ceil (next_event.when) - now), (framecnt_t) nframes);
759 connect_and_run (bufs, cnt, offset, true, now);
765 if (!find_next_event (now, end, next_event)) {
770 /* cleanup anything that is left to do */
773 connect_and_run (bufs, nframes, offset, true, now);
778 PluginInsert::default_parameter_value (const Evoral::Parameter& param)
780 if (param.type() != PluginAutomation)
783 if (_plugins.empty()) {
784 fatal << _("programming error: ") << X_("PluginInsert::default_parameter_value() called with no plugin")
786 abort(); /*NOTREACHED*/
789 return _plugins[0]->default_value (param.id());
794 PluginInsert::can_reset_all_parameters ()
798 for (uint32_t par = 0; par < _plugins[0]->parameter_count(); ++par) {
800 const uint32_t cid = _plugins[0]->nth_parameter (par, ok);
802 if (!ok || !_plugins[0]->parameter_is_input(cid)) {
806 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, cid));
812 if (ac->automation_state() & Play) {
817 return all && (params > 0);
821 PluginInsert::reset_parameters_to_default ()
825 for (uint32_t par = 0; par < _plugins[0]->parameter_count(); ++par) {
827 const uint32_t cid = _plugins[0]->nth_parameter (par, ok);
829 if (!ok || !_plugins[0]->parameter_is_input(cid)) {
833 const float dflt = _plugins[0]->default_value (cid);
834 const float curr = _plugins[0]->get_parameter (cid);
840 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, cid));
845 if (ac->automation_state() & Play) {
850 ac->set_value (dflt, Controllable::NoGroup);
855 boost::shared_ptr<Plugin>
856 PluginInsert::plugin_factory (boost::shared_ptr<Plugin> other)
858 boost::shared_ptr<LadspaPlugin> lp;
859 boost::shared_ptr<LuaProc> lua;
861 boost::shared_ptr<LV2Plugin> lv2p;
863 #ifdef WINDOWS_VST_SUPPORT
864 boost::shared_ptr<WindowsVSTPlugin> vp;
867 boost::shared_ptr<LXVSTPlugin> lxvp;
869 #ifdef AUDIOUNIT_SUPPORT
870 boost::shared_ptr<AUPlugin> ap;
873 if ((lp = boost::dynamic_pointer_cast<LadspaPlugin> (other)) != 0) {
874 return boost::shared_ptr<Plugin> (new LadspaPlugin (*lp));
875 } else if ((lua = boost::dynamic_pointer_cast<LuaProc> (other)) != 0) {
876 return boost::shared_ptr<Plugin> (new LuaProc (*lua));
878 } else if ((lv2p = boost::dynamic_pointer_cast<LV2Plugin> (other)) != 0) {
879 return boost::shared_ptr<Plugin> (new LV2Plugin (*lv2p));
881 #ifdef WINDOWS_VST_SUPPORT
882 } else if ((vp = boost::dynamic_pointer_cast<WindowsVSTPlugin> (other)) != 0) {
883 return boost::shared_ptr<Plugin> (new WindowsVSTPlugin (*vp));
886 } else if ((lxvp = boost::dynamic_pointer_cast<LXVSTPlugin> (other)) != 0) {
887 return boost::shared_ptr<Plugin> (new LXVSTPlugin (*lxvp));
889 #ifdef AUDIOUNIT_SUPPORT
890 } else if ((ap = boost::dynamic_pointer_cast<AUPlugin> (other)) != 0) {
891 return boost::shared_ptr<Plugin> (new AUPlugin (*ap));
895 fatal << string_compose (_("programming error: %1"),
896 X_("unknown plugin type in PluginInsert::plugin_factory"))
898 abort(); /*NOTREACHED*/
899 return boost::shared_ptr<Plugin> ((Plugin*) 0);
903 PluginInsert::set_input_map (uint32_t num, ChanMapping m) {
904 if (num < _in_map.size()) {
905 bool changed = _in_map[num] != m;
908 PluginMapChanged (); /* EMIT SIGNAL */
914 PluginInsert::set_output_map (uint32_t num, ChanMapping m) {
915 if (num < _out_map.size()) {
916 bool changed = _out_map[num] != m;
919 PluginMapChanged (); /* EMIT SIGNAL */
925 PluginInsert::input_map () const
929 for (PinMappings::const_iterator i = _in_map.begin (); i != _in_map.end (); ++i, ++pc) {
930 ChanMapping m (i->second);
931 const ChanMapping::Mappings& mp ((*i).second.mappings());
932 for (ChanMapping::Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
933 for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
934 rv.set (tm->first, i->first + pc * natural_input_streams().get(tm->first), i->second);
942 PluginInsert::output_map () const
946 for (PinMappings::const_iterator i = _out_map.begin (); i != _out_map.end (); ++i, ++pc) {
947 ChanMapping m (i->second);
948 const ChanMapping::Mappings& mp ((*i).second.mappings());
949 for (ChanMapping::Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
950 for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
951 rv.set (tm->first, i->first + pc * natural_output_streams().get(tm->first), i->second);
955 if (has_midi_bypass ()) {
956 rv.set (DataType::MIDI, 0, 0);
963 PluginInsert::has_midi_bypass () const
965 if (_configured_in.n_midi () == 1 && _configured_out.n_midi () == 1 && natural_output_streams ().n_midi () == 0) {
972 PluginInsert::configure_io (ChanCount in, ChanCount out)
974 Match old_match = _match;
979 old_in = _configured_in;
980 old_out = _configured_out;
984 _configured_out = out;
986 /* get plugin configuration */
987 _match = private_can_support_io_configuration (in, out);
988 #ifndef NDEBUG // XXX
989 cout << "Match '" << name() << "': " << _match;
992 /* set the matching method and number of plugins that we will use to meet this configuration */
993 if (set_count (_match.plugins) == false) {
994 PluginIoReConfigure (); /* EMIT SIGNAL */
999 /* configure plugins */
1000 switch (_match.method) {
1003 if (_plugins.front()->configure_io (natural_input_streams(), out) == false) {
1004 PluginIoReConfigure (); /* EMIT SIGNAL */
1005 _configured = false;
1013 bool const r = _plugins.front()->can_support_io_configuration (in, dout, &useins);
1015 assert (_match.strict_io || dout.n_audio() == out.n_audio()); // sans midi bypass
1016 if (useins.n_audio() == 0) {
1019 if (_plugins.front()->configure_io (useins, dout) == false) {
1020 PluginIoReConfigure (); /* EMIT SIGNAL */
1021 _configured = false;
1027 if (_plugins.front()->configure_io (in, out) == false) {
1028 PluginIoReConfigure (); /* EMIT SIGNAL */
1029 _configured = false;
1035 bool mapping_changed = false;
1036 if (old_in == in && old_out == out && _configured
1037 && old_match.method == _match.method
1038 && _in_map.size() == _out_map.size()
1039 && _in_map.size() == get_count ()
1041 /* If the configuraton has not changed, keep the mapping */
1042 } else if (_match.custom_cfg && _configured) {
1043 /* strip dead wood */
1044 for (uint32_t pc = 0; pc < get_count(); ++pc) {
1046 ChanMapping new_out;
1047 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1048 for (uint32_t i = 0; i < natural_input_streams().get (*t); ++i) {
1050 uint32_t idx = _in_map[pc].get (*t, i, &valid);
1051 if (valid && idx <= in.get (*t)) {
1052 new_in.set (*t, i, idx);
1055 for (uint32_t o = 0; o < natural_output_streams().get (*t); ++o) {
1057 uint32_t idx = _out_map[pc].get (*t, o, &valid);
1058 if (valid && idx <= out.get (*t)) {
1059 new_out.set (*t, o, idx);
1063 if (_in_map[pc] != new_in || _out_map[pc] != new_out) {
1064 mapping_changed = true;
1066 _in_map[pc] = new_in;
1067 _out_map[pc] = new_out;
1070 /* generate a new mapping */
1074 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
1075 if (_match.method == Split) {
1076 _in_map[pc] = ChanMapping ();
1077 /* connect inputs in round-robin fashion */
1078 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1079 const uint32_t cend = _configured_in.get (*t);
1080 if (cend == 0) { continue; }
1082 for (uint32_t in = 0; in < natural_input_streams().get (*t); ++in) {
1083 _in_map[pc].set (*t, in, c);
1088 _in_map[pc] = ChanMapping (ChanCount::min (natural_input_streams (), in));
1090 _out_map[pc] = ChanMapping (ChanCount::min (natural_output_streams(), out));
1092 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1093 _in_map[pc].offset_to(*t, pc * natural_input_streams().get(*t));
1094 _out_map[pc].offset_to(*t, pc * natural_output_streams().get(*t));
1096 mapping_changed = true;
1100 if (mapping_changed) {
1101 PluginMapChanged (); /* EMIT SIGNAL */
1102 #ifndef NDEBUG // XXX
1104 cout << "----<<----\n";
1105 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
1106 cout << "Channel Map for " << name() << " plugin " << pc << "\n";
1107 cout << " * Inputs:\n" << _in_map[pc];
1108 cout << " * Outputs:\n" << _out_map[pc];
1110 cout << "---->>----\n";
1114 if (old_in != in || old_out != out
1115 || (old_match.method != _match.method && (old_match.method == Split || _match.method == Split))
1117 PluginIoReConfigure (); /* EMIT SIGNAL */
1120 // we don't know the analysis window size, so we must work with the
1121 // current buffer size here. each request for data fills in these
1122 // buffers and the analyser makes sure it gets enough data for the
1124 session().ensure_buffer_set (_signal_analysis_inputs, in);
1125 //_signal_analysis_inputs.set_count (in);
1127 session().ensure_buffer_set (_signal_analysis_outputs, out);
1128 //_signal_analysis_outputs.set_count (out);
1130 // std::cerr << "set counts to i" << in.n_audio() << "/o" << out.n_audio() << std::endl;
1133 return Processor::configure_io (in, out);
1136 /** Decide whether this PluginInsert can support a given IO configuration.
1137 * To do this, we run through a set of possible solutions in rough order of
1140 * @param in Required input channel count.
1141 * @param out Filled in with the output channel count if we return true.
1142 * @return true if the given IO configuration can be supported.
1145 PluginInsert::can_support_io_configuration (const ChanCount& in, ChanCount& out)
1147 return private_can_support_io_configuration (in, out).method != Impossible;
1150 /** A private version of can_support_io_configuration which returns the method
1151 * by which the configuration can be matched, rather than just whether or not
1155 PluginInsert::private_can_support_io_configuration (ChanCount const & inx, ChanCount& out) const
1157 if (_plugins.empty()) {
1161 /* if a user specified a custom cfg, so be it. */
1164 return Match (ExactMatch, get_count(), false, true); // XXX
1167 /* try automatic configuration */
1168 Match m = PluginInsert::automatic_can_support_io_configuration (inx, out);
1170 PluginInfoPtr info = _plugins.front()->get_info();
1171 ChanCount inputs = info->n_inputs;
1172 ChanCount outputs = info->n_outputs;
1173 ChanCount midi_bypass;
1174 if (inx.get(DataType::MIDI) == 1 && outputs.get(DataType::MIDI) == 0) {
1175 midi_bypass.set (DataType::MIDI, 1);
1178 /* handle case strict-i/o */
1179 if (_strict_io && m.method != Impossible) {
1182 /* special case MIDI instruments */
1183 if (is_midi_instrument()) {
1184 // output = midi-bypass + at most master-out channels.
1185 ChanCount max_out (DataType::AUDIO, 2); // TODO use master-out
1186 max_out.set (DataType::MIDI, out.get(DataType::MIDI));
1187 out = ChanCount::min (out, max_out);
1193 if (inx.n_audio () != out.n_audio ()) { // ignore midi bypass
1194 /* replicate processor to match output count (generators and such)
1195 * at least enough to feed every output port. */
1196 uint32_t f = 1; // at least one. e.g. control data filters, no in, no out.
1197 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1198 uint32_t nin = inputs.get (*t);
1199 if (nin == 0 || inx.get(*t) == 0) { continue; }
1200 f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nin));
1202 out = inx + midi_bypass;
1203 return Match (Replicate, f);
1212 out = inx + midi_bypass;
1213 if (inx.get(DataType::MIDI) == 1
1214 && out.get (DataType::MIDI) == 0
1215 && outputs.get(DataType::MIDI) == 0) {
1216 out += ChanCount (DataType::MIDI, 1);
1221 if (m.method != Impossible) {
1225 if (info->reconfigurable_io()) {
1227 bool const r = _plugins.front()->can_support_io_configuration (inx, out, &useins);
1229 // houston, we have a problem.
1230 return Match (Impossible, 0);
1232 return Match (Delegate, 1);
1235 // add at least as many plugins so that output count matches input count
1237 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1238 uint32_t nin = inputs.get (*t);
1239 uint32_t nout = outputs.get (*t);
1240 if (nin == 0 || inx.get(*t) == 0) { continue; }
1241 // prefer floor() so the count won't overly increase IFF (nin < nout)
1242 f = max (f, (uint32_t) floor (inx.get(*t) / (float)nout));
1244 if (f > 0 && outputs * f >= _configured_out) {
1245 out = outputs * f + midi_bypass;
1246 return Match (Replicate, f);
1249 // add at least as many plugins needed to connect all inputs
1251 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1252 uint32_t nin = inputs.get (*t);
1253 if (nin == 0 || inx.get(*t) == 0) { continue; }
1254 f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nin));
1256 out = outputs * f + midi_bypass;
1257 return Match (Replicate, f);
1260 /* this is the original Ardour 3/4 behavior, mainly for backwards compatibility */
1262 PluginInsert::automatic_can_support_io_configuration (ChanCount const & inx, ChanCount& out) const
1264 if (_plugins.empty()) {
1268 PluginInfoPtr info = _plugins.front()->get_info();
1269 ChanCount in; in += inx;
1270 ChanCount midi_bypass;
1272 if (info->reconfigurable_io()) {
1273 /* Plugin has flexible I/O, so delegate to it */
1274 bool const r = _plugins.front()->can_support_io_configuration (in, out);
1276 return Match (Impossible, 0);
1278 return Match (Delegate, 1);
1281 ChanCount inputs = info->n_inputs;
1282 ChanCount outputs = info->n_outputs;
1284 if (in.get(DataType::MIDI) == 1 && outputs.get(DataType::MIDI) == 0) {
1285 DEBUG_TRACE ( DEBUG::Processors, string_compose ("bypassing midi-data around %1\n", name()));
1286 midi_bypass.set (DataType::MIDI, 1);
1288 if (in.get(DataType::MIDI) == 1 && inputs.get(DataType::MIDI) == 0) {
1289 DEBUG_TRACE ( DEBUG::Processors, string_compose ("hiding midi-port from plugin %1\n", name()));
1290 in.set(DataType::MIDI, 0);
1293 bool no_inputs = true;
1294 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1295 if (inputs.get (*t) != 0) {
1302 /* no inputs so we can take any input configuration since we throw it away */
1303 out = outputs + midi_bypass;
1304 return Match (NoInputs, 1);
1307 /* Plugin inputs match requested inputs exactly */
1309 out = outputs + midi_bypass;
1310 return Match (ExactMatch, 1);
1313 /* We may be able to run more than one copy of the plugin within this insert
1314 to cope with the insert having more inputs than the plugin.
1315 We allow replication only for plugins with either zero or 1 inputs and outputs
1316 for every valid data type.
1320 bool can_replicate = true;
1321 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1323 uint32_t nin = inputs.get (*t);
1325 // No inputs of this type
1326 if (nin == 0 && in.get(*t) == 0) {
1330 if (nin != 1 || outputs.get (*t) != 1) {
1331 can_replicate = false;
1335 // Potential factor not set yet
1337 f = in.get(*t) / nin;
1340 // Factor for this type does not match another type, can not replicate
1341 if (f != (in.get(*t) / nin)) {
1342 can_replicate = false;
1347 if (can_replicate && f > 0) {
1348 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1349 out.set (*t, outputs.get(*t) * f);
1352 return Match (Replicate, f);
1355 /* If the processor has exactly one input of a given type, and
1356 the plugin has more, we can feed the single processor input
1357 to some or all of the plugin inputs. This is rather
1358 special-case-y, but the 1-to-many case is by far the
1359 simplest. How do I split thy 2 processor inputs to 3
1360 plugin inputs? Let me count the ways ...
1363 bool can_split = true;
1364 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1366 bool const can_split_type = (in.get (*t) == 1 && inputs.get (*t) > 1);
1367 bool const nothing_to_do_for_type = (in.get (*t) == 0 && inputs.get (*t) == 0);
1369 if (!can_split_type && !nothing_to_do_for_type) {
1375 out = outputs + midi_bypass;
1376 return Match (Split, 1);
1379 /* If the plugin has more inputs than we want, we can `hide' some of them
1380 by feeding them silence.
1383 bool could_hide = false;
1384 bool cannot_hide = false;
1385 ChanCount hide_channels;
1387 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1388 if (inputs.get(*t) > in.get(*t)) {
1389 /* there is potential to hide, since the plugin has more inputs of type t than the insert */
1390 hide_channels.set (*t, inputs.get(*t) - in.get(*t));
1392 } else if (inputs.get(*t) < in.get(*t)) {
1393 /* we definitely cannot hide, since the plugin has fewer inputs of type t than the insert */
1398 if (could_hide && !cannot_hide) {
1399 out = outputs + midi_bypass;
1400 return Match (Hide, 1, false, false, hide_channels);
1403 return Match (Impossible, 0);
1408 PluginInsert::get_state ()
1410 return state (true);
1414 PluginInsert::state (bool full)
1416 XMLNode& node = Processor::state (full);
1418 node.add_property("type", _plugins[0]->state_node_name());
1419 node.add_property("unique-id", _plugins[0]->unique_id());
1420 node.add_property("count", string_compose("%1", _plugins.size()));
1422 /* remember actual i/o configuration (for later placeholder
1423 * in case the plugin goes missing) */
1424 node.add_child_nocopy (* _configured_in.state (X_("ConfiguredInput")));
1425 node.add_child_nocopy (* _configured_out.state (X_("ConfiguredOutput")));
1427 /* save custom i/o config */
1428 node.add_property("custom", _custom_cfg ? "yes" : "no");
1430 assert (_custom_out == _configured_out); // redundant
1431 for (uint32_t pc = 0; pc < get_count(); ++pc) {
1432 // TODO save _in_map[pc], _out_map[pc]
1436 _plugins[0]->set_insert_id(this->id());
1437 node.add_child_nocopy (_plugins[0]->get_state());
1439 for (Controls::iterator c = controls().begin(); c != controls().end(); ++c) {
1440 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> ((*c).second);
1442 node.add_child_nocopy (ac->get_state());
1450 PluginInsert::set_control_ids (const XMLNode& node, int version)
1452 const XMLNodeList& nlist = node.children();
1453 XMLNodeConstIterator iter;
1454 set<Evoral::Parameter>::const_iterator p;
1456 for (iter = nlist.begin(); iter != nlist.end(); ++iter) {
1457 if ((*iter)->name() == Controllable::xml_node_name) {
1458 const XMLProperty* prop;
1460 uint32_t p = (uint32_t)-1;
1462 if ((prop = (*iter)->property (X_("symbol"))) != 0) {
1463 boost::shared_ptr<LV2Plugin> lv2plugin = boost::dynamic_pointer_cast<LV2Plugin> (_plugins[0]);
1465 p = lv2plugin->port_index(prop->value().c_str());
1469 if (p == (uint32_t)-1 && (prop = (*iter)->property (X_("parameter"))) != 0) {
1470 p = atoi (prop->value());
1473 if (p != (uint32_t)-1) {
1475 /* this may create the new controllable */
1477 boost::shared_ptr<Evoral::Control> c = control (Evoral::Parameter (PluginAutomation, 0, p));
1479 #ifndef NO_PLUGIN_STATE
1483 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> (c);
1485 ac->set_state (**iter, version);
1494 PluginInsert::set_state(const XMLNode& node, int version)
1496 XMLNodeList nlist = node.children();
1497 XMLNodeIterator niter;
1498 XMLPropertyList plist;
1499 const XMLProperty *prop;
1500 ARDOUR::PluginType type;
1502 if ((prop = node.property ("type")) == 0) {
1503 error << _("XML node describing plugin is missing the `type' field") << endmsg;
1507 if (prop->value() == X_("ladspa") || prop->value() == X_("Ladspa")) { /* handle old school sessions */
1508 type = ARDOUR::LADSPA;
1509 } else if (prop->value() == X_("lv2")) {
1511 } else if (prop->value() == X_("windows-vst")) {
1512 type = ARDOUR::Windows_VST;
1513 } else if (prop->value() == X_("lxvst")) {
1514 type = ARDOUR::LXVST;
1515 } else if (prop->value() == X_("audiounit")) {
1516 type = ARDOUR::AudioUnit;
1517 } else if (prop->value() == X_("luaproc")) {
1520 error << string_compose (_("unknown plugin type %1 in plugin insert state"),
1526 prop = node.property ("unique-id");
1529 #ifdef WINDOWS_VST_SUPPORT
1530 /* older sessions contain VST plugins with only an "id" field.
1533 if (type == ARDOUR::Windows_VST) {
1534 prop = node.property ("id");
1538 #ifdef LXVST_SUPPORT
1539 /*There shouldn't be any older sessions with linuxVST support.. but anyway..*/
1541 if (type == ARDOUR::LXVST) {
1542 prop = node.property ("id");
1548 error << _("Plugin has no unique ID field") << endmsg;
1553 boost::shared_ptr<Plugin> plugin = find_plugin (_session, prop->value(), type);
1555 /* treat linux and windows VST plugins equivalent if they have the same uniqueID
1556 * allow to move sessions windows <> linux */
1557 #ifdef LXVST_SUPPORT
1558 if (plugin == 0 && type == ARDOUR::Windows_VST) {
1559 type = ARDOUR::LXVST;
1560 plugin = find_plugin (_session, prop->value(), type);
1564 #ifdef WINDOWS_VST_SUPPORT
1565 if (plugin == 0 && type == ARDOUR::LXVST) {
1566 type = ARDOUR::Windows_VST;
1567 plugin = find_plugin (_session, prop->value(), type);
1572 error << string_compose(
1573 _("Found a reference to a plugin (\"%1\") that is unknown.\n"
1574 "Perhaps it was removed or moved since it was last used."),
1580 if (type == ARDOUR::Lua) {
1581 XMLNode *ls = node.child (plugin->state_node_name().c_str());
1582 // we need to load the script to set the name and parameters.
1583 boost::shared_ptr<LuaProc> lp = boost::dynamic_pointer_cast<LuaProc>(plugin);
1585 lp->set_script_from_state (*ls);
1589 // The name of the PluginInsert comes from the plugin, nothing else
1590 _name = plugin->get_info()->name;
1594 // Processor::set_state() will set this, but too late
1595 // for it to be available when setting up plugin
1596 // state. We can't call Processor::set_state() until
1597 // the plugins themselves are created and added.
1601 if (_plugins.empty()) {
1602 /* if we are adding the first plugin, we will need to set
1603 up automatable controls.
1605 add_plugin (plugin);
1606 create_automatable_parameters ();
1607 set_control_ids (node, version);
1610 if ((prop = node.property ("count")) != 0) {
1611 sscanf (prop->value().c_str(), "%u", &count);
1614 if (_plugins.size() != count) {
1615 for (uint32_t n = 1; n < count; ++n) {
1616 add_plugin (plugin_factory (plugin));
1620 Processor::set_state (node, version);
1622 PBD::ID new_id = this->id();
1623 PBD::ID old_id = this->id();
1625 if ((prop = node.property ("id")) != 0) {
1626 old_id = prop->value ();
1629 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1631 /* find the node with the type-specific node name ("lv2", "ladspa", etc)
1632 and set all plugins to the same state.
1635 if ((*niter)->name() == plugin->state_node_name()) {
1637 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1638 /* Plugin state can include external files which are named after the ID.
1640 * If regenerate_xml_or_string_ids() is set, the ID will already have
1641 * been changed, so we need to use the old ID from the XML to load the
1642 * state and then update the ID.
1644 * When copying a plugin-state, route_ui takes care of of updating the ID,
1645 * but we need to call set_insert_id() to clear the cached plugin-state
1646 * and force a change.
1648 if (!regenerate_xml_or_string_ids ()) {
1649 (*i)->set_insert_id (new_id);
1651 (*i)->set_insert_id (old_id);
1654 (*i)->set_state (**niter, version);
1656 if (regenerate_xml_or_string_ids ()) {
1657 (*i)->set_insert_id (new_id);
1665 if (version < 3000) {
1667 /* Only 2.X sessions need a call to set_parameter_state() - in 3.X and above
1668 this is all handled by Automatable
1671 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1672 if ((*niter)->name() == "Redirect") {
1673 /* XXX do we need to tackle placement? i think not (pd; oct 16 2009) */
1674 Processor::set_state (**niter, version);
1679 set_parameter_state_2X (node, version);
1682 if ((prop = node.property (X_("custom"))) != 0) {
1683 _custom_cfg = string_is_affirmative (prop->value());
1686 XMLNodeList kids = node.children ();
1687 for (XMLNodeIterator i = kids.begin(); i != kids.end(); ++i) {
1688 if ((*i)->name() == X_("ConfiguredOutput")) {
1689 _custom_out = ChanCount(**i);
1691 // TODO restore mappings for all 0 .. count.
1696 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1700 (*i)->deactivate ();
1708 PluginInsert::update_id (PBD::ID id)
1711 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1712 (*i)->set_insert_id (id);
1717 PluginInsert::set_state_dir (const std::string& d)
1719 // state() only saves the state of the first plugin
1720 _plugins[0]->set_state_dir (d);
1724 PluginInsert::set_parameter_state_2X (const XMLNode& node, int version)
1726 XMLNodeList nlist = node.children();
1727 XMLNodeIterator niter;
1729 /* look for port automation node */
1731 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1733 if ((*niter)->name() != port_automation_node_name) {
1739 XMLNodeConstIterator iter;
1744 cnodes = (*niter)->children ("port");
1746 for (iter = cnodes.begin(); iter != cnodes.end(); ++iter){
1750 if ((cprop = child->property("number")) != 0) {
1751 port = cprop->value().c_str();
1753 warning << _("PluginInsert: Auto: no ladspa port number") << endmsg;
1757 sscanf (port, "%" PRIu32, &port_id);
1759 if (port_id >= _plugins[0]->parameter_count()) {
1760 warning << _("PluginInsert: Auto: port id out of range") << endmsg;
1764 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(
1765 control(Evoral::Parameter(PluginAutomation, 0, port_id), true));
1767 if (c && c->alist()) {
1768 if (!child->children().empty()) {
1769 c->alist()->set_state (*child->children().front(), version);
1771 /* In some cases 2.X saves lists with min_yval and max_yval
1772 being FLT_MIN and FLT_MAX respectively. This causes problems
1773 in A3 because these min/max values are used to compute
1774 where GUI control points should be drawn. If we see such
1775 values, `correct' them to the min/max of the appropriate
1779 float min_y = c->alist()->get_min_y ();
1780 float max_y = c->alist()->get_max_y ();
1782 ParameterDescriptor desc;
1783 _plugins.front()->get_parameter_descriptor (port_id, desc);
1785 if (min_y == FLT_MIN) {
1789 if (max_y == FLT_MAX) {
1793 c->alist()->set_yrange (min_y, max_y);
1796 error << string_compose (_("PluginInsert: automatable control %1 not found - ignored"), port_id) << endmsg;
1808 PluginInsert::describe_parameter (Evoral::Parameter param)
1810 if (param.type() == PluginAutomation) {
1811 return _plugins[0]->describe_parameter (param);
1812 } else if (param.type() == PluginPropertyAutomation) {
1813 boost::shared_ptr<AutomationControl> c(automation_control(param));
1814 if (c && !c->desc().label.empty()) {
1815 return c->desc().label;
1818 return Automatable::describe_parameter(param);
1822 PluginInsert::signal_latency() const
1824 if (_user_latency) {
1825 return _user_latency;
1828 return _plugins[0]->signal_latency ();
1832 PluginInsert::type ()
1834 return plugin()->get_info()->type;
1837 PluginInsert::PluginControl::PluginControl (PluginInsert* p,
1838 const Evoral::Parameter& param,
1839 const ParameterDescriptor& desc,
1840 boost::shared_ptr<AutomationList> list)
1841 : AutomationControl (p->session(), param, desc, list, p->describe_parameter(param))
1845 alist()->reset_default (desc.normal);
1847 list->set_interpolation(Evoral::ControlList::Discrete);
1852 set_flags(Controllable::Toggle);
1856 /** @param val `user' value */
1858 PluginInsert::PluginControl::set_value (double user_val, PBD::Controllable::GroupControlDisposition group_override)
1861 _set_value (user_val, group_override);
1865 PluginInsert::PluginControl::set_value_unchecked (double user_val)
1867 /* used only by automation playback */
1868 _set_value (user_val, Controllable::NoGroup);
1872 PluginInsert::PluginControl::_set_value (double user_val, PBD::Controllable::GroupControlDisposition group_override)
1874 /* FIXME: probably should be taking out some lock here.. */
1876 for (Plugins::iterator i = _plugin->_plugins.begin(); i != _plugin->_plugins.end(); ++i) {
1877 (*i)->set_parameter (_list->parameter().id(), user_val);
1880 boost::shared_ptr<Plugin> iasp = _plugin->_impulseAnalysisPlugin.lock();
1882 iasp->set_parameter (_list->parameter().id(), user_val);
1885 AutomationControl::set_value (user_val, group_override);
1889 PluginInsert::PluginControl::catch_up_with_external_value (double user_val)
1891 AutomationControl::set_value (user_val, Controllable::NoGroup);
1895 PluginInsert::PluginControl::get_state ()
1899 XMLNode& node (AutomationControl::get_state());
1900 ss << parameter().id();
1901 node.add_property (X_("parameter"), ss.str());
1903 boost::shared_ptr<LV2Plugin> lv2plugin = boost::dynamic_pointer_cast<LV2Plugin> (_plugin->_plugins[0]);
1905 node.add_property (X_("symbol"), lv2plugin->port_symbol (parameter().id()));
1912 /** @return `user' val */
1914 PluginInsert::PluginControl::get_value () const
1916 boost::shared_ptr<Plugin> plugin = _plugin->plugin (0);
1922 return plugin->get_parameter (_list->parameter().id());
1925 PluginInsert::PluginPropertyControl::PluginPropertyControl (PluginInsert* p,
1926 const Evoral::Parameter& param,
1927 const ParameterDescriptor& desc,
1928 boost::shared_ptr<AutomationList> list)
1929 : AutomationControl (p->session(), param, desc, list)
1933 alist()->set_yrange (desc.lower, desc.upper);
1934 alist()->reset_default (desc.normal);
1938 set_flags(Controllable::Toggle);
1943 PluginInsert::PluginPropertyControl::set_value (double user_val, PBD::Controllable::GroupControlDisposition /* group_override*/)
1946 set_value_unchecked (user_val);
1951 PluginInsert::PluginPropertyControl::set_value_unchecked (double user_val)
1953 /* Old numeric set_value(), coerce to appropriate datatype if possible.
1954 This is lossy, but better than nothing until Ardour's automation system
1955 can handle various datatypes all the way down. */
1956 const Variant value(_desc.datatype, user_val);
1957 if (value.type() == Variant::NOTHING) {
1958 error << "set_value(double) called for non-numeric property" << endmsg;
1962 for (Plugins::iterator i = _plugin->_plugins.begin(); i != _plugin->_plugins.end(); ++i) {
1963 (*i)->set_property(_list->parameter().id(), value);
1967 AutomationControl::set_value (user_val, Controllable::NoGroup);
1971 PluginInsert::PluginPropertyControl::get_state ()
1975 XMLNode& node (AutomationControl::get_state());
1976 ss << parameter().id();
1977 node.add_property (X_("property"), ss.str());
1978 node.remove_property (X_("value"));
1984 PluginInsert::PluginPropertyControl::get_value () const
1986 return _value.to_double();
1989 boost::shared_ptr<Plugin>
1990 PluginInsert::get_impulse_analysis_plugin()
1992 boost::shared_ptr<Plugin> ret;
1993 if (_impulseAnalysisPlugin.expired()) {
1994 ret = plugin_factory(_plugins[0]);
1995 ret->configure_io (internal_input_streams (), internal_output_streams ());
1996 _impulseAnalysisPlugin = ret;
1998 ret = _impulseAnalysisPlugin.lock();
2005 PluginInsert::collect_signal_for_analysis (framecnt_t nframes)
2007 // called from outside the audio thread, so this should be safe
2008 // only do audio as analysis is (currently) only for audio plugins
2009 _signal_analysis_inputs.ensure_buffers( DataType::AUDIO, internal_input_streams().n_audio(), nframes);
2010 _signal_analysis_outputs.ensure_buffers( DataType::AUDIO, internal_output_streams().n_audio(), nframes);
2012 _signal_analysis_collected_nframes = 0;
2013 _signal_analysis_collect_nframes_max = nframes;
2016 /** Add a plugin to our list */
2018 PluginInsert::add_plugin (boost::shared_ptr<Plugin> plugin)
2020 plugin->set_insert_id (this->id());
2022 if (_plugins.empty()) {
2023 /* first (and probably only) plugin instance - connect to relevant signals
2026 plugin->ParameterChangedExternally.connect_same_thread (*this, boost::bind (&PluginInsert::parameter_changed_externally, this, _1, _2));
2027 plugin->StartTouch.connect_same_thread (*this, boost::bind (&PluginInsert::start_touch, this, _1));
2028 plugin->EndTouch.connect_same_thread (*this, boost::bind (&PluginInsert::end_touch, this, _1));
2031 _plugins.push_back (plugin);
2035 PluginInsert::realtime_handle_transport_stopped ()
2037 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2038 (*i)->realtime_handle_transport_stopped ();
2043 PluginInsert::realtime_locate ()
2045 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2046 (*i)->realtime_locate ();
2051 PluginInsert::monitoring_changed ()
2053 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2054 (*i)->monitoring_changed ();
2059 PluginInsert::start_touch (uint32_t param_id)
2061 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id));
2063 ac->start_touch (session().audible_frame());
2068 PluginInsert::end_touch (uint32_t param_id)
2070 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id));
2072 ac->stop_touch (true, session().audible_frame());
2076 std::ostream& operator<<(std::ostream& o, const ARDOUR::PluginInsert::Match& m)
2079 case PluginInsert::Impossible: o << "Impossible"; break;
2080 case PluginInsert::Delegate: o << "Delegate"; break;
2081 case PluginInsert::NoInputs: o << "NoInputs"; break;
2082 case PluginInsert::ExactMatch: o << "ExactMatch"; break;
2083 case PluginInsert::Replicate: o << "Replicate"; break;
2084 case PluginInsert::Split: o << "Split"; break;
2085 case PluginInsert::Hide: o << "Hide"; break;
2087 o << " cnt: " << m.plugins
2088 << (m.strict_io ? " strict-io" : "")
2089 << (m.custom_cfg ? " custom-cfg" : "");
2090 if (m.method == PluginInsert::Hide) {
2091 o << " hide: " << m.hide;