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 (Evoral::Parameter which, float val)
267 if (which.type() != PluginAutomation)
270 Plugins::iterator i = _plugins.begin();
272 /* don't set the first plugin, just all the slaves */
274 if (i != _plugins.end()) {
276 for (; i != _plugins.end(); ++i) {
277 (*i)->set_parameter (which, val);
283 PluginInsert::set_block_size (pframes_t nframes)
286 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
287 if ((*i)->set_block_size (nframes) != 0) {
295 PluginInsert::activate ()
297 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
301 Processor::activate ();
305 PluginInsert::deactivate ()
307 Processor::deactivate ();
309 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
315 PluginInsert::flush ()
317 for (vector<boost::shared_ptr<Plugin> >::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
323 PluginInsert::connect_and_run (BufferSet& bufs, pframes_t nframes, framecnt_t offset, bool with_auto, framepos_t now)
325 // Calculate if, and how many frames we need to collect for analysis
326 framecnt_t collect_signal_nframes = (_signal_analysis_collect_nframes_max -
327 _signal_analysis_collected_nframes);
328 if (nframes < collect_signal_nframes) { // we might not get all frames now
329 collect_signal_nframes = nframes;
332 ChanCount const in_streams = input_streams ();
333 ChanCount const out_streams = output_streams ();
335 ChanMapping in_map (in_streams);
336 ChanMapping out_map (out_streams);
338 if (_match.method == Split) {
339 /* fix the input mapping so that we have maps for each of the plugin's inputs */
340 in_map = ChanMapping (natural_input_streams ());
342 /* copy the first stream's buffer contents to the others */
343 /* XXX: audio only */
344 uint32_t first_idx = in_map.get (DataType::AUDIO, 0, &valid);
346 Sample const * mono = bufs.get_audio (first_idx).data (offset);
347 for (uint32_t i = in_streams.n_audio(); i < natural_input_streams().n_audio(); ++i) {
348 memcpy (bufs.get_audio (in_map.get (DataType::AUDIO, i, &valid)).data (offset), mono, sizeof (Sample) * nframes);
353 /* Note that we've already required that plugins
354 be able to handle in-place processing.
361 for (Controls::iterator li = controls().begin(); li != controls().end(); ++li, ++n) {
363 boost::shared_ptr<AutomationControl> c
364 = boost::dynamic_pointer_cast<AutomationControl>(li->second);
366 if (c->parameter().type() == PluginAutomation && c->automation_playback()) {
369 const float val = c->list()->rt_safe_eval (now, valid);
379 if (collect_signal_nframes > 0) {
381 //std::cerr << "collect input, bufs " << bufs.count().n_audio() << " count, " << bufs.available().n_audio() << " available" << std::endl;
382 //std::cerr << " streams " << input_streams().n_audio() << std::endl;
383 //std::cerr << "filling buffer with " << collect_signal_nframes << " frames at " << _signal_analysis_collected_nframes << std::endl;
385 _signal_analysis_inputs.set_count(input_streams());
387 for (uint32_t i = 0; i < input_streams().n_audio(); ++i) {
388 _signal_analysis_inputs.get_audio(i).read_from(
390 collect_signal_nframes,
391 _signal_analysis_collected_nframes); // offset is for target buffer
396 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
397 (*i)->connect_and_run(bufs, in_map, out_map, nframes, offset);
398 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
399 in_map.offset_to(*t, natural_input_streams().get(*t));
400 out_map.offset_to(*t, natural_output_streams().get(*t));
404 if (collect_signal_nframes > 0) {
406 //std::cerr << " output, bufs " << bufs.count().n_audio() << " count, " << bufs.available().n_audio() << " available" << std::endl;
407 //std::cerr << " streams " << output_streams().n_audio() << std::endl;
409 _signal_analysis_outputs.set_count(output_streams());
411 for (uint32_t i = 0; i < output_streams().n_audio(); ++i) {
412 _signal_analysis_outputs.get_audio(i).read_from(
414 collect_signal_nframes,
415 _signal_analysis_collected_nframes); // offset is for target buffer
418 _signal_analysis_collected_nframes += collect_signal_nframes;
419 assert(_signal_analysis_collected_nframes <= _signal_analysis_collect_nframes_max);
421 if (_signal_analysis_collected_nframes == _signal_analysis_collect_nframes_max) {
422 _signal_analysis_collect_nframes_max = 0;
423 _signal_analysis_collected_nframes = 0;
425 AnalysisDataGathered(&_signal_analysis_inputs,
426 &_signal_analysis_outputs);
429 /* leave remaining channel buffers alone */
433 PluginInsert::silence (framecnt_t nframes)
439 ChanMapping in_map(input_streams());
440 ChanMapping out_map(output_streams());
442 if (_match.method == Split) {
443 /* fix the input mapping so that we have maps for each of the plugin's inputs */
444 in_map = ChanMapping (natural_input_streams ());
447 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
448 (*i)->connect_and_run (_session.get_silent_buffers ((*i)->get_info()->n_inputs), in_map, out_map, nframes, 0);
453 PluginInsert::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_frame*/, pframes_t nframes, bool)
455 if (_pending_active) {
456 /* run as normal if we are active or moving from inactive to active */
458 if (_session.transport_rolling()) {
459 automation_run (bufs, nframes);
461 connect_and_run (bufs, nframes, 0, false);
466 if (has_no_audio_inputs()) {
468 /* silence all (audio) outputs. Should really declick
469 * at the transitions of "active"
472 uint32_t out = output_streams().n_audio ();
474 for (uint32_t n = 0; n < out; ++n) {
475 bufs.get_audio (n).silence (nframes);
478 bufs.count().set_audio (out);
482 /* does this need to be done with MIDI? it appears not */
484 uint32_t in = input_streams ().n_audio ();
485 uint32_t out = output_streams().n_audio ();
489 /* not active, but something has make up for any channel count increase */
491 for (uint32_t n = out - in; n < out; ++n) {
492 memcpy (bufs.get_audio (n).data(), bufs.get_audio(in - 1).data(), sizeof (Sample) * nframes);
496 bufs.count().set_audio (out);
500 _active = _pending_active;
502 /* we have no idea whether the plugin generated silence or not, so mark
503 * all buffers appropriately.
506 bufs.set_is_silent (false);
510 PluginInsert::set_parameter (Evoral::Parameter param, float val)
512 if (param.type() != PluginAutomation) {
516 /* the others will be set from the event triggered by this */
518 _plugins[0]->set_parameter (param.id(), val);
520 boost::shared_ptr<AutomationControl> ac
521 = boost::dynamic_pointer_cast<AutomationControl>(control(param));
526 warning << "set_parameter called for nonexistant parameter "
527 << EventTypeMap::instance().to_symbol(param) << endmsg;
530 _session.set_dirty();
534 PluginInsert::get_parameter (Evoral::Parameter param)
536 if (param.type() != PluginAutomation) {
539 assert (!_plugins.empty ());
540 return _plugins[0]->get_parameter (param.id());
545 PluginInsert::automation_run (BufferSet& bufs, pframes_t nframes)
547 Evoral::ControlEvent next_event (0, 0.0f);
548 framepos_t now = _session.transport_frame ();
549 framepos_t end = now + nframes;
550 framecnt_t offset = 0;
552 Glib::Mutex::Lock lm (control_lock(), Glib::TRY_LOCK);
555 connect_and_run (bufs, nframes, offset, false);
559 if (!find_next_event (now, end, next_event) || requires_fixed_sized_buffers()) {
561 /* no events have a time within the relevant range */
563 connect_and_run (bufs, nframes, offset, true, now);
569 framecnt_t cnt = min (((framecnt_t) ceil (next_event.when) - now), (framecnt_t) nframes);
571 connect_and_run (bufs, cnt, offset, true, now);
577 if (!find_next_event (now, end, next_event)) {
582 /* cleanup anything that is left to do */
585 connect_and_run (bufs, nframes, offset, true, now);
590 PluginInsert::default_parameter_value (const Evoral::Parameter& param)
592 if (param.type() != PluginAutomation)
595 if (_plugins.empty()) {
596 fatal << _("programming error: ") << X_("PluginInsert::default_parameter_value() called with no plugin")
601 return _plugins[0]->default_value (param.id());
604 boost::shared_ptr<Plugin>
605 PluginInsert::plugin_factory (boost::shared_ptr<Plugin> other)
607 boost::shared_ptr<LadspaPlugin> lp;
609 boost::shared_ptr<LV2Plugin> lv2p;
611 #ifdef WINDOWS_VST_SUPPORT
612 boost::shared_ptr<WindowsVSTPlugin> vp;
615 boost::shared_ptr<LXVSTPlugin> lxvp;
617 #ifdef AUDIOUNIT_SUPPORT
618 boost::shared_ptr<AUPlugin> ap;
621 if ((lp = boost::dynamic_pointer_cast<LadspaPlugin> (other)) != 0) {
622 return boost::shared_ptr<Plugin> (new LadspaPlugin (*lp));
624 } else if ((lv2p = boost::dynamic_pointer_cast<LV2Plugin> (other)) != 0) {
625 return boost::shared_ptr<Plugin> (new LV2Plugin (*lv2p));
627 #ifdef WINDOWS_VST_SUPPORT
628 } else if ((vp = boost::dynamic_pointer_cast<WindowsVSTPlugin> (other)) != 0) {
629 return boost::shared_ptr<Plugin> (new WindowsVSTPlugin (*vp));
632 } else if ((lxvp = boost::dynamic_pointer_cast<LXVSTPlugin> (other)) != 0) {
633 return boost::shared_ptr<Plugin> (new LXVSTPlugin (*lxvp));
635 #ifdef AUDIOUNIT_SUPPORT
636 } else if ((ap = boost::dynamic_pointer_cast<AUPlugin> (other)) != 0) {
637 return boost::shared_ptr<Plugin> (new AUPlugin (*ap));
641 fatal << string_compose (_("programming error: %1"),
642 X_("unknown plugin type in PluginInsert::plugin_factory"))
645 return boost::shared_ptr<Plugin> ((Plugin*) 0);
649 PluginInsert::configure_io (ChanCount in, ChanCount out)
651 Match old_match = _match;
653 /* set the matching method and number of plugins that we will use to meet this configuration */
654 _match = private_can_support_io_configuration (in, out);
655 if (set_count (_match.plugins) == false) {
659 /* a signal needs emitting if we start or stop splitting */
660 if (old_match.method != _match.method && (old_match.method == Split || _match.method == Split)) {
661 SplittingChanged (); /* EMIT SIGNAL */
664 /* configure plugins */
665 switch (_match.method) {
668 if (_plugins.front()->configure_io (_plugins.front()->get_info()->n_inputs, out)) {
674 if (_plugins.front()->configure_io (in, out) == false) {
680 // we don't know the analysis window size, so we must work with the
681 // current buffer size here. each request for data fills in these
682 // buffers and the analyser makes sure it gets enough data for the
684 session().ensure_buffer_set (_signal_analysis_inputs, in);
685 //_signal_analysis_inputs.set_count (in);
687 session().ensure_buffer_set (_signal_analysis_outputs, out);
688 //_signal_analysis_outputs.set_count (out);
690 // std::cerr << "set counts to i" << in.n_audio() << "/o" << out.n_audio() << std::endl;
692 return Processor::configure_io (in, out);
695 /** Decide whether this PluginInsert can support a given IO configuration.
696 * To do this, we run through a set of possible solutions in rough order of
699 * @param in Required input channel count.
700 * @param out Filled in with the output channel count if we return true.
701 * @return true if the given IO configuration can be supported.
704 PluginInsert::can_support_io_configuration (const ChanCount& in, ChanCount& out) const
706 return private_can_support_io_configuration (in, out).method != Impossible;
709 /** A private version of can_support_io_configuration which returns the method
710 * by which the configuration can be matched, rather than just whether or not
714 PluginInsert::private_can_support_io_configuration (ChanCount const & in, ChanCount& out) const
716 PluginInfoPtr info = _plugins.front()->get_info();
718 if (info->reconfigurable_io()) {
719 /* Plugin has flexible I/O, so delegate to it */
720 bool const r = _plugins.front()->can_support_io_configuration (in, out);
722 return Match (Impossible, 0);
725 return Match (Delegate, 1);
728 ChanCount inputs = info->n_inputs;
729 ChanCount outputs = info->n_outputs;
731 bool no_inputs = true;
732 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
733 if (inputs.get (*t) != 0) {
740 /* no inputs so we can take any input configuration since we throw it away */
742 return Match (NoInputs, 1);
745 /* Plugin inputs match requested inputs exactly */
748 return Match (ExactMatch, 1);
751 /* We may be able to run more than one copy of the plugin within this insert
752 to cope with the insert having more inputs than the plugin.
753 We allow replication only for plugins with either zero or 1 inputs and outputs
754 for every valid data type.
758 bool can_replicate = true;
759 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
761 uint32_t nin = inputs.get (*t);
763 // No inputs of this type
764 if (nin == 0 && in.get(*t) == 0) {
768 if (nin != 1 || outputs.get (*t) != 1) {
769 can_replicate = false;
773 // Potential factor not set yet
775 f = in.get(*t) / nin;
778 // Factor for this type does not match another type, can not replicate
779 if (f != (in.get(*t) / nin)) {
780 can_replicate = false;
786 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
787 out.set (*t, outputs.get(*t) * f);
789 return Match (Replicate, f);
792 /* If the processor has exactly one input of a given type, and
793 the plugin has more, we can feed the single processor input
794 to some or all of the plugin inputs. This is rather
795 special-case-y, but the 1-to-many case is by far the
796 simplest. How do I split thy 2 processor inputs to 3
797 plugin inputs? Let me count the ways ...
800 bool can_split = true;
801 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
803 bool const can_split_type = (in.get (*t) == 1 && inputs.get (*t) > 1);
804 bool const nothing_to_do_for_type = (in.get (*t) == 0 && inputs.get (*t) == 0);
806 if (!can_split_type && !nothing_to_do_for_type) {
813 return Match (Split, 1);
816 /* If the plugin has more inputs than we want, we can `hide' some of them
817 by feeding them silence.
820 bool could_hide = false;
821 bool cannot_hide = false;
822 ChanCount hide_channels;
824 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
825 if (inputs.get(*t) > in.get(*t)) {
826 /* there is potential to hide, since the plugin has more inputs of type t than the insert */
827 hide_channels.set (*t, inputs.get(*t) - in.get(*t));
829 } else if (inputs.get(*t) < in.get(*t)) {
830 /* we definitely cannot hide, since the plugin has fewer inputs of type t than the insert */
835 if (could_hide && !cannot_hide) {
837 return Match (Hide, 1, hide_channels);
840 return Match (Impossible, 0);
844 PluginInsert::get_state ()
850 PluginInsert::state (bool full)
852 XMLNode& node = Processor::state (full);
854 node.add_property("type", _plugins[0]->state_node_name());
855 node.add_property("unique-id", _plugins[0]->unique_id());
856 node.add_property("count", string_compose("%1", _plugins.size()));
857 node.add_child_nocopy (_plugins[0]->get_state());
859 for (Controls::iterator c = controls().begin(); c != controls().end(); ++c) {
860 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> ((*c).second);
862 node.add_child_nocopy (ac->get_state());
870 PluginInsert::set_control_ids (const XMLNode& node, int version)
872 const XMLNodeList& nlist = node.children();
873 XMLNodeConstIterator iter;
874 set<Evoral::Parameter>::const_iterator p;
876 for (iter = nlist.begin(); iter != nlist.end(); ++iter) {
877 if ((*iter)->name() == Controllable::xml_node_name) {
878 const XMLProperty* prop;
880 if ((prop = (*iter)->property (X_("parameter"))) != 0) {
881 uint32_t p = atoi (prop->value());
882 boost::shared_ptr<Evoral::Control> c = control (Evoral::Parameter (PluginAutomation, 0, p));
886 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> (c);
888 ac->set_state (**iter, version);
896 PluginInsert::set_state(const XMLNode& node, int version)
898 XMLNodeList nlist = node.children();
899 XMLNodeIterator niter;
900 XMLPropertyList plist;
901 const XMLProperty *prop;
902 ARDOUR::PluginType type;
904 if ((prop = node.property ("type")) == 0) {
905 error << _("XML node describing plugin is missing the `type' field") << endmsg;
909 if (prop->value() == X_("ladspa") || prop->value() == X_("Ladspa")) { /* handle old school sessions */
910 type = ARDOUR::LADSPA;
911 } else if (prop->value() == X_("lv2")) {
913 } else if (prop->value() == X_("windows-vst")) {
914 type = ARDOUR::Windows_VST;
915 } else if (prop->value() == X_("lxvst")) {
916 type = ARDOUR::LXVST;
917 } else if (prop->value() == X_("audiounit")) {
918 type = ARDOUR::AudioUnit;
920 error << string_compose (_("unknown plugin type %1 in plugin insert state"),
926 prop = node.property ("unique-id");
929 #ifdef WINDOWS_VST_SUPPORT
930 /* older sessions contain VST plugins with only an "id" field.
933 if (type == ARDOUR::Windows_VST) {
934 prop = node.property ("id");
939 /*There shouldn't be any older sessions with linuxVST support.. but anyway..*/
941 if (type == ARDOUR::LXVST) {
942 prop = node.property ("id");
948 error << _("Plugin has no unique ID field") << endmsg;
953 boost::shared_ptr<Plugin> plugin = find_plugin (_session, prop->value(), type);
956 error << string_compose(
957 _("Found a reference to a plugin (\"%1\") that is unknown.\n"
958 "Perhaps it was removed or moved since it was last used."),
964 // The name of the PluginInsert comes from the plugin, nothing else
965 _name = plugin->get_info()->name;
969 // Processor::set_state() will set this, but too late
970 // for it to be available when setting up plugin
971 // state. We can't call Processor::set_state() until
972 // the plugins themselves are created and added.
976 if (_plugins.empty()) {
977 /* if we are adding the first plugin, we will need to set
978 up automatable controls.
981 create_automatable_parameters ();
982 set_control_ids (node, version);
985 if ((prop = node.property ("count")) != 0) {
986 sscanf (prop->value().c_str(), "%u", &count);
989 if (_plugins.size() != count) {
990 for (uint32_t n = 1; n < count; ++n) {
991 add_plugin (plugin_factory (plugin));
995 Processor::set_state (node, version);
997 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
999 /* find the node with the type-specific node name ("lv2", "ladspa", etc)
1000 and set all plugins to the same state.
1003 if ((*niter)->name() == plugin->state_node_name()) {
1005 plugin->set_state (**niter, version);
1007 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1008 (*i)->set_state (**niter, version);
1015 if (version < 3000) {
1017 /* Only 2.X sessions need a call to set_parameter_state() - in 3.X and above
1018 this is all handled by Automatable
1021 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1022 if ((*niter)->name() == "Redirect") {
1023 /* XXX do we need to tackle placement? i think not (pd; oct 16 2009) */
1024 Processor::set_state (**niter, version);
1029 set_parameter_state_2X (node, version);
1032 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1036 (*i)->deactivate ();
1044 PluginInsert::set_parameter_state_2X (const XMLNode& node, int version)
1046 XMLNodeList nlist = node.children();
1047 XMLNodeIterator niter;
1049 /* look for port automation node */
1051 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1053 if ((*niter)->name() != port_automation_node_name) {
1059 XMLNodeConstIterator iter;
1064 cnodes = (*niter)->children ("port");
1066 for (iter = cnodes.begin(); iter != cnodes.end(); ++iter){
1070 if ((cprop = child->property("number")) != 0) {
1071 port = cprop->value().c_str();
1073 warning << _("PluginInsert: Auto: no ladspa port number") << endmsg;
1077 sscanf (port, "%" PRIu32, &port_id);
1079 if (port_id >= _plugins[0]->parameter_count()) {
1080 warning << _("PluginInsert: Auto: port id out of range") << endmsg;
1084 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(
1085 control(Evoral::Parameter(PluginAutomation, 0, port_id), true));
1088 if (!child->children().empty()) {
1089 c->alist()->set_state (*child->children().front(), version);
1091 /* In some cases 2.X saves lists with min_yval and max_yval
1092 being FLT_MIN and FLT_MAX respectively. This causes problems
1093 in A3 because these min/max values are used to compute
1094 where GUI control points should be drawn. If we see such
1095 values, `correct' them to the min/max of the appropriate
1099 float min_y = c->alist()->get_min_y ();
1100 float max_y = c->alist()->get_max_y ();
1102 Plugin::ParameterDescriptor desc;
1103 _plugins.front()->get_parameter_descriptor (port_id, desc);
1105 if (min_y == FLT_MIN) {
1109 if (max_y == FLT_MAX) {
1113 c->alist()->set_yrange (min_y, max_y);
1116 error << string_compose (_("PluginInsert: automatable control %1 not found - ignored"), port_id) << endmsg;
1128 PluginInsert::describe_parameter (Evoral::Parameter param)
1130 if (param.type() != PluginAutomation) {
1131 return Automatable::describe_parameter(param);
1134 return _plugins[0]->describe_parameter (param);
1138 PluginInsert::signal_latency() const
1140 if (_user_latency) {
1141 return _user_latency;
1144 return _plugins[0]->signal_latency ();
1148 PluginInsert::type ()
1150 return plugin()->get_info()->type;
1153 PluginInsert::PluginControl::PluginControl (PluginInsert* p, const Evoral::Parameter ¶m, boost::shared_ptr<AutomationList> list)
1154 : AutomationControl (p->session(), param, list, p->describe_parameter(param))
1157 Plugin::ParameterDescriptor desc;
1158 p->plugin(0)->get_parameter_descriptor (param.id(), desc);
1159 _logarithmic = desc.logarithmic;
1160 _sr_dependent = desc.sr_dependent;
1161 _toggled = desc.toggled;
1164 /** @param val `user' value */
1166 PluginInsert::PluginControl::set_value (double user_val)
1168 /* FIXME: probably should be taking out some lock here.. */
1170 for (Plugins::iterator i = _plugin->_plugins.begin(); i != _plugin->_plugins.end(); ++i) {
1171 (*i)->set_parameter (_list->parameter().id(), user_val);
1174 boost::shared_ptr<Plugin> iasp = _plugin->_impulseAnalysisPlugin.lock();
1176 iasp->set_parameter (_list->parameter().id(), user_val);
1179 AutomationControl::set_value (user_val);
1183 PluginInsert::PluginControl::internal_to_interface (double val) const
1197 PluginInsert::PluginControl::interface_to_internal (double val) const
1207 PluginInsert::PluginControl::get_state ()
1211 XMLNode& node (AutomationControl::get_state());
1212 ss << parameter().id();
1213 node.add_property (X_("parameter"), ss.str());
1218 /** @return `user' val */
1220 PluginInsert::PluginControl::get_value () const
1222 /* FIXME: probably should be taking out some lock here.. */
1223 return _plugin->get_parameter (_list->parameter());
1226 boost::shared_ptr<Plugin>
1227 PluginInsert::get_impulse_analysis_plugin()
1229 boost::shared_ptr<Plugin> ret;
1230 if (_impulseAnalysisPlugin.expired()) {
1231 ret = plugin_factory(_plugins[0]);
1232 _impulseAnalysisPlugin = ret;
1234 ret = _impulseAnalysisPlugin.lock();
1241 PluginInsert::collect_signal_for_analysis (framecnt_t nframes)
1243 // called from outside the audio thread, so this should be safe
1244 // only do audio as analysis is (currently) only for audio plugins
1245 _signal_analysis_inputs.ensure_buffers( DataType::AUDIO, input_streams().n_audio(), nframes);
1246 _signal_analysis_outputs.ensure_buffers( DataType::AUDIO, output_streams().n_audio(), nframes);
1248 _signal_analysis_collected_nframes = 0;
1249 _signal_analysis_collect_nframes_max = nframes;
1252 /** Add a plugin to our list */
1254 PluginInsert::add_plugin (boost::shared_ptr<Plugin> plugin)
1256 plugin->set_insert_info (this);
1257 _plugins.push_back (plugin);
1261 PluginInsert::realtime_handle_transport_stopped ()
1263 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1264 (*i)->realtime_handle_transport_stopped ();
1269 PluginInsert::realtime_locate ()
1271 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1272 (*i)->realtime_locate ();
1277 PluginInsert::monitoring_changed ()
1279 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1280 (*i)->monitoring_changed ();