summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
Diffstat (limited to 'firmware')
-rw-r--r--firmware/id3.c54
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 */
155static int parseoldgenre( struct mp3entry* entry, char* tag, int bufferpos ) 155static 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;
169static 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 */