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/plugin.h"
37 #include "ardour/plugin_insert.h"
40 #include "ardour/lv2_plugin.h"
43 #ifdef WINDOWS_VST_SUPPORT
44 #include "ardour/windows_vst_plugin.h"
48 #include "ardour/lxvst_plugin.h"
51 #ifdef AUDIOUNIT_SUPPORT
52 #include "ardour/audio_unit.h"
55 #include "ardour/session.h"
56 #include "ardour/types.h"
61 using namespace ARDOUR;
64 const string PluginInsert::port_automation_node_name = "PortAutomation";
66 PluginInsert::PluginInsert (Session& s, boost::shared_ptr<Plugin> plug)
67 : Processor (s, (plug ? plug->name() : string ("toBeRenamed")))
68 , _signal_analysis_collected_nframes(0)
69 , _signal_analysis_collect_nframes_max(0)
71 /* the first is the master */
75 create_automatable_parameters ();
80 PluginInsert::set_count (uint32_t num)
82 bool require_state = !_plugins.empty();
84 /* this is a bad idea.... we shouldn't do this while active.
85 only a route holding their redirect_lock should be calling this
90 } else if (num > _plugins.size()) {
91 uint32_t diff = num - _plugins.size();
93 for (uint32_t n = 0; n < diff; ++n) {
94 boost::shared_ptr<Plugin> p = plugin_factory (_plugins[0]);
101 /* XXX do something */
105 } else if (num < _plugins.size()) {
106 uint32_t diff = _plugins.size() - num;
107 for (uint32_t n= 0; n < diff; ++n) {
115 PluginInsert::~PluginInsert ()
120 PluginInsert::control_list_automation_state_changed (Evoral::Parameter which, AutoState s)
122 if (which.type() != PluginAutomation)
125 boost::shared_ptr<AutomationControl> c
126 = boost::dynamic_pointer_cast<AutomationControl>(control (which));
129 _plugins[0]->set_parameter (which.id(), c->list()->eval (_session.transport_frame()));
134 PluginInsert::output_streams() const
136 assert (!_plugins.empty());
138 PluginInfoPtr info = _plugins.front()->get_info();
140 if (info->reconfigurable_io()) {
141 ChanCount out = _plugins.front()->output_streams ();
142 // DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, reconfigur(able) output streams = %1\n", out));
145 ChanCount out = info->n_outputs;
146 // DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, static output streams = %1 for %2 plugins\n", out, _plugins.size()));
147 out.set_audio (out.n_audio() * _plugins.size());
148 out.set_midi (out.n_midi() * _plugins.size() + midi_bypass.n_midi());
154 PluginInsert::input_streams() const
156 assert (!_plugins.empty());
160 PluginInfoPtr info = _plugins.front()->get_info();
162 if (info->reconfigurable_io()) {
163 assert (_plugins.size() == 1);
164 in = _plugins.front()->input_streams();
169 DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, input streams = %1, match using %2\n", in, _match.method));
171 if (_match.method == Split) {
173 /* we are splitting 1 processor input to multiple plugin inputs,
174 so we have a maximum of 1 stream of each type.
176 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
177 if (in.get (*t) > 1) {
183 } else if (_match.method == Hide) {
185 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
186 in.set (*t, in.get (*t) - _match.hide.get (*t));
192 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
193 in.set (*t, in.get (*t) * _plugins.size ());
201 PluginInsert::natural_output_streams() const
203 return _plugins[0]->get_info()->n_outputs;
207 PluginInsert::natural_input_streams() const
209 return _plugins[0]->get_info()->n_inputs;
213 PluginInsert::has_no_inputs() const
215 return _plugins[0]->get_info()->n_inputs == ChanCount::ZERO;
219 PluginInsert::has_no_audio_inputs() const
221 return _plugins[0]->get_info()->n_inputs.n_audio() == 0;
225 PluginInsert::is_midi_instrument() const
227 /* XXX more finesse is possible here. VST plugins have a
228 a specific "instrument" flag, for example.
230 PluginInfoPtr pi = _plugins[0]->get_info();
232 return pi->n_inputs.n_midi() != 0 &&
233 pi->n_outputs.n_audio() > 0;
237 PluginInsert::create_automatable_parameters ()
239 assert (!_plugins.empty());
241 set<Evoral::Parameter> a = _plugins.front()->automatable ();
243 for (set<Evoral::Parameter>::iterator i = a.begin(); i != a.end(); ++i) {
244 if (i->type() == PluginAutomation) {
246 Evoral::Parameter param(*i);
248 ParameterDescriptor desc;
249 _plugins.front()->get_parameter_descriptor(i->id(), desc);
251 can_automate (param);
252 boost::shared_ptr<AutomationList> list(new AutomationList(param, desc));
253 add_control (boost::shared_ptr<AutomationControl> (new PluginControl(this, param, desc, list)));
254 } else if (i->type() == PluginPropertyAutomation) {
255 Evoral::Parameter param(*i);
256 const ParameterDescriptor& desc = _plugins.front()->get_property_descriptor(param.id());
257 if (desc.datatype != Variant::NOTHING) {
258 boost::shared_ptr<AutomationList> list;
259 if (Variant::type_is_numeric(desc.datatype)) {
260 list = boost::shared_ptr<AutomationList>(new AutomationList(param, desc));
262 add_control (boost::shared_ptr<AutomationControl> (new PluginPropertyControl(this, param, desc, list)));
267 /** Called when something outside of this host has modified a plugin
268 * parameter. Responsible for propagating the change to two places:
270 * 1) anything listening to the Control itself
271 * 2) any replicated plugins that make up this PluginInsert.
273 * The PluginInsert is connected to the ParameterChangedExternally signal for
274 * the first (primary) plugin, and here broadcasts that change to any others.
276 * XXX We should probably drop this whole replication idea (Paul, October 2015)
277 * since it isn't used by sensible plugin APIs (AU, LV2).
280 PluginInsert::parameter_changed_externally (uint32_t which, float val)
282 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, which));
284 /* First propagation: alter the underlying value of the control,
285 * without telling the plugin(s) that own/use it to set it.
292 boost::shared_ptr<PluginControl> pc = boost::dynamic_pointer_cast<PluginControl> (ac);
295 pc->catch_up_with_external_value (val);
298 /* Second propagation: tell all plugins except the first to
299 update the value of this parameter. For sane plugin APIs,
300 there are no other plugins, so this is a no-op in those
304 Plugins::iterator i = _plugins.begin();
306 /* don't set the first plugin, just all the slaves */
308 if (i != _plugins.end()) {
310 for (; i != _plugins.end(); ++i) {
311 (*i)->set_parameter (which, val);
317 PluginInsert::set_block_size (pframes_t nframes)
320 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
321 if ((*i)->set_block_size (nframes) != 0) {
329 PluginInsert::activate ()
331 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
335 Processor::activate ();
339 PluginInsert::deactivate ()
341 Processor::deactivate ();
343 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
349 PluginInsert::flush ()
351 for (vector<boost::shared_ptr<Plugin> >::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
357 PluginInsert::connect_and_run (BufferSet& bufs, pframes_t nframes, framecnt_t offset, bool with_auto, framepos_t now)
359 // Calculate if, and how many frames we need to collect for analysis
360 framecnt_t collect_signal_nframes = (_signal_analysis_collect_nframes_max -
361 _signal_analysis_collected_nframes);
362 if (nframes < collect_signal_nframes) { // we might not get all frames now
363 collect_signal_nframes = nframes;
366 ChanCount const in_streams = input_streams ();
367 ChanCount const out_streams = output_streams ();
369 ChanMapping in_map (in_streams);
370 ChanMapping out_map (out_streams);
372 if (_match.method == Split) {
373 /* fix the input mapping so that we have maps for each of the plugin's inputs */
374 in_map = ChanMapping (natural_input_streams ());
376 /* copy the first stream's buffer contents to the others */
377 /* XXX: audio only */
378 uint32_t first_idx = in_map.get (DataType::AUDIO, 0, &valid);
380 for (uint32_t i = in_streams.n_audio(); i < natural_input_streams().n_audio(); ++i) {
381 bufs.get_audio(in_map.get (DataType::AUDIO, i, &valid)).read_from(bufs.get_audio(first_idx), nframes, offset, offset);
386 bufs.set_count(ChanCount::max(bufs.count(), in_streams));
387 bufs.set_count(ChanCount::max(bufs.count(), out_streams));
389 /* Note that we've already required that plugins
390 be able to handle in-place processing.
397 for (Controls::iterator li = controls().begin(); li != controls().end(); ++li, ++n) {
399 boost::shared_ptr<AutomationControl> c
400 = boost::dynamic_pointer_cast<AutomationControl>(li->second);
402 if (c->list() && c->automation_playback()) {
405 const float val = c->list()->rt_safe_eval (now, valid);
408 /* This is the ONLY place where we are
410 * AutomationControl::set_value_unchecked(). We
411 * know that the control is in
412 * automation playback mode, so no
413 * check on writable() is required
414 * (which must be done in AutomationControl::set_value()
417 c->set_value_unchecked(val);
424 if (collect_signal_nframes > 0) {
426 //std::cerr << "collect input, bufs " << bufs.count().n_audio() << " count, " << bufs.available().n_audio() << " available" << std::endl;
427 //std::cerr << " streams " << input_streams().n_audio() << std::endl;
428 //std::cerr << "filling buffer with " << collect_signal_nframes << " frames at " << _signal_analysis_collected_nframes << std::endl;
430 _signal_analysis_inputs.set_count(input_streams());
432 for (uint32_t i = 0; i < input_streams().n_audio(); ++i) {
433 _signal_analysis_inputs.get_audio(i).read_from(
435 collect_signal_nframes,
436 _signal_analysis_collected_nframes); // offset is for target buffer
441 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
442 if ((*i)->connect_and_run(bufs, in_map, out_map, nframes, offset)) {
445 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
446 in_map.offset_to(*t, natural_input_streams().get(*t));
447 out_map.offset_to(*t, natural_output_streams().get(*t));
451 if (collect_signal_nframes > 0) {
453 //std::cerr << " output, bufs " << bufs.count().n_audio() << " count, " << bufs.available().n_audio() << " available" << std::endl;
454 //std::cerr << " streams " << output_streams().n_audio() << std::endl;
456 _signal_analysis_outputs.set_count(output_streams());
458 for (uint32_t i = 0; i < output_streams().n_audio(); ++i) {
459 _signal_analysis_outputs.get_audio(i).read_from(
461 collect_signal_nframes,
462 _signal_analysis_collected_nframes); // offset is for target buffer
465 _signal_analysis_collected_nframes += collect_signal_nframes;
466 assert(_signal_analysis_collected_nframes <= _signal_analysis_collect_nframes_max);
468 if (_signal_analysis_collected_nframes == _signal_analysis_collect_nframes_max) {
469 _signal_analysis_collect_nframes_max = 0;
470 _signal_analysis_collected_nframes = 0;
472 AnalysisDataGathered(&_signal_analysis_inputs,
473 &_signal_analysis_outputs);
476 /* leave remaining channel buffers alone */
480 PluginInsert::silence (framecnt_t nframes)
486 ChanMapping in_map(input_streams());
487 ChanMapping out_map(output_streams());
489 if (_match.method == Split) {
490 /* fix the input mapping so that we have maps for each of the plugin's inputs */
491 in_map = ChanMapping (natural_input_streams ());
494 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
495 (*i)->connect_and_run (_session.get_scratch_buffers ((*i)->get_info()->n_inputs, true), in_map, out_map, nframes, 0);
500 PluginInsert::run (BufferSet& bufs, framepos_t start_frame, framepos_t /*end_frame*/, pframes_t nframes, bool)
502 if (_pending_active) {
503 /* run as normal if we are active or moving from inactive to active */
505 if (_session.transport_rolling() || _session.bounce_processing()) {
506 automation_run (bufs, start_frame, nframes);
508 connect_and_run (bufs, nframes, 0, false);
512 uint32_t in = input_streams ().n_audio ();
513 uint32_t out = output_streams().n_audio ();
515 if (has_no_audio_inputs() || in == 0) {
517 /* silence all (audio) outputs. Should really declick
518 * at the transitions of "active"
521 for (uint32_t n = 0; n < out; ++n) {
522 bufs.get_audio (n).silence (nframes);
525 } else if (out > in) {
527 /* not active, but something has make up for any channel count increase */
529 // TODO: option round-robin (n % in) or silence additional buffers ??
530 // for now , simply replicate last buffer
531 for (uint32_t n = in; n < out; ++n) {
532 bufs.get_audio(n).read_from(bufs.get_audio(in - 1), nframes);
536 bufs.count().set_audio (out);
539 _active = _pending_active;
541 /* we have no idea whether the plugin generated silence or not, so mark
542 * all buffers appropriately.
548 PluginInsert::automation_run (BufferSet& bufs, framepos_t start, pframes_t nframes)
550 Evoral::ControlEvent next_event (0, 0.0f);
551 framepos_t now = start;
552 framepos_t end = now + nframes;
553 framecnt_t offset = 0;
555 Glib::Threads::Mutex::Lock lm (control_lock(), Glib::Threads::TRY_LOCK);
558 connect_and_run (bufs, nframes, offset, false);
562 if (!find_next_event (now, end, next_event) || requires_fixed_sized_buffers()) {
564 /* no events have a time within the relevant range */
566 connect_and_run (bufs, nframes, offset, true, now);
572 framecnt_t cnt = min (((framecnt_t) ceil (next_event.when) - now), (framecnt_t) nframes);
574 connect_and_run (bufs, cnt, offset, true, now);
580 if (!find_next_event (now, end, next_event)) {
585 /* cleanup anything that is left to do */
588 connect_and_run (bufs, nframes, offset, true, now);
593 PluginInsert::default_parameter_value (const Evoral::Parameter& param)
595 if (param.type() != PluginAutomation)
598 if (_plugins.empty()) {
599 fatal << _("programming error: ") << X_("PluginInsert::default_parameter_value() called with no plugin")
601 abort(); /*NOTREACHED*/
604 return _plugins[0]->default_value (param.id());
609 PluginInsert::can_reset_all_parameters ()
613 for (uint32_t par = 0; par < _plugins[0]->parameter_count(); ++par) {
615 const uint32_t cid = _plugins[0]->nth_parameter (par, ok);
617 if (!ok || !_plugins[0]->parameter_is_input(cid)) {
621 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, cid));
627 if (ac->automation_state() & Play) {
632 return all && (params > 0);
636 PluginInsert::reset_parameters_to_default ()
640 for (uint32_t par = 0; par < _plugins[0]->parameter_count(); ++par) {
642 const uint32_t cid = _plugins[0]->nth_parameter (par, ok);
644 if (!ok || !_plugins[0]->parameter_is_input(cid)) {
648 const float dflt = _plugins[0]->default_value (cid);
649 const float curr = _plugins[0]->get_parameter (cid);
655 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, cid));
660 if (ac->automation_state() & Play) {
665 ac->set_value (dflt, Controllable::NoGroup);
670 boost::shared_ptr<Plugin>
671 PluginInsert::plugin_factory (boost::shared_ptr<Plugin> other)
673 boost::shared_ptr<LadspaPlugin> lp;
675 boost::shared_ptr<LV2Plugin> lv2p;
677 #ifdef WINDOWS_VST_SUPPORT
678 boost::shared_ptr<WindowsVSTPlugin> vp;
681 boost::shared_ptr<LXVSTPlugin> lxvp;
683 #ifdef AUDIOUNIT_SUPPORT
684 boost::shared_ptr<AUPlugin> ap;
687 if ((lp = boost::dynamic_pointer_cast<LadspaPlugin> (other)) != 0) {
688 return boost::shared_ptr<Plugin> (new LadspaPlugin (*lp));
690 } else if ((lv2p = boost::dynamic_pointer_cast<LV2Plugin> (other)) != 0) {
691 return boost::shared_ptr<Plugin> (new LV2Plugin (*lv2p));
693 #ifdef WINDOWS_VST_SUPPORT
694 } else if ((vp = boost::dynamic_pointer_cast<WindowsVSTPlugin> (other)) != 0) {
695 return boost::shared_ptr<Plugin> (new WindowsVSTPlugin (*vp));
698 } else if ((lxvp = boost::dynamic_pointer_cast<LXVSTPlugin> (other)) != 0) {
699 return boost::shared_ptr<Plugin> (new LXVSTPlugin (*lxvp));
701 #ifdef AUDIOUNIT_SUPPORT
702 } else if ((ap = boost::dynamic_pointer_cast<AUPlugin> (other)) != 0) {
703 return boost::shared_ptr<Plugin> (new AUPlugin (*ap));
707 fatal << string_compose (_("programming error: %1"),
708 X_("unknown plugin type in PluginInsert::plugin_factory"))
710 abort(); /*NOTREACHED*/
711 return boost::shared_ptr<Plugin> ((Plugin*) 0);
715 PluginInsert::configure_io (ChanCount in, ChanCount out)
717 Match old_match = _match;
718 ChanCount old_in = input_streams ();
719 ChanCount old_out = output_streams ();
722 _configured_out = out;
724 /* set the matching method and number of plugins that we will use to meet this configuration */
725 _match = private_can_support_io_configuration (in, out);
726 if (set_count (_match.plugins) == false) {
727 PluginIoReConfigure (); /* EMIT SIGNAL */
731 /* configure plugins */
732 switch (_match.method) {
735 if (_plugins.front()->configure_io (_plugins.front()->get_info()->n_inputs, out) == false) {
736 PluginIoReConfigure (); /* EMIT SIGNAL */
742 if (_plugins.front()->configure_io (in, out) == false) {
743 PluginIoReConfigure (); /* EMIT SIGNAL */
749 if ( (old_match.method != _match.method && (old_match.method == Split || _match.method == Split))
754 PluginIoReConfigure (); /* EMIT SIGNAL */
757 // we don't know the analysis window size, so we must work with the
758 // current buffer size here. each request for data fills in these
759 // buffers and the analyser makes sure it gets enough data for the
761 session().ensure_buffer_set (_signal_analysis_inputs, in);
762 //_signal_analysis_inputs.set_count (in);
764 session().ensure_buffer_set (_signal_analysis_outputs, out);
765 //_signal_analysis_outputs.set_count (out);
767 // std::cerr << "set counts to i" << in.n_audio() << "/o" << out.n_audio() << std::endl;
769 return Processor::configure_io (in, out);
772 /** Decide whether this PluginInsert can support a given IO configuration.
773 * To do this, we run through a set of possible solutions in rough order of
776 * @param in Required input channel count.
777 * @param out Filled in with the output channel count if we return true.
778 * @return true if the given IO configuration can be supported.
781 PluginInsert::can_support_io_configuration (const ChanCount& in, ChanCount& out)
783 return private_can_support_io_configuration (in, out).method != Impossible;
786 /** A private version of can_support_io_configuration which returns the method
787 * by which the configuration can be matched, rather than just whether or not
791 PluginInsert::private_can_support_io_configuration (ChanCount const & inx, ChanCount& out)
793 if (_plugins.empty()) {
797 PluginInfoPtr info = _plugins.front()->get_info();
798 ChanCount in; in += inx;
801 if (info->reconfigurable_io()) {
802 /* Plugin has flexible I/O, so delegate to it */
803 bool const r = _plugins.front()->can_support_io_configuration (in, out);
805 return Match (Impossible, 0);
808 return Match (Delegate, 1);
811 ChanCount inputs = info->n_inputs;
812 ChanCount outputs = info->n_outputs;
814 if (in.get(DataType::MIDI) == 1 && outputs.get(DataType::MIDI) == 0) {
815 DEBUG_TRACE ( DEBUG::Processors, string_compose ("bypassing midi-data around %1\n", name()));
816 midi_bypass.set(DataType::MIDI, 1);
818 if (in.get(DataType::MIDI) == 1 && inputs.get(DataType::MIDI) == 0) {
819 DEBUG_TRACE ( DEBUG::Processors, string_compose ("hiding midi-port from plugin %1\n", name()));
820 in.set(DataType::MIDI, 0);
823 bool no_inputs = true;
824 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
825 if (inputs.get (*t) != 0) {
832 /* no inputs so we can take any input configuration since we throw it away */
833 out = outputs + midi_bypass;
834 return Match (NoInputs, 1);
837 /* Plugin inputs match requested inputs exactly */
839 out = outputs + midi_bypass;
840 return Match (ExactMatch, 1);
843 /* We may be able to run more than one copy of the plugin within this insert
844 to cope with the insert having more inputs than the plugin.
845 We allow replication only for plugins with either zero or 1 inputs and outputs
846 for every valid data type.
850 bool can_replicate = true;
851 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
853 uint32_t nin = inputs.get (*t);
855 // No inputs of this type
856 if (nin == 0 && in.get(*t) == 0) {
860 if (nin != 1 || outputs.get (*t) != 1) {
861 can_replicate = false;
865 // Potential factor not set yet
867 f = in.get(*t) / nin;
870 // Factor for this type does not match another type, can not replicate
871 if (f != (in.get(*t) / nin)) {
872 can_replicate = false;
878 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
879 out.set (*t, outputs.get(*t) * f);
882 return Match (Replicate, f);
885 /* If the processor has exactly one input of a given type, and
886 the plugin has more, we can feed the single processor input
887 to some or all of the plugin inputs. This is rather
888 special-case-y, but the 1-to-many case is by far the
889 simplest. How do I split thy 2 processor inputs to 3
890 plugin inputs? Let me count the ways ...
893 bool can_split = true;
894 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
896 bool const can_split_type = (in.get (*t) == 1 && inputs.get (*t) > 1);
897 bool const nothing_to_do_for_type = (in.get (*t) == 0 && inputs.get (*t) == 0);
899 if (!can_split_type && !nothing_to_do_for_type) {
905 out = outputs + midi_bypass;
906 return Match (Split, 1);
909 /* If the plugin has more inputs than we want, we can `hide' some of them
910 by feeding them silence.
913 bool could_hide = false;
914 bool cannot_hide = false;
915 ChanCount hide_channels;
917 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
918 if (inputs.get(*t) > in.get(*t)) {
919 /* there is potential to hide, since the plugin has more inputs of type t than the insert */
920 hide_channels.set (*t, inputs.get(*t) - in.get(*t));
922 } else if (inputs.get(*t) < in.get(*t)) {
923 /* we definitely cannot hide, since the plugin has fewer inputs of type t than the insert */
928 if (could_hide && !cannot_hide) {
929 out = outputs + midi_bypass;
930 return Match (Hide, 1, hide_channels);
934 return Match (Impossible, 0);
938 PluginInsert::get_state ()
944 PluginInsert::state (bool full)
946 XMLNode& node = Processor::state (full);
948 node.add_property("type", _plugins[0]->state_node_name());
949 node.add_property("unique-id", _plugins[0]->unique_id());
950 node.add_property("count", string_compose("%1", _plugins.size()));
952 /* remember actual i/o configuration (for later placeholder
953 * in case the plugin goes missing) */
954 node.add_child_nocopy (* _configured_in.state (X_("ConfiguredInput")));
955 node.add_child_nocopy (* _configured_out.state (X_("ConfiguredOutput")));
957 _plugins[0]->set_insert_id(this->id());
958 node.add_child_nocopy (_plugins[0]->get_state());
960 for (Controls::iterator c = controls().begin(); c != controls().end(); ++c) {
961 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> ((*c).second);
963 node.add_child_nocopy (ac->get_state());
971 PluginInsert::set_control_ids (const XMLNode& node, int version)
973 const XMLNodeList& nlist = node.children();
974 XMLNodeConstIterator iter;
975 set<Evoral::Parameter>::const_iterator p;
977 for (iter = nlist.begin(); iter != nlist.end(); ++iter) {
978 if ((*iter)->name() == Controllable::xml_node_name) {
979 const XMLProperty* prop;
981 uint32_t p = (uint32_t)-1;
983 if ((prop = (*iter)->property (X_("symbol"))) != 0) {
984 boost::shared_ptr<LV2Plugin> lv2plugin = boost::dynamic_pointer_cast<LV2Plugin> (_plugins[0]);
986 p = lv2plugin->port_index(prop->value().c_str());
990 if (p == (uint32_t)-1 && (prop = (*iter)->property (X_("parameter"))) != 0) {
991 p = atoi (prop->value());
994 if (p != (uint32_t)-1) {
996 /* this may create the new controllable */
998 boost::shared_ptr<Evoral::Control> c = control (Evoral::Parameter (PluginAutomation, 0, p));
1000 #ifndef NO_PLUGIN_STATE
1004 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> (c);
1006 ac->set_state (**iter, version);
1015 PluginInsert::set_state(const XMLNode& node, int version)
1017 XMLNodeList nlist = node.children();
1018 XMLNodeIterator niter;
1019 XMLPropertyList plist;
1020 const XMLProperty *prop;
1021 ARDOUR::PluginType type;
1023 if ((prop = node.property ("type")) == 0) {
1024 error << _("XML node describing plugin is missing the `type' field") << endmsg;
1028 if (prop->value() == X_("ladspa") || prop->value() == X_("Ladspa")) { /* handle old school sessions */
1029 type = ARDOUR::LADSPA;
1030 } else if (prop->value() == X_("lv2")) {
1032 } else if (prop->value() == X_("windows-vst")) {
1033 type = ARDOUR::Windows_VST;
1034 } else if (prop->value() == X_("lxvst")) {
1035 type = ARDOUR::LXVST;
1036 } else if (prop->value() == X_("audiounit")) {
1037 type = ARDOUR::AudioUnit;
1039 error << string_compose (_("unknown plugin type %1 in plugin insert state"),
1045 prop = node.property ("unique-id");
1048 #ifdef WINDOWS_VST_SUPPORT
1049 /* older sessions contain VST plugins with only an "id" field.
1052 if (type == ARDOUR::Windows_VST) {
1053 prop = node.property ("id");
1057 #ifdef LXVST_SUPPORT
1058 /*There shouldn't be any older sessions with linuxVST support.. but anyway..*/
1060 if (type == ARDOUR::LXVST) {
1061 prop = node.property ("id");
1067 error << _("Plugin has no unique ID field") << endmsg;
1072 boost::shared_ptr<Plugin> plugin = find_plugin (_session, prop->value(), type);
1074 /* treat linux and windows VST plugins equivalent if they have the same uniqueID
1075 * allow to move sessions windows <> linux */
1076 #ifdef LXVST_SUPPORT
1077 if (plugin == 0 && type == ARDOUR::Windows_VST) {
1078 type = ARDOUR::LXVST;
1079 plugin = find_plugin (_session, prop->value(), type);
1083 #ifdef WINDOWS_VST_SUPPORT
1084 if (plugin == 0 && type == ARDOUR::LXVST) {
1085 type = ARDOUR::Windows_VST;
1086 plugin = find_plugin (_session, prop->value(), type);
1091 error << string_compose(
1092 _("Found a reference to a plugin (\"%1\") that is unknown.\n"
1093 "Perhaps it was removed or moved since it was last used."),
1099 // The name of the PluginInsert comes from the plugin, nothing else
1100 _name = plugin->get_info()->name;
1104 // Processor::set_state() will set this, but too late
1105 // for it to be available when setting up plugin
1106 // state. We can't call Processor::set_state() until
1107 // the plugins themselves are created and added.
1111 if (_plugins.empty()) {
1112 /* if we are adding the first plugin, we will need to set
1113 up automatable controls.
1115 add_plugin (plugin);
1116 create_automatable_parameters ();
1117 set_control_ids (node, version);
1120 if ((prop = node.property ("count")) != 0) {
1121 sscanf (prop->value().c_str(), "%u", &count);
1124 if (_plugins.size() != count) {
1125 for (uint32_t n = 1; n < count; ++n) {
1126 add_plugin (plugin_factory (plugin));
1130 Processor::set_state (node, version);
1132 PBD::ID new_id = this->id();
1133 PBD::ID old_id = this->id();
1135 if ((prop = node.property ("id")) != 0) {
1136 old_id = prop->value ();
1139 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1141 /* find the node with the type-specific node name ("lv2", "ladspa", etc)
1142 and set all plugins to the same state.
1145 if ((*niter)->name() == plugin->state_node_name()) {
1147 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1148 /* Plugin state can include external files which are named after the ID.
1150 * If regenerate_xml_or_string_ids() is set, the ID will already have
1151 * been changed, so we need to use the old ID from the XML to load the
1152 * state and then update the ID.
1154 * When copying a plugin-state, route_ui takes care of of updating the ID,
1155 * but we need to call set_insert_id() to clear the cached plugin-state
1156 * and force a change.
1158 if (!regenerate_xml_or_string_ids ()) {
1159 (*i)->set_insert_id (new_id);
1161 (*i)->set_insert_id (old_id);
1164 (*i)->set_state (**niter, version);
1166 if (regenerate_xml_or_string_ids ()) {
1167 (*i)->set_insert_id (new_id);
1175 if (version < 3000) {
1177 /* Only 2.X sessions need a call to set_parameter_state() - in 3.X and above
1178 this is all handled by Automatable
1181 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1182 if ((*niter)->name() == "Redirect") {
1183 /* XXX do we need to tackle placement? i think not (pd; oct 16 2009) */
1184 Processor::set_state (**niter, version);
1189 set_parameter_state_2X (node, version);
1192 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1196 (*i)->deactivate ();
1204 PluginInsert::update_id (PBD::ID id)
1207 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1208 (*i)->set_insert_id (id);
1213 PluginInsert::set_state_dir (const std::string& d)
1215 // state() only saves the state of the first plugin
1216 _plugins[0]->set_state_dir (d);
1220 PluginInsert::set_parameter_state_2X (const XMLNode& node, int version)
1222 XMLNodeList nlist = node.children();
1223 XMLNodeIterator niter;
1225 /* look for port automation node */
1227 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1229 if ((*niter)->name() != port_automation_node_name) {
1235 XMLNodeConstIterator iter;
1240 cnodes = (*niter)->children ("port");
1242 for (iter = cnodes.begin(); iter != cnodes.end(); ++iter){
1246 if ((cprop = child->property("number")) != 0) {
1247 port = cprop->value().c_str();
1249 warning << _("PluginInsert: Auto: no ladspa port number") << endmsg;
1253 sscanf (port, "%" PRIu32, &port_id);
1255 if (port_id >= _plugins[0]->parameter_count()) {
1256 warning << _("PluginInsert: Auto: port id out of range") << endmsg;
1260 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(
1261 control(Evoral::Parameter(PluginAutomation, 0, port_id), true));
1263 if (c && c->alist()) {
1264 if (!child->children().empty()) {
1265 c->alist()->set_state (*child->children().front(), version);
1267 /* In some cases 2.X saves lists with min_yval and max_yval
1268 being FLT_MIN and FLT_MAX respectively. This causes problems
1269 in A3 because these min/max values are used to compute
1270 where GUI control points should be drawn. If we see such
1271 values, `correct' them to the min/max of the appropriate
1275 float min_y = c->alist()->get_min_y ();
1276 float max_y = c->alist()->get_max_y ();
1278 ParameterDescriptor desc;
1279 _plugins.front()->get_parameter_descriptor (port_id, desc);
1281 if (min_y == FLT_MIN) {
1285 if (max_y == FLT_MAX) {
1289 c->alist()->set_yrange (min_y, max_y);
1292 error << string_compose (_("PluginInsert: automatable control %1 not found - ignored"), port_id) << endmsg;
1304 PluginInsert::describe_parameter (Evoral::Parameter param)
1306 if (param.type() == PluginAutomation) {
1307 return _plugins[0]->describe_parameter (param);
1308 } else if (param.type() == PluginPropertyAutomation) {
1309 boost::shared_ptr<AutomationControl> c(automation_control(param));
1310 if (c && !c->desc().label.empty()) {
1311 return c->desc().label;
1314 return Automatable::describe_parameter(param);
1318 PluginInsert::signal_latency() const
1320 if (_user_latency) {
1321 return _user_latency;
1324 return _plugins[0]->signal_latency ();
1328 PluginInsert::type ()
1330 return plugin()->get_info()->type;
1333 PluginInsert::PluginControl::PluginControl (PluginInsert* p,
1334 const Evoral::Parameter& param,
1335 const ParameterDescriptor& desc,
1336 boost::shared_ptr<AutomationList> list)
1337 : AutomationControl (p->session(), param, desc, list, p->describe_parameter(param))
1341 alist()->reset_default (desc.normal);
1343 list->set_interpolation(Evoral::ControlList::Discrete);
1348 set_flags(Controllable::Toggle);
1352 /** @param val `user' value */
1354 PluginInsert::PluginControl::set_value (double user_val, PBD::Controllable::GroupControlDisposition group_override)
1357 _set_value (user_val, group_override);
1361 PluginInsert::PluginControl::set_value_unchecked (double user_val)
1363 /* used only by automation playback */
1364 _set_value (user_val, Controllable::NoGroup);
1368 PluginInsert::PluginControl::_set_value (double user_val, PBD::Controllable::GroupControlDisposition group_override)
1370 /* FIXME: probably should be taking out some lock here.. */
1372 for (Plugins::iterator i = _plugin->_plugins.begin(); i != _plugin->_plugins.end(); ++i) {
1373 (*i)->set_parameter (_list->parameter().id(), user_val);
1376 boost::shared_ptr<Plugin> iasp = _plugin->_impulseAnalysisPlugin.lock();
1378 iasp->set_parameter (_list->parameter().id(), user_val);
1381 AutomationControl::set_value (user_val, group_override);
1385 PluginInsert::PluginControl::catch_up_with_external_value (double user_val)
1387 AutomationControl::set_value (user_val, Controllable::NoGroup);
1391 PluginInsert::PluginControl::get_state ()
1395 XMLNode& node (AutomationControl::get_state());
1396 ss << parameter().id();
1397 node.add_property (X_("parameter"), ss.str());
1399 boost::shared_ptr<LV2Plugin> lv2plugin = boost::dynamic_pointer_cast<LV2Plugin> (_plugin->_plugins[0]);
1401 node.add_property (X_("symbol"), lv2plugin->port_symbol (parameter().id()));
1408 /** @return `user' val */
1410 PluginInsert::PluginControl::get_value () const
1412 boost::shared_ptr<Plugin> plugin = _plugin->plugin (0);
1418 return plugin->get_parameter (_list->parameter().id());
1421 PluginInsert::PluginPropertyControl::PluginPropertyControl (PluginInsert* p,
1422 const Evoral::Parameter& param,
1423 const ParameterDescriptor& desc,
1424 boost::shared_ptr<AutomationList> list)
1425 : AutomationControl (p->session(), param, desc, list)
1429 alist()->set_yrange (desc.lower, desc.upper);
1430 alist()->reset_default (desc.normal);
1434 set_flags(Controllable::Toggle);
1439 PluginInsert::PluginPropertyControl::set_value (double user_val, PBD::Controllable::GroupControlDisposition /* group_override*/)
1442 set_value_unchecked (user_val);
1447 PluginInsert::PluginPropertyControl::set_value_unchecked (double user_val)
1449 /* Old numeric set_value(), coerce to appropriate datatype if possible.
1450 This is lossy, but better than nothing until Ardour's automation system
1451 can handle various datatypes all the way down. */
1452 const Variant value(_desc.datatype, user_val);
1453 if (value.type() == Variant::NOTHING) {
1454 error << "set_value(double) called for non-numeric property" << endmsg;
1458 for (Plugins::iterator i = _plugin->_plugins.begin(); i != _plugin->_plugins.end(); ++i) {
1459 (*i)->set_property(_list->parameter().id(), value);
1463 AutomationControl::set_value (user_val, Controllable::NoGroup);
1467 PluginInsert::PluginPropertyControl::get_state ()
1471 XMLNode& node (AutomationControl::get_state());
1472 ss << parameter().id();
1473 node.add_property (X_("property"), ss.str());
1474 node.remove_property (X_("value"));
1480 PluginInsert::PluginPropertyControl::get_value () const
1482 return _value.to_double();
1485 boost::shared_ptr<Plugin>
1486 PluginInsert::get_impulse_analysis_plugin()
1488 boost::shared_ptr<Plugin> ret;
1489 if (_impulseAnalysisPlugin.expired()) {
1490 ret = plugin_factory(_plugins[0]);
1491 ret->configure_io (input_streams (), output_streams ());
1492 _impulseAnalysisPlugin = ret;
1494 ret = _impulseAnalysisPlugin.lock();
1501 PluginInsert::collect_signal_for_analysis (framecnt_t nframes)
1503 // called from outside the audio thread, so this should be safe
1504 // only do audio as analysis is (currently) only for audio plugins
1505 _signal_analysis_inputs.ensure_buffers( DataType::AUDIO, input_streams().n_audio(), nframes);
1506 _signal_analysis_outputs.ensure_buffers( DataType::AUDIO, output_streams().n_audio(), nframes);
1508 _signal_analysis_collected_nframes = 0;
1509 _signal_analysis_collect_nframes_max = nframes;
1512 /** Add a plugin to our list */
1514 PluginInsert::add_plugin (boost::shared_ptr<Plugin> plugin)
1516 plugin->set_insert_id (this->id());
1518 if (_plugins.empty()) {
1519 /* first (and probably only) plugin instance - connect to relevant signals
1522 plugin->ParameterChangedExternally.connect_same_thread (*this, boost::bind (&PluginInsert::parameter_changed_externally, this, _1, _2));
1523 plugin->StartTouch.connect_same_thread (*this, boost::bind (&PluginInsert::start_touch, this, _1));
1524 plugin->EndTouch.connect_same_thread (*this, boost::bind (&PluginInsert::end_touch, this, _1));
1527 _plugins.push_back (plugin);
1531 PluginInsert::realtime_handle_transport_stopped ()
1533 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1534 (*i)->realtime_handle_transport_stopped ();
1539 PluginInsert::realtime_locate ()
1541 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1542 (*i)->realtime_locate ();
1547 PluginInsert::monitoring_changed ()
1549 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1550 (*i)->monitoring_changed ();
1555 PluginInsert::start_touch (uint32_t param_id)
1557 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id));
1559 ac->start_touch (session().audible_frame());
1564 PluginInsert::end_touch (uint32_t param_id)
1566 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id));
1568 ac->stop_touch (true, session().audible_frame());