diff --git a/src/MusicBuffer.hxx b/src/MusicBuffer.hxx
index 0ad6f49c0..10a6b906d 100644
--- a/src/MusicBuffer.hxx
+++ b/src/MusicBuffer.hxx
@@ -29,7 +29,7 @@
  */
 class MusicBuffer {
 	/** a mutex which protects #buffer */
-	Mutex mutex;
+	mutable Mutex mutex;
 
 	SliceBuffer<MusicChunk> buffer;
 
@@ -53,6 +53,11 @@ public:
 	}
 #endif
 
+	bool IsFull() const noexcept {
+		const std::lock_guard<Mutex> protect(mutex);
+		return buffer.IsFull();
+	}
+
 	/**
 	 * Returns the total number of reserved chunks in this buffer.  This
 	 * is the same value which was passed to the constructor
diff --git a/src/player/Thread.cxx b/src/player/Thread.cxx
index 14f8aa08e..008b03c11 100644
--- a/src/player/Thread.cxx
+++ b/src/player/Thread.cxx
@@ -944,7 +944,7 @@ Player::Run() noexcept
 			   prevent stuttering on slow machines */
 
 			if (pipe->GetSize() < pc.buffered_before_play &&
-			    !dc.IsIdle()) {
+			    !dc.IsIdle() && !buffer.IsFull()) {
 				/* not enough decoded buffer space yet */
 
 				dc.WaitForDecoder();