zynaddsubfx

ZynAddSubFX open source synthesizer
Log | Files | Refs | Submodules | LICENSE

commit cab6d60d31f85d8529fbf7465cb5f4edb073160a
parent 4b2077b3a216bc22b75d0dc30f88f1bdc0eb8ac7
Author: fundamental <mark.d.mccurry@gmail.com>
Date:   Tue, 15 Nov 2016 18:52:22 -0500

AlsaEngine: Enhance MIDI Thread Cleanup

Diffstat:
Msrc/Nio/AlsaEngine.cpp | 17++++++++++++++---
Msrc/Nio/AlsaEngine.h | 1+
2 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/src/Nio/AlsaEngine.cpp b/src/Nio/AlsaEngine.cpp @@ -105,7 +105,15 @@ void *AlsaEngine::MidiThread(void) snd_seq_event_t *event; MidiEvent ev; set_realtime(); - while(snd_seq_event_input(midi.handle, &event) > 0) { + while(1) { + if(midi.exiting) + break; + if(snd_seq_event_input_pending(midi.handle, 0) <= 0) { + usleep(10); + continue; + } + if(snd_seq_event_input(midi.handle, &event) < 0) + break; //ensure ev is empty ev.channel = 0; ev.num = 0; @@ -225,6 +233,7 @@ bool AlsaEngine::openMidi() if(alsaport < 0) return false; + midi.exiting = false; pthread_attr_t attr; pthread_attr_init(&attr); @@ -239,8 +248,10 @@ void AlsaEngine::stopMidi() return; snd_seq_t *handle = midi.handle; - if((NULL != midi.handle) && midi.pThread) - pthread_cancel(midi.pThread); + if((NULL != midi.handle) && midi.pThread) { + midi.exiting = true; + pthread_join(midi.pThread, 0); + } midi.handle = NULL; if(handle) snd_seq_close(handle); diff --git a/src/Nio/AlsaEngine.h b/src/Nio/AlsaEngine.h @@ -56,6 +56,7 @@ class AlsaEngine:public AudioOut, MidiIn std::string device; snd_seq_t *handle; int alsaId; + bool exiting; pthread_t pThread; } midi;