Work-around for a hang when USB devices are unplugged, contributed by James Zipperer

This commit is contained in:
Sam Lantinga 2016-10-12 22:25:19 -07:00
parent 14e7da75b2
commit 62310c6bfd
1 changed files with 14 additions and 3 deletions

View File

@ -314,9 +314,20 @@ ALSA_PlayDevice(_THIS)
swizzle_alsa_channels(this, this->hidden->mixbuf, frames_left); swizzle_alsa_channels(this, this->hidden->mixbuf, frames_left);
while ( frames_left > 0 && SDL_AtomicGet(&this->enabled) ) { while ( frames_left > 0 && SDL_AtomicGet(&this->enabled) ) {
/* !!! FIXME: This works, but needs more testing before going live */ int status;
/* ALSA_snd_pcm_wait(this->hidden->pcm_handle, -1); */
int status = ALSA_snd_pcm_writei(this->hidden->pcm_handle, /* This wait is a work-around for a hang when USB devices are
unplugged. Normally it should not result in any waiting,
but in the case of a USB unplug, it serves as a way to
join the playback thread after the timeout occurs */
status = ALSA_snd_pcm_wait(this->hidden->pcm_handle, 1000);
if (status == 0) {
/*fprintf(stderr, "ALSA timeout waiting for available buffer space\n");*/
SDL_OpenedAudioDeviceDisconnected(this);
return;
}
status = ALSA_snd_pcm_writei(this->hidden->pcm_handle,
sample_buf, frames_left); sample_buf, frames_left);
if (status < 0) { if (status < 0) {