summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--firmware/id3.c43
1 files changed, 37 insertions, 6 deletions
diff --git a/firmware/id3.c b/firmware/id3.c
index c913404ae3..4a40ff89d9 100644
--- a/firmware/id3.c
+++ b/firmware/id3.c
@@ -366,8 +366,12 @@ getid3v1len(int fd)
366static int 366static int
367getsonglength(int fd, struct mp3entry *entry) 367getsonglength(int fd, struct mp3entry *entry)
368{ 368{
369 unsigned int filetime = 0;
369 unsigned long header=0; 370 unsigned long header=0;
370 unsigned char tmp; 371 unsigned char tmp;
372 unsigned char frame[200];
373 unsigned int framecount;
374
371 int version; 375 int version;
372 int layer; 376 int layer;
373 int bitindex; 377 int bitindex;
@@ -402,7 +406,7 @@ getsonglength(int fd, struct mp3entry *entry)
402 /* 406 /*
403 * Some files are filled with garbage in the beginning, 407 * Some files are filled with garbage in the beginning,
404 * if the bitrate index of the header is binary 1111 408 * if the bitrate index of the header is binary 1111
405 * that is a good is a good indicator 409 * that is a good indicator
406 */ 410 */
407 if((header & 0xF000) == 0xF000) 411 if((header & 0xF000) == 0xF000)
408 goto restart; 412 goto restart;
@@ -481,12 +485,39 @@ getsonglength(int fd, struct mp3entry *entry)
481 485
482 /* Calculate time per frame */ 486 /* Calculate time per frame */
483 tpf = bs[layer] / freqtab[version-1][freqindex] << (version - 1); 487 tpf = bs[layer] / freqtab[version-1][freqindex] << (version - 1);
488
489 /* OK, we have found a frame. Let's see if it has a Xing header */
490 if(read(fd, frame, 200) < 0)
491 return -1;
484 492
485 /* 493 if(frame[32] == 'X' &&
486 * Now song length is 494 frame[33] == 'i' &&
487 * ((filesize)/(bytes per frame))*(time per frame) 495 frame[34] == 'n' &&
488 */ 496 frame[35] == 'g')
489 return entry->filesize/bpf*tpf; 497 {
498 if(frame[39] & 0x01) /* Is the frame count there? */
499 {
500 framecount = (frame[40] << 24) | (frame[41] << 16) |
501 (frame[42] << 8) | frame[43];
502
503 filetime = framecount * tpf;
504 }
505 /* We don't care about the file size and the TOC just yet. Maybe
506 another time. */
507 }
508
509 /* If the file time hasn't been established, this may be a fixed
510 rate MP3, so just use the default formula */
511 if(filetime == 0)
512 {
513 /*
514 * Now song length is
515 * ((filesize)/(bytes per frame))*(time per frame)
516 */
517 filetime = entry->filesize/bpf*tpf;
518 }
519
520 return filetime;
490} 521}
491 522
492 523