Index: apps/metadata.c =================================================================== RCS file: /cvsroot/rockbox/apps/metadata.c,v retrieving revision 1.27 diff -u -r1.27 metadata.c --- apps/metadata.c 10 Oct 2005 22:11:51 -0000 1.27 +++ apps/metadata.c 14 Oct 2005 15:05:10 -0000 @@ -400,11 +400,11 @@ /* Read the items in an APEV2 tag. Only looks for a tag at the end of a * file. Returns true if a tag was found and fully read, false otherwise. */ -static bool read_ape_tags(int fd, struct mp3entry* id3) +static bool read_ape_tags(int fd, struct mp3entry* id3, int offset) { struct apetag_header header; - if ((lseek(fd, -APETAG_HEADER_LENGTH, SEEK_END) < 0) + if ((lseek(fd, -APETAG_HEADER_LENGTH + offset, SEEK_END) < 0) || (read(fd, &header, APETAG_HEADER_LENGTH) != APETAG_HEADER_LENGTH) || (memcmp(header.id, "APETAGEX", sizeof(header.id)))) { @@ -423,7 +423,7 @@ unsigned int tag_remaining = header.length - APETAG_HEADER_LENGTH; int i; - if (lseek(fd, -header.length, SEEK_END) < 0) + if (lseek(fd, -header.length + offset, SEEK_END) < 0) { return false; } @@ -1273,6 +1273,12 @@ { return false; } + if (track->id3.id3version <= ID3_VER_1_1) + { + /* An id3v1 tag may hide an APEv2 tag... */ + /* use any apetag info we find */ + read_ape_tags(fd, &track->id3, -track->id3.id3v1len); + } break; @@ -1285,7 +1291,7 @@ break; case AFMT_MPC: - read_ape_tags(fd, &(track->id3)); + read_ape_tags(fd, &(track->id3), 0); break; case AFMT_OGG_VORBIS: if (!get_vorbis_metadata(fd, &(track->id3))) @@ -1347,7 +1353,7 @@ track->id3.bitrate = filesize (fd) / (track->id3.length / 8); } - read_ape_tags(fd, &track->id3); /* use any apetag info we find */ + read_ape_tags(fd, &track->id3, 0); /* use any apetag info we find */ break; case AFMT_A52: