mirror of
https://github.com/AxioDL/boo.git
synced 2025-05-15 20:01:33 +00:00
More reliable MIDI thread-exit signal
This commit is contained in:
parent
36aa2b06a4
commit
d57469e1e1
@ -366,15 +366,25 @@ 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)
|
||||||
{
|
{
|
||||||
Log.report(logvisor::Error, "MIDI connection lost");
|
if (rdBytes != -EINTR)
|
||||||
|
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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user