]> git.ipfire.org Git - thirdparty/shairport-sync.git/commitdiff
Check before using snd_pcm_prepare in delay()
authorMike Brady <mikebrady@eircom.net>
Fri, 4 Jan 2019 11:29:18 +0000 (11:29 +0000)
committerMike Brady <mikebrady@eircom.net>
Fri, 4 Jan 2019 11:29:18 +0000 (11:29 +0000)
audio_alsa.c

index 43e267498d0577c8fd166ad2a352f51504fbc92d..0528c270844bb1d18f1cf509f1caded1747f727d 100644 (file)
@@ -1021,14 +1021,23 @@ int delay_prep_and_status(snd_pcm_state_t *state, snd_pcm_sframes_t *delay) {
     *state = snd_pcm_status_get_state(alsa_snd_pcm_status);
 
     if ((*state == SND_PCM_STATE_SUSPENDED) || (*state == SND_PCM_STATE_XRUN)) {
-      debug(1, "alsa: recovering from SND_PCM_STATE_* %d in delay_prep_and_status.", *state);
-      ret = snd_pcm_prepare(alsa_handle);
-      if (ret == 0)
-        ret = snd_pcm_recover(alsa_handle, ret, 1);
+      debug(1, "alsa: recovering from SND_PCM_STATE_* %d in delay_prep_and_status.", *state); 
+      ret = snd_pcm_recover(alsa_handle, ret, 1);
       if (ret == 0) {
         ret = snd_pcm_status(alsa_handle, alsa_snd_pcm_status);
         if (ret == 0)
           *state = snd_pcm_status_get_state(alsa_snd_pcm_status);
+        if (*state != SND_PCM_STATE_PREPARED) {
+         debug(1, "alsa: snd_pcm_recover failed -- have to use snd_pcm_prepare.");     
+          ret = snd_pcm_prepare(alsa_handle);
+          if (ret == 0)
+            ret = snd_pcm_recover(alsa_handle, ret, 1);
+          if (ret == 0) {
+            ret = snd_pcm_status(alsa_handle, alsa_snd_pcm_status);
+            if (ret == 0)
+              *state = snd_pcm_status_get_state(alsa_snd_pcm_status);
+          }
+        }
       }
     }