diff options
author | Björn Stenberg <bjorn@haxx.se> | 2002-08-16 14:41:47 +0000 |
---|---|---|
committer | Björn Stenberg <bjorn@haxx.se> | 2002-08-16 14:41:47 +0000 |
commit | 6224cdb16677cae7b65b0598eec3381a6fb6a4aa (patch) | |
tree | 9ad9b39557492606c853e7f14c359bca5e0a3b65 /apps/tree.c | |
parent | 085e77467565aba251c31721e92bc7ebd7baa61f (diff) | |
download | rockbox-6224cdb16677cae7b65b0598eec3381a6fb6a4aa.tar.gz rockbox-6224cdb16677cae7b65b0598eec3381a6fb6a4aa.zip |
Added resume. Works in dirs and playlists, shuffled or not. Resumes mid-song, but press pause on players before you shutdown so they get a chance to store the position on disk. Recorders use RTC ram. Todo: Time display is wrong after mid-track resume and ffd/rew is not handled.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@1787 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/tree.c')
-rw-r--r-- | apps/tree.c | 129 |
1 files changed, 127 insertions, 2 deletions
diff --git a/apps/tree.c b/apps/tree.c index d2660513a5..5312885f19 100644 --- a/apps/tree.c +++ b/apps/tree.c | |||
@@ -102,12 +102,14 @@ extern unsigned char bitmap_icons_6x8[LastIcon][6]; | |||
102 | #define TREE_EXIT BUTTON_LEFT | 102 | #define TREE_EXIT BUTTON_LEFT |
103 | #define TREE_ENTER BUTTON_RIGHT | 103 | #define TREE_ENTER BUTTON_RIGHT |
104 | #define TREE_MENU BUTTON_F1 | 104 | #define TREE_MENU BUTTON_F1 |
105 | #define RELEASE_MASK (BUTTON_OFF) | ||
105 | #else | 106 | #else |
106 | #define TREE_NEXT BUTTON_RIGHT | 107 | #define TREE_NEXT BUTTON_RIGHT |
107 | #define TREE_PREV BUTTON_LEFT | 108 | #define TREE_PREV BUTTON_LEFT |
108 | #define TREE_EXIT BUTTON_STOP | 109 | #define TREE_EXIT BUTTON_STOP |
109 | #define TREE_ENTER BUTTON_PLAY | 110 | #define TREE_ENTER BUTTON_PLAY |
110 | #define TREE_MENU BUTTON_MENU | 111 | #define TREE_MENU BUTTON_MENU |
112 | #define RELEASE_MASK (BUTTON_STOP) | ||
111 | #endif /* HAVE_RECORDER_KEYPAD */ | 113 | #endif /* HAVE_RECORDER_KEYPAD */ |
112 | 114 | ||
113 | #define TREE_ATTR_M3U 0x80 /* unused by FAT attributes */ | 115 | #define TREE_ATTR_M3U 0x80 /* unused by FAT attributes */ |
@@ -292,6 +294,98 @@ static int showdir(char *path, int start) | |||
292 | return filesindir; | 294 | return filesindir; |
293 | } | 295 | } |
294 | 296 | ||
297 | bool ask_resume(void) | ||
298 | { | ||
299 | lcd_clear_display(); | ||
300 | lcd_puts(0,0,"Resume?"); | ||
301 | #ifdef HAVE_LCD_CHARCELLS | ||
302 | lcd_puts(0,1,"(Play/Stop)"); | ||
303 | #else | ||
304 | lcd_puts(0,1,"Play = Yes"); | ||
305 | lcd_puts(0,2,"Any other = No"); | ||
306 | #endif | ||
307 | lcd_update(); | ||
308 | if (button_get(true) == BUTTON_PLAY) | ||
309 | return true; | ||
310 | return false; | ||
311 | } | ||
312 | |||
313 | void start_resume(void) | ||
314 | { | ||
315 | if ( global_settings.resume && | ||
316 | global_settings.resume_index != -1 ) { | ||
317 | int len = strlen(global_settings.resume_file); | ||
318 | |||
319 | DEBUGF("Resume file %s\n",global_settings.resume_file); | ||
320 | DEBUGF("Resume index %X offset %X\n", | ||
321 | global_settings.resume_index, | ||
322 | global_settings.resume_offset); | ||
323 | DEBUGF("Resume shuffle %s seed %X\n", | ||
324 | global_settings.playlist_shuffle?"on":"off", | ||
325 | global_settings.resume_seed); | ||
326 | |||
327 | /* playlist? */ | ||
328 | if (!strcasecmp(&global_settings.resume_file[len-4], ".m3u")) { | ||
329 | char* slash; | ||
330 | |||
331 | /* check that the file exists */ | ||
332 | int fd = open(global_settings.resume_file, O_RDONLY); | ||
333 | if(fd<0) | ||
334 | return; | ||
335 | close(fd); | ||
336 | |||
337 | if (!ask_resume()) | ||
338 | return; | ||
339 | |||
340 | slash = strrchr(global_settings.resume_file,'/'); | ||
341 | if (slash) { | ||
342 | *slash=0; | ||
343 | play_list(global_settings.resume_file, | ||
344 | slash+1, | ||
345 | global_settings.resume_index, | ||
346 | global_settings.resume_offset, | ||
347 | global_settings.resume_seed ); | ||
348 | *slash='/'; | ||
349 | } | ||
350 | else { | ||
351 | /* check that the dir exists */ | ||
352 | DIR* dir = opendir(global_settings.resume_file); | ||
353 | if(!dir) | ||
354 | return; | ||
355 | closedir(dir); | ||
356 | |||
357 | if (!ask_resume()) | ||
358 | return; | ||
359 | |||
360 | play_list("/", | ||
361 | global_settings.resume_file, | ||
362 | global_settings.resume_index, | ||
363 | global_settings.resume_offset, | ||
364 | global_settings.resume_seed ); | ||
365 | } | ||
366 | } | ||
367 | else { | ||
368 | int start_index; | ||
369 | |||
370 | if (!ask_resume()) | ||
371 | return; | ||
372 | |||
373 | if (showdir(global_settings.resume_file, 0) < 0 ) | ||
374 | return; | ||
375 | start_index = build_playlist(global_settings.resume_index); | ||
376 | play_list(global_settings.resume_file, | ||
377 | NULL, | ||
378 | start_index, | ||
379 | global_settings.resume_offset, | ||
380 | global_settings.resume_seed); | ||
381 | } | ||
382 | |||
383 | status_set_playmode(STATUS_PLAY); | ||
384 | status_draw(); | ||
385 | wps_show(); | ||
386 | } | ||
387 | } | ||
388 | |||
295 | bool dirbrowse(char *root) | 389 | bool dirbrowse(char *root) |
296 | { | 390 | { |
297 | int numentries=0; | 391 | int numentries=0; |
@@ -317,6 +411,9 @@ bool dirbrowse(char *root) | |||
317 | tree_max_on_screen = TREE_MAX_ON_SCREEN; | 411 | tree_max_on_screen = TREE_MAX_ON_SCREEN; |
318 | #endif | 412 | #endif |
319 | 413 | ||
414 | start_resume(); | ||
415 | button_set_release(RELEASE_MASK); | ||
416 | |||
320 | memcpy(currdir,root,sizeof(currdir)); | 417 | memcpy(currdir,root,sizeof(currdir)); |
321 | numentries = showdir(root, start); | 418 | numentries = showdir(root, start); |
322 | if (numentries == -1) | 419 | if (numentries == -1) |
@@ -350,6 +447,7 @@ bool dirbrowse(char *root) | |||
350 | restore = true; | 447 | restore = true; |
351 | } | 448 | } |
352 | break; | 449 | break; |
450 | |||
353 | #ifdef HAVE_RECORDER_KEYPAD | 451 | #ifdef HAVE_RECORDER_KEYPAD |
354 | case BUTTON_OFF: | 452 | case BUTTON_OFF: |
355 | mpeg_stop(); | 453 | mpeg_stop(); |
@@ -357,7 +455,15 @@ bool dirbrowse(char *root) | |||
357 | status_draw(); | 455 | status_draw(); |
358 | restore = true; | 456 | restore = true; |
359 | break; | 457 | break; |
458 | |||
459 | case BUTTON_OFF | BUTTON_REL: | ||
460 | #else | ||
461 | case BUTTON_STOP | BUTTON_REL: | ||
360 | #endif | 462 | #endif |
463 | global_settings.resume_index = -1; | ||
464 | settings_save(); | ||
465 | break; | ||
466 | |||
361 | 467 | ||
362 | case TREE_ENTER: | 468 | case TREE_ENTER: |
363 | #ifdef HAVE_RECORDER_KEYPAD | 469 | #ifdef HAVE_RECORDER_KEYPAD |
@@ -383,16 +489,34 @@ bool dirbrowse(char *root) | |||
383 | dircursor=0; | 489 | dircursor=0; |
384 | start=0; | 490 | start=0; |
385 | } else { | 491 | } else { |
492 | int seed = current_tick; | ||
386 | lcd_stop_scroll(); | 493 | lcd_stop_scroll(); |
387 | if(dircache[dircursor+start].attr & TREE_ATTR_M3U ) | 494 | if(dircache[dircursor+start].attr & TREE_ATTR_M3U ) |
388 | { | 495 | { |
496 | if ( global_settings.resume ) | ||
497 | snprintf(global_settings.resume_file, | ||
498 | MAX_PATH, "%s/%s", | ||
499 | currdir, | ||
500 | dircache[dircursor+start].name); | ||
389 | play_list(currdir, | 501 | play_list(currdir, |
390 | dircache[dircursor+start].name, 0); | 502 | dircache[dircursor+start].name, |
503 | 0, 0, seed ); | ||
391 | } | 504 | } |
392 | else { | 505 | else { |
506 | if ( global_settings.resume ) | ||
507 | strncpy(global_settings.resume_file, | ||
508 | currdir, MAX_PATH); | ||
393 | start_index = build_playlist(dircursor+start); | 509 | start_index = build_playlist(dircursor+start); |
394 | play_list(currdir, NULL, start_index); | 510 | play_list(currdir, NULL, start_index, 0, seed); |
395 | } | 511 | } |
512 | |||
513 | if ( global_settings.resume ) { | ||
514 | global_settings.resume_index = 0; | ||
515 | global_settings.resume_offset = 0; | ||
516 | global_settings.resume_seed = seed; | ||
517 | settings_save(); | ||
518 | } | ||
519 | |||
396 | status_set_playmode(STATUS_PLAY); | 520 | status_set_playmode(STATUS_PLAY); |
397 | status_draw(); | 521 | status_draw(); |
398 | lcd_stop_scroll(); | 522 | lcd_stop_scroll(); |
@@ -405,6 +529,7 @@ bool dirbrowse(char *root) | |||
405 | dirlevel = 0; | 529 | dirlevel = 0; |
406 | dircursor = 0; | 530 | dircursor = 0; |
407 | start = 0; | 531 | start = 0; |
532 | global_settings.resume_index = -1; | ||
408 | } | 533 | } |
409 | } | 534 | } |
410 | restore = true; | 535 | restore = true; |