From 9080797025d73eb32ce0c7041a0d365015b51f41 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Tue, 5 May 2009 22:41:36 +0200 Subject: 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. --- src/output/httpd_client.c | 12 ++++++++++-- src/output/httpd_client.h | 2 +- src/output/httpd_output_plugin.c | 39 ++++++++++++++++++++++++--------------- 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 @@ -89,6 +89,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. */ @@ -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 -- cgit v1.2.3