decoder_api: automatically send stream tag

If an input stream provides tags (e.g. from an icecast server), send
them in the decoder_data() and decoder_tag() methods.  Removed the
according code from the mp3 and oggvorbis plugins - decoders shouldn't
have to care about stream tags.

This patch also adds the missing decoder_tag() invocation to the mp3
plugin.
This commit is contained in:
Max Kellermann
2008-11-03 18:24:01 +01:00
parent 8bb2da063f
commit ac96022c1d
5 changed files with 60 additions and 51 deletions

View File

@@ -942,19 +942,6 @@ mp3_synth_and_send(struct mp3_data *data, ReplayGainInfo *replay_gain_info)
return DECODE_COMMAND_STOP;
}
if (data->input_stream->meta_title) {
struct tag *tag = tag_new();
if (data->input_stream->meta_name) {
tag_add_item(tag, TAG_ITEM_NAME,
data->input_stream->meta_name);
}
tag_add_item(tag, TAG_ITEM_TITLE,
data->input_stream->meta_title);
free(data->input_stream->meta_title);
data->input_stream->meta_title = NULL;
tag_free(tag);
}
if (!data->decoded_first_frame) {
i = data->drop_start_samples;
data->decoded_first_frame = true;
@@ -1079,37 +1066,14 @@ mp3_decode(struct decoder *decoder, struct input_stream *input_stream)
mp3_audio_format(&data, &audio_format);
if (input_stream->meta_title) {
if (tag)
tag_free(tag);
tag = tag_new();
tag_add_item(tag, TAG_ITEM_TITLE, input_stream->meta_title);
free(input_stream->meta_title);
input_stream->meta_title = NULL;
if (input_stream->meta_name) {
tag_add_item(tag, TAG_ITEM_NAME,
input_stream->meta_name);
}
tag_free(tag);
} else if (tag) {
if (input_stream->meta_name) {
tag_clear_items_by_type(tag, TAG_ITEM_NAME);
tag_add_item(tag, TAG_ITEM_NAME,
input_stream->meta_name);
}
tag_free(tag);
} else if (input_stream->meta_name) {
tag = tag_new();
if (input_stream->meta_name) {
tag_add_item(tag, TAG_ITEM_NAME,
input_stream->meta_name);
}
tag_free(tag);
}
decoder_initialized(decoder, &audio_format,
data.input_stream->seekable, data.total_time);
if (tag != NULL) {
decoder_tag(decoder, input_stream, tag);
tag_free(tag);
}
while (mp3_read(&data, &replay_gain_info)) ;
if (replay_gain_info)