Index: apps/metadata.c
===================================================================
RCS file: /cvsroot/rockbox/apps/metadata.c,v
retrieving revision 1.40
diff -u -r1.40 metadata.c
--- apps/metadata.c	5 Mar 2006 17:23:34 -0000	1.40
+++ apps/metadata.c	5 Mar 2006 21:39:10 -0000
@@ -326,11 +326,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))))
     {
@@ -349,7 +349,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;
         }
@@ -1366,6 +1366,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;
 
@@ -1374,13 +1380,19 @@
         {
             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;
 
     case AFMT_MPC:
         if (!get_musepack_metadata(fd, &(track->id3)))
             return false;
-        read_ape_tags(fd, &(track->id3));
+        read_ape_tags(fd, &(track->id3), 0);
         break;
     
     case AFMT_OGG_VORBIS:
@@ -1443,7 +1455,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:
