summaryrefslogtreecommitdiff
path: root/firmware/mpeg.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/mpeg.c')
-rw-r--r--firmware/mpeg.c44
1 files changed, 21 insertions, 23 deletions
diff --git a/firmware/mpeg.c b/firmware/mpeg.c
index 4b9ab73101..b49c3b35b5 100644
--- a/firmware/mpeg.c
+++ b/firmware/mpeg.c
@@ -1267,6 +1267,16 @@ static const unsigned char empty_id3_header[] =
1267 0x00, 0x00, 0x1f, 0x76 /* Size is 4096 minus 10 bytes for the header */ 1267 0x00, 0x00, 0x1f, 0x76 /* Size is 4096 minus 10 bytes for the header */
1268}; 1268};
1269 1269
1270static unsigned long get_last_recorded_header(void)
1271{
1272 unsigned long tmp[2];
1273
1274 /* Read the frame data from the MAS and reconstruct it with the
1275 frame sync and all */
1276 mas_readmem(MAS_BANK_D0, 0xfd1, tmp, 2);
1277 return 0xffe00000 | ((tmp[0] & 0x7c00) << 6) | (tmp[1] & 0xffff);
1278}
1279
1270static void mpeg_thread(void) 1280static void mpeg_thread(void)
1271{ 1281{
1272 static int pause_tick = 0; 1282 static int pause_tick = 0;
@@ -1282,7 +1292,7 @@ static void mpeg_thread(void)
1282 int amount_to_save; 1292 int amount_to_save;
1283 int writelen; 1293 int writelen;
1284 int framelen; 1294 int framelen;
1285 unsigned long saved_header; 1295 unsigned long saved_header = 0;
1286 int startpos; 1296 int startpos;
1287 int rc; 1297 int rc;
1288 int offset; 1298 int offset;
@@ -1899,6 +1909,11 @@ static void mpeg_thread(void)
1899 case MPEG_STOP: 1909 case MPEG_STOP:
1900 DEBUGF("MPEG_STOP\n"); 1910 DEBUGF("MPEG_STOP\n");
1901 demand_irq_enable(false); 1911 demand_irq_enable(false);
1912
1913 /* Store the last recorded header for later use by the
1914 Xing header generation */
1915 saved_header = get_last_recorded_header();
1916
1902 stop_recording(); 1917 stop_recording();
1903 1918
1904 /* Save the remaining data in the buffer */ 1919 /* Save the remaining data in the buffer */
@@ -1924,18 +1939,9 @@ static void mpeg_thread(void)
1924 reached 0x7ffff, we can no longer trust it */ 1939 reached 0x7ffff, we can no longer trust it */
1925 if(num_recorded_frames == 0x7ffff) 1940 if(num_recorded_frames == 0x7ffff)
1926 num_recorded_frames = 0; 1941 num_recorded_frames = 0;
1927 1942
1928 /* Read the first MP3 frame from the recorded stream */ 1943 /* saved_header is saved right before stopping
1929 lseek(mpeg_file, MPEG_RESERVED_HEADER_SPACE, SEEK_SET); 1944 the MAS */
1930 rc = read(mpeg_file, &saved_header, 4);
1931 if(rc <= 0)
1932 {
1933 close(mpeg_file);
1934 mpeg_file = -1;
1935 mpeg_stop_done = true;
1936 break;
1937 }
1938
1939 framelen = create_xing_header(mpeg_file, 0, 1945 framelen = create_xing_header(mpeg_file, 0,
1940 num_rec_bytes, mp3buf, 1946 num_rec_bytes, mp3buf,
1941 num_recorded_frames, 1947 num_recorded_frames,
@@ -1984,16 +1990,8 @@ static void mpeg_thread(void)
1984 startpos = mp3buf_write - 1800; 1990 startpos = mp3buf_write - 1800;
1985 if(startpos < 0) 1991 if(startpos < 0)
1986 startpos += mp3buflen; 1992 startpos += mp3buflen;
1987 1993
1988 { 1994 saved_header = get_last_recorded_header();
1989 unsigned long tmp[2];
1990 /* Find out how the mp3 header should look like */
1991 mas_readmem(MAS_BANK_D0, 0xfd1, tmp, 2);
1992 saved_header = 0xffe00000 |
1993 ((tmp[0] & 0x7c00) << 6) |
1994 (tmp[1] & 0xffff);
1995 DEBUGF("Header: %08x\n", saved_header);
1996 }
1997 1995
1998 rc = mem_find_next_frame(startpos, &offset, 1800, 1996 rc = mem_find_next_frame(startpos, &offset, 1800,
1999 saved_header); 1997 saved_header);