Browse Source

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

Sam Lantinga 8 years ago
parent
commit
62310c6bfd
1 changed files with 14 additions and 3 deletions
  1. 14 3
      src/audio/alsa/SDL_alsa_audio.c

+ 14 - 3
src/audio/alsa/SDL_alsa_audio.c

@@ -314,9 +314,20 @@ ALSA_PlayDevice(_THIS)
     swizzle_alsa_channels(this, this->hidden->mixbuf, frames_left);
 
     while ( frames_left > 0 && SDL_AtomicGet(&this->enabled) ) {
-        /* !!! FIXME: This works, but needs more testing before going live */
-        /* ALSA_snd_pcm_wait(this->hidden->pcm_handle, -1); */
-        int status = ALSA_snd_pcm_writei(this->hidden->pcm_handle,
+        int status;
+
+        /* 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);
 
         if (status < 0) {