aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/audio.c13
-rw-r--r--src/audioOutputs/audioOutput_alsa.c5
2 files changed, 13 insertions, 5 deletions
diff --git a/src/audio.c b/src/audio.c
index 6766159b2..8180b290b 100644
--- a/src/audio.c
+++ b/src/audio.c
@@ -274,7 +274,7 @@ static void syncAudioDevicesEnabledArrays(void) {
static int flushAudioBuffer() {
int ret = -1;
- int i;
+ int i, err;
if(audioBufferPos == 0) return 0;
@@ -286,11 +286,14 @@ static int flushAudioBuffer() {
for(i = 0; i < audioOutputArraySize; i++) {
if(!myAudioDevicesEnabled[i]) continue;
- if(0 == playAudioOutput(audioOutputArray[i], audioBuffer,
- audioBufferPos))
- {
+ err = playAudioOutput(audioOutputArray[i], audioBuffer,
+ audioBufferPos);
+ if (!err)
ret = 0;
- }
+ else if (err < 0)
+ /* device should already be closed if the play func
+ * returned an error */
+ myAudioDevicesEnabled[i] = 0;
}
audioBufferPos = 0;
diff --git a/src/audioOutputs/audioOutput_alsa.c b/src/audioOutputs/audioOutput_alsa.c
index bc727c556..3abd81f31 100644
--- a/src/audioOutputs/audioOutput_alsa.c
+++ b/src/audioOutputs/audioOutput_alsa.c
@@ -315,6 +315,11 @@ static int alsa_errorRecovery(AlsaData * ad, int err) {
case SND_PCM_STATE_XRUN:
err = snd_pcm_prepare(ad->pcmHandle);
break;
+ case SND_PCM_STATE_DISCONNECTED:
+ /* so alsa_closeDevice won't try to drain: */
+ snd_pcm_close(ad->pcmHandle);
+ ad->pcmHandle = NULL;
+ break;
default:
/* unknown state, do nothing */
break;