tag/ReplayGain: add VorbisComment parser

Move code from the Vorbis and FLAC decoder plugins.
This commit is contained in:
Max Kellermann 2014-09-24 20:54:20 +02:00
parent 9f4fc8ad33
commit 441f9cc2ee
4 changed files with 31 additions and 41 deletions

View File

@ -26,6 +26,7 @@
#include "tag/TagBuilder.hxx" #include "tag/TagBuilder.hxx"
#include "tag/Tag.hxx" #include "tag/Tag.hxx"
#include "tag/VorbisComment.hxx" #include "tag/VorbisComment.hxx"
#include "tag/ReplayGain.hxx"
#include "ReplayGainInfo.hxx" #include "ReplayGainInfo.hxx"
#include "util/ASCII.hxx" #include "util/ASCII.hxx"
#include "util/SplitString.hxx" #include "util/SplitString.hxx"
@ -52,36 +53,21 @@ vorbis_comment_value(const FLAC__StreamMetadata *block,
return comment + name_length + 1; 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 bool
flac_parse_replay_gain(ReplayGainInfo &rgi, flac_parse_replay_gain(ReplayGainInfo &rgi,
const FLAC__StreamMetadata *block) const FLAC__StreamMetadata *block)
{ {
const FLAC__StreamMetadata_VorbisComment &vc =
block->data.vorbis_comment;
rgi.Clear(); rgi.Clear();
bool found = false; bool found = false;
if (flac_find_float_comment(block, "replaygain_album_gain",
&rgi.tuples[REPLAY_GAIN_ALBUM].gain)) const auto *comments = vc.comments;
found = true; for (FLAC__uint32 i = 0, n = vc.num_comments; i < n; ++i)
if (flac_find_float_comment(block, "replaygain_album_peak", if (ParseReplayGainVorbis(rgi,
&rgi.tuples[REPLAY_GAIN_ALBUM].peak)) (const char *)comments[i].entry))
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; found = true;
return found; return found;

View File

@ -24,6 +24,7 @@
#include "tag/TagHandler.hxx" #include "tag/TagHandler.hxx"
#include "tag/TagBuilder.hxx" #include "tag/TagBuilder.hxx"
#include "tag/VorbisComment.hxx" #include "tag/VorbisComment.hxx"
#include "tag/ReplayGain.hxx"
#include "ReplayGainInfo.hxx" #include "ReplayGainInfo.hxx"
#include "util/ASCII.hxx" #include "util/ASCII.hxx"
#include "util/SplitString.hxx" #include "util/SplitString.hxx"
@ -36,27 +37,11 @@ vorbis_comments_to_replay_gain(ReplayGainInfo &rgi, char **comments)
{ {
rgi.Clear(); rgi.Clear();
const char *temp;
bool found = false; bool found = false;
while (*comments) { while (*comments) {
if ((temp = if (ParseReplayGainVorbis(rgi, *comments))
vorbis_comment_value(*comments, "replaygain_track_gain"))) {
rgi.tuples[REPLAY_GAIN_TRACK].gain = atof(temp);
found = true; 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++; comments++;
} }

View File

@ -19,6 +19,7 @@
#include "config.h" #include "config.h"
#include "ReplayGain.hxx" #include "ReplayGain.hxx"
#include "VorbisComment.hxx"
#include "ReplayGainInfo.hxx" #include "ReplayGainInfo.hxx"
#include "util/ASCII.hxx" #include "util/ASCII.hxx"
@ -68,3 +69,18 @@ ParseReplayGainTag(ReplayGainInfo &info, const char *name, const char *value)
return ParseReplayGainTagTemplate(info, NameValue{name, 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});
}

View File

@ -27,4 +27,7 @@ struct ReplayGainInfo;
bool bool
ParseReplayGainTag(ReplayGainInfo &info, const char *name, const char *value); ParseReplayGainTag(ReplayGainInfo &info, const char *name, const char *value);
bool
ParseReplayGainVorbis(ReplayGainInfo &info, const char *entry);
#endif #endif