summaryrefslogtreecommitdiff
path: root/firmware/id3.c
diff options
context:
space:
mode:
authorMagnus Holmgren <magnushol@gmail.com>2008-02-10 10:09:42 +0000
committerMagnus Holmgren <magnushol@gmail.com>2008-02-10 10:09:42 +0000
commitfdac6417c9be2a24ae8563c07c6c36b4b04be0ac (patch)
treebbb608e4af9a71b965934957ab2d6b8b8c390270 /firmware/id3.c
parent14995ffee31454d35f8a2449559db4742cd8a835 (diff)
downloadrockbox-fdac6417c9be2a24ae8563c07c6c36b4b04be0ac.zip
rockbox-fdac6417c9be2a24ae8563c07c6c36b4b04be0ac.tar.gz
rockbox-fdac6417c9be2a24ae8563c07c6c36b4b04be0ac.tar.bz2
rockbox-fdac6417c9be2a24ae8563c07c6c36b4b04be0ac.tar.xz
Improve handling of RVA2 (replaygain) frames.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@16262 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/id3.c')
-rw-r--r--firmware/id3.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/firmware/id3.c b/firmware/id3.c
index 1820078..f594528 100644
--- a/firmware/id3.c
+++ b/firmware/id3.c
@@ -423,7 +423,8 @@ static int parseuser( struct mp3entry* entry, char* tag, int bufferpos )
static int parserva2( struct mp3entry* entry, char* tag, int bufferpos )
{
int desc_len = strlen(tag);
- int end_pos = tag - entry->id3v2buf + desc_len + 5;
+ int start_pos = tag - entry->id3v2buf;
+ int end_pos = start_pos + desc_len + 5;
int value_len = 0;
unsigned char* value = tag + desc_len + 1;
@@ -471,14 +472,19 @@ static int parserva2( struct mp3entry* entry, char* tag, int bufferpos )
if (strcasecmp(tag, "album") == 0) {
album = true;
} else if (strcasecmp(tag, "track") != 0) {
- gain = 0;
+ /* Only accept non-track values if we don't have any previous
+ * value.
+ */
+ if (entry->track_gain != 0) {
+ return start_pos;
+ }
}
value_len = parse_replaygain_int(album, gain, peak * 2, entry,
- tag, sizeof(entry->id3v2buf) - (tag - entry->id3v2buf));
+ tag, sizeof(entry->id3v2buf) - start_pos);
}
- return tag - entry->id3v2buf + value_len;
+ return start_pos + value_len;
}
#endif