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.
22 #include <sigc++/bind.h>
24 #include <pbd/failed_constructor.h>
25 #include <pbd/xml++.h>
26 #include <pbd/stacktrace.h>
28 #include <ardour/insert.h>
29 #include <ardour/plugin.h>
30 #include <ardour/port.h>
31 #include <ardour/route.h>
32 #include <ardour/ladspa_plugin.h>
35 #include <ardour/lv2_plugin.h>
39 #include <ardour/vst_plugin.h>
42 #ifdef HAVE_AUDIOUNITS
43 #include <ardour/audio_unit.h>
46 #include <ardour/audioengine.h>
47 #include <ardour/session.h>
48 #include <ardour/types.h>
53 using namespace ARDOUR;
56 Insert::Insert(Session& s, string name, Placement p)
57 : Redirect (s, name, p)
61 Insert::Insert(Session& s, string name, Placement p, int imin, int imax, int omin, int omax)
62 : Redirect (s, name, p, imin, imax, omin, omax)
66 /***************************************************************
67 Plugin inserts: send data through a plugin
68 ***************************************************************/
70 const string PluginInsert::port_automation_node_name = "PortAutomation";
72 PluginInsert::PluginInsert (Session& s, boost::shared_ptr<Plugin> plug, Placement placement)
73 : Insert (s, plug->name(), placement)
75 /* the first is the master */
77 _plugins.push_back (plug);
79 _plugins[0]->ParameterChanged.connect (mem_fun (*this, &PluginInsert::parameter_changed));
83 RedirectCreated (this); /* EMIT SIGNAL */
86 PluginInsert::PluginInsert (Session& s, const XMLNode& node)
87 : Insert (s, "will change", PreFader)
89 if (set_state (node)) {
90 throw failed_constructor();
93 _plugins[0]->ParameterChanged.connect (mem_fun (*this, &PluginInsert::parameter_changed));
96 PluginInsert::PluginInsert (const PluginInsert& other)
97 : Insert (other._session, other.plugin()->name(), other.placement())
99 uint32_t count = other._plugins.size();
101 /* make as many copies as requested */
102 for (uint32_t n = 0; n < count; ++n) {
103 _plugins.push_back (plugin_factory (other.plugin (n)));
107 _plugins[0]->ParameterChanged.connect (mem_fun (*this, &PluginInsert::parameter_changed));
111 RedirectCreated (this); /* EMIT SIGNAL */
115 PluginInsert::set_count (uint32_t num)
117 bool require_state = !_plugins.empty();
119 /* this is a bad idea.... we shouldn't do this while active.
120 only a route holding their redirect_lock should be calling this
125 } else if (num > _plugins.size()) {
126 uint32_t diff = num - _plugins.size();
128 for (uint32_t n = 0; n < diff; ++n) {
129 _plugins.push_back (plugin_factory (_plugins[0]));
132 /* XXX do something */
136 } else if (num < _plugins.size()) {
137 uint32_t diff = _plugins.size() - num;
138 for (uint32_t n= 0; n < diff; ++n) {
147 PluginInsert::init ()
152 PluginInsert::~PluginInsert ()
154 GoingAway (); /* EMIT SIGNAL */
158 PluginInsert::automation_list_creation_callback (uint32_t which, AutomationList& alist)
160 alist.automation_state_changed.connect (sigc::bind (mem_fun (*this, &PluginInsert::auto_state_changed), (which)));
164 PluginInsert::auto_state_changed (uint32_t which)
166 AutomationList& alist (automation_list (which));
168 if (alist.automation_state() != Off) {
169 _plugins[0]->set_parameter (which, alist.eval (_session.transport_frame()));
174 PluginInsert::output_streams() const
176 int32_t out = _plugins[0]->get_info()->n_outputs;
179 return _plugins[0]->output_streams ();
181 return out * _plugins.size();
186 PluginInsert::input_streams() const
188 int32_t in = _plugins[0]->get_info()->n_inputs;
191 return _plugins[0]->input_streams ();
193 return in * _plugins.size();
198 PluginInsert::natural_output_streams() const
200 return _plugins[0]->get_info()->n_outputs;
204 PluginInsert::natural_input_streams() const
206 return _plugins[0]->get_info()->n_inputs;
210 PluginInsert::is_generator() const
212 /* XXX more finesse is possible here. VST plugins have a
213 a specific "instrument" flag, for example.
216 return _plugins[0]->get_info()->n_inputs == 0;
220 PluginInsert::set_automatable ()
222 /* fill the parameter automation list with null AutomationLists */
224 parameter_automation.assign (_plugins.front()->parameter_count(), (AutomationList*) 0);
228 a = _plugins.front()->automatable ();
230 for (set<uint32_t>::iterator i = a.begin(); i != a.end(); ++i) {
236 PluginInsert::parameter_changed (uint32_t which, float val)
238 vector<boost::shared_ptr<Plugin> >::iterator i = _plugins.begin();
240 /* don't set the first plugin, just all the slaves */
242 if (i != _plugins.end()) {
244 for (; i != _plugins.end(); ++i) {
245 (*i)->set_parameter (which, val);
251 PluginInsert::set_block_size (nframes_t nframes)
253 for (vector<boost::shared_ptr<Plugin> >::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
254 (*i)->set_block_size (nframes);
259 PluginInsert::activate ()
261 for (vector<boost::shared_ptr<Plugin> >::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
267 PluginInsert::deactivate ()
269 for (vector<boost::shared_ptr<Plugin> >::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
275 PluginInsert::connect_and_run (vector<Sample*>& bufs, uint32_t nbufs, nframes_t nframes, nframes_t offset, bool with_auto, nframes_t now)
277 int32_t in_index = 0;
278 int32_t out_index = 0;
280 /* Note that we've already required that plugins
281 be able to handle in-place processing.
284 // cerr << "Connect and run for " << _plugins[0]->name() << " auto ? " << with_auto << " nf = " << nframes << " off = " << offset << endl;
288 vector<AutomationList*>::iterator li;
291 for (n = 0, li = parameter_automation.begin(); li != parameter_automation.end(); ++li, ++n) {
293 AutomationList* alist = *li;
295 if (alist && alist->automation_playback()) {
298 float val = alist->rt_safe_eval (now, valid);
301 /* set the first plugin, the others will be set via signals */
302 // cerr << "\t@ " << now << " param[" << n << "] = " << val << endl;
303 _plugins[0]->set_parameter (n, val);
310 for (vector<boost::shared_ptr<Plugin> >::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
311 (*i)->connect_and_run (bufs, nbufs, in_index, out_index, nframes, offset);
316 PluginInsert::automation_snapshot (nframes_t now, bool force)
318 vector<AutomationList*>::iterator li;
321 for (n = 0, li = parameter_automation.begin(); li != parameter_automation.end(); ++li, ++n) {
323 AutomationList *alist = *li;
325 if (alist && alist->automation_write ()) {
327 float val = _plugins[0]->get_parameter (n);
328 alist->rt_add (now, val);
329 last_automation_snapshot = now;
335 PluginInsert::transport_stopped (nframes_t now)
337 vector<AutomationList*>::iterator li;
340 for (n = 0, li = parameter_automation.begin(); li != parameter_automation.end(); ++li, ++n) {
342 AutomationList* alist = *li;
345 alist->reposition_for_rt_add (now);
346 if (alist->automation_state() != Off) {
347 _plugins[0]->set_parameter (n, alist->eval (now));
354 PluginInsert::silence (nframes_t nframes)
356 int32_t in_index = 0;
357 int32_t out_index = 0;
361 for (vector<boost::shared_ptr<Plugin> >::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
363 (*i)->connect_and_run (_session.get_silent_buffers (n), n, in_index, out_index, nframes, 0);
369 PluginInsert::run (vector<Sample *>& bufs, uint32_t nbufs, nframes_t nframes)
373 if (_session.transport_rolling()) {
374 automation_run (bufs, nbufs, nframes);
376 connect_and_run (bufs, nbufs, nframes, 0, false);
381 uint32_t in = input_streams ();
382 uint32_t out = output_streams ();
386 /* not active, but something has make up for any channel count increase,
387 so copy the last buffer to the extras.
390 for (uint32_t n = out - in; n < out && n < nbufs; ++n) {
391 memcpy (bufs[n], bufs[in - 1], sizeof (Sample) * nframes);
398 PluginInsert::set_parameter (uint32_t port, float val)
400 /* the others will be set from the event triggered by this */
402 _plugins[0]->set_parameter (port, val);
404 if (automation_list (port).automation_write()) {
405 automation_list (port).add (_session.audible_frame(), val);
408 _session.set_dirty();
412 PluginInsert::automation_run (vector<Sample *>& bufs, uint32_t nbufs, nframes_t nframes)
414 ControlEvent next_event (0, 0.0f);
415 nframes_t now = _session.transport_frame ();
416 nframes_t end = now + nframes;
417 nframes_t offset = 0;
419 Glib::Mutex::Lock lm (_automation_lock, Glib::TRY_LOCK);
422 connect_and_run (bufs, nbufs, nframes, 0, false, now);
426 if (!find_next_event (now, end, next_event)) {
427 /* no events have a time within the relevant range */
428 connect_and_run (bufs, nbufs, nframes, 0, true, now);
433 nframes_t cnt = min (((nframes_t) ceil (next_event.when) - now), nframes);
435 connect_and_run (bufs, nbufs, cnt, offset, true, now);
441 if (!find_next_event (now, end, next_event)) {
446 /* cleanup anything that is left to do */
449 connect_and_run (bufs, nbufs, nframes, offset, true, now);
455 PluginInsert::default_parameter_value (uint32_t port)
457 if (_plugins.empty()) {
458 fatal << _("programming error: ") << X_("PluginInsert::default_parameter_value() called with no plugin")
463 return _plugins[0]->default_value (port);
467 PluginInsert::set_port_automation_state (uint32_t port, AutoState s)
469 if (port < _plugins[0]->parameter_count()) {
471 AutomationList& al = automation_list (port);
473 if (s != al.automation_state()) {
474 al.set_automation_state (s);
475 _session.set_dirty ();
481 PluginInsert::get_port_automation_state (uint32_t port)
483 if (port < _plugins[0]->parameter_count()) {
484 return automation_list (port).automation_state();
491 PluginInsert::protect_automation ()
493 set<uint32_t> automated_params;
495 what_has_automation (automated_params);
497 for (set<uint32_t>::iterator i = automated_params.begin(); i != automated_params.end(); ++i) {
499 AutomationList& al = automation_list (*i);
501 switch (al.automation_state()) {
503 al.set_automation_state (Off);
506 al.set_automation_state (Play);
514 boost::shared_ptr<Plugin>
515 PluginInsert::plugin_factory (boost::shared_ptr<Plugin> other)
517 boost::shared_ptr<LadspaPlugin> lp;
519 boost::shared_ptr<LV2Plugin> lv2p;
522 boost::shared_ptr<VSTPlugin> vp;
524 #ifdef HAVE_AUDIOUNITS
525 boost::shared_ptr<AUPlugin> ap;
528 if ((lp = boost::dynamic_pointer_cast<LadspaPlugin> (other)) != 0) {
529 return boost::shared_ptr<Plugin> (new LadspaPlugin (*lp));
531 } else if ((lv2p = boost::dynamic_pointer_cast<LV2Plugin> (other)) != 0) {
532 return boost::shared_ptr<Plugin> (new LV2Plugin (*lv2p));
535 } else if ((vp = boost::dynamic_pointer_cast<VSTPlugin> (other)) != 0) {
536 return boost::shared_ptr<Plugin> (new VSTPlugin (*vp));
538 #ifdef HAVE_AUDIOUNITS
539 } else if ((ap = boost::dynamic_pointer_cast<AUPlugin> (other)) != 0) {
540 return boost::shared_ptr<Plugin> (new AUPlugin (*ap));
544 fatal << string_compose (_("programming error: %1"),
545 X_("unknown plugin type in PluginInsert::plugin_factory"))
548 return boost::shared_ptr<Plugin> ((Plugin*) 0);
552 PluginInsert::configure_io (int32_t magic, int32_t in, int32_t out)
556 if ((ret = set_count (magic)) < 0) {
560 /* if we're running replicated plugins, each plugin has
561 the same i/o configuration and we may need to announce how many
562 output streams there are.
564 if we running a single plugin, we need to configure it.
567 return _plugins[0]->configure_io (in, out);
571 PluginInsert::can_do (int32_t in, int32_t& out)
573 return _plugins[0]->can_do (in, out);
577 PluginInsert::get_state(void)
583 PluginInsert::state (bool full)
586 XMLNode *node = new XMLNode("Insert");
588 node->add_child_nocopy (Redirect::state (full));
590 node->add_property ("type", _plugins[0]->state_node_name());
591 node->add_property("unique-id", _plugins[0]->unique_id());
592 node->add_property("count", string_compose("%1", _plugins.size()));
593 node->add_child_nocopy (_plugins[0]->get_state());
595 /* add controllables */
597 XMLNode* control_node = new XMLNode (X_("controls"));
599 for (uint32_t x = 0; x < _plugins[0]->parameter_count(); ++x) {
600 Controllable* c = _plugins[0]->get_nth_control (x, true);
602 XMLNode& controllable_state (c->get_state());
603 controllable_state.add_property ("parameter", to_string (x, std::dec));
604 control_node->add_child_nocopy (controllable_state);
607 node->add_child_nocopy (*control_node);
609 /* add port automation state */
610 XMLNode *autonode = new XMLNode(port_automation_node_name);
611 set<uint32_t> automatable = _plugins[0]->automatable();
613 for (set<uint32_t>::iterator x = automatable.begin(); x != automatable.end(); ++x) {
615 XMLNode* child = new XMLNode("port");
616 snprintf(buf, sizeof(buf), "%" PRIu32, *x);
617 child->add_property("number", string(buf));
620 LV2Plugin* lv2p = dynamic_cast<LV2Plugin*>(_plugins[0].get());
622 child->add_property("symbol", string(lv2p->port_symbol(*x)));
626 child->add_child_nocopy (automation_list (*x).state (full));
627 autonode->add_child_nocopy (*child);
630 node->add_child_nocopy (*autonode);
636 PluginInsert::set_state(const XMLNode& node)
638 XMLNodeList nlist = node.children();
639 XMLNodeIterator niter;
640 XMLPropertyList plist;
641 const XMLProperty *prop;
642 ARDOUR::PluginType type;
644 if ((prop = node.property ("type")) == 0) {
645 error << _("XML node describing insert is missing the `type' field") << endmsg;
649 if (prop->value() == X_("ladspa") || prop->value() == X_("Ladspa")) { /* handle old school sessions */
650 type = ARDOUR::LADSPA;
651 } else if (prop->value() == X_("lv2")) {
653 } else if (prop->value() == X_("vst")) {
655 } else if (prop->value() == X_("audiounit")) {
656 type = ARDOUR::AudioUnit;
658 error << string_compose (_("unknown plugin type %1 in plugin insert state"),
664 prop = node.property ("unique-id");
667 /* older sessions contain VST plugins with only an "id" field.
670 if (type == ARDOUR::VST) {
671 prop = node.property ("id");
677 error << _("Plugin has no unique ID field") << endmsg;
682 boost::shared_ptr<Plugin> plugin;
684 plugin = find_plugin (_session, prop->value(), type);
687 error << string_compose(_("Found a reference to a plugin (\"%1\") that is unknown.\n"
688 "Perhaps it was removed or moved since it was last used."), prop->value())
695 if ((prop = node.property ("count")) != 0) {
696 sscanf (prop->value().c_str(), "%u", &count);
699 if (_plugins.size() != count) {
701 _plugins.push_back (plugin);
703 for (uint32_t n=1; n < count; ++n) {
704 _plugins.push_back (plugin_factory (plugin));
708 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
709 if ((*niter)->name() == plugin->state_node_name()) {
710 for (vector<boost::shared_ptr<Plugin> >::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
711 (*i)->set_state (**niter);
717 if (niter == nlist.end()) {
718 error << string_compose(_("XML node describing a plugin insert is missing the `%1' information"), plugin->state_node_name()) << endmsg;
722 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
723 if ((*niter)->name() == Redirect::state_node_name) {
724 Redirect::set_state (**niter);
729 if (niter == nlist.end()) {
730 error << _("XML node describing insert is missing a Redirect node") << endmsg;
734 /* look for controllables node */
736 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
738 if ((*niter)->name() != X_("controls")) {
742 XMLNodeList grandchildren ((*niter)->children());
744 XMLNodeIterator gciter;
747 for (gciter = grandchildren.begin(); gciter != grandchildren.end(); ++gciter) {
748 if ((prop = (*gciter)->property (X_("parameter"))) != 0) {
749 param = atoi (prop->value());
750 /* force creation of controllable for this parameter */
751 _plugins[0]->make_nth_control (param, **gciter);
760 /* look for port automation node */
762 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
764 if ((*niter)->name() != port_automation_node_name) {
770 XMLNodeConstIterator iter;
775 cnodes = (*niter)->children ("port");
777 for(iter = cnodes.begin(); iter != cnodes.end(); ++iter){
781 if ((cprop = child->property("number")) != 0) {
782 port = cprop->value().c_str();
784 warning << _("PluginInsert: Auto: no ladspa port number") << endmsg;
788 sscanf (port, "%" PRIu32, &port_id);
790 if (port_id >= _plugins[0]->parameter_count()) {
791 warning << _("PluginInsert: Auto: port id out of range") << endmsg;
795 if (!child->children().empty()) {
796 automation_list (port_id).set_state (*child->children().front());
798 if ((cprop = child->property("auto")) != 0) {
803 sscanf (cprop->value().c_str(), "0x%x", &x);
804 automation_list (port_id).set_automation_state (AutoState (x));
810 automation_list (port_id).set_automation_state (Off);
821 if (niter == nlist.end()) {
822 warning << string_compose(_("XML node describing a port automation is missing the `%1' information"), port_automation_node_name) << endmsg;
825 // The name of the PluginInsert comes from the plugin, nothing else
826 set_name(plugin->get_info()->name,this);
832 PluginInsert::describe_parameter (uint32_t what)
834 return _plugins[0]->describe_parameter (what);
838 PluginInsert::latency()
840 return _plugins[0]->latency ();
844 PluginInsert::type ()
846 boost::shared_ptr<LadspaPlugin> lp;
848 boost::shared_ptr<VSTPlugin> vp;
850 #ifdef HAVE_AUDIOUNITS
851 boost::shared_ptr<AUPlugin> ap;
854 boost::shared_ptr<LV2Plugin> lv2p;
857 PluginPtr other = plugin ();
859 if ((lp = boost::dynamic_pointer_cast<LadspaPlugin> (other)) != 0) {
860 return ARDOUR::LADSPA;
862 } else if ((vp = boost::dynamic_pointer_cast<VSTPlugin> (other)) != 0) {
865 #ifdef HAVE_AUDIOUNITS
866 } else if ((ap = boost::dynamic_pointer_cast<AUPlugin> (other)) != 0) {
867 return ARDOUR::AudioUnit;
870 } else if ((lv2p = boost::dynamic_pointer_cast<LV2Plugin> (other)) != 0) {
874 error << "Unknown plugin type" << endmsg;
876 return (ARDOUR::PluginType) 0;
880 /***************************************************************
881 Port inserts: send output to a port, pick up input at a port
882 ***************************************************************/
884 PortInsert::PortInsert (Session& s, Placement p)
885 : Insert (s, string_compose (_("insert %1"), (bitslot = s.next_insert_id()) + 1), p, 1, -1, 1, -1)
888 RedirectCreated (this); /* EMIT SIGNAL */
892 PortInsert::PortInsert (const PortInsert& other)
893 : Insert (other._session, string_compose (_("insert %1"), (bitslot = other._session.next_insert_id()) + 1), other.placement(), 1, -1, 1, -1)
896 RedirectCreated (this); /* EMIT SIGNAL */
904 PortInsert::PortInsert (Session& s, const XMLNode& node)
905 : Insert (s, "will change", PreFader)
907 bitslot = 0xffffffff;
908 if (set_state (node)) {
909 throw failed_constructor();
912 RedirectCreated (this); /* EMIT SIGNAL */
915 PortInsert::~PortInsert ()
921 PortInsert::run (vector<Sample *>& bufs, uint32_t nbufs, nframes_t nframes)
923 if (n_outputs() == 0) {
928 /* deliver silence */
934 vector<Port*>::iterator o;
935 vector<Port*>::iterator i;
939 for (o = _outputs.begin(), n = 0; o != _outputs.end(); ++o, ++n) {
940 memcpy (get_output_buffer (n, nframes), bufs[min(nbufs,n)], sizeof (Sample) * nframes);
941 (*o)->mark_silence (false);
946 for (i = _inputs.begin(), n = 0; i != _inputs.end(); ++i, ++n) {
947 memcpy (bufs[min(nbufs,n)], get_input_buffer (n, nframes), sizeof (Sample) * nframes);
952 PortInsert::get_state(void)
958 PortInsert::state (bool full)
960 XMLNode *node = new XMLNode("Insert");
962 node->add_child_nocopy (Redirect::state(full));
963 node->add_property ("type", "port");
964 snprintf (buf, sizeof (buf), "%" PRIu32, bitslot);
965 node->add_property ("bitslot", buf);
971 PortInsert::set_state(const XMLNode& node)
973 XMLNodeList nlist = node.children();
974 XMLNodeIterator niter;
975 XMLPropertyList plist;
976 const XMLProperty *prop;
978 if ((prop = node.property ("type")) == 0) {
979 error << _("XML node describing insert is missing the `type' field") << endmsg;
983 if (prop->value() != "port") {
984 error << _("non-port insert XML used for port plugin insert") << endmsg;
988 if ((prop = node.property ("bitslot")) == 0) {
989 bitslot = _session.next_insert_id();
991 uint32_t old_bitslot = bitslot;
992 sscanf (prop->value().c_str(), "%" PRIu32, &bitslot);
994 if (old_bitslot != bitslot) {
995 _session.mark_insert_id (bitslot);
999 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1000 if ((*niter)->name() == Redirect::state_node_name) {
1001 Redirect::set_state (**niter);
1006 if (niter == nlist.end()) {
1007 error << _("XML node describing insert is missing a Redirect node") << endmsg;
1015 PortInsert::latency()
1017 /* because we deliver and collect within the same cycle,
1018 all I/O is necessarily delayed by at least frames_per_cycle().
1020 if the return port for insert has its own latency, we
1021 need to take that into account too.
1024 return _session.engine().frames_per_cycle() + input_latency();
1028 PortInsert::can_do (int32_t in, int32_t& out)
1030 if (input_maximum() == -1 && output_maximum() == -1) {
1032 /* not configured yet */
1039 /* the "input" config for a port insert corresponds to how
1040 many output ports it will have.
1043 if (output_maximum() == in) {
1053 PortInsert::configure_io (int32_t ignored_magic, int32_t in, int32_t out)
1055 /* do not allow configuration to be changed outside the range of
1056 the last request config. or something like that.
1059 set_output_maximum (in);
1060 set_output_minimum (in);
1061 set_input_maximum (out);
1062 set_input_minimum (out);
1064 /* this can be momentarily confusing:
1066 the number of inputs we are required to handle corresponds
1067 to the number of output ports we need.
1069 the number of outputs we are required to have corresponds
1070 to the number of input ports we need.
1081 return ensure_io (out, in, false, this);
1085 PortInsert::output_streams() const
1091 PortInsert::input_streams() const
1093 return n_outputs ();