diff options
author | Linus Nielsen Feltzing <linus@haxx.se> | 2004-06-03 12:10:40 +0000 |
---|---|---|
committer | Linus Nielsen Feltzing <linus@haxx.se> | 2004-06-03 12:10:40 +0000 |
commit | f487ebe376a8d6e8c9609d292aca018f781b2a56 (patch) | |
tree | db214b75df5656a89fb72688cbdc8ec7c2a07c64 /firmware/mpeg.c | |
parent | 748b3899e6d8676d3b12f95769c50bb7e441cb00 (diff) | |
download | rockbox-f487ebe376a8d6e8c9609d292aca018f781b2a56.tar.gz rockbox-f487ebe376a8d6e8c9609d292aca018f781b2a56.zip |
The Play button now acts as a Pause button during recording instead of opening a new file. The new-file feature is moved to the F3 button.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@4715 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/mpeg.c')
-rw-r--r-- | firmware/mpeg.c | 68 |
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); | |||
48 | static void start_recording(void); | 48 | static void start_recording(void); |
49 | static void stop_recording(void); | 49 | static void stop_recording(void); |
50 | static int get_unsaved_space(void); | 50 | static int get_unsaved_space(void); |
51 | static void pause_recording(void); | ||
52 | static 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 */ | |||
287 | static bool stop_pending; | 291 | static bool stop_pending; |
288 | unsigned long record_start_time; /* Value of current_tick when recording | 292 | unsigned long record_start_time; /* Value of current_tick when recording |
289 | was started */ | 293 | was started */ |
294 | unsigned long pause_start_time; /* Value of current_tick when pause was | ||
295 | started */ | ||
290 | static bool saving; /* We are saving the buffer to disk */ | 296 | static bool saving; /* We are saving the buffer to disk */ |
291 | static char recording_filename[MAX_PATH]; /* argument to thread */ | 297 | static char recording_filename[MAX_PATH]; /* argument to thread */ |
292 | static char delayed_filename[MAX_PATH]; /* internal copy of above */ | 298 | static 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 | ||
2154 | void mpeg_pause_recording(void) | ||
2155 | { | ||
2156 | queue_post(&mpeg_queue, MPEG_PAUSE_RECORDING, NULL); | ||
2157 | } | ||
2158 | |||
2159 | void mpeg_resume_recording(void) | ||
2160 | { | ||
2161 | queue_post(&mpeg_queue, MPEG_RESUME_RECORDING, NULL); | ||
2162 | } | ||
2163 | |||
2139 | static void start_prerecording(void) | 2164 | static 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 | ||
2231 | static void resume_recording(void) | 2263 | static 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 | ||
2250 | static void stop_recording(void) | 2292 | static 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 | } |