summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/settings.c13
-rw-r--r--apps/settings.h17
-rw-r--r--apps/settings_menu.c12
-rw-r--r--apps/wps.c120
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
680x0d 0x21 <resume settings byte> 680x0d 0x21 <resume settings byte>
690x0e 0x22 <shuffle,mp3filter,sort_case,discharge,statusbar,show_hidden> 690x0e 0x22 <shuffle,mp3filter,sort_case,discharge,statusbar,show_hidden>
700x0f 0x23 <scroll speed> 700x0f 0x23 <scroll speed>
710x10 0x24 <ff/rewind accleration rate> 710x10 0x24 <ff/rewind min step, acceleration rate>
720x11 0x25 <AVC byte> 720x11 0x25 <AVC byte>
730x12 0x26 <(int) Resume playlist index, or -1 if no playlist resume> 730x12 0x26 <(int) Resume playlist index, or -1 if no playlist resume>
740x16 0x2a <(int) Byte offset into resume file> 740x16 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
34struct user_settings 49struct 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
157static 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
157static Menu ff_rewind_accel(void) 168static 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
289static bool ffwd_rew(int button) 288static 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;