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 "pbd/xml++.h"
25 #include "ardour/amp.h"
26 #include "ardour/send.h"
27 #include "ardour/session.h"
28 #include "ardour/port.h"
29 #include "ardour/audio_port.h"
30 #include "ardour/buffer_set.h"
31 #include "ardour/meter.h"
32 #include "ardour/panner.h"
33 #include "ardour/io.h"
37 using namespace ARDOUR
;
41 Send::Send (Session
& s
, boost::shared_ptr
<MuteMaster
> mm
, Role r
)
42 : Delivery (s
, mm
, string_compose (_("send %1"), (_bitslot
= s
.next_send_id()) + 1), r
)
45 _amp
.reset (new Amp (_session
, _mute_master
));
46 _meter
.reset (new PeakMeter (_session
));
48 ProcessorCreated (this); /* EMIT SIGNAL */
51 Send::Send (Session
& s
, boost::shared_ptr
<MuteMaster
> mm
, const XMLNode
& node
, int version
, Role r
)
52 : Delivery (s
, mm
, "send", r
)
55 _amp
.reset (new Amp (_session
, _mute_master
));
56 _meter
.reset (new PeakMeter (_session
));
58 if (set_state (node
, version
)) {
59 throw failed_constructor();
62 ProcessorCreated (this); /* EMIT SIGNAL */
75 Processor::activate ();
82 _meter
->deactivate ();
85 Processor::deactivate ();
89 Send::run (BufferSet
& bufs
, sframes_t start_frame
, sframes_t end_frame
, nframes_t nframes
, bool)
91 if (_output
->n_ports() == ChanCount::ZERO
) {
93 _active
= _pending_active
;
97 if (!_active
&& !_pending_active
) {
99 _output
->silence (nframes
);
100 _active
= _pending_active
;
104 // we have to copy the input, because deliver_output() may alter the buffers
105 // in-place, which a send must never do.
107 BufferSet
& sendbufs
= _session
.get_mix_buffers (bufs
.count());
108 sendbufs
.read_from (bufs
, nframes
);
109 assert(sendbufs
.count() == bufs
.count());
113 // Can't automate gain for sends or returns yet because we need different buffers
114 // so that we don't overwrite the main automation data for the route amp
115 // _amp->setup_gain_automation (start_frame, end_frame, nframes);
116 _amp
->run (sendbufs
, start_frame
, end_frame
, nframes
, true);
118 /* deliver to outputs */
120 Delivery::run (sendbufs
, start_frame
, end_frame
, nframes
, true);
122 /* consider metering */
125 if (_amp
->gain_control()->get_value() == 0) {
128 _meter
->run (*_output_buffers
, start_frame
, end_frame
, nframes
, true);
132 /* _active was set to _pending_active by Delivery::run() */
136 Send::get_state(void)
142 Send::state(bool full
)
144 XMLNode
& node
= Delivery::state(full
);
147 node
.add_property ("type", "send");
148 snprintf (buf
, sizeof (buf
), "%" PRIu32
, _bitslot
);
149 node
.add_property ("bitslot", buf
);
155 Send::set_state (const XMLNode
& node
, int version
)
157 XMLNodeList nlist
= node
.children();
158 XMLNodeIterator niter
;
159 const XMLProperty
* prop
;
161 if ((prop
= node
.property ("bitslot")) == 0) {
162 _bitslot
= _session
.next_send_id();
164 sscanf (prop
->value().c_str(), "%" PRIu32
, &_bitslot
);
165 _session
.mark_send_id (_bitslot
);
168 const XMLNode
* insert_node
= &node
;
170 /* XXX need to load automation state & data for amp */
172 Delivery::set_state (*insert_node
, version
);
178 Send::can_support_io_configuration (const ChanCount
& in
, ChanCount
& out
) const
180 /* sends have no impact at all on the channel configuration of the
181 streams passing through the route. so, out == in.
189 Send::configure_io (ChanCount in
, ChanCount out
)
191 if (!_amp
->configure_io (in
, out
) || !_meter
->configure_io (in
, out
)) {
195 if (!Processor::configure_io (in
, out
)) {
204 /** Set up the XML description of a send so that its name is unique.
205 * @param state XML send state.
206 * @param session Session.
209 Send::make_unique (XMLNode
&state
, Session
&session
)
211 uint32_t const bitslot
= session
.next_send_id() + 1;
214 snprintf (buf
, sizeof (buf
), "%" PRIu32
, bitslot
);
215 state
.property("bitslot")->set_value (buf
);
217 string
const name
= string_compose (_("send %1"), bitslot
);
219 state
.property("name")->set_value (name
);
221 XMLNode
* io
= state
.child ("IO");
224 io
->property("name")->set_value (name
);
229 Send::set_name (const string
& new_name
)
233 if (_role
== Delivery::Send
) {
236 /* rip any existing numeric part of the name, and append the bitslot
239 string::size_type last_letter
= new_name
.find_last_not_of ("0123456789");
241 if (last_letter
!= string::npos
) {
242 unique_name
= new_name
.substr (0, last_letter
+ 1);
244 unique_name
= new_name
;
247 snprintf (buf
, sizeof (buf
), "%u", (_bitslot
+ 1));
251 unique_name
= new_name
;
254 return Delivery::set_name (unique_name
);
258 Send::display_to_user () const
260 /* we ignore Deliver::_display_to_user */
262 // if (_role == Listen || _role == MainListen) {