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));
84 save_state (_("initial state"));
87 Glib::Mutex::Lock em (_session.engine().process_lock());
88 IO::MoreOutputs (output_streams ());
91 RedirectCreated (this); /* EMIT SIGNAL */
94 PluginInsert::PluginInsert (Session& s, const XMLNode& node)
95 : Insert (s, "will change", PreFader)
97 if (set_state (node)) {
98 throw failed_constructor();
103 save_state (_("initial state"));
105 _plugins[0]->ParameterChanged.connect (mem_fun (*this, &PluginInsert::parameter_changed));
108 Glib::Mutex::Lock em (_session.engine().process_lock());
109 IO::MoreOutputs (output_streams());
113 PluginInsert::PluginInsert (const PluginInsert& other)
114 : Insert (other._session, other.plugin()->name(), other.placement())
116 uint32_t count = other._plugins.size();
118 /* make as many copies as requested */
119 for (uint32_t n = 0; n < count; ++n) {
120 _plugins.push_back (plugin_factory (other.plugin (n)));
124 _plugins[0]->ParameterChanged.connect (mem_fun (*this, &PluginInsert::parameter_changed));
128 save_state (_("initial state"));
130 RedirectCreated (this); /* EMIT SIGNAL */
134 PluginInsert::set_count (uint32_t num)
136 bool require_state = !_plugins.empty();
138 /* this is a bad idea.... we shouldn't do this while active.
139 only a route holding their redirect_lock should be calling this
144 } else if (num > _plugins.size()) {
145 uint32_t diff = num - _plugins.size();
147 for (uint32_t n = 0; n < diff; ++n) {
148 _plugins.push_back (plugin_factory (_plugins[0]));
151 /* XXX do something */
155 } else if (num < _plugins.size()) {
156 uint32_t diff = _plugins.size() - num;
157 for (uint32_t n= 0; n < diff; ++n) {
166 PluginInsert::init ()
170 set<uint32_t>::iterator s;
173 PluginInsert::~PluginInsert ()
175 GoingAway (); /* EMIT SIGNAL */
179 PluginInsert::automation_list_creation_callback (uint32_t which, AutomationList& alist)
181 alist.automation_state_changed.connect (sigc::bind (mem_fun (*this, &PluginInsert::auto_state_changed), (which)));
185 PluginInsert::auto_state_changed (uint32_t which)
187 AutomationList& alist (automation_list (which));
189 if (alist.automation_state() != Off) {
190 _plugins[0]->set_parameter (which, alist.eval (_session.transport_frame()));
195 PluginInsert::output_streams() const
197 return _plugins[0]->get_info()->n_outputs * _plugins.size();
201 PluginInsert::input_streams() const
203 return _plugins[0]->get_info()->n_inputs * _plugins.size();
207 PluginInsert::natural_output_streams() const
209 return _plugins[0]->get_info()->n_outputs;
213 PluginInsert::natural_input_streams() const
215 return _plugins[0]->get_info()->n_inputs;
219 PluginInsert::is_generator() const
221 /* XXX more finesse is possible here. VST plugins have a
222 a specific "instrument" flag, for example.
225 return _plugins[0]->get_info()->n_inputs == 0;
229 PluginInsert::set_automatable ()
233 a = _plugins.front()->automatable ();
235 for (set<uint32_t>::iterator i = a.begin(); i != a.end(); ++i) {
241 PluginInsert::parameter_changed (uint32_t which, float val)
243 vector<boost::shared_ptr<Plugin> >::iterator i = _plugins.begin();
245 /* don't set the first plugin, just all the slaves */
247 if (i != _plugins.end()) {
249 for (; i != _plugins.end(); ++i) {
250 (*i)->set_parameter (which, val);
256 PluginInsert::set_block_size (jack_nframes_t nframes)
258 for (vector<boost::shared_ptr<Plugin> >::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
259 (*i)->set_block_size (nframes);
264 PluginInsert::activate ()
266 for (vector<boost::shared_ptr<Plugin> >::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
272 PluginInsert::deactivate ()
274 for (vector<boost::shared_ptr<Plugin> >::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
280 PluginInsert::connect_and_run (vector<Sample*>& bufs, uint32_t nbufs, jack_nframes_t nframes, jack_nframes_t offset, bool with_auto, jack_nframes_t now)
282 int32_t in_index = 0;
283 int32_t out_index = 0;
285 /* Note that we've already required that plugins
286 be able to handle in-place processing.
291 map<uint32_t,AutomationList*>::iterator li;
294 for (n = 0, li = parameter_automation.begin(); li != parameter_automation.end(); ++li, ++n) {
296 AutomationList& alist (*((*li).second));
298 if (alist.automation_playback()) {
301 float val = alist.rt_safe_eval (now, valid);
304 /* set the first plugin, the others will be set via signals */
305 _plugins[0]->set_parameter ((*li).first, val);
312 for (vector<boost::shared_ptr<Plugin> >::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
313 (*i)->connect_and_run (bufs, nbufs, in_index, out_index, nframes, offset);
316 /* leave remaining channel buffers alone */
320 PluginInsert::automation_snapshot (jack_nframes_t now)
322 map<uint32_t,AutomationList*>::iterator li;
324 for (li = parameter_automation.begin(); li != parameter_automation.end(); ++li) {
326 AutomationList *alist = ((*li).second);
327 if (alist != 0 && alist->automation_write ()) {
329 float val = _plugins[0]->get_parameter ((*li).first);
330 alist->rt_add (now, val);
331 last_automation_snapshot = now;
337 PluginInsert::transport_stopped (jack_nframes_t now)
339 map<uint32_t,AutomationList*>::iterator li;
341 for (li = parameter_automation.begin(); li != parameter_automation.end(); ++li) {
342 AutomationList& alist (*(li->second));
343 alist.reposition_for_rt_add (now);
345 if (alist.automation_state() != Off) {
346 _plugins[0]->set_parameter (li->first, alist.eval (now));
352 PluginInsert::silence (jack_nframes_t nframes, jack_nframes_t offset)
354 int32_t in_index = 0;
355 int32_t out_index = 0;
360 for (vector<boost::shared_ptr<Plugin> >::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
361 n = (*i) -> get_info()->n_inputs;
362 (*i)->connect_and_run (_session.get_silent_buffers (n), n, in_index, out_index, nframes, offset);
368 PluginInsert::run (vector<Sample *>& bufs, uint32_t nbufs, jack_nframes_t nframes, jack_nframes_t offset)
372 if (_session.transport_rolling()) {
373 automation_run (bufs, nbufs, nframes, offset);
375 connect_and_run (bufs, nbufs, nframes, offset, false);
378 uint32_t in = _plugins[0]->get_info()->n_inputs;
379 uint32_t out = _plugins[0]->get_info()->n_outputs;
383 /* not active, but something has make up for any channel count increase */
385 for (uint32_t n = out - in; n < out; ++n) {
386 memcpy (bufs[n], bufs[in - 1], sizeof (Sample) * nframes);
393 PluginInsert::set_parameter (uint32_t port, float val)
395 /* the others will be set from the event triggered by this */
397 _plugins[0]->set_parameter (port, val);
399 if (automation_list (port).automation_write()) {
400 automation_list (port).add (_session.audible_frame(), val);
403 _session.set_dirty();
407 PluginInsert::automation_run (vector<Sample *>& bufs, uint32_t nbufs, jack_nframes_t nframes, jack_nframes_t offset)
409 ControlEvent next_event (0, 0.0f);
410 jack_nframes_t now = _session.transport_frame ();
411 jack_nframes_t end = now + nframes;
413 Glib::Mutex::Lock lm (_automation_lock, Glib::TRY_LOCK);
416 connect_and_run (bufs, nbufs, nframes, offset, false);
420 if (!find_next_event (now, end, next_event)) {
422 /* no events have a time within the relevant range */
424 connect_and_run (bufs, nbufs, nframes, offset, true, now);
430 jack_nframes_t cnt = min (((jack_nframes_t) floor (next_event.when) - now), nframes);
432 connect_and_run (bufs, nbufs, cnt, offset, true, now);
438 if (!find_next_event (now, end, next_event)) {
443 /* cleanup anything that is left to do */
446 connect_and_run (bufs, nbufs, nframes, offset, true, now);
451 PluginInsert::default_parameter_value (uint32_t port)
453 if (_plugins.empty()) {
454 fatal << _("programming error: ") << X_("PluginInsert::default_parameter_value() called with no plugin")
459 return _plugins[0]->default_value (port);
463 PluginInsert::set_port_automation_state (uint32_t port, AutoState s)
465 if (port < _plugins[0]->parameter_count()) {
467 AutomationList& al = automation_list (port);
469 if (s != al.automation_state()) {
470 al.set_automation_state (s);
471 last_automation_snapshot = 0;
472 _session.set_dirty ();
478 PluginInsert::get_port_automation_state (uint32_t port)
480 if (port < _plugins[0]->parameter_count()) {
481 return automation_list (port).automation_state();
488 PluginInsert::protect_automation ()
490 set<uint32_t> automated_params;
492 what_has_automation (automated_params);
494 for (set<uint32_t>::iterator i = automated_params.begin(); i != automated_params.end(); ++i) {
496 AutomationList& al = automation_list (*i);
498 switch (al.automation_state()) {
501 al.set_automation_state (Off);
509 boost::shared_ptr<Plugin>
510 PluginInsert::plugin_factory (boost::shared_ptr<Plugin> other)
512 boost::shared_ptr<LadspaPlugin> lp;
514 boost::shared_ptr<VSTPlugin> vp;
516 #ifdef HAVE_AUDIOUNITS
517 boost::shared_ptr<AUPlugin> ap;
520 if ((lp = boost::dynamic_pointer_cast<LadspaPlugin> (other)) != 0) {
521 return boost::shared_ptr<Plugin> (new LadspaPlugin (*lp));
523 } else if ((vp = boost::dynamic_pointer_cast<VSTPlugin> (other)) != 0) {
524 return boost::shared_ptr<Plugin> (new VSTPlugin (*vp));
526 #ifdef HAVE_AUDIOUNITS
527 } else if ((ap = boost::dynamic_pointer_cast<AUPlugin> (other)) != 0) {
528 return boost::shared_ptr<Plugin> (new AUPlugin (*ap));
532 fatal << string_compose (_("programming error: %1"),
533 X_("unknown plugin type in PluginInsert::plugin_factory"))
536 return boost::shared_ptr<Plugin> ((Plugin*) 0);
540 PluginInsert::compute_output_streams (int32_t cnt) const
542 return _plugins[0]->get_info()->n_outputs * cnt;
546 PluginInsert::configure_io (int32_t magic, int32_t in, int32_t out)
548 return set_count (magic);
552 PluginInsert::can_support_input_configuration (int32_t in) const
554 int32_t outputs = _plugins[0]->get_info()->n_outputs;
555 int32_t inputs = _plugins[0]->get_info()->n_inputs;
559 /* instrument plugin, always legal, but it throws
560 away any existing active streams.
566 if (outputs == 1 && inputs == 1) {
567 /* mono plugin, replicate as needed */
576 if ((inputs < in) && (inputs % in == 0)) {
578 /* number of inputs is a factor of the requested input
579 configuration, so we can replicate.
591 PluginInsert::get_state(void)
597 PluginInsert::state (bool full)
600 XMLNode *node = new XMLNode("Insert");
602 node->add_child_nocopy (Redirect::state (full));
604 node->add_property ("type", _plugins[0]->state_node_name());
605 snprintf(buf, sizeof(buf), "%s", _plugins[0]->name());
606 node->add_property("id", string(buf));
607 if (_plugins[0]->state_node_name() == "ladspa") {
609 snprintf (buf, sizeof (buf), "%ld", _plugins[0]->get_info()->unique_id);
610 node->add_property("unique-id", string(buf));
612 node->add_property("count", string_compose("%1", _plugins.size()));
613 node->add_child_nocopy (_plugins[0]->get_state());
615 /* add port automation state */
616 XMLNode *autonode = new XMLNode(port_automation_node_name);
617 set<uint32_t> automatable = _plugins[0]->automatable();
619 for (set<uint32_t>::iterator x = automatable.begin(); x != automatable.end(); ++x) {
621 XMLNode* child = new XMLNode("port");
622 snprintf(buf, sizeof(buf), "%" PRIu32, *x);
623 child->add_property("number", string(buf));
626 snprintf(buf, sizeof(buf), "0x%x", automation_list (*x).automation_state ());
628 snprintf(buf, sizeof(buf), "0x%x", ARDOUR::Off);
630 child->add_property("auto", string(buf));
632 autonode->add_child_nocopy (*child);
635 node->add_child_nocopy (*autonode);
641 PluginInsert::set_state(const XMLNode& node)
643 XMLNodeList nlist = node.children();
644 XMLNodeIterator niter;
645 XMLPropertyList plist;
646 const XMLProperty *prop;
648 ARDOUR::PluginType type;
650 if ((prop = node.property ("type")) == 0) {
651 error << _("XML node describing insert is missing the `type' field") << endmsg;
655 if (prop->value() == X_("ladspa") || prop->value() == X_("Ladspa")) { /* handle old school sessions */
656 type = ARDOUR::LADSPA;
657 } else if (prop->value() == X_("vst")) {
660 error << string_compose (_("unknown plugin type %1 in plugin insert state"),
666 prop = node.property ("unique-id");
668 unique = atol(prop->value().c_str());
671 if ((prop = node.property ("id")) == 0) {
672 error << _("XML node describing insert is missing the `id' field") << endmsg;
676 boost::shared_ptr<Plugin> plugin;
679 plugin = find_plugin (_session, "", unique, type);
681 plugin = find_plugin (_session, prop->value(), 0, type);
685 error << string_compose(_("Found a reference to a plugin (\"%1\") that is unknown.\n"
686 "Perhaps it was removed or moved since it was last used."), prop->value())
693 if ((prop = node.property ("count")) != 0) {
694 sscanf (prop->value().c_str(), "%u", &count);
697 if (_plugins.size() != count) {
699 _plugins.push_back (plugin);
701 for (uint32_t n=1; n < count; ++n) {
702 _plugins.push_back (plugin_factory (plugin));
706 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
707 if ((*niter)->name() == plugin->state_node_name()) {
708 for (vector<boost::shared_ptr<Plugin> >::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
709 (*i)->set_state (**niter);
715 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
716 if ((*niter)->name() == Redirect::state_node_name) {
717 Redirect::set_state (**niter);
722 if (niter == nlist.end()) {
723 error << _("XML node describing insert is missing a Redirect node") << endmsg;
727 if (niter == nlist.end()) {
728 error << string_compose(_("XML node describing a plugin insert is missing the `%1' information"), plugin->state_node_name()) << endmsg;
732 /* look for port automation node */
734 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
735 if ((*niter)->name() == port_automation_node_name) {
738 XMLNodeConstIterator iter;
743 cnodes = (*niter)->children ("port");
745 for(iter = cnodes.begin(); iter != cnodes.end(); ++iter){
749 if ((cprop = child->property("number")) != 0) {
750 port = cprop->value().c_str();
752 warning << _("PluginInsert: Auto: no ladspa port number") << endmsg;
756 sscanf (port, "%" PRIu32, &port_id);
758 if (port_id >= _plugins[0]->parameter_count()) {
759 warning << _("PluginInsert: Auto: port id out of range") << endmsg;
763 if ((cprop = child->property("auto")) != 0) {
765 sscanf (cprop->value().c_str(), "0x%x", &x);
766 automation_list (port_id).set_automation_state (AutoState (x));
774 if (niter == nlist.end()) {
775 warning << string_compose(_("XML node describing a port automation is missing the `%1' information"), port_automation_node_name) << endmsg;
778 // The name of the PluginInsert comes from the plugin, nothing else
779 set_name(plugin->get_info()->name,this);
785 PluginInsert::describe_parameter (uint32_t what)
787 return _plugins[0]->describe_parameter (what);
791 PluginInsert::latency()
793 return _plugins[0]->latency ();
797 PluginInsert::store_state (PluginInsertState& state) const
799 Redirect::store_state (state);
800 _plugins[0]->store_state (state.plugin_state);
804 PluginInsert::restore_state (StateManager::State& state)
806 PluginInsertState* pistate = dynamic_cast<PluginInsertState*> (&state);
808 Redirect::restore_state (state);
810 _plugins[0]->restore_state (pistate->plugin_state);
816 PluginInsert::state_factory (std::string why) const
818 PluginInsertState* state = new PluginInsertState (why);
820 store_state (*state);
826 PluginInsert::type ()
828 boost::shared_ptr<LadspaPlugin> lp;
830 boost::shared_ptr<VSTPlugin> vp;
832 #ifdef HAVE_AUDIOUNITS
833 boost::shared_ptr<AUPlugin> ap;
836 PluginPtr other = plugin ();
838 if ((lp = boost::dynamic_pointer_cast<LadspaPlugin> (other)) != 0) {
839 return ARDOUR::LADSPA;
841 } else if ((vp = boost::dynamic_pointer_cast<VSTPlugin> (other)) != 0) {
844 #ifdef HAVE_AUDIOUNITS
845 } else if ((ap = boost::dynamic_pointer_cast<AUPlugin> (other)) != 0) {
846 return ARDOUR::AudioUnit;
850 return (ARDOUR::PluginType) 0;
854 /***************************************************************
855 Port inserts: send output to a port, pick up input at a port
856 ***************************************************************/
858 PortInsert::PortInsert (Session& s, Placement p)
859 : Insert (s, p, 1, -1, 1, -1)
862 save_state (_("initial state"));
863 RedirectCreated (this); /* EMIT SIGNAL */
866 PortInsert::PortInsert (const PortInsert& other)
867 : Insert (other._session, other.placement(), 1, -1, 1, -1)
870 save_state (_("initial state"));
871 RedirectCreated (this); /* EMIT SIGNAL */
877 if (add_input_port ("", this)) {
878 error << _("PortInsert: cannot add input port") << endmsg;
879 throw failed_constructor();
882 if (add_output_port ("", this)) {
883 error << _("PortInsert: cannot add output port") << endmsg;
884 throw failed_constructor();
888 PortInsert::PortInsert (Session& s, const XMLNode& node)
889 : Insert (s, "will change", PreFader)
891 if (set_state (node)) {
892 throw failed_constructor();
895 RedirectCreated (this); /* EMIT SIGNAL */
898 PortInsert::~PortInsert ()
904 PortInsert::run (vector<Sample *>& bufs, uint32_t nbufs, jack_nframes_t nframes, jack_nframes_t offset)
906 if (n_outputs() == 0) {
911 /* deliver silence */
912 silence (nframes, offset);
917 vector<Port*>::iterator o;
918 vector<Port*>::iterator i;
922 for (o = _outputs.begin(), n = 0; o != _outputs.end(); ++o, ++n) {
923 memcpy ((*o)->get_buffer (nframes) + offset, bufs[min(nbufs,n)], sizeof (Sample) * nframes);
924 (*o)->mark_silence (false);
929 for (i = _inputs.begin(), n = 0; i != _inputs.end(); ++i, ++n) {
930 memcpy (bufs[min(nbufs,n)], (*i)->get_buffer (nframes) + offset, sizeof (Sample) * nframes);
935 PortInsert::get_state(void)
941 PortInsert::state (bool full)
943 XMLNode *node = new XMLNode("Insert");
945 node->add_child_nocopy (Redirect::state(full));
946 node->add_property("type", "port");
952 PortInsert::set_state(const XMLNode& node)
954 XMLNodeList nlist = node.children();
955 XMLNodeIterator niter;
956 XMLPropertyList plist;
957 const XMLProperty *prop;
959 if ((prop = node.property ("type")) == 0) {
960 error << _("XML node describing insert is missing the `type' field") << endmsg;
964 if (prop->value() != "port") {
965 error << _("non-port insert XML used for port plugin insert") << endmsg;
969 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
970 if ((*niter)->name() == Redirect::state_node_name) {
971 Redirect::set_state (**niter);
976 if (niter == nlist.end()) {
977 error << _("XML node describing insert is missing a Redirect node") << endmsg;
985 PortInsert::latency()
987 /* because we deliver and collect within the same cycle,
988 all I/O is necessarily delayed by at least frames_per_cycle().
990 if the return port for insert has its own latency, we
991 need to take that into account too.
994 return _session.engine().frames_per_cycle() + input_latency();
998 PortInsert::can_support_input_configuration (int32_t in) const
1000 if (input_maximum() == -1 && output_maximum() == -1) {
1002 /* not configured yet */
1004 return 1; /* we can support anything the first time we're asked */
1008 /* the "input" config for a port insert corresponds to how
1009 many output ports it will have.
1012 if (output_maximum() == in) {
1021 PortInsert::configure_io (int32_t ignored_magic, int32_t in, int32_t out)
1023 /* do not allow configuration to be changed outside the range of
1024 the last request config. or something like that.
1028 /* this is a bit odd:
1030 the number of inputs we are required to handle corresponds
1031 to the number of output ports we need.
1033 the number of outputs we are required to have corresponds
1034 to the number of input ports we need.
1037 set_output_maximum (in);
1038 set_output_minimum (in);
1039 set_input_maximum (out);
1040 set_input_minimum (out);
1050 return ensure_io (out, in, false, this);
1054 PortInsert::compute_output_streams (int32_t cnt) const
1056 /* puzzling, eh? think about it ... */
1061 PortInsert::output_streams() const
1067 PortInsert::input_streams() const
1069 return n_outputs ();