diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2016-01-08 09:19:25 -0500 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2016-01-08 09:23:05 -0500 |
commit | 3d5e3458003c08f19d6d706f4fa1add0b41e3056 (patch) | |
tree | 56aaa9dee54746dbc0971f32c9888d968eec720d | |
parent | 5a766dc24d75cc4148a45253846dbebfe7d626b2 (diff) |
coreaudio: reset MIDI parsers when entering and leaving freewheeling
-rw-r--r-- | libs/backends/coreaudio/coreaudio_backend.cc | 24 | ||||
-rw-r--r-- | libs/backends/coreaudio/coreaudio_backend.h | 3 |
2 files changed, 27 insertions, 0 deletions
diff --git a/libs/backends/coreaudio/coreaudio_backend.cc b/libs/backends/coreaudio/coreaudio_backend.cc index ee03173cab..ebe8d62880 100644 --- a/libs/backends/coreaudio/coreaudio_backend.cc +++ b/libs/backends/coreaudio/coreaudio_backend.cc @@ -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. @@ -2106,6 +2119,17 @@ CoreMidiPort::queue_event ( } 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 () { CoreMidiBuffer* mbuf = static_cast<CoreMidiBuffer*>(get_buffer(0)); diff --git a/libs/backends/coreaudio/coreaudio_backend.h b/libs/backends/coreaudio/coreaudio_backend.h index cd3a49b7ca..7b42bfe653 100644 --- a/libs/backends/coreaudio/coreaudio_backend.h +++ b/libs/backends/coreaudio/coreaudio_backend.h @@ -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 |