Commit ba3a8474 authored by Max Kellermann's avatar Max Kellermann

flac: parse stream tags

Parse the vorbis comments in libflac's metadata_callback and pass them as tag struct to the decoder API.
parent 92db09fd
...@@ -15,6 +15,7 @@ ver 0.15 - (200?/??/??) ...@@ -15,6 +15,7 @@ ver 0.15 - (200?/??/??)
- sidplay: new decoder plugin for C64 SID (using libsidplay2) - sidplay: new decoder plugin for C64 SID (using libsidplay2)
- fluidsynth: new decoder plugin for MIDI files (using libfluidsynth) - fluidsynth: new decoder plugin for MIDI files (using libfluidsynth)
- wildmidi: another decoder plugin for MIDI files (using libwildmidi) - wildmidi: another decoder plugin for MIDI files (using libwildmidi)
- flac: parse stream tags
- added configuration option to disable decoder plugins - added configuration option to disable decoder plugins
* audio outputs: * audio outputs:
- added option to disable audio outputs by default - added option to disable audio outputs by default
......
...@@ -187,6 +187,10 @@ void flac_metadata_common_cb(const FLAC__StreamMetadata * block, ...@@ -187,6 +187,10 @@ void flac_metadata_common_cb(const FLAC__StreamMetadata * block,
break; break;
case FLAC__METADATA_TYPE_VORBIS_COMMENT: case FLAC__METADATA_TYPE_VORBIS_COMMENT:
flac_parse_replay_gain(block, data); flac_parse_replay_gain(block, data);
if (data->tag != NULL)
flac_vorbis_comments_to_tag(data->tag, block);
default: default:
break; break;
} }
......
...@@ -292,6 +292,7 @@ flac_decode_internal(struct decoder * decoder, ...@@ -292,6 +292,7 @@ flac_decode_internal(struct decoder * decoder,
{ {
flac_decoder *flac_dec; flac_decoder *flac_dec;
struct flac_data data; struct flac_data data;
enum decoder_command cmd;
const char *err = NULL; const char *err = NULL;
if (!(flac_dec = flac_new())) if (!(flac_dec = flac_new()))
...@@ -326,6 +327,8 @@ flac_decode_internal(struct decoder * decoder, ...@@ -326,6 +327,8 @@ flac_decode_internal(struct decoder * decoder,
} }
} }
data.tag = tag_new();
if (!flac_process_metadata(flac_dec)) { if (!flac_process_metadata(flac_dec)) {
err = "problem reading metadata"; err = "problem reading metadata";
goto fail; goto fail;
...@@ -343,9 +346,17 @@ flac_decode_internal(struct decoder * decoder, ...@@ -343,9 +346,17 @@ flac_decode_internal(struct decoder * decoder,
input_stream->seekable, data.total_time); input_stream->seekable, data.total_time);
while (true) { while (true) {
if (!tag_is_empty(data.tag)) {
cmd = decoder_tag(decoder, input_stream, data.tag);
tag_free(data.tag);
data.tag = tag_new();
} else
cmd = decoder_get_command(decoder);
if (!flac_process_single(flac_dec)) if (!flac_process_single(flac_dec))
break; break;
if (decoder_get_command(decoder) == DECODE_COMMAND_SEEK) {
if (cmd == DECODE_COMMAND_SEEK) {
FLAC__uint64 seek_sample = decoder_seek_where(decoder) * FLAC__uint64 seek_sample = decoder_seek_where(decoder) *
data.audio_format.sample_rate + 0.5; data.audio_format.sample_rate + 0.5;
if (flac_seek_absolute(flac_dec, seek_sample)) { if (flac_seek_absolute(flac_dec, seek_sample)) {
...@@ -358,7 +369,7 @@ flac_decode_internal(struct decoder * decoder, ...@@ -358,7 +369,7 @@ flac_decode_internal(struct decoder * decoder,
} else if (flac_get_state(flac_dec) == flac_decoder_eof) } else if (flac_get_state(flac_dec) == flac_decoder_eof)
break; break;
} }
if (decoder_get_command(decoder) != DECODE_COMMAND_STOP) { if (cmd != DECODE_COMMAND_STOP) {
flacPrintErroredState(flac_get_state(flac_dec)); flacPrintErroredState(flac_get_state(flac_dec));
flac_finish(flac_dec); flac_finish(flac_dec);
} }
...@@ -367,6 +378,8 @@ fail: ...@@ -367,6 +378,8 @@ fail:
if (data.replay_gain_info) if (data.replay_gain_info)
replay_gain_info_free(data.replay_gain_info); replay_gain_info_free(data.replay_gain_info);
tag_free(data.tag);
if (flac_dec) if (flac_dec)
flac_delete(flac_dec); flac_delete(flac_dec);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment