diff options
-rw-r--r-- | apps/settings.c | 13 | ||||
-rw-r--r-- | apps/settings.h | 17 | ||||
-rw-r--r-- | apps/settings_menu.c | 12 | ||||
-rw-r--r-- | apps/wps.c | 120 |
4 files changed, 79 insertions, 83 deletions
diff --git a/apps/settings.c b/apps/settings.c index 6ca733cf37..fa9ba38106 100644 --- a/apps/settings.c +++ b/apps/settings.c | |||
@@ -68,7 +68,7 @@ offset abs | |||
68 | 0x0d 0x21 <resume settings byte> | 68 | 0x0d 0x21 <resume settings byte> |
69 | 0x0e 0x22 <shuffle,mp3filter,sort_case,discharge,statusbar,show_hidden> | 69 | 0x0e 0x22 <shuffle,mp3filter,sort_case,discharge,statusbar,show_hidden> |
70 | 0x0f 0x23 <scroll speed> | 70 | 0x0f 0x23 <scroll speed> |
71 | 0x10 0x24 <ff/rewind accleration rate> | 71 | 0x10 0x24 <ff/rewind min step, acceleration rate> |
72 | 0x11 0x25 <AVC byte> | 72 | 0x11 0x25 <AVC byte> |
73 | 0x12 0x26 <(int) Resume playlist index, or -1 if no playlist resume> | 73 | 0x12 0x26 <(int) Resume playlist index, or -1 if no playlist resume> |
74 | 0x16 0x2a <(int) Byte offset into resume file> | 74 | 0x16 0x2a <(int) Byte offset into resume file> |
@@ -269,7 +269,9 @@ int settings_save( void ) | |||
269 | 269 | ||
270 | config_block[0xf] = (unsigned char)(global_settings.scroll_speed << 3); | 270 | config_block[0xf] = (unsigned char)(global_settings.scroll_speed << 3); |
271 | 271 | ||
272 | config_block[0x10] = (unsigned char)global_settings.ff_rewind_accel; | 272 | config_block[0x10] = (unsigned char) |
273 | ((global_settings.ff_rewind_min_step & 15) << 4 | | ||
274 | (global_settings.ff_rewind_accel & 15)); | ||
273 | config_block[0x11] = (unsigned char)global_settings.avc; | 275 | config_block[0x11] = (unsigned char)global_settings.avc; |
274 | config_block[0x1a] = (unsigned char)global_settings.disk_spindown; | 276 | config_block[0x1a] = (unsigned char)global_settings.disk_spindown; |
275 | 277 | ||
@@ -358,8 +360,10 @@ void settings_load(void) | |||
358 | if (c != 31) | 360 | if (c != 31) |
359 | global_settings.scroll_speed = c; | 361 | global_settings.scroll_speed = c; |
360 | 362 | ||
361 | if (config_block[0x10] != 0xFF) | 363 | if (config_block[0x10] != 0xFF) { |
362 | global_settings.ff_rewind_accel = config_block[0x10]; | 364 | global_settings.ff_rewind_min_step = (config_block[0x10] >> 4) & 15; |
365 | global_settings.ff_rewind_accel = config_block[0x10] & 15; | ||
366 | } | ||
363 | 367 | ||
364 | if (config_block[0x11] != 0xFF) | 368 | if (config_block[0x11] != 0xFF) |
365 | global_settings.avc = config_block[0x11]; | 369 | global_settings.avc = config_block[0x11]; |
@@ -418,6 +422,7 @@ void settings_reset(void) { | |||
418 | global_settings.total_uptime = 0; | 422 | global_settings.total_uptime = 0; |
419 | global_settings.scroll_speed = 8; | 423 | global_settings.scroll_speed = 8; |
420 | global_settings.show_hidden_files = false; | 424 | global_settings.show_hidden_files = false; |
425 | global_settings.ff_rewind_min_step = DEFAULT_FF_REWIND_MIN_STEP; | ||
421 | global_settings.ff_rewind_accel = DEFAULT_FF_REWIND_ACCEL_SETTING; | 426 | global_settings.ff_rewind_accel = DEFAULT_FF_REWIND_ACCEL_SETTING; |
422 | global_settings.resume_index = -1; | 427 | global_settings.resume_index = -1; |
423 | global_settings.resume_offset = -1; | 428 | global_settings.resume_offset = -1; |
diff --git a/apps/settings.h b/apps/settings.h index 3971d41b7b..7474221fc4 100644 --- a/apps/settings.h +++ b/apps/settings.h | |||
@@ -31,6 +31,21 @@ | |||
31 | #define RESUME_ASK 1 | 31 | #define RESUME_ASK 1 |
32 | #define RESUME_ON 2 | 32 | #define RESUME_ON 2 |
33 | 33 | ||
34 | #define FF_REWIND_1000 0 | ||
35 | #define FF_REWIND_2000 1 | ||
36 | #define FF_REWIND_3000 2 | ||
37 | #define FF_REWIND_4000 3 | ||
38 | #define FF_REWIND_5000 4 | ||
39 | #define FF_REWIND_6000 5 | ||
40 | #define FF_REWIND_8000 6 | ||
41 | #define FF_REWIND_10000 7 | ||
42 | #define FF_REWIND_15000 8 | ||
43 | #define FF_REWIND_20000 9 | ||
44 | #define FF_REWIND_25000 10 | ||
45 | #define FF_REWIND_30000 11 | ||
46 | #define FF_REWIND_45000 12 | ||
47 | #define FF_REWIND_60000 13 | ||
48 | |||
34 | struct user_settings | 49 | struct user_settings |
35 | { | 50 | { |
36 | /* audio settings */ | 51 | /* audio settings */ |
@@ -65,6 +80,7 @@ struct user_settings | |||
65 | bool sort_case; /* dir sort order: 0=case insensitive, 1=sensitive */ | 80 | bool sort_case; /* dir sort order: 0=case insensitive, 1=sensitive */ |
66 | int scroll_speed; /* long texts scrolling speed: 1-20 */ | 81 | int scroll_speed; /* long texts scrolling speed: 1-20 */ |
67 | bool playlist_shuffle; | 82 | bool playlist_shuffle; |
83 | int ff_rewind_min_step; /* FF/Rewind minimum step size */ | ||
68 | int ff_rewind_accel; /* FF/Rewind acceleration (in seconds per doubling) */ | 84 | int ff_rewind_accel; /* FF/Rewind acceleration (in seconds per doubling) */ |
69 | int disk_spindown; /* time until disk spindown, in seconds (0=off) */ | 85 | int disk_spindown; /* time until disk spindown, in seconds (0=off) */ |
70 | 86 | ||
@@ -118,6 +134,7 @@ extern char rockboxdir[]; | |||
118 | #define MIN_CONTRAST_SETTING 5 | 134 | #define MIN_CONTRAST_SETTING 5 |
119 | #define DEFAULT_POWEROFF_SETTING 0 | 135 | #define DEFAULT_POWEROFF_SETTING 0 |
120 | #define DEFAULT_BACKLIGHT_SETTING 5 | 136 | #define DEFAULT_BACKLIGHT_SETTING 5 |
137 | #define DEFAULT_FF_REWIND_MIN_STEP FF_REWIND_1000 | ||
121 | #define DEFAULT_FF_REWIND_ACCEL_SETTING 3 | 138 | #define DEFAULT_FF_REWIND_ACCEL_SETTING 3 |
122 | 139 | ||
123 | #endif /* __SETTINGS_H__ */ | 140 | #endif /* __SETTINGS_H__ */ |
diff --git a/apps/settings_menu.c b/apps/settings_menu.c index cb85af317c..c93ea49c38 100644 --- a/apps/settings_menu.c +++ b/apps/settings_menu.c | |||
@@ -154,6 +154,17 @@ static Menu spindown(void) | |||
154 | return MENU_OK; | 154 | return MENU_OK; |
155 | } | 155 | } |
156 | 156 | ||
157 | static Menu ff_rewind_min_step(void) | ||
158 | { | ||
159 | char* names[] = { "1s ", "2s ", "3s ", "4s ", | ||
160 | "5s ", "6s ", "8s ", "10s", | ||
161 | "15s", "20s", "25s", "30s", | ||
162 | "45s", "60s" }; | ||
163 | set_option("[FF/rewind min step]", &global_settings.ff_rewind_min_step, | ||
164 | names, 14 ); | ||
165 | return MENU_OK; | ||
166 | } | ||
167 | |||
157 | static Menu ff_rewind_accel(void) | 168 | static Menu ff_rewind_accel(void) |
158 | { | 169 | { |
159 | char* names[] = { "off ", "2x/1s ", "2x/2s ", "2x/3s ", | 170 | char* names[] = { "off ", "2x/1s ", "2x/2s ", "2x/3s ", |
@@ -186,6 +197,7 @@ Menu settings_menu(void) | |||
186 | { "Time/Date", timedate_set }, | 197 | { "Time/Date", timedate_set }, |
187 | #endif | 198 | #endif |
188 | { "Show hidden files", show_hidden_files }, | 199 | { "Show hidden files", show_hidden_files }, |
200 | { "FF/Rewind", ff_rewind_min_step }, | ||
189 | { "FF/Rewind Accel", ff_rewind_accel }, | 201 | { "FF/Rewind Accel", ff_rewind_accel }, |
190 | { "Resume", resume }, | 202 | { "Resume", resume }, |
191 | { "Disk spindown", spindown }, | 203 | { "Disk spindown", spindown }, |
diff --git a/apps/wps.c b/apps/wps.c index 1bd2c6405d..0c10a881c3 100644 --- a/apps/wps.c +++ b/apps/wps.c | |||
@@ -44,7 +44,6 @@ | |||
44 | #include "ajf.h" | 44 | #include "ajf.h" |
45 | #endif | 45 | #endif |
46 | 46 | ||
47 | #define FF_REWIND_MIN_STEP 1000 /* minimum ff/rewind step is 1 second */ | ||
48 | #define FF_REWIND_MAX_PERCENT 3 /* cap ff/rewind step size at max % of file */ | 47 | #define FF_REWIND_MAX_PERCENT 3 /* cap ff/rewind step size at max % of file */ |
49 | /* 3% of 30min file == 54s step size */ | 48 | /* 3% of 30min file == 54s step size */ |
50 | 49 | ||
@@ -288,26 +287,37 @@ int player_id3_show(void) | |||
288 | 287 | ||
289 | static bool ffwd_rew(int button) | 288 | static bool ffwd_rew(int button) |
290 | { | 289 | { |
291 | unsigned int ff_rewind_step = 0; /* current rewind step size */ | 290 | static int ff_rew_steps[] = { |
292 | unsigned int ff_rewind_max_step = 0; /* max rewind step size */ | 291 | 1000, 2000, 3000, 4000, |
293 | int ff_rewind_count = 0; | 292 | 5000, 6000, 8000, 10000, |
294 | long ff_rewind_accel_tick = 0; /* next time to bump ff/rewind step size */ | 293 | 15000, 20000, 25000, 30000, |
294 | 45000, 60000 | ||
295 | }; | ||
296 | |||
297 | unsigned int step = 0; /* current ff/rewind step */ | ||
298 | unsigned int max_step = 0; /* maximum ff/rewind step */ | ||
299 | int ff_rewind_count = 0; /* current ff/rewind count (in ticks) */ | ||
300 | int direction = 1; /* forward=1 or backward=-1 */ | ||
301 | long accel_tick = 0; /* next time at which to bump the step size */ | ||
295 | bool exit = false; | 302 | bool exit = false; |
296 | bool usb = false; | 303 | bool usb = false; |
297 | 304 | ||
298 | while (!exit) { | 305 | while (!exit) { |
299 | switch ( button ) { | 306 | switch ( button ) { |
300 | case BUTTON_LEFT | BUTTON_REPEAT: | 307 | case BUTTON_LEFT | BUTTON_REPEAT: |
308 | case BUTTON_RIGHT | BUTTON_REPEAT: | ||
301 | if (ff_rewind) | 309 | if (ff_rewind) |
302 | { | 310 | { |
303 | ff_rewind_count -= ff_rewind_step; | 311 | ff_rewind_count += step * direction; |
312 | |||
304 | if (global_settings.ff_rewind_accel != 0 && | 313 | if (global_settings.ff_rewind_accel != 0 && |
305 | current_tick >= ff_rewind_accel_tick) | 314 | current_tick >= accel_tick) |
306 | { | 315 | { |
307 | ff_rewind_step *= 2; | 316 | step *= 2; |
308 | if (ff_rewind_step > ff_rewind_max_step) | 317 | if (step > max_step) |
309 | ff_rewind_step = ff_rewind_max_step; | 318 | step = max_step; |
310 | ff_rewind_accel_tick = current_tick + | 319 | |
320 | accel_tick = current_tick + | ||
311 | global_settings.ff_rewind_accel*HZ; | 321 | global_settings.ff_rewind_accel*HZ; |
312 | } | 322 | } |
313 | } | 323 | } |
@@ -320,96 +330,48 @@ static bool ffwd_rew(int button) | |||
320 | #ifdef HAVE_PLAYER_KEYPAD | 330 | #ifdef HAVE_PLAYER_KEYPAD |
321 | lcd_stop_scroll(); | 331 | lcd_stop_scroll(); |
322 | #endif | 332 | #endif |
333 | direction = (button & BUTTON_RIGHT) ? 1 : -1; | ||
334 | |||
335 | if (direction > 0) | ||
336 | status_set_playmode(STATUS_FASTFORWARD); | ||
337 | else | ||
323 | status_set_playmode(STATUS_FASTBACKWARD); | 338 | status_set_playmode(STATUS_FASTBACKWARD); |
339 | |||
324 | ff_rewind = true; | 340 | ff_rewind = true; |
325 | ff_rewind_max_step = | ||
326 | id3->length * FF_REWIND_MAX_PERCENT / 100; | ||
327 | ff_rewind_step = FF_REWIND_MIN_STEP; | ||
328 | if (ff_rewind_step > ff_rewind_max_step) | ||
329 | ff_rewind_step = ff_rewind_max_step; | ||
330 | ff_rewind_count = -ff_rewind_step; | ||
331 | ff_rewind_accel_tick = current_tick + | ||
332 | global_settings.ff_rewind_accel*HZ; | ||
333 | } | ||
334 | else | ||
335 | break; | ||
336 | } | ||
337 | 341 | ||
338 | if ((int)(id3->elapsed + ff_rewind_count) < 0) | 342 | step = ff_rew_steps[global_settings.ff_rewind_min_step]; |
339 | ff_rewind_count = -id3->elapsed; | ||
340 | 343 | ||
341 | if(wps_time_countup == false) | 344 | max_step = id3->length * FF_REWIND_MAX_PERCENT / 100; |
342 | wps_refresh(id3, -ff_rewind_count, false); | ||
343 | else | ||
344 | wps_refresh(id3, ff_rewind_count, false); | ||
345 | break; | ||
346 | 345 | ||
347 | case BUTTON_RIGHT | BUTTON_REPEAT: | 346 | if (step > max_step) |
348 | if (ff_rewind) | 347 | step = max_step; |
349 | { | 348 | |
350 | ff_rewind_count += ff_rewind_step; | 349 | ff_rewind_count = step * direction; |
351 | if (global_settings.ff_rewind_accel != 0 && | 350 | accel_tick = current_tick + |
352 | current_tick >= ff_rewind_accel_tick) | ||
353 | { | ||
354 | ff_rewind_step *= 2; | ||
355 | if (ff_rewind_step > ff_rewind_max_step) | ||
356 | ff_rewind_step = ff_rewind_max_step; | ||
357 | ff_rewind_accel_tick = current_tick + | ||
358 | global_settings.ff_rewind_accel*HZ; | ||
359 | } | ||
360 | } | ||
361 | else | ||
362 | { | ||
363 | if ( mpeg_is_playing() && id3 && id3->length ) | ||
364 | { | ||
365 | if (!paused) | ||
366 | mpeg_pause(); | ||
367 | #ifdef HAVE_PLAYER_KEYPAD | ||
368 | lcd_stop_scroll(); | ||
369 | #endif | ||
370 | status_set_playmode(STATUS_FASTFORWARD); | ||
371 | ff_rewind = true; | ||
372 | ff_rewind_max_step = | ||
373 | id3->length * FF_REWIND_MAX_PERCENT / 100; | ||
374 | ff_rewind_step = FF_REWIND_MIN_STEP; | ||
375 | if (ff_rewind_step > ff_rewind_max_step) | ||
376 | ff_rewind_step = ff_rewind_max_step; | ||
377 | ff_rewind_count = ff_rewind_step; | ||
378 | ff_rewind_accel_tick = current_tick + | ||
379 | global_settings.ff_rewind_accel*HZ; | 351 | global_settings.ff_rewind_accel*HZ; |
380 | } | 352 | } |
381 | else | 353 | else |
382 | break; | 354 | break; |
383 | } | 355 | } |
384 | 356 | ||
357 | if (direction > 0) { | ||
385 | if ((id3->elapsed + ff_rewind_count) > id3->length) | 358 | if ((id3->elapsed + ff_rewind_count) > id3->length) |
386 | ff_rewind_count = id3->length - id3->elapsed; | 359 | ff_rewind_count = id3->length - id3->elapsed; |
360 | } | ||
361 | else { | ||
362 | if ((int)(id3->elapsed + ff_rewind_count) < 0) | ||
363 | ff_rewind_count = -id3->elapsed; | ||
364 | } | ||
387 | 365 | ||
388 | if(wps_time_countup == false) | 366 | if(wps_time_countup == false) |
389 | wps_refresh(id3, -ff_rewind_count, false); | 367 | wps_refresh(id3, -ff_rewind_count, false); |
390 | else | 368 | else |
391 | wps_refresh(id3, ff_rewind_count, false); | 369 | wps_refresh(id3, ff_rewind_count, false); |
392 | break; | ||
393 | 370 | ||
394 | case BUTTON_LEFT | BUTTON_REL: | ||
395 | /* rewind */ | ||
396 | mpeg_ff_rewind(ff_rewind_count); | ||
397 | ff_rewind_count = 0; | ||
398 | ff_rewind = false; | ||
399 | if (paused) | ||
400 | status_set_playmode(STATUS_PAUSE); | ||
401 | else { | ||
402 | mpeg_resume(); | ||
403 | status_set_playmode(STATUS_PLAY); | ||
404 | } | ||
405 | #ifdef HAVE_LCD_CHARCELLS | ||
406 | wps_display(id3); | ||
407 | #endif | ||
408 | exit = true; | ||
409 | break; | 371 | break; |
410 | 372 | ||
373 | case BUTTON_LEFT | BUTTON_REL: | ||
411 | case BUTTON_RIGHT | BUTTON_REL: | 374 | case BUTTON_RIGHT | BUTTON_REL: |
412 | /* fast forward */ | ||
413 | mpeg_ff_rewind(ff_rewind_count); | 375 | mpeg_ff_rewind(ff_rewind_count); |
414 | ff_rewind_count = 0; | 376 | ff_rewind_count = 0; |
415 | ff_rewind = false; | 377 | ff_rewind = false; |