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.zip rockbox-6224cdb16677cae7b65b0598eec3381a6fb6a4aa.tar.gz rockbox-6224cdb16677cae7b65b0598eec3381a6fb6a4aa.tar.bz2 rockbox-6224cdb16677cae7b65b0598eec3381a6fb6a4aa.tar.xz | |
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 d266051..5312885 100644 --- a/apps/tree.c +++ b/apps/tree.c @@ -102,12 +102,14 @@ extern unsigned char bitmap_icons_6x8[LastIcon][6]; #define TREE_EXIT BUTTON_LEFT #define TREE_ENTER BUTTON_RIGHT #define TREE_MENU BUTTON_F1 +#define RELEASE_MASK (BUTTON_OFF) #else #define TREE_NEXT BUTTON_RIGHT #define TREE_PREV BUTTON_LEFT #define TREE_EXIT BUTTON_STOP #define TREE_ENTER BUTTON_PLAY #define TREE_MENU BUTTON_MENU +#define RELEASE_MASK (BUTTON_STOP) #endif /* HAVE_RECORDER_KEYPAD */ #define TREE_ATTR_M3U 0x80 /* unused by FAT attributes */ @@ -292,6 +294,98 @@ static int showdir(char *path, int start) return filesindir; } +bool ask_resume(void) +{ + lcd_clear_display(); + lcd_puts(0,0,"Resume?"); +#ifdef HAVE_LCD_CHARCELLS + lcd_puts(0,1,"(Play/Stop)"); +#else + lcd_puts(0,1,"Play = Yes"); + lcd_puts(0,2,"Any other = No"); +#endif + lcd_update(); + if (button_get(true) == BUTTON_PLAY) + return true; + return false; +} + +void start_resume(void) +{ + if ( global_settings.resume && + global_settings.resume_index != -1 ) { + int len = strlen(global_settings.resume_file); + + DEBUGF("Resume file %s\n",global_settings.resume_file); + DEBUGF("Resume index %X offset %X\n", + global_settings.resume_index, + global_settings.resume_offset); + DEBUGF("Resume shuffle %s seed %X\n", + global_settings.playlist_shuffle?"on":"off", + global_settings.resume_seed); + + /* playlist? */ + if (!strcasecmp(&global_settings.resume_file[len-4], ".m3u")) { + char* slash; + + /* check that the file exists */ + int fd = open(global_settings.resume_file, O_RDONLY); + if(fd<0) + return; + close(fd); + + if (!ask_resume()) + return; + + slash = strrchr(global_settings.resume_file,'/'); + if (slash) { + *slash=0; + play_list(global_settings.resume_file, + slash+1, + global_settings.resume_index, + global_settings.resume_offset, + global_settings.resume_seed ); + *slash='/'; + } + else { + /* check that the dir exists */ + DIR* dir = opendir(global_settings.resume_file); + if(!dir) + return; + closedir(dir); + + if (!ask_resume()) + return; + + play_list("/", + global_settings.resume_file, + global_settings.resume_index, + global_settings.resume_offset, + global_settings.resume_seed ); + } + } + else { + int start_index; + + if (!ask_resume()) + return; + + if (showdir(global_settings.resume_file, 0) < 0 ) + return; + start_index = build_playlist(global_settings.resume_index); + play_list(global_settings.resume_file, + NULL, + start_index, + global_settings.resume_offset, + global_settings.resume_seed); + } + + status_set_playmode(STATUS_PLAY); + status_draw(); + wps_show(); + } +} + bool dirbrowse(char *root) { int numentries=0; @@ -317,6 +411,9 @@ bool dirbrowse(char *root) tree_max_on_screen = TREE_MAX_ON_SCREEN; #endif + start_resume(); + button_set_release(RELEASE_MASK); + memcpy(currdir,root,sizeof(currdir)); numentries = showdir(root, start); if (numentries == -1) @@ -350,6 +447,7 @@ bool dirbrowse(char *root) restore = true; } break; + #ifdef HAVE_RECORDER_KEYPAD case BUTTON_OFF: mpeg_stop(); @@ -357,7 +455,15 @@ bool dirbrowse(char *root) status_draw(); restore = true; break; + + case BUTTON_OFF | BUTTON_REL: +#else + case BUTTON_STOP | BUTTON_REL: #endif + global_settings.resume_index = -1; + settings_save(); + break; + case TREE_ENTER: #ifdef HAVE_RECORDER_KEYPAD @@ -383,16 +489,34 @@ bool dirbrowse(char *root) dircursor=0; start=0; } else { + int seed = current_tick; lcd_stop_scroll(); if(dircache[dircursor+start].attr & TREE_ATTR_M3U ) { + if ( global_settings.resume ) + snprintf(global_settings.resume_file, + MAX_PATH, "%s/%s", + currdir, + dircache[dircursor+start].name); play_list(currdir, - dircache[dircursor+start].name, 0); + dircache[dircursor+start].name, + 0, 0, seed ); } else { + if ( global_settings.resume ) + strncpy(global_settings.resume_file, + currdir, MAX_PATH); start_index = build_playlist(dircursor+start); - play_list(currdir, NULL, start_index); + play_list(currdir, NULL, start_index, 0, seed); } + + if ( global_settings.resume ) { + global_settings.resume_index = 0; + global_settings.resume_offset = 0; + global_settings.resume_seed = seed; + settings_save(); + } + status_set_playmode(STATUS_PLAY); status_draw(); lcd_stop_scroll(); @@ -405,6 +529,7 @@ bool dirbrowse(char *root) dirlevel = 0; dircursor = 0; start = 0; + global_settings.resume_index = -1; } } restore = true; |