From d14ec6aea560be509200e99b13890ac28e79b7e1 Mon Sep 17 00:00:00 2001
From: Max Kellermann <max@musicpd.org>
Date: Sun, 15 Jan 2017 01:18:34 +0100
Subject: [PATCH] output/Thread: reconfigure ConvertFilter for its new input
 AudioFormat

If the input AudioFormat changes but the out_audio_format doesn't
change (e.g. because there is a fixed "format" setting in this
"audio_output" section), the ConvertFilter needs to be reconfigured.
This didn't happen, resulting in awful static noise after changing
songs.
---
 NEWS                        |  1 +
 src/output/OutputThread.cxx | 12 ++++++++++++
 2 files changed, 13 insertions(+)

diff --git a/NEWS b/NEWS
index 2f0809f91..8c7a2fc11 100644
--- a/NEWS
+++ b/NEWS
@@ -7,6 +7,7 @@ ver 0.20.2 (not yet released)
 * resampler
   - libsamplerate: reset state after seeking
 * output
+  - fix static noise after changing to a different audio format
   - alsa: fix the DSD_U32 sample rate
   - alsa: fix the DSD_U32 byte order
   - alsa: support DSD_U16
diff --git a/src/output/OutputThread.cxx b/src/output/OutputThread.cxx
index 809cae6cc..047dbe0c0 100644
--- a/src/output/OutputThread.cxx
+++ b/src/output/OutputThread.cxx
@@ -140,6 +140,18 @@ AudioOutput::Open()
 		}
 
 		open = true;
+	} else if (f != out_audio_format) {
+		/* reconfigure the final ConvertFilter for its new
+		   input AudioFormat */
+
+		try {
+			convert_filter_set(convert_filter.Get(),
+					   out_audio_format);
+		} catch (const std::runtime_error &e) {
+			Close(false);
+			std::throw_with_nested(FormatRuntimeError("Failed to convert for \"%s\" [%s]",
+								  name, plugin.name));
+		}
 	}
 
 	if (f != source.GetInputAudioFormat() || f != out_audio_format) {