X-Git-Url: https://main.carlh.net/gitweb/?p=ardour.git;a=blobdiff_plain;f=libs%2Fardour%2Fdelivery.cc;h=e051ce6fb14a88fb92567026ad91ea3bbc768e53;hp=045417b0ccc20b2716854ae38bff6d541048664c;hb=c8c6bca6587450ff64303dbc994a4cd28d6ce7aa;hpb=813ead6d8bc68bbacbb51aac4af7a7ec4583eaf3 diff --git a/libs/ardour/delivery.cc b/libs/ardour/delivery.cc index 045417b0cc..e051ce6fb1 100644 --- a/libs/ardour/delivery.cc +++ b/libs/ardour/delivery.cc @@ -34,7 +34,7 @@ #include "ardour/port.h" #include "ardour/session.h" -#include "i18n.h" +#include "pbd/i18n.h" namespace ARDOUR { class Panner; } @@ -52,7 +52,7 @@ Delivery::Delivery (Session& s, boost::shared_ptr io, boost::shared_ptr(), (role_requires_output_ports (r) ? io : boost::shared_ptr()), name) , _role (r) , _output_buffers (new BufferSet()) - , _current_gain (1.0) + , _current_gain (GAIN_COEFF_UNITY) , _no_outs_cuz_we_no_monitor (false) , _mute_master (mm) , _no_panner_reset (false) @@ -76,7 +76,7 @@ Delivery::Delivery (Session& s, boost::shared_ptr pannable, boost::sha : IOProcessor(s, false, (role_requires_output_ports (r) ? true : false), name, "", DataType::AUDIO, (r == Send)) , _role (r) , _output_buffers (new BufferSet()) - , _current_gain (1.0) + , _current_gain (GAIN_COEFF_UNITY) , _no_outs_cuz_we_no_monitor (false) , _mute_master (mm) , _no_panner_reset (false) @@ -97,11 +97,11 @@ Delivery::Delivery (Session& s, boost::shared_ptr pannable, boost::sha Delivery::~Delivery() { - DEBUG_TRACE (DEBUG::Destruction, string_compose ("delivery %1 destructor\n", _name)); + DEBUG_TRACE (DEBUG::Destruction, string_compose ("delivery %1 destructor\n", _name)); /* this object should vanish from any signal callback lists that it is on before we get any further. The full qualification - of the method name is not necessary, but is here to make it + of the method name is not necessary, but is here to make it clear that this call is about signals, not data flow connections. */ @@ -148,7 +148,7 @@ Delivery::can_support_io_configuration (const ChanCount& in, ChanCount& out) } } else { fatal << "programming error: this should never be reached" << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } @@ -169,7 +169,7 @@ Delivery::can_support_io_configuration (const ChanCount& in, ChanCount& out) } } else { fatal << "programming error: this should never be reached" << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } } else { @@ -210,7 +210,7 @@ Delivery::configure_io (ChanCount in, ChanCount out) if (_input->n_ports() != in) { if (_input->n_ports() != ChanCount::ZERO) { fatal << _name << " programming error: configure_io called with " << in << " and " << out << " with " << _input->n_ports() << " input ports" << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } else { /* I/O not yet configured */ } @@ -229,14 +229,14 @@ Delivery::configure_io (ChanCount in, ChanCount out) } void -Delivery::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool result_required) +Delivery::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, double /*speed*/, pframes_t nframes, bool result_required) { assert (_output); PortSet& ports (_output->ports()); gain_t tgain; - if (_output->n_ports ().get (_output->default_type()) == 0) { + if (ports.num_ports () == 0) { goto out; } @@ -246,9 +246,10 @@ Delivery::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pf } /* this setup is not just for our purposes, but for anything that comes after us in the - processing pathway that wants to use this->output_buffers() for some reason. - */ + * processing pathway that wants to use this->output_buffers() for some reason. + */ + // TODO delayline -- latency-compensation output_buffers().get_backend_port_addresses (ports, nframes); // this Delivery processor is not a derived type, and thus we assume @@ -261,58 +262,71 @@ Delivery::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pf if (tgain != _current_gain) { /* target gain has changed */ - Amp::apply_gain (bufs, nframes, _current_gain, tgain); - _current_gain = tgain; + _current_gain = Amp::apply_gain (bufs, _session.nominal_frame_rate(), nframes, _current_gain, tgain); - } else if (tgain == 0.0) { + } else if (tgain < GAIN_COEFF_SMALL) { /* we were quiet last time, and we're still supposed to be quiet. - Silence the outputs, and make sure the buffers are quiet too, - */ + Silence the outputs, and make sure the buffers are quiet too, + */ _output->silence (nframes); if (result_required) { bufs.set_count (output_buffers().count ()); - Amp::apply_simple_gain (bufs, nframes, 0.0); + Amp::apply_simple_gain (bufs, nframes, GAIN_COEFF_ZERO); } goto out; - } else if (tgain != 1.0) { + } else if (tgain != GAIN_COEFF_UNITY) { /* target gain has not changed, but is not unity */ Amp::apply_simple_gain (bufs, nframes, tgain); } + // Speed quietning + + if (fabs (_session.transport_speed()) > 1.5 && Config->get_quieten_at_speed ()) { + Amp::apply_simple_gain (bufs, nframes, speed_quietning, false); + } + + // Panning + if (_panshell && !_panshell->bypassed() && _panshell->panner()) { // Use the panner to distribute audio to output port buffers _panshell->run (bufs, output_buffers(), start_frame, end_frame, nframes); - // MIDI data will not have been delivered by the panner + // non-audio data will not have been delivered by the panner - if (bufs.count().n_midi() > 0 && ports.count().n_midi () > 0) { - _output->copy_to_outputs (bufs, DataType::MIDI, nframes, 0); + for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) { + if (*t != DataType::AUDIO && bufs.count().get(*t) > 0) { + _output->copy_to_outputs (bufs, *t, nframes, ports.port(0)->port_offset()); + } } } else { // Do a 1:1 copy of data to output ports - if (bufs.count().n_audio() > 0 && ports.count().n_audio () > 0) { + // audio is handled separately because we use 0 for the offset + // XXX how does this interact with Port::increment_global_port_buffer_offset ? + if (bufs.count().n_audio() > 0) { _output->copy_to_outputs (bufs, DataType::AUDIO, nframes, 0); - } + } - if (bufs.count().n_midi() > 0 && ports.count().n_midi () > 0) { - _output->copy_to_outputs (bufs, DataType::MIDI, nframes, 0); + for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) { + if (*t != DataType::AUDIO && bufs.count().get(*t) > 0) { + _output->copy_to_outputs (bufs, *t, nframes, ports.port(0)->port_offset()); + } } } - if (result_required) { - bufs.read_from (output_buffers (), nframes); - } + if (result_required) { + bufs.read_from (output_buffers (), nframes); + } - out: +out: _active = _pending_active; } @@ -344,7 +358,7 @@ Delivery::state (bool full_state) int Delivery::set_state (const XMLNode& node, int version) { - const XMLProperty* prop; + XMLProperty const * prop; if (IOProcessor::set_state (node, version)) { return -1; @@ -386,7 +400,7 @@ Delivery::pan_outs () const { if (_output) { return _output->n_ports().n_audio(); - } + } return _configured_output.n_audio(); } @@ -397,8 +411,7 @@ Delivery::reset_panner () if (panners_legal) { if (!_no_panner_reset) { - if (_panshell) { - assert (_role == Main || _role == Aux || _role == Send); + if (_panshell && _role != Insert && _role != Listen) { _panshell->configure_io (ChanCount (DataType::AUDIO, pans_required()), ChanCount (DataType::AUDIO, pan_outs())); } } @@ -412,8 +425,7 @@ Delivery::reset_panner () void Delivery::panners_became_legal () { - if (_panshell) { - assert (_role == Main || _role == Aux || _role == Send); + if (_panshell && _role != Insert) { _panshell->configure_io (ChanCount (DataType::AUDIO, pans_required()), ChanCount (DataType::AUDIO, pan_outs())); } @@ -456,7 +468,7 @@ Delivery::flush_buffers (framecnt_t nframes) if (!_output) { return; } - + PortSet& ports (_output->ports()); for (PortSet::iterator i = ports.begin(); i != ports.end(); ++i) { @@ -500,7 +512,7 @@ Delivery::target_gain () /* if we've been requested to deactivate, our target gain is zero */ if (!_pending_active) { - return 0.0; + return GAIN_COEFF_ZERO; } /* if we've been told not to output because its a monitoring situation and @@ -508,7 +520,7 @@ Delivery::target_gain () */ if (_no_outs_cuz_we_no_monitor) { - return 0.0; + return GAIN_COEFF_ZERO; } MuteMaster::MutePoint mp = MuteMaster::Main; // stupid gcc uninit warning @@ -540,7 +552,7 @@ Delivery::target_gain () it gets its signal from the master out. */ - desired_gain = 0.0; + desired_gain = GAIN_COEFF_ZERO; } @@ -558,7 +570,7 @@ Delivery::set_name (const std::string& name) { bool ret = IOProcessor::set_name (name); - if (ret) { + if (ret && _panshell) { ret = _panshell->set_name (name); }