From 9cdbde4f5e421b7a1ca28d5268d5c31de9d6ad5d Mon Sep 17 00:00:00 2001
From: Max Kellermann <max@duempel.org>
Date: Tue, 25 Sep 2012 23:28:53 +0200
Subject: [PATCH] output: new option "tags" may be used to disable sending tags

Implements Mantis ticket 0003340.
---
 NEWS                  |  2 ++
 doc/user.xml          | 12 ++++++++++++
 src/output_init.c     |  1 +
 src/output_internal.h |  7 +++++++
 src/output_thread.c   |  2 +-
 5 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/NEWS b/NEWS
index ac243b870..ea52ac163 100644
--- a/NEWS
+++ b/NEWS
@@ -3,6 +3,8 @@ ver 0.18 (2012/??/??)
   - adplug: new decoder plugin using libadplug
   - opus: new decoder plugin for the Opus codec
   - vorbis: skip 16 bit quantisation, provide float samples
+* output:
+  - new option "tags" may be used to disable sending tags to output
 * improved decoder/output error reporting
 
 ver 0.17.2 (2012/??/??)
diff --git a/doc/user.xml b/doc/user.xml
index 65b7cb10f..c83c625a2 100644
--- a/doc/user.xml
+++ b/doc/user.xml
@@ -436,6 +436,18 @@ systemctl start mpd.socket</programlisting>
                 enabled.
               </entry>
             </row>
+            <row>
+              <entry>
+                <varname>tags</varname>
+                <parameter>yes|no</parameter>
+              </entry>
+              <entry>
+                If set to "no", then MPD will not send tags to this
+                output.  This is only useful for output plugins that
+                can receive tags, for example the
+                <varname>httpd</varname> output plugin.
+              </entry>
+            </row>
             <row>
               <entry>
                 <varname>always_on</varname>
diff --git a/src/output_init.c b/src/output_init.c
index c3b808e94..a6d191920 100644
--- a/src/output_init.c
+++ b/src/output_init.c
@@ -165,6 +165,7 @@ ao_base_init(struct audio_output *ao,
 	}
 
 	ao->plugin = plugin;
+	ao->tags = config_get_block_bool(param, "tags", true);
 	ao->always_on = config_get_block_bool(param, "always_on", false);
 	ao->enabled = config_get_block_bool(param, "enabled", true);
 	ao->really_enabled = false;
diff --git a/src/output_internal.h b/src/output_internal.h
index 9d975d789..1a3e8aa1f 100644
--- a/src/output_internal.h
+++ b/src/output_internal.h
@@ -72,6 +72,13 @@ struct audio_output {
 	 */
 	struct mixer *mixer;
 
+	/**
+	 * 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?
diff --git a/src/output_thread.c b/src/output_thread.c
index ee9c8a6e5..cd1a8a878 100644
--- a/src/output_thread.c
+++ b/src/output_thread.c
@@ -435,7 +435,7 @@ ao_play_chunk(struct audio_output *ao, const struct music_chunk *chunk)
 	assert(ao != NULL);
 	assert(ao->filter != NULL);
 
-	if (gcc_unlikely(chunk->tag != NULL)) {
+	if (ao->tags && gcc_unlikely(chunk->tag != NULL)) {
 		g_mutex_unlock(ao->mutex);
 		ao_plugin_send_tag(ao, chunk->tag);
 		g_mutex_lock(ao->mutex);