coreaudio: reset MIDI parsers when entering and leaving freewheeling
authorPaul Davis <paul@linuxaudiosystems.com>
Fri, 8 Jan 2016 14:19:25 +0000 (09:19 -0500)
committerPaul Davis <paul@linuxaudiosystems.com>
Fri, 8 Jan 2016 14:23:05 +0000 (09:23 -0500)
libs/backends/coreaudio/coreaudio_backend.cc
libs/backends/coreaudio/coreaudio_backend.h

index ee03173cabd07b527efbdef0e916a3797e25aebf..ebe8d62880ae743c12bff85c10aca4757deac595 100644 (file)
@@ -1562,6 +1562,17 @@ CoreAudioBackend::pre_process ()
        }
 }
 
+void
+CoreAudioBackend::reset_midi_parsers ()
+{
+        for (std::vector<CoreBackendPort*>::const_iterator it = _system_midi_in.begin (); it != _system_midi_in.end (); ++it) {
+                CoreMidiPort* port = dynamic_cast<CoreMidiPort*>(*it);
+                if (port) {
+                        port->reset_parser ();
+                }
+        }
+}
+
 void *
 CoreAudioBackend::freewheel_thread ()
 {
@@ -1587,6 +1598,7 @@ CoreAudioBackend::freewheel_thread ()
                                _freewheel = false; // first mark as disabled
                                _reinit_thread_callback = true; // hand over _main_thread
                                _freewheel_ack = false; // prepare next handshake
+                                reset_midi_parsers ();
                                _midiio->set_enabled(true);
                                engine.freewheel_callback (_freewheeling);
                        } else {
@@ -1614,6 +1626,7 @@ CoreAudioBackend::freewheel_thread ()
                        _main_thread = pthread_self();
                        AudioEngine::thread_init_callback (this);
                        _midiio->set_enabled(false);
+                        reset_midi_parsers ();
                }
 
                // process port updates first in every cycle.
@@ -2105,6 +2118,17 @@ CoreMidiPort::queue_event (
         return CoreAudioBackend::_midi_event_put (port_buffer, timestamp, buffer, size);
 }
 
+void
+CoreMidiPort::reset_parser ()
+{
+        _event._pending = false;
+        _first_time = true;
+        _unbuffered_bytes = 0;
+        _total_bytes = 0;
+        _expected_bytes = 0;
+        _status_byte = 0;
+}
+
 void
 CoreMidiPort::clear_events ()
 {
index cd3a49b7ca309030fd5ca3a12c2f8646b3a077cd..7b42bfe653db990ec3cd781f2eb08b2807d32994 100644 (file)
@@ -151,6 +151,7 @@ class CoreMidiPort : public CoreBackendPort {
 
         void parse_events (const uint64_t time, const uint8_t *data, const size_t size);
         void clear_events ();
+        void reset_parser ();
 
        private:
                CoreMidiBuffer _buffer[2];
@@ -511,6 +512,8 @@ class CoreAudioBackend : public AudioBackend {
                        }
                        return NULL;
                }
+        
+        void reset_midi_parsers ();
 
 }; // class CoreAudioBackend