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.
23 #include <sigc++/bind.h>
25 #include <pbd/failed_constructor.h>
26 #include <pbd/xml++.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/vst_plugin.h>
38 #ifdef HAVE_AUDIOUNITS
39 #include <ardour/audio_unit.h>
42 #include <ardour/audioengine.h>
43 #include <ardour/session.h>
44 #include <ardour/types.h>
49 using namespace ARDOUR;
52 Insert::Insert(Session& s, Placement p)
53 : Redirect (s, s.next_insert_name(), p)
57 Insert::Insert(Session& s, Placement p, int imin, int imax, int omin, int omax)
58 : Redirect (s, s.next_insert_name(), p, imin, imax, omin, omax)
62 Insert::Insert(Session& s, string name, Placement p)
63 : Redirect (s, name, p)
67 /***************************************************************
68 Plugin inserts: send data through a plugin
69 ***************************************************************/
71 const string PluginInsert::port_automation_node_name = "PortAutomation";
73 PluginInsert::PluginInsert (Session& s, boost::shared_ptr<Plugin> plug, Placement placement)
74 : Insert (s, plug->name(), placement)
76 /* the first is the master */
78 _plugins.push_back (plug);
80 _plugins[0]->ParameterChanged.connect (mem_fun (*this, &PluginInsert::parameter_changed));
85 save_state (_("initial state"));
89 Glib::Mutex::Lock em (_session.engine().process_lock());
90 IO::MoreOutputs (output_streams ());
93 RedirectCreated (this); /* EMIT SIGNAL */
96 PluginInsert::PluginInsert (Session& s, const XMLNode& node)
97 : Insert (s, "will change", PreFader)
99 if (set_state (node)) {
100 throw failed_constructor();
106 save_state (_("initial state"));
109 _plugins[0]->ParameterChanged.connect (mem_fun (*this, &PluginInsert::parameter_changed));
112 Glib::Mutex::Lock em (_session.engine().process_lock());
113 IO::MoreOutputs (output_streams());
117 PluginInsert::PluginInsert (const PluginInsert& other)
118 : Insert (other._session, other.plugin()->name(), other.placement())
120 uint32_t count = other._plugins.size();
122 /* make as many copies as requested */
123 for (uint32_t n = 0; n < count; ++n) {
124 _plugins.push_back (plugin_factory (other.plugin (n)));
128 _plugins[0]->ParameterChanged.connect (mem_fun (*this, &PluginInsert::parameter_changed));
133 save_state (_("initial state"));
136 RedirectCreated (this); /* EMIT SIGNAL */
140 PluginInsert::set_count (uint32_t num)
142 bool require_state = !_plugins.empty();
144 /* this is a bad idea.... we shouldn't do this while active.
145 only a route holding their redirect_lock should be calling this
150 } else if (num > _plugins.size()) {
151 uint32_t diff = num - _plugins.size();
153 for (uint32_t n = 0; n < diff; ++n) {
154 _plugins.push_back (plugin_factory (_plugins[0]));
157 /* XXX do something */
161 } else if (num < _plugins.size()) {
162 uint32_t diff = _plugins.size() - num;
163 for (uint32_t n= 0; n < diff; ++n) {
172 PluginInsert::init ()
176 set<uint32_t>::iterator s;
179 PluginInsert::~PluginInsert ()
181 GoingAway (); /* EMIT SIGNAL */
185 PluginInsert::automation_list_creation_callback (uint32_t which, AutomationList& alist)
187 alist.automation_state_changed.connect (sigc::bind (mem_fun (*this, &PluginInsert::auto_state_changed), (which)));
191 PluginInsert::auto_state_changed (uint32_t which)
193 AutomationList& alist (automation_list (which));
195 if (alist.automation_state() != Off) {
196 _plugins[0]->set_parameter (which, alist.eval (_session.transport_frame()));
201 PluginInsert::output_streams() const
203 return _plugins[0]->get_info()->n_outputs * _plugins.size();
207 PluginInsert::input_streams() const
209 return _plugins[0]->get_info()->n_inputs * _plugins.size();
213 PluginInsert::natural_output_streams() const
215 return _plugins[0]->get_info()->n_outputs;
219 PluginInsert::natural_input_streams() const
221 return _plugins[0]->get_info()->n_inputs;
225 PluginInsert::is_generator() const
227 /* XXX more finesse is possible here. VST plugins have a
228 a specific "instrument" flag, for example.
231 return _plugins[0]->get_info()->n_inputs == 0;
235 PluginInsert::set_automatable ()
239 a = _plugins.front()->automatable ();
241 for (set<uint32_t>::iterator i = a.begin(); i != a.end(); ++i) {
247 PluginInsert::parameter_changed (uint32_t which, float val)
249 vector<boost::shared_ptr<Plugin> >::iterator i = _plugins.begin();
251 /* don't set the first plugin, just all the slaves */
253 if (i != _plugins.end()) {
255 for (; i != _plugins.end(); ++i) {
256 (*i)->set_parameter (which, val);
262 PluginInsert::set_block_size (nframes_t nframes)
264 for (vector<boost::shared_ptr<Plugin> >::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
265 (*i)->set_block_size (nframes);
270 PluginInsert::activate ()
272 for (vector<boost::shared_ptr<Plugin> >::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
278 PluginInsert::deactivate ()
280 for (vector<boost::shared_ptr<Plugin> >::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
286 PluginInsert::connect_and_run (vector<Sample*>& bufs, uint32_t nbufs, nframes_t nframes, nframes_t offset, bool with_auto, nframes_t now)
288 int32_t in_index = 0;
289 int32_t out_index = 0;
291 /* Note that we've already required that plugins
292 be able to handle in-place processing.
297 map<uint32_t,AutomationList*>::iterator li;
300 for (n = 0, li = parameter_automation.begin(); li != parameter_automation.end(); ++li, ++n) {
302 AutomationList& alist (*((*li).second));
304 if (alist.automation_playback()) {
307 float val = alist.rt_safe_eval (now, valid);
310 /* set the first plugin, the others will be set via signals */
311 _plugins[0]->set_parameter ((*li).first, val);
318 for (vector<boost::shared_ptr<Plugin> >::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
319 (*i)->connect_and_run (bufs, nbufs, in_index, out_index, nframes, offset);
322 /* leave remaining channel buffers alone */
326 PluginInsert::transport_stopped (nframes_t now)
328 map<uint32_t,AutomationList*>::iterator li;
330 for (li = parameter_automation.begin(); li != parameter_automation.end(); ++li) {
331 AutomationList& alist (*(li->second));
332 alist.reposition_for_rt_add (now);
334 if (alist.automation_state() != Off) {
335 _plugins[0]->set_parameter (li->first, alist.eval (now));
341 PluginInsert::silence (nframes_t nframes, nframes_t offset)
343 int32_t in_index = 0;
344 int32_t out_index = 0;
349 for (vector<boost::shared_ptr<Plugin> >::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
350 n = (*i) -> get_info()->n_inputs;
351 (*i)->connect_and_run (_session.get_silent_buffers (n), n, in_index, out_index, nframes, offset);
357 PluginInsert::run (vector<Sample *>& bufs, uint32_t nbufs, nframes_t nframes, nframes_t offset)
361 if (_session.transport_rolling()) {
362 automation_run (bufs, nbufs, nframes, offset);
364 connect_and_run (bufs, nbufs, nframes, offset, false);
367 uint32_t in = _plugins[0]->get_info()->n_inputs;
368 uint32_t out = _plugins[0]->get_info()->n_outputs;
372 /* not active, but something has make up for any channel count increase */
374 for (uint32_t n = out - in; n < out; ++n) {
375 memcpy (bufs[n], bufs[in - 1], sizeof (Sample) * nframes);
382 PluginInsert::set_parameter (uint32_t port, float val)
384 /* the others will be set from the event triggered by this */
386 _plugins[0]->set_parameter (port, val);
388 if (automation_list (port).automation_write()) {
389 automation_list (port).add (_session.audible_frame(), val);
392 _session.set_dirty();
396 PluginInsert::automation_run (vector<Sample *>& bufs, uint32_t nbufs, nframes_t nframes, nframes_t offset)
398 ControlEvent next_event (0, 0.0f);
399 nframes_t now = _session.transport_frame ();
400 nframes_t end = now + nframes;
402 Glib::Mutex::Lock lm (_automation_lock, Glib::TRY_LOCK);
405 connect_and_run (bufs, nbufs, nframes, offset, false);
409 if (!find_next_event (now, end, next_event)) {
411 /* no events have a time within the relevant range */
413 connect_and_run (bufs, nbufs, nframes, offset, true, now);
419 nframes_t cnt = min (((nframes_t) floor (next_event.when) - now), nframes);
421 connect_and_run (bufs, nbufs, cnt, offset, true, now);
427 if (!find_next_event (now, end, next_event)) {
432 /* cleanup anything that is left to do */
435 connect_and_run (bufs, nbufs, nframes, offset, true, now);
440 PluginInsert::default_parameter_value (uint32_t port)
442 if (_plugins.empty()) {
443 fatal << _("programming error: ") << X_("PluginInsert::default_parameter_value() called with no plugin")
448 return _plugins[0]->default_value (port);
452 PluginInsert::set_port_automation_state (uint32_t port, AutoState s)
454 if (port < _plugins[0]->parameter_count()) {
456 AutomationList& al = automation_list (port);
458 if (s != al.automation_state()) {
459 al.set_automation_state (s);
460 _session.set_dirty ();
466 PluginInsert::get_port_automation_state (uint32_t port)
468 if (port < _plugins[0]->parameter_count()) {
469 return automation_list (port).automation_state();
476 PluginInsert::protect_automation ()
478 set<uint32_t> automated_params;
480 what_has_automation (automated_params);
482 for (set<uint32_t>::iterator i = automated_params.begin(); i != automated_params.end(); ++i) {
484 AutomationList& al = automation_list (*i);
486 switch (al.automation_state()) {
489 al.set_automation_state (Off);
497 boost::shared_ptr<Plugin>
498 PluginInsert::plugin_factory (boost::shared_ptr<Plugin> other)
500 boost::shared_ptr<LadspaPlugin> lp;
502 boost::shared_ptr<VSTPlugin> vp;
504 #ifdef HAVE_AUDIOUNITS
505 boost::shared_ptr<AUPlugin> ap;
508 if ((lp = boost::dynamic_pointer_cast<LadspaPlugin> (other)) != 0) {
509 return boost::shared_ptr<Plugin> (new LadspaPlugin (*lp));
511 } else if ((vp = boost::dynamic_pointer_cast<VSTPlugin> (other)) != 0) {
512 return boost::shared_ptr<Plugin> (new VSTPlugin (*vp));
514 #ifdef HAVE_AUDIOUNITS
515 } else if ((ap = boost::dynamic_pointer_cast<AUPlugin> (other)) != 0) {
516 return boost::shared_ptr<Plugin> (new AUPlugin (*ap));
520 fatal << string_compose (_("programming error: %1"),
521 X_("unknown plugin type in PluginInsert::plugin_factory"))
524 return boost::shared_ptr<Plugin> ((Plugin*) 0);
528 PluginInsert::compute_output_streams (int32_t cnt) const
530 return _plugins[0]->get_info()->n_outputs * cnt;
534 PluginInsert::configure_io (int32_t magic, int32_t in, int32_t out)
536 return set_count (magic);
540 PluginInsert::can_support_input_configuration (int32_t in) const
542 int32_t outputs = _plugins[0]->get_info()->n_outputs;
543 int32_t inputs = _plugins[0]->get_info()->n_inputs;
547 /* instrument plugin, always legal, but it throws
548 away any existing active streams.
554 if (outputs == 1 && inputs == 1) {
555 /* mono plugin, replicate as needed */
564 if ((inputs < in) && (inputs % in == 0)) {
566 /* number of inputs is a factor of the requested input
567 configuration, so we can replicate.
579 PluginInsert::get_state(void)
585 PluginInsert::state (bool full)
588 XMLNode *node = new XMLNode("Insert");
590 node->add_child_nocopy (Redirect::state (full));
592 node->add_property ("type", _plugins[0]->state_node_name());
593 snprintf(buf, sizeof(buf), "%s", _plugins[0]->name());
594 node->add_property("id", string(buf));
595 if (_plugins[0]->state_node_name() == "ladspa") {
597 snprintf (buf, sizeof (buf), "%ld", _plugins[0]->get_info()->unique_id);
598 node->add_property("unique-id", string(buf));
600 node->add_property("count", string_compose("%1", _plugins.size()));
601 node->add_child_nocopy (_plugins[0]->get_state());
603 /* add port automation state */
604 XMLNode *autonode = new XMLNode(port_automation_node_name);
605 set<uint32_t> automatable = _plugins[0]->automatable();
607 for (set<uint32_t>::iterator x = automatable.begin(); x != automatable.end(); ++x) {
609 XMLNode* child = new XMLNode("port");
610 snprintf(buf, sizeof(buf), "%" PRIu32, *x);
611 child->add_property("number", string(buf));
614 snprintf(buf, sizeof(buf), "0x%x", automation_list (*x).automation_state ());
616 snprintf(buf, sizeof(buf), "0x%x", ARDOUR::Off);
618 child->add_property("auto", string(buf));
620 autonode->add_child_nocopy (*child);
623 node->add_child_nocopy (*autonode);
629 PluginInsert::set_state(const XMLNode& node)
631 XMLNodeList nlist = node.children();
632 XMLNodeIterator niter;
633 XMLPropertyList plist;
634 const XMLProperty *prop;
636 ARDOUR::PluginType type;
638 if ((prop = node.property ("type")) == 0) {
639 error << _("XML node describing insert is missing the `type' field") << endmsg;
643 if (prop->value() == X_("ladspa") || prop->value() == X_("Ladspa")) { /* handle old school sessions */
644 type = ARDOUR::LADSPA;
645 } else if (prop->value() == X_("vst")) {
648 error << string_compose (_("unknown plugin type %1 in plugin insert state"),
654 prop = node.property ("unique-id");
656 unique = atol(prop->value().c_str());
659 if ((prop = node.property ("id")) == 0) {
660 error << _("XML node describing insert is missing the `id' field") << endmsg;
664 boost::shared_ptr<Plugin> plugin;
667 plugin = find_plugin (_session, "", unique, type);
669 plugin = find_plugin (_session, prop->value(), 0, type);
673 error << string_compose(_("Found a reference to a plugin (\"%1\") that is unknown.\n"
674 "Perhaps it was removed or moved since it was last used."), prop->value())
681 if ((prop = node.property ("count")) != 0) {
682 sscanf (prop->value().c_str(), "%u", &count);
685 if (_plugins.size() != count) {
687 _plugins.push_back (plugin);
689 for (uint32_t n=1; n < count; ++n) {
690 _plugins.push_back (plugin_factory (plugin));
694 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
695 if ((*niter)->name() == plugin->state_node_name()) {
696 for (vector<boost::shared_ptr<Plugin> >::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
697 (*i)->set_state (**niter);
703 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
704 if ((*niter)->name() == Redirect::state_node_name) {
705 Redirect::set_state (**niter);
710 if (niter == nlist.end()) {
711 error << _("XML node describing insert is missing a Redirect node") << endmsg;
715 if (niter == nlist.end()) {
716 error << string_compose(_("XML node describing a plugin insert is missing the `%1' information"), plugin->state_node_name()) << endmsg;
720 /* look for port automation node */
722 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
723 if ((*niter)->name() == port_automation_node_name) {
726 XMLNodeConstIterator iter;
731 cnodes = (*niter)->children ("port");
733 for(iter = cnodes.begin(); iter != cnodes.end(); ++iter){
737 if ((cprop = child->property("number")) != 0) {
738 port = cprop->value().c_str();
740 warning << _("PluginInsert: Auto: no ladspa port number") << endmsg;
744 sscanf (port, "%" PRIu32, &port_id);
746 if (port_id >= _plugins[0]->parameter_count()) {
747 warning << _("PluginInsert: Auto: port id out of range") << endmsg;
751 if ((cprop = child->property("auto")) != 0) {
753 sscanf (cprop->value().c_str(), "0x%x", &x);
754 automation_list (port_id).set_automation_state (AutoState (x));
762 if (niter == nlist.end()) {
763 warning << string_compose(_("XML node describing a port automation is missing the `%1' information"), port_automation_node_name) << endmsg;
766 // The name of the PluginInsert comes from the plugin, nothing else
767 set_name(plugin->get_info()->name,this);
773 PluginInsert::describe_parameter (uint32_t what)
775 return _plugins[0]->describe_parameter (what);
779 PluginInsert::latency()
781 return _plugins[0]->latency ();
785 PluginInsert::store_state (PluginInsertState& state) const
787 Redirect::store_state (state);
788 _plugins[0]->store_state (state.plugin_state);
792 PluginInsert::restore_state (StateManager::State& state)
794 PluginInsertState* pistate = dynamic_cast<PluginInsertState*> (&state);
796 Redirect::restore_state (state);
798 _plugins[0]->restore_state (pistate->plugin_state);
804 PluginInsert::state_factory (std::string why) const
806 PluginInsertState* state = new PluginInsertState (why);
808 store_state (*state);
814 PluginInsert::type ()
816 boost::shared_ptr<LadspaPlugin> lp;
818 boost::shared_ptr<VSTPlugin> vp;
820 #ifdef HAVE_AUDIOUNITS
821 boost::shared_ptr<AUPlugin> ap;
824 PluginPtr other = plugin ();
826 if ((lp = boost::dynamic_pointer_cast<LadspaPlugin> (other)) != 0) {
827 return ARDOUR::LADSPA;
829 } else if ((vp = boost::dynamic_pointer_cast<VSTPlugin> (other)) != 0) {
832 #ifdef HAVE_AUDIOUNITS
833 } else if ((ap = boost::dynamic_pointer_cast<AUPlugin> (other)) != 0) {
834 return ARDOUR::AudioUnit;
838 return (ARDOUR::PluginType) 0;
842 /***************************************************************
843 Port inserts: send output to a port, pick up input at a port
844 ***************************************************************/
846 PortInsert::PortInsert (Session& s, Placement p)
847 : Insert (s, p, 1, -1, 1, -1)
851 save_state (_("initial state"));
852 RedirectCreated (this); /* EMIT SIGNAL */
857 PortInsert::PortInsert (const PortInsert& other)
858 : Insert (other._session, other.placement(), 1, -1, 1, -1)
862 save_state (_("initial state"));
863 RedirectCreated (this); /* EMIT SIGNAL */
871 if (add_input_port ("", this)) {
872 error << _("PortInsert: cannot add input port") << endmsg;
873 throw failed_constructor();
876 if (add_output_port ("", this)) {
877 error << _("PortInsert: cannot add output port") << endmsg;
878 throw failed_constructor();
882 PortInsert::PortInsert (Session& s, const XMLNode& node)
883 : Insert (s, "will change", PreFader)
885 if (set_state (node)) {
886 throw failed_constructor();
889 RedirectCreated (this); /* EMIT SIGNAL */
892 PortInsert::~PortInsert ()
898 PortInsert::run (vector<Sample *>& bufs, uint32_t nbufs, nframes_t nframes, nframes_t offset)
900 if (n_outputs() == 0) {
905 /* deliver silence */
906 silence (nframes, offset);
911 vector<Port*>::iterator o;
912 vector<Port*>::iterator i;
916 for (o = _outputs.begin(), n = 0; o != _outputs.end(); ++o, ++n) {
917 memcpy ((*o)->get_buffer (nframes) + offset, bufs[min(nbufs,n)], sizeof (Sample) * nframes);
918 (*o)->mark_silence (false);
923 for (i = _inputs.begin(), n = 0; i != _inputs.end(); ++i, ++n) {
924 memcpy (bufs[min(nbufs,n)], (*i)->get_buffer (nframes) + offset, sizeof (Sample) * nframes);
929 PortInsert::get_state(void)
935 PortInsert::state (bool full)
937 XMLNode *node = new XMLNode("Insert");
939 node->add_child_nocopy (Redirect::state(full));
940 node->add_property("type", "port");
946 PortInsert::set_state(const XMLNode& node)
948 XMLNodeList nlist = node.children();
949 XMLNodeIterator niter;
950 XMLPropertyList plist;
951 const XMLProperty *prop;
953 if ((prop = node.property ("type")) == 0) {
954 error << _("XML node describing insert is missing the `type' field") << endmsg;
958 if (prop->value() != "port") {
959 error << _("non-port insert XML used for port plugin insert") << endmsg;
963 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
964 if ((*niter)->name() == Redirect::state_node_name) {
965 Redirect::set_state (**niter);
970 if (niter == nlist.end()) {
971 error << _("XML node describing insert is missing a Redirect node") << endmsg;
979 PortInsert::latency()
981 /* because we deliver and collect within the same cycle,
982 all I/O is necessarily delayed by at least frames_per_cycle().
984 if the return port for insert has its own latency, we
985 need to take that into account too.
988 return _session.engine().frames_per_cycle() + input_latency();
992 PortInsert::can_support_input_configuration (int32_t in) const
994 if (input_maximum() == -1 && output_maximum() == -1) {
996 /* not configured yet */
998 return 1; /* we can support anything the first time we're asked */
1002 /* the "input" config for a port insert corresponds to how
1003 many output ports it will have.
1006 if (output_maximum() == in) {
1015 PortInsert::configure_io (int32_t ignored_magic, int32_t in, int32_t out)
1017 /* do not allow configuration to be changed outside the range of
1018 the last request config. or something like that.
1022 /* this is a bit odd:
1024 the number of inputs we are required to handle corresponds
1025 to the number of output ports we need.
1027 the number of outputs we are required to have corresponds
1028 to the number of input ports we need.
1031 set_output_maximum (in);
1032 set_output_minimum (in);
1033 set_input_maximum (out);
1034 set_input_minimum (out);
1044 return ensure_io (out, in, false, this);
1048 PortInsert::compute_output_streams (int32_t cnt) const
1050 /* puzzling, eh? think about it ... */
1055 PortInsert::output_streams() const
1061 PortInsert::input_streams() const
1063 return n_outputs ();