From d14ec6aea560be509200e99b13890ac28e79b7e1 Mon Sep 17 00:00:00 2001 From: Max Kellermann 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) {