tag/ReplayGain: add VorbisComment parser
Move code from the Vorbis and FLAC decoder plugins.
This commit is contained in:
parent
9f4fc8ad33
commit
441f9cc2ee
|
@ -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,37 +53,22 @@ 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;
|
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;
|
|
||||||
|
|
||||||
return found;
|
return found;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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++;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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});
|
||||||
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue