2 Copyright (C) 2009 Paul Davis
4 This program is free software; you can redistribute it and/or modify it
5 under the terms of the GNU General Public License as published by the Free
6 Software Foundation; either version 2 of the License, or (at your option)
9 This program is distributed in the hope that it will be useful, but WITHOUT
10 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 You should have received a copy of the GNU General Public License along
15 with this program; if not, write to the Free Software Foundation, Inc.,
16 675 Mass Ave, Cambridge, MA 02139, USA.
22 #include "pbd/enumwriter.h"
23 #include "pbd/convert.h"
25 #include "ardour/amp.h"
26 #include "ardour/audioengine.h"
27 #include "ardour/buffer_set.h"
28 #include "ardour/debug.h"
29 #include "ardour/delivery.h"
30 #include "ardour/io.h"
31 #include "ardour/mute_master.h"
32 #include "ardour/pannable.h"
33 #include "ardour/panner_shell.h"
34 #include "ardour/port.h"
35 #include "ardour/session.h"
39 namespace ARDOUR { class Panner; }
43 using namespace ARDOUR;
45 PBD::Signal0<void> Delivery::PannersLegal;
46 bool Delivery::panners_legal = false;
48 /* deliver to an existing IO object */
50 Delivery::Delivery (Session& s, boost::shared_ptr<IO> io, boost::shared_ptr<Pannable> pannable,
51 boost::shared_ptr<MuteMaster> mm, const string& name, Role r)
52 : IOProcessor(s, boost::shared_ptr<IO>(), (role_requires_output_ports (r) ? io : boost::shared_ptr<IO>()), name)
54 , _output_buffers (new BufferSet())
56 , _no_outs_cuz_we_no_monitor (false)
58 , _no_panner_reset (false)
62 if (r & (Delivery::Send|Delivery::Aux)) is_send = true;
63 _panshell = boost::shared_ptr<PannerShell>(new PannerShell (_name, _session, pannable, is_send));
66 _display_to_user = false;
69 _output->changed.connect_same_thread (*this, boost::bind (&Delivery::output_changed, this, _1, _2));
75 /* deliver to a new IO object */
77 Delivery::Delivery (Session& s, boost::shared_ptr<Pannable> pannable, boost::shared_ptr<MuteMaster> mm, const string& name, Role r)
78 : IOProcessor(s, false, (role_requires_output_ports (r) ? true : false), name, "", DataType::AUDIO, (r == Send))
80 , _output_buffers (new BufferSet())
82 , _no_outs_cuz_we_no_monitor (false)
84 , _no_panner_reset (false)
88 if (r & (Delivery::Send|Delivery::Aux)) is_send = true;
89 _panshell = boost::shared_ptr<PannerShell>(new PannerShell (_name, _session, pannable, is_send));
92 _display_to_user = false;
95 _output->changed.connect_same_thread (*this, boost::bind (&Delivery::output_changed, this, _1, _2));
101 Delivery::~Delivery()
103 DEBUG_TRACE (DEBUG::Destruction, string_compose ("delivery %1 destructor\n", _name));
105 /* this object should vanish from any signal callback lists
106 that it is on before we get any further. The full qualification
107 of the method name is not necessary, but is here to make it
108 clear that this call is about signals, not data flow connections.
111 ScopedConnectionList::drop_connections ();
113 delete _output_buffers;
117 Delivery::display_name () const
121 return _("main outs");
134 Delivery::can_support_io_configuration (const ChanCount& in, ChanCount& out)
138 /* the out buffers will be set to point to the port output buffers
139 of our output object.
143 if (_output->n_ports() != ChanCount::ZERO) {
144 /* increase number of output ports if the processor chain requires it */
145 out = ChanCount::max (_output->n_ports(), in);
148 /* not configured yet - we will passthru */
153 fatal << "programming error: this should never be reached" << endmsg;
154 abort(); /*NOTREACHED*/
158 } else if (_role == Insert) {
160 /* the output buffers will be filled with data from the *input* ports
165 if (_input->n_ports() != ChanCount::ZERO) {
166 out = _input->n_ports();
169 /* not configured yet - we will passthru */
174 fatal << "programming error: this should never be reached" << endmsg;
175 abort(); /*NOTREACHED*/
179 fatal << "programming error: this should never be reached" << endmsg;
185 /** Caller must hold process lock */
187 Delivery::configure_io (ChanCount in, ChanCount out)
190 bool r = AudioEngine::instance()->process_lock().trylock();
191 assert (!r && "trylock inside Delivery::configure_io");
194 /* check configuration by comparison with our I/O port configuration, if appropriate.
195 see ::can_support_io_configuration() for comments
201 if (_output->n_ports() != out) {
202 if (_output->n_ports() != ChanCount::ZERO) {
203 _output->ensure_io (out, false, this);
205 /* I/O not yet configured */
210 } else if (_role == Insert) {
213 if (_input->n_ports() != in) {
214 if (_input->n_ports() != ChanCount::ZERO) {
215 fatal << _name << " programming error: configure_io called with " << in << " and " << out << " with " << _input->n_ports() << " input ports" << endmsg;
216 abort(); /*NOTREACHED*/
218 /* I/O not yet configured */
225 if (!Processor::configure_io (in, out)) {
235 Delivery::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool result_required)
239 PortSet& ports (_output->ports());
241 bool need_amp = true;
243 if (_output->n_ports ().get (_output->default_type()) == 0) {
247 if (!_active && !_pending_active) {
248 _output->silence (nframes);
252 /* this setup is not just for our purposes, but for anything that comes after us in the
253 processing pathway that wants to use this->output_buffers() for some reason.
256 // TODO delayline -- latency-compensation
257 output_buffers().get_backend_port_addresses (ports, nframes);
259 // this Delivery processor is not a derived type, and thus we assume
260 // we really can modify the buffers passed in (it is almost certainly
261 // the main output stage of a Route). Contrast with Send::run()
262 // which cannot do this.
264 tgain = target_gain ();
266 if (tgain < GAIN_COEFF_SMALL && _amp->gain() < GAIN_COEFF_SMALL) {
268 /* special case (but very common) fast path:
270 * if we are supposed to be silent, and we were already silent,
271 * then short-circuit the computation in Amp and just put silence into
275 _output->silence (nframes);
277 if (!result_required) {
278 /* if !result_required, then the buffers won't actually
279 * be used. This means we don't actually need to silence
280 * them, because we've already filled the output ports
283 * but we just noted that result_required is true,
284 * and so we do need to run the amp to ensure
285 * that the buffers are silenced.
293 bufs.set_count (output_buffers().count ());
297 /* inserts, external and internal sends have
298 * automatable gain and the Amp::run() method has
299 * already been executed by the time we get here.
301 * XXX we do not expose the automatable gain for
302 * Inserts as of September 2015.
307 /* main outs have no automatable gain, the amp is just
308 * used for ramping gain changes caused by monitoring
312 _amp->set_gain (tgain, this);
313 _amp->run (bufs, 0, 0, nframes, false);
321 if (_panshell && !_panshell->bypassed() && _panshell->panner()) {
323 // Use the panner to distribute audio to output port buffers
325 _panshell->run (bufs, output_buffers(), start_frame, end_frame, nframes);
327 // MIDI data will not have been delivered by the panner
329 if (bufs.count().n_midi() > 0 && ports.count().n_midi () > 0) {
330 _output->copy_to_outputs (bufs, DataType::MIDI, nframes, 0);
335 // Do a 1:1 copy of data to output ports
337 if (bufs.count().n_audio() > 0 && ports.count().n_audio () > 0) {
338 _output->copy_to_outputs (bufs, DataType::AUDIO, nframes, 0);
341 if (bufs.count().n_midi() > 0 && ports.count().n_midi () > 0) {
342 _output->copy_to_outputs (bufs, DataType::MIDI, nframes, 0);
346 if (result_required) {
347 bufs.read_from (output_buffers (), nframes);
351 _active = _pending_active;
355 Delivery::state (bool full_state)
357 XMLNode& node (IOProcessor::state (full_state));
360 node.add_property("type", "main-outs");
361 } else if (_role & Listen) {
362 node.add_property("type", "listen");
364 node.add_property("type", "delivery");
367 node.add_property("role", enum_2_string(_role));
370 node.add_child_nocopy (_panshell->get_state ());
371 if (_panshell->pannable()) {
372 node.add_child_nocopy (_panshell->pannable()->get_state ());
380 Delivery::set_state (const XMLNode& node, int version)
382 const XMLProperty* prop;
384 if (IOProcessor::set_state (node, version)) {
388 if ((prop = node.property ("role")) != 0) {
389 _role = Role (string_2_enum (prop->value(), _role));
390 // std::cerr << this << ' ' << _name << " set role to " << enum_2_string (_role) << std::endl;
392 // std::cerr << this << ' ' << _name << " NO ROLE INFO\n";
395 XMLNode* pan_node = node.child (X_("PannerShell"));
397 if (pan_node && _panshell) {
398 _panshell->set_state (*pan_node, version);
403 XMLNode* pannnode = node.child (X_("Pannable"));
404 if (_panshell && _panshell->panner() && pannnode) {
405 _panshell->pannable()->set_state (*pannnode, version);
414 /* caller must hold process lock */
420 Delivery::pan_outs () const
423 return _output->n_ports().n_audio();
426 return _configured_output.n_audio();
430 Delivery::reset_panner ()
433 if (!_no_panner_reset) {
435 if (_panshell && _role != Insert && _role != Listen) {
436 _panshell->configure_io (ChanCount (DataType::AUDIO, pans_required()), ChanCount (DataType::AUDIO, pan_outs()));
441 panner_legal_c.disconnect ();
442 PannersLegal.connect_same_thread (panner_legal_c, boost::bind (&Delivery::panners_became_legal, this));
447 Delivery::panners_became_legal ()
449 if (_panshell && _role != Insert) {
450 _panshell->configure_io (ChanCount (DataType::AUDIO, pans_required()), ChanCount (DataType::AUDIO, pan_outs()));
453 panner_legal_c.disconnect ();
457 Delivery::defer_pan_reset ()
459 _no_panner_reset = true;
463 Delivery::allow_pan_reset ()
465 _no_panner_reset = false;
471 Delivery::disable_panners ()
473 panners_legal = false;
478 Delivery::reset_panners ()
480 panners_legal = true;
485 Delivery::flush_buffers (framecnt_t nframes)
487 /* io_lock, not taken: function must be called from Session::process() calltree */
493 PortSet& ports (_output->ports());
495 for (PortSet::iterator i = ports.begin(); i != ports.end(); ++i) {
496 i->flush_buffers (nframes);
501 Delivery::transport_stopped (framepos_t now)
503 Processor::transport_stopped (now);
506 _panshell->pannable()->transport_stopped (now);
510 PortSet& ports (_output->ports());
512 for (PortSet::iterator i = ports.begin(); i != ports.end(); ++i) {
513 i->transport_stopped ();
519 Delivery::realtime_locate ()
522 PortSet& ports (_output->ports());
524 for (PortSet::iterator i = ports.begin(); i != ports.end(); ++i) {
525 i->realtime_locate ();
531 Delivery::target_gain ()
533 /* if we've been requested to deactivate, our target gain is zero */
535 if (!_pending_active) {
536 return GAIN_COEFF_ZERO;
539 /* if we've been told not to output because its a monitoring situation and
540 we're not monitoring, then be quiet.
543 if (_role == Main && _session.config.get_use_monitor_fades() && _no_outs_cuz_we_no_monitor) {
544 return GAIN_COEFF_ZERO;
547 MuteMaster::MutePoint mp = MuteMaster::Main; // stupid gcc uninit warning
551 mp = MuteMaster::Main;
554 mp = MuteMaster::Listen;
560 mp = MuteMaster::PreFader;
562 mp = MuteMaster::PostFader;
567 gain_t desired_gain = _mute_master->mute_gain_at (mp);
569 if (_role == Listen && _session.monitor_out() && !_session.listening()) {
571 /* nobody is soloed, and this delivery is a listen-send to the
572 control/monitor/listen bus, we should be silent since
573 it gets its signal from the master out.
576 desired_gain = GAIN_COEFF_ZERO;
584 Delivery::no_outs_cuz_we_no_monitor (bool yn)
586 _no_outs_cuz_we_no_monitor = yn;
590 Delivery::set_name (const std::string& name)
592 bool ret = IOProcessor::set_name (name);
594 if (ret && _panshell) {
595 ret = _panshell->set_name (name);
601 bool ignore_output_change = false;
604 Delivery::output_changed (IOChange change, void* /*src*/)
606 if (change.type & IOChange::ConfigurationChanged) {
608 _output_buffers->attach_buffers (_output->ports ());
612 boost::shared_ptr<Panner>
613 Delivery::panner () const
616 return _panshell->panner();
618 return boost::shared_ptr<Panner>();