diff --git a/src/output/Control.cxx b/src/output/Control.cxx
index efc7ea5c9..0bd1280b1 100644
--- a/src/output/Control.cxx
+++ b/src/output/Control.cxx
@@ -25,6 +25,7 @@
 #include "mixer/MixerControl.hxx"
 #include "notify.hxx"
 #include "filter/plugins/ReplayGainFilterPlugin.hxx"
+#include "config/Block.hxx"
 #include "Log.hxx"
 
 #include <stdexcept>
@@ -47,7 +48,9 @@ AudioOutputControl::AudioOutputControl(AudioOutput *_output)
 void
 AudioOutputControl::Configure(const ConfigBlock &block)
 {
-	(void)block;
+	tags = block.GetBlockValue("tags", true);
+	always_on = block.GetBlockValue("always_on", false);
+	enabled = block.GetBlockValue("enabled", true);
 }
 
 const char *
@@ -68,21 +71,15 @@ AudioOutputControl::GetMixer() const
 	return output->mixer;
 }
 
-bool
-AudioOutputControl::IsEnabled() const
-{
-	return output->IsEnabled();
-}
-
 bool
 AudioOutputControl::LockSetEnabled(bool new_value)
 {
 	const std::lock_guard<Mutex> protect(mutex);
 
-	if (new_value == output->enabled)
+	if (new_value == enabled)
 		return false;
 
-	output->enabled = new_value;
+	enabled = new_value;
 	return true;
 }
 
@@ -90,7 +87,7 @@ bool
 AudioOutputControl::LockToggleEnabled()
 {
 	const std::lock_guard<Mutex> protect(mutex);
-	return output->enabled = !output->enabled;
+	return enabled = !enabled;
 }
 
 bool
@@ -170,10 +167,10 @@ AudioOutputControl::DisableAsync()
 void
 AudioOutputControl::EnableDisableAsync()
 {
-	if (output->enabled == output->really_enabled)
+	if (enabled == output->really_enabled)
 		return;
 
-	if (output->enabled)
+	if (enabled)
 		EnableAsync();
 	else
 		DisableAsync();
@@ -188,7 +185,7 @@ AudioOutputControl::Open(const AudioFormat audio_format, const MusicPipe &mp)
 	fail_timer.Reset();
 
 	if (output->open && audio_format == request.audio_format) {
-		assert(request.pipe == &mp || (output->always_on && output->pause));
+		assert(request.pipe == &mp || (always_on && output->pause));
 
 		if (!output->pause)
 			/* already open, already the right parameters
@@ -240,7 +237,7 @@ AudioOutputControl::LockUpdate(const AudioFormat audio_format,
 {
 	const std::lock_guard<Mutex> protect(mutex);
 
-	if (output->enabled && output->really_enabled) {
+	if (enabled && output->really_enabled) {
 		if (force || !fail_timer.IsDefined() ||
 		    fail_timer.Check(REOPEN_AFTER * 1000)) {
 			return Open(audio_format, mp);
@@ -326,7 +323,7 @@ AudioOutputControl::LockAllowPlay()
 void
 AudioOutputControl::LockRelease()
 {
-	if (output->always_on)
+	if (always_on)
 		LockPauseAsync();
 	else
 		LockCloseWait();
diff --git a/src/output/Control.hxx b/src/output/Control.hxx
index bec311274..171a74f7b 100644
--- a/src/output/Control.hxx
+++ b/src/output/Control.hxx
@@ -119,6 +119,24 @@ class AudioOutputControl {
 		KILL
 	} command = Command::NONE;
 
+	/**
+	 * Will this output receive tags from the decoder?  The
+	 * default is true, but it may be configured to false to
+	 * suppress sending tags to the output.
+	 */
+	bool tags;
+
+	/**
+	 * Shall this output always play something (i.e. silence),
+	 * even when playback is stopped?
+	 */
+	bool always_on;
+
+	/**
+	 * Has the user enabled this device?
+	 */
+	bool enabled = true;
+
 	/**
 	 * When this flag is set, the output thread will not do any
 	 * playback.  It will wait until the flag is cleared.
@@ -172,8 +190,12 @@ public:
 	gcc_pure
 	Mixer *GetMixer() const;
 
-	gcc_pure
-	bool IsEnabled() const;
+	/**
+	 * Caller must lock the mutex.
+	 */
+	bool IsEnabled() const {
+		return enabled;
+	}
 
 	/**
 	 * @return true if the value has been modified
diff --git a/src/output/Init.cxx b/src/output/Init.cxx
index 2f1ad25ad..128a8b4c2 100644
--- a/src/output/Init.cxx
+++ b/src/output/Init.cxx
@@ -171,10 +171,6 @@ AudioOutput::Configure(const ConfigBlock &block)
 		config_audio_format.Clear();
 	}
 
-	tags = block.GetBlockValue("tags", true);
-	always_on = block.GetBlockValue("always_on", false);
-	enabled = block.GetBlockValue("enabled", true);
-
 	/* set up the filter chain */
 
 	prepared_filter = filter_chain_new();
diff --git a/src/output/Internal.hxx b/src/output/Internal.hxx
index 8af184acd..b9c50d721 100644
--- a/src/output/Internal.hxx
+++ b/src/output/Internal.hxx
@@ -54,24 +54,6 @@ struct AudioOutput {
 	 */
 	Mixer *mixer = nullptr;
 
-	/**
-	 * Will this output receive tags from the decoder?  The
-	 * default is true, but it may be configured to false to
-	 * suppress sending tags to the output.
-	 */
-	bool tags;
-
-	/**
-	 * Shall this output always play something (i.e. silence),
-	 * even when playback is stopped?
-	 */
-	bool always_on;
-
-	/**
-	 * Has the user enabled this device?
-	 */
-	bool enabled = true;
-
 	/**
 	 * Is this device actually enabled, i.e. the "enable" method
 	 * has succeeded?
@@ -188,13 +170,6 @@ public:
 		return name;
 	}
 
-	/**
-	 * Caller must lock the mutex.
-	 */
-	bool IsEnabled() const {
-		return enabled;
-	}
-
 	/**
 	 * Caller must lock the mutex.
 	 */
diff --git a/src/output/Thread.cxx b/src/output/Thread.cxx
index 13b9079ac..36624bfea 100644
--- a/src/output/Thread.cxx
+++ b/src/output/Thread.cxx
@@ -270,7 +270,7 @@ try {
 inline bool
 AudioOutputControl::PlayChunk()
 {
-	if (output->tags) {
+	if (tags) {
 		const auto *tag = output->source.ReadTag();
 		if (tag != nullptr) {
 			const ScopeUnlock unlock(mutex);