Make internal sends aware of non-audio data
authorJulien "_FrnchFrgg_" RIVAUD <frnchfrgg@free.fr>
Sat, 9 Jul 2016 00:00:27 +0000 (02:00 +0200)
committerJulien "_FrnchFrgg_" RIVAUD <frnchfrgg@free.fr>
Sat, 9 Jul 2016 00:00:27 +0000 (02:00 +0200)
When most internal sends are created, they are given a panner shell
which is then responsible for audio dispatch. Other data types were left
there without handling them at all. Ensure that all available data is
sent provided the internal send has enough outgoing buffers.

libs/ardour/internal_send.cc

index 0f7d633ba048be4f9e00cc94a8b63ffa49694ee3..6a21e2b5ac7b8daeb06d6a8e35bf3d82225e02e7 100644 (file)
@@ -145,6 +145,27 @@ InternalSend::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame
 
        if (_panshell && !_panshell->bypassed() && role() != Listen) {
                _panshell->run (bufs, mixbufs, start_frame, end_frame, nframes);
+
+               /* non-audio data will not have been copied by the panner, do it now
+                * if there are more buffers available than send buffers, ignore them,
+                * if there are less, copy the last as IO::copy_to_output does. */
+
+               for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+                       if (*t != DataType::AUDIO) {
+                               BufferSet::iterator o = mixbufs.begin(*t);
+                               BufferSet::iterator i = bufs.begin(*t);
+
+                               while (i != bufs.end(*t) && o != mixbufs.end(*t)) {
+                                       o->read_from (*i, nframes);
+                                       ++i;
+                                       ++o;
+                               }
+                               while (o != mixbufs.end(*t)) {
+                                       o->silence(nframes, 0);
+                                       ++o;
+                               }
+                       }
+               }
        } else {
                if (role() == Listen) {
                        /* We're going to the monitor bus, so discard MIDI data */