summaryrefslogtreecommitdiff
path: root/libs/backends/coreaudio/coreaudio_backend.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2016-01-08 09:19:25 -0500
committerPaul Davis <paul@linuxaudiosystems.com>2016-01-08 09:23:05 -0500
commit3d5e3458003c08f19d6d706f4fa1add0b41e3056 (patch)
tree56aaa9dee54746dbc0971f32c9888d968eec720d /libs/backends/coreaudio/coreaudio_backend.cc
parent5a766dc24d75cc4148a45253846dbebfe7d626b2 (diff)
coreaudio: reset MIDI parsers when entering and leaving freewheeling
Diffstat (limited to 'libs/backends/coreaudio/coreaudio_backend.cc')
-rw-r--r--libs/backends/coreaudio/coreaudio_backend.cc24
1 files changed, 24 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));