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 ();
82 const ChanCount& sc (sidechain_input_pins ());
83 if (sc.n_total () > 0) {
84 add_sidechain (sc.n_audio ());
89 PluginInsert::~PluginInsert ()
94 PluginInsert::set_strict_io (bool b)
96 bool changed = _strict_io != b;
99 PluginConfigChanged (); /* EMIT SIGNAL */
104 PluginInsert::set_count (uint32_t num)
106 bool require_state = !_plugins.empty();
108 /* this is a bad idea.... we shouldn't do this while active.
109 only a route holding their redirect_lock should be calling this
114 } else if (num > _plugins.size()) {
115 uint32_t diff = num - _plugins.size();
117 for (uint32_t n = 0; n < diff; ++n) {
118 boost::shared_ptr<Plugin> p = plugin_factory (_plugins[0]);
125 /* XXX do something */
128 PluginConfigChanged (); /* EMIT SIGNAL */
130 } else if (num < _plugins.size()) {
131 uint32_t diff = _plugins.size() - num;
132 for (uint32_t n= 0; n < diff; ++n) {
135 PluginConfigChanged (); /* EMIT SIGNAL */
143 PluginInsert::set_outputs (const ChanCount& c)
145 bool changed = (_custom_out != c) && _custom_cfg;
148 PluginConfigChanged (); /* EMIT SIGNAL */
153 PluginInsert::set_custom_cfg (bool b)
155 bool changed = _custom_cfg != b;
158 PluginConfigChanged (); /* EMIT SIGNAL */
163 PluginInsert::add_sidechain (uint32_t n_audio)
165 // caller must hold process lock
169 // TODO add route-name, plugin name and shorten.. (plugin name can be long and conatain odd chars)
170 std::string n = "Sidechain " + id().to_s(); /// XXX
171 SideChain *sc = new SideChain (_session, n);
172 _sidechain = boost::shared_ptr<SideChain> (sc);
173 _sidechain->activate ();
174 for (uint32_t n = 0; n < n_audio; ++n) {
175 _sidechain->input()->add_port ("", owner()); // add a port, don't connect.
177 PluginConfigChanged (); /* EMIT SIGNAL */
182 PluginInsert::del_sidechain ()
188 PluginConfigChanged (); /* EMIT SIGNAL */
193 PluginInsert::control_list_automation_state_changed (Evoral::Parameter which, AutoState s)
195 if (which.type() != PluginAutomation)
198 boost::shared_ptr<AutomationControl> c
199 = boost::dynamic_pointer_cast<AutomationControl>(control (which));
202 _plugins[0]->set_parameter (which.id(), c->list()->eval (_session.transport_frame()));
207 PluginInsert::output_streams() const
209 assert (_configured);
210 return _configured_out;
214 PluginInsert::input_streams() const
216 assert (_configured);
217 return _configured_in;
221 PluginInsert::internal_streams() const
223 assert (_configured);
224 return _configured_internal;
228 PluginInsert::internal_output_streams() const
230 assert (!_plugins.empty());
232 PluginInfoPtr info = _plugins.front()->get_info();
234 if (info->reconfigurable_io()) {
235 ChanCount out = _plugins.front()->output_streams ();
236 // DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, reconfigur(able) output streams = %1\n", out));
239 ChanCount out = info->n_outputs;
240 // DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, static output streams = %1 for %2 plugins\n", out, _plugins.size()));
241 out.set_audio (out.n_audio() * _plugins.size());
242 out.set_midi (out.n_midi() * _plugins.size());
248 PluginInsert::internal_input_streams() const
250 assert (!_plugins.empty());
254 PluginInfoPtr info = _plugins.front()->get_info();
256 if (info->reconfigurable_io()) {
257 assert (_plugins.size() == 1);
258 in = _plugins.front()->input_streams();
263 DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, input streams = %1, match using %2\n", in, _match.method));
265 if (_match.method == Split) {
267 /* we are splitting 1 processor input to multiple plugin inputs,
268 so we have a maximum of 1 stream of each type.
270 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
271 if (in.get (*t) > 1) {
277 } else if (_match.method == Hide) {
279 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
280 in.set (*t, in.get (*t) - _match.hide.get (*t));
286 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
287 in.set (*t, in.get (*t) * _plugins.size ());
295 PluginInsert::natural_output_streams() const
298 if (is_channelstrip ()) {
299 return _configured_out;
302 return _plugins[0]->get_info()->n_outputs;
306 PluginInsert::natural_input_streams() const
309 if (is_channelstrip ()) {
310 return _configured_in;
313 return _plugins[0]->get_info()->n_inputs;
317 PluginInsert::sidechain_input_pins() const
319 return _cached_sidechain_pins;
323 PluginInsert::has_no_inputs() const
325 return _plugins[0]->get_info()->n_inputs == ChanCount::ZERO;
329 PluginInsert::has_no_audio_inputs() const
331 return _plugins[0]->get_info()->n_inputs.n_audio() == 0;
335 PluginInsert::is_midi_instrument() const
337 /* XXX more finesse is possible here. VST plugins have a
338 a specific "instrument" flag, for example.
340 PluginInfoPtr pi = _plugins[0]->get_info();
342 return pi->n_inputs.n_midi() != 0 &&
343 pi->n_outputs.n_audio() > 0;
347 PluginInsert::create_automatable_parameters ()
349 assert (!_plugins.empty());
351 set<Evoral::Parameter> a = _plugins.front()->automatable ();
353 for (set<Evoral::Parameter>::iterator i = a.begin(); i != a.end(); ++i) {
354 if (i->type() == PluginAutomation) {
356 Evoral::Parameter param(*i);
358 ParameterDescriptor desc;
359 _plugins.front()->get_parameter_descriptor(i->id(), desc);
361 can_automate (param);
362 boost::shared_ptr<AutomationList> list(new AutomationList(param, desc));
363 boost::shared_ptr<AutomationControl> c (new PluginControl(this, param, desc, list));
365 _plugins.front()->set_automation_control (i->id(), c);
366 } else if (i->type() == PluginPropertyAutomation) {
367 Evoral::Parameter param(*i);
368 const ParameterDescriptor& desc = _plugins.front()->get_property_descriptor(param.id());
369 if (desc.datatype != Variant::NOTHING) {
370 boost::shared_ptr<AutomationList> list;
371 if (Variant::type_is_numeric(desc.datatype)) {
372 list = boost::shared_ptr<AutomationList>(new AutomationList(param, desc));
374 add_control (boost::shared_ptr<AutomationControl> (new PluginPropertyControl(this, param, desc, list)));
379 /** Called when something outside of this host has modified a plugin
380 * parameter. Responsible for propagating the change to two places:
382 * 1) anything listening to the Control itself
383 * 2) any replicated plugins that make up this PluginInsert.
385 * The PluginInsert is connected to the ParameterChangedExternally signal for
386 * the first (primary) plugin, and here broadcasts that change to any others.
388 * XXX We should probably drop this whole replication idea (Paul, October 2015)
389 * since it isn't used by sensible plugin APIs (AU, LV2).
392 PluginInsert::parameter_changed_externally (uint32_t which, float val)
394 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, which));
396 /* First propagation: alter the underlying value of the control,
397 * without telling the plugin(s) that own/use it to set it.
404 boost::shared_ptr<PluginControl> pc = boost::dynamic_pointer_cast<PluginControl> (ac);
407 pc->catch_up_with_external_value (val);
410 /* Second propagation: tell all plugins except the first to
411 update the value of this parameter. For sane plugin APIs,
412 there are no other plugins, so this is a no-op in those
416 Plugins::iterator i = _plugins.begin();
418 /* don't set the first plugin, just all the slaves */
420 if (i != _plugins.end()) {
422 for (; i != _plugins.end(); ++i) {
423 (*i)->set_parameter (which, val);
429 PluginInsert::set_block_size (pframes_t nframes)
432 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
433 if ((*i)->set_block_size (nframes) != 0) {
441 PluginInsert::activate ()
443 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
447 Processor::activate ();
451 PluginInsert::deactivate ()
453 Processor::deactivate ();
455 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
461 PluginInsert::flush ()
463 for (vector<boost::shared_ptr<Plugin> >::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
469 PluginInsert::connect_and_run (BufferSet& bufs, pframes_t nframes, framecnt_t offset, bool with_auto, framepos_t now)
471 // TODO: atomically copy maps & _no_inplace
472 PinMappings in_map (_in_map);
473 PinMappings out_map (_out_map);
474 if (_mapping_changed) {
475 _no_inplace = check_inplace ();
476 _mapping_changed = false;
479 if (_match.method == Split && !_no_inplace) {
480 // TODO: also use this optimization if one source-buffer
481 // feeds _all_ *connected* inputs.
482 // currently this is *first* buffer to all only --
483 // see PluginInsert::check_inplace
484 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
485 if (_configured_internal.get (*t) == 0) {
489 uint32_t first_idx = in_map[0].get (*t, 0, &valid);
490 assert (valid && first_idx == 0); // check_inplace ensures this
491 /* copy the first stream's buffer contents to the others */
492 for (uint32_t i = 1; i < natural_input_streams ().get (*t); ++i) {
493 uint32_t idx = in_map[0].get (*t, i, &valid);
496 bufs.get (*t, i).read_from (bufs.get (*t, first_idx), nframes, offset, offset);
500 /* the copy operation produces a linear monotonic input map */
501 in_map[0] = ChanMapping (natural_input_streams ());
504 bufs.set_count(ChanCount::max(bufs.count(), _configured_internal));
505 bufs.set_count(ChanCount::max(bufs.count(), _configured_out));
511 for (Controls::iterator li = controls().begin(); li != controls().end(); ++li, ++n) {
513 boost::shared_ptr<AutomationControl> c
514 = boost::dynamic_pointer_cast<AutomationControl>(li->second);
516 if (c->list() && c->automation_playback()) {
519 const float val = c->list()->rt_safe_eval (now, valid);
522 /* This is the ONLY place where we are
524 * AutomationControl::set_value_unchecked(). We
525 * know that the control is in
526 * automation playback mode, so no
527 * check on writable() is required
528 * (which must be done in AutomationControl::set_value()
531 c->set_value_unchecked(val);
538 /* Calculate if, and how many frames we need to collect for analysis */
539 framecnt_t collect_signal_nframes = (_signal_analysis_collect_nframes_max -
540 _signal_analysis_collected_nframes);
541 if (nframes < collect_signal_nframes) { // we might not get all frames now
542 collect_signal_nframes = nframes;
545 if (collect_signal_nframes > 0) {
547 //std::cerr << "collect input, bufs " << bufs.count().n_audio() << " count, " << bufs.available().n_audio() << " available" << std::endl;
548 //std::cerr << " streams " << internal_input_streams().n_audio() << std::endl;
549 //std::cerr << "filling buffer with " << collect_signal_nframes << " frames at " << _signal_analysis_collected_nframes << std::endl;
551 _signal_analysis_inputs.set_count(internal_input_streams());
553 for (uint32_t i = 0; i < internal_input_streams().n_audio(); ++i) {
554 _signal_analysis_inputs.get_audio(i).read_from(
556 collect_signal_nframes,
557 _signal_analysis_collected_nframes); // offset is for target buffer
562 if (is_channelstrip ()) {
563 if (_configured_in.n_audio() > 0) {
564 ChanMapping mb_in_map (ChanCount::min (_configured_in, ChanCount (DataType::AUDIO, 2)));
565 ChanMapping mb_out_map (ChanCount::min (_configured_out, ChanCount (DataType::AUDIO, 2)));
567 _plugins.front()->connect_and_run (bufs, mb_in_map, mb_out_map, nframes, offset);
569 for (uint32_t out = _configured_in.n_audio (); out < bufs.count().get (DataType::AUDIO); ++out) {
570 bufs.get (DataType::AUDIO, out).silence (nframes, offset);
576 BufferSet& inplace_bufs = _session.get_noinplace_buffers();
577 ARDOUR::ChanMapping used_outputs;
580 // TODO optimize this flow. prepare during configure_io()
581 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
583 ARDOUR::ChanMapping i_in_map (natural_input_streams());
584 ARDOUR::ChanMapping i_out_map;
585 ARDOUR::ChanCount mapped;
586 ARDOUR::ChanCount backmap;
588 // map inputs sequentially
589 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
590 for (uint32_t in = 0; in < natural_input_streams().get (*t); ++in) {
592 uint32_t in_idx = in_map[pc].get (*t, in, &valid);
593 uint32_t m = mapped.get (*t);
595 inplace_bufs.get (*t, m).read_from (bufs.get (*t, in_idx), nframes, offset, offset);
597 inplace_bufs.get (*t, m).silence (nframes, offset);
599 mapped.set (*t, m + 1);
603 // TODO use map_offset_to() instead ??
607 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
608 for (uint32_t out = 0; out < natural_output_streams().get (*t); ++out) {
609 uint32_t m = mapped.get (*t);
610 inplace_bufs.get (*t, m).silence (nframes, offset);
611 i_out_map.set (*t, out, m);
612 mapped.set (*t, m + 1);
616 if ((*i)->connect_and_run(inplace_bufs, i_in_map, i_out_map, nframes, offset)) {
621 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
622 for (uint32_t out = 0; out < natural_output_streams().get (*t); ++out) {
623 uint32_t m = backmap.get (*t);
625 uint32_t out_idx = out_map[pc].get (*t, out, &valid);
627 bufs.get (*t, out_idx).read_from (inplace_bufs.get (*t, m), nframes, offset, offset);
628 used_outputs.set (*t, out_idx, 1); // mark as used
630 backmap.set (*t, m + 1);
634 /* all instances have completed, now clear outputs that have not been written to.
635 * (except midi bypass)
637 if (has_midi_bypass ()) {
638 used_outputs.set (DataType::MIDI, 0, 1); // Midi bypass.
640 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
641 for (uint32_t out = 0; out < bufs.count().get (*t); ++out) {
643 used_outputs.get (*t, out, &valid);
644 if (valid) { continue; }
645 bufs.get (*t, out).silence (nframes, offset);
651 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
652 if ((*i)->connect_and_run(bufs, in_map[pc], out_map[pc], nframes, offset)) {
657 // TODO optimize: store "unconnected" in a fixed set.
658 // it only changes on reconfiguration.
659 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
660 for (uint32_t out = 0; out < bufs.count().get (*t); ++out) {
662 if (*t == DataType::MIDI && out == 0 && has_midi_bypass ()) {
663 mapped = true; // in-place Midi bypass
665 for (uint32_t pc = 0; pc < get_count() && !mapped; ++pc) {
666 for (uint32_t o = 0; o < natural_output_streams().get (*t); ++o) {
668 uint32_t idx = out_map[pc].get (*t, o, &valid);
669 if (valid && idx == out) {
676 bufs.get (*t, out).silence (nframes, offset);
682 if (collect_signal_nframes > 0) {
684 //std::cerr << " output, bufs " << bufs.count().n_audio() << " count, " << bufs.available().n_audio() << " available" << std::endl;
685 //std::cerr << " streams " << internal_output_streams().n_audio() << std::endl;
687 _signal_analysis_outputs.set_count(internal_output_streams());
689 for (uint32_t i = 0; i < internal_output_streams().n_audio(); ++i) {
690 _signal_analysis_outputs.get_audio(i).read_from(
692 collect_signal_nframes,
693 _signal_analysis_collected_nframes); // offset is for target buffer
696 _signal_analysis_collected_nframes += collect_signal_nframes;
697 assert(_signal_analysis_collected_nframes <= _signal_analysis_collect_nframes_max);
699 if (_signal_analysis_collected_nframes == _signal_analysis_collect_nframes_max) {
700 _signal_analysis_collect_nframes_max = 0;
701 _signal_analysis_collected_nframes = 0;
703 AnalysisDataGathered(&_signal_analysis_inputs,
704 &_signal_analysis_outputs);
710 PluginInsert::silence (framecnt_t nframes)
716 ChanMapping in_map (natural_input_streams ());
717 ChanMapping out_map (natural_output_streams ());
719 // TODO run sidechain (delaylines)
720 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
721 (*i)->connect_and_run (_session.get_scratch_buffers ((*i)->get_info()->n_inputs, true), in_map, out_map, nframes, 0);
726 PluginInsert::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool)
728 if (_pending_active) {
729 /* run as normal if we are active or moving from inactive to active */
732 // collect sidechain input for complete cycle (!)
733 // TODO we need delaylines here for latency compensation
734 _sidechain->run (bufs, start_frame, end_frame, nframes, true);
737 if (_session.transport_rolling() || _session.bounce_processing()) {
738 automation_run (bufs, start_frame, nframes);
740 connect_and_run (bufs, nframes, 0, false);
744 // TODO use mapping in bypassed mode ?!
745 // -> do we bypass the processor or the plugin
747 // TODO include sidechain??
749 uint32_t in = input_streams ().n_audio ();
750 uint32_t out = output_streams().n_audio ();
752 if (has_no_audio_inputs() || in == 0) {
754 /* silence all (audio) outputs. Should really declick
755 * at the transitions of "active"
758 for (uint32_t n = 0; n < out; ++n) {
759 bufs.get_audio (n).silence (nframes);
762 } else if (out > in) {
764 /* not active, but something has make up for any channel count increase
765 * for now , simply replicate last buffer
767 for (uint32_t n = in; n < out; ++n) {
768 bufs.get_audio(n).read_from(bufs.get_audio(in - 1), nframes);
772 bufs.count().set_audio (out);
775 _active = _pending_active;
777 /* we have no idea whether the plugin generated silence or not, so mark
778 * all buffers appropriately.
783 PluginInsert::automation_run (BufferSet& bufs, framepos_t start, pframes_t nframes)
785 Evoral::ControlEvent next_event (0, 0.0f);
786 framepos_t now = start;
787 framepos_t end = now + nframes;
788 framecnt_t offset = 0;
790 Glib::Threads::Mutex::Lock lm (control_lock(), Glib::Threads::TRY_LOCK);
793 connect_and_run (bufs, nframes, offset, false);
797 if (!find_next_event (now, end, next_event) || _plugins.front()->requires_fixed_sized_buffers()) {
799 /* no events have a time within the relevant range */
801 connect_and_run (bufs, nframes, offset, true, now);
807 framecnt_t cnt = min (((framecnt_t) ceil (next_event.when) - now), (framecnt_t) nframes);
809 connect_and_run (bufs, cnt, offset, true, now);
815 if (!find_next_event (now, end, next_event)) {
820 /* cleanup anything that is left to do */
823 connect_and_run (bufs, nframes, offset, true, now);
828 PluginInsert::default_parameter_value (const Evoral::Parameter& param)
830 if (param.type() != PluginAutomation)
833 if (_plugins.empty()) {
834 fatal << _("programming error: ") << X_("PluginInsert::default_parameter_value() called with no plugin")
836 abort(); /*NOTREACHED*/
839 return _plugins[0]->default_value (param.id());
844 PluginInsert::can_reset_all_parameters ()
848 for (uint32_t par = 0; par < _plugins[0]->parameter_count(); ++par) {
850 const uint32_t cid = _plugins[0]->nth_parameter (par, ok);
852 if (!ok || !_plugins[0]->parameter_is_input(cid)) {
856 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, cid));
862 if (ac->automation_state() & Play) {
867 return all && (params > 0);
871 PluginInsert::reset_parameters_to_default ()
875 for (uint32_t par = 0; par < _plugins[0]->parameter_count(); ++par) {
877 const uint32_t cid = _plugins[0]->nth_parameter (par, ok);
879 if (!ok || !_plugins[0]->parameter_is_input(cid)) {
883 const float dflt = _plugins[0]->default_value (cid);
884 const float curr = _plugins[0]->get_parameter (cid);
890 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, cid));
895 if (ac->automation_state() & Play) {
900 ac->set_value (dflt, Controllable::NoGroup);
905 boost::shared_ptr<Plugin>
906 PluginInsert::plugin_factory (boost::shared_ptr<Plugin> other)
908 boost::shared_ptr<LadspaPlugin> lp;
909 boost::shared_ptr<LuaProc> lua;
911 boost::shared_ptr<LV2Plugin> lv2p;
913 #ifdef WINDOWS_VST_SUPPORT
914 boost::shared_ptr<WindowsVSTPlugin> vp;
917 boost::shared_ptr<LXVSTPlugin> lxvp;
919 #ifdef AUDIOUNIT_SUPPORT
920 boost::shared_ptr<AUPlugin> ap;
923 if ((lp = boost::dynamic_pointer_cast<LadspaPlugin> (other)) != 0) {
924 return boost::shared_ptr<Plugin> (new LadspaPlugin (*lp));
925 } else if ((lua = boost::dynamic_pointer_cast<LuaProc> (other)) != 0) {
926 return boost::shared_ptr<Plugin> (new LuaProc (*lua));
928 } else if ((lv2p = boost::dynamic_pointer_cast<LV2Plugin> (other)) != 0) {
929 return boost::shared_ptr<Plugin> (new LV2Plugin (*lv2p));
931 #ifdef WINDOWS_VST_SUPPORT
932 } else if ((vp = boost::dynamic_pointer_cast<WindowsVSTPlugin> (other)) != 0) {
933 return boost::shared_ptr<Plugin> (new WindowsVSTPlugin (*vp));
936 } else if ((lxvp = boost::dynamic_pointer_cast<LXVSTPlugin> (other)) != 0) {
937 return boost::shared_ptr<Plugin> (new LXVSTPlugin (*lxvp));
939 #ifdef AUDIOUNIT_SUPPORT
940 } else if ((ap = boost::dynamic_pointer_cast<AUPlugin> (other)) != 0) {
941 return boost::shared_ptr<Plugin> (new AUPlugin (*ap));
945 fatal << string_compose (_("programming error: %1"),
946 X_("unknown plugin type in PluginInsert::plugin_factory"))
948 abort(); /*NOTREACHED*/
949 return boost::shared_ptr<Plugin> ((Plugin*) 0);
953 PluginInsert::set_input_map (uint32_t num, ChanMapping m) {
954 if (num < _in_map.size()) {
955 bool changed = _in_map[num] != m;
959 PluginMapChanged (); /* EMIT SIGNAL */
960 _mapping_changed = true;
966 PluginInsert::set_output_map (uint32_t num, ChanMapping m) {
967 if (num < _out_map.size()) {
968 bool changed = _out_map[num] != m;
972 PluginMapChanged (); /* EMIT SIGNAL */
973 _mapping_changed = true;
979 PluginInsert::input_map () const
983 for (PinMappings::const_iterator i = _in_map.begin (); i != _in_map.end (); ++i, ++pc) {
984 ChanMapping m (i->second);
985 const ChanMapping::Mappings& mp ((*i).second.mappings());
986 for (ChanMapping::Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
987 for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
988 rv.set (tm->first, i->first + pc * natural_input_streams().get(tm->first), i->second);
996 PluginInsert::output_map () const
1000 for (PinMappings::const_iterator i = _out_map.begin (); i != _out_map.end (); ++i, ++pc) {
1001 ChanMapping m (i->second);
1002 const ChanMapping::Mappings& mp ((*i).second.mappings());
1003 for (ChanMapping::Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
1004 for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
1005 rv.set (tm->first, i->first + pc * natural_output_streams().get(tm->first), i->second);
1009 if (has_midi_bypass ()) {
1010 rv.set (DataType::MIDI, 0, 0);
1017 PluginInsert::has_midi_bypass () const
1019 if (_configured_in.n_midi () == 1 && _configured_out.n_midi () == 1
1020 && natural_output_streams ().n_midi () == 0) {
1027 PluginInsert::has_midi_thru () const
1029 if (_configured_in.n_midi () == 1 && _configured_out.n_midi () == 1
1030 && natural_input_streams ().n_midi () == 0 && natural_output_streams ().n_midi () == 0) {
1038 PluginInsert::is_channelstrip () const {
1039 return _plugins.front()->is_channelstrip();
1044 PluginInsert::check_inplace ()
1046 bool inplace_ok = !_plugins.front()->inplace_broken ();
1048 if (_match.method == Split && inplace_ok) {
1049 assert (get_count() == 1);
1050 assert (_in_map.size () == 1);
1051 if (!_out_map[0].is_monotonic ()) {
1054 if (_configured_internal != _configured_in) {
1055 /* no sidechain -- TODO we could allow this with
1056 * some more logic in PluginInsert::connect_and_run().
1058 * PluginInsert::reset_map() already maps it.
1063 for (DataType::iterator t = DataType::begin(); t != DataType::end() && inplace_ok; ++t) {
1064 if (_configured_internal.get (*t) == 0) {
1068 uint32_t first_idx = _in_map[0].get (*t, 0, &valid);
1069 if (!valid || first_idx != 0) {
1070 // so far only allow to copy the *first* stream's buffer to others
1073 for (uint32_t i = 1; i < natural_input_streams ().get (*t); ++i) {
1074 uint32_t idx = _in_map[0].get (*t, i, &valid);
1075 if (valid && idx != first_idx) {
1084 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: In Place Split Map\n", name()));
1089 for (uint32_t pc = 0; pc < get_count() && inplace_ok ; ++pc) {
1090 if (!_in_map[pc].is_monotonic ()) {
1093 if (!_out_map[pc].is_monotonic ()) {
1097 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: %2\n", name(), inplace_ok ? "In-Place" : "No Inplace Processing"));
1098 return !inplace_ok; // no-inplace
1102 PluginInsert::sanitize_maps ()
1104 bool changed = false;
1105 /* strip dead wood */
1106 PinMappings new_ins;
1107 PinMappings new_outs;
1108 for (uint32_t pc = 0; pc < get_count(); ++pc) {
1110 ChanMapping new_out;
1111 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1112 for (uint32_t i = 0; i < natural_input_streams().get (*t); ++i) {
1114 uint32_t idx = _in_map[pc].get (*t, i, &valid);
1115 if (valid && idx < _configured_internal.get (*t)) {
1116 new_in.set (*t, i, idx);
1119 for (uint32_t o = 0; o < natural_output_streams().get (*t); ++o) {
1121 uint32_t idx = _out_map[pc].get (*t, o, &valid);
1122 if (valid && idx < _configured_out.get (*t)) {
1123 new_out.set (*t, o, idx);
1127 if (_in_map[pc] != new_in || _out_map[pc] != new_out) {
1130 new_ins[pc] = new_in;
1131 new_outs[pc] = new_out;
1133 /* prevent dup output assignments */
1134 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1135 for (uint32_t o = 0; o < _configured_out.get (*t); ++o) {
1136 bool mapped = false;
1137 for (uint32_t pc = 0; pc < get_count(); ++pc) {
1139 uint32_t idx = new_outs[pc].get_src (*t, o, &valid);
1140 if (valid && mapped) {
1141 new_outs[pc].unset (*t, idx);
1149 if (_in_map != new_ins || _out_map != new_outs) {
1153 _out_map = new_outs;
1159 PluginInsert::reset_map (bool emit)
1162 const PinMappings old_in (_in_map);
1163 const PinMappings old_out (_out_map);
1167 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
1168 ChanCount ns_inputs = natural_input_streams() - sidechain_input_pins ();
1169 if (_match.method == Split) {
1170 _in_map[pc] = ChanMapping ();
1171 /* connect no sidechain sinks in round-robin fashion */
1172 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1173 const uint32_t cend = _configured_in.get (*t);
1174 if (cend == 0) { continue; }
1176 for (uint32_t in = 0; in < ns_inputs.get (*t); ++in) {
1177 _in_map[pc].set (*t, in, c);
1182 _in_map[pc] = ChanMapping (ChanCount::min (ns_inputs, _configured_in));
1184 _out_map[pc] = ChanMapping (ChanCount::min (natural_output_streams(), _configured_out));
1186 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1187 const uint32_t nis = natural_input_streams ().get(*t);
1188 const uint32_t stride = nis - sidechain_input_pins().get (*t);
1189 _in_map[pc].offset_to(*t, stride * pc);
1190 _out_map[pc].offset_to(*t, pc * natural_output_streams().get(*t));
1192 // connect side-chains
1193 const uint32_t sc_start = _configured_in.get (*t);
1194 const uint32_t sc_len = _configured_internal.get (*t) - sc_start;
1195 if (sc_len == 0) { continue; }
1197 for (uint32_t in = ns_inputs.get (*t); in < nis; ++in) {
1198 _in_map[pc].set (*t, in, sc_start + c);
1199 c = (c + 1) % sc_len;
1204 if (old_in == _in_map && old_out == _out_map) {
1208 PluginMapChanged (); /* EMIT SIGNAL */
1209 _mapping_changed = true;
1215 PluginInsert::configure_io (ChanCount in, ChanCount out)
1217 Match old_match = _match;
1219 ChanCount old_internal;
1223 old_in = _configured_in;
1224 old_internal = _configured_internal;
1225 old_out = _configured_out;
1228 _configured_in = in;
1229 _configured_internal = in;
1230 _configured_out = out;
1233 /* TODO hide midi-bypass, and custom outs. Best /fake/ "out" here.
1234 * (currently _sidechain->configure_io always succeeds
1235 * since Processor::configure_io() succeeds)
1237 if (!_sidechain->configure_io (in, out)) {
1238 DEBUG_TRACE (DEBUG::ChanMapping, "Sidechain configuration failed\n");
1241 _configured_internal += _sidechain->input()->n_ports();
1244 /* get plugin configuration */
1245 _match = private_can_support_io_configuration (in, out);
1247 if (DEBUG_ENABLED(DEBUG::ChanMapping)) {
1249 DEBUG_STR_APPEND(a, string_compose ("Match '%1': ", name()));
1250 DEBUG_STR_APPEND(a, _match);
1251 DEBUG_TRACE (DEBUG::ChanMapping, DEBUG_STR(a).str());
1255 /* set the matching method and number of plugins that we will use to meet this configuration */
1256 if (set_count (_match.plugins) == false) {
1257 PluginIoReConfigure (); /* EMIT SIGNAL */
1258 _configured = false;
1262 /* configure plugins */
1263 switch (_match.method) {
1266 if (_plugins.front()->configure_io (natural_input_streams(), out) == false) {
1267 PluginIoReConfigure (); /* EMIT SIGNAL */
1268 _configured = false;
1276 bool const r = _plugins.front()->can_support_io_configuration (in, dout, &useins);
1278 assert (_match.strict_io || dout.n_audio() == out.n_audio()); // sans midi bypass
1279 if (useins.n_audio() == 0) {
1282 if (_plugins.front()->configure_io (useins, dout) == false) {
1283 PluginIoReConfigure (); /* EMIT SIGNAL */
1284 _configured = false;
1290 if (_plugins.front()->configure_io (in, out) == false) {
1291 PluginIoReConfigure (); /* EMIT SIGNAL */
1292 _configured = false;
1298 bool mapping_changed = false;
1299 if (old_in == in && old_out == out
1301 && old_match.method == _match.method
1302 && _in_map.size() == _out_map.size()
1303 && _in_map.size() == get_count ()
1305 /* If the configuration has not changed, keep the mapping */
1306 if (old_internal != _configured_internal) {
1307 mapping_changed = sanitize_maps ();
1309 } else if (_match.custom_cfg && _configured) {
1310 mapping_changed = sanitize_maps ();
1313 if (is_channelstrip ()) { _maps_from_state = false; }
1315 if (_maps_from_state) {
1316 _maps_from_state = false;
1317 mapping_changed = true;
1320 /* generate a new mapping */
1321 mapping_changed = reset_map (false);
1325 if (mapping_changed) {
1326 PluginMapChanged (); /* EMIT SIGNAL */
1329 if (DEBUG_ENABLED(DEBUG::ChanMapping)) {
1332 DEBUG_STR_APPEND(a, "\n--------<<--------\n");
1333 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
1335 DEBUG_STR_APPEND(a, "----><----\n");
1337 DEBUG_STR_APPEND(a, string_compose ("Channel Map for %1 plugin %2\n", name(), pc));
1338 DEBUG_STR_APPEND(a, " * Inputs:\n");
1339 DEBUG_STR_APPEND(a, _in_map[pc]);
1340 DEBUG_STR_APPEND(a, " * Outputs:\n");
1341 DEBUG_STR_APPEND(a, _out_map[pc]);
1343 DEBUG_STR_APPEND(a, "-------->>--------\n");
1344 DEBUG_TRACE (DEBUG::ChanMapping, DEBUG_STR(a).str());
1349 _no_inplace = check_inplace ();
1350 _mapping_changed = false;
1352 if (old_in != in || old_out != out || old_internal != _configured_internal
1353 || (old_match.method != _match.method && (old_match.method == Split || _match.method == Split))
1355 PluginIoReConfigure (); /* EMIT SIGNAL */
1358 // we don't know the analysis window size, so we must work with the
1359 // current buffer size here. each request for data fills in these
1360 // buffers and the analyser makes sure it gets enough data for the
1362 session().ensure_buffer_set (_signal_analysis_inputs, in);
1363 //_signal_analysis_inputs.set_count (in);
1365 session().ensure_buffer_set (_signal_analysis_outputs, out);
1366 //_signal_analysis_outputs.set_count (out);
1368 // std::cerr << "set counts to i" << in.n_audio() << "/o" << out.n_audio() << std::endl;
1371 return Processor::configure_io (in, out);
1374 /** Decide whether this PluginInsert can support a given IO configuration.
1375 * To do this, we run through a set of possible solutions in rough order of
1378 * @param in Required input channel count.
1379 * @param out Filled in with the output channel count if we return true.
1380 * @return true if the given IO configuration can be supported.
1383 PluginInsert::can_support_io_configuration (const ChanCount& in, ChanCount& out)
1386 _sidechain->can_support_io_configuration (in, out); // never fails, sets "out"
1388 return private_can_support_io_configuration (in, out).method != Impossible;
1391 /** A private version of can_support_io_configuration which returns the method
1392 * by which the configuration can be matched, rather than just whether or not
1396 PluginInsert::private_can_support_io_configuration (ChanCount const & inx, ChanCount& out) const
1398 if (_plugins.empty()) {
1403 if (is_channelstrip ()) {
1405 return Match (ExactMatch, 1);
1409 /* if a user specified a custom cfg, so be it. */
1412 return Match (ExactMatch, get_count(), _strict_io, true); // XXX
1415 /* try automatic configuration */
1416 Match m = PluginInsert::automatic_can_support_io_configuration (inx, out);
1418 PluginInfoPtr info = _plugins.front()->get_info();
1419 ChanCount inputs = info->n_inputs;
1420 ChanCount outputs = info->n_outputs;
1422 /* handle case strict-i/o */
1423 if (_strict_io && m.method != Impossible) {
1426 /* special case MIDI instruments */
1427 if (is_midi_instrument()) {
1428 // output = midi-bypass + at most master-out channels.
1429 ChanCount max_out (DataType::AUDIO, 2); // TODO use master-out
1430 max_out.set (DataType::MIDI, out.get(DataType::MIDI));
1431 out = ChanCount::min (out, max_out);
1432 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("special case strict-i/o instrument: %1\n", name()));
1438 if (inx.n_audio () != out.n_audio ()) { // ignore midi bypass
1439 /* replicate processor to match output count (generators and such)
1440 * at least enough to feed every output port. */
1441 uint32_t f = 1; // at least one. e.g. control data filters, no in, no out.
1442 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1443 uint32_t nout = outputs.get (*t);
1444 if (nout == 0 || inx.get(*t) == 0) { continue; }
1445 f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nout));
1448 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("special case strict-i/o generator: %1\n", name()));
1449 return Match (Replicate, f, _strict_io);
1460 if (m.method != Impossible) {
1464 ChanCount ns_inputs = inputs - sidechain_input_pins ();
1466 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("resolving 'Impossible' match for %1\n", name()));
1468 if (info->reconfigurable_io()) {
1470 // TODO add sidechains here
1471 bool const r = _plugins.front()->can_support_io_configuration (inx, out, &useins);
1473 // houston, we have a problem.
1474 return Match (Impossible, 0);
1476 return Match (Delegate, 1, _strict_io);
1479 ChanCount midi_bypass;
1480 if (inx.get(DataType::MIDI) == 1 && outputs.get(DataType::MIDI) == 0) {
1481 midi_bypass.set (DataType::MIDI, 1);
1484 // add at least as many plugins so that output count matches input count (w/o sidechain pins)
1486 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1487 uint32_t nin = ns_inputs.get (*t);
1488 uint32_t nout = outputs.get (*t);
1489 if (nin == 0 || inx.get(*t) == 0) { continue; }
1490 // prefer floor() so the count won't overly increase IFF (nin < nout)
1491 f = max (f, (uint32_t) floor (inx.get(*t) / (float)nout));
1493 if (f > 0 && outputs * f >= _configured_out) {
1494 out = outputs * f + midi_bypass;
1495 return Match (Replicate, f, _strict_io);
1498 // add at least as many plugins needed to connect all inputs (w/o sidechain pins)
1500 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1501 uint32_t nin = ns_inputs.get (*t);
1502 if (nin == 0 || inx.get(*t) == 0) { continue; }
1503 f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nin));
1506 out = outputs * f + midi_bypass;
1507 return Match (Replicate, f, _strict_io);
1510 // add at least as many plugins needed to connect all inputs
1512 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1513 uint32_t nin = inputs.get (*t);
1514 if (nin == 0 || inx.get(*t) == 0) { continue; }
1515 f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nin));
1517 out = outputs * f + midi_bypass;
1518 return Match (Replicate, f, _strict_io);
1521 /* this is the original Ardour 3/4 behavior, mainly for backwards compatibility */
1523 PluginInsert::automatic_can_support_io_configuration (ChanCount const & inx, ChanCount& out) const
1525 if (_plugins.empty()) {
1529 PluginInfoPtr info = _plugins.front()->get_info();
1530 ChanCount in; in += inx;
1531 ChanCount midi_bypass;
1533 if (info->reconfigurable_io()) {
1534 /* Plugin has flexible I/O, so delegate to it */
1535 bool const r = _plugins.front()->can_support_io_configuration (in, out);
1537 return Match (Impossible, 0);
1539 return Match (Delegate, 1);
1542 ChanCount inputs = info->n_inputs;
1543 ChanCount outputs = info->n_outputs;
1544 ChanCount ns_inputs = inputs - sidechain_input_pins ();
1546 if (in.get(DataType::MIDI) == 1 && outputs.get(DataType::MIDI) == 0) {
1547 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("bypassing midi-data around %1\n", name()));
1548 midi_bypass.set (DataType::MIDI, 1);
1550 if (in.get(DataType::MIDI) == 1 && inputs.get(DataType::MIDI) == 0) {
1551 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("hiding midi-port from plugin %1\n", name()));
1552 in.set(DataType::MIDI, 0);
1555 // add internally provided sidechain ports
1556 ChanCount insc = in + sidechain_input_ports ();
1558 bool no_inputs = true;
1559 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1560 if (inputs.get (*t) != 0) {
1567 /* no inputs so we can take any input configuration since we throw it away */
1568 out = outputs + midi_bypass;
1569 return Match (NoInputs, 1);
1572 /* Plugin inputs match requested inputs + side-chain-ports exactly */
1573 if (inputs == insc) {
1574 out = outputs + midi_bypass;
1575 return Match (ExactMatch, 1);
1578 /* Plugin inputs matches without side-chain-pins */
1579 if (ns_inputs == in) {
1580 out = outputs + midi_bypass;
1581 return Match (ExactMatch, 1);
1584 /* We may be able to run more than one copy of the plugin within this insert
1585 to cope with the insert having more inputs than the plugin.
1586 We allow replication only for plugins with either zero or 1 inputs and outputs
1587 for every valid data type.
1591 bool can_replicate = true;
1592 for (DataType::iterator t = DataType::begin(); t != DataType::end() && can_replicate; ++t) {
1594 // ignore side-chains
1595 uint32_t nin = ns_inputs.get (*t);
1597 // No inputs of this type
1598 if (nin == 0 && in.get(*t) == 0) {
1602 if (nin != 1 || outputs.get (*t) != 1) {
1603 can_replicate = false;
1607 // Potential factor not set yet
1609 f = in.get(*t) / nin;
1612 // Factor for this type does not match another type, can not replicate
1613 if (f != (in.get(*t) / nin)) {
1614 can_replicate = false;
1619 if (can_replicate && f > 0) {
1620 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1621 out.set (*t, outputs.get(*t) * f);
1624 return Match (Replicate, f);
1627 /* If the processor has exactly one input of a given type, and
1628 the plugin has more, we can feed the single processor input
1629 to some or all of the plugin inputs. This is rather
1630 special-case-y, but the 1-to-many case is by far the
1631 simplest. How do I split thy 2 processor inputs to 3
1632 plugin inputs? Let me count the ways ...
1635 bool can_split = true;
1636 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1638 bool const can_split_type = (in.get (*t) == 1 && ns_inputs.get (*t) > 1);
1639 bool const nothing_to_do_for_type = (in.get (*t) == 0 && inputs.get (*t) == 0);
1641 if (!can_split_type && !nothing_to_do_for_type) {
1647 out = outputs + midi_bypass;
1648 return Match (Split, 1);
1651 /* If the plugin has more inputs than we want, we can `hide' some of them
1652 by feeding them silence.
1655 bool could_hide = false;
1656 bool cannot_hide = false;
1657 ChanCount hide_channels;
1659 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1660 if (inputs.get(*t) > in.get(*t)) {
1661 /* there is potential to hide, since the plugin has more inputs of type t than the insert */
1662 hide_channels.set (*t, inputs.get(*t) - in.get(*t));
1664 } else if (inputs.get(*t) < in.get(*t)) {
1665 /* we definitely cannot hide, since the plugin has fewer inputs of type t than the insert */
1670 if (could_hide && !cannot_hide) {
1671 out = outputs + midi_bypass;
1672 return Match (Hide, 1, false, false, hide_channels);
1675 return Match (Impossible, 0);
1680 PluginInsert::get_state ()
1682 return state (true);
1686 PluginInsert::state (bool full)
1688 XMLNode& node = Processor::state (full);
1690 node.add_property("type", _plugins[0]->state_node_name());
1691 node.add_property("unique-id", _plugins[0]->unique_id());
1692 node.add_property("count", string_compose("%1", _plugins.size()));
1694 /* remember actual i/o configuration (for later placeholder
1695 * in case the plugin goes missing) */
1696 node.add_child_nocopy (* _configured_in.state (X_("ConfiguredInput")));
1697 node.add_child_nocopy (* _configured_out.state (X_("ConfiguredOutput")));
1699 /* save custom i/o config */
1700 node.add_property("custom", _custom_cfg ? "yes" : "no");
1701 for (uint32_t pc = 0; pc < get_count(); ++pc) {
1703 snprintf (tmp, sizeof(tmp), "InputMap-%d", pc);
1704 node.add_child_nocopy (* _in_map[pc].state (tmp));
1705 snprintf (tmp, sizeof(tmp), "OutputMap-%d", pc);
1706 node.add_child_nocopy (* _out_map[pc].state (tmp));
1710 node.add_child_nocopy (_sidechain->state (full));
1713 _plugins[0]->set_insert_id(this->id());
1714 node.add_child_nocopy (_plugins[0]->get_state());
1716 for (Controls::iterator c = controls().begin(); c != controls().end(); ++c) {
1717 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> ((*c).second);
1719 node.add_child_nocopy (ac->get_state());
1727 PluginInsert::set_control_ids (const XMLNode& node, int version)
1729 const XMLNodeList& nlist = node.children();
1730 XMLNodeConstIterator iter;
1731 set<Evoral::Parameter>::const_iterator p;
1733 for (iter = nlist.begin(); iter != nlist.end(); ++iter) {
1734 if ((*iter)->name() == Controllable::xml_node_name) {
1735 const XMLProperty* prop;
1737 uint32_t p = (uint32_t)-1;
1739 if ((prop = (*iter)->property (X_("symbol"))) != 0) {
1740 boost::shared_ptr<LV2Plugin> lv2plugin = boost::dynamic_pointer_cast<LV2Plugin> (_plugins[0]);
1742 p = lv2plugin->port_index(prop->value().c_str());
1746 if (p == (uint32_t)-1 && (prop = (*iter)->property (X_("parameter"))) != 0) {
1747 p = atoi (prop->value());
1750 if (p != (uint32_t)-1) {
1752 /* this may create the new controllable */
1754 boost::shared_ptr<Evoral::Control> c = control (Evoral::Parameter (PluginAutomation, 0, p));
1756 #ifndef NO_PLUGIN_STATE
1760 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> (c);
1762 ac->set_state (**iter, version);
1771 PluginInsert::set_state(const XMLNode& node, int version)
1773 XMLNodeList nlist = node.children();
1774 XMLNodeIterator niter;
1775 XMLPropertyList plist;
1776 const XMLProperty *prop;
1777 ARDOUR::PluginType type;
1779 if ((prop = node.property ("type")) == 0) {
1780 error << _("XML node describing plugin is missing the `type' field") << endmsg;
1784 if (prop->value() == X_("ladspa") || prop->value() == X_("Ladspa")) { /* handle old school sessions */
1785 type = ARDOUR::LADSPA;
1786 } else if (prop->value() == X_("lv2")) {
1788 } else if (prop->value() == X_("windows-vst")) {
1789 type = ARDOUR::Windows_VST;
1790 } else if (prop->value() == X_("lxvst")) {
1791 type = ARDOUR::LXVST;
1792 } else if (prop->value() == X_("audiounit")) {
1793 type = ARDOUR::AudioUnit;
1794 } else if (prop->value() == X_("luaproc")) {
1797 error << string_compose (_("unknown plugin type %1 in plugin insert state"),
1803 prop = node.property ("unique-id");
1806 #ifdef WINDOWS_VST_SUPPORT
1807 /* older sessions contain VST plugins with only an "id" field.
1810 if (type == ARDOUR::Windows_VST) {
1811 prop = node.property ("id");
1815 #ifdef LXVST_SUPPORT
1816 /*There shouldn't be any older sessions with linuxVST support.. but anyway..*/
1818 if (type == ARDOUR::LXVST) {
1819 prop = node.property ("id");
1825 error << _("Plugin has no unique ID field") << endmsg;
1830 boost::shared_ptr<Plugin> plugin = find_plugin (_session, prop->value(), type);
1832 /* treat linux and windows VST plugins equivalent if they have the same uniqueID
1833 * allow to move sessions windows <> linux */
1834 #ifdef LXVST_SUPPORT
1835 if (plugin == 0 && type == ARDOUR::Windows_VST) {
1836 type = ARDOUR::LXVST;
1837 plugin = find_plugin (_session, prop->value(), type);
1841 #ifdef WINDOWS_VST_SUPPORT
1842 if (plugin == 0 && type == ARDOUR::LXVST) {
1843 type = ARDOUR::Windows_VST;
1844 plugin = find_plugin (_session, prop->value(), type);
1849 error << string_compose(
1850 _("Found a reference to a plugin (\"%1\") that is unknown.\n"
1851 "Perhaps it was removed or moved since it was last used."),
1857 if (type == ARDOUR::Lua) {
1858 XMLNode *ls = node.child (plugin->state_node_name().c_str());
1859 // we need to load the script to set the name and parameters.
1860 boost::shared_ptr<LuaProc> lp = boost::dynamic_pointer_cast<LuaProc>(plugin);
1862 lp->set_script_from_state (*ls);
1866 // The name of the PluginInsert comes from the plugin, nothing else
1867 _name = plugin->get_info()->name;
1871 // Processor::set_state() will set this, but too late
1872 // for it to be available when setting up plugin
1873 // state. We can't call Processor::set_state() until
1874 // the plugins themselves are created and added.
1878 if (_plugins.empty()) {
1879 /* if we are adding the first plugin, we will need to set
1880 up automatable controls.
1882 add_plugin (plugin);
1883 create_automatable_parameters ();
1884 set_control_ids (node, version);
1887 if ((prop = node.property ("count")) != 0) {
1888 sscanf (prop->value().c_str(), "%u", &count);
1891 if (_plugins.size() != count) {
1892 for (uint32_t n = 1; n < count; ++n) {
1893 add_plugin (plugin_factory (plugin));
1897 Processor::set_state (node, version);
1899 PBD::ID new_id = this->id();
1900 PBD::ID old_id = this->id();
1902 if ((prop = node.property ("id")) != 0) {
1903 old_id = prop->value ();
1906 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1908 /* find the node with the type-specific node name ("lv2", "ladspa", etc)
1909 and set all plugins to the same state.
1912 if ((*niter)->name() == plugin->state_node_name()) {
1914 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1915 /* Plugin state can include external files which are named after the ID.
1917 * If regenerate_xml_or_string_ids() is set, the ID will already have
1918 * been changed, so we need to use the old ID from the XML to load the
1919 * state and then update the ID.
1921 * When copying a plugin-state, route_ui takes care of of updating the ID,
1922 * but we need to call set_insert_id() to clear the cached plugin-state
1923 * and force a change.
1925 if (!regenerate_xml_or_string_ids ()) {
1926 (*i)->set_insert_id (new_id);
1928 (*i)->set_insert_id (old_id);
1931 (*i)->set_state (**niter, version);
1933 if (regenerate_xml_or_string_ids ()) {
1934 (*i)->set_insert_id (new_id);
1942 if (version < 3000) {
1944 /* Only 2.X sessions need a call to set_parameter_state() - in 3.X and above
1945 this is all handled by Automatable
1948 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1949 if ((*niter)->name() == "Redirect") {
1950 /* XXX do we need to tackle placement? i think not (pd; oct 16 2009) */
1951 Processor::set_state (**niter, version);
1956 set_parameter_state_2X (node, version);
1959 if ((prop = node.property (X_("custom"))) != 0) {
1960 _custom_cfg = string_is_affirmative (prop->value());
1963 // TODO load/add sidechain
1965 uint32_t in_maps = 0;
1966 uint32_t out_maps = 0;
1967 XMLNodeList kids = node.children ();
1968 for (XMLNodeIterator i = kids.begin(); i != kids.end(); ++i) {
1969 if ((*i)->name() == X_("ConfiguredOutput")) {
1970 _custom_out = ChanCount(**i);
1972 if (strncmp ((*i)->name ().c_str(), X_("InputMap-"), 9) == 0) {
1973 long pc = atol (&((*i)->name().c_str()[9]));
1974 if (pc >=0 && pc <= get_count()) {
1975 _in_map[pc] = ChanMapping (**i);
1979 if (strncmp ((*i)->name ().c_str(), X_("OutputMap-"), 10) == 0) {
1980 long pc = atol (&((*i)->name().c_str()[10]));
1981 if (pc >=0 && pc <= get_count()) {
1982 _out_map[pc] = ChanMapping (**i);
1986 if ((*i)->name () == Processor::state_node_name) {
1990 _sidechain->set_state (**i, version);
1994 if (in_maps == out_maps && out_maps >0 && out_maps == get_count()) {
1995 _maps_from_state = true;
1998 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2002 (*i)->deactivate ();
2010 PluginInsert::update_id (PBD::ID id)
2013 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2014 (*i)->set_insert_id (id);
2019 PluginInsert::set_state_dir (const std::string& d)
2021 // state() only saves the state of the first plugin
2022 _plugins[0]->set_state_dir (d);
2026 PluginInsert::set_parameter_state_2X (const XMLNode& node, int version)
2028 XMLNodeList nlist = node.children();
2029 XMLNodeIterator niter;
2031 /* look for port automation node */
2033 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2035 if ((*niter)->name() != port_automation_node_name) {
2041 XMLNodeConstIterator iter;
2046 cnodes = (*niter)->children ("port");
2048 for (iter = cnodes.begin(); iter != cnodes.end(); ++iter){
2052 if ((cprop = child->property("number")) != 0) {
2053 port = cprop->value().c_str();
2055 warning << _("PluginInsert: Auto: no ladspa port number") << endmsg;
2059 sscanf (port, "%" PRIu32, &port_id);
2061 if (port_id >= _plugins[0]->parameter_count()) {
2062 warning << _("PluginInsert: Auto: port id out of range") << endmsg;
2066 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(
2067 control(Evoral::Parameter(PluginAutomation, 0, port_id), true));
2069 if (c && c->alist()) {
2070 if (!child->children().empty()) {
2071 c->alist()->set_state (*child->children().front(), version);
2073 /* In some cases 2.X saves lists with min_yval and max_yval
2074 being FLT_MIN and FLT_MAX respectively. This causes problems
2075 in A3 because these min/max values are used to compute
2076 where GUI control points should be drawn. If we see such
2077 values, `correct' them to the min/max of the appropriate
2081 float min_y = c->alist()->get_min_y ();
2082 float max_y = c->alist()->get_max_y ();
2084 ParameterDescriptor desc;
2085 _plugins.front()->get_parameter_descriptor (port_id, desc);
2087 if (min_y == FLT_MIN) {
2091 if (max_y == FLT_MAX) {
2095 c->alist()->set_yrange (min_y, max_y);
2098 error << string_compose (_("PluginInsert: automatable control %1 not found - ignored"), port_id) << endmsg;
2110 PluginInsert::describe_parameter (Evoral::Parameter param)
2112 if (param.type() == PluginAutomation) {
2113 return _plugins[0]->describe_parameter (param);
2114 } else if (param.type() == PluginPropertyAutomation) {
2115 boost::shared_ptr<AutomationControl> c(automation_control(param));
2116 if (c && !c->desc().label.empty()) {
2117 return c->desc().label;
2120 return Automatable::describe_parameter(param);
2124 PluginInsert::signal_latency() const
2126 if (_user_latency) {
2127 return _user_latency;
2130 return _plugins[0]->signal_latency ();
2134 PluginInsert::type ()
2136 return plugin()->get_info()->type;
2139 PluginInsert::PluginControl::PluginControl (PluginInsert* p,
2140 const Evoral::Parameter& param,
2141 const ParameterDescriptor& desc,
2142 boost::shared_ptr<AutomationList> list)
2143 : AutomationControl (p->session(), param, desc, list, p->describe_parameter(param))
2147 alist()->reset_default (desc.normal);
2149 list->set_interpolation(Evoral::ControlList::Discrete);
2154 set_flags(Controllable::Toggle);
2158 /** @param val `user' value */
2160 PluginInsert::PluginControl::set_value (double user_val, PBD::Controllable::GroupControlDisposition group_override)
2163 _set_value (user_val, group_override);
2167 PluginInsert::PluginControl::set_value_unchecked (double user_val)
2169 /* used only by automation playback */
2170 _set_value (user_val, Controllable::NoGroup);
2174 PluginInsert::PluginControl::_set_value (double user_val, PBD::Controllable::GroupControlDisposition group_override)
2176 /* FIXME: probably should be taking out some lock here.. */
2178 for (Plugins::iterator i = _plugin->_plugins.begin(); i != _plugin->_plugins.end(); ++i) {
2179 (*i)->set_parameter (_list->parameter().id(), user_val);
2182 boost::shared_ptr<Plugin> iasp = _plugin->_impulseAnalysisPlugin.lock();
2184 iasp->set_parameter (_list->parameter().id(), user_val);
2187 AutomationControl::set_value (user_val, group_override);
2191 PluginInsert::PluginControl::catch_up_with_external_value (double user_val)
2193 AutomationControl::set_value (user_val, Controllable::NoGroup);
2197 PluginInsert::PluginControl::get_state ()
2201 XMLNode& node (AutomationControl::get_state());
2202 ss << parameter().id();
2203 node.add_property (X_("parameter"), ss.str());
2205 boost::shared_ptr<LV2Plugin> lv2plugin = boost::dynamic_pointer_cast<LV2Plugin> (_plugin->_plugins[0]);
2207 node.add_property (X_("symbol"), lv2plugin->port_symbol (parameter().id()));
2214 /** @return `user' val */
2216 PluginInsert::PluginControl::get_value () const
2218 boost::shared_ptr<Plugin> plugin = _plugin->plugin (0);
2224 return plugin->get_parameter (_list->parameter().id());
2227 PluginInsert::PluginPropertyControl::PluginPropertyControl (PluginInsert* p,
2228 const Evoral::Parameter& param,
2229 const ParameterDescriptor& desc,
2230 boost::shared_ptr<AutomationList> list)
2231 : AutomationControl (p->session(), param, desc, list)
2235 alist()->set_yrange (desc.lower, desc.upper);
2236 alist()->reset_default (desc.normal);
2240 set_flags(Controllable::Toggle);
2245 PluginInsert::PluginPropertyControl::set_value (double user_val, PBD::Controllable::GroupControlDisposition /* group_override*/)
2248 set_value_unchecked (user_val);
2253 PluginInsert::PluginPropertyControl::set_value_unchecked (double user_val)
2255 /* Old numeric set_value(), coerce to appropriate datatype if possible.
2256 This is lossy, but better than nothing until Ardour's automation system
2257 can handle various datatypes all the way down. */
2258 const Variant value(_desc.datatype, user_val);
2259 if (value.type() == Variant::NOTHING) {
2260 error << "set_value(double) called for non-numeric property" << endmsg;
2264 for (Plugins::iterator i = _plugin->_plugins.begin(); i != _plugin->_plugins.end(); ++i) {
2265 (*i)->set_property(_list->parameter().id(), value);
2269 AutomationControl::set_value (user_val, Controllable::NoGroup);
2273 PluginInsert::PluginPropertyControl::get_state ()
2277 XMLNode& node (AutomationControl::get_state());
2278 ss << parameter().id();
2279 node.add_property (X_("property"), ss.str());
2280 node.remove_property (X_("value"));
2286 PluginInsert::PluginPropertyControl::get_value () const
2288 return _value.to_double();
2291 boost::shared_ptr<Plugin>
2292 PluginInsert::get_impulse_analysis_plugin()
2294 boost::shared_ptr<Plugin> ret;
2295 if (_impulseAnalysisPlugin.expired()) {
2296 ret = plugin_factory(_plugins[0]);
2297 ret->configure_io (internal_input_streams (), internal_output_streams ());
2298 _impulseAnalysisPlugin = ret;
2300 ret = _impulseAnalysisPlugin.lock();
2307 PluginInsert::collect_signal_for_analysis (framecnt_t nframes)
2309 // called from outside the audio thread, so this should be safe
2310 // only do audio as analysis is (currently) only for audio plugins
2311 _signal_analysis_inputs.ensure_buffers( DataType::AUDIO, internal_input_streams().n_audio(), nframes);
2312 _signal_analysis_outputs.ensure_buffers( DataType::AUDIO, internal_output_streams().n_audio(), nframes);
2314 _signal_analysis_collected_nframes = 0;
2315 _signal_analysis_collect_nframes_max = nframes;
2318 /** Add a plugin to our list */
2320 PluginInsert::add_plugin (boost::shared_ptr<Plugin> plugin)
2322 plugin->set_insert_id (this->id());
2324 if (_plugins.empty()) {
2325 /* first (and probably only) plugin instance - connect to relevant signals */
2327 plugin->ParameterChangedExternally.connect_same_thread (*this, boost::bind (&PluginInsert::parameter_changed_externally, this, _1, _2));
2328 plugin->StartTouch.connect_same_thread (*this, boost::bind (&PluginInsert::start_touch, this, _1));
2329 plugin->EndTouch.connect_same_thread (*this, boost::bind (&PluginInsert::end_touch, this, _1));
2330 // cache sidechain ports
2331 _cached_sidechain_pins.reset ();
2332 const ChanCount& nis (plugin->get_info()->n_inputs);
2333 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2334 for (uint32_t in = 0; in < nis.get (*t); ++in) {
2335 const Plugin::IOPortDescription& iod (plugin->describe_io_port (*t, true, in));
2336 if (iod.is_sidechain) {
2337 _cached_sidechain_pins.set (*t, 1 + _cached_sidechain_pins.n(*t));
2342 _plugins.push_back (plugin);
2346 PluginInsert::realtime_handle_transport_stopped ()
2348 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2349 (*i)->realtime_handle_transport_stopped ();
2354 PluginInsert::realtime_locate ()
2356 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2357 (*i)->realtime_locate ();
2362 PluginInsert::monitoring_changed ()
2364 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2365 (*i)->monitoring_changed ();
2370 PluginInsert::start_touch (uint32_t param_id)
2372 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id));
2374 ac->start_touch (session().audible_frame());
2379 PluginInsert::end_touch (uint32_t param_id)
2381 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id));
2383 ac->stop_touch (true, session().audible_frame());
2387 std::ostream& operator<<(std::ostream& o, const ARDOUR::PluginInsert::Match& m)
2390 case PluginInsert::Impossible: o << "Impossible"; break;
2391 case PluginInsert::Delegate: o << "Delegate"; break;
2392 case PluginInsert::NoInputs: o << "NoInputs"; break;
2393 case PluginInsert::ExactMatch: o << "ExactMatch"; break;
2394 case PluginInsert::Replicate: o << "Replicate"; break;
2395 case PluginInsert::Split: o << "Split"; break;
2396 case PluginInsert::Hide: o << "Hide"; break;
2398 o << " cnt: " << m.plugins
2399 << (m.strict_io ? " strict-io" : "")
2400 << (m.custom_cfg ? " custom-cfg" : "");
2401 if (m.method == PluginInsert::Hide) {
2402 o << " hide: " << m.hide;