diff options
-rw-r--r-- | firmware/id3.c | 43 |
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) | |||
366 | static int | 366 | static int |
367 | getsonglength(int fd, struct mp3entry *entry) | 367 | getsonglength(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 | ||