summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--firmware/id3.c28
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] != '(')