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 , _maps_from_state (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::add_sidechain (uint32_t n_audio)
161 // caller must hold process lock
165 // TODO add route-name, plugin name and shorten.. (plugin name can be long and conatain odd chars)
166 std::string n = "Sidechain " + id().to_s(); /// XXX
167 SideChain *sc = new SideChain (_session, n);
168 _sidechain = boost::shared_ptr<SideChain> (sc);
169 _sidechain->activate ();
170 for (uint32_t n = 0; n < n_audio; ++n) {
171 _sidechain->input()->add_port ("", owner()); // add a port, don't connect.
173 PluginConfigChanged (); /* EMIT SIGNAL */
178 PluginInsert::del_sidechain ()
184 PluginConfigChanged (); /* EMIT SIGNAL */
189 PluginInsert::control_list_automation_state_changed (Evoral::Parameter which, AutoState s)
191 if (which.type() != PluginAutomation)
194 boost::shared_ptr<AutomationControl> c
195 = boost::dynamic_pointer_cast<AutomationControl>(control (which));
198 _plugins[0]->set_parameter (which.id(), c->list()->eval (_session.transport_frame()));
203 PluginInsert::output_streams() const
205 assert (_configured);
206 return _configured_out;
210 PluginInsert::input_streams() const
212 assert (_configured);
213 return _configured_in;
217 PluginInsert::internal_streams() const
219 assert (_configured);
220 return _configured_internal;
224 PluginInsert::internal_output_streams() const
226 assert (!_plugins.empty());
228 PluginInfoPtr info = _plugins.front()->get_info();
230 if (info->reconfigurable_io()) {
231 ChanCount out = _plugins.front()->output_streams ();
232 // DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, reconfigur(able) output streams = %1\n", out));
235 ChanCount out = info->n_outputs;
236 // DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, static output streams = %1 for %2 plugins\n", out, _plugins.size()));
237 out.set_audio (out.n_audio() * _plugins.size());
238 out.set_midi (out.n_midi() * _plugins.size());
244 PluginInsert::internal_input_streams() const
246 assert (!_plugins.empty());
250 PluginInfoPtr info = _plugins.front()->get_info();
252 if (info->reconfigurable_io()) {
253 assert (_plugins.size() == 1);
254 in = _plugins.front()->input_streams();
259 DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, input streams = %1, match using %2\n", in, _match.method));
261 if (_match.method == Split) {
263 /* we are splitting 1 processor input to multiple plugin inputs,
264 so we have a maximum of 1 stream of each type.
266 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
267 if (in.get (*t) > 1) {
273 } else if (_match.method == Hide) {
275 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
276 in.set (*t, in.get (*t) - _match.hide.get (*t));
282 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
283 in.set (*t, in.get (*t) * _plugins.size ());
291 PluginInsert::natural_output_streams() const
293 return _plugins[0]->get_info()->n_outputs;
297 PluginInsert::natural_input_streams() const
299 return _plugins[0]->get_info()->n_inputs;
303 PluginInsert::has_no_inputs() const
305 return _plugins[0]->get_info()->n_inputs == ChanCount::ZERO;
309 PluginInsert::has_no_audio_inputs() const
311 return _plugins[0]->get_info()->n_inputs.n_audio() == 0;
315 PluginInsert::is_midi_instrument() const
317 /* XXX more finesse is possible here. VST plugins have a
318 a specific "instrument" flag, for example.
320 PluginInfoPtr pi = _plugins[0]->get_info();
322 return pi->n_inputs.n_midi() != 0 &&
323 pi->n_outputs.n_audio() > 0;
327 PluginInsert::create_automatable_parameters ()
329 assert (!_plugins.empty());
331 set<Evoral::Parameter> a = _plugins.front()->automatable ();
333 for (set<Evoral::Parameter>::iterator i = a.begin(); i != a.end(); ++i) {
334 if (i->type() == PluginAutomation) {
336 Evoral::Parameter param(*i);
338 ParameterDescriptor desc;
339 _plugins.front()->get_parameter_descriptor(i->id(), desc);
341 can_automate (param);
342 boost::shared_ptr<AutomationList> list(new AutomationList(param, desc));
343 boost::shared_ptr<AutomationControl> c (new PluginControl(this, param, desc, list));
345 _plugins.front()->set_automation_control (i->id(), c);
346 } else if (i->type() == PluginPropertyAutomation) {
347 Evoral::Parameter param(*i);
348 const ParameterDescriptor& desc = _plugins.front()->get_property_descriptor(param.id());
349 if (desc.datatype != Variant::NOTHING) {
350 boost::shared_ptr<AutomationList> list;
351 if (Variant::type_is_numeric(desc.datatype)) {
352 list = boost::shared_ptr<AutomationList>(new AutomationList(param, desc));
354 add_control (boost::shared_ptr<AutomationControl> (new PluginPropertyControl(this, param, desc, list)));
359 /** Called when something outside of this host has modified a plugin
360 * parameter. Responsible for propagating the change to two places:
362 * 1) anything listening to the Control itself
363 * 2) any replicated plugins that make up this PluginInsert.
365 * The PluginInsert is connected to the ParameterChangedExternally signal for
366 * the first (primary) plugin, and here broadcasts that change to any others.
368 * XXX We should probably drop this whole replication idea (Paul, October 2015)
369 * since it isn't used by sensible plugin APIs (AU, LV2).
372 PluginInsert::parameter_changed_externally (uint32_t which, float val)
374 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, which));
376 /* First propagation: alter the underlying value of the control,
377 * without telling the plugin(s) that own/use it to set it.
384 boost::shared_ptr<PluginControl> pc = boost::dynamic_pointer_cast<PluginControl> (ac);
387 pc->catch_up_with_external_value (val);
390 /* Second propagation: tell all plugins except the first to
391 update the value of this parameter. For sane plugin APIs,
392 there are no other plugins, so this is a no-op in those
396 Plugins::iterator i = _plugins.begin();
398 /* don't set the first plugin, just all the slaves */
400 if (i != _plugins.end()) {
402 for (; i != _plugins.end(); ++i) {
403 (*i)->set_parameter (which, val);
409 PluginInsert::set_block_size (pframes_t nframes)
412 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
413 if ((*i)->set_block_size (nframes) != 0) {
421 PluginInsert::activate ()
423 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
427 Processor::activate ();
431 PluginInsert::deactivate ()
433 Processor::deactivate ();
435 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
441 PluginInsert::flush ()
443 for (vector<boost::shared_ptr<Plugin> >::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
449 PluginInsert::connect_and_run (BufferSet& bufs, pframes_t nframes, framecnt_t offset, bool with_auto, framepos_t now)
451 PinMappings in_map (_in_map);
452 PinMappings out_map (_out_map);
455 // TODO optimize special case.
456 // Currently this never triggers because the in_map for "Split" triggeres no_inplace.
457 if (_match.method == Split && !_no_inplace) {
458 assert (in_map.size () == 1);
459 in_map[0] = ChanMapping (ChanCount::max (natural_input_streams (), _configured_in)); // no sidechain
460 ChanCount const in_streams = internal_input_streams ();
461 /* copy the first stream's audio buffer contents to the others */
463 uint32_t first_idx = in_map[0].get (DataType::AUDIO, 0, &valid);
465 for (uint32_t i = in_streams.n_audio(); i < natural_input_streams().n_audio(); ++i) {
466 uint32_t idx = in_map[0].get (DataType::AUDIO, i, &valid);
468 bufs.get_audio(idx).read_from(bufs.get_audio(first_idx), nframes, offset, offset);
475 bufs.set_count(ChanCount::max(bufs.count(), _configured_internal));
476 bufs.set_count(ChanCount::max(bufs.count(), _configured_out));
482 for (Controls::iterator li = controls().begin(); li != controls().end(); ++li, ++n) {
484 boost::shared_ptr<AutomationControl> c
485 = boost::dynamic_pointer_cast<AutomationControl>(li->second);
487 if (c->list() && c->automation_playback()) {
490 const float val = c->list()->rt_safe_eval (now, valid);
493 /* This is the ONLY place where we are
495 * AutomationControl::set_value_unchecked(). We
496 * know that the control is in
497 * automation playback mode, so no
498 * check on writable() is required
499 * (which must be done in AutomationControl::set_value()
502 c->set_value_unchecked(val);
509 /* Calculate if, and how many frames we need to collect for analysis */
510 framecnt_t collect_signal_nframes = (_signal_analysis_collect_nframes_max -
511 _signal_analysis_collected_nframes);
512 if (nframes < collect_signal_nframes) { // we might not get all frames now
513 collect_signal_nframes = nframes;
516 if (collect_signal_nframes > 0) {
518 //std::cerr << "collect input, bufs " << bufs.count().n_audio() << " count, " << bufs.available().n_audio() << " available" << std::endl;
519 //std::cerr << " streams " << internal_input_streams().n_audio() << std::endl;
520 //std::cerr << "filling buffer with " << collect_signal_nframes << " frames at " << _signal_analysis_collected_nframes << std::endl;
522 _signal_analysis_inputs.set_count(internal_input_streams());
524 for (uint32_t i = 0; i < internal_input_streams().n_audio(); ++i) {
525 _signal_analysis_inputs.get_audio(i).read_from(
527 collect_signal_nframes,
528 _signal_analysis_collected_nframes); // offset is for target buffer
533 if (_plugins.front()->is_channelstrip() ) {
534 if (_configured_in.n_audio() > 0) {
535 ChanMapping mb_in_map (ChanCount::min (_configured_in, ChanCount (DataType::AUDIO, 2)));
536 ChanMapping mb_out_map (ChanCount::min (_configured_out, ChanCount (DataType::AUDIO, 2)));
538 _plugins.front()->connect_and_run (bufs, mb_in_map, mb_out_map, nframes, offset);
540 for (uint32_t out = _configured_in.n_audio (); out < bufs.count().get (DataType::AUDIO); ++out) {
541 bufs.get (DataType::AUDIO, out).silence (nframes, offset);
547 BufferSet& inplace_bufs = _session.get_noinplace_buffers();
548 ARDOUR::ChanMapping used_outputs;
551 // TODO optimize this flow. prepare during configure_io()
552 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
554 ARDOUR::ChanMapping i_in_map (natural_input_streams());
555 ARDOUR::ChanMapping i_out_map;
556 ARDOUR::ChanCount mapped;
557 ARDOUR::ChanCount backmap;
559 // map inputs sequentially
560 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
561 for (uint32_t in = 0; in < natural_input_streams().get (*t); ++in) {
563 uint32_t in_idx = in_map[pc].get (*t, in, &valid);
564 uint32_t m = mapped.get (*t);
566 inplace_bufs.get (*t, m).read_from (bufs.get (*t, in_idx), nframes, offset, offset);
568 inplace_bufs.get (*t, m).silence (nframes, offset);
570 mapped.set (*t, m + 1);
574 // TODO use map_offset_to() instead ??
578 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
579 for (uint32_t out = 0; out < natural_output_streams().get (*t); ++out) {
580 uint32_t m = mapped.get (*t);
581 inplace_bufs.get (*t, m).silence (nframes, offset);
582 i_out_map.set (*t, out, m);
583 mapped.set (*t, m + 1);
587 if ((*i)->connect_and_run(inplace_bufs, i_in_map, i_out_map, nframes, offset)) {
592 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
593 for (uint32_t out = 0; out < natural_output_streams().get (*t); ++out) {
594 uint32_t m = backmap.get (*t);
596 uint32_t out_idx = out_map[pc].get (*t, out, &valid);
598 bufs.get (*t, out_idx).read_from (inplace_bufs.get (*t, m), nframes, offset, offset);
599 used_outputs.set (*t, out_idx, 1); // mark as used
601 backmap.set (*t, m + 1);
605 /* all instances have completed, now clear outputs that have not been written to.
606 * (except midi bypass)
608 if (has_midi_bypass ()) {
609 used_outputs.set (DataType::MIDI, 0, 1); // Midi bypass.
611 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
612 for (uint32_t out = 0; out < bufs.count().get (*t); ++out) {
614 used_outputs.get (*t, out, &valid);
615 if (valid) { continue; }
616 bufs.get (*t, out).silence (nframes, offset);
622 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
623 if ((*i)->connect_and_run(bufs, in_map[pc], out_map[pc], nframes, offset)) {
628 // TODO optimize: store "unconnected" in a fixed set.
629 // it only changes on reconfiguration.
630 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
631 for (uint32_t out = 0; out < bufs.count().get (*t); ++out) {
633 if (*t == DataType::MIDI && out == 0 && has_midi_bypass ()) {
634 mapped = true; // in-place Midi bypass
636 for (uint32_t pc = 0; pc < get_count() && !mapped; ++pc) {
637 for (uint32_t o = 0; o < natural_output_streams().get (*t); ++o) {
639 uint32_t idx = out_map[pc].get (*t, o, &valid);
640 if (valid && idx == out) {
647 bufs.get (*t, out).silence (nframes, offset);
653 if (collect_signal_nframes > 0) {
655 //std::cerr << " output, bufs " << bufs.count().n_audio() << " count, " << bufs.available().n_audio() << " available" << std::endl;
656 //std::cerr << " streams " << internal_output_streams().n_audio() << std::endl;
658 _signal_analysis_outputs.set_count(internal_output_streams());
660 for (uint32_t i = 0; i < internal_output_streams().n_audio(); ++i) {
661 _signal_analysis_outputs.get_audio(i).read_from(
663 collect_signal_nframes,
664 _signal_analysis_collected_nframes); // offset is for target buffer
667 _signal_analysis_collected_nframes += collect_signal_nframes;
668 assert(_signal_analysis_collected_nframes <= _signal_analysis_collect_nframes_max);
670 if (_signal_analysis_collected_nframes == _signal_analysis_collect_nframes_max) {
671 _signal_analysis_collect_nframes_max = 0;
672 _signal_analysis_collected_nframes = 0;
674 AnalysisDataGathered(&_signal_analysis_inputs,
675 &_signal_analysis_outputs);
681 PluginInsert::silence (framecnt_t nframes)
687 ChanMapping in_map (natural_input_streams ());
688 ChanMapping out_map (natural_output_streams ());
690 // TODO fake run sidechain, too? (maybe once it has meters)
691 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
692 (*i)->connect_and_run (_session.get_scratch_buffers ((*i)->get_info()->n_inputs, true), in_map, out_map, nframes, 0);
697 PluginInsert::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool)
699 if (_pending_active) {
700 /* run as normal if we are active or moving from inactive to active */
703 // collect sidechain input for complete cycle.
704 _sidechain->run (bufs, start_frame, end_frame, nframes, true);
707 if (_session.transport_rolling() || _session.bounce_processing()) {
708 automation_run (bufs, start_frame, nframes);
710 connect_and_run (bufs, nframes, 0, false);
714 // TODO use mapping in bypassed mode ?!
715 // -> do we bypass the processor or the plugin
717 // TODO include sidechain??
719 uint32_t in = input_streams ().n_audio ();
720 uint32_t out = output_streams().n_audio ();
722 if (has_no_audio_inputs() || in == 0) {
724 /* silence all (audio) outputs. Should really declick
725 * at the transitions of "active"
728 for (uint32_t n = 0; n < out; ++n) {
729 bufs.get_audio (n).silence (nframes);
732 } else if (out > in) {
734 /* not active, but something has make up for any channel count increase
735 * for now , simply replicate last buffer
737 for (uint32_t n = in; n < out; ++n) {
738 bufs.get_audio(n).read_from(bufs.get_audio(in - 1), nframes);
742 bufs.count().set_audio (out);
745 _active = _pending_active;
747 /* we have no idea whether the plugin generated silence or not, so mark
748 * all buffers appropriately.
753 PluginInsert::automation_run (BufferSet& bufs, framepos_t start, pframes_t nframes)
755 Evoral::ControlEvent next_event (0, 0.0f);
756 framepos_t now = start;
757 framepos_t end = now + nframes;
758 framecnt_t offset = 0;
760 Glib::Threads::Mutex::Lock lm (control_lock(), Glib::Threads::TRY_LOCK);
763 connect_and_run (bufs, nframes, offset, false);
767 if (!find_next_event (now, end, next_event) || _plugins.front()->requires_fixed_sized_buffers()) {
769 /* no events have a time within the relevant range */
771 connect_and_run (bufs, nframes, offset, true, now);
777 framecnt_t cnt = min (((framecnt_t) ceil (next_event.when) - now), (framecnt_t) nframes);
779 connect_and_run (bufs, cnt, offset, true, now);
785 if (!find_next_event (now, end, next_event)) {
790 /* cleanup anything that is left to do */
793 connect_and_run (bufs, nframes, offset, true, now);
798 PluginInsert::default_parameter_value (const Evoral::Parameter& param)
800 if (param.type() != PluginAutomation)
803 if (_plugins.empty()) {
804 fatal << _("programming error: ") << X_("PluginInsert::default_parameter_value() called with no plugin")
806 abort(); /*NOTREACHED*/
809 return _plugins[0]->default_value (param.id());
814 PluginInsert::can_reset_all_parameters ()
818 for (uint32_t par = 0; par < _plugins[0]->parameter_count(); ++par) {
820 const uint32_t cid = _plugins[0]->nth_parameter (par, ok);
822 if (!ok || !_plugins[0]->parameter_is_input(cid)) {
826 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, cid));
832 if (ac->automation_state() & Play) {
837 return all && (params > 0);
841 PluginInsert::reset_parameters_to_default ()
845 for (uint32_t par = 0; par < _plugins[0]->parameter_count(); ++par) {
847 const uint32_t cid = _plugins[0]->nth_parameter (par, ok);
849 if (!ok || !_plugins[0]->parameter_is_input(cid)) {
853 const float dflt = _plugins[0]->default_value (cid);
854 const float curr = _plugins[0]->get_parameter (cid);
860 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, cid));
865 if (ac->automation_state() & Play) {
870 ac->set_value (dflt, Controllable::NoGroup);
875 boost::shared_ptr<Plugin>
876 PluginInsert::plugin_factory (boost::shared_ptr<Plugin> other)
878 boost::shared_ptr<LadspaPlugin> lp;
879 boost::shared_ptr<LuaProc> lua;
881 boost::shared_ptr<LV2Plugin> lv2p;
883 #ifdef WINDOWS_VST_SUPPORT
884 boost::shared_ptr<WindowsVSTPlugin> vp;
887 boost::shared_ptr<LXVSTPlugin> lxvp;
889 #ifdef AUDIOUNIT_SUPPORT
890 boost::shared_ptr<AUPlugin> ap;
893 if ((lp = boost::dynamic_pointer_cast<LadspaPlugin> (other)) != 0) {
894 return boost::shared_ptr<Plugin> (new LadspaPlugin (*lp));
895 } else if ((lua = boost::dynamic_pointer_cast<LuaProc> (other)) != 0) {
896 return boost::shared_ptr<Plugin> (new LuaProc (*lua));
898 } else if ((lv2p = boost::dynamic_pointer_cast<LV2Plugin> (other)) != 0) {
899 return boost::shared_ptr<Plugin> (new LV2Plugin (*lv2p));
901 #ifdef WINDOWS_VST_SUPPORT
902 } else if ((vp = boost::dynamic_pointer_cast<WindowsVSTPlugin> (other)) != 0) {
903 return boost::shared_ptr<Plugin> (new WindowsVSTPlugin (*vp));
906 } else if ((lxvp = boost::dynamic_pointer_cast<LXVSTPlugin> (other)) != 0) {
907 return boost::shared_ptr<Plugin> (new LXVSTPlugin (*lxvp));
909 #ifdef AUDIOUNIT_SUPPORT
910 } else if ((ap = boost::dynamic_pointer_cast<AUPlugin> (other)) != 0) {
911 return boost::shared_ptr<Plugin> (new AUPlugin (*ap));
915 fatal << string_compose (_("programming error: %1"),
916 X_("unknown plugin type in PluginInsert::plugin_factory"))
918 abort(); /*NOTREACHED*/
919 return boost::shared_ptr<Plugin> ((Plugin*) 0);
923 PluginInsert::set_input_map (uint32_t num, ChanMapping m) {
924 if (num < _in_map.size()) {
925 bool changed = _in_map[num] != m;
929 PluginMapChanged (); /* EMIT SIGNAL */
935 PluginInsert::set_output_map (uint32_t num, ChanMapping m) {
936 if (num < _out_map.size()) {
937 bool changed = _out_map[num] != m;
941 PluginMapChanged (); /* EMIT SIGNAL */
947 PluginInsert::input_map () const
951 for (PinMappings::const_iterator i = _in_map.begin (); i != _in_map.end (); ++i, ++pc) {
952 ChanMapping m (i->second);
953 const ChanMapping::Mappings& mp ((*i).second.mappings());
954 for (ChanMapping::Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
955 for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
956 rv.set (tm->first, i->first + pc * natural_input_streams().get(tm->first), i->second);
964 PluginInsert::output_map () const
968 for (PinMappings::const_iterator i = _out_map.begin (); i != _out_map.end (); ++i, ++pc) {
969 ChanMapping m (i->second);
970 const ChanMapping::Mappings& mp ((*i).second.mappings());
971 for (ChanMapping::Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
972 for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
973 rv.set (tm->first, i->first + pc * natural_output_streams().get(tm->first), i->second);
977 if (has_midi_bypass ()) {
978 rv.set (DataType::MIDI, 0, 0);
985 PluginInsert::has_midi_bypass () const
987 if (_configured_in.n_midi () == 1 && _configured_out.n_midi () == 1 && natural_output_streams ().n_midi () == 0) {
994 PluginInsert::sanitize_maps ()
996 bool changed = false;
997 /* strip dead wood */
999 PinMappings new_outs;
1000 for (uint32_t pc = 0; pc < get_count(); ++pc) {
1002 ChanMapping new_out;
1003 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1004 for (uint32_t i = 0; i < natural_input_streams().get (*t); ++i) {
1006 uint32_t idx = _in_map[pc].get (*t, i, &valid);
1007 if (valid && idx < _configured_internal.get (*t)) {
1008 new_in.set (*t, i, idx);
1011 for (uint32_t o = 0; o < natural_output_streams().get (*t); ++o) {
1013 uint32_t idx = _out_map[pc].get (*t, o, &valid);
1014 if (valid && idx < _configured_out.get (*t)) {
1015 new_out.set (*t, o, idx);
1019 if (_in_map[pc] != new_in || _out_map[pc] != new_out) {
1022 new_ins[pc] = new_in;
1023 new_outs[pc] = new_out;
1025 /* prevent dup output assignments */
1026 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1027 for (uint32_t o = 0; o < _configured_out.get (*t); ++o) {
1028 bool mapped = false;
1029 for (uint32_t pc = 0; pc < get_count(); ++pc) {
1031 uint32_t idx = new_outs[pc].get_src (*t, o, &valid);
1032 if (valid && mapped) {
1033 new_outs[pc].unset (*t, idx);
1041 if (_in_map != new_ins || _out_map != new_outs) {
1045 _out_map = new_outs;
1051 PluginInsert::reset_map (bool emit)
1054 const PinMappings old_in (_in_map);
1055 const PinMappings old_out (_out_map);
1059 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
1060 if (_match.method == Split) {
1061 _in_map[pc] = ChanMapping ();
1062 /* connect inputs in round-robin fashion */
1063 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1064 const uint32_t cend = _configured_internal.get (*t);
1065 if (cend == 0) { continue; }
1067 for (uint32_t in = 0; in < natural_input_streams().get (*t); ++in) {
1068 _in_map[pc].set (*t, in, c);
1073 _in_map[pc] = ChanMapping (ChanCount::min (natural_input_streams (), _configured_internal));
1075 _out_map[pc] = ChanMapping (ChanCount::min (natural_output_streams(), _configured_out));
1077 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1078 _in_map[pc].offset_to(*t, pc * natural_input_streams().get(*t));
1079 _out_map[pc].offset_to(*t, pc * natural_output_streams().get(*t));
1083 if (old_in == _in_map && old_out == _out_map) {
1087 PluginMapChanged (); /* EMIT SIGNAL */
1093 PluginInsert::configure_io (ChanCount in, ChanCount out)
1095 Match old_match = _match;
1097 ChanCount old_internal;
1101 old_in = _configured_in;
1102 old_internal = _configured_internal;
1103 old_out = _configured_out;
1106 _configured_in = in;
1107 _configured_internal = in;
1108 _configured_out = out;
1111 /* TODO hide midi-bypass, and custom outs. Best /fake/ "out" here.
1112 * (currently _sidechain->configure_io always succeeds
1113 * since Processor::configure_io() succeeds)
1115 if (!_sidechain->configure_io (in, out)) {
1116 DEBUG_TRACE (DEBUG::ChanMapping, "Sidechain configuration failed\n");
1119 _configured_internal += _sidechain->input()->n_ports();
1122 /* get plugin configuration */
1123 _match = private_can_support_io_configuration (in, out);
1125 if (DEBUG_ENABLED(DEBUG::ChanMapping)) {
1127 DEBUG_STR_APPEND(a, string_compose ("Match '%1': ", name()));
1128 DEBUG_STR_APPEND(a, _match);
1129 DEBUG_TRACE (DEBUG::ChanMapping, DEBUG_STR(a).str());
1133 /* set the matching method and number of plugins that we will use to meet this configuration */
1134 if (set_count (_match.plugins) == false) {
1135 PluginIoReConfigure (); /* EMIT SIGNAL */
1136 _configured = false;
1140 /* configure plugins */
1141 switch (_match.method) {
1144 if (_plugins.front()->configure_io (natural_input_streams(), out) == false) {
1145 PluginIoReConfigure (); /* EMIT SIGNAL */
1146 _configured = false;
1154 bool const r = _plugins.front()->can_support_io_configuration (in, dout, &useins);
1156 assert (_match.strict_io || dout.n_audio() == out.n_audio()); // sans midi bypass
1157 if (useins.n_audio() == 0) {
1160 if (_plugins.front()->configure_io (useins, dout) == false) {
1161 PluginIoReConfigure (); /* EMIT SIGNAL */
1162 _configured = false;
1168 if (_plugins.front()->configure_io (in, out) == false) {
1169 PluginIoReConfigure (); /* EMIT SIGNAL */
1170 _configured = false;
1176 bool mapping_changed = false;
1177 if (old_in == in && old_out == out
1179 && old_match.method == _match.method
1180 && _in_map.size() == _out_map.size()
1181 && _in_map.size() == get_count ()
1183 /* If the configuration has not changed, keep the mapping */
1184 if (old_internal != _configured_internal) {
1185 mapping_changed = sanitize_maps ();
1187 } else if (_match.custom_cfg && _configured) {
1188 mapping_changed = sanitize_maps ();
1190 if (_maps_from_state) {
1191 _maps_from_state = false;
1192 mapping_changed = true;
1195 /* generate a new mapping */
1196 mapping_changed = reset_map (false);
1200 if (mapping_changed) {
1201 PluginMapChanged (); /* EMIT SIGNAL */
1204 if (DEBUG_ENABLED(DEBUG::ChanMapping)) {
1207 DEBUG_STR_APPEND(a, "\n--------<<--------\n");
1208 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
1210 DEBUG_STR_APPEND(a, "----><----\n");
1212 DEBUG_STR_APPEND(a, string_compose ("Channel Map for %1 plugin %2\n", name(), pc));
1213 DEBUG_STR_APPEND(a, " * Inputs:\n");
1214 DEBUG_STR_APPEND(a, _in_map[pc]);
1215 DEBUG_STR_APPEND(a, " * Outputs:\n");
1216 DEBUG_STR_APPEND(a, _out_map[pc]);
1218 DEBUG_STR_APPEND(a, "-------->>--------\n");
1219 DEBUG_TRACE (DEBUG::ChanMapping, DEBUG_STR(a).str());
1224 // auto-detect if inplace processing is possible
1225 bool inplace_ok = true;
1226 for (uint32_t pc = 0; pc < get_count() && inplace_ok ; ++pc) {
1227 if (!_in_map[pc].is_monotonic ()) {
1230 if (!_out_map[pc].is_monotonic ()) {
1234 _no_inplace = !inplace_ok || _plugins.front()->inplace_broken ();
1236 if (old_in != in || old_out != out || old_internal != _configured_internal
1237 || (old_match.method != _match.method && (old_match.method == Split || _match.method == Split))
1239 PluginIoReConfigure (); /* EMIT SIGNAL */
1242 // we don't know the analysis window size, so we must work with the
1243 // current buffer size here. each request for data fills in these
1244 // buffers and the analyser makes sure it gets enough data for the
1246 session().ensure_buffer_set (_signal_analysis_inputs, in);
1247 //_signal_analysis_inputs.set_count (in);
1249 session().ensure_buffer_set (_signal_analysis_outputs, out);
1250 //_signal_analysis_outputs.set_count (out);
1252 // std::cerr << "set counts to i" << in.n_audio() << "/o" << out.n_audio() << std::endl;
1255 return Processor::configure_io (in, out);
1258 /** Decide whether this PluginInsert can support a given IO configuration.
1259 * To do this, we run through a set of possible solutions in rough order of
1262 * @param in Required input channel count.
1263 * @param out Filled in with the output channel count if we return true.
1264 * @return true if the given IO configuration can be supported.
1267 PluginInsert::can_support_io_configuration (const ChanCount& in, ChanCount& out)
1270 _sidechain->can_support_io_configuration (in, out); // never fails, sets "out"
1272 return private_can_support_io_configuration (in, out).method != Impossible;
1275 /** A private version of can_support_io_configuration which returns the method
1276 * by which the configuration can be matched, rather than just whether or not
1280 PluginInsert::private_can_support_io_configuration (ChanCount const & inx, ChanCount& out) const
1282 if (_plugins.empty()) {
1286 /* if a user specified a custom cfg, so be it. */
1289 return Match (ExactMatch, get_count(), _strict_io, true); // XXX
1292 /* try automatic configuration */
1293 Match m = PluginInsert::automatic_can_support_io_configuration (inx, out);
1295 PluginInfoPtr info = _plugins.front()->get_info();
1296 ChanCount inputs = info->n_inputs;
1297 ChanCount outputs = info->n_outputs;
1299 /* handle case strict-i/o */
1300 if (_strict_io && m.method != Impossible) {
1303 /* special case MIDI instruments */
1304 if (is_midi_instrument()) {
1305 // output = midi-bypass + at most master-out channels.
1306 ChanCount max_out (DataType::AUDIO, 2); // TODO use master-out
1307 max_out.set (DataType::MIDI, out.get(DataType::MIDI));
1308 out = ChanCount::min (out, max_out);
1309 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("special case strict-i/o instrument: %1\n", name()));
1315 if (inx.n_audio () != out.n_audio ()) { // ignore midi bypass
1316 /* replicate processor to match output count (generators and such)
1317 * at least enough to feed every output port. */
1318 uint32_t f = 1; // at least one. e.g. control data filters, no in, no out.
1319 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1320 uint32_t nin = inputs.get (*t);
1321 if (nin == 0 || inx.get(*t) == 0) { continue; }
1322 f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nin));
1325 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("special case strict-i/o generator: %1\n", name()));
1326 return Match (Replicate, f, _strict_io);
1339 if (m.method != Impossible) {
1343 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("resolving 'Impossible' match for %1\n", name()));
1345 if (info->reconfigurable_io()) {
1347 bool const r = _plugins.front()->can_support_io_configuration (inx, out, &useins);
1349 // houston, we have a problem.
1350 return Match (Impossible, 0);
1352 return Match (Delegate, 1);
1355 ChanCount midi_bypass;
1356 if (inx.get(DataType::MIDI) == 1 && outputs.get(DataType::MIDI) == 0) {
1357 midi_bypass.set (DataType::MIDI, 1);
1360 // add at least as many plugins so that output count matches input count
1362 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1363 uint32_t nin = inputs.get (*t);
1364 uint32_t nout = outputs.get (*t);
1365 if (nin == 0 || inx.get(*t) == 0) { continue; }
1366 // prefer floor() so the count won't overly increase IFF (nin < nout)
1367 f = max (f, (uint32_t) floor (inx.get(*t) / (float)nout));
1369 if (f > 0 && outputs * f >= _configured_out) {
1370 out = outputs * f + midi_bypass;
1371 return Match (Replicate, f);
1374 // add at least as many plugins needed to connect all inputs
1376 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1377 uint32_t nin = inputs.get (*t);
1378 if (nin == 0 || inx.get(*t) == 0) { continue; }
1379 f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nin));
1381 out = outputs * f + midi_bypass;
1382 return Match (Replicate, f);
1385 /* this is the original Ardour 3/4 behavior, mainly for backwards compatibility */
1387 PluginInsert::automatic_can_support_io_configuration (ChanCount const & inx, ChanCount& out) const
1389 if (_plugins.empty()) {
1393 PluginInfoPtr info = _plugins.front()->get_info();
1394 ChanCount in; in += inx;
1395 ChanCount midi_bypass;
1397 if (info->reconfigurable_io()) {
1398 /* Plugin has flexible I/O, so delegate to it */
1399 bool const r = _plugins.front()->can_support_io_configuration (in, out);
1401 return Match (Impossible, 0);
1403 return Match (Delegate, 1);
1406 ChanCount inputs = info->n_inputs;
1407 ChanCount outputs = info->n_outputs;
1409 if (in.get(DataType::MIDI) == 1 && outputs.get(DataType::MIDI) == 0) {
1410 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("bypassing midi-data around %1\n", name()));
1411 midi_bypass.set (DataType::MIDI, 1);
1413 if (in.get(DataType::MIDI) == 1 && inputs.get(DataType::MIDI) == 0) {
1414 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("hiding midi-port from plugin %1\n", name()));
1415 in.set(DataType::MIDI, 0);
1418 bool no_inputs = true;
1419 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1420 if (inputs.get (*t) != 0) {
1427 /* no inputs so we can take any input configuration since we throw it away */
1428 out = outputs + midi_bypass;
1429 return Match (NoInputs, 1);
1432 /* Plugin inputs match requested inputs exactly */
1434 out = outputs + midi_bypass;
1435 return Match (ExactMatch, 1);
1438 /* We may be able to run more than one copy of the plugin within this insert
1439 to cope with the insert having more inputs than the plugin.
1440 We allow replication only for plugins with either zero or 1 inputs and outputs
1441 for every valid data type.
1445 bool can_replicate = true;
1446 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1448 uint32_t nin = inputs.get (*t);
1450 // No inputs of this type
1451 if (nin == 0 && in.get(*t) == 0) {
1455 if (nin != 1 || outputs.get (*t) != 1) {
1456 can_replicate = false;
1460 // Potential factor not set yet
1462 f = in.get(*t) / nin;
1465 // Factor for this type does not match another type, can not replicate
1466 if (f != (in.get(*t) / nin)) {
1467 can_replicate = false;
1472 if (can_replicate && f > 0) {
1473 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1474 out.set (*t, outputs.get(*t) * f);
1477 return Match (Replicate, f);
1480 /* If the processor has exactly one input of a given type, and
1481 the plugin has more, we can feed the single processor input
1482 to some or all of the plugin inputs. This is rather
1483 special-case-y, but the 1-to-many case is by far the
1484 simplest. How do I split thy 2 processor inputs to 3
1485 plugin inputs? Let me count the ways ...
1488 bool can_split = true;
1489 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1491 bool const can_split_type = (in.get (*t) == 1 && inputs.get (*t) > 1);
1492 bool const nothing_to_do_for_type = (in.get (*t) == 0 && inputs.get (*t) == 0);
1494 if (!can_split_type && !nothing_to_do_for_type) {
1500 out = outputs + midi_bypass;
1501 return Match (Split, 1);
1504 /* If the plugin has more inputs than we want, we can `hide' some of them
1505 by feeding them silence.
1508 bool could_hide = false;
1509 bool cannot_hide = false;
1510 ChanCount hide_channels;
1512 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1513 if (inputs.get(*t) > in.get(*t)) {
1514 /* there is potential to hide, since the plugin has more inputs of type t than the insert */
1515 hide_channels.set (*t, inputs.get(*t) - in.get(*t));
1517 } else if (inputs.get(*t) < in.get(*t)) {
1518 /* we definitely cannot hide, since the plugin has fewer inputs of type t than the insert */
1523 if (could_hide && !cannot_hide) {
1524 out = outputs + midi_bypass;
1525 return Match (Hide, 1, false, false, hide_channels);
1528 return Match (Impossible, 0);
1533 PluginInsert::get_state ()
1535 return state (true);
1539 PluginInsert::state (bool full)
1541 XMLNode& node = Processor::state (full);
1543 node.add_property("type", _plugins[0]->state_node_name());
1544 node.add_property("unique-id", _plugins[0]->unique_id());
1545 node.add_property("count", string_compose("%1", _plugins.size()));
1547 /* remember actual i/o configuration (for later placeholder
1548 * in case the plugin goes missing) */
1549 node.add_child_nocopy (* _configured_in.state (X_("ConfiguredInput")));
1550 node.add_child_nocopy (* _configured_out.state (X_("ConfiguredOutput")));
1552 /* save custom i/o config */
1553 node.add_property("custom", _custom_cfg ? "yes" : "no");
1554 for (uint32_t pc = 0; pc < get_count(); ++pc) {
1556 snprintf (tmp, sizeof(tmp), "InputMap-%d", pc);
1557 node.add_child_nocopy (* _in_map[pc].state (tmp));
1558 snprintf (tmp, sizeof(tmp), "OutputMap-%d", pc);
1559 node.add_child_nocopy (* _out_map[pc].state (tmp));
1563 node.add_child_nocopy (_sidechain->state (full));
1566 _plugins[0]->set_insert_id(this->id());
1567 node.add_child_nocopy (_plugins[0]->get_state());
1569 for (Controls::iterator c = controls().begin(); c != controls().end(); ++c) {
1570 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> ((*c).second);
1572 node.add_child_nocopy (ac->get_state());
1580 PluginInsert::set_control_ids (const XMLNode& node, int version)
1582 const XMLNodeList& nlist = node.children();
1583 XMLNodeConstIterator iter;
1584 set<Evoral::Parameter>::const_iterator p;
1586 for (iter = nlist.begin(); iter != nlist.end(); ++iter) {
1587 if ((*iter)->name() == Controllable::xml_node_name) {
1588 const XMLProperty* prop;
1590 uint32_t p = (uint32_t)-1;
1592 if ((prop = (*iter)->property (X_("symbol"))) != 0) {
1593 boost::shared_ptr<LV2Plugin> lv2plugin = boost::dynamic_pointer_cast<LV2Plugin> (_plugins[0]);
1595 p = lv2plugin->port_index(prop->value().c_str());
1599 if (p == (uint32_t)-1 && (prop = (*iter)->property (X_("parameter"))) != 0) {
1600 p = atoi (prop->value());
1603 if (p != (uint32_t)-1) {
1605 /* this may create the new controllable */
1607 boost::shared_ptr<Evoral::Control> c = control (Evoral::Parameter (PluginAutomation, 0, p));
1609 #ifndef NO_PLUGIN_STATE
1613 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> (c);
1615 ac->set_state (**iter, version);
1624 PluginInsert::set_state(const XMLNode& node, int version)
1626 XMLNodeList nlist = node.children();
1627 XMLNodeIterator niter;
1628 XMLPropertyList plist;
1629 const XMLProperty *prop;
1630 ARDOUR::PluginType type;
1632 if ((prop = node.property ("type")) == 0) {
1633 error << _("XML node describing plugin is missing the `type' field") << endmsg;
1637 if (prop->value() == X_("ladspa") || prop->value() == X_("Ladspa")) { /* handle old school sessions */
1638 type = ARDOUR::LADSPA;
1639 } else if (prop->value() == X_("lv2")) {
1641 } else if (prop->value() == X_("windows-vst")) {
1642 type = ARDOUR::Windows_VST;
1643 } else if (prop->value() == X_("lxvst")) {
1644 type = ARDOUR::LXVST;
1645 } else if (prop->value() == X_("audiounit")) {
1646 type = ARDOUR::AudioUnit;
1647 } else if (prop->value() == X_("luaproc")) {
1650 error << string_compose (_("unknown plugin type %1 in plugin insert state"),
1656 prop = node.property ("unique-id");
1659 #ifdef WINDOWS_VST_SUPPORT
1660 /* older sessions contain VST plugins with only an "id" field.
1663 if (type == ARDOUR::Windows_VST) {
1664 prop = node.property ("id");
1668 #ifdef LXVST_SUPPORT
1669 /*There shouldn't be any older sessions with linuxVST support.. but anyway..*/
1671 if (type == ARDOUR::LXVST) {
1672 prop = node.property ("id");
1678 error << _("Plugin has no unique ID field") << endmsg;
1683 boost::shared_ptr<Plugin> plugin = find_plugin (_session, prop->value(), type);
1685 /* treat linux and windows VST plugins equivalent if they have the same uniqueID
1686 * allow to move sessions windows <> linux */
1687 #ifdef LXVST_SUPPORT
1688 if (plugin == 0 && type == ARDOUR::Windows_VST) {
1689 type = ARDOUR::LXVST;
1690 plugin = find_plugin (_session, prop->value(), type);
1694 #ifdef WINDOWS_VST_SUPPORT
1695 if (plugin == 0 && type == ARDOUR::LXVST) {
1696 type = ARDOUR::Windows_VST;
1697 plugin = find_plugin (_session, prop->value(), type);
1702 error << string_compose(
1703 _("Found a reference to a plugin (\"%1\") that is unknown.\n"
1704 "Perhaps it was removed or moved since it was last used."),
1710 if (type == ARDOUR::Lua) {
1711 XMLNode *ls = node.child (plugin->state_node_name().c_str());
1712 // we need to load the script to set the name and parameters.
1713 boost::shared_ptr<LuaProc> lp = boost::dynamic_pointer_cast<LuaProc>(plugin);
1715 lp->set_script_from_state (*ls);
1719 // The name of the PluginInsert comes from the plugin, nothing else
1720 _name = plugin->get_info()->name;
1724 // Processor::set_state() will set this, but too late
1725 // for it to be available when setting up plugin
1726 // state. We can't call Processor::set_state() until
1727 // the plugins themselves are created and added.
1731 if (_plugins.empty()) {
1732 /* if we are adding the first plugin, we will need to set
1733 up automatable controls.
1735 add_plugin (plugin);
1736 create_automatable_parameters ();
1737 set_control_ids (node, version);
1740 if ((prop = node.property ("count")) != 0) {
1741 sscanf (prop->value().c_str(), "%u", &count);
1744 if (_plugins.size() != count) {
1745 for (uint32_t n = 1; n < count; ++n) {
1746 add_plugin (plugin_factory (plugin));
1750 Processor::set_state (node, version);
1752 PBD::ID new_id = this->id();
1753 PBD::ID old_id = this->id();
1755 if ((prop = node.property ("id")) != 0) {
1756 old_id = prop->value ();
1759 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1761 /* find the node with the type-specific node name ("lv2", "ladspa", etc)
1762 and set all plugins to the same state.
1765 if ((*niter)->name() == plugin->state_node_name()) {
1767 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1768 /* Plugin state can include external files which are named after the ID.
1770 * If regenerate_xml_or_string_ids() is set, the ID will already have
1771 * been changed, so we need to use the old ID from the XML to load the
1772 * state and then update the ID.
1774 * When copying a plugin-state, route_ui takes care of of updating the ID,
1775 * but we need to call set_insert_id() to clear the cached plugin-state
1776 * and force a change.
1778 if (!regenerate_xml_or_string_ids ()) {
1779 (*i)->set_insert_id (new_id);
1781 (*i)->set_insert_id (old_id);
1784 (*i)->set_state (**niter, version);
1786 if (regenerate_xml_or_string_ids ()) {
1787 (*i)->set_insert_id (new_id);
1795 if (version < 3000) {
1797 /* Only 2.X sessions need a call to set_parameter_state() - in 3.X and above
1798 this is all handled by Automatable
1801 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1802 if ((*niter)->name() == "Redirect") {
1803 /* XXX do we need to tackle placement? i think not (pd; oct 16 2009) */
1804 Processor::set_state (**niter, version);
1809 set_parameter_state_2X (node, version);
1812 if ((prop = node.property (X_("custom"))) != 0) {
1813 _custom_cfg = string_is_affirmative (prop->value());
1816 // TODO load/add sidechain
1818 uint32_t in_maps = 0;
1819 uint32_t out_maps = 0;
1820 XMLNodeList kids = node.children ();
1821 for (XMLNodeIterator i = kids.begin(); i != kids.end(); ++i) {
1822 if ((*i)->name() == X_("ConfiguredOutput")) {
1823 _custom_out = ChanCount(**i);
1825 if (strncmp ((*i)->name ().c_str(), X_("InputMap-"), 9) == 0) {
1826 long pc = atol (&((*i)->name().c_str()[9]));
1827 if (pc >=0 && pc <= get_count()) {
1828 _in_map[pc] = ChanMapping (**i);
1832 if (strncmp ((*i)->name ().c_str(), X_("OutputMap-"), 10) == 0) {
1833 long pc = atol (&((*i)->name().c_str()[10]));
1834 if (pc >=0 && pc <= get_count()) {
1835 _out_map[pc] = ChanMapping (**i);
1839 if ((*i)->name () == Processor::state_node_name) {
1843 _sidechain->set_state (**i, version);
1847 if (in_maps == out_maps && out_maps >0 && out_maps == get_count()) {
1848 _maps_from_state = true;
1851 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1855 (*i)->deactivate ();
1863 PluginInsert::update_id (PBD::ID id)
1866 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1867 (*i)->set_insert_id (id);
1872 PluginInsert::set_state_dir (const std::string& d)
1874 // state() only saves the state of the first plugin
1875 _plugins[0]->set_state_dir (d);
1879 PluginInsert::set_parameter_state_2X (const XMLNode& node, int version)
1881 XMLNodeList nlist = node.children();
1882 XMLNodeIterator niter;
1884 /* look for port automation node */
1886 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1888 if ((*niter)->name() != port_automation_node_name) {
1894 XMLNodeConstIterator iter;
1899 cnodes = (*niter)->children ("port");
1901 for (iter = cnodes.begin(); iter != cnodes.end(); ++iter){
1905 if ((cprop = child->property("number")) != 0) {
1906 port = cprop->value().c_str();
1908 warning << _("PluginInsert: Auto: no ladspa port number") << endmsg;
1912 sscanf (port, "%" PRIu32, &port_id);
1914 if (port_id >= _plugins[0]->parameter_count()) {
1915 warning << _("PluginInsert: Auto: port id out of range") << endmsg;
1919 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(
1920 control(Evoral::Parameter(PluginAutomation, 0, port_id), true));
1922 if (c && c->alist()) {
1923 if (!child->children().empty()) {
1924 c->alist()->set_state (*child->children().front(), version);
1926 /* In some cases 2.X saves lists with min_yval and max_yval
1927 being FLT_MIN and FLT_MAX respectively. This causes problems
1928 in A3 because these min/max values are used to compute
1929 where GUI control points should be drawn. If we see such
1930 values, `correct' them to the min/max of the appropriate
1934 float min_y = c->alist()->get_min_y ();
1935 float max_y = c->alist()->get_max_y ();
1937 ParameterDescriptor desc;
1938 _plugins.front()->get_parameter_descriptor (port_id, desc);
1940 if (min_y == FLT_MIN) {
1944 if (max_y == FLT_MAX) {
1948 c->alist()->set_yrange (min_y, max_y);
1951 error << string_compose (_("PluginInsert: automatable control %1 not found - ignored"), port_id) << endmsg;
1963 PluginInsert::describe_parameter (Evoral::Parameter param)
1965 if (param.type() == PluginAutomation) {
1966 return _plugins[0]->describe_parameter (param);
1967 } else if (param.type() == PluginPropertyAutomation) {
1968 boost::shared_ptr<AutomationControl> c(automation_control(param));
1969 if (c && !c->desc().label.empty()) {
1970 return c->desc().label;
1973 return Automatable::describe_parameter(param);
1977 PluginInsert::signal_latency() const
1979 if (_user_latency) {
1980 return _user_latency;
1983 return _plugins[0]->signal_latency ();
1987 PluginInsert::type ()
1989 return plugin()->get_info()->type;
1992 PluginInsert::PluginControl::PluginControl (PluginInsert* p,
1993 const Evoral::Parameter& param,
1994 const ParameterDescriptor& desc,
1995 boost::shared_ptr<AutomationList> list)
1996 : AutomationControl (p->session(), param, desc, list, p->describe_parameter(param))
2000 alist()->reset_default (desc.normal);
2002 list->set_interpolation(Evoral::ControlList::Discrete);
2007 set_flags(Controllable::Toggle);
2011 /** @param val `user' value */
2013 PluginInsert::PluginControl::set_value (double user_val, PBD::Controllable::GroupControlDisposition group_override)
2016 _set_value (user_val, group_override);
2020 PluginInsert::PluginControl::set_value_unchecked (double user_val)
2022 /* used only by automation playback */
2023 _set_value (user_val, Controllable::NoGroup);
2027 PluginInsert::PluginControl::_set_value (double user_val, PBD::Controllable::GroupControlDisposition group_override)
2029 /* FIXME: probably should be taking out some lock here.. */
2031 for (Plugins::iterator i = _plugin->_plugins.begin(); i != _plugin->_plugins.end(); ++i) {
2032 (*i)->set_parameter (_list->parameter().id(), user_val);
2035 boost::shared_ptr<Plugin> iasp = _plugin->_impulseAnalysisPlugin.lock();
2037 iasp->set_parameter (_list->parameter().id(), user_val);
2040 AutomationControl::set_value (user_val, group_override);
2044 PluginInsert::PluginControl::catch_up_with_external_value (double user_val)
2046 AutomationControl::set_value (user_val, Controllable::NoGroup);
2050 PluginInsert::PluginControl::get_state ()
2054 XMLNode& node (AutomationControl::get_state());
2055 ss << parameter().id();
2056 node.add_property (X_("parameter"), ss.str());
2058 boost::shared_ptr<LV2Plugin> lv2plugin = boost::dynamic_pointer_cast<LV2Plugin> (_plugin->_plugins[0]);
2060 node.add_property (X_("symbol"), lv2plugin->port_symbol (parameter().id()));
2067 /** @return `user' val */
2069 PluginInsert::PluginControl::get_value () const
2071 boost::shared_ptr<Plugin> plugin = _plugin->plugin (0);
2077 return plugin->get_parameter (_list->parameter().id());
2080 PluginInsert::PluginPropertyControl::PluginPropertyControl (PluginInsert* p,
2081 const Evoral::Parameter& param,
2082 const ParameterDescriptor& desc,
2083 boost::shared_ptr<AutomationList> list)
2084 : AutomationControl (p->session(), param, desc, list)
2088 alist()->set_yrange (desc.lower, desc.upper);
2089 alist()->reset_default (desc.normal);
2093 set_flags(Controllable::Toggle);
2098 PluginInsert::PluginPropertyControl::set_value (double user_val, PBD::Controllable::GroupControlDisposition /* group_override*/)
2101 set_value_unchecked (user_val);
2106 PluginInsert::PluginPropertyControl::set_value_unchecked (double user_val)
2108 /* Old numeric set_value(), coerce to appropriate datatype if possible.
2109 This is lossy, but better than nothing until Ardour's automation system
2110 can handle various datatypes all the way down. */
2111 const Variant value(_desc.datatype, user_val);
2112 if (value.type() == Variant::NOTHING) {
2113 error << "set_value(double) called for non-numeric property" << endmsg;
2117 for (Plugins::iterator i = _plugin->_plugins.begin(); i != _plugin->_plugins.end(); ++i) {
2118 (*i)->set_property(_list->parameter().id(), value);
2122 AutomationControl::set_value (user_val, Controllable::NoGroup);
2126 PluginInsert::PluginPropertyControl::get_state ()
2130 XMLNode& node (AutomationControl::get_state());
2131 ss << parameter().id();
2132 node.add_property (X_("property"), ss.str());
2133 node.remove_property (X_("value"));
2139 PluginInsert::PluginPropertyControl::get_value () const
2141 return _value.to_double();
2144 boost::shared_ptr<Plugin>
2145 PluginInsert::get_impulse_analysis_plugin()
2147 boost::shared_ptr<Plugin> ret;
2148 if (_impulseAnalysisPlugin.expired()) {
2149 ret = plugin_factory(_plugins[0]);
2150 ret->configure_io (internal_input_streams (), internal_output_streams ());
2151 _impulseAnalysisPlugin = ret;
2153 ret = _impulseAnalysisPlugin.lock();
2160 PluginInsert::collect_signal_for_analysis (framecnt_t nframes)
2162 // called from outside the audio thread, so this should be safe
2163 // only do audio as analysis is (currently) only for audio plugins
2164 _signal_analysis_inputs.ensure_buffers( DataType::AUDIO, internal_input_streams().n_audio(), nframes);
2165 _signal_analysis_outputs.ensure_buffers( DataType::AUDIO, internal_output_streams().n_audio(), nframes);
2167 _signal_analysis_collected_nframes = 0;
2168 _signal_analysis_collect_nframes_max = nframes;
2171 /** Add a plugin to our list */
2173 PluginInsert::add_plugin (boost::shared_ptr<Plugin> plugin)
2175 plugin->set_insert_id (this->id());
2177 if (_plugins.empty()) {
2178 /* first (and probably only) plugin instance - connect to relevant signals
2181 plugin->ParameterChangedExternally.connect_same_thread (*this, boost::bind (&PluginInsert::parameter_changed_externally, this, _1, _2));
2182 plugin->StartTouch.connect_same_thread (*this, boost::bind (&PluginInsert::start_touch, this, _1));
2183 plugin->EndTouch.connect_same_thread (*this, boost::bind (&PluginInsert::end_touch, this, _1));
2186 _plugins.push_back (plugin);
2190 PluginInsert::realtime_handle_transport_stopped ()
2192 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2193 (*i)->realtime_handle_transport_stopped ();
2198 PluginInsert::realtime_locate ()
2200 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2201 (*i)->realtime_locate ();
2206 PluginInsert::monitoring_changed ()
2208 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2209 (*i)->monitoring_changed ();
2214 PluginInsert::start_touch (uint32_t param_id)
2216 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id));
2218 ac->start_touch (session().audible_frame());
2223 PluginInsert::end_touch (uint32_t param_id)
2225 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id));
2227 ac->stop_touch (true, session().audible_frame());
2231 std::ostream& operator<<(std::ostream& o, const ARDOUR::PluginInsert::Match& m)
2234 case PluginInsert::Impossible: o << "Impossible"; break;
2235 case PluginInsert::Delegate: o << "Delegate"; break;
2236 case PluginInsert::NoInputs: o << "NoInputs"; break;
2237 case PluginInsert::ExactMatch: o << "ExactMatch"; break;
2238 case PluginInsert::Replicate: o << "Replicate"; break;
2239 case PluginInsert::Split: o << "Split"; break;
2240 case PluginInsert::Hide: o << "Hide"; break;
2242 o << " cnt: " << m.plugins
2243 << (m.strict_io ? " strict-io" : "")
2244 << (m.custom_cfg ? " custom-cfg" : "");
2245 if (m.method == PluginInsert::Hide) {
2246 o << " hide: " << m.hide;