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 run sidechain (delaylines)
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 // TODO we need delaylines here for latency compensation
705 _sidechain->run (bufs, start_frame, end_frame, nframes, true);
708 if (_session.transport_rolling() || _session.bounce_processing()) {
709 automation_run (bufs, start_frame, nframes);
711 connect_and_run (bufs, nframes, 0, false);
715 // TODO use mapping in bypassed mode ?!
716 // -> do we bypass the processor or the plugin
718 // TODO include sidechain??
720 uint32_t in = input_streams ().n_audio ();
721 uint32_t out = output_streams().n_audio ();
723 if (has_no_audio_inputs() || in == 0) {
725 /* silence all (audio) outputs. Should really declick
726 * at the transitions of "active"
729 for (uint32_t n = 0; n < out; ++n) {
730 bufs.get_audio (n).silence (nframes);
733 } else if (out > in) {
735 /* not active, but something has make up for any channel count increase
736 * for now , simply replicate last buffer
738 for (uint32_t n = in; n < out; ++n) {
739 bufs.get_audio(n).read_from(bufs.get_audio(in - 1), nframes);
743 bufs.count().set_audio (out);
746 _active = _pending_active;
748 /* we have no idea whether the plugin generated silence or not, so mark
749 * all buffers appropriately.
754 PluginInsert::automation_run (BufferSet& bufs, framepos_t start, pframes_t nframes)
756 Evoral::ControlEvent next_event (0, 0.0f);
757 framepos_t now = start;
758 framepos_t end = now + nframes;
759 framecnt_t offset = 0;
761 Glib::Threads::Mutex::Lock lm (control_lock(), Glib::Threads::TRY_LOCK);
764 connect_and_run (bufs, nframes, offset, false);
768 if (!find_next_event (now, end, next_event) || _plugins.front()->requires_fixed_sized_buffers()) {
770 /* no events have a time within the relevant range */
772 connect_and_run (bufs, nframes, offset, true, now);
778 framecnt_t cnt = min (((framecnt_t) ceil (next_event.when) - now), (framecnt_t) nframes);
780 connect_and_run (bufs, cnt, offset, true, now);
786 if (!find_next_event (now, end, next_event)) {
791 /* cleanup anything that is left to do */
794 connect_and_run (bufs, nframes, offset, true, now);
799 PluginInsert::default_parameter_value (const Evoral::Parameter& param)
801 if (param.type() != PluginAutomation)
804 if (_plugins.empty()) {
805 fatal << _("programming error: ") << X_("PluginInsert::default_parameter_value() called with no plugin")
807 abort(); /*NOTREACHED*/
810 return _plugins[0]->default_value (param.id());
815 PluginInsert::can_reset_all_parameters ()
819 for (uint32_t par = 0; par < _plugins[0]->parameter_count(); ++par) {
821 const uint32_t cid = _plugins[0]->nth_parameter (par, ok);
823 if (!ok || !_plugins[0]->parameter_is_input(cid)) {
827 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, cid));
833 if (ac->automation_state() & Play) {
838 return all && (params > 0);
842 PluginInsert::reset_parameters_to_default ()
846 for (uint32_t par = 0; par < _plugins[0]->parameter_count(); ++par) {
848 const uint32_t cid = _plugins[0]->nth_parameter (par, ok);
850 if (!ok || !_plugins[0]->parameter_is_input(cid)) {
854 const float dflt = _plugins[0]->default_value (cid);
855 const float curr = _plugins[0]->get_parameter (cid);
861 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, cid));
866 if (ac->automation_state() & Play) {
871 ac->set_value (dflt, Controllable::NoGroup);
876 boost::shared_ptr<Plugin>
877 PluginInsert::plugin_factory (boost::shared_ptr<Plugin> other)
879 boost::shared_ptr<LadspaPlugin> lp;
880 boost::shared_ptr<LuaProc> lua;
882 boost::shared_ptr<LV2Plugin> lv2p;
884 #ifdef WINDOWS_VST_SUPPORT
885 boost::shared_ptr<WindowsVSTPlugin> vp;
888 boost::shared_ptr<LXVSTPlugin> lxvp;
890 #ifdef AUDIOUNIT_SUPPORT
891 boost::shared_ptr<AUPlugin> ap;
894 if ((lp = boost::dynamic_pointer_cast<LadspaPlugin> (other)) != 0) {
895 return boost::shared_ptr<Plugin> (new LadspaPlugin (*lp));
896 } else if ((lua = boost::dynamic_pointer_cast<LuaProc> (other)) != 0) {
897 return boost::shared_ptr<Plugin> (new LuaProc (*lua));
899 } else if ((lv2p = boost::dynamic_pointer_cast<LV2Plugin> (other)) != 0) {
900 return boost::shared_ptr<Plugin> (new LV2Plugin (*lv2p));
902 #ifdef WINDOWS_VST_SUPPORT
903 } else if ((vp = boost::dynamic_pointer_cast<WindowsVSTPlugin> (other)) != 0) {
904 return boost::shared_ptr<Plugin> (new WindowsVSTPlugin (*vp));
907 } else if ((lxvp = boost::dynamic_pointer_cast<LXVSTPlugin> (other)) != 0) {
908 return boost::shared_ptr<Plugin> (new LXVSTPlugin (*lxvp));
910 #ifdef AUDIOUNIT_SUPPORT
911 } else if ((ap = boost::dynamic_pointer_cast<AUPlugin> (other)) != 0) {
912 return boost::shared_ptr<Plugin> (new AUPlugin (*ap));
916 fatal << string_compose (_("programming error: %1"),
917 X_("unknown plugin type in PluginInsert::plugin_factory"))
919 abort(); /*NOTREACHED*/
920 return boost::shared_ptr<Plugin> ((Plugin*) 0);
924 PluginInsert::set_input_map (uint32_t num, ChanMapping m) {
925 if (num < _in_map.size()) {
926 bool changed = _in_map[num] != m;
930 PluginMapChanged (); /* EMIT SIGNAL */
936 PluginInsert::set_output_map (uint32_t num, ChanMapping m) {
937 if (num < _out_map.size()) {
938 bool changed = _out_map[num] != m;
942 PluginMapChanged (); /* EMIT SIGNAL */
948 PluginInsert::input_map () const
952 for (PinMappings::const_iterator i = _in_map.begin (); i != _in_map.end (); ++i, ++pc) {
953 ChanMapping m (i->second);
954 const ChanMapping::Mappings& mp ((*i).second.mappings());
955 for (ChanMapping::Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
956 for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
957 rv.set (tm->first, i->first + pc * natural_input_streams().get(tm->first), i->second);
965 PluginInsert::output_map () const
969 for (PinMappings::const_iterator i = _out_map.begin (); i != _out_map.end (); ++i, ++pc) {
970 ChanMapping m (i->second);
971 const ChanMapping::Mappings& mp ((*i).second.mappings());
972 for (ChanMapping::Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
973 for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
974 rv.set (tm->first, i->first + pc * natural_output_streams().get(tm->first), i->second);
978 if (has_midi_bypass ()) {
979 rv.set (DataType::MIDI, 0, 0);
986 PluginInsert::has_midi_bypass () const
988 if (_configured_in.n_midi () == 1 && _configured_out.n_midi () == 1 && natural_output_streams ().n_midi () == 0) {
995 PluginInsert::sanitize_maps ()
997 bool changed = false;
998 /* strip dead wood */
1000 PinMappings new_outs;
1001 for (uint32_t pc = 0; pc < get_count(); ++pc) {
1003 ChanMapping new_out;
1004 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1005 for (uint32_t i = 0; i < natural_input_streams().get (*t); ++i) {
1007 uint32_t idx = _in_map[pc].get (*t, i, &valid);
1008 if (valid && idx < _configured_internal.get (*t)) {
1009 new_in.set (*t, i, idx);
1012 for (uint32_t o = 0; o < natural_output_streams().get (*t); ++o) {
1014 uint32_t idx = _out_map[pc].get (*t, o, &valid);
1015 if (valid && idx < _configured_out.get (*t)) {
1016 new_out.set (*t, o, idx);
1020 if (_in_map[pc] != new_in || _out_map[pc] != new_out) {
1023 new_ins[pc] = new_in;
1024 new_outs[pc] = new_out;
1026 /* prevent dup output assignments */
1027 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1028 for (uint32_t o = 0; o < _configured_out.get (*t); ++o) {
1029 bool mapped = false;
1030 for (uint32_t pc = 0; pc < get_count(); ++pc) {
1032 uint32_t idx = new_outs[pc].get_src (*t, o, &valid);
1033 if (valid && mapped) {
1034 new_outs[pc].unset (*t, idx);
1042 if (_in_map != new_ins || _out_map != new_outs) {
1046 _out_map = new_outs;
1052 PluginInsert::reset_map (bool emit)
1055 const PinMappings old_in (_in_map);
1056 const PinMappings old_out (_out_map);
1060 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
1061 if (_match.method == Split) {
1062 _in_map[pc] = ChanMapping ();
1063 /* connect inputs in round-robin fashion */
1064 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1065 const uint32_t cend = _configured_internal.get (*t);
1066 if (cend == 0) { continue; }
1068 for (uint32_t in = 0; in < natural_input_streams().get (*t); ++in) {
1069 _in_map[pc].set (*t, in, c);
1074 _in_map[pc] = ChanMapping (ChanCount::min (natural_input_streams (), _configured_internal));
1076 _out_map[pc] = ChanMapping (ChanCount::min (natural_output_streams(), _configured_out));
1078 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1079 _in_map[pc].offset_to(*t, pc * natural_input_streams().get(*t));
1080 _out_map[pc].offset_to(*t, pc * natural_output_streams().get(*t));
1084 if (old_in == _in_map && old_out == _out_map) {
1088 PluginMapChanged (); /* EMIT SIGNAL */
1094 PluginInsert::configure_io (ChanCount in, ChanCount out)
1096 Match old_match = _match;
1098 ChanCount old_internal;
1102 old_in = _configured_in;
1103 old_internal = _configured_internal;
1104 old_out = _configured_out;
1107 _configured_in = in;
1108 _configured_internal = in;
1109 _configured_out = out;
1112 /* TODO hide midi-bypass, and custom outs. Best /fake/ "out" here.
1113 * (currently _sidechain->configure_io always succeeds
1114 * since Processor::configure_io() succeeds)
1116 if (!_sidechain->configure_io (in, out)) {
1117 DEBUG_TRACE (DEBUG::ChanMapping, "Sidechain configuration failed\n");
1120 _configured_internal += _sidechain->input()->n_ports();
1123 /* get plugin configuration */
1124 _match = private_can_support_io_configuration (in, out);
1126 if (DEBUG_ENABLED(DEBUG::ChanMapping)) {
1128 DEBUG_STR_APPEND(a, string_compose ("Match '%1': ", name()));
1129 DEBUG_STR_APPEND(a, _match);
1130 DEBUG_TRACE (DEBUG::ChanMapping, DEBUG_STR(a).str());
1134 /* set the matching method and number of plugins that we will use to meet this configuration */
1135 if (set_count (_match.plugins) == false) {
1136 PluginIoReConfigure (); /* EMIT SIGNAL */
1137 _configured = false;
1141 /* configure plugins */
1142 switch (_match.method) {
1145 if (_plugins.front()->configure_io (natural_input_streams(), out) == false) {
1146 PluginIoReConfigure (); /* EMIT SIGNAL */
1147 _configured = false;
1155 bool const r = _plugins.front()->can_support_io_configuration (in, dout, &useins);
1157 assert (_match.strict_io || dout.n_audio() == out.n_audio()); // sans midi bypass
1158 if (useins.n_audio() == 0) {
1161 if (_plugins.front()->configure_io (useins, dout) == false) {
1162 PluginIoReConfigure (); /* EMIT SIGNAL */
1163 _configured = false;
1169 if (_plugins.front()->configure_io (in, out) == false) {
1170 PluginIoReConfigure (); /* EMIT SIGNAL */
1171 _configured = false;
1177 bool mapping_changed = false;
1178 if (old_in == in && old_out == out
1180 && old_match.method == _match.method
1181 && _in_map.size() == _out_map.size()
1182 && _in_map.size() == get_count ()
1184 /* If the configuration has not changed, keep the mapping */
1185 if (old_internal != _configured_internal) {
1186 mapping_changed = sanitize_maps ();
1188 } else if (_match.custom_cfg && _configured) {
1189 mapping_changed = sanitize_maps ();
1191 if (_maps_from_state) {
1192 _maps_from_state = false;
1193 mapping_changed = true;
1196 /* generate a new mapping */
1197 mapping_changed = reset_map (false);
1201 if (mapping_changed) {
1202 PluginMapChanged (); /* EMIT SIGNAL */
1205 if (DEBUG_ENABLED(DEBUG::ChanMapping)) {
1208 DEBUG_STR_APPEND(a, "\n--------<<--------\n");
1209 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
1211 DEBUG_STR_APPEND(a, "----><----\n");
1213 DEBUG_STR_APPEND(a, string_compose ("Channel Map for %1 plugin %2\n", name(), pc));
1214 DEBUG_STR_APPEND(a, " * Inputs:\n");
1215 DEBUG_STR_APPEND(a, _in_map[pc]);
1216 DEBUG_STR_APPEND(a, " * Outputs:\n");
1217 DEBUG_STR_APPEND(a, _out_map[pc]);
1219 DEBUG_STR_APPEND(a, "-------->>--------\n");
1220 DEBUG_TRACE (DEBUG::ChanMapping, DEBUG_STR(a).str());
1225 // auto-detect if inplace processing is possible
1226 bool inplace_ok = true;
1227 for (uint32_t pc = 0; pc < get_count() && inplace_ok ; ++pc) {
1228 if (!_in_map[pc].is_monotonic ()) {
1231 if (!_out_map[pc].is_monotonic ()) {
1235 _no_inplace = !inplace_ok || _plugins.front()->inplace_broken ();
1237 if (old_in != in || old_out != out || old_internal != _configured_internal
1238 || (old_match.method != _match.method && (old_match.method == Split || _match.method == Split))
1240 PluginIoReConfigure (); /* EMIT SIGNAL */
1243 // we don't know the analysis window size, so we must work with the
1244 // current buffer size here. each request for data fills in these
1245 // buffers and the analyser makes sure it gets enough data for the
1247 session().ensure_buffer_set (_signal_analysis_inputs, in);
1248 //_signal_analysis_inputs.set_count (in);
1250 session().ensure_buffer_set (_signal_analysis_outputs, out);
1251 //_signal_analysis_outputs.set_count (out);
1253 // std::cerr << "set counts to i" << in.n_audio() << "/o" << out.n_audio() << std::endl;
1256 return Processor::configure_io (in, out);
1259 /** Decide whether this PluginInsert can support a given IO configuration.
1260 * To do this, we run through a set of possible solutions in rough order of
1263 * @param in Required input channel count.
1264 * @param out Filled in with the output channel count if we return true.
1265 * @return true if the given IO configuration can be supported.
1268 PluginInsert::can_support_io_configuration (const ChanCount& in, ChanCount& out)
1271 _sidechain->can_support_io_configuration (in, out); // never fails, sets "out"
1273 return private_can_support_io_configuration (in, out).method != Impossible;
1276 /** A private version of can_support_io_configuration which returns the method
1277 * by which the configuration can be matched, rather than just whether or not
1281 PluginInsert::private_can_support_io_configuration (ChanCount const & inx, ChanCount& out) const
1283 if (_plugins.empty()) {
1287 /* if a user specified a custom cfg, so be it. */
1290 return Match (ExactMatch, get_count(), _strict_io, true); // XXX
1293 /* try automatic configuration */
1294 Match m = PluginInsert::automatic_can_support_io_configuration (inx, out);
1296 PluginInfoPtr info = _plugins.front()->get_info();
1297 ChanCount inputs = info->n_inputs;
1298 ChanCount outputs = info->n_outputs;
1300 /* handle case strict-i/o */
1301 if (_strict_io && m.method != Impossible) {
1304 /* special case MIDI instruments */
1305 if (is_midi_instrument()) {
1306 // output = midi-bypass + at most master-out channels.
1307 ChanCount max_out (DataType::AUDIO, 2); // TODO use master-out
1308 max_out.set (DataType::MIDI, out.get(DataType::MIDI));
1309 out = ChanCount::min (out, max_out);
1310 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("special case strict-i/o instrument: %1\n", name()));
1316 if (inx.n_audio () != out.n_audio ()) { // ignore midi bypass
1317 /* replicate processor to match output count (generators and such)
1318 * at least enough to feed every output port. */
1319 uint32_t f = 1; // at least one. e.g. control data filters, no in, no out.
1320 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1321 uint32_t nin = inputs.get (*t);
1322 if (nin == 0 || inx.get(*t) == 0) { continue; }
1323 f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nin));
1326 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("special case strict-i/o generator: %1\n", name()));
1327 return Match (Replicate, f, _strict_io);
1340 if (m.method != Impossible) {
1344 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("resolving 'Impossible' match for %1\n", name()));
1346 if (info->reconfigurable_io()) {
1348 bool const r = _plugins.front()->can_support_io_configuration (inx, out, &useins);
1350 // houston, we have a problem.
1351 return Match (Impossible, 0);
1353 return Match (Delegate, 1);
1356 ChanCount midi_bypass;
1357 if (inx.get(DataType::MIDI) == 1 && outputs.get(DataType::MIDI) == 0) {
1358 midi_bypass.set (DataType::MIDI, 1);
1361 // add at least as many plugins so that output count matches input count
1363 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1364 uint32_t nin = inputs.get (*t);
1365 uint32_t nout = outputs.get (*t);
1366 if (nin == 0 || inx.get(*t) == 0) { continue; }
1367 // prefer floor() so the count won't overly increase IFF (nin < nout)
1368 f = max (f, (uint32_t) floor (inx.get(*t) / (float)nout));
1370 if (f > 0 && outputs * f >= _configured_out) {
1371 out = outputs * f + midi_bypass;
1372 return Match (Replicate, f);
1375 // add at least as many plugins needed to connect all inputs
1377 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1378 uint32_t nin = inputs.get (*t);
1379 if (nin == 0 || inx.get(*t) == 0) { continue; }
1380 f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nin));
1382 out = outputs * f + midi_bypass;
1383 return Match (Replicate, f);
1386 /* this is the original Ardour 3/4 behavior, mainly for backwards compatibility */
1388 PluginInsert::automatic_can_support_io_configuration (ChanCount const & inx, ChanCount& out) const
1390 if (_plugins.empty()) {
1394 PluginInfoPtr info = _plugins.front()->get_info();
1395 ChanCount in; in += inx;
1396 ChanCount midi_bypass;
1398 if (info->reconfigurable_io()) {
1399 /* Plugin has flexible I/O, so delegate to it */
1400 bool const r = _plugins.front()->can_support_io_configuration (in, out);
1402 return Match (Impossible, 0);
1404 return Match (Delegate, 1);
1407 ChanCount inputs = info->n_inputs;
1408 ChanCount outputs = info->n_outputs;
1410 if (in.get(DataType::MIDI) == 1 && outputs.get(DataType::MIDI) == 0) {
1411 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("bypassing midi-data around %1\n", name()));
1412 midi_bypass.set (DataType::MIDI, 1);
1414 if (in.get(DataType::MIDI) == 1 && inputs.get(DataType::MIDI) == 0) {
1415 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("hiding midi-port from plugin %1\n", name()));
1416 in.set(DataType::MIDI, 0);
1419 bool no_inputs = true;
1420 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1421 if (inputs.get (*t) != 0) {
1428 /* no inputs so we can take any input configuration since we throw it away */
1429 out = outputs + midi_bypass;
1430 return Match (NoInputs, 1);
1433 /* Plugin inputs match requested inputs exactly */
1435 out = outputs + midi_bypass;
1436 return Match (ExactMatch, 1);
1439 /* We may be able to run more than one copy of the plugin within this insert
1440 to cope with the insert having more inputs than the plugin.
1441 We allow replication only for plugins with either zero or 1 inputs and outputs
1442 for every valid data type.
1446 bool can_replicate = true;
1447 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1449 uint32_t nin = inputs.get (*t);
1451 // No inputs of this type
1452 if (nin == 0 && in.get(*t) == 0) {
1456 if (nin != 1 || outputs.get (*t) != 1) {
1457 can_replicate = false;
1461 // Potential factor not set yet
1463 f = in.get(*t) / nin;
1466 // Factor for this type does not match another type, can not replicate
1467 if (f != (in.get(*t) / nin)) {
1468 can_replicate = false;
1473 if (can_replicate && f > 0) {
1474 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1475 out.set (*t, outputs.get(*t) * f);
1478 return Match (Replicate, f);
1481 /* If the processor has exactly one input of a given type, and
1482 the plugin has more, we can feed the single processor input
1483 to some or all of the plugin inputs. This is rather
1484 special-case-y, but the 1-to-many case is by far the
1485 simplest. How do I split thy 2 processor inputs to 3
1486 plugin inputs? Let me count the ways ...
1489 bool can_split = true;
1490 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1492 bool const can_split_type = (in.get (*t) == 1 && inputs.get (*t) > 1);
1493 bool const nothing_to_do_for_type = (in.get (*t) == 0 && inputs.get (*t) == 0);
1495 if (!can_split_type && !nothing_to_do_for_type) {
1501 out = outputs + midi_bypass;
1502 return Match (Split, 1);
1505 /* If the plugin has more inputs than we want, we can `hide' some of them
1506 by feeding them silence.
1509 bool could_hide = false;
1510 bool cannot_hide = false;
1511 ChanCount hide_channels;
1513 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1514 if (inputs.get(*t) > in.get(*t)) {
1515 /* there is potential to hide, since the plugin has more inputs of type t than the insert */
1516 hide_channels.set (*t, inputs.get(*t) - in.get(*t));
1518 } else if (inputs.get(*t) < in.get(*t)) {
1519 /* we definitely cannot hide, since the plugin has fewer inputs of type t than the insert */
1524 if (could_hide && !cannot_hide) {
1525 out = outputs + midi_bypass;
1526 return Match (Hide, 1, false, false, hide_channels);
1529 return Match (Impossible, 0);
1534 PluginInsert::get_state ()
1536 return state (true);
1540 PluginInsert::state (bool full)
1542 XMLNode& node = Processor::state (full);
1544 node.add_property("type", _plugins[0]->state_node_name());
1545 node.add_property("unique-id", _plugins[0]->unique_id());
1546 node.add_property("count", string_compose("%1", _plugins.size()));
1548 /* remember actual i/o configuration (for later placeholder
1549 * in case the plugin goes missing) */
1550 node.add_child_nocopy (* _configured_in.state (X_("ConfiguredInput")));
1551 node.add_child_nocopy (* _configured_out.state (X_("ConfiguredOutput")));
1553 /* save custom i/o config */
1554 node.add_property("custom", _custom_cfg ? "yes" : "no");
1555 for (uint32_t pc = 0; pc < get_count(); ++pc) {
1557 snprintf (tmp, sizeof(tmp), "InputMap-%d", pc);
1558 node.add_child_nocopy (* _in_map[pc].state (tmp));
1559 snprintf (tmp, sizeof(tmp), "OutputMap-%d", pc);
1560 node.add_child_nocopy (* _out_map[pc].state (tmp));
1564 node.add_child_nocopy (_sidechain->state (full));
1567 _plugins[0]->set_insert_id(this->id());
1568 node.add_child_nocopy (_plugins[0]->get_state());
1570 for (Controls::iterator c = controls().begin(); c != controls().end(); ++c) {
1571 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> ((*c).second);
1573 node.add_child_nocopy (ac->get_state());
1581 PluginInsert::set_control_ids (const XMLNode& node, int version)
1583 const XMLNodeList& nlist = node.children();
1584 XMLNodeConstIterator iter;
1585 set<Evoral::Parameter>::const_iterator p;
1587 for (iter = nlist.begin(); iter != nlist.end(); ++iter) {
1588 if ((*iter)->name() == Controllable::xml_node_name) {
1589 const XMLProperty* prop;
1591 uint32_t p = (uint32_t)-1;
1593 if ((prop = (*iter)->property (X_("symbol"))) != 0) {
1594 boost::shared_ptr<LV2Plugin> lv2plugin = boost::dynamic_pointer_cast<LV2Plugin> (_plugins[0]);
1596 p = lv2plugin->port_index(prop->value().c_str());
1600 if (p == (uint32_t)-1 && (prop = (*iter)->property (X_("parameter"))) != 0) {
1601 p = atoi (prop->value());
1604 if (p != (uint32_t)-1) {
1606 /* this may create the new controllable */
1608 boost::shared_ptr<Evoral::Control> c = control (Evoral::Parameter (PluginAutomation, 0, p));
1610 #ifndef NO_PLUGIN_STATE
1614 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> (c);
1616 ac->set_state (**iter, version);
1625 PluginInsert::set_state(const XMLNode& node, int version)
1627 XMLNodeList nlist = node.children();
1628 XMLNodeIterator niter;
1629 XMLPropertyList plist;
1630 const XMLProperty *prop;
1631 ARDOUR::PluginType type;
1633 if ((prop = node.property ("type")) == 0) {
1634 error << _("XML node describing plugin is missing the `type' field") << endmsg;
1638 if (prop->value() == X_("ladspa") || prop->value() == X_("Ladspa")) { /* handle old school sessions */
1639 type = ARDOUR::LADSPA;
1640 } else if (prop->value() == X_("lv2")) {
1642 } else if (prop->value() == X_("windows-vst")) {
1643 type = ARDOUR::Windows_VST;
1644 } else if (prop->value() == X_("lxvst")) {
1645 type = ARDOUR::LXVST;
1646 } else if (prop->value() == X_("audiounit")) {
1647 type = ARDOUR::AudioUnit;
1648 } else if (prop->value() == X_("luaproc")) {
1651 error << string_compose (_("unknown plugin type %1 in plugin insert state"),
1657 prop = node.property ("unique-id");
1660 #ifdef WINDOWS_VST_SUPPORT
1661 /* older sessions contain VST plugins with only an "id" field.
1664 if (type == ARDOUR::Windows_VST) {
1665 prop = node.property ("id");
1669 #ifdef LXVST_SUPPORT
1670 /*There shouldn't be any older sessions with linuxVST support.. but anyway..*/
1672 if (type == ARDOUR::LXVST) {
1673 prop = node.property ("id");
1679 error << _("Plugin has no unique ID field") << endmsg;
1684 boost::shared_ptr<Plugin> plugin = find_plugin (_session, prop->value(), type);
1686 /* treat linux and windows VST plugins equivalent if they have the same uniqueID
1687 * allow to move sessions windows <> linux */
1688 #ifdef LXVST_SUPPORT
1689 if (plugin == 0 && type == ARDOUR::Windows_VST) {
1690 type = ARDOUR::LXVST;
1691 plugin = find_plugin (_session, prop->value(), type);
1695 #ifdef WINDOWS_VST_SUPPORT
1696 if (plugin == 0 && type == ARDOUR::LXVST) {
1697 type = ARDOUR::Windows_VST;
1698 plugin = find_plugin (_session, prop->value(), type);
1703 error << string_compose(
1704 _("Found a reference to a plugin (\"%1\") that is unknown.\n"
1705 "Perhaps it was removed or moved since it was last used."),
1711 if (type == ARDOUR::Lua) {
1712 XMLNode *ls = node.child (plugin->state_node_name().c_str());
1713 // we need to load the script to set the name and parameters.
1714 boost::shared_ptr<LuaProc> lp = boost::dynamic_pointer_cast<LuaProc>(plugin);
1716 lp->set_script_from_state (*ls);
1720 // The name of the PluginInsert comes from the plugin, nothing else
1721 _name = plugin->get_info()->name;
1725 // Processor::set_state() will set this, but too late
1726 // for it to be available when setting up plugin
1727 // state. We can't call Processor::set_state() until
1728 // the plugins themselves are created and added.
1732 if (_plugins.empty()) {
1733 /* if we are adding the first plugin, we will need to set
1734 up automatable controls.
1736 add_plugin (plugin);
1737 create_automatable_parameters ();
1738 set_control_ids (node, version);
1741 if ((prop = node.property ("count")) != 0) {
1742 sscanf (prop->value().c_str(), "%u", &count);
1745 if (_plugins.size() != count) {
1746 for (uint32_t n = 1; n < count; ++n) {
1747 add_plugin (plugin_factory (plugin));
1751 Processor::set_state (node, version);
1753 PBD::ID new_id = this->id();
1754 PBD::ID old_id = this->id();
1756 if ((prop = node.property ("id")) != 0) {
1757 old_id = prop->value ();
1760 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1762 /* find the node with the type-specific node name ("lv2", "ladspa", etc)
1763 and set all plugins to the same state.
1766 if ((*niter)->name() == plugin->state_node_name()) {
1768 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1769 /* Plugin state can include external files which are named after the ID.
1771 * If regenerate_xml_or_string_ids() is set, the ID will already have
1772 * been changed, so we need to use the old ID from the XML to load the
1773 * state and then update the ID.
1775 * When copying a plugin-state, route_ui takes care of of updating the ID,
1776 * but we need to call set_insert_id() to clear the cached plugin-state
1777 * and force a change.
1779 if (!regenerate_xml_or_string_ids ()) {
1780 (*i)->set_insert_id (new_id);
1782 (*i)->set_insert_id (old_id);
1785 (*i)->set_state (**niter, version);
1787 if (regenerate_xml_or_string_ids ()) {
1788 (*i)->set_insert_id (new_id);
1796 if (version < 3000) {
1798 /* Only 2.X sessions need a call to set_parameter_state() - in 3.X and above
1799 this is all handled by Automatable
1802 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1803 if ((*niter)->name() == "Redirect") {
1804 /* XXX do we need to tackle placement? i think not (pd; oct 16 2009) */
1805 Processor::set_state (**niter, version);
1810 set_parameter_state_2X (node, version);
1813 if ((prop = node.property (X_("custom"))) != 0) {
1814 _custom_cfg = string_is_affirmative (prop->value());
1817 // TODO load/add sidechain
1819 uint32_t in_maps = 0;
1820 uint32_t out_maps = 0;
1821 XMLNodeList kids = node.children ();
1822 for (XMLNodeIterator i = kids.begin(); i != kids.end(); ++i) {
1823 if ((*i)->name() == X_("ConfiguredOutput")) {
1824 _custom_out = ChanCount(**i);
1826 if (strncmp ((*i)->name ().c_str(), X_("InputMap-"), 9) == 0) {
1827 long pc = atol (&((*i)->name().c_str()[9]));
1828 if (pc >=0 && pc <= get_count()) {
1829 _in_map[pc] = ChanMapping (**i);
1833 if (strncmp ((*i)->name ().c_str(), X_("OutputMap-"), 10) == 0) {
1834 long pc = atol (&((*i)->name().c_str()[10]));
1835 if (pc >=0 && pc <= get_count()) {
1836 _out_map[pc] = ChanMapping (**i);
1840 if ((*i)->name () == Processor::state_node_name) {
1844 _sidechain->set_state (**i, version);
1848 if (in_maps == out_maps && out_maps >0 && out_maps == get_count()) {
1849 _maps_from_state = true;
1852 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1856 (*i)->deactivate ();
1864 PluginInsert::update_id (PBD::ID id)
1867 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1868 (*i)->set_insert_id (id);
1873 PluginInsert::set_state_dir (const std::string& d)
1875 // state() only saves the state of the first plugin
1876 _plugins[0]->set_state_dir (d);
1880 PluginInsert::set_parameter_state_2X (const XMLNode& node, int version)
1882 XMLNodeList nlist = node.children();
1883 XMLNodeIterator niter;
1885 /* look for port automation node */
1887 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1889 if ((*niter)->name() != port_automation_node_name) {
1895 XMLNodeConstIterator iter;
1900 cnodes = (*niter)->children ("port");
1902 for (iter = cnodes.begin(); iter != cnodes.end(); ++iter){
1906 if ((cprop = child->property("number")) != 0) {
1907 port = cprop->value().c_str();
1909 warning << _("PluginInsert: Auto: no ladspa port number") << endmsg;
1913 sscanf (port, "%" PRIu32, &port_id);
1915 if (port_id >= _plugins[0]->parameter_count()) {
1916 warning << _("PluginInsert: Auto: port id out of range") << endmsg;
1920 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(
1921 control(Evoral::Parameter(PluginAutomation, 0, port_id), true));
1923 if (c && c->alist()) {
1924 if (!child->children().empty()) {
1925 c->alist()->set_state (*child->children().front(), version);
1927 /* In some cases 2.X saves lists with min_yval and max_yval
1928 being FLT_MIN and FLT_MAX respectively. This causes problems
1929 in A3 because these min/max values are used to compute
1930 where GUI control points should be drawn. If we see such
1931 values, `correct' them to the min/max of the appropriate
1935 float min_y = c->alist()->get_min_y ();
1936 float max_y = c->alist()->get_max_y ();
1938 ParameterDescriptor desc;
1939 _plugins.front()->get_parameter_descriptor (port_id, desc);
1941 if (min_y == FLT_MIN) {
1945 if (max_y == FLT_MAX) {
1949 c->alist()->set_yrange (min_y, max_y);
1952 error << string_compose (_("PluginInsert: automatable control %1 not found - ignored"), port_id) << endmsg;
1964 PluginInsert::describe_parameter (Evoral::Parameter param)
1966 if (param.type() == PluginAutomation) {
1967 return _plugins[0]->describe_parameter (param);
1968 } else if (param.type() == PluginPropertyAutomation) {
1969 boost::shared_ptr<AutomationControl> c(automation_control(param));
1970 if (c && !c->desc().label.empty()) {
1971 return c->desc().label;
1974 return Automatable::describe_parameter(param);
1978 PluginInsert::signal_latency() const
1980 if (_user_latency) {
1981 return _user_latency;
1984 return _plugins[0]->signal_latency ();
1988 PluginInsert::type ()
1990 return plugin()->get_info()->type;
1993 PluginInsert::PluginControl::PluginControl (PluginInsert* p,
1994 const Evoral::Parameter& param,
1995 const ParameterDescriptor& desc,
1996 boost::shared_ptr<AutomationList> list)
1997 : AutomationControl (p->session(), param, desc, list, p->describe_parameter(param))
2001 alist()->reset_default (desc.normal);
2003 list->set_interpolation(Evoral::ControlList::Discrete);
2008 set_flags(Controllable::Toggle);
2012 /** @param val `user' value */
2014 PluginInsert::PluginControl::set_value (double user_val, PBD::Controllable::GroupControlDisposition group_override)
2017 _set_value (user_val, group_override);
2021 PluginInsert::PluginControl::set_value_unchecked (double user_val)
2023 /* used only by automation playback */
2024 _set_value (user_val, Controllable::NoGroup);
2028 PluginInsert::PluginControl::_set_value (double user_val, PBD::Controllable::GroupControlDisposition group_override)
2030 /* FIXME: probably should be taking out some lock here.. */
2032 for (Plugins::iterator i = _plugin->_plugins.begin(); i != _plugin->_plugins.end(); ++i) {
2033 (*i)->set_parameter (_list->parameter().id(), user_val);
2036 boost::shared_ptr<Plugin> iasp = _plugin->_impulseAnalysisPlugin.lock();
2038 iasp->set_parameter (_list->parameter().id(), user_val);
2041 AutomationControl::set_value (user_val, group_override);
2045 PluginInsert::PluginControl::catch_up_with_external_value (double user_val)
2047 AutomationControl::set_value (user_val, Controllable::NoGroup);
2051 PluginInsert::PluginControl::get_state ()
2055 XMLNode& node (AutomationControl::get_state());
2056 ss << parameter().id();
2057 node.add_property (X_("parameter"), ss.str());
2059 boost::shared_ptr<LV2Plugin> lv2plugin = boost::dynamic_pointer_cast<LV2Plugin> (_plugin->_plugins[0]);
2061 node.add_property (X_("symbol"), lv2plugin->port_symbol (parameter().id()));
2068 /** @return `user' val */
2070 PluginInsert::PluginControl::get_value () const
2072 boost::shared_ptr<Plugin> plugin = _plugin->plugin (0);
2078 return plugin->get_parameter (_list->parameter().id());
2081 PluginInsert::PluginPropertyControl::PluginPropertyControl (PluginInsert* p,
2082 const Evoral::Parameter& param,
2083 const ParameterDescriptor& desc,
2084 boost::shared_ptr<AutomationList> list)
2085 : AutomationControl (p->session(), param, desc, list)
2089 alist()->set_yrange (desc.lower, desc.upper);
2090 alist()->reset_default (desc.normal);
2094 set_flags(Controllable::Toggle);
2099 PluginInsert::PluginPropertyControl::set_value (double user_val, PBD::Controllable::GroupControlDisposition /* group_override*/)
2102 set_value_unchecked (user_val);
2107 PluginInsert::PluginPropertyControl::set_value_unchecked (double user_val)
2109 /* Old numeric set_value(), coerce to appropriate datatype if possible.
2110 This is lossy, but better than nothing until Ardour's automation system
2111 can handle various datatypes all the way down. */
2112 const Variant value(_desc.datatype, user_val);
2113 if (value.type() == Variant::NOTHING) {
2114 error << "set_value(double) called for non-numeric property" << endmsg;
2118 for (Plugins::iterator i = _plugin->_plugins.begin(); i != _plugin->_plugins.end(); ++i) {
2119 (*i)->set_property(_list->parameter().id(), value);
2123 AutomationControl::set_value (user_val, Controllable::NoGroup);
2127 PluginInsert::PluginPropertyControl::get_state ()
2131 XMLNode& node (AutomationControl::get_state());
2132 ss << parameter().id();
2133 node.add_property (X_("property"), ss.str());
2134 node.remove_property (X_("value"));
2140 PluginInsert::PluginPropertyControl::get_value () const
2142 return _value.to_double();
2145 boost::shared_ptr<Plugin>
2146 PluginInsert::get_impulse_analysis_plugin()
2148 boost::shared_ptr<Plugin> ret;
2149 if (_impulseAnalysisPlugin.expired()) {
2150 ret = plugin_factory(_plugins[0]);
2151 ret->configure_io (internal_input_streams (), internal_output_streams ());
2152 _impulseAnalysisPlugin = ret;
2154 ret = _impulseAnalysisPlugin.lock();
2161 PluginInsert::collect_signal_for_analysis (framecnt_t nframes)
2163 // called from outside the audio thread, so this should be safe
2164 // only do audio as analysis is (currently) only for audio plugins
2165 _signal_analysis_inputs.ensure_buffers( DataType::AUDIO, internal_input_streams().n_audio(), nframes);
2166 _signal_analysis_outputs.ensure_buffers( DataType::AUDIO, internal_output_streams().n_audio(), nframes);
2168 _signal_analysis_collected_nframes = 0;
2169 _signal_analysis_collect_nframes_max = nframes;
2172 /** Add a plugin to our list */
2174 PluginInsert::add_plugin (boost::shared_ptr<Plugin> plugin)
2176 plugin->set_insert_id (this->id());
2178 if (_plugins.empty()) {
2179 /* first (and probably only) plugin instance - connect to relevant signals
2182 plugin->ParameterChangedExternally.connect_same_thread (*this, boost::bind (&PluginInsert::parameter_changed_externally, this, _1, _2));
2183 plugin->StartTouch.connect_same_thread (*this, boost::bind (&PluginInsert::start_touch, this, _1));
2184 plugin->EndTouch.connect_same_thread (*this, boost::bind (&PluginInsert::end_touch, this, _1));
2187 _plugins.push_back (plugin);
2191 PluginInsert::realtime_handle_transport_stopped ()
2193 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2194 (*i)->realtime_handle_transport_stopped ();
2199 PluginInsert::realtime_locate ()
2201 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2202 (*i)->realtime_locate ();
2207 PluginInsert::monitoring_changed ()
2209 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2210 (*i)->monitoring_changed ();
2215 PluginInsert::start_touch (uint32_t param_id)
2217 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id));
2219 ac->start_touch (session().audible_frame());
2224 PluginInsert::end_touch (uint32_t param_id)
2226 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id));
2228 ac->stop_touch (true, session().audible_frame());
2232 std::ostream& operator<<(std::ostream& o, const ARDOUR::PluginInsert::Match& m)
2235 case PluginInsert::Impossible: o << "Impossible"; break;
2236 case PluginInsert::Delegate: o << "Delegate"; break;
2237 case PluginInsert::NoInputs: o << "NoInputs"; break;
2238 case PluginInsert::ExactMatch: o << "ExactMatch"; break;
2239 case PluginInsert::Replicate: o << "Replicate"; break;
2240 case PluginInsert::Split: o << "Split"; break;
2241 case PluginInsert::Hide: o << "Hide"; break;
2243 o << " cnt: " << m.plugins
2244 << (m.strict_io ? " strict-io" : "")
2245 << (m.custom_cfg ? " custom-cfg" : "");
2246 if (m.method == PluginInsert::Hide) {
2247 o << " hide: " << m.hide;