diff options
Diffstat (limited to 'firmware/mp3data.c')
-rw-r--r-- | firmware/mp3data.c | 41 |
1 files changed, 35 insertions, 6 deletions
diff --git a/firmware/mp3data.c b/firmware/mp3data.c index 28f2cb27f3..98dff50442 100644 --- a/firmware/mp3data.c +++ b/firmware/mp3data.c | |||
@@ -35,7 +35,7 @@ | |||
35 | #include "mp3data.h" | 35 | #include "mp3data.h" |
36 | #include "file.h" | 36 | #include "file.h" |
37 | 37 | ||
38 | #undef DEBUG_VERBOSE | 38 | #define DEBUG_VERBOSE |
39 | 39 | ||
40 | #define BYTES2INT(b1,b2,b3,b4) (((b1 & 0xFF) << (3*8)) | \ | 40 | #define BYTES2INT(b1,b2,b3,b4) (((b1 & 0xFF) << (3*8)) | \ |
41 | ((b2 & 0xFF) << (2*8)) | \ | 41 | ((b2 & 0xFF) << (2*8)) | \ |
@@ -530,9 +530,10 @@ int get_mp3file_info(int fd, struct mp3info *info) | |||
530 | return bytecount; | 530 | return bytecount; |
531 | } | 531 | } |
532 | 532 | ||
533 | /* This is an MP3 header, 128kbit/s, 44.1kHz, with silence */ | 533 | /* This is an MP3 header, 128kbit/s, with silence |
534 | MPEG version and sample frequency are not set */ | ||
534 | static const unsigned char xing_frame_header[] = { | 535 | static const unsigned char xing_frame_header[] = { |
535 | 0xff, 0xfa, 0x90, 0x64, 0x86, 0x1f | 536 | 0xff, 0xe2, 0x90, 0x64, 0x86, 0x1f |
536 | }; | 537 | }; |
537 | 538 | ||
538 | static const char cooltext[] = "Rockbox rocks"; | 539 | static const char cooltext[] = "Rockbox rocks"; |
@@ -601,11 +602,15 @@ int count_mp3_frames(int fd, int startpos, int filesize, | |||
601 | } | 602 | } |
602 | } | 603 | } |
603 | 604 | ||
605 | /* Note: mpeg_version and sample_rate are 2-bit values, as specified by the | ||
606 | MPEG frame standard. See the tables above. */ | ||
604 | int create_xing_header(int fd, int startpos, int filesize, | 607 | int create_xing_header(int fd, int startpos, int filesize, |
605 | unsigned char *buf, int num_frames, | 608 | unsigned char *buf, int num_frames, |
609 | int mpeg_version, int sample_rate, | ||
606 | void (*progressfunc)(int), bool generate_toc) | 610 | void (*progressfunc)(int), bool generate_toc) |
607 | { | 611 | { |
608 | unsigned long header = 0; | 612 | unsigned long header = 0; |
613 | unsigned long saved_header; | ||
609 | struct mp3info info; | 614 | struct mp3info info; |
610 | int pos, last_pos; | 615 | int pos, last_pos; |
611 | int i, j; | 616 | int i, j; |
@@ -618,9 +623,9 @@ int create_xing_header(int fd, int startpos, int filesize, | |||
618 | DEBUGF("create_xing_header()\n"); | 623 | DEBUGF("create_xing_header()\n"); |
619 | 624 | ||
620 | /* Create the frame header */ | 625 | /* Create the frame header */ |
621 | memset(buf, 0, 417); | 626 | memset(buf, 0, 1500); |
622 | memcpy(buf, xing_frame_header, 6); | 627 | memcpy(buf, xing_frame_header, 6); |
623 | 628 | ||
624 | lseek(fd, startpos, SEEK_SET); | 629 | lseek(fd, startpos, SEEK_SET); |
625 | buf_init(); | 630 | buf_init(); |
626 | 631 | ||
@@ -664,6 +669,10 @@ int create_xing_header(int fd, int startpos, int filesize, | |||
664 | buf_seek(fd, info.frame_size-4); | 669 | buf_seek(fd, info.frame_size-4); |
665 | filepos += info.frame_size; | 670 | filepos += info.frame_size; |
666 | } | 671 | } |
672 | |||
673 | /* Save one header for later use */ | ||
674 | if(i == 1) | ||
675 | saved_header = header; | ||
667 | 676 | ||
668 | if(progressfunc) | 677 | if(progressfunc) |
669 | { | 678 | { |
@@ -684,6 +693,26 @@ int create_xing_header(int fd, int startpos, int filesize, | |||
684 | 693 | ||
685 | memcpy(buf + index + 100, cooltext, sizeof(cooltext)); | 694 | memcpy(buf + index + 100, cooltext, sizeof(cooltext)); |
686 | 695 | ||
696 | /* We must fill in the correct sample rate and mpeg version. If the TOC | ||
697 | should be generated, we take that data from the actual stream. If not, | ||
698 | we use the supplied parameters. */ | ||
699 | if(generate_toc) | ||
700 | { | ||
701 | saved_header &= (VERSION_MASK | SAMPLERATE_MASK); | ||
702 | |||
703 | buf[1] |= (saved_header >> 16) & 0xff; | ||
704 | buf[2] |= (saved_header >> 8) & 0xff; | ||
705 | } | ||
706 | else | ||
707 | { | ||
708 | buf[1] |= mpeg_version << 3; | ||
709 | buf[2] |= sample_rate << 2; | ||
710 | } | ||
711 | |||
712 | /* Now get the length of the newly created frame */ | ||
713 | header = BYTES2INT(buf[0], buf[1], buf[2], buf[3]); | ||
714 | mp3headerinfo(&info, header); | ||
715 | |||
687 | #ifdef DEBUG | 716 | #ifdef DEBUG |
688 | for(i = 0;i < 417;i++) | 717 | for(i = 0;i < 417;i++) |
689 | { | 718 | { |
@@ -694,5 +723,5 @@ int create_xing_header(int fd, int startpos, int filesize, | |||
694 | } | 723 | } |
695 | #endif | 724 | #endif |
696 | 725 | ||
697 | return 0; | 726 | return info.frame_size; |
698 | } | 727 | } |