coreaudio: correctly clear MIDI port buffers
authorPaul Davis <paul@linuxaudiosystems.com>
Thu, 7 Jan 2016 23:11:36 +0000 (18:11 -0500)
committerPaul Davis <paul@linuxaudiosystems.com>
Thu, 7 Jan 2016 23:11:45 +0000 (18:11 -0500)
libs/backends/coreaudio/coreaudio_backend.cc
libs/backends/coreaudio/coreaudio_backend.h

index 4e2349cd7fdfa6e2c4eb7d25f990e29d133f1c58..ee03173cabd07b527efbdef0e916a3797e25aebf 100644 (file)
@@ -1707,7 +1707,9 @@ CoreAudioBackend::process_callback (const uint32_t n_samples, const uint64_t hos
                 uint64_t time_ns;
                 uint8_t data[128]; // matches CoreMidi's MIDIPacket
                 size_t size = sizeof(data);
-                
+
+                port->clear_events ();
+
                 while (_midiio->recv_event (i, nominal_time, time_ns, data, size)) {
                         pframes_t time = floor((float) time_ns * _samplerate * 1e-9);
                         assert (time < n_samples);
@@ -2079,6 +2081,9 @@ void* CoreMidiPort::get_buffer (pframes_t /* nframes */)
                                i != get_connections ().end ();
                                ++i) {
                        const CoreMidiBuffer * src = static_cast<const CoreMidiPort*>(*i)->const_buffer ();
+                        if (!src->empty()) {
+                                fprintf (stderr, "Copying %d events from %s\n", src->size(), (*i)->name().c_str());
+                        }
                        for (CoreMidiBuffer::const_iterator it = src->begin (); it != src->end (); ++it) {
                                (_buffer[_bufperiod]).push_back (boost::shared_ptr<CoreMidiEvent>(new CoreMidiEvent (**it)));
                        }
@@ -2097,21 +2102,16 @@ CoreMidiPort::queue_event (
         pframes_t timestamp,
         const uint8_t* buffer, size_t size)
 {
-       if (!buffer || !port_buffer) return -1;
-        _event._pending = false;
-       CoreMidiBuffer& dst = * static_cast<CoreMidiBuffer*>(port_buffer);
-       if (dst.size () && (pframes_t)dst.back ()->timestamp () > timestamp) {
-#ifndef NDEBUG
-               // nevermind, ::get_buffer() sorts events
-               fprintf (stderr, "CoreMidiBuffer: unordered event: %d > %d\n",
-                               (pframes_t)dst.back ()->timestamp (), timestamp);
-#endif
-       }
-        fprintf (stderr, "coremidi: queue event/buffer size %d @ %d\n", size, timestamp);
-       dst.push_back (boost::shared_ptr<CoreMidiEvent>(new CoreMidiEvent (timestamp, buffer, size)));
-       return 0;
+        return CoreAudioBackend::_midi_event_put (port_buffer, timestamp, buffer, size);
 }
 
+void
+CoreMidiPort::clear_events ()
+{
+        CoreMidiBuffer* mbuf = static_cast<CoreMidiBuffer*>(get_buffer(0));
+        mbuf->clear();
+}        
+
 void
 CoreMidiPort::parse_events (const uint64_t time, const uint8_t *data, const size_t size) 
 {
index 8bec7d939a18f1c7a7e286d222c65453212796f6..cd3a49b7ca309030fd5ca3a12c2f8646b3a077cd 100644 (file)
@@ -150,6 +150,7 @@ class CoreMidiPort : public CoreBackendPort {
                void set_n_periods(int n) { if (n > 0 && n < 3) { _n_periods = n; } }
 
         void parse_events (const uint64_t time, const uint8_t *data, const size_t size);
+        void clear_events ();
 
        private:
                CoreMidiBuffer _buffer[2];
@@ -158,7 +159,7 @@ class CoreMidiPort : public CoreBackendPort {
 
         int queue_event (void* port_buffer, pframes_t timestamp, const uint8_t* buffer, size_t size);
        bool process_byte (const uint64_t, const uint8_t);
-
+        
        void record_byte(uint8_t byte) {
                if (_total_bytes < sizeof(_parser_buffer)) {
                        _parser_buffer[_total_bytes] = byte;