From 441f9cc2ee1e62be0d5869c247aecff78c2ca3c6 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 24 Sep 2014 20:54:20 +0200 Subject: [PATCH] tag/ReplayGain: add VorbisComment parser Move code from the Vorbis and FLAC decoder plugins. --- src/decoder/plugins/FlacMetadata.cxx | 34 ++++++++------------------ src/decoder/plugins/VorbisComments.cxx | 19 ++------------ src/tag/ReplayGain.cxx | 16 ++++++++++++ src/tag/ReplayGain.hxx | 3 +++ 4 files changed, 31 insertions(+), 41 deletions(-) diff --git a/src/decoder/plugins/FlacMetadata.cxx b/src/decoder/plugins/FlacMetadata.cxx index a36d1b2e9..2c3c496a6 100644 --- a/src/decoder/plugins/FlacMetadata.cxx +++ b/src/decoder/plugins/FlacMetadata.cxx @@ -26,6 +26,7 @@ #include "tag/TagBuilder.hxx" #include "tag/Tag.hxx" #include "tag/VorbisComment.hxx" +#include "tag/ReplayGain.hxx" #include "ReplayGainInfo.hxx" #include "util/ASCII.hxx" #include "util/SplitString.hxx" @@ -52,37 +53,22 @@ vorbis_comment_value(const FLAC__StreamMetadata *block, return comment + name_length + 1; } -static bool -flac_find_float_comment(const FLAC__StreamMetadata *block, - const char *cmnt, float *fl) -{ - const char *value = vorbis_comment_value(block, cmnt); - if (value == nullptr) - return false; - - *fl = (float)atof(value); - return true; -} - bool flac_parse_replay_gain(ReplayGainInfo &rgi, const FLAC__StreamMetadata *block) { + const FLAC__StreamMetadata_VorbisComment &vc = + block->data.vorbis_comment; + rgi.Clear(); bool found = false; - if (flac_find_float_comment(block, "replaygain_album_gain", - &rgi.tuples[REPLAY_GAIN_ALBUM].gain)) - found = true; - if (flac_find_float_comment(block, "replaygain_album_peak", - &rgi.tuples[REPLAY_GAIN_ALBUM].peak)) - found = true; - if (flac_find_float_comment(block, "replaygain_track_gain", - &rgi.tuples[REPLAY_GAIN_TRACK].gain)) - found = true; - if (flac_find_float_comment(block, "replaygain_track_peak", - &rgi.tuples[REPLAY_GAIN_TRACK].peak)) - found = true; + + const auto *comments = vc.comments; + for (FLAC__uint32 i = 0, n = vc.num_comments; i < n; ++i) + if (ParseReplayGainVorbis(rgi, + (const char *)comments[i].entry)) + found = true; return found; } diff --git a/src/decoder/plugins/VorbisComments.cxx b/src/decoder/plugins/VorbisComments.cxx index f1dcdc1b0..062f46acf 100644 --- a/src/decoder/plugins/VorbisComments.cxx +++ b/src/decoder/plugins/VorbisComments.cxx @@ -24,6 +24,7 @@ #include "tag/TagHandler.hxx" #include "tag/TagBuilder.hxx" #include "tag/VorbisComment.hxx" +#include "tag/ReplayGain.hxx" #include "ReplayGainInfo.hxx" #include "util/ASCII.hxx" #include "util/SplitString.hxx" @@ -36,27 +37,11 @@ vorbis_comments_to_replay_gain(ReplayGainInfo &rgi, char **comments) { rgi.Clear(); - const char *temp; bool found = false; while (*comments) { - if ((temp = - vorbis_comment_value(*comments, "replaygain_track_gain"))) { - rgi.tuples[REPLAY_GAIN_TRACK].gain = atof(temp); + if (ParseReplayGainVorbis(rgi, *comments)) found = true; - } else if ((temp = vorbis_comment_value(*comments, - "replaygain_album_gain"))) { - rgi.tuples[REPLAY_GAIN_ALBUM].gain = atof(temp); - found = true; - } else if ((temp = vorbis_comment_value(*comments, - "replaygain_track_peak"))) { - rgi.tuples[REPLAY_GAIN_TRACK].peak = atof(temp); - found = true; - } else if ((temp = vorbis_comment_value(*comments, - "replaygain_album_peak"))) { - rgi.tuples[REPLAY_GAIN_ALBUM].peak = atof(temp); - found = true; - } comments++; } diff --git a/src/tag/ReplayGain.cxx b/src/tag/ReplayGain.cxx index d2347dba5..83a48f243 100644 --- a/src/tag/ReplayGain.cxx +++ b/src/tag/ReplayGain.cxx @@ -19,6 +19,7 @@ #include "config.h" #include "ReplayGain.hxx" +#include "VorbisComment.hxx" #include "ReplayGainInfo.hxx" #include "util/ASCII.hxx" @@ -68,3 +69,18 @@ ParseReplayGainTag(ReplayGainInfo &info, const char *name, const char *value) return ParseReplayGainTagTemplate(info, NameValue{name, value}); } + +bool +ParseReplayGainVorbis(ReplayGainInfo &info, const char *entry) +{ + struct VorbisCommentEntry { + const char *entry; + + gcc_pure + const char *operator[](const char *n) const { + return vorbis_comment_value(entry, n); + } + }; + + return ParseReplayGainTagTemplate(info, VorbisCommentEntry{entry}); +} diff --git a/src/tag/ReplayGain.hxx b/src/tag/ReplayGain.hxx index 2e6cf799e..2bf5e0db1 100644 --- a/src/tag/ReplayGain.hxx +++ b/src/tag/ReplayGain.hxx @@ -27,4 +27,7 @@ struct ReplayGainInfo; bool ParseReplayGainTag(ReplayGainInfo &info, const char *name, const char *value); +bool +ParseReplayGainVorbis(ReplayGainInfo &info, const char *entry); + #endif