From 43ee3c3b366e6a8df088a5684431403f09138ffa Mon Sep 17 00:00:00 2001 From: Eric Wollesen 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