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)
72 , _strict_io_configured (false)
74 /* the first is the master */
78 create_automatable_parameters ();
83 PluginInsert::set_count (uint32_t num)
85 bool require_state = !_plugins.empty();
87 /* this is a bad idea.... we shouldn't do this while active.
88 only a route holding their redirect_lock should be calling this
93 } else if (num > _plugins.size()) {
94 uint32_t diff = num - _plugins.size();
96 for (uint32_t n = 0; n < diff; ++n) {
97 boost::shared_ptr<Plugin> p = plugin_factory (_plugins[0]);
104 /* XXX do something */
108 } else if (num < _plugins.size()) {
109 uint32_t diff = _plugins.size() - num;
110 for (uint32_t n= 0; n < diff; ++n) {
118 PluginInsert::~PluginInsert ()
123 PluginInsert::control_list_automation_state_changed (Evoral::Parameter which, AutoState s)
125 if (which.type() != PluginAutomation)
128 boost::shared_ptr<AutomationControl> c
129 = boost::dynamic_pointer_cast<AutomationControl>(control (which));
132 _plugins[0]->set_parameter (which.id(), c->list()->eval (_session.transport_frame()));
137 PluginInsert::output_streams() const
139 assert (!_plugins.empty());
141 PluginInfoPtr info = _plugins.front()->get_info();
143 if (_strict_io_configured) {
144 return _configured_in; // XXX, check initial configuration
146 else if (info->reconfigurable_io()) {
147 ChanCount out = _plugins.front()->output_streams ();
148 // DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, reconfigur(able) output streams = %1\n", out));
151 ChanCount out = info->n_outputs;
152 // DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, static output streams = %1 for %2 plugins\n", out, _plugins.size()));
153 out.set_audio (out.n_audio() * _plugins.size());
154 out.set_midi (out.n_midi() * _plugins.size() + midi_bypass.n_midi());
160 PluginInsert::input_streams() const
162 assert (!_plugins.empty());
166 PluginInfoPtr info = _plugins.front()->get_info();
168 if (info->reconfigurable_io()) {
169 assert (_plugins.size() == 1);
170 in = _plugins.front()->input_streams();
175 DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, input streams = %1, match using %2\n", in, _match.method));
177 if (_match.method == Split) {
179 /* we are splitting 1 processor input to multiple plugin inputs,
180 so we have a maximum of 1 stream of each type.
182 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
183 if (in.get (*t) > 1) {
189 } else if (_match.method == Hide) {
191 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
192 in.set (*t, in.get (*t) - _match.hide.get (*t));
198 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
199 in.set (*t, in.get (*t) * _plugins.size ());
207 PluginInsert::natural_output_streams() const
209 return _plugins[0]->get_info()->n_outputs;
213 PluginInsert::natural_input_streams() const
215 return _plugins[0]->get_info()->n_inputs;
219 PluginInsert::has_no_inputs() const
221 return _plugins[0]->get_info()->n_inputs == ChanCount::ZERO;
225 PluginInsert::has_no_audio_inputs() const
227 return _plugins[0]->get_info()->n_inputs.n_audio() == 0;
231 PluginInsert::is_midi_instrument() const
233 /* XXX more finesse is possible here. VST plugins have a
234 a specific "instrument" flag, for example.
236 PluginInfoPtr pi = _plugins[0]->get_info();
238 return pi->n_inputs.n_midi() != 0 &&
239 pi->n_outputs.n_audio() > 0;
243 PluginInsert::create_automatable_parameters ()
245 assert (!_plugins.empty());
247 set<Evoral::Parameter> a = _plugins.front()->automatable ();
249 for (set<Evoral::Parameter>::iterator i = a.begin(); i != a.end(); ++i) {
250 if (i->type() == PluginAutomation) {
252 Evoral::Parameter param(*i);
254 ParameterDescriptor desc;
255 _plugins.front()->get_parameter_descriptor(i->id(), desc);
257 can_automate (param);
258 boost::shared_ptr<AutomationList> list(new AutomationList(param, desc));
259 boost::shared_ptr<AutomationControl> c (new PluginControl(this, param, desc, list));
261 _plugins.front()->set_automation_control (i->id(), c);
262 } else if (i->type() == PluginPropertyAutomation) {
263 Evoral::Parameter param(*i);
264 const ParameterDescriptor& desc = _plugins.front()->get_property_descriptor(param.id());
265 if (desc.datatype != Variant::NOTHING) {
266 boost::shared_ptr<AutomationList> list;
267 if (Variant::type_is_numeric(desc.datatype)) {
268 list = boost::shared_ptr<AutomationList>(new AutomationList(param, desc));
270 add_control (boost::shared_ptr<AutomationControl> (new PluginPropertyControl(this, param, desc, list)));
275 /** Called when something outside of this host has modified a plugin
276 * parameter. Responsible for propagating the change to two places:
278 * 1) anything listening to the Control itself
279 * 2) any replicated plugins that make up this PluginInsert.
281 * The PluginInsert is connected to the ParameterChangedExternally signal for
282 * the first (primary) plugin, and here broadcasts that change to any others.
284 * XXX We should probably drop this whole replication idea (Paul, October 2015)
285 * since it isn't used by sensible plugin APIs (AU, LV2).
288 PluginInsert::parameter_changed_externally (uint32_t which, float val)
290 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, which));
292 /* First propagation: alter the underlying value of the control,
293 * without telling the plugin(s) that own/use it to set it.
300 boost::shared_ptr<PluginControl> pc = boost::dynamic_pointer_cast<PluginControl> (ac);
303 pc->catch_up_with_external_value (val);
306 /* Second propagation: tell all plugins except the first to
307 update the value of this parameter. For sane plugin APIs,
308 there are no other plugins, so this is a no-op in those
312 Plugins::iterator i = _plugins.begin();
314 /* don't set the first plugin, just all the slaves */
316 if (i != _plugins.end()) {
318 for (; i != _plugins.end(); ++i) {
319 (*i)->set_parameter (which, val);
325 PluginInsert::set_block_size (pframes_t nframes)
328 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
329 if ((*i)->set_block_size (nframes) != 0) {
337 PluginInsert::activate ()
339 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
343 Processor::activate ();
347 PluginInsert::deactivate ()
349 Processor::deactivate ();
351 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
357 PluginInsert::flush ()
359 for (vector<boost::shared_ptr<Plugin> >::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
365 PluginInsert::connect_and_run (BufferSet& bufs, pframes_t nframes, framecnt_t offset, bool with_auto, framepos_t now)
367 // Calculate if, and how many frames we need to collect for analysis
368 framecnt_t collect_signal_nframes = (_signal_analysis_collect_nframes_max -
369 _signal_analysis_collected_nframes);
370 if (nframes < collect_signal_nframes) { // we might not get all frames now
371 collect_signal_nframes = nframes;
374 ChanCount const in_streams = input_streams ();
375 ChanCount const out_streams = output_streams ();
378 if (_match.method == Split) {
379 /* fix the input mapping so that we have maps for each of the plugin's inputs */
381 /* copy the first stream's buffer contents to the others */
382 /* XXX: audio only */
383 uint32_t first_idx = _in_map.get (DataType::AUDIO, 0, &valid);
385 for (uint32_t i = in_streams.n_audio(); i < natural_input_streams().n_audio(); ++i) {
386 bufs.get_audio(_in_map.get (DataType::AUDIO, i, &valid)).read_from(bufs.get_audio(first_idx), nframes, offset, offset);
391 bufs.set_count(ChanCount::max(bufs.count(), in_streams));
392 bufs.set_count(ChanCount::max(bufs.count(), out_streams));
394 /* Note that we've already required that plugins
395 be able to handle in-place processing.
402 for (Controls::iterator li = controls().begin(); li != controls().end(); ++li, ++n) {
404 boost::shared_ptr<AutomationControl> c
405 = boost::dynamic_pointer_cast<AutomationControl>(li->second);
407 if (c->list() && c->automation_playback()) {
410 const float val = c->list()->rt_safe_eval (now, valid);
413 /* This is the ONLY place where we are
415 * AutomationControl::set_value_unchecked(). We
416 * know that the control is in
417 * automation playback mode, so no
418 * check on writable() is required
419 * (which must be done in AutomationControl::set_value()
422 c->set_value_unchecked(val);
429 if (collect_signal_nframes > 0) {
431 //std::cerr << "collect input, bufs " << bufs.count().n_audio() << " count, " << bufs.available().n_audio() << " available" << std::endl;
432 //std::cerr << " streams " << input_streams().n_audio() << std::endl;
433 //std::cerr << "filling buffer with " << collect_signal_nframes << " frames at " << _signal_analysis_collected_nframes << std::endl;
435 _signal_analysis_inputs.set_count(input_streams());
437 for (uint32_t i = 0; i < input_streams().n_audio(); ++i) {
438 _signal_analysis_inputs.get_audio(i).read_from(
440 collect_signal_nframes,
441 _signal_analysis_collected_nframes); // offset is for target buffer
447 // copy - for now - since the map is offset below
448 // TODO: use dedicated maps per plugin
449 ChanMapping in_map (_in_map);
450 ChanMapping out_map (_out_map);
452 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
453 if ((*i)->connect_and_run(bufs, in_map, out_map, nframes, offset)) {
456 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
457 in_map.offset_to(*t, natural_input_streams().get(*t));
458 out_map.offset_to(*t, natural_output_streams().get(*t));
462 if (collect_signal_nframes > 0) {
464 //std::cerr << " output, bufs " << bufs.count().n_audio() << " count, " << bufs.available().n_audio() << " available" << std::endl;
465 //std::cerr << " streams " << output_streams().n_audio() << std::endl;
467 _signal_analysis_outputs.set_count(output_streams());
469 for (uint32_t i = 0; i < output_streams().n_audio(); ++i) {
470 _signal_analysis_outputs.get_audio(i).read_from(
472 collect_signal_nframes,
473 _signal_analysis_collected_nframes); // offset is for target buffer
476 _signal_analysis_collected_nframes += collect_signal_nframes;
477 assert(_signal_analysis_collected_nframes <= _signal_analysis_collect_nframes_max);
479 if (_signal_analysis_collected_nframes == _signal_analysis_collect_nframes_max) {
480 _signal_analysis_collect_nframes_max = 0;
481 _signal_analysis_collected_nframes = 0;
483 AnalysisDataGathered(&_signal_analysis_inputs,
484 &_signal_analysis_outputs);
487 /* leave remaining channel buffers alone */
491 PluginInsert::silence (framecnt_t nframes)
497 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
498 (*i)->connect_and_run (_session.get_scratch_buffers ((*i)->get_info()->n_inputs, true), _in_map, _out_map, nframes, 0);
503 PluginInsert::run (BufferSet& bufs, framepos_t start_frame, framepos_t /*end_frame*/, pframes_t nframes, bool)
505 if (_pending_active) {
506 /* run as normal if we are active or moving from inactive to active */
508 if (_session.transport_rolling() || _session.bounce_processing()) {
509 automation_run (bufs, start_frame, nframes);
511 connect_and_run (bufs, nframes, 0, false);
515 uint32_t in = input_streams ().n_audio ();
516 uint32_t out = output_streams().n_audio ();
518 if (has_no_audio_inputs() || in == 0) {
520 /* silence all (audio) outputs. Should really declick
521 * at the transitions of "active"
524 for (uint32_t n = 0; n < out; ++n) {
525 bufs.get_audio (n).silence (nframes);
528 } else if (out > in) {
530 /* not active, but something has make up for any channel count increase */
532 // TODO: option round-robin (n % in) or silence additional buffers ??
533 // for now , simply replicate last buffer
534 for (uint32_t n = in; n < out; ++n) {
535 bufs.get_audio(n).read_from(bufs.get_audio(in - 1), nframes);
539 bufs.count().set_audio (out);
542 _active = _pending_active;
544 /* we have no idea whether the plugin generated silence or not, so mark
545 * all buffers appropriately.
551 PluginInsert::automation_run (BufferSet& bufs, framepos_t start, pframes_t nframes)
553 Evoral::ControlEvent next_event (0, 0.0f);
554 framepos_t now = start;
555 framepos_t end = now + nframes;
556 framecnt_t offset = 0;
558 Glib::Threads::Mutex::Lock lm (control_lock(), Glib::Threads::TRY_LOCK);
561 connect_and_run (bufs, nframes, offset, false);
565 if (!find_next_event (now, end, next_event) || _plugins.front()->requires_fixed_sized_buffers()) {
567 /* no events have a time within the relevant range */
569 connect_and_run (bufs, nframes, offset, true, now);
575 framecnt_t cnt = min (((framecnt_t) ceil (next_event.when) - now), (framecnt_t) nframes);
577 connect_and_run (bufs, cnt, offset, true, now);
583 if (!find_next_event (now, end, next_event)) {
588 /* cleanup anything that is left to do */
591 connect_and_run (bufs, nframes, offset, true, now);
596 PluginInsert::default_parameter_value (const Evoral::Parameter& param)
598 if (param.type() != PluginAutomation)
601 if (_plugins.empty()) {
602 fatal << _("programming error: ") << X_("PluginInsert::default_parameter_value() called with no plugin")
604 abort(); /*NOTREACHED*/
607 return _plugins[0]->default_value (param.id());
612 PluginInsert::can_reset_all_parameters ()
616 for (uint32_t par = 0; par < _plugins[0]->parameter_count(); ++par) {
618 const uint32_t cid = _plugins[0]->nth_parameter (par, ok);
620 if (!ok || !_plugins[0]->parameter_is_input(cid)) {
624 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, cid));
630 if (ac->automation_state() & Play) {
635 return all && (params > 0);
639 PluginInsert::reset_parameters_to_default ()
643 for (uint32_t par = 0; par < _plugins[0]->parameter_count(); ++par) {
645 const uint32_t cid = _plugins[0]->nth_parameter (par, ok);
647 if (!ok || !_plugins[0]->parameter_is_input(cid)) {
651 const float dflt = _plugins[0]->default_value (cid);
652 const float curr = _plugins[0]->get_parameter (cid);
658 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, cid));
663 if (ac->automation_state() & Play) {
668 ac->set_value (dflt, Controllable::NoGroup);
673 boost::shared_ptr<Plugin>
674 PluginInsert::plugin_factory (boost::shared_ptr<Plugin> other)
676 boost::shared_ptr<LadspaPlugin> lp;
677 boost::shared_ptr<LuaProc> lua;
679 boost::shared_ptr<LV2Plugin> lv2p;
681 #ifdef WINDOWS_VST_SUPPORT
682 boost::shared_ptr<WindowsVSTPlugin> vp;
685 boost::shared_ptr<LXVSTPlugin> lxvp;
687 #ifdef AUDIOUNIT_SUPPORT
688 boost::shared_ptr<AUPlugin> ap;
691 if ((lp = boost::dynamic_pointer_cast<LadspaPlugin> (other)) != 0) {
692 return boost::shared_ptr<Plugin> (new LadspaPlugin (*lp));
693 } else if ((lua = boost::dynamic_pointer_cast<LuaProc> (other)) != 0) {
694 return boost::shared_ptr<Plugin> (new LuaProc (*lua));
696 } else if ((lv2p = boost::dynamic_pointer_cast<LV2Plugin> (other)) != 0) {
697 return boost::shared_ptr<Plugin> (new LV2Plugin (*lv2p));
699 #ifdef WINDOWS_VST_SUPPORT
700 } else if ((vp = boost::dynamic_pointer_cast<WindowsVSTPlugin> (other)) != 0) {
701 return boost::shared_ptr<Plugin> (new WindowsVSTPlugin (*vp));
704 } else if ((lxvp = boost::dynamic_pointer_cast<LXVSTPlugin> (other)) != 0) {
705 return boost::shared_ptr<Plugin> (new LXVSTPlugin (*lxvp));
707 #ifdef AUDIOUNIT_SUPPORT
708 } else if ((ap = boost::dynamic_pointer_cast<AUPlugin> (other)) != 0) {
709 return boost::shared_ptr<Plugin> (new AUPlugin (*ap));
713 fatal << string_compose (_("programming error: %1"),
714 X_("unknown plugin type in PluginInsert::plugin_factory"))
716 abort(); /*NOTREACHED*/
717 return boost::shared_ptr<Plugin> ((Plugin*) 0);
721 PluginInsert::configure_io (ChanCount in, ChanCount out)
723 Match old_match = _match;
724 ChanCount old_in = input_streams ();
725 ChanCount old_out = output_streams ();
728 _configured_out = out;
730 /* set the matching method and number of plugins that we will use to meet this configuration */
731 _match = private_can_support_io_configuration (in, out);
732 if (set_count (_match.plugins) == false) {
733 PluginIoReConfigure (); /* EMIT SIGNAL */
737 /* configure plugins */
738 switch (_match.method) {
741 if (_plugins.front()->configure_io (_plugins.front()->get_info()->n_inputs, out) == false) {
742 PluginIoReConfigure (); /* EMIT SIGNAL */
748 if (_plugins.front()->configure_io (in, out) == false) {
749 PluginIoReConfigure (); /* EMIT SIGNAL */
755 if (_match.method == Split) {
756 /* fix the input mapping so that we have maps for each of the plugin's inputs */
757 _in_map = ChanMapping (natural_input_streams ());
759 _in_map = ChanMapping (input_streams ());
761 _out_map = ChanMapping (output_streams());
764 cout << "Set Channel Maps:" << name () << " " << this
765 << "\nin:\n" << _in_map
766 << "\nout:\n" << _out_map
771 if ( (old_match.method != _match.method && (old_match.method == Split || _match.method == Split))
776 PluginIoReConfigure (); /* EMIT SIGNAL */
779 // we don't know the analysis window size, so we must work with the
780 // current buffer size here. each request for data fills in these
781 // buffers and the analyser makes sure it gets enough data for the
783 session().ensure_buffer_set (_signal_analysis_inputs, in);
784 //_signal_analysis_inputs.set_count (in);
786 session().ensure_buffer_set (_signal_analysis_outputs, out);
787 //_signal_analysis_outputs.set_count (out);
789 // std::cerr << "set counts to i" << in.n_audio() << "/o" << out.n_audio() << std::endl;
791 return Processor::configure_io (in, out);
794 /** Decide whether this PluginInsert can support a given IO configuration.
795 * To do this, we run through a set of possible solutions in rough order of
798 * @param in Required input channel count.
799 * @param out Filled in with the output channel count if we return true.
800 * @return true if the given IO configuration can be supported.
803 PluginInsert::can_support_io_configuration (const ChanCount& in, ChanCount& out)
805 return private_can_support_io_configuration (in, out).method != Impossible;
808 /** A private version of can_support_io_configuration which returns the method
809 * by which the configuration can be matched, rather than just whether or not
813 PluginInsert::private_can_support_io_configuration (ChanCount const & inx, ChanCount& out)
815 _strict_io_configured = false;
816 if (_plugins.empty()) {
820 PluginInfoPtr info = _plugins.front()->get_info();
821 ChanCount in; in += inx;
824 if (info->reconfigurable_io()) {
825 /* Plugin has flexible I/O, so delegate to it */
826 bool const r = _plugins.front()->can_support_io_configuration (in, out);
828 return Match (Impossible, 0);
831 if (_strict_io && in.n_audio() < out.n_audio()) {
832 DEBUG_TRACE (DEBUG::Processors, string_compose ("hiding output ports of reconfigurable %1\n", name()));
833 out.set (DataType::AUDIO, in.get (DataType::AUDIO));
836 return Match (Delegate, 1);
839 ChanCount inputs = info->n_inputs;
840 ChanCount outputs = info->n_outputs;
842 if (in.get(DataType::MIDI) == 1 && outputs.get(DataType::MIDI) == 0) {
843 DEBUG_TRACE ( DEBUG::Processors, string_compose ("bypassing midi-data around %1\n", name()));
844 midi_bypass.set(DataType::MIDI, 1);
846 if (in.get(DataType::MIDI) == 1 && inputs.get(DataType::MIDI) == 0) {
847 DEBUG_TRACE ( DEBUG::Processors, string_compose ("hiding midi-port from plugin %1\n", name()));
848 in.set(DataType::MIDI, 0);
851 bool no_inputs = true;
852 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
853 if (inputs.get (*t) != 0) {
860 /* no inputs so we can take any input configuration since we throw it away */
861 out = outputs + midi_bypass;
862 return Match (NoInputs, 1);
865 /* Plugin inputs match requested inputs exactly */
866 if (inputs == in && (!_strict_io || outputs.n_audio() == inputs.n_audio())) {
867 out = outputs + midi_bypass;
868 return Match (ExactMatch, 1);
871 /* We may be able to run more than one copy of the plugin within this insert
872 to cope with the insert having more inputs than the plugin.
873 We allow replication only for plugins with either zero or 1 inputs and outputs
874 for every valid data type.
878 bool can_replicate = true;
879 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
881 uint32_t nin = inputs.get (*t);
883 // No inputs of this type
884 if (nin == 0 && in.get(*t) == 0) {
888 if (nin != 1 || outputs.get (*t) != 1) {
889 can_replicate = false;
893 // Potential factor not set yet
895 f = in.get(*t) / nin;
898 // Factor for this type does not match another type, can not replicate
899 if (f != (in.get(*t) / nin)) {
900 can_replicate = false;
906 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
907 out.set (*t, outputs.get(*t) * f);
910 return Match (Replicate, f);
913 /* If the processor has exactly one input of a given type, and
914 the plugin has more, we can feed the single processor input
915 to some or all of the plugin inputs. This is rather
916 special-case-y, but the 1-to-many case is by far the
917 simplest. How do I split thy 2 processor inputs to 3
918 plugin inputs? Let me count the ways ...
921 bool can_split = !_strict_io;
922 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
924 bool const can_split_type = (in.get (*t) == 1 && inputs.get (*t) > 1);
925 bool const nothing_to_do_for_type = (in.get (*t) == 0 && inputs.get (*t) == 0);
927 if (!can_split_type && !nothing_to_do_for_type) {
933 out = outputs + midi_bypass;
934 return Match (Split, 1);
937 /* If the plugin has more inputs than we want, we can `hide' some of them
938 by feeding them silence.
941 bool could_hide = false;
942 bool cannot_hide = false;
943 ChanCount hide_channels;
945 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
946 if (inputs.get(*t) > in.get(*t)) {
947 /* there is potential to hide, since the plugin has more inputs of type t than the insert */
948 hide_channels.set (*t, inputs.get(*t) - in.get(*t));
950 } else if (inputs.get(*t) < in.get(*t)) {
951 /* we definitely cannot hide, since the plugin has fewer inputs of type t than the insert */
956 if (could_hide && !cannot_hide) {
957 if (_strict_io && inputs.get (DataType::AUDIO) == outputs.get (DataType::AUDIO)) {
958 _strict_io_configured = true;
961 out = outputs + midi_bypass;
963 return Match (Hide, 1, hide_channels);
967 return Match (Impossible, 0);
971 PluginInsert::get_state ()
977 PluginInsert::state (bool full)
979 XMLNode& node = Processor::state (full);
981 node.add_property("type", _plugins[0]->state_node_name());
982 node.add_property("unique-id", _plugins[0]->unique_id());
983 node.add_property("count", string_compose("%1", _plugins.size()));
985 /* remember actual i/o configuration (for later placeholder
986 * in case the plugin goes missing) */
987 node.add_child_nocopy (* _configured_in.state (X_("ConfiguredInput")));
988 node.add_child_nocopy (* _configured_out.state (X_("ConfiguredOutput")));
990 _plugins[0]->set_insert_id(this->id());
991 node.add_child_nocopy (_plugins[0]->get_state());
993 for (Controls::iterator c = controls().begin(); c != controls().end(); ++c) {
994 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> ((*c).second);
996 node.add_child_nocopy (ac->get_state());
1004 PluginInsert::set_control_ids (const XMLNode& node, int version)
1006 const XMLNodeList& nlist = node.children();
1007 XMLNodeConstIterator iter;
1008 set<Evoral::Parameter>::const_iterator p;
1010 for (iter = nlist.begin(); iter != nlist.end(); ++iter) {
1011 if ((*iter)->name() == Controllable::xml_node_name) {
1012 const XMLProperty* prop;
1014 uint32_t p = (uint32_t)-1;
1016 if ((prop = (*iter)->property (X_("symbol"))) != 0) {
1017 boost::shared_ptr<LV2Plugin> lv2plugin = boost::dynamic_pointer_cast<LV2Plugin> (_plugins[0]);
1019 p = lv2plugin->port_index(prop->value().c_str());
1023 if (p == (uint32_t)-1 && (prop = (*iter)->property (X_("parameter"))) != 0) {
1024 p = atoi (prop->value());
1027 if (p != (uint32_t)-1) {
1029 /* this may create the new controllable */
1031 boost::shared_ptr<Evoral::Control> c = control (Evoral::Parameter (PluginAutomation, 0, p));
1033 #ifndef NO_PLUGIN_STATE
1037 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> (c);
1039 ac->set_state (**iter, version);
1048 PluginInsert::set_state(const XMLNode& node, int version)
1050 XMLNodeList nlist = node.children();
1051 XMLNodeIterator niter;
1052 XMLPropertyList plist;
1053 const XMLProperty *prop;
1054 ARDOUR::PluginType type;
1056 if ((prop = node.property ("type")) == 0) {
1057 error << _("XML node describing plugin is missing the `type' field") << endmsg;
1061 if (prop->value() == X_("ladspa") || prop->value() == X_("Ladspa")) { /* handle old school sessions */
1062 type = ARDOUR::LADSPA;
1063 } else if (prop->value() == X_("lv2")) {
1065 } else if (prop->value() == X_("windows-vst")) {
1066 type = ARDOUR::Windows_VST;
1067 } else if (prop->value() == X_("lxvst")) {
1068 type = ARDOUR::LXVST;
1069 } else if (prop->value() == X_("audiounit")) {
1070 type = ARDOUR::AudioUnit;
1071 } else if (prop->value() == X_("luaproc")) {
1074 error << string_compose (_("unknown plugin type %1 in plugin insert state"),
1080 prop = node.property ("unique-id");
1083 #ifdef WINDOWS_VST_SUPPORT
1084 /* older sessions contain VST plugins with only an "id" field.
1087 if (type == ARDOUR::Windows_VST) {
1088 prop = node.property ("id");
1092 #ifdef LXVST_SUPPORT
1093 /*There shouldn't be any older sessions with linuxVST support.. but anyway..*/
1095 if (type == ARDOUR::LXVST) {
1096 prop = node.property ("id");
1102 error << _("Plugin has no unique ID field") << endmsg;
1107 boost::shared_ptr<Plugin> plugin = find_plugin (_session, prop->value(), type);
1109 /* treat linux and windows VST plugins equivalent if they have the same uniqueID
1110 * allow to move sessions windows <> linux */
1111 #ifdef LXVST_SUPPORT
1112 if (plugin == 0 && type == ARDOUR::Windows_VST) {
1113 type = ARDOUR::LXVST;
1114 plugin = find_plugin (_session, prop->value(), type);
1118 #ifdef WINDOWS_VST_SUPPORT
1119 if (plugin == 0 && type == ARDOUR::LXVST) {
1120 type = ARDOUR::Windows_VST;
1121 plugin = find_plugin (_session, prop->value(), type);
1126 error << string_compose(
1127 _("Found a reference to a plugin (\"%1\") that is unknown.\n"
1128 "Perhaps it was removed or moved since it was last used."),
1134 if (type == ARDOUR::Lua) {
1135 XMLNode *ls = node.child (plugin->state_node_name().c_str());
1136 // we need to load the script to set the name and parameters.
1137 boost::shared_ptr<LuaProc> lp = boost::dynamic_pointer_cast<LuaProc>(plugin);
1139 lp->set_script_from_state (*ls);
1143 // The name of the PluginInsert comes from the plugin, nothing else
1144 _name = plugin->get_info()->name;
1148 // Processor::set_state() will set this, but too late
1149 // for it to be available when setting up plugin
1150 // state. We can't call Processor::set_state() until
1151 // the plugins themselves are created and added.
1155 if (_plugins.empty()) {
1156 /* if we are adding the first plugin, we will need to set
1157 up automatable controls.
1159 add_plugin (plugin);
1160 create_automatable_parameters ();
1161 set_control_ids (node, version);
1164 if ((prop = node.property ("count")) != 0) {
1165 sscanf (prop->value().c_str(), "%u", &count);
1168 if (_plugins.size() != count) {
1169 for (uint32_t n = 1; n < count; ++n) {
1170 add_plugin (plugin_factory (plugin));
1174 Processor::set_state (node, version);
1176 PBD::ID new_id = this->id();
1177 PBD::ID old_id = this->id();
1179 if ((prop = node.property ("id")) != 0) {
1180 old_id = prop->value ();
1183 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1185 /* find the node with the type-specific node name ("lv2", "ladspa", etc)
1186 and set all plugins to the same state.
1189 if ((*niter)->name() == plugin->state_node_name()) {
1191 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1192 /* Plugin state can include external files which are named after the ID.
1194 * If regenerate_xml_or_string_ids() is set, the ID will already have
1195 * been changed, so we need to use the old ID from the XML to load the
1196 * state and then update the ID.
1198 * When copying a plugin-state, route_ui takes care of of updating the ID,
1199 * but we need to call set_insert_id() to clear the cached plugin-state
1200 * and force a change.
1202 if (!regenerate_xml_or_string_ids ()) {
1203 (*i)->set_insert_id (new_id);
1205 (*i)->set_insert_id (old_id);
1208 (*i)->set_state (**niter, version);
1210 if (regenerate_xml_or_string_ids ()) {
1211 (*i)->set_insert_id (new_id);
1219 if (version < 3000) {
1221 /* Only 2.X sessions need a call to set_parameter_state() - in 3.X and above
1222 this is all handled by Automatable
1225 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1226 if ((*niter)->name() == "Redirect") {
1227 /* XXX do we need to tackle placement? i think not (pd; oct 16 2009) */
1228 Processor::set_state (**niter, version);
1233 set_parameter_state_2X (node, version);
1236 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1240 (*i)->deactivate ();
1248 PluginInsert::update_id (PBD::ID id)
1251 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1252 (*i)->set_insert_id (id);
1257 PluginInsert::set_state_dir (const std::string& d)
1259 // state() only saves the state of the first plugin
1260 _plugins[0]->set_state_dir (d);
1264 PluginInsert::set_parameter_state_2X (const XMLNode& node, int version)
1266 XMLNodeList nlist = node.children();
1267 XMLNodeIterator niter;
1269 /* look for port automation node */
1271 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1273 if ((*niter)->name() != port_automation_node_name) {
1279 XMLNodeConstIterator iter;
1284 cnodes = (*niter)->children ("port");
1286 for (iter = cnodes.begin(); iter != cnodes.end(); ++iter){
1290 if ((cprop = child->property("number")) != 0) {
1291 port = cprop->value().c_str();
1293 warning << _("PluginInsert: Auto: no ladspa port number") << endmsg;
1297 sscanf (port, "%" PRIu32, &port_id);
1299 if (port_id >= _plugins[0]->parameter_count()) {
1300 warning << _("PluginInsert: Auto: port id out of range") << endmsg;
1304 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(
1305 control(Evoral::Parameter(PluginAutomation, 0, port_id), true));
1307 if (c && c->alist()) {
1308 if (!child->children().empty()) {
1309 c->alist()->set_state (*child->children().front(), version);
1311 /* In some cases 2.X saves lists with min_yval and max_yval
1312 being FLT_MIN and FLT_MAX respectively. This causes problems
1313 in A3 because these min/max values are used to compute
1314 where GUI control points should be drawn. If we see such
1315 values, `correct' them to the min/max of the appropriate
1319 float min_y = c->alist()->get_min_y ();
1320 float max_y = c->alist()->get_max_y ();
1322 ParameterDescriptor desc;
1323 _plugins.front()->get_parameter_descriptor (port_id, desc);
1325 if (min_y == FLT_MIN) {
1329 if (max_y == FLT_MAX) {
1333 c->alist()->set_yrange (min_y, max_y);
1336 error << string_compose (_("PluginInsert: automatable control %1 not found - ignored"), port_id) << endmsg;
1348 PluginInsert::describe_parameter (Evoral::Parameter param)
1350 if (param.type() == PluginAutomation) {
1351 return _plugins[0]->describe_parameter (param);
1352 } else if (param.type() == PluginPropertyAutomation) {
1353 boost::shared_ptr<AutomationControl> c(automation_control(param));
1354 if (c && !c->desc().label.empty()) {
1355 return c->desc().label;
1358 return Automatable::describe_parameter(param);
1362 PluginInsert::signal_latency() const
1364 if (_user_latency) {
1365 return _user_latency;
1368 return _plugins[0]->signal_latency ();
1372 PluginInsert::type ()
1374 return plugin()->get_info()->type;
1377 PluginInsert::PluginControl::PluginControl (PluginInsert* p,
1378 const Evoral::Parameter& param,
1379 const ParameterDescriptor& desc,
1380 boost::shared_ptr<AutomationList> list)
1381 : AutomationControl (p->session(), param, desc, list, p->describe_parameter(param))
1385 alist()->reset_default (desc.normal);
1387 list->set_interpolation(Evoral::ControlList::Discrete);
1392 set_flags(Controllable::Toggle);
1396 /** @param val `user' value */
1398 PluginInsert::PluginControl::set_value (double user_val, PBD::Controllable::GroupControlDisposition group_override)
1401 _set_value (user_val, group_override);
1405 PluginInsert::PluginControl::set_value_unchecked (double user_val)
1407 /* used only by automation playback */
1408 _set_value (user_val, Controllable::NoGroup);
1412 PluginInsert::PluginControl::_set_value (double user_val, PBD::Controllable::GroupControlDisposition group_override)
1414 /* FIXME: probably should be taking out some lock here.. */
1416 for (Plugins::iterator i = _plugin->_plugins.begin(); i != _plugin->_plugins.end(); ++i) {
1417 (*i)->set_parameter (_list->parameter().id(), user_val);
1420 boost::shared_ptr<Plugin> iasp = _plugin->_impulseAnalysisPlugin.lock();
1422 iasp->set_parameter (_list->parameter().id(), user_val);
1425 AutomationControl::set_value (user_val, group_override);
1429 PluginInsert::PluginControl::catch_up_with_external_value (double user_val)
1431 AutomationControl::set_value (user_val, Controllable::NoGroup);
1435 PluginInsert::PluginControl::get_state ()
1439 XMLNode& node (AutomationControl::get_state());
1440 ss << parameter().id();
1441 node.add_property (X_("parameter"), ss.str());
1443 boost::shared_ptr<LV2Plugin> lv2plugin = boost::dynamic_pointer_cast<LV2Plugin> (_plugin->_plugins[0]);
1445 node.add_property (X_("symbol"), lv2plugin->port_symbol (parameter().id()));
1452 /** @return `user' val */
1454 PluginInsert::PluginControl::get_value () const
1456 boost::shared_ptr<Plugin> plugin = _plugin->plugin (0);
1462 return plugin->get_parameter (_list->parameter().id());
1465 PluginInsert::PluginPropertyControl::PluginPropertyControl (PluginInsert* p,
1466 const Evoral::Parameter& param,
1467 const ParameterDescriptor& desc,
1468 boost::shared_ptr<AutomationList> list)
1469 : AutomationControl (p->session(), param, desc, list)
1473 alist()->set_yrange (desc.lower, desc.upper);
1474 alist()->reset_default (desc.normal);
1478 set_flags(Controllable::Toggle);
1483 PluginInsert::PluginPropertyControl::set_value (double user_val, PBD::Controllable::GroupControlDisposition /* group_override*/)
1486 set_value_unchecked (user_val);
1491 PluginInsert::PluginPropertyControl::set_value_unchecked (double user_val)
1493 /* Old numeric set_value(), coerce to appropriate datatype if possible.
1494 This is lossy, but better than nothing until Ardour's automation system
1495 can handle various datatypes all the way down. */
1496 const Variant value(_desc.datatype, user_val);
1497 if (value.type() == Variant::NOTHING) {
1498 error << "set_value(double) called for non-numeric property" << endmsg;
1502 for (Plugins::iterator i = _plugin->_plugins.begin(); i != _plugin->_plugins.end(); ++i) {
1503 (*i)->set_property(_list->parameter().id(), value);
1507 AutomationControl::set_value (user_val, Controllable::NoGroup);
1511 PluginInsert::PluginPropertyControl::get_state ()
1515 XMLNode& node (AutomationControl::get_state());
1516 ss << parameter().id();
1517 node.add_property (X_("property"), ss.str());
1518 node.remove_property (X_("value"));
1524 PluginInsert::PluginPropertyControl::get_value () const
1526 return _value.to_double();
1529 boost::shared_ptr<Plugin>
1530 PluginInsert::get_impulse_analysis_plugin()
1532 boost::shared_ptr<Plugin> ret;
1533 if (_impulseAnalysisPlugin.expired()) {
1534 ret = plugin_factory(_plugins[0]);
1535 ret->configure_io (input_streams (), output_streams ());
1536 _impulseAnalysisPlugin = ret;
1538 ret = _impulseAnalysisPlugin.lock();
1545 PluginInsert::collect_signal_for_analysis (framecnt_t nframes)
1547 // called from outside the audio thread, so this should be safe
1548 // only do audio as analysis is (currently) only for audio plugins
1549 _signal_analysis_inputs.ensure_buffers( DataType::AUDIO, input_streams().n_audio(), nframes);
1550 _signal_analysis_outputs.ensure_buffers( DataType::AUDIO, output_streams().n_audio(), nframes);
1552 _signal_analysis_collected_nframes = 0;
1553 _signal_analysis_collect_nframes_max = nframes;
1556 /** Add a plugin to our list */
1558 PluginInsert::add_plugin (boost::shared_ptr<Plugin> plugin)
1560 plugin->set_insert_id (this->id());
1562 if (_plugins.empty()) {
1563 /* first (and probably only) plugin instance - connect to relevant signals
1566 plugin->ParameterChangedExternally.connect_same_thread (*this, boost::bind (&PluginInsert::parameter_changed_externally, this, _1, _2));
1567 plugin->StartTouch.connect_same_thread (*this, boost::bind (&PluginInsert::start_touch, this, _1));
1568 plugin->EndTouch.connect_same_thread (*this, boost::bind (&PluginInsert::end_touch, this, _1));
1571 _plugins.push_back (plugin);
1575 PluginInsert::realtime_handle_transport_stopped ()
1577 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1578 (*i)->realtime_handle_transport_stopped ();
1583 PluginInsert::realtime_locate ()
1585 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1586 (*i)->realtime_locate ();
1591 PluginInsert::monitoring_changed ()
1593 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1594 (*i)->monitoring_changed ();
1599 PluginInsert::start_touch (uint32_t param_id)
1601 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id));
1603 ac->start_touch (session().audible_frame());
1608 PluginInsert::end_touch (uint32_t param_id)
1610 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id));
1612 ac->stop_touch (true, session().audible_frame());