diff --git a/src/output/Internal.hxx b/src/output/Internal.hxx
index 89a86c2c4..f4571b30f 100644
--- a/src/output/Internal.hxx
+++ b/src/output/Internal.hxx
@@ -413,6 +413,8 @@ private:
 
 	/**
 	 * Throws std::runtime_error on error.
+	 *
+	 * Mutex must not be locked.
 	 */
 	AudioFormat OpenFilter(AudioFormat &format);
 
diff --git a/src/output/OutputThread.cxx b/src/output/OutputThread.cxx
index 27a09f6c0..25676f239 100644
--- a/src/output/OutputThread.cxx
+++ b/src/output/OutputThread.cxx
@@ -148,6 +148,7 @@ AudioOutput::Open()
 
 	AudioFormat filter_audio_format;
 	try {
+		const ScopeUnlock unlock(mutex);
 		filter_audio_format = OpenFilter(in_audio_format);
 	} catch (const std::runtime_error &e) {
 		FormatError(e, "Failed to open filter for \"%s\" [%s]",
@@ -263,10 +264,9 @@ AudioOutput::CloseOutput(bool drain)
 void
 AudioOutput::ReopenFilter()
 {
-	{
-		const ScopeUnlock unlock(mutex);
-		CloseFilter();
-	}
+	const ScopeUnlock unlock(mutex);
+
+	CloseFilter();
 
 	try {
 		OpenFilter(in_audio_format);
@@ -276,6 +276,7 @@ AudioOutput::ReopenFilter()
 			    "Failed to open filter for \"%s\" [%s]",
 			    name, plugin.name);
 
+		const ScopeLock lock(mutex);
 		Close(false);
 	}
 }