diff --git a/src/output/plugins/AlsaOutputPlugin.cxx b/src/output/plugins/AlsaOutputPlugin.cxx
index 2f51ef8d5..5eae7928f 100644
--- a/src/output/plugins/AlsaOutputPlugin.cxx
+++ b/src/output/plugins/AlsaOutputPlugin.cxx
@@ -233,28 +233,20 @@ private:
 	 * #EventLoop.  Before calling this, filling the ring buffer
 	 * has no effect; nothing will be played, and no code will be
 	 * run on #EventLoop's thread.
-	 */
-	void Activate() noexcept {
-		if (active)
-			return;
-
-		active = true;
-		defer_invalidate_sockets.Schedule();
-	}
-
-	/**
-	 * Wrapper for Activate() which unlocks our mutex.  Call this
-	 * if you're holding the mutex.
+	 *
+	 * Caller must hold the mutex.
 	 *
 	 * @return true if Activate() was called, false if the mutex
 	 * was never unlocked
 	 */
-	bool UnlockActivate() noexcept {
+	bool Activate() noexcept {
 		if (active)
 			return false;
 
+		active = true;
+
 		const ScopeUnlock unlock(mutex);
-		Activate();
+		defer_invalidate_sockets.Schedule();
 		return true;
 	}
 
@@ -767,7 +759,7 @@ AlsaOutput::Drain()
 
 	drain = true;
 
-	UnlockActivate();
+	Activate();
 
 	while (drain) {
 		if (error)
@@ -853,7 +845,7 @@ AlsaOutput::Play(const void *chunk, size_t size)
 		/* now that the ring_buffer is full, we can activate
 		   the socket handlers to trigger the first
 		   snd_pcm_writei() */
-		if (UnlockActivate())
+		if (Activate())
 			/* since everything may have changed while the
 			   mutex was unlocked, we need to skip the
 			   cond.wait() call below and check the new