summaryrefslogtreecommitdiff
path: root/firmware/mp3data.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/mp3data.c')
-rw-r--r--firmware/mp3data.c41
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 */
534static const unsigned char xing_frame_header[] = { 535static const unsigned char xing_frame_header[] = {
535 0xff, 0xfa, 0x90, 0x64, 0x86, 0x1f 536 0xff, 0xe2, 0x90, 0x64, 0x86, 0x1f
536}; 537};
537 538
538static const char cooltext[] = "Rockbox rocks"; 539static 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. */
604int create_xing_header(int fd, int startpos, int filesize, 607int 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}