aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2014-09-24 20:54:20 +0200
committerMax Kellermann <max@duempel.org>2014-09-24 22:21:13 +0200
commit441f9cc2ee1e62be0d5869c247aecff78c2ca3c6 (patch)
treef3da3a635c38e2feaddde27d41fb80c4bab46ddd /src
parent9f4fc8ad33470d2f82faafb96d5db41967faa151 (diff)
downloadmpd-441f9cc2ee1e62be0d5869c247aecff78c2ca3c6.tar.gz
mpd-441f9cc2ee1e62be0d5869c247aecff78c2ca3c6.tar.xz
mpd-441f9cc2ee1e62be0d5869c247aecff78c2ca3c6.zip
tag/ReplayGain: add VorbisComment parser
Move code from the Vorbis and FLAC decoder plugins.
Diffstat (limited to 'src')
-rw-r--r--src/decoder/plugins/FlacMetadata.cxx34
-rw-r--r--src/decoder/plugins/VorbisComments.cxx19
-rw-r--r--src/tag/ReplayGain.cxx16
-rw-r--r--src/tag/ReplayGain.hxx3
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