summaryrefslogtreecommitdiff
path: root/firmware/mpeg.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/mpeg.c')
-rw-r--r--firmware/mpeg.c68
1 files changed, 58 insertions, 10 deletions
diff --git a/firmware/mpeg.c b/firmware/mpeg.c
index 296ef1440d..4a959b7c82 100644
--- a/firmware/mpeg.c
+++ b/firmware/mpeg.c
@@ -48,6 +48,8 @@ static void start_prerecording(void);
48static void start_recording(void); 48static void start_recording(void);
49static void stop_recording(void); 49static void stop_recording(void);
50static int get_unsaved_space(void); 50static int get_unsaved_space(void);
51static void pause_recording(void);
52static void resume_recording(void);
51#endif /* #ifdef HAVE_MAS3587F */ 53#endif /* #ifdef HAVE_MAS3587F */
52 54
53#ifndef SIMULATOR 55#ifndef SIMULATOR
@@ -68,6 +70,8 @@ static int get_unswapped_space(void);
68#define MPEG_INIT_RECORDING 10 70#define MPEG_INIT_RECORDING 10
69#define MPEG_INIT_PLAYBACK 11 71#define MPEG_INIT_PLAYBACK 11
70#define MPEG_NEW_FILE 12 72#define MPEG_NEW_FILE 12
73#define MPEG_PAUSE_RECORDING 13
74#define MPEG_RESUME_RECORDING 14
71#define MPEG_NEED_DATA 100 75#define MPEG_NEED_DATA 100
72#define MPEG_TRACK_CHANGE 101 76#define MPEG_TRACK_CHANGE 101
73#define MPEG_SAVE_DATA 102 77#define MPEG_SAVE_DATA 102
@@ -287,6 +291,8 @@ static bool is_recording; /* We are recording */
287static bool stop_pending; 291static bool stop_pending;
288unsigned long record_start_time; /* Value of current_tick when recording 292unsigned long record_start_time; /* Value of current_tick when recording
289 was started */ 293 was started */
294unsigned long pause_start_time; /* Value of current_tick when pause was
295 started */
290static bool saving; /* We are saving the buffer to disk */ 296static bool saving; /* We are saving the buffer to disk */
291static char recording_filename[MAX_PATH]; /* argument to thread */ 297static char recording_filename[MAX_PATH]; /* argument to thread */
292static char delayed_filename[MAX_PATH]; /* internal copy of above */ 298static char delayed_filename[MAX_PATH]; /* internal copy of above */
@@ -1653,6 +1659,12 @@ static void mpeg_thread(void)
1653 } 1659 }
1654 1660
1655 start_recording(); 1661 start_recording();
1662
1663 /* Wait until at least one frame is encoded and get the
1664 frame header, for later use by the Xing header
1665 generation */
1666 sleep(HZ/10);
1667 saved_header = get_last_recorded_header();
1656 1668
1657 /* delayed until buffer is saved, don't open yet */ 1669 /* delayed until buffer is saved, don't open yet */
1658 strcpy(delayed_filename, recording_filename); 1670 strcpy(delayed_filename, recording_filename);
@@ -1663,10 +1675,6 @@ static void mpeg_thread(void)
1663 case MPEG_STOP: 1675 case MPEG_STOP:
1664 DEBUGF("MPEG_STOP\n"); 1676 DEBUGF("MPEG_STOP\n");
1665 1677
1666 /* Store the last recorded header for later use by the
1667 Xing header generation */
1668 saved_header = get_last_recorded_header();
1669
1670 stop_recording(); 1678 stop_recording();
1671 1679
1672 /* Save the remaining data in the buffer */ 1680 /* Save the remaining data in the buffer */
@@ -1754,8 +1762,6 @@ static void mpeg_thread(void)
1754 if(startpos < 0) 1762 if(startpos < 0)
1755 startpos += mp3buflen; 1763 startpos += mp3buflen;
1756 1764
1757 saved_header = get_last_recorded_header();
1758
1759 rc = mem_find_next_frame(startpos, &offset, 1800, 1765 rc = mem_find_next_frame(startpos, &offset, 1800,
1760 saved_header); 1766 saved_header);
1761 if(rc) /* Header found? */ 1767 if(rc) /* Header found? */
@@ -1864,6 +1870,7 @@ static void mpeg_thread(void)
1864 1870
1865 DEBUGF("r: %x w: %x\n", mp3buf_read, mp3buf_write); 1871 DEBUGF("r: %x w: %x\n", mp3buf_read, mp3buf_write);
1866 DEBUGF("ats: %x\n", amount_to_save); 1872 DEBUGF("ats: %x\n", amount_to_save);
1873
1867 /* Save data only if the buffer is getting full, 1874 /* Save data only if the buffer is getting full,
1868 or if we should stop recording */ 1875 or if we should stop recording */
1869 if(amount_to_save) 1876 if(amount_to_save)
@@ -1938,7 +1945,15 @@ static void mpeg_thread(void)
1938 mp3_play_init(); 1945 mp3_play_init();
1939 init_playback_done = true; 1946 init_playback_done = true;
1940 break; 1947 break;
1941 1948
1949 case MPEG_PAUSE_RECORDING:
1950 pause_recording();
1951 break;
1952
1953 case MPEG_RESUME_RECORDING:
1954 resume_recording();
1955 break;
1956
1942 case SYS_USB_CONNECTED: 1957 case SYS_USB_CONNECTED:
1943 /* We can safely go to USB mode if no recording 1958 /* We can safely go to USB mode if no recording
1944 is taking place */ 1959 is taking place */
@@ -2136,6 +2151,16 @@ void mpeg_record(char *filename)
2136 queue_post(&mpeg_queue, MPEG_RECORD, NULL); 2151 queue_post(&mpeg_queue, MPEG_RECORD, NULL);
2137} 2152}
2138 2153
2154void mpeg_pause_recording(void)
2155{
2156 queue_post(&mpeg_queue, MPEG_PAUSE_RECORDING, NULL);
2157}
2158
2159void mpeg_resume_recording(void)
2160{
2161 queue_post(&mpeg_queue, MPEG_RESUME_RECORDING, NULL);
2162}
2163
2139static void start_prerecording(void) 2164static void start_prerecording(void)
2140{ 2165{
2141 unsigned long val; 2166 unsigned long val;
@@ -2199,13 +2224,16 @@ static void start_recording(void)
2199 is_recording = true; 2224 is_recording = true;
2200 stop_pending = false; 2225 stop_pending = false;
2201 saving = false; 2226 saving = false;
2227 paused = false;
2202 2228
2203 /* Store the current time */ 2229 /* Store the current time */
2204 if(prerecording) 2230 if(prerecording)
2205 record_start_time = current_tick - prerecord_count * HZ; 2231 record_start_time = current_tick - prerecord_count * HZ;
2206 else 2232 else
2207 record_start_time = current_tick; 2233 record_start_time = current_tick;
2208 2234
2235 pause_start_time = 0;
2236
2209 demand_irq_enable(true); 2237 demand_irq_enable(true);
2210} 2238}
2211 2239
@@ -2213,6 +2241,8 @@ static void pause_recording(void)
2213{ 2241{
2214 unsigned long val; 2242 unsigned long val;
2215 2243
2244 pause_start_time = current_tick;
2245
2216 /* Set the pause bit */ 2246 /* Set the pause bit */
2217 shadow_7f9 |= 2; 2247 shadow_7f9 |= 2;
2218 mas_writemem(MAS_BANK_D0, 0x7f9, &shadow_7f9, 1); 2248 mas_writemem(MAS_BANK_D0, 0x7f9, &shadow_7f9, 1);
@@ -2226,12 +2256,16 @@ static void pause_recording(void)
2226 { 2256 {
2227 mas_readmem(MAS_BANK_D0, 0x7f1, &val,1); 2257 mas_readmem(MAS_BANK_D0, 0x7f1, &val,1);
2228 } while(val & 1); 2258 } while(val & 1);
2259
2260 paused = true;
2229} 2261}
2230 2262
2231static void resume_recording(void) 2263static void resume_recording(void)
2232{ 2264{
2233 unsigned long val; 2265 unsigned long val;
2234 2266
2267 paused = false;
2268
2235 /* Clear the pause bit */ 2269 /* Clear the pause bit */
2236 shadow_7f9 &= ~2; 2270 shadow_7f9 &= ~2;
2237 mas_writemem(MAS_BANK_D0, 0x7f9, &shadow_7f9, 1); 2271 mas_writemem(MAS_BANK_D0, 0x7f9, &shadow_7f9, 1);
@@ -2245,6 +2279,14 @@ static void resume_recording(void)
2245 { 2279 {
2246 mas_readmem(MAS_BANK_D0, 0x7f1, &val,1); 2280 mas_readmem(MAS_BANK_D0, 0x7f1, &val,1);
2247 } while(val & 1); 2281 } while(val & 1);
2282
2283 /* Compensate for the time we have been paused */
2284 if(pause_start_time)
2285 {
2286 record_start_time =
2287 current_tick - (pause_start_time - record_start_time);
2288 pause_start_time = 0;
2289 }
2248} 2290}
2249 2291
2250static void stop_recording(void) 2292static void stop_recording(void)
@@ -2252,7 +2294,8 @@ static void stop_recording(void)
2252 unsigned long val; 2294 unsigned long val;
2253 2295
2254 /* Let it finish the last frame */ 2296 /* Let it finish the last frame */
2255 pause_recording(); 2297 if(!paused)
2298 pause_recording();
2256 sleep(HZ/5); 2299 sleep(HZ/5);
2257 2300
2258 demand_irq_enable(false); 2301 demand_irq_enable(false);
@@ -2372,7 +2415,12 @@ unsigned long mpeg_recorded_time(void)
2372 return prerecord_count * HZ; 2415 return prerecord_count * HZ;
2373 2416
2374 if(is_recording) 2417 if(is_recording)
2375 return current_tick - record_start_time; 2418 {
2419 if(paused)
2420 return pause_start_time - record_start_time;
2421 else
2422 return current_tick - record_start_time;
2423 }
2376 2424
2377 return 0; 2425 return 0;
2378} 2426}