From 43ee3c3b366e6a8df088a5684431403f09138ffa Mon Sep 17 00:00:00 2001
From: Eric Wollesen <encoded@xmtp.net>
Date: Fri, 12 Sep 2008 16:00:01 +0200
Subject: shout: send shout metadata

Support sending metadata to a shout server using shout_metadata_new()
and shout_metadata_add().  The Ogg Vorbis encoder does not support
this currently.

[mk: this patch was separated from Eric's patch "Refactor and cleanup
of shout Ogg and MP3 audio outputs", I added a description]
---
 src/audioOutputs/audioOutput_shout.c     | 16 +++++++++++++---
 src/audioOutputs/audioOutput_shout.h     |  4 +++-
 src/audioOutputs/audioOutput_shout_ogg.c |  4 +++-
 3 files changed, 19 insertions(+), 5 deletions(-)

diff --git a/src/audioOutputs/audioOutput_shout.c b/src/audioOutputs/audioOutput_shout.c
index 7c11cb7e2..5bd2b575c 100644
--- a/src/audioOutputs/audioOutput_shout.c
+++ b/src/audioOutputs/audioOutput_shout.c
@@ -40,6 +40,7 @@ static struct shout_data *new_shout_data(void)
 	struct shout_data *ret = xmalloc(sizeof(*ret));
 
 	ret->shout_conn = shout_new();
+	ret->shout_meta = shout_metadata_new();
 	ret->opened = 0;
 	ret->tag = NULL;
 	ret->tag_to_send = 0;
@@ -59,6 +60,8 @@ static struct shout_data *new_shout_data(void)
 
 static void free_shout_data(struct shout_data *sd)
 {
+	if (sd->shout_meta)
+		shout_metadata_free(sd->shout_meta);
 	if (sd->shout_conn)
 		shout_free(sd->shout_conn);
 	if (sd->tag)
@@ -427,12 +430,19 @@ static int my_shout_open_device(struct audio_output *audio_output)
 
 static void send_metadata(struct shout_data * sd)
 {
+	static const int size = 1024;
+	char song[size];
+
 	if (!sd->opened || !sd->tag)
 		return;
 
-	if (shout_ogg_encoder_send_metadata(sd)) {
-		close_shout_conn(sd);
-		return;
+	if (shout_ogg_encoder_send_metadata(sd, song, size)) {
+		shout_metadata_add(sd->shout_meta, "song", song);
+		if (SHOUTERR_SUCCESS != shout_set_metadata(sd->shout_conn,
+							   sd->shout_meta)) {
+			ERROR("error setting shout metadata\n");
+			return;
+		}
 	}
 
 	sd->tag_to_send = 0;
diff --git a/src/audioOutputs/audioOutput_shout.h b/src/audioOutputs/audioOutput_shout.h
index 295a7e14f..eee2ccad2 100644
--- a/src/audioOutputs/audioOutput_shout.h
+++ b/src/audioOutputs/audioOutput_shout.h
@@ -51,6 +51,7 @@ typedef struct _ogg_vorbis_data {
 
 struct shout_data {
 	shout_t *shout_conn;
+	shout_metadata_t *shout_meta;
 	int shout_error;
 
 	ogg_vorbis_data od;
@@ -83,7 +84,8 @@ int shout_ogg_encoder_clear_encoder(struct shout_data *sd);
 
 int init_encoder(struct shout_data *sd);
 
-int shout_ogg_encoder_send_metadata(struct shout_data * sd);
+int shout_ogg_encoder_send_metadata(struct shout_data * sd,
+				    char *song, size_t size);
 
 void shout_ogg_encoder_encode(struct shout_data *sd,
 			      const char *chunk, size_t len);
diff --git a/src/audioOutputs/audioOutput_shout_ogg.c b/src/audioOutputs/audioOutput_shout_ogg.c
index c5b08a8c8..d0d1b6880 100644
--- a/src/audioOutputs/audioOutput_shout_ogg.c
+++ b/src/audioOutputs/audioOutput_shout_ogg.c
@@ -186,7 +186,9 @@ int init_encoder(struct shout_data *sd)
 	return 0;
 }
 
-int shout_ogg_encoder_send_metadata(struct shout_data * sd)
+int shout_ogg_encoder_send_metadata(struct shout_data * sd,
+				    mpd_unused char * song,
+				    mpd_unused size_t size)
 {
 	ogg_vorbis_data *od = &sd->od;
 
-- 
cgit v1.2.3