diff options
-rw-r--r-- | src/tag/ReplayGain.cxx | 38 |
1 files changed, 30 insertions, 8 deletions
diff --git a/src/tag/ReplayGain.cxx b/src/tag/ReplayGain.cxx index f2f52e59c..d2347dba5 100644 --- a/src/tag/ReplayGain.cxx +++ b/src/tag/ReplayGain.cxx @@ -25,24 +25,46 @@ #include <assert.h> #include <stdlib.h> -bool -ParseReplayGainTag(ReplayGainInfo &info, const char *name, const char *value) +template<typename T> +static bool +ParseReplayGainTagTemplate(ReplayGainInfo &info, const T t) { - assert(name != nullptr); - assert(value != nullptr); + const char *value; - if (StringEqualsCaseASCII(name, "replaygain_track_gain")) { + if ((value = t["replaygain_track_gain"]) != nullptr) { info.tuples[REPLAY_GAIN_TRACK].gain = atof(value); return true; - } else if (StringEqualsCaseASCII(name, "replaygain_album_gain")) { + } else if ((value = t["replaygain_album_gain"]) != nullptr) { info.tuples[REPLAY_GAIN_ALBUM].gain = atof(value); return true; - } else if (StringEqualsCaseASCII(name, "replaygain_track_peak")) { + } else if ((value = t["replaygain_track_peak"]) != nullptr) { info.tuples[REPLAY_GAIN_TRACK].peak = atof(value); return true; - } else if (StringEqualsCaseASCII(name, "replaygain_album_peak")) { + } else if ((value = t["replaygain_album_peak"]) != nullptr) { info.tuples[REPLAY_GAIN_ALBUM].peak = atof(value); return true; } else return false; + +} + +bool +ParseReplayGainTag(ReplayGainInfo &info, const char *name, const char *value) +{ + assert(name != nullptr); + assert(value != nullptr); + + struct NameValue { + const char *name; + const char *value; + + gcc_pure + const char *operator[](const char *n) const { + return StringEqualsCaseASCII(name, n) + ? value + : nullptr; + } + }; + + return ParseReplayGainTagTemplate(info, NameValue{name, value}); } |