fix endless messages about MIDI events being dropped.
authorPaul Davis <paul@linuxaudiosystems.com>
Mon, 21 Oct 2013 15:24:31 +0000 (11:24 -0400)
committerPaul Davis <paul@linuxaudiosystems.com>
Mon, 21 Oct 2013 15:24:31 +0000 (11:24 -0400)
track-owned MIDI port buffers (at the Ardour level) get ::flush_buffers() called twice, once by Delivery::flush_buffers() which is called
at the end of MidiTrack::rol() to push data out in graph order, and then finally as a last-chance effort in PortManager::cycle_end().

This should not cause a repeated attempt to write the same data, but it was. Fixed by marking the buffer empty once its data has
been flushed into a backend port buffer.

libs/ardour/midi_port.cc

index de2263fad6678fa590cb859ce74a789a8e066874..ae168356b6e51f580d0de01955aeb1ae6761131f 100644 (file)
@@ -174,12 +174,21 @@ MidiPort::flush_buffers (pframes_t nframes)
 {
        if (sends_output ()) {
 
-               void* port_buffer = port_engine.get_buffer (_port_handle, nframes);
+               void* port_buffer = 0;
                
                if (_resolve_required) {
+                       port_buffer = port_engine.get_buffer (_port_handle, nframes);
                        /* resolve all notes at the start of the buffer */
                        resolve_notes (port_buffer, 0);
                        _resolve_required = false;
+               } 
+               
+               if (_buffer->empty()) {
+                       return;
+               }
+
+               if (!port_buffer) {
+                       port_buffer = port_engine.get_buffer (_port_handle, nframes);
                }
 
                for (MidiBuffer::iterator i = _buffer->begin(); i != _buffer->end(); ++i) {
@@ -201,6 +210,11 @@ MidiPort::flush_buffers (pframes_t nframes)
                                     << " + " << _port_buffer_offset << endl;
                        }
                }
+
+               /* done.. the data has moved to the port buffer, mark it so 
+                */
+
+               _buffer->clear ();
        }
 }