implement file-[un]archive progress report
[ardour.git] / libs / ardour / delivery.cc
index c538f6be8a5d597bb572cde045c313e54e6b731c..35c4f9ad80b32bc4118cc0895192beeb600857c6 100644 (file)
@@ -34,7 +34,7 @@
 #include "ardour/port.h"
 #include "ardour/session.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 namespace ARDOUR { class Panner; }
 
@@ -229,7 +229,7 @@ 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);
 
@@ -297,27 +297,51 @@ 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);
+
+               /* "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:
@@ -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) {