More reliable MIDI thread-exit signal

This commit is contained in:
Jack Andersen 2016-05-31 00:18:04 -10:00
parent 36aa2b06a4
commit d57469e1e1

View File

@ -366,14 +366,24 @@ struct ALSAAudioVoiceEngine : BaseAudioVoiceEngine
return ret; return ret;
} }
/* Empty handler for SIGQUIT */
static void _sigquit(int) {}
static void MIDIReceiveProc(snd_rawmidi_t* midi, const ReceiveFunctor& receiver, bool& running) static void MIDIReceiveProc(snd_rawmidi_t* midi, const ReceiveFunctor& receiver, bool& running)
{ {
struct sigaction s;
s.sa_handler = _sigquit;
sigemptyset(&s.sa_mask);
s.sa_flags = 0;
sigaction(SIGQUIT, &s, nullptr);
uint8_t buf[512]; uint8_t buf[512];
while (running) while (running)
{ {
int rdBytes = snd_rawmidi_read(midi, buf, 512); int rdBytes = snd_rawmidi_read(midi, buf, 512);
if (rdBytes < 0) if (rdBytes < 0)
{ {
if (rdBytes != -EINTR)
Log.report(logvisor::Error, "MIDI connection lost"); Log.report(logvisor::Error, "MIDI connection lost");
running = false; running = false;
break; break;
@ -396,7 +406,7 @@ struct ALSAAudioVoiceEngine : BaseAudioVoiceEngine
~MIDIIn() ~MIDIIn()
{ {
m_midiRunning = false; m_midiRunning = false;
pthread_kill(m_midiThread.native_handle(), SIGTERM); pthread_kill(m_midiThread.native_handle(), SIGQUIT);
if (m_midiThread.joinable()) if (m_midiThread.joinable())
m_midiThread.join(); m_midiThread.join();
snd_rawmidi_close(m_midi); snd_rawmidi_close(m_midi);
@ -449,7 +459,7 @@ struct ALSAAudioVoiceEngine : BaseAudioVoiceEngine
~MIDIInOut() ~MIDIInOut()
{ {
m_midiRunning = false; m_midiRunning = false;
pthread_kill(m_midiThread.native_handle(), SIGTERM); pthread_kill(m_midiThread.native_handle(), SIGQUIT);
if (m_midiThread.joinable()) if (m_midiThread.joinable())
m_midiThread.join(); m_midiThread.join();
snd_rawmidi_close(m_midiIn); snd_rawmidi_close(m_midiIn);