diff options
-rw-r--r-- | src/audio.c | 13 | ||||
-rw-r--r-- | src/audioOutputs/audioOutput_alsa.c | 5 |
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; |