diff --git a/src/output/OutputThread.cxx b/src/output/OutputThread.cxx
index 499cb9583..af31e5f9f 100644
--- a/src/output/OutputThread.cxx
+++ b/src/output/OutputThread.cxx
@@ -35,6 +35,7 @@
 #include "thread/Slack.hxx"
 #include "thread/Name.hxx"
 #include "util/ConstBuffer.hxx"
+#include "util/ScopeExit.hxx"
 #include "Log.hxx"
 #include "Compiler.h"
 
@@ -487,6 +488,11 @@ AudioOutput::Play()
 	assert(!in_playback_loop);
 	in_playback_loop = true;
 
+	AtScopeExit(this) {
+		assert(in_playback_loop);
+		in_playback_loop = false;
+	};
+
 	while (chunk != nullptr && command == Command::NONE) {
 		if (!PlayChunk(chunk))
 			break;
@@ -495,9 +501,6 @@ AudioOutput::Play()
 		chunk = pipe.Get();
 	}
 
-	assert(in_playback_loop);
-	in_playback_loop = false;
-
 	const ScopeUnlock unlock(mutex);
 	player_control->LockSignal();