diff options
| author | Linus Nielsen Feltzing <linus@haxx.se> | 2003-10-22 21:11:38 +0000 |
|---|---|---|
| committer | Linus Nielsen Feltzing <linus@haxx.se> | 2003-10-22 21:11:38 +0000 |
| commit | eee3720ebef4eb333e7df53c9706be9068ebcc0d (patch) | |
| tree | a63865c78f9828ae5fe67b0d2154c719c96c0454 | |
| parent | 5557fe3259b1e0c5fb6c7527456b6cbca9da9208 (diff) | |
| download | rockbox-eee3720ebef4eb333e7df53c9706be9068ebcc0d.zip rockbox-eee3720ebef4eb333e7df53c9706be9068ebcc0d.tar.gz rockbox-eee3720ebef4eb333e7df53c9706be9068ebcc0d.tar.bz2 rockbox-eee3720ebef4eb333e7df53c9706be9068ebcc0d.tar.xz | |
Genre parsing in id3v2.3 was still wrong. Also, the last frame in the tag could sometimes be ignored. This fixes the strange 1-digit track number bug.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@3984 a1c6a512-1295-4272-9138-f99709370657
| -rw-r--r-- | firmware/id3.c | 54 |
1 files changed, 26 insertions, 28 deletions
diff --git a/firmware/id3.c b/firmware/id3.c index a76cd2b..6b43fec 100644 --- a/firmware/id3.c +++ b/firmware/id3.c @@ -152,33 +152,31 @@ static int parseyearnum( struct mp3entry* entry, char* tag, int bufferpos ) } /* parse numeric genre from string, version 2.2 and 2.3 */ -static int parseoldgenre( struct mp3entry* entry, char* tag, int bufferpos ) +static int parsegenre( struct mp3entry* entry, char* tag, int bufferpos ) { - if( tag[0] == '(' && tag[1] != '(' ) { - entry->genre = atoi( tag + 1 ); - entry->genre_string = 0; - return tag - entry->id3v2buf; - } - else { - entry->genre = 0xFF; - return bufferpos; - } -} - -/* parse numeric genre from string, version 2.4 and up */ -static int parsenewgenre( struct mp3entry* entry, char* tag, int bufferpos ) -{ - /* In version 2.4 and up, there are no parentheses, and the genre frame - is a list of strings, either numbers or text. */ - - /* Is it a number? */ - if(isdigit(tag[0])) { - entry->genre = atoi( tag ); - entry->genre_string = 0; - return tag - entry->id3v2buf; + if(entry->id3version >= ID3_VER_2_3) { + /* In version 2.4 and up, there are no parentheses, and the genre frame + is a list of strings, either numbers or text. */ + + /* Is it a number? */ + if(isdigit(tag[0])) { + entry->genre = atoi( tag ); + entry->genre_string = 0; + return tag - entry->id3v2buf; + } else { + entry->genre = 0xFF; + return bufferpos; + } } else { - entry->genre = 0xFF; - return bufferpos; + if( tag[0] == '(' && tag[1] != '(' ) { + entry->genre = atoi( tag + 1 ); + entry->genre_string = 0; + return tag - entry->id3v2buf; + } + else { + entry->genre = 0xFF; + return bufferpos; + } } } @@ -193,8 +191,8 @@ static struct tag_resolver taglist[] = { { "TRCK", 4, offsetof(struct mp3entry, track_string), &parsetracknum }, { "TYER", 4, offsetof(struct mp3entry, year_string), &parseyearnum }, { "TYE", 3, offsetof(struct mp3entry, year_string), &parseyearnum }, - { "TCON", 4, offsetof(struct mp3entry, genre_string), &parsenewgenre }, - { "TCO", 3, offsetof(struct mp3entry, genre_string), &parseoldgenre }, + { "TCON", 4, offsetof(struct mp3entry, genre_string), &parsegenre }, + { "TCO", 3, offsetof(struct mp3entry, genre_string), &parsegenre }, { "TCOM", 4, offsetof(struct mp3entry, composer), NULL } }; @@ -430,7 +428,7 @@ static void setid3v2title(int fd, struct mp3entry *entry) * We must have at least minframesize bytes left for the * remaining frames to be interesting */ - while(size > minframesize ) { + while(size >= minframesize ) { flags = 0; /* Read frame header and check length */ |