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>
33 #include <ardour/vst_plugin.h>
34 #include <ardour/audioengine.h>
35 #include <ardour/session.h>
40 using namespace ARDOUR;
41 //using namespace sigc;
43 Insert::Insert(Session& s, Placement p)
44 : Redirect (s, s.next_insert_name(), p)
49 Insert::Insert(Session& s, Placement p, int imin, int imax, int omin, int omax)
50 : Redirect (s, s.next_insert_name(), p, imin, imax, omin, omax)
54 Insert::Insert(Session& s, string name, Placement p)
55 : Redirect (s, name, p)
59 /***************************************************************
60 Plugin inserts: send data through a plugin
61 ***************************************************************/
63 const string PluginInsert::port_automation_node_name = "PortAutomation";
65 PluginInsert::PluginInsert (Session& s, Plugin& plug, Placement placement)
66 : Insert (s, plug.name(), placement)
68 /* the first is the master */
70 _plugins.push_back(&plug);
72 _plugins[0]->ParameterChanged.connect (mem_fun (*this, &PluginInsert::parameter_changed));
76 save_state (_("initial state"));
79 Glib::Mutex::Lock em (_session.engine().process_lock());
80 IO::MoreOutputs (output_streams ());
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();
95 save_state (_("initial state"));
97 _plugins[0]->ParameterChanged.connect (mem_fun (*this, &PluginInsert::parameter_changed));
100 Glib::Mutex::Lock em (_session.engine().process_lock());
101 IO::MoreOutputs (output_streams());
105 PluginInsert::PluginInsert (const PluginInsert& other)
106 : Insert (other._session, other.plugin().name(), other.placement())
108 uint32_t count = other._plugins.size();
110 /* make as many copies as requested */
111 for (uint32_t n = 0; n < count; ++n) {
112 _plugins.push_back (plugin_factory (other.plugin()));
116 _plugins[0]->ParameterChanged.connect (mem_fun (*this, &PluginInsert::parameter_changed));
120 save_state (_("initial state"));
122 RedirectCreated (this); /* EMIT SIGNAL */
126 PluginInsert::set_count (uint32_t num)
128 bool require_state = !_plugins.empty();
130 /* this is a bad idea.... we shouldn't do this while active.
131 only a route holding their redirect_lock should be calling this
136 } else if (num > _plugins.size()) {
137 uint32_t diff = num - _plugins.size();
139 for (uint32_t n = 0; n < diff; ++n) {
140 _plugins.push_back (plugin_factory (*_plugins[0]));
143 /* XXX do something */
147 } else if (num < _plugins.size()) {
148 uint32_t diff = _plugins.size() - num;
149 for (uint32_t n= 0; n < diff; ++n) {
150 Plugin * plug = _plugins.back();
160 PluginInsert::init ()
164 set<uint32_t>::iterator s;
167 PluginInsert::~PluginInsert ()
169 GoingAway (this); /* EMIT SIGNAL */
171 while (!_plugins.empty()) {
172 Plugin* p = _plugins.back();
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<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<Plugin*>::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
259 (*i)->set_block_size (nframes);
264 PluginInsert::activate ()
266 for (vector<Plugin*>::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
272 PluginInsert::deactivate ()
274 for (vector<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<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<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);
510 PluginInsert::plugin_factory (Plugin& other)
517 if ((lp = dynamic_cast<LadspaPlugin*> (&other)) != 0) {
518 return new LadspaPlugin (*lp);
520 } else if ((vp = dynamic_cast<VSTPlugin*> (&other)) != 0) {
521 return new VSTPlugin (*vp);
525 fatal << string_compose (_("programming error: %1"),
526 X_("unknown plugin type in PluginInsert::plugin_factory"))
533 PluginInsert::compute_output_streams (int32_t cnt) const
535 return _plugins[0]->get_info().n_outputs * cnt;
539 PluginInsert::configure_io (int32_t magic, int32_t in, int32_t out)
541 return set_count (magic);
545 PluginInsert::can_support_input_configuration (int32_t in) const
547 int32_t outputs = _plugins[0]->get_info().n_outputs;
548 int32_t inputs = _plugins[0]->get_info().n_inputs;
552 /* instrument plugin, always legal, but it throws
553 away any existing active streams.
559 if (outputs == 1 && inputs == 1) {
560 /* mono plugin, replicate as needed */
569 if ((inputs < in) && (inputs % in == 0)) {
571 /* number of inputs is a factor of the requested input
572 configuration, so we can replicate.
584 PluginInsert::get_state(void)
590 PluginInsert::state (bool full)
593 XMLNode *node = new XMLNode("Insert");
595 node->add_child_nocopy (Redirect::state (full));
597 node->add_property ("type", _plugins[0]->state_node_name());
598 snprintf(buf, sizeof(buf), "%s", _plugins[0]->name());
599 node->add_property("id", string(buf));
600 if (_plugins[0]->state_node_name() == "ladspa") {
602 snprintf (buf, 31, "%ld", _plugins[0]->get_info().unique_id);
603 node->add_property("unique-id", string(buf));
605 node->add_property("count", string_compose("%1", _plugins.size()));
606 node->add_child_nocopy (_plugins[0]->get_state());
608 /* add port automation state */
609 XMLNode *autonode = new XMLNode(port_automation_node_name);
610 set<uint32_t> automatable = _plugins[0]->automatable();
612 for (set<uint32_t>::iterator x = automatable.begin(); x != automatable.end(); ++x) {
614 XMLNode* child = new XMLNode("port");
615 snprintf(buf, sizeof(buf), "%" PRIu32, *x);
616 child->add_property("number", string(buf));
619 snprintf(buf, sizeof(buf), "0x%x", automation_list (*x).automation_state ());
621 snprintf(buf, sizeof(buf), "0x%x", ARDOUR::Off);
623 child->add_property("auto", string(buf));
625 autonode->add_child_nocopy (*child);
628 node->add_child_nocopy (*autonode);
634 PluginInsert::set_state(const XMLNode& node)
636 XMLNodeList nlist = node.children();
637 XMLNodeIterator niter;
638 XMLPropertyList plist;
639 const XMLProperty *prop;
641 PluginInfo::Type type;
643 if ((prop = node.property ("type")) == 0) {
644 error << _("XML node describing insert is missing the `type' field") << endmsg;
648 if (prop->value() == X_("ladspa") || prop->value() == X_("Ladspa")) { /* handle old school sessions */
649 type = PluginInfo::LADSPA;
650 } else if (prop->value() == X_("vst")) {
651 type = PluginInfo::VST;
653 error << string_compose (_("unknown plugin type %1 in plugin insert state"),
659 prop = node.property ("unique-id");
661 unique = atol(prop->value().c_str());
664 if ((prop = node.property ("id")) == 0) {
665 error << _("XML node describing insert is missing the `id' field") << endmsg;
672 plugin = find_plugin (_session, "", unique, type);
674 plugin = find_plugin (_session, prop->value(), 0, type);
678 error << string_compose(_("Found a reference to a plugin (\"%1\") that is unknown.\n"
679 "Perhaps it was removed or moved since it was last used."), prop->value())
686 if ((prop = node.property ("count")) != 0) {
687 sscanf (prop->value().c_str(), "%u", &count);
690 if (_plugins.size() != count) {
692 _plugins.push_back (plugin);
694 for (uint32_t n=1; n < count; ++n) {
695 _plugins.push_back (plugin_factory (*plugin));
699 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
700 if ((*niter)->name() == plugin->state_node_name()) {
701 for (vector<Plugin*>::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
702 (*i)->set_state (**niter);
708 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
709 if ((*niter)->name() == Redirect::state_node_name) {
710 Redirect::set_state (**niter);
715 if (niter == nlist.end()) {
716 error << _("XML node describing insert is missing a Redirect node") << endmsg;
720 if (niter == nlist.end()) {
721 error << string_compose(_("XML node describing a plugin insert is missing the `%1' information"), plugin->state_node_name()) << endmsg;
725 /* look for port automation node */
727 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
728 if ((*niter)->name() == port_automation_node_name) {
731 XMLNodeConstIterator iter;
736 cnodes = (*niter)->children ("port");
738 for(iter = cnodes.begin(); iter != cnodes.end(); ++iter){
742 if ((cprop = child->property("number")) != 0) {
743 port = cprop->value().c_str();
745 warning << _("PluginInsert: Auto: no ladspa port number") << endmsg;
749 sscanf (port, "%" PRIu32, &port_id);
751 if (port_id >= _plugins[0]->parameter_count()) {
752 warning << _("PluginInsert: Auto: port id out of range") << endmsg;
756 if ((cprop = child->property("auto")) != 0) {
758 sscanf (cprop->value().c_str(), "0x%x", &x);
759 automation_list (port_id).set_automation_state (AutoState (x));
767 if (niter == nlist.end()) {
768 warning << string_compose(_("XML node describing a port automation is missing the `%1' information"), port_automation_node_name) << endmsg;
771 // The name of the PluginInsert comes from the plugin, nothing else
772 set_name(plugin->get_info().name,this);
778 PluginInsert::describe_parameter (uint32_t what)
780 return _plugins[0]->describe_parameter (what);
784 PluginInsert::reset_midi_control (MIDI::Port* port, bool on)
786 _plugins[0]->reset_midi_control (port, on);
790 PluginInsert::send_all_midi_feedback ()
792 _plugins[0]->send_all_midi_feedback();
796 PluginInsert::latency()
798 return _plugins[0]->latency ();
802 PluginInsert::store_state (PluginInsertState& state) const
804 Redirect::store_state (state);
805 _plugins[0]->store_state (state.plugin_state);
809 PluginInsert::restore_state (StateManager::State& state)
811 PluginInsertState* pistate = dynamic_cast<PluginInsertState*> (&state);
813 Redirect::restore_state (state);
815 _plugins[0]->restore_state (pistate->plugin_state);
821 PluginInsert::state_factory (std::string why) const
823 PluginInsertState* state = new PluginInsertState (why);
825 store_state (*state);
830 /***************************************************************
831 Port inserts: send output to a port, pick up input at a port
832 ***************************************************************/
834 PortInsert::PortInsert (Session& s, Placement p)
835 : Insert (s, p, 1, -1, 1, -1)
838 save_state (_("initial state"));
839 RedirectCreated (this); /* EMIT SIGNAL */
842 PortInsert::PortInsert (const PortInsert& other)
843 : Insert (other._session, other.placement(), 1, -1, 1, -1)
846 save_state (_("initial state"));
847 RedirectCreated (this); /* EMIT SIGNAL */
853 if (add_input_port ("", this)) {
854 error << _("PortInsert: cannot add input port") << endmsg;
855 throw failed_constructor();
858 if (add_output_port ("", this)) {
859 error << _("PortInsert: cannot add output port") << endmsg;
860 throw failed_constructor();
864 PortInsert::PortInsert (Session& s, const XMLNode& node)
865 : Insert (s, "will change", PreFader)
867 if (set_state (node)) {
868 throw failed_constructor();
871 RedirectCreated (this); /* EMIT SIGNAL */
874 PortInsert::~PortInsert ()
880 PortInsert::run (vector<Sample *>& bufs, uint32_t nbufs, jack_nframes_t nframes, jack_nframes_t offset)
882 if (n_outputs() == 0) {
887 /* deliver silence */
888 silence (nframes, offset);
893 vector<Port*>::iterator o;
894 vector<Port*>::iterator i;
898 for (o = _outputs.begin(), n = 0; o != _outputs.end(); ++o, ++n) {
899 memcpy ((*o)->get_buffer (nframes) + offset, bufs[min(nbufs,n)], sizeof (Sample) * nframes);
900 (*o)->mark_silence (false);
905 for (i = _inputs.begin(), n = 0; i != _inputs.end(); ++i, ++n) {
906 memcpy (bufs[min(nbufs,n)], (*i)->get_buffer (nframes) + offset, sizeof (Sample) * nframes);
911 PortInsert::get_state(void)
917 PortInsert::state (bool full)
919 XMLNode *node = new XMLNode("Insert");
921 node->add_child_nocopy (Redirect::state(full));
922 node->add_property("type", "port");
928 PortInsert::set_state(const XMLNode& node)
930 XMLNodeList nlist = node.children();
931 XMLNodeIterator niter;
932 XMLPropertyList plist;
933 const XMLProperty *prop;
935 if ((prop = node.property ("type")) == 0) {
936 error << _("XML node describing insert is missing the `type' field") << endmsg;
940 if (prop->value() != "port") {
941 error << _("non-port insert XML used for port plugin insert") << endmsg;
945 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
946 if ((*niter)->name() == Redirect::state_node_name) {
947 Redirect::set_state (**niter);
952 if (niter == nlist.end()) {
953 error << _("XML node describing insert is missing a Redirect node") << endmsg;
961 PortInsert::latency()
963 /* because we deliver and collect within the same cycle,
964 all I/O is necessarily delayed by at least frames_per_cycle().
966 if the return port for insert has its own latency, we
967 need to take that into account too.
970 return _session.engine().frames_per_cycle() + input_latency();
974 PortInsert::can_support_input_configuration (int32_t in) const
976 if (input_maximum() == -1 && output_maximum() == -1) {
978 /* not configured yet */
980 return 1; /* we can support anything the first time we're asked */
984 /* the "input" config for a port insert corresponds to how
985 many output ports it will have.
988 if (output_maximum() == in) {
997 PortInsert::configure_io (int32_t ignored_magic, int32_t in, int32_t out)
999 /* do not allow configuration to be changed outside the range of
1000 the last request config. or something like that.
1004 /* this is a bit odd:
1006 the number of inputs we are required to handle corresponds
1007 to the number of output ports we need.
1009 the number of outputs we are required to have corresponds
1010 to the number of input ports we need.
1013 set_output_maximum (in);
1014 set_output_minimum (in);
1015 set_input_maximum (out);
1016 set_input_minimum (out);
1026 return ensure_io (out, in, false, this);
1030 PortInsert::compute_output_streams (int32_t cnt) const
1032 /* puzzling, eh? think about it ... */
1037 PortInsert::output_streams() const
1043 PortInsert::input_streams() const
1045 return n_outputs ();