2 Copyright (C) 2000,2007 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"
27 #include "ardour/port_insert.h"
28 #include "ardour/plugin.h"
29 #include "ardour/port.h"
30 #include "ardour/route.h"
31 #include "ardour/buffer_set.h"
33 #include "ardour/audioengine.h"
34 #include "ardour/session.h"
35 #include "ardour/types.h"
40 using namespace ARDOUR;
43 PortInsert::PortInsert (Session& s)
44 : IOProcessor (s, string_compose (_("insert %1"), (bitslot = s.next_insert_id()) + 1), "")
47 ProcessorCreated (this); /* EMIT SIGNAL */
50 PortInsert::PortInsert (Session& s, const XMLNode& node)
51 : IOProcessor (s, "unnamed port insert")
53 if (set_state (node)) {
54 throw failed_constructor();
57 ProcessorCreated (this); /* EMIT SIGNAL */
60 PortInsert::~PortInsert ()
68 if (_io->ensure_io(output_streams(), input_streams(), false, this)) { // sic
69 error << _("PortInsert: cannot create ports") << endmsg;
70 throw failed_constructor();
75 PortInsert::run_in_place (BufferSet& bufs, nframes_t start_frame, nframes_t end_frame, nframes_t nframes)
77 if (_io->n_outputs().n_total() == 0) {
83 _io->silence (nframes);
87 _io->deliver_output (bufs, start_frame, end_frame, nframes);
88 _io->collect_input (bufs, nframes);
92 PortInsert::get_state(void)
98 PortInsert::state (bool full)
100 XMLNode& node = IOProcessor::state(full);
102 node.add_property ("type", "port");
103 snprintf (buf, sizeof (buf), "%" PRIu32, bitslot);
104 node.add_property ("bitslot", buf);
110 PortInsert::set_state(const XMLNode& node)
112 XMLNodeList nlist = node.children();
113 XMLNodeIterator niter;
114 XMLPropertyList plist;
115 const XMLProperty *prop;
117 if ((prop = node.property ("type")) == 0) {
118 error << _("XML node describing port insert is missing the `type' field") << endmsg;
122 if (prop->value() != "port") {
123 error << _("non-port insert XML used for port plugin insert") << endmsg;
127 if ((prop = node.property ("bitslot")) == 0) {
128 bitslot = _session.next_insert_id();
130 sscanf (prop->value().c_str(), "%" PRIu32, &bitslot);
131 _session.mark_insert_id (bitslot);
134 const XMLNode* insert_node = &node;
136 // legacy sessions: search for child IOProcessor node
137 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
138 if ((*niter)->name() == "IOProcessor") {
139 insert_node = *niter;
144 IOProcessor::set_state (*insert_node);
150 PortInsert::signal_latency() const
152 /* because we deliver and collect within the same cycle,
153 all I/O is necessarily delayed by at least frames_per_cycle().
155 if the return port for insert has its own latency, we
156 need to take that into account too.
159 return _session.engine().frames_per_cycle() + _io->input_latency();
163 PortInsert::configure_io (ChanCount in, ChanCount out)
165 /* do not allow configuration to be changed outside the range of
166 the last request config. or something like that.
169 /* this is a bit odd:
171 the number of inputs we are required to handle corresponds
172 to the number of output ports we need.
174 the number of outputs we are required to have corresponds
175 to the number of input ports we need.
178 /*_io->set_output_maximum (in);
179 _io->set_output_minimum (in);
180 _io->set_input_maximum (out);
181 _io->set_input_minimum (out);*/
183 if (_io->ensure_io (out, in, false, this) != 0) {
187 return Processor::configure_io (in, out);
191 PortInsert::output_streams() const
193 return _io->n_inputs ();
197 PortInsert::input_streams() const
199 return _io->n_outputs ();
203 PortInsert::can_support_io_configuration (const ChanCount& in, ChanCount& out) const