From 7d9fd48557ec9c44b4c7b23db02a38b02a45e92b Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Fri, 20 Jun 2025 16:33:30 -0700
Subject: [PATCH] alsa: recover from snd_pcm_avail() returning -EPIPE
---
src/audio/alsa/SDL_alsa_audio.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/src/audio/alsa/SDL_alsa_audio.c b/src/audio/alsa/SDL_alsa_audio.c
index f8bd072bb33f3..4ba156e30696e 100644
--- a/src/audio/alsa/SDL_alsa_audio.c
+++ b/src/audio/alsa/SDL_alsa_audio.c
@@ -356,8 +356,12 @@ static bool ALSA_WaitDevice(SDL_AudioDevice *device)
while (!SDL_GetAtomicInt(&device->shutdown)) {
const int rc = ALSA_snd_pcm_avail(device->hidden->pcm);
if (rc < 0) {
- SDL_LogError(SDL_LOG_CATEGORY_AUDIO, "ALSA wait failed (unrecoverable): %s", ALSA_snd_strerror(rc));
- return false;
+ const int status = ALSA_snd_pcm_recover(device->hidden->pcm, rc, 0);
+ if (status < 0) {
+ // Hmm, not much we can do - abort
+ SDL_LogError(SDL_LOG_CATEGORY_AUDIO, "ALSA wait failed (unrecoverable): %s", ALSA_snd_strerror(rc));
+ return false;
+ }
}
if (rc >= sample_frames) {
break;