diff options
Diffstat (limited to 'firmware/id3.c')
-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 a76cd2bc3e..6b43fecc9a 100644 --- a/firmware/id3.c +++ b/firmware/id3.c | |||
@@ -152,33 +152,31 @@ static int parseyearnum( struct mp3entry* entry, char* tag, int bufferpos ) | |||
152 | } | 152 | } |
153 | 153 | ||
154 | /* parse numeric genre from string, version 2.2 and 2.3 */ | 154 | /* parse numeric genre from string, version 2.2 and 2.3 */ |
155 | static int parseoldgenre( struct mp3entry* entry, char* tag, int bufferpos ) | 155 | static int parsegenre( struct mp3entry* entry, char* tag, int bufferpos ) |
156 | { | 156 | { |
157 | if( tag[0] == '(' && tag[1] != '(' ) { | 157 | if(entry->id3version >= ID3_VER_2_3) { |
158 | entry->genre = atoi( tag + 1 ); | 158 | /* In version 2.4 and up, there are no parentheses, and the genre frame |
159 | entry->genre_string = 0; | 159 | is a list of strings, either numbers or text. */ |
160 | return tag - entry->id3v2buf; | 160 | |
161 | } | 161 | /* Is it a number? */ |
162 | else { | 162 | if(isdigit(tag[0])) { |
163 | entry->genre = 0xFF; | 163 | entry->genre = atoi( tag ); |
164 | return bufferpos; | 164 | entry->genre_string = 0; |
165 | } | 165 | return tag - entry->id3v2buf; |
166 | } | 166 | } else { |
167 | 167 | entry->genre = 0xFF; | |
168 | /* parse numeric genre from string, version 2.4 and up */ | 168 | return bufferpos; |
169 | static int parsenewgenre( struct mp3entry* entry, char* tag, int bufferpos ) | 169 | } |
170 | { | ||
171 | /* In version 2.4 and up, there are no parentheses, and the genre frame | ||
172 | is a list of strings, either numbers or text. */ | ||
173 | |||
174 | /* Is it a number? */ | ||
175 | if(isdigit(tag[0])) { | ||
176 | entry->genre = atoi( tag ); | ||
177 | entry->genre_string = 0; | ||
178 | return tag - entry->id3v2buf; | ||
179 | } else { | 170 | } else { |
180 | entry->genre = 0xFF; | 171 | if( tag[0] == '(' && tag[1] != '(' ) { |
181 | return bufferpos; | 172 | entry->genre = atoi( tag + 1 ); |
173 | entry->genre_string = 0; | ||
174 | return tag - entry->id3v2buf; | ||
175 | } | ||
176 | else { | ||
177 | entry->genre = 0xFF; | ||
178 | return bufferpos; | ||
179 | } | ||
182 | } | 180 | } |
183 | } | 181 | } |
184 | 182 | ||
@@ -193,8 +191,8 @@ static struct tag_resolver taglist[] = { | |||
193 | { "TRCK", 4, offsetof(struct mp3entry, track_string), &parsetracknum }, | 191 | { "TRCK", 4, offsetof(struct mp3entry, track_string), &parsetracknum }, |
194 | { "TYER", 4, offsetof(struct mp3entry, year_string), &parseyearnum }, | 192 | { "TYER", 4, offsetof(struct mp3entry, year_string), &parseyearnum }, |
195 | { "TYE", 3, offsetof(struct mp3entry, year_string), &parseyearnum }, | 193 | { "TYE", 3, offsetof(struct mp3entry, year_string), &parseyearnum }, |
196 | { "TCON", 4, offsetof(struct mp3entry, genre_string), &parsenewgenre }, | 194 | { "TCON", 4, offsetof(struct mp3entry, genre_string), &parsegenre }, |
197 | { "TCO", 3, offsetof(struct mp3entry, genre_string), &parseoldgenre }, | 195 | { "TCO", 3, offsetof(struct mp3entry, genre_string), &parsegenre }, |
198 | { "TCOM", 4, offsetof(struct mp3entry, composer), NULL } | 196 | { "TCOM", 4, offsetof(struct mp3entry, composer), NULL } |
199 | }; | 197 | }; |
200 | 198 | ||
@@ -430,7 +428,7 @@ static void setid3v2title(int fd, struct mp3entry *entry) | |||
430 | * We must have at least minframesize bytes left for the | 428 | * We must have at least minframesize bytes left for the |
431 | * remaining frames to be interesting | 429 | * remaining frames to be interesting |
432 | */ | 430 | */ |
433 | while(size > minframesize ) { | 431 | while(size >= minframesize ) { |
434 | flags = 0; | 432 | flags = 0; |
435 | 433 | ||
436 | /* Read frame header and check length */ | 434 | /* Read frame header and check length */ |