From 4e5cffaa7bed4cb11a30b7477da60055903e19f0 Mon Sep 17 00:00:00 2001
From: "J. Alexander Treuman" <jat@spatialrift.net>
Date: Sat, 9 Jun 2007 21:40:56 +0000
Subject: [PATCH] If an audio output is in state DEVICE_ENABLE, and
 openAudioOutput fails, leave it in that state.  Likewise, if an audio output
 is in state DEVICE_ON, and reopening the device due to a format change fails,
 change it to state DEVICE_ENABLE.  This will prevent flushAudioBuffer from
 even attempting to play audio on a closed device (even though it would fail
 anyway).

git-svn-id: https://svn.musicpd.org/mpd/trunk@6529 09075e82-0dd4-0310-85a5-a0d7c8717e4f
---
 src/audio.c | 16 ++++++++++------
 1 file changed, 10 insertions(+), 6 deletions(-)

diff --git a/src/audio.c b/src/audio.c
index 027192793..366ec9c5e 100644
--- a/src/audio.c
+++ b/src/audio.c
@@ -272,23 +272,27 @@ int isCurrentAudioFormat(AudioFormat * audioFormat)
 
 static void syncAudioDeviceStates(void)
 {
+	AudioOutput *audioOutput;
 	int i;
 
 	if (!audio_format.channels)
 		return;
-	for (i = 0; i < audioOutputArraySize; ++i ) {
+
+	for (i = 0; i < audioOutputArraySize; ++i) {
+		audioOutput = &audioOutputArray[i];
 		switch (audioDeviceStates[i]) {
 		case DEVICE_ON:
 			/* This will reopen only if the audio format changed */
-			openAudioOutput(&audioOutputArray[i], &audio_format);
+			if (openAudioOutput(audioOutput, &audio_format) < 0)
+				audioDeviceStates[i] = DEVICE_ENABLE;
 			break;
 		case DEVICE_ENABLE:
-			openAudioOutput(&audioOutputArray[i], &audio_format);
-			audioDeviceStates[i] = DEVICE_ON;
+			if (openAudioOutput(audioOutput, &audio_format) == 0)
+				audioDeviceStates[i] = DEVICE_ON;
 			break;
 		case DEVICE_DISABLE:
-			dropBufferedAudioOutput(&audioOutputArray[i]);
-			closeAudioOutput(&audioOutputArray[i]);
+			dropBufferedAudioOutput(audioOutput);
+			closeAudioOutput(audioOutput);
 			audioDeviceStates[i] = DEVICE_OFF;
 			break;
 		}