shout: don't postpone metadata

Don't duplicate the tag received by the send_metadata() method - send
it to the shout server directly.
This commit is contained in:
Max Kellermann 2009-02-09 16:36:06 +01:00
parent f5c43889c3
commit 7fc25ad567
4 changed files with 15 additions and 34 deletions

1
NEWS
View File

@ -49,6 +49,7 @@ ver 0.14.2 (2009/??/??)
- shout: fixed memory leak in the mp3 encoder - shout: fixed memory leak in the mp3 encoder
- shout: switch to blocking mode - shout: switch to blocking mode
- shout: use libshout's synchronization - shout: use libshout's synchronization
- shout: don't postpone metadata
* mapper: remove trailing slashes from music_directory * mapper: remove trailing slashes from music_directory
* player: set player error when output device fails * player: set player error when output device fails

View File

@ -111,7 +111,7 @@ static int shout_mp3_encoder_send_metadata(struct shout_data *sd,
char artist[size]; char artist[size];
char title[size]; char title[size];
int i; int i;
struct tag *tag = sd->tag; const struct tag *tag = sd->tag;
strncpy(artist, "", size); strncpy(artist, "", size);
strncpy(title, "", size); strncpy(title, "", size);

View File

@ -55,7 +55,6 @@ static struct shout_data *new_shout_data(void)
ret->shout_conn = shout_new(); ret->shout_conn = shout_new();
ret->shout_meta = shout_metadata_new(); ret->shout_meta = shout_metadata_new();
ret->tag = NULL;
ret->bitrate = -1; ret->bitrate = -1;
ret->quality = -2.0; ret->quality = -2.0;
ret->timeout = DEFAULT_CONN_TIMEOUT; ret->timeout = DEFAULT_CONN_TIMEOUT;
@ -70,8 +69,6 @@ static void free_shout_data(struct shout_data *sd)
shout_metadata_free(sd->shout_meta); shout_metadata_free(sd->shout_meta);
if (sd->shout_conn) if (sd->shout_conn)
shout_free(sd->shout_conn); shout_free(sd->shout_conn);
if (sd->tag)
tag_free(sd->tag);
g_free(sd); g_free(sd);
} }
@ -384,33 +381,11 @@ my_shout_open_device(void *data,
return true; return true;
} }
static void send_metadata(struct shout_data * sd)
{
static const int size = 1024;
char song[size];
assert(sd->tag != NULL);
if (sd->encoder->send_metadata_func(sd, song, size)) {
shout_metadata_add(sd->shout_meta, "song", song);
if (SHOUTERR_SUCCESS != shout_set_metadata(sd->shout_conn,
sd->shout_meta)) {
g_warning("error setting shout metadata\n");
}
}
tag_free(sd->tag);
sd->tag = NULL;
}
static bool static bool
my_shout_play(void *data, const char *chunk, size_t size) my_shout_play(void *data, const char *chunk, size_t size)
{ {
struct shout_data *sd = (struct shout_data *)data; struct shout_data *sd = (struct shout_data *)data;
if (sd->tag != NULL)
send_metadata(sd);
if (sd->encoder->encode_func(sd, chunk, size)) if (sd->encoder->encode_func(sd, chunk, size))
return false; return false;
@ -432,15 +407,20 @@ static void my_shout_set_tag(void *data,
const struct tag *tag) const struct tag *tag)
{ {
struct shout_data *sd = (struct shout_data *)data; struct shout_data *sd = (struct shout_data *)data;
char song[1024];
bool ret;
if (sd->tag) sd->tag = tag;
tag_free(sd->tag); ret = sd->encoder->send_metadata_func(sd, song, sizeof(song));
sd->tag = NULL; if (ret) {
shout_metadata_add(sd->shout_meta, "song", song);
if (SHOUTERR_SUCCESS != shout_set_metadata(sd->shout_conn,
sd->shout_meta)) {
g_warning("error setting shout metadata\n");
}
}
if (!tag) write_page(sd);
return;
sd->tag = tag_dup(tag);
} }
const struct audio_output_plugin shoutPlugin = { const struct audio_output_plugin shoutPlugin = {

View File

@ -67,7 +67,7 @@ struct shout_data {
float quality; float quality;
int bitrate; int bitrate;
struct tag *tag; const struct tag *tag;
int timeout; int timeout;