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());
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 Plugin::ParameterDescriptor desc;
245 for (set<Evoral::Parameter>::iterator i = a.begin(); i != a.end(); ++i) {
246 if (i->type() == PluginAutomation) {
248 Evoral::Parameter param(*i);
250 _plugins.front()->get_parameter_descriptor(i->id(), desc);
252 /* the Parameter belonging to the actual plugin doesn't have its range set
253 but we want the Controllable related to this Parameter to have those limits.
256 param.set_range (desc.lower, desc.upper, _plugins.front()->default_value(i->id()), desc.toggled);
257 can_automate (param);
258 boost::shared_ptr<AutomationList> list(new AutomationList(param));
259 add_control (boost::shared_ptr<AutomationControl> (new PluginControl(this, param, list)));
265 PluginInsert::parameter_changed (uint32_t which, float val)
267 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, which));
272 Plugins::iterator i = _plugins.begin();
274 /* don't set the first plugin, just all the slaves */
276 if (i != _plugins.end()) {
278 for (; i != _plugins.end(); ++i) {
279 (*i)->set_parameter (which, val);
286 PluginInsert::set_block_size (pframes_t nframes)
289 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
290 if ((*i)->set_block_size (nframes) != 0) {
298 PluginInsert::activate ()
300 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
304 Processor::activate ();
308 PluginInsert::deactivate ()
310 Processor::deactivate ();
312 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
318 PluginInsert::flush ()
320 for (vector<boost::shared_ptr<Plugin> >::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
326 PluginInsert::connect_and_run (BufferSet& bufs, pframes_t nframes, framecnt_t offset, bool with_auto, framepos_t now)
328 // Calculate if, and how many frames we need to collect for analysis
329 framecnt_t collect_signal_nframes = (_signal_analysis_collect_nframes_max -
330 _signal_analysis_collected_nframes);
331 if (nframes < collect_signal_nframes) { // we might not get all frames now
332 collect_signal_nframes = nframes;
335 ChanCount const in_streams = input_streams ();
336 ChanCount const out_streams = output_streams ();
338 ChanMapping in_map (in_streams);
339 ChanMapping out_map (out_streams);
341 if (_match.method == Split) {
342 /* fix the input mapping so that we have maps for each of the plugin's inputs */
343 in_map = ChanMapping (natural_input_streams ());
345 /* copy the first stream's buffer contents to the others */
346 /* XXX: audio only */
347 uint32_t first_idx = in_map.get (DataType::AUDIO, 0, &valid);
349 Sample const * mono = bufs.get_audio (first_idx).data (offset);
350 for (uint32_t i = in_streams.n_audio(); i < natural_input_streams().n_audio(); ++i) {
351 memcpy (bufs.get_audio (in_map.get (DataType::AUDIO, i, &valid)).data (offset), mono, sizeof (Sample) * nframes);
356 /* Note that we've already required that plugins
357 be able to handle in-place processing.
364 for (Controls::iterator li = controls().begin(); li != controls().end(); ++li, ++n) {
366 boost::shared_ptr<AutomationControl> c
367 = boost::dynamic_pointer_cast<AutomationControl>(li->second);
369 if (c->parameter().type() == PluginAutomation && c->automation_playback()) {
372 const float val = c->list()->rt_safe_eval (now, valid);
382 if (collect_signal_nframes > 0) {
384 //std::cerr << "collect input, bufs " << bufs.count().n_audio() << " count, " << bufs.available().n_audio() << " available" << std::endl;
385 //std::cerr << " streams " << input_streams().n_audio() << std::endl;
386 //std::cerr << "filling buffer with " << collect_signal_nframes << " frames at " << _signal_analysis_collected_nframes << std::endl;
388 _signal_analysis_inputs.set_count(input_streams());
390 for (uint32_t i = 0; i < input_streams().n_audio(); ++i) {
391 _signal_analysis_inputs.get_audio(i).read_from(
393 collect_signal_nframes,
394 _signal_analysis_collected_nframes); // offset is for target buffer
399 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
400 (*i)->connect_and_run(bufs, in_map, out_map, nframes, offset);
401 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
402 in_map.offset_to(*t, natural_input_streams().get(*t));
403 out_map.offset_to(*t, natural_output_streams().get(*t));
407 if (collect_signal_nframes > 0) {
409 //std::cerr << " output, bufs " << bufs.count().n_audio() << " count, " << bufs.available().n_audio() << " available" << std::endl;
410 //std::cerr << " streams " << output_streams().n_audio() << std::endl;
412 _signal_analysis_outputs.set_count(output_streams());
414 for (uint32_t i = 0; i < output_streams().n_audio(); ++i) {
415 _signal_analysis_outputs.get_audio(i).read_from(
417 collect_signal_nframes,
418 _signal_analysis_collected_nframes); // offset is for target buffer
421 _signal_analysis_collected_nframes += collect_signal_nframes;
422 assert(_signal_analysis_collected_nframes <= _signal_analysis_collect_nframes_max);
424 if (_signal_analysis_collected_nframes == _signal_analysis_collect_nframes_max) {
425 _signal_analysis_collect_nframes_max = 0;
426 _signal_analysis_collected_nframes = 0;
428 AnalysisDataGathered(&_signal_analysis_inputs,
429 &_signal_analysis_outputs);
432 /* leave remaining channel buffers alone */
436 PluginInsert::silence (framecnt_t nframes)
442 ChanMapping in_map(input_streams());
443 ChanMapping out_map(output_streams());
445 if (_match.method == Split) {
446 /* fix the input mapping so that we have maps for each of the plugin's inputs */
447 in_map = ChanMapping (natural_input_streams ());
450 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
451 (*i)->connect_and_run (_session.get_silent_buffers ((*i)->get_info()->n_inputs), in_map, out_map, nframes, 0);
456 PluginInsert::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_frame*/, pframes_t nframes, bool)
458 if (_pending_active) {
459 /* run as normal if we are active or moving from inactive to active */
461 if (_session.transport_rolling()) {
462 automation_run (bufs, nframes);
464 connect_and_run (bufs, nframes, 0, false);
469 if (has_no_audio_inputs()) {
471 /* silence all (audio) outputs. Should really declick
472 * at the transitions of "active"
475 uint32_t out = output_streams().n_audio ();
477 for (uint32_t n = 0; n < out; ++n) {
478 bufs.get_audio (n).silence (nframes);
481 bufs.count().set_audio (out);
485 /* does this need to be done with MIDI? it appears not */
487 uint32_t in = input_streams ().n_audio ();
488 uint32_t out = output_streams().n_audio ();
492 /* not active, but something has make up for any channel count increase */
494 for (uint32_t n = out - in; n < out; ++n) {
495 memcpy (bufs.get_audio (n).data(), bufs.get_audio(in - 1).data(), sizeof (Sample) * nframes);
499 bufs.count().set_audio (out);
503 _active = _pending_active;
505 /* we have no idea whether the plugin generated silence or not, so mark
506 * all buffers appropriately.
509 bufs.set_is_silent (false);
513 PluginInsert::set_parameter (Evoral::Parameter param, float val)
515 if (param.type() != PluginAutomation) {
519 /* the others will be set from the event triggered by this */
521 _plugins[0]->set_parameter (param.id(), val);
523 boost::shared_ptr<AutomationControl> ac
524 = boost::dynamic_pointer_cast<AutomationControl>(control(param));
529 warning << "set_parameter called for nonexistant parameter "
530 << EventTypeMap::instance().to_symbol(param) << endmsg;
533 _session.set_dirty();
537 PluginInsert::get_parameter (Evoral::Parameter param)
539 if (param.type() != PluginAutomation) {
542 assert (!_plugins.empty ());
543 return _plugins[0]->get_parameter (param.id());
548 PluginInsert::automation_run (BufferSet& bufs, pframes_t nframes)
550 Evoral::ControlEvent next_event (0, 0.0f);
551 framepos_t now = _session.transport_frame ();
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")
604 return _plugins[0]->default_value (param.id());
607 boost::shared_ptr<Plugin>
608 PluginInsert::plugin_factory (boost::shared_ptr<Plugin> other)
610 boost::shared_ptr<LadspaPlugin> lp;
612 boost::shared_ptr<LV2Plugin> lv2p;
614 #ifdef WINDOWS_VST_SUPPORT
615 boost::shared_ptr<WindowsVSTPlugin> vp;
618 boost::shared_ptr<LXVSTPlugin> lxvp;
620 #ifdef AUDIOUNIT_SUPPORT
621 boost::shared_ptr<AUPlugin> ap;
624 if ((lp = boost::dynamic_pointer_cast<LadspaPlugin> (other)) != 0) {
625 return boost::shared_ptr<Plugin> (new LadspaPlugin (*lp));
627 } else if ((lv2p = boost::dynamic_pointer_cast<LV2Plugin> (other)) != 0) {
628 return boost::shared_ptr<Plugin> (new LV2Plugin (*lv2p));
630 #ifdef WINDOWS_VST_SUPPORT
631 } else if ((vp = boost::dynamic_pointer_cast<WindowsVSTPlugin> (other)) != 0) {
632 return boost::shared_ptr<Plugin> (new WindowsVSTPlugin (*vp));
635 } else if ((lxvp = boost::dynamic_pointer_cast<LXVSTPlugin> (other)) != 0) {
636 return boost::shared_ptr<Plugin> (new LXVSTPlugin (*lxvp));
638 #ifdef AUDIOUNIT_SUPPORT
639 } else if ((ap = boost::dynamic_pointer_cast<AUPlugin> (other)) != 0) {
640 return boost::shared_ptr<Plugin> (new AUPlugin (*ap));
644 fatal << string_compose (_("programming error: %1"),
645 X_("unknown plugin type in PluginInsert::plugin_factory"))
648 return boost::shared_ptr<Plugin> ((Plugin*) 0);
652 PluginInsert::configure_io (ChanCount in, ChanCount out)
654 Match old_match = _match;
656 /* set the matching method and number of plugins that we will use to meet this configuration */
657 _match = private_can_support_io_configuration (in, out);
658 if (set_count (_match.plugins) == false) {
662 /* a signal needs emitting if we start or stop splitting */
663 if (old_match.method != _match.method && (old_match.method == Split || _match.method == Split)) {
664 SplittingChanged (); /* EMIT SIGNAL */
667 /* configure plugins */
668 switch (_match.method) {
671 if (_plugins.front()->configure_io (_plugins.front()->get_info()->n_inputs, out)) {
677 if (_plugins.front()->configure_io (in, out) == false) {
683 // we don't know the analysis window size, so we must work with the
684 // current buffer size here. each request for data fills in these
685 // buffers and the analyser makes sure it gets enough data for the
687 session().ensure_buffer_set (_signal_analysis_inputs, in);
688 //_signal_analysis_inputs.set_count (in);
690 session().ensure_buffer_set (_signal_analysis_outputs, out);
691 //_signal_analysis_outputs.set_count (out);
693 // std::cerr << "set counts to i" << in.n_audio() << "/o" << out.n_audio() << std::endl;
695 return Processor::configure_io (in, out);
698 /** Decide whether this PluginInsert can support a given IO configuration.
699 * To do this, we run through a set of possible solutions in rough order of
702 * @param in Required input channel count.
703 * @param out Filled in with the output channel count if we return true.
704 * @return true if the given IO configuration can be supported.
707 PluginInsert::can_support_io_configuration (const ChanCount& in, ChanCount& out) const
709 return private_can_support_io_configuration (in, out).method != Impossible;
712 /** A private version of can_support_io_configuration which returns the method
713 * by which the configuration can be matched, rather than just whether or not
717 PluginInsert::private_can_support_io_configuration (ChanCount const & in, ChanCount& out) const
719 PluginInfoPtr info = _plugins.front()->get_info();
721 if (info->reconfigurable_io()) {
722 /* Plugin has flexible I/O, so delegate to it */
723 bool const r = _plugins.front()->can_support_io_configuration (in, out);
725 return Match (Impossible, 0);
728 return Match (Delegate, 1);
731 ChanCount inputs = info->n_inputs;
732 ChanCount outputs = info->n_outputs;
734 bool no_inputs = true;
735 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
736 if (inputs.get (*t) != 0) {
743 /* no inputs so we can take any input configuration since we throw it away */
745 return Match (NoInputs, 1);
748 /* Plugin inputs match requested inputs exactly */
751 return Match (ExactMatch, 1);
754 /* We may be able to run more than one copy of the plugin within this insert
755 to cope with the insert having more inputs than the plugin.
756 We allow replication only for plugins with either zero or 1 inputs and outputs
757 for every valid data type.
761 bool can_replicate = true;
762 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
764 uint32_t nin = inputs.get (*t);
766 // No inputs of this type
767 if (nin == 0 && in.get(*t) == 0) {
771 if (nin != 1 || outputs.get (*t) != 1) {
772 can_replicate = false;
776 // Potential factor not set yet
778 f = in.get(*t) / nin;
781 // Factor for this type does not match another type, can not replicate
782 if (f != (in.get(*t) / nin)) {
783 can_replicate = false;
789 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
790 out.set (*t, outputs.get(*t) * f);
792 return Match (Replicate, f);
795 /* If the processor has exactly one input of a given type, and
796 the plugin has more, we can feed the single processor input
797 to some or all of the plugin inputs. This is rather
798 special-case-y, but the 1-to-many case is by far the
799 simplest. How do I split thy 2 processor inputs to 3
800 plugin inputs? Let me count the ways ...
803 bool can_split = true;
804 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
806 bool const can_split_type = (in.get (*t) == 1 && inputs.get (*t) > 1);
807 bool const nothing_to_do_for_type = (in.get (*t) == 0 && inputs.get (*t) == 0);
809 if (!can_split_type && !nothing_to_do_for_type) {
816 return Match (Split, 1);
819 /* If the plugin has more inputs than we want, we can `hide' some of them
820 by feeding them silence.
823 bool could_hide = false;
824 bool cannot_hide = false;
825 ChanCount hide_channels;
827 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
828 if (inputs.get(*t) > in.get(*t)) {
829 /* there is potential to hide, since the plugin has more inputs of type t than the insert */
830 hide_channels.set (*t, inputs.get(*t) - in.get(*t));
832 } else if (inputs.get(*t) < in.get(*t)) {
833 /* we definitely cannot hide, since the plugin has fewer inputs of type t than the insert */
838 if (could_hide && !cannot_hide) {
840 return Match (Hide, 1, hide_channels);
843 return Match (Impossible, 0);
847 PluginInsert::get_state ()
853 PluginInsert::state (bool full)
855 XMLNode& node = Processor::state (full);
857 node.add_property("type", _plugins[0]->state_node_name());
858 node.add_property("unique-id", _plugins[0]->unique_id());
859 node.add_property("count", string_compose("%1", _plugins.size()));
860 node.add_child_nocopy (_plugins[0]->get_state());
862 for (Controls::iterator c = controls().begin(); c != controls().end(); ++c) {
863 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> ((*c).second);
865 node.add_child_nocopy (ac->get_state());
873 PluginInsert::set_control_ids (const XMLNode& node, int version)
875 const XMLNodeList& nlist = node.children();
876 XMLNodeConstIterator iter;
877 set<Evoral::Parameter>::const_iterator p;
879 for (iter = nlist.begin(); iter != nlist.end(); ++iter) {
880 if ((*iter)->name() == Controllable::xml_node_name) {
881 const XMLProperty* prop;
883 if ((prop = (*iter)->property (X_("parameter"))) != 0) {
884 uint32_t p = atoi (prop->value());
886 /* this may create the new controllable */
888 boost::shared_ptr<Evoral::Control> c = control (Evoral::Parameter (PluginAutomation, 0, p));
890 #ifndef NO_PLUGIN_STATE
894 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> (c);
896 ac->set_state (**iter, version);
905 PluginInsert::set_state(const XMLNode& node, int version)
907 XMLNodeList nlist = node.children();
908 XMLNodeIterator niter;
909 XMLPropertyList plist;
910 const XMLProperty *prop;
911 ARDOUR::PluginType type;
913 if ((prop = node.property ("type")) == 0) {
914 error << _("XML node describing plugin is missing the `type' field") << endmsg;
918 if (prop->value() == X_("ladspa") || prop->value() == X_("Ladspa")) { /* handle old school sessions */
919 type = ARDOUR::LADSPA;
920 } else if (prop->value() == X_("lv2")) {
922 } else if (prop->value() == X_("windows-vst")) {
923 type = ARDOUR::Windows_VST;
924 } else if (prop->value() == X_("lxvst")) {
925 type = ARDOUR::LXVST;
926 } else if (prop->value() == X_("audiounit")) {
927 type = ARDOUR::AudioUnit;
929 error << string_compose (_("unknown plugin type %1 in plugin insert state"),
935 prop = node.property ("unique-id");
938 #ifdef WINDOWS_VST_SUPPORT
939 /* older sessions contain VST plugins with only an "id" field.
942 if (type == ARDOUR::Windows_VST) {
943 prop = node.property ("id");
948 /*There shouldn't be any older sessions with linuxVST support.. but anyway..*/
950 if (type == ARDOUR::LXVST) {
951 prop = node.property ("id");
957 error << _("Plugin has no unique ID field") << endmsg;
962 boost::shared_ptr<Plugin> plugin = find_plugin (_session, prop->value(), type);
965 error << string_compose(
966 _("Found a reference to a plugin (\"%1\") that is unknown.\n"
967 "Perhaps it was removed or moved since it was last used."),
973 // The name of the PluginInsert comes from the plugin, nothing else
974 _name = plugin->get_info()->name;
978 // Processor::set_state() will set this, but too late
979 // for it to be available when setting up plugin
980 // state. We can't call Processor::set_state() until
981 // the plugins themselves are created and added.
985 if (_plugins.empty()) {
986 /* if we are adding the first plugin, we will need to set
987 up automatable controls.
990 create_automatable_parameters ();
991 set_control_ids (node, version);
994 if ((prop = node.property ("count")) != 0) {
995 sscanf (prop->value().c_str(), "%u", &count);
998 if (_plugins.size() != count) {
999 for (uint32_t n = 1; n < count; ++n) {
1000 add_plugin (plugin_factory (plugin));
1004 Processor::set_state (node, version);
1006 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1008 /* find the node with the type-specific node name ("lv2", "ladspa", etc)
1009 and set all plugins to the same state.
1012 if ((*niter)->name() == plugin->state_node_name()) {
1014 plugin->set_state (**niter, version);
1016 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1017 (*i)->set_state (**niter, version);
1024 if (version < 3000) {
1026 /* Only 2.X sessions need a call to set_parameter_state() - in 3.X and above
1027 this is all handled by Automatable
1030 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1031 if ((*niter)->name() == "Redirect") {
1032 /* XXX do we need to tackle placement? i think not (pd; oct 16 2009) */
1033 Processor::set_state (**niter, version);
1038 set_parameter_state_2X (node, version);
1041 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1045 (*i)->deactivate ();
1053 PluginInsert::set_parameter_state_2X (const XMLNode& node, int version)
1055 XMLNodeList nlist = node.children();
1056 XMLNodeIterator niter;
1058 /* look for port automation node */
1060 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1062 if ((*niter)->name() != port_automation_node_name) {
1068 XMLNodeConstIterator iter;
1073 cnodes = (*niter)->children ("port");
1075 for (iter = cnodes.begin(); iter != cnodes.end(); ++iter){
1079 if ((cprop = child->property("number")) != 0) {
1080 port = cprop->value().c_str();
1082 warning << _("PluginInsert: Auto: no ladspa port number") << endmsg;
1086 sscanf (port, "%" PRIu32, &port_id);
1088 if (port_id >= _plugins[0]->parameter_count()) {
1089 warning << _("PluginInsert: Auto: port id out of range") << endmsg;
1093 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(
1094 control(Evoral::Parameter(PluginAutomation, 0, port_id), true));
1097 if (!child->children().empty()) {
1098 c->alist()->set_state (*child->children().front(), version);
1100 /* In some cases 2.X saves lists with min_yval and max_yval
1101 being FLT_MIN and FLT_MAX respectively. This causes problems
1102 in A3 because these min/max values are used to compute
1103 where GUI control points should be drawn. If we see such
1104 values, `correct' them to the min/max of the appropriate
1108 float min_y = c->alist()->get_min_y ();
1109 float max_y = c->alist()->get_max_y ();
1111 Plugin::ParameterDescriptor desc;
1112 _plugins.front()->get_parameter_descriptor (port_id, desc);
1114 if (min_y == FLT_MIN) {
1118 if (max_y == FLT_MAX) {
1122 c->alist()->set_yrange (min_y, max_y);
1125 error << string_compose (_("PluginInsert: automatable control %1 not found - ignored"), port_id) << endmsg;
1137 PluginInsert::describe_parameter (Evoral::Parameter param)
1139 if (param.type() != PluginAutomation) {
1140 return Automatable::describe_parameter(param);
1143 return _plugins[0]->describe_parameter (param);
1147 PluginInsert::signal_latency() const
1149 if (_user_latency) {
1150 return _user_latency;
1153 return _plugins[0]->signal_latency ();
1157 PluginInsert::type ()
1159 return plugin()->get_info()->type;
1162 PluginInsert::PluginControl::PluginControl (PluginInsert* p, const Evoral::Parameter ¶m, boost::shared_ptr<AutomationList> list)
1163 : AutomationControl (p->session(), param, list, p->describe_parameter(param))
1166 Plugin::ParameterDescriptor desc;
1167 boost::shared_ptr<Plugin> plugin = p->plugin (0);
1169 alist()->reset_default (plugin->default_value (param.id()));
1171 plugin->get_parameter_descriptor (param.id(), desc);
1172 _logarithmic = desc.logarithmic;
1173 _sr_dependent = desc.sr_dependent;
1174 _toggled = desc.toggled;
1177 /** @param val `user' value */
1179 PluginInsert::PluginControl::set_value (double user_val)
1181 /* FIXME: probably should be taking out some lock here.. */
1183 for (Plugins::iterator i = _plugin->_plugins.begin(); i != _plugin->_plugins.end(); ++i) {
1184 (*i)->set_parameter (_list->parameter().id(), user_val);
1187 boost::shared_ptr<Plugin> iasp = _plugin->_impulseAnalysisPlugin.lock();
1189 iasp->set_parameter (_list->parameter().id(), user_val);
1192 AutomationControl::set_value (user_val);
1196 PluginInsert::PluginControl::internal_to_interface (double val) const
1210 PluginInsert::PluginControl::interface_to_internal (double val) const
1220 PluginInsert::PluginControl::get_state ()
1224 XMLNode& node (AutomationControl::get_state());
1225 ss << parameter().id();
1226 node.add_property (X_("parameter"), ss.str());
1231 /** @return `user' val */
1233 PluginInsert::PluginControl::get_value () const
1235 /* FIXME: probably should be taking out some lock here.. */
1236 return _plugin->get_parameter (_list->parameter());
1239 boost::shared_ptr<Plugin>
1240 PluginInsert::get_impulse_analysis_plugin()
1242 boost::shared_ptr<Plugin> ret;
1243 if (_impulseAnalysisPlugin.expired()) {
1244 ret = plugin_factory(_plugins[0]);
1245 _impulseAnalysisPlugin = ret;
1247 ret = _impulseAnalysisPlugin.lock();
1254 PluginInsert::collect_signal_for_analysis (framecnt_t nframes)
1256 // called from outside the audio thread, so this should be safe
1257 // only do audio as analysis is (currently) only for audio plugins
1258 _signal_analysis_inputs.ensure_buffers( DataType::AUDIO, input_streams().n_audio(), nframes);
1259 _signal_analysis_outputs.ensure_buffers( DataType::AUDIO, output_streams().n_audio(), nframes);
1261 _signal_analysis_collected_nframes = 0;
1262 _signal_analysis_collect_nframes_max = nframes;
1265 /** Add a plugin to our list */
1267 PluginInsert::add_plugin (boost::shared_ptr<Plugin> plugin)
1269 plugin->set_insert_info (this);
1271 if (_plugins.empty()) {
1272 /* first (and probably only) plugin instance - connect to relevant signals
1275 plugin->ParameterChanged.connect_same_thread (*this, boost::bind (&PluginInsert::parameter_changed, this, _1, _2));
1276 plugin->StartTouch.connect_same_thread (*this, boost::bind (&PluginInsert::start_touch, this, _1));
1277 plugin->EndTouch.connect_same_thread (*this, boost::bind (&PluginInsert::end_touch, this, _1));
1280 _plugins.push_back (plugin);
1284 PluginInsert::realtime_handle_transport_stopped ()
1286 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1287 (*i)->realtime_handle_transport_stopped ();
1292 PluginInsert::realtime_locate ()
1294 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1295 (*i)->realtime_locate ();
1300 PluginInsert::monitoring_changed ()
1302 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1303 (*i)->monitoring_changed ();
1308 PluginInsert::start_touch (uint32_t param_id)
1310 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id));
1312 ac->start_touch (session().audible_frame());
1317 PluginInsert::end_touch (uint32_t param_id)
1319 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id));
1321 ac->stop_touch (true, session().audible_frame());