New test.
[ardour.git] / libs / ardour / internal_send.cc
index bd2efbe12dae57b47d1a7809977c4910c5aa576a..4ddd0647042ba433f1f3273105c2f0d02d5c5a30 100644 (file)
@@ -29,6 +29,7 @@
 #include "ardour/panner_shell.h"
 #include "ardour/route.h"
 #include "ardour/session.h"
+#include "ardour/audioengine.h"
 
 #include "i18n.h"
 
@@ -118,8 +119,26 @@ InternalSend::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame
        } else {
                if (role() == Listen) {
                        /* We're going to the monitor bus, so discard MIDI data */
-                       assert (mixbufs.available().get (DataType::AUDIO) >= bufs.count().get (DataType::AUDIO));
-                       mixbufs.read_from (bufs, nframes, DataType::AUDIO);
+                       
+                       uint32_t const bufs_audio = bufs.count().get (DataType::AUDIO);
+                       uint32_t const mixbufs_audio = mixbufs.count().get (DataType::AUDIO);
+                       
+                       assert (mixbufs.available().get (DataType::AUDIO) >= bufs_audio);
+
+                       /* Copy bufs into mixbufs, going round bufs more than once if necessary
+                          to ensure that every mixbuf gets some data.
+                       */
+
+                       uint32_t j = 0;
+                       for (uint32_t i = 0; i < mixbufs_audio; ++i) {
+                               mixbufs.get_audio(i).read_from (bufs.get_audio(j), nframes);
+                               ++j;
+
+                               if (j == bufs_audio) {
+                                       j = 0;
+                               }
+                       }
+
                } else {
                        assert (mixbufs.available() >= bufs.count());
                        mixbufs.read_from (bufs, nframes);