#include "ardour/port.h"
#include "ardour/session.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
namespace ARDOUR { class Panner; }
}
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);
_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);
+
+ /* "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:
int
Delivery::set_state (const XMLNode& node, int version)
{
- const XMLProperty* prop;
+ XMLProperty const * prop;
if (IOProcessor::set_state (node, version)) {
return -1;
void
Delivery::realtime_locate ()
{
- if (_output) {
+ if (_output) {
PortSet& ports (_output->ports());
for (PortSet::iterator i = ports.begin(); i != ports.end(); ++i) {