summaryrefslogtreecommitdiff
path: root/firmware/id3.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/id3.c')
-rw-r--r--firmware/id3.c86
1 files changed, 47 insertions, 39 deletions
diff --git a/firmware/id3.c b/firmware/id3.c
index 743ff74902..62150e1ac8 100644
--- a/firmware/id3.c
+++ b/firmware/id3.c
@@ -383,7 +383,7 @@ static int getsonglength(int fd, struct mp3entry *entry)
383 unsigned int filetime = 0; 383 unsigned int filetime = 0;
384 unsigned long header=0; 384 unsigned long header=0;
385 unsigned char tmp; 385 unsigned char tmp;
386 unsigned char frame[64]; 386 unsigned char frame[156];
387 unsigned char* xing; 387 unsigned char* xing;
388 388
389 int version; 389 int version;
@@ -412,7 +412,7 @@ static int getsonglength(int fd, struct mp3entry *entry)
412 412
413 /* Loop trough file until we find a frame header */ 413 /* Loop trough file until we find a frame header */
414 bytecount = 0; 414 bytecount = 0;
415 restart: 415 restart:
416 do { 416 do {
417 header <<= 8; 417 header <<= 8;
418 if(!read(fd, &tmp, 1)) 418 if(!read(fd, &tmp, 1))
@@ -441,29 +441,29 @@ static int getsonglength(int fd, struct mp3entry *entry)
441#endif 441#endif
442 /* MPEG Audio Version */ 442 /* MPEG Audio Version */
443 switch((header & 0x180000) >> 19) { 443 switch((header & 0x180000) >> 19) {
444 case 2: 444 case 2:
445 version = 2; 445 version = 2;
446 break; 446 break;
447 case 3: 447 case 3:
448 version = 1; 448 version = 1;
449 break; 449 break;
450 default: 450 default:
451 goto restart; 451 goto restart;
452 } 452 }
453 453
454 /* Layer */ 454 /* Layer */
455 switch((header & 0x060000) >> 17) { 455 switch((header & 0x060000) >> 17) {
456 case 1: 456 case 1:
457 layer = 3; 457 layer = 3;
458 break; 458 break;
459 case 2: 459 case 2:
460 layer = 2; 460 layer = 2;
461 break; 461 break;
462 case 3: 462 case 3:
463 layer = 1; 463 layer = 1;
464 break; 464 break;
465 default: 465 default:
466 goto restart; 466 goto restart;
467 } 467 }
468 468
469 /* Bitrate */ 469 /* Bitrate */
@@ -488,24 +488,27 @@ static int getsonglength(int fd, struct mp3entry *entry)
488 488
489 /* Calculate bytes per frame, calculation depends on layer */ 489 /* Calculate bytes per frame, calculation depends on layer */
490 switch(layer) { 490 switch(layer) {
491 case 1: 491 case 1:
492 bpf = bitrate_table[version - 1][layer - 1][bitindex]; 492 bpf = bitrate_table[version - 1][layer - 1][bitindex];
493 bpf *= 48000; 493 bpf *= 48000;
494 bpf /= freqtab[version-1][freqindex] << (version - 1); 494 bpf /= freqtab[version-1][freqindex] << (version - 1);
495 break; 495 break;
496 case 2: 496 case 2:
497 case 3: 497 case 3:
498 bpf = bitrate_table[version - 1][layer - 1][bitindex]; 498 bpf = bitrate_table[version - 1][layer - 1][bitindex];
499 bpf *= 144000; 499 bpf *= 144000;
500 bpf /= freqtab[version-1][freqindex] << (version - 1); 500 bpf /= freqtab[version-1][freqindex] << (version - 1);
501 break; 501 break;
502 default: 502 default:
503 bpf = 1; 503 bpf = 1;
504 } 504 }
505 505
506 /* Calculate time per frame */ 506 /* Calculate time per frame */
507 tpf = bs[layer] / (freqtab[version-1][freqindex] << (version - 1)); 507 tpf = bs[layer] / (freqtab[version-1][freqindex] << (version - 1));
508 508
509 entry->bpf = bpf;
510 entry->tpf = tpf;
511
509 /* OK, we have found a frame. Let's see if it has a Xing header */ 512 /* OK, we have found a frame. Let's see if it has a Xing header */
510 if(read(fd, frame, sizeof frame) < 0) 513 if(read(fd, frame, sizeof frame) < 0)
511 return -1; 514 return -1;
@@ -535,21 +538,26 @@ static int getsonglength(int fd, struct mp3entry *entry)
535 /* Yes, it is a VBR file */ 538 /* Yes, it is a VBR file */
536 entry->vbr = true; 539 entry->vbr = true;
537 540
538 if (xing[7] & 0x01) /* Is the frame count there? */ 541 if (entry->vbrflags & VBR_FRAMES_FLAG) /* Is the frame count there? */
539 { 542 {
540 int framecount = (xing[8] << 24) | (xing[9] << 16) | 543 int framecount = (xing[8] << 24) | (xing[9] << 16) |
541 (xing[10] << 8) | xing[11]; 544 (xing[10] << 8) | xing[11];
542 545
543 filetime = framecount * tpf; 546 filetime = framecount * tpf;
544 } 547 }
545 if (xing[7] & 0x02) /* is byte count there? */ 548
549 if (entry->vbrflags & VBR_BYTES_FLAG) /* is byte count there? */
546 { 550 {
547 int bytecount = (xing[12] << 24) | (xing[13] << 16) | 551 int bytecount = (xing[12] << 24) | (xing[13] << 16) |
548 (xing[14] << 8) | xing[15]; 552 (xing[14] << 8) | xing[15];
549 553
550 bitrate = bytecount * 8 / filetime; 554 bitrate = bytecount * 8 / filetime;
551 } 555 }
552 /* We don't care about the TOC just yet. Maybe another time. */ 556
557 if (entry->vbrflags & VBR_TOC_FLAG) /* is table-of-contents there? */
558 {
559 memcpy( entry->toc, xing+16, 100 );
560 }
553 } 561 }
554 562
555 entry->bitrate = bitrate; 563 entry->bitrate = bitrate;