aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2009-05-05 22:41:36 +0200
committerMax Kellermann <max@duempel.org>2009-05-05 22:41:36 +0200
commit9080797025d73eb32ce0c7041a0d365015b51f41 (patch)
treecb04458bb336a255468ab465844645eaf862c57b /src
parentebc1d3516c0334a093d8426e52402febb3dd6b00 (diff)
downloadmpd-9080797025d73eb32ce0c7041a0d365015b51f41.tar.gz
mpd-9080797025d73eb32ce0c7041a0d365015b51f41.tar.xz
mpd-9080797025d73eb32ce0c7041a0d365015b51f41.zip
httpd_output: disable Icy-Metadata when encoder supports tags
There's no reason to send both encoder tags and Icy-Metadata to the client. Let's disable Icy-Metadata when the encoder supports embedded tags.
Diffstat (limited to 'src')
-rw-r--r--src/output/httpd_client.c12
-rw-r--r--src/output/httpd_client.h2
-rw-r--r--src/output/httpd_output_plugin.c39
3 files changed, 35 insertions, 18 deletions
diff --git a/src/output/httpd_client.c b/src/output/httpd_client.c
index 1f1b6affe..52a398e3b 100644
--- a/src/output/httpd_client.c
+++ b/src/output/httpd_client.c
@@ -90,6 +90,12 @@ struct httpd_client {
/* ICY */
/**
+ * Do we support sending Icy-Metadata to the client? This is
+ * disabled if the httpd audio output uses encoder tags.
+ */
+ bool metadata_supported;
+
+ /**
* If we should sent icy metadata.
*/
bool metadata_requested;
@@ -210,7 +216,8 @@ httpd_client_handle_line(struct httpd_client *client, const char *line)
if (g_ascii_strncasecmp(line, "Icy-MetaData: 1", 15) == 0) {
/* Send icy metadata */
- client->metadata_requested = true;
+ client->metadata_requested =
+ client->metadata_supported;
return true;
}
@@ -417,7 +424,7 @@ httpd_client_in_event(G_GNUC_UNUSED GIOChannel *source, GIOCondition condition,
}
struct httpd_client *
-httpd_client_new(struct httpd_output *httpd, int fd)
+httpd_client_new(struct httpd_output *httpd, int fd, bool metadata_supported)
{
struct httpd_client *client = g_new(struct httpd_client, 1);
@@ -443,6 +450,7 @@ httpd_client_new(struct httpd_output *httpd, int fd)
client->input = fifo_buffer_new(4096);
client->state = REQUEST;
+ client->metadata_supported = metadata_supported;
client->metadata_requested = false;
client->metadata_sent = true;
client->metaint = 8192; /*TODO: just a std value */
diff --git a/src/output/httpd_client.h b/src/output/httpd_client.h
index 80ab6bc2e..4a2912f80 100644
--- a/src/output/httpd_client.h
+++ b/src/output/httpd_client.h
@@ -35,7 +35,7 @@ struct page;
* @param fd the socket file descriptor
*/
struct httpd_client *
-httpd_client_new(struct httpd_output *httpd, int fd);
+httpd_client_new(struct httpd_output *httpd, int fd, bool metadata_supported);
/**
* Frees memory and resources allocated by the #httpd_client object.
diff --git a/src/output/httpd_output_plugin.c b/src/output/httpd_output_plugin.c
index b9befb0d6..883dff773 100644
--- a/src/output/httpd_output_plugin.c
+++ b/src/output/httpd_output_plugin.c
@@ -118,7 +118,9 @@ httpd_output_finish(void *data)
static void
httpd_client_add(struct httpd_output *httpd, int fd)
{
- struct httpd_client *client = httpd_client_new(httpd, fd);
+ struct httpd_client *client =
+ httpd_client_new(httpd, fd,
+ httpd->encoder->plugin->tag == NULL);
httpd->clients = g_list_prepend(httpd->clients, client);
@@ -380,21 +382,28 @@ httpd_output_tag(void *data, const struct tag *tag)
assert(tag != NULL);
- if (httpd->metadata != NULL)
- page_unref (httpd->metadata);
-
- httpd->metadata = icy_server_metadata_page(tag, TAG_ITEM_ALBUM,
- TAG_ITEM_ARTIST,
- TAG_ITEM_TITLE,
- TAG_NUM_OF_ITEM_TYPES);
-
- if (httpd->metadata) {
- g_mutex_lock(httpd->mutex);
- g_list_foreach(httpd->clients, httpd_send_metadata, httpd->metadata);
- g_mutex_unlock(httpd->mutex);
+ if (httpd->encoder->plugin->tag != NULL) {
+ /* embed encoder tags */
+
+ encoder_tag(httpd->encoder, tag, NULL);
+ } else {
+ /* use Icy-Metadata */
+
+ if (httpd->metadata != NULL)
+ page_unref (httpd->metadata);
+
+ httpd->metadata =
+ icy_server_metadata_page(tag, TAG_ITEM_ALBUM,
+ TAG_ITEM_ARTIST,
+ TAG_ITEM_TITLE,
+ TAG_NUM_OF_ITEM_TYPES);
+ if (httpd->metadata != NULL) {
+ g_mutex_lock(httpd->mutex);
+ g_list_foreach(httpd->clients,
+ httpd_send_metadata, httpd->metadata);
+ g_mutex_unlock(httpd->mutex);
+ }
}
-
- encoder_tag(httpd->encoder, tag, NULL);
}
static void