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);
415 if (collect_signal_nframes > 0) {
417 //std::cerr << "collect input, bufs " << bufs.count().n_audio() << " count, " << bufs.available().n_audio() << " available" << std::endl;
418 //std::cerr << " streams " << input_streams().n_audio() << std::endl;
419 //std::cerr << "filling buffer with " << collect_signal_nframes << " frames at " << _signal_analysis_collected_nframes << std::endl;
421 _signal_analysis_inputs.set_count(input_streams());
423 for (uint32_t i = 0; i < input_streams().n_audio(); ++i) {
424 _signal_analysis_inputs.get_audio(i).read_from(
426 collect_signal_nframes,
427 _signal_analysis_collected_nframes); // offset is for target buffer
432 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
433 (*i)->connect_and_run(bufs, in_map, out_map, nframes, offset);
434 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
435 in_map.offset_to(*t, natural_input_streams().get(*t));
436 out_map.offset_to(*t, natural_output_streams().get(*t));
440 if (collect_signal_nframes > 0) {
442 //std::cerr << " output, bufs " << bufs.count().n_audio() << " count, " << bufs.available().n_audio() << " available" << std::endl;
443 //std::cerr << " streams " << output_streams().n_audio() << std::endl;
445 _signal_analysis_outputs.set_count(output_streams());
447 for (uint32_t i = 0; i < output_streams().n_audio(); ++i) {
448 _signal_analysis_outputs.get_audio(i).read_from(
450 collect_signal_nframes,
451 _signal_analysis_collected_nframes); // offset is for target buffer
454 _signal_analysis_collected_nframes += collect_signal_nframes;
455 assert(_signal_analysis_collected_nframes <= _signal_analysis_collect_nframes_max);
457 if (_signal_analysis_collected_nframes == _signal_analysis_collect_nframes_max) {
458 _signal_analysis_collect_nframes_max = 0;
459 _signal_analysis_collected_nframes = 0;
461 AnalysisDataGathered(&_signal_analysis_inputs,
462 &_signal_analysis_outputs);
465 /* leave remaining channel buffers alone */
469 PluginInsert::silence (framecnt_t nframes)
475 ChanMapping in_map(input_streams());
476 ChanMapping out_map(output_streams());
478 if (_match.method == Split) {
479 /* fix the input mapping so that we have maps for each of the plugin's inputs */
480 in_map = ChanMapping (natural_input_streams ());
483 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
484 (*i)->connect_and_run (_session.get_scratch_buffers ((*i)->get_info()->n_inputs, true), in_map, out_map, nframes, 0);
489 PluginInsert::run (BufferSet& bufs, framepos_t start_frame, framepos_t /*end_frame*/, pframes_t nframes, bool)
491 if (_pending_active) {
492 /* run as normal if we are active or moving from inactive to active */
494 if (_session.transport_rolling() || _session.bounce_processing()) {
495 automation_run (bufs, start_frame, nframes);
497 connect_and_run (bufs, nframes, 0, false);
501 uint32_t in = input_streams ().n_audio ();
502 uint32_t out = output_streams().n_audio ();
504 if (has_no_audio_inputs() || in == 0) {
506 /* silence all (audio) outputs. Should really declick
507 * at the transitions of "active"
510 for (uint32_t n = 0; n < out; ++n) {
511 bufs.get_audio (n).silence (nframes);
514 } else if (out > in) {
516 /* not active, but something has make up for any channel count increase */
518 // TODO: option round-robin (n % in) or silence additional buffers ??
519 // for now , simply replicate last buffer
520 for (uint32_t n = in; n < out; ++n) {
521 bufs.get_audio(n).read_from(bufs.get_audio(in - 1), nframes);
525 bufs.count().set_audio (out);
528 _active = _pending_active;
530 /* we have no idea whether the plugin generated silence or not, so mark
531 * all buffers appropriately.
537 PluginInsert::automation_run (BufferSet& bufs, framepos_t start, pframes_t nframes)
539 Evoral::ControlEvent next_event (0, 0.0f);
540 framepos_t now = start;
541 framepos_t end = now + nframes;
542 framecnt_t offset = 0;
544 Glib::Threads::Mutex::Lock lm (control_lock(), Glib::Threads::TRY_LOCK);
547 connect_and_run (bufs, nframes, offset, false);
551 if (!find_next_event (now, end, next_event) || requires_fixed_sized_buffers()) {
553 /* no events have a time within the relevant range */
555 connect_and_run (bufs, nframes, offset, true, now);
561 framecnt_t cnt = min (((framecnt_t) ceil (next_event.when) - now), (framecnt_t) nframes);
563 connect_and_run (bufs, cnt, offset, true, now);
569 if (!find_next_event (now, end, next_event)) {
574 /* cleanup anything that is left to do */
577 connect_and_run (bufs, nframes, offset, true, now);
582 PluginInsert::default_parameter_value (const Evoral::Parameter& param)
584 if (param.type() != PluginAutomation)
587 if (_plugins.empty()) {
588 fatal << _("programming error: ") << X_("PluginInsert::default_parameter_value() called with no plugin")
590 abort(); /*NOTREACHED*/
593 return _plugins[0]->default_value (param.id());
598 PluginInsert::can_reset_all_parameters ()
602 for (uint32_t par = 0; par < _plugins[0]->parameter_count(); ++par) {
604 const uint32_t cid = _plugins[0]->nth_parameter (par, ok);
606 if (!ok || !_plugins[0]->parameter_is_input(cid)) {
610 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, cid));
616 if (ac->automation_state() & Play) {
621 return all && (params > 0);
625 PluginInsert::reset_parameters_to_default ()
629 for (uint32_t par = 0; par < _plugins[0]->parameter_count(); ++par) {
631 const uint32_t cid = _plugins[0]->nth_parameter (par, ok);
633 if (!ok || !_plugins[0]->parameter_is_input(cid)) {
637 const float dflt = _plugins[0]->default_value (cid);
638 const float curr = _plugins[0]->get_parameter (cid);
644 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, cid));
649 if (ac->automation_state() & Play) {
654 ac->set_value (dflt);
659 boost::shared_ptr<Plugin>
660 PluginInsert::plugin_factory (boost::shared_ptr<Plugin> other)
662 boost::shared_ptr<LadspaPlugin> lp;
664 boost::shared_ptr<LV2Plugin> lv2p;
666 #ifdef WINDOWS_VST_SUPPORT
667 boost::shared_ptr<WindowsVSTPlugin> vp;
670 boost::shared_ptr<LXVSTPlugin> lxvp;
672 #ifdef AUDIOUNIT_SUPPORT
673 boost::shared_ptr<AUPlugin> ap;
676 if ((lp = boost::dynamic_pointer_cast<LadspaPlugin> (other)) != 0) {
677 return boost::shared_ptr<Plugin> (new LadspaPlugin (*lp));
679 } else if ((lv2p = boost::dynamic_pointer_cast<LV2Plugin> (other)) != 0) {
680 return boost::shared_ptr<Plugin> (new LV2Plugin (*lv2p));
682 #ifdef WINDOWS_VST_SUPPORT
683 } else if ((vp = boost::dynamic_pointer_cast<WindowsVSTPlugin> (other)) != 0) {
684 return boost::shared_ptr<Plugin> (new WindowsVSTPlugin (*vp));
687 } else if ((lxvp = boost::dynamic_pointer_cast<LXVSTPlugin> (other)) != 0) {
688 return boost::shared_ptr<Plugin> (new LXVSTPlugin (*lxvp));
690 #ifdef AUDIOUNIT_SUPPORT
691 } else if ((ap = boost::dynamic_pointer_cast<AUPlugin> (other)) != 0) {
692 return boost::shared_ptr<Plugin> (new AUPlugin (*ap));
696 fatal << string_compose (_("programming error: %1"),
697 X_("unknown plugin type in PluginInsert::plugin_factory"))
699 abort(); /*NOTREACHED*/
700 return boost::shared_ptr<Plugin> ((Plugin*) 0);
704 PluginInsert::configure_io (ChanCount in, ChanCount out)
706 Match old_match = _match;
707 ChanCount old_in = input_streams ();
708 ChanCount old_out = output_streams ();
711 _configured_out = out;
713 /* set the matching method and number of plugins that we will use to meet this configuration */
714 _match = private_can_support_io_configuration (in, out);
715 if (set_count (_match.plugins) == false) {
716 PluginIoReConfigure (); /* EMIT SIGNAL */
720 /* configure plugins */
721 switch (_match.method) {
724 if (_plugins.front()->configure_io (_plugins.front()->get_info()->n_inputs, out) == false) {
725 PluginIoReConfigure (); /* EMIT SIGNAL */
731 if (_plugins.front()->configure_io (in, out) == false) {
732 PluginIoReConfigure (); /* EMIT SIGNAL */
738 if ( (old_match.method != _match.method && (old_match.method == Split || _match.method == Split))
743 PluginIoReConfigure (); /* EMIT SIGNAL */
746 // we don't know the analysis window size, so we must work with the
747 // current buffer size here. each request for data fills in these
748 // buffers and the analyser makes sure it gets enough data for the
750 session().ensure_buffer_set (_signal_analysis_inputs, in);
751 //_signal_analysis_inputs.set_count (in);
753 session().ensure_buffer_set (_signal_analysis_outputs, out);
754 //_signal_analysis_outputs.set_count (out);
756 // std::cerr << "set counts to i" << in.n_audio() << "/o" << out.n_audio() << std::endl;
758 return Processor::configure_io (in, out);
761 /** Decide whether this PluginInsert can support a given IO configuration.
762 * To do this, we run through a set of possible solutions in rough order of
765 * @param in Required input channel count.
766 * @param out Filled in with the output channel count if we return true.
767 * @return true if the given IO configuration can be supported.
770 PluginInsert::can_support_io_configuration (const ChanCount& in, ChanCount& out)
772 return private_can_support_io_configuration (in, out).method != Impossible;
775 /** A private version of can_support_io_configuration which returns the method
776 * by which the configuration can be matched, rather than just whether or not
780 PluginInsert::private_can_support_io_configuration (ChanCount const & inx, ChanCount& out)
782 if (_plugins.empty()) {
786 PluginInfoPtr info = _plugins.front()->get_info();
787 ChanCount in; in += inx;
790 if (info->reconfigurable_io()) {
791 /* Plugin has flexible I/O, so delegate to it */
792 bool const r = _plugins.front()->can_support_io_configuration (in, out);
794 return Match (Impossible, 0);
797 return Match (Delegate, 1);
800 ChanCount inputs = info->n_inputs;
801 ChanCount outputs = info->n_outputs;
803 if (in.get(DataType::MIDI) == 1 && outputs.get(DataType::MIDI) == 0) {
804 DEBUG_TRACE ( DEBUG::Processors, string_compose ("bypassing midi-data around %1\n", name()));
805 midi_bypass.set(DataType::MIDI, 1);
807 if (in.get(DataType::MIDI) == 1 && inputs.get(DataType::MIDI) == 0) {
808 DEBUG_TRACE ( DEBUG::Processors, string_compose ("hiding midi-port from plugin %1\n", name()));
809 in.set(DataType::MIDI, 0);
812 bool no_inputs = true;
813 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
814 if (inputs.get (*t) != 0) {
821 /* no inputs so we can take any input configuration since we throw it away */
822 out = outputs + midi_bypass;
823 return Match (NoInputs, 1);
826 /* Plugin inputs match requested inputs exactly */
828 out = outputs + midi_bypass;
829 return Match (ExactMatch, 1);
832 /* We may be able to run more than one copy of the plugin within this insert
833 to cope with the insert having more inputs than the plugin.
834 We allow replication only for plugins with either zero or 1 inputs and outputs
835 for every valid data type.
839 bool can_replicate = true;
840 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
842 uint32_t nin = inputs.get (*t);
844 // No inputs of this type
845 if (nin == 0 && in.get(*t) == 0) {
849 if (nin != 1 || outputs.get (*t) != 1) {
850 can_replicate = false;
854 // Potential factor not set yet
856 f = in.get(*t) / nin;
859 // Factor for this type does not match another type, can not replicate
860 if (f != (in.get(*t) / nin)) {
861 can_replicate = false;
867 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
868 out.set (*t, outputs.get(*t) * f);
871 return Match (Replicate, f);
874 /* If the processor has exactly one input of a given type, and
875 the plugin has more, we can feed the single processor input
876 to some or all of the plugin inputs. This is rather
877 special-case-y, but the 1-to-many case is by far the
878 simplest. How do I split thy 2 processor inputs to 3
879 plugin inputs? Let me count the ways ...
882 bool can_split = true;
883 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
885 bool const can_split_type = (in.get (*t) == 1 && inputs.get (*t) > 1);
886 bool const nothing_to_do_for_type = (in.get (*t) == 0 && inputs.get (*t) == 0);
888 if (!can_split_type && !nothing_to_do_for_type) {
894 out = outputs + midi_bypass;
895 return Match (Split, 1);
898 /* If the plugin has more inputs than we want, we can `hide' some of them
899 by feeding them silence.
902 bool could_hide = false;
903 bool cannot_hide = false;
904 ChanCount hide_channels;
906 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
907 if (inputs.get(*t) > in.get(*t)) {
908 /* there is potential to hide, since the plugin has more inputs of type t than the insert */
909 hide_channels.set (*t, inputs.get(*t) - in.get(*t));
911 } else if (inputs.get(*t) < in.get(*t)) {
912 /* we definitely cannot hide, since the plugin has fewer inputs of type t than the insert */
917 if (could_hide && !cannot_hide) {
918 out = outputs + midi_bypass;
919 return Match (Hide, 1, hide_channels);
923 return Match (Impossible, 0);
927 PluginInsert::get_state ()
933 PluginInsert::state (bool full)
935 XMLNode& node = Processor::state (full);
937 node.add_property("type", _plugins[0]->state_node_name());
938 node.add_property("unique-id", _plugins[0]->unique_id());
939 node.add_property("count", string_compose("%1", _plugins.size()));
941 /* remember actual i/o configuration (for later placeholder
942 * in case the plugin goes missing) */
943 node.add_child_nocopy (* _configured_in.state (X_("ConfiguredInput")));
944 node.add_child_nocopy (* _configured_out.state (X_("ConfiguredOutput")));
946 node.add_child_nocopy (_plugins[0]->get_state());
948 for (Controls::iterator c = controls().begin(); c != controls().end(); ++c) {
949 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> ((*c).second);
951 node.add_child_nocopy (ac->get_state());
959 PluginInsert::set_control_ids (const XMLNode& node, int version)
961 const XMLNodeList& nlist = node.children();
962 XMLNodeConstIterator iter;
963 set<Evoral::Parameter>::const_iterator p;
965 for (iter = nlist.begin(); iter != nlist.end(); ++iter) {
966 if ((*iter)->name() == Controllable::xml_node_name) {
967 const XMLProperty* prop;
969 if ((prop = (*iter)->property (X_("parameter"))) != 0) {
970 uint32_t p = atoi (prop->value());
972 /* this may create the new controllable */
974 boost::shared_ptr<Evoral::Control> c = control (Evoral::Parameter (PluginAutomation, 0, p));
976 #ifndef NO_PLUGIN_STATE
980 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> (c);
982 ac->set_state (**iter, version);
991 PluginInsert::set_state(const XMLNode& node, int version)
993 XMLNodeList nlist = node.children();
994 XMLNodeIterator niter;
995 XMLPropertyList plist;
996 const XMLProperty *prop;
997 ARDOUR::PluginType type;
999 if ((prop = node.property ("type")) == 0) {
1000 error << _("XML node describing plugin is missing the `type' field") << endmsg;
1004 if (prop->value() == X_("ladspa") || prop->value() == X_("Ladspa")) { /* handle old school sessions */
1005 type = ARDOUR::LADSPA;
1006 } else if (prop->value() == X_("lv2")) {
1008 } else if (prop->value() == X_("windows-vst")) {
1009 type = ARDOUR::Windows_VST;
1010 } else if (prop->value() == X_("lxvst")) {
1011 type = ARDOUR::LXVST;
1012 } else if (prop->value() == X_("audiounit")) {
1013 type = ARDOUR::AudioUnit;
1015 error << string_compose (_("unknown plugin type %1 in plugin insert state"),
1021 prop = node.property ("unique-id");
1024 #ifdef WINDOWS_VST_SUPPORT
1025 /* older sessions contain VST plugins with only an "id" field.
1028 if (type == ARDOUR::Windows_VST) {
1029 prop = node.property ("id");
1033 #ifdef LXVST_SUPPORT
1034 /*There shouldn't be any older sessions with linuxVST support.. but anyway..*/
1036 if (type == ARDOUR::LXVST) {
1037 prop = node.property ("id");
1043 error << _("Plugin has no unique ID field") << endmsg;
1048 boost::shared_ptr<Plugin> plugin = find_plugin (_session, prop->value(), type);
1050 /* treat linux and windows VST plugins equivalent if they have the same uniqueID
1051 * allow to move sessions windows <> linux */
1052 #ifdef LXVST_SUPPORT
1053 if (plugin == 0 && type == ARDOUR::Windows_VST) {
1054 type = ARDOUR::LXVST;
1055 plugin = find_plugin (_session, prop->value(), type);
1059 #ifdef WINDOWS_VST_SUPPORT
1060 if (plugin == 0 && type == ARDOUR::LXVST) {
1061 type = ARDOUR::Windows_VST;
1062 plugin = find_plugin (_session, prop->value(), type);
1067 error << string_compose(
1068 _("Found a reference to a plugin (\"%1\") that is unknown.\n"
1069 "Perhaps it was removed or moved since it was last used."),
1075 // The name of the PluginInsert comes from the plugin, nothing else
1076 _name = plugin->get_info()->name;
1080 // Processor::set_state() will set this, but too late
1081 // for it to be available when setting up plugin
1082 // state. We can't call Processor::set_state() until
1083 // the plugins themselves are created and added.
1087 if (_plugins.empty()) {
1088 /* if we are adding the first plugin, we will need to set
1089 up automatable controls.
1091 add_plugin (plugin);
1092 create_automatable_parameters ();
1093 set_control_ids (node, version);
1096 if ((prop = node.property ("count")) != 0) {
1097 sscanf (prop->value().c_str(), "%u", &count);
1100 if (_plugins.size() != count) {
1101 for (uint32_t n = 1; n < count; ++n) {
1102 add_plugin (plugin_factory (plugin));
1106 Processor::set_state (node, version);
1108 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1110 /* find the node with the type-specific node name ("lv2", "ladspa", etc)
1111 and set all plugins to the same state.
1114 if ((*niter)->name() == plugin->state_node_name()) {
1116 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1117 (*i)->set_state (**niter, version);
1124 if (version < 3000) {
1126 /* Only 2.X sessions need a call to set_parameter_state() - in 3.X and above
1127 this is all handled by Automatable
1130 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1131 if ((*niter)->name() == "Redirect") {
1132 /* XXX do we need to tackle placement? i think not (pd; oct 16 2009) */
1133 Processor::set_state (**niter, version);
1138 set_parameter_state_2X (node, version);
1141 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1145 (*i)->deactivate ();
1153 PluginInsert::update_id (PBD::ID id)
1156 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1157 (*i)->set_insert_id (id);
1162 PluginInsert::set_parameter_state_2X (const XMLNode& node, int version)
1164 XMLNodeList nlist = node.children();
1165 XMLNodeIterator niter;
1167 /* look for port automation node */
1169 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1171 if ((*niter)->name() != port_automation_node_name) {
1177 XMLNodeConstIterator iter;
1182 cnodes = (*niter)->children ("port");
1184 for (iter = cnodes.begin(); iter != cnodes.end(); ++iter){
1188 if ((cprop = child->property("number")) != 0) {
1189 port = cprop->value().c_str();
1191 warning << _("PluginInsert: Auto: no ladspa port number") << endmsg;
1195 sscanf (port, "%" PRIu32, &port_id);
1197 if (port_id >= _plugins[0]->parameter_count()) {
1198 warning << _("PluginInsert: Auto: port id out of range") << endmsg;
1202 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(
1203 control(Evoral::Parameter(PluginAutomation, 0, port_id), true));
1205 if (c && c->alist()) {
1206 if (!child->children().empty()) {
1207 c->alist()->set_state (*child->children().front(), version);
1209 /* In some cases 2.X saves lists with min_yval and max_yval
1210 being FLT_MIN and FLT_MAX respectively. This causes problems
1211 in A3 because these min/max values are used to compute
1212 where GUI control points should be drawn. If we see such
1213 values, `correct' them to the min/max of the appropriate
1217 float min_y = c->alist()->get_min_y ();
1218 float max_y = c->alist()->get_max_y ();
1220 ParameterDescriptor desc;
1221 _plugins.front()->get_parameter_descriptor (port_id, desc);
1223 if (min_y == FLT_MIN) {
1227 if (max_y == FLT_MAX) {
1231 c->alist()->set_yrange (min_y, max_y);
1234 error << string_compose (_("PluginInsert: automatable control %1 not found - ignored"), port_id) << endmsg;
1246 PluginInsert::describe_parameter (Evoral::Parameter param)
1248 if (param.type() == PluginAutomation) {
1249 return _plugins[0]->describe_parameter (param);
1250 } else if (param.type() == PluginPropertyAutomation) {
1251 boost::shared_ptr<AutomationControl> c(automation_control(param));
1252 if (c && !c->desc().label.empty()) {
1253 return c->desc().label;
1256 return Automatable::describe_parameter(param);
1260 PluginInsert::signal_latency() const
1262 if (_user_latency) {
1263 return _user_latency;
1266 return _plugins[0]->signal_latency ();
1270 PluginInsert::type ()
1272 return plugin()->get_info()->type;
1275 PluginInsert::PluginControl::PluginControl (PluginInsert* p,
1276 const Evoral::Parameter& param,
1277 const ParameterDescriptor& desc,
1278 boost::shared_ptr<AutomationList> list)
1279 : AutomationControl (p->session(), param, desc, list, p->describe_parameter(param))
1283 alist()->reset_default (desc.normal);
1285 list->set_interpolation(Evoral::ControlList::Discrete);
1290 set_flags(Controllable::Toggle);
1294 /** @param val `user' value */
1296 PluginInsert::PluginControl::set_value (double user_val)
1298 /* FIXME: probably should be taking out some lock here.. */
1300 for (Plugins::iterator i = _plugin->_plugins.begin(); i != _plugin->_plugins.end(); ++i) {
1301 (*i)->set_parameter (_list->parameter().id(), user_val);
1304 boost::shared_ptr<Plugin> iasp = _plugin->_impulseAnalysisPlugin.lock();
1306 iasp->set_parameter (_list->parameter().id(), user_val);
1309 AutomationControl::set_value (user_val);
1313 PluginInsert::PluginControl::catch_up_with_external_value (double user_val)
1315 AutomationControl::set_value (user_val);
1319 PluginInsert::PluginControl::get_state ()
1323 XMLNode& node (AutomationControl::get_state());
1324 ss << parameter().id();
1325 node.add_property (X_("parameter"), ss.str());
1330 /** @return `user' val */
1332 PluginInsert::PluginControl::get_value () const
1334 boost::shared_ptr<Plugin> plugin = _plugin->plugin (0);
1340 return plugin->get_parameter (_list->parameter().id());
1343 PluginInsert::PluginPropertyControl::PluginPropertyControl (PluginInsert* p,
1344 const Evoral::Parameter& param,
1345 const ParameterDescriptor& desc,
1346 boost::shared_ptr<AutomationList> list)
1347 : AutomationControl (p->session(), param, desc, list)
1351 alist()->set_yrange (desc.lower, desc.upper);
1352 alist()->reset_default (desc.normal);
1356 set_flags(Controllable::Toggle);
1361 PluginInsert::PluginPropertyControl::set_value (double user_val)
1363 /* Old numeric set_value(), coerce to appropriate datatype if possible.
1364 This is lossy, but better than nothing until Ardour's automation system
1365 can handle various datatypes all the way down. */
1366 const Variant value(_desc.datatype, user_val);
1367 if (value.type() == Variant::NOTHING) {
1368 error << "set_value(double) called for non-numeric property" << endmsg;
1372 for (Plugins::iterator i = _plugin->_plugins.begin(); i != _plugin->_plugins.end(); ++i) {
1373 (*i)->set_property(_list->parameter().id(), value);
1377 AutomationControl::set_value(user_val);
1381 PluginInsert::PluginPropertyControl::get_state ()
1385 XMLNode& node (AutomationControl::get_state());
1386 ss << parameter().id();
1387 node.add_property (X_("property"), ss.str());
1388 node.remove_property (X_("value"));
1394 PluginInsert::PluginPropertyControl::get_value () const
1396 return _value.to_double();
1399 boost::shared_ptr<Plugin>
1400 PluginInsert::get_impulse_analysis_plugin()
1402 boost::shared_ptr<Plugin> ret;
1403 if (_impulseAnalysisPlugin.expired()) {
1404 ret = plugin_factory(_plugins[0]);
1405 ret->configure_io (input_streams (), output_streams ());
1406 _impulseAnalysisPlugin = ret;
1408 ret = _impulseAnalysisPlugin.lock();
1415 PluginInsert::collect_signal_for_analysis (framecnt_t nframes)
1417 // called from outside the audio thread, so this should be safe
1418 // only do audio as analysis is (currently) only for audio plugins
1419 _signal_analysis_inputs.ensure_buffers( DataType::AUDIO, input_streams().n_audio(), nframes);
1420 _signal_analysis_outputs.ensure_buffers( DataType::AUDIO, output_streams().n_audio(), nframes);
1422 _signal_analysis_collected_nframes = 0;
1423 _signal_analysis_collect_nframes_max = nframes;
1426 /** Add a plugin to our list */
1428 PluginInsert::add_plugin (boost::shared_ptr<Plugin> plugin)
1430 plugin->set_insert_id (this->id());
1432 if (_plugins.empty()) {
1433 /* first (and probably only) plugin instance - connect to relevant signals
1436 plugin->ParameterChangedExternally.connect_same_thread (*this, boost::bind (&PluginInsert::parameter_changed_externally, this, _1, _2));
1437 plugin->StartTouch.connect_same_thread (*this, boost::bind (&PluginInsert::start_touch, this, _1));
1438 plugin->EndTouch.connect_same_thread (*this, boost::bind (&PluginInsert::end_touch, this, _1));
1441 _plugins.push_back (plugin);
1445 PluginInsert::realtime_handle_transport_stopped ()
1447 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1448 (*i)->realtime_handle_transport_stopped ();
1453 PluginInsert::realtime_locate ()
1455 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1456 (*i)->realtime_locate ();
1461 PluginInsert::monitoring_changed ()
1463 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1464 (*i)->monitoring_changed ();
1469 PluginInsert::start_touch (uint32_t param_id)
1471 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id));
1473 ac->start_touch (session().audible_frame());
1478 PluginInsert::end_touch (uint32_t param_id)
1480 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id));
1482 ac->stop_touch (true, session().audible_frame());