X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fdelivery.cc;h=35c4f9ad80b32bc4118cc0895192beeb600857c6;hb=6946bdc0830c9f0971d2cd0d54b27e343c54d96a;hp=b2cdc0b324b30944bfcca4c81b56e5db029ff3a5;hpb=c4f8a69526b5f9b4412c013b9c582690e1cb2f79;p=ardour.git diff --git a/libs/ardour/delivery.cc b/libs/ardour/delivery.cc index b2cdc0b324..35c4f9ad80 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; } @@ -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,8 +246,8 @@ 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); @@ -267,8 +267,8 @@ Delivery::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pf } 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) { @@ -283,7 +283,7 @@ Delivery::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pf Amp::apply_simple_gain (bufs, nframes, tgain); } - // Speed quietning + // Speed quietning if (fabs (_session.transport_speed()) > 1.5 && Config->get_quieten_at_speed ()) { Amp::apply_simple_gain (bufs, nframes, speed_quietning, false); @@ -297,30 +297,54 @@ Delivery::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pf _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, ports.port(0)->port_offset()); + 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, Port::port_offset()); + } } } else { - // Do a 1:1 copy of data to output ports + /* Do a 1:1 copy of data to output ports + + Audio is handled separately because we use 0 for the offset, + since the port offset is only used for timestamped events + (i.e. MIDI). + */ - if (bufs.count().n_audio() > 0 && ports.count().n_audio () > 0) { + 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, ports.port(0)->port_offset()); + 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, Port::port_offset()); + } } } - if (result_required) { - bufs.read_from (output_buffers (), nframes); - } + if (result_required) { + + /* "bufs" are internal, meaning they should never reflect + split-cycle offsets. So shift events back in time from where + they were for the external buffers associated with Ports. + */ + + BufferSet& outs (output_buffers()); + + for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) { + + uint32_t n = 0; + + for (BufferSet::iterator b = bufs.begin (*t); b != bufs.end (*t); ++b) { + b->read_from (outs.get (*t, n++), nframes, (*t == DataType::AUDIO ? 0 : -Port::port_offset())); + } + } + } - out: +out: _active = _pending_active; } @@ -352,7 +376,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; @@ -491,7 +515,7 @@ Delivery::transport_stopped (framepos_t now) void Delivery::realtime_locate () { - if (_output) { + if (_output) { PortSet& ports (_output->ports()); for (PortSet::iterator i = ports.begin(); i != ports.end(); ++i) {