diff options
Diffstat (limited to 'firmware/id3.c')
-rw-r--r-- | firmware/id3.c | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/firmware/id3.c b/firmware/id3.c index b9e72c66ac..ab638807c3 100644 --- a/firmware/id3.c +++ b/firmware/id3.c | |||
@@ -243,7 +243,9 @@ static void setid3v2title(int fd, struct mp3entry *entry) | |||
243 | return; | 243 | return; |
244 | } | 244 | } |
245 | entry->id3version = version; | 245 | entry->id3version = version; |
246 | 246 | entry->tracknum = entry->year = entry->genre = 0; | |
247 | entry->title = entry->artist = entry->album = NULL; | ||
248 | |||
247 | /* Skip the extended header if it is present */ | 249 | /* Skip the extended header if it is present */ |
248 | if(version >= ID3_VER_2_4) { | 250 | if(version >= ID3_VER_2_4) { |
249 | if(header[5] & 0x40) { | 251 | if(header[5] & 0x40) { |
@@ -334,8 +336,9 @@ static void setid3v2title(int fd, struct mp3entry *entry) | |||
334 | DEBUGF("id3v2 frame: %.4s\n", header); | 336 | DEBUGF("id3v2 frame: %.4s\n", header); |
335 | 337 | ||
336 | /* Check for certain frame headers */ | 338 | /* Check for certain frame headers */ |
337 | if(!strncmp(header, "TPE1", strlen("TPE1")) || | 339 | if (!entry->artist && |
338 | !strncmp(header, "TP1", strlen("TP1"))) { | 340 | (!strncmp(header, "TPE1", strlen("TPE1")) || |
341 | !strncmp(header, "TP1", strlen("TP1")))) { | ||
339 | bytesread = read(fd, buffer + bufferpos, framelen); | 342 | bytesread = read(fd, buffer + bufferpos, framelen); |
340 | entry->artist = buffer + bufferpos; | 343 | entry->artist = buffer + bufferpos; |
341 | unicode_munge(&entry->artist, &bytesread); | 344 | unicode_munge(&entry->artist, &bytesread); |
@@ -343,8 +346,9 @@ static void setid3v2title(int fd, struct mp3entry *entry) | |||
343 | bufferpos += bytesread + 2; | 346 | bufferpos += bytesread + 2; |
344 | size -= bytesread; | 347 | size -= bytesread; |
345 | } | 348 | } |
346 | else if(!strncmp(header, "TIT2", strlen("TIT2")) || | 349 | else if (!entry->artist && |
347 | !strncmp(header, "TT2", strlen("TT2"))) { | 350 | (!strncmp(header, "TIT2", strlen("TIT2")) || |
351 | !strncmp(header, "TT2", strlen("TT2")))) { | ||
348 | bytesread = read(fd, buffer + bufferpos, framelen); | 352 | bytesread = read(fd, buffer + bufferpos, framelen); |
349 | entry->title = buffer + bufferpos; | 353 | entry->title = buffer + bufferpos; |
350 | unicode_munge(&entry->title, &bytesread); | 354 | unicode_munge(&entry->title, &bytesread); |
@@ -352,7 +356,8 @@ static void setid3v2title(int fd, struct mp3entry *entry) | |||
352 | bufferpos += bytesread + 2; | 356 | bufferpos += bytesread + 2; |
353 | size -= bytesread; | 357 | size -= bytesread; |
354 | } | 358 | } |
355 | else if(!strncmp(header, "TALB", strlen("TALB"))) { | 359 | else if( !entry->album && |
360 | !strncmp(header, "TALB", strlen("TALB"))) { | ||
356 | bytesread = read(fd, buffer + bufferpos, framelen); | 361 | bytesread = read(fd, buffer + bufferpos, framelen); |
357 | entry->album = buffer + bufferpos; | 362 | entry->album = buffer + bufferpos; |
358 | unicode_munge(&entry->album, &bytesread); | 363 | unicode_munge(&entry->album, &bytesread); |
@@ -360,7 +365,8 @@ static void setid3v2title(int fd, struct mp3entry *entry) | |||
360 | bufferpos += bytesread + 2; | 365 | bufferpos += bytesread + 2; |
361 | size -= bytesread; | 366 | size -= bytesread; |
362 | } | 367 | } |
363 | else if(!strncmp(header, "TRCK", strlen("TRCK"))) { | 368 | else if (!entry->tracknum && |
369 | !strncmp(header, "TRCK", strlen("TRCK"))) { | ||
364 | bytesread = read(fd, buffer + bufferpos, framelen); | 370 | bytesread = read(fd, buffer + bufferpos, framelen); |
365 | tracknum = buffer + bufferpos; | 371 | tracknum = buffer + bufferpos; |
366 | unicode_munge(&tracknum, &bytesread); | 372 | unicode_munge(&tracknum, &bytesread); |
@@ -369,8 +375,9 @@ static void setid3v2title(int fd, struct mp3entry *entry) | |||
369 | bufferpos += bytesread + 1; | 375 | bufferpos += bytesread + 1; |
370 | size -= bytesread; | 376 | size -= bytesread; |
371 | } | 377 | } |
372 | else if(!strncmp(header, "TYER", 4) || | 378 | else if (!entry->year && |
373 | !strncmp(header, "TYR", 3)) { | 379 | (!strncmp(header, "TYER", 4) || |
380 | !strncmp(header, "TYR", 3))) { | ||
374 | char* ptr = buffer + bufferpos; | 381 | char* ptr = buffer + bufferpos; |
375 | bytesread = read(fd, ptr, framelen); | 382 | bytesread = read(fd, ptr, framelen); |
376 | unicode_munge(&ptr, &bytesread); | 383 | unicode_munge(&ptr, &bytesread); |
@@ -378,7 +385,8 @@ static void setid3v2title(int fd, struct mp3entry *entry) | |||
378 | bufferpos += bytesread + 1; | 385 | bufferpos += bytesread + 1; |
379 | size -= bytesread; | 386 | size -= bytesread; |
380 | } | 387 | } |
381 | else if(!strncmp(header, "TCON", 4)) { | 388 | else if (!entry->genre && |
389 | !strncmp(header, "TCON", 4)) { | ||
382 | char* ptr = buffer + bufferpos; | 390 | char* ptr = buffer + bufferpos; |
383 | bytesread = read(fd, ptr, framelen); | 391 | bytesread = read(fd, ptr, framelen); |
384 | if (ptr[1] == '(' && ptr[2] != '(') | 392 | if (ptr[1] == '(' && ptr[2] != '(') |