diff options
author | Björn Stenberg <bjorn@haxx.se> | 2002-08-14 19:23:34 +0000 |
---|---|---|
committer | Björn Stenberg <bjorn@haxx.se> | 2002-08-14 19:23:34 +0000 |
commit | 0570497e3a17563e193e172961ef963e6068df4e (patch) | |
tree | 2bfd3300b2e03fdf81c2dca2ee56b4666caafd80 /firmware/id3.c | |
parent | b42ac1dc4dc389de56fa299dc2c2bfcf2686c435 (diff) | |
download | rockbox-0570497e3a17563e193e172961ef963e6068df4e.tar.gz rockbox-0570497e3a17563e193e172961ef963e6068df4e.zip |
Added fast forward and rewind (without sound). Patch by Hardeep Sidhu.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@1741 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/id3.c')
-rw-r--r-- | firmware/id3.c | 86 |
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; |