diff options
| author | Magnus Holmgren <magnushol@gmail.com> | 2008-02-10 10:09:42 +0000 |
|---|---|---|
| committer | Magnus Holmgren <magnushol@gmail.com> | 2008-02-10 10:09:42 +0000 |
| commit | fdac6417c9be2a24ae8563c07c6c36b4b04be0ac (patch) | |
| tree | bbb608e4af9a71b965934957ab2d6b8b8c390270 | |
| parent | 14995ffee31454d35f8a2449559db4742cd8a835 (diff) | |
| download | rockbox-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
| -rw-r--r-- | firmware/id3.c | 14 |
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 |