? h300 ? random_folder.diff ? tools/codepages ? tools/mkboot ? tools/rdf2binary Index: apps/playlist.c =================================================================== RCS file: /cvsroot/rockbox/apps/playlist.c,v retrieving revision 1.163 diff -u -r1.163 playlist.c --- apps/playlist.c 12 Jun 2006 23:06:51 -0000 1.163 +++ apps/playlist.c 19 Jun 2006 11:42:05 -0000 @@ -97,6 +97,7 @@ #include "lang.h" #include "talk.h" #include "splash.h" +#include "plugin.h" #define PLAYLIST_CONTROL_FILE ROCKBOX_DIR "/.playlist_control" #define PLAYLIST_CONTROL_FILE_VERSION 2 @@ -1352,7 +1353,107 @@ static int get_previous_directory(char *dir){ return get_next_dir(dir,false,false); } +static int get_random_dir_worker(char* dir, char *buffer, int *buffer_start, + int* buff_size, int* dir_count) +{ + struct entry *files; + int num_files = 0; + int i, len; + char *s; + struct tree_context* tc = tree_get_context(); + int dirfilter = *(tc->dirfilter); + /* use the tree browser dircache to load files */ + *(tc->dirfilter) = SHOW_ALL; + if (ft_load(tc, dir) < 0) + { + gui_syncsplash(HZ*2, true, str(LANG_PLAYLIST_DIRECTORY_ACCESS_ERROR)); + return -1; + } + files = (struct entry*) tc->dircache; + num_files = tc->filesindir; + + for (i=0; i= len) + { + strcpy(&buffer[*buffer_start], dir); + (*buffer_start) += len; + (*buff_size) -= len; + (*dir_count)++; + } + + if (get_random_dir_worker(dir,buffer, buffer_start, + buff_size,dir_count) == -1) + return -1; + s = strrchr(dir,'/'); + if (s) *s = '\0'; + if (ft_load(tc, dir) < 0) + { + gui_syncsplash(HZ*2, true, + str(LANG_PLAYLIST_DIRECTORY_ACCESS_ERROR)); + return -1; + } + } + } + + /* we've overwritten the dircache so tree browser will need to be + reloaded */ + reload_directory(); + /* restore dirfilter */ + *(tc->dirfilter) = dirfilter; + return 0; +} + +static int get_random_directory(char* dir) +{ + int dir_count = 0; + char prev_dir[MAX_PATH]; + char *s, *buffer; + int buffer_size, buffer_start = 0, ret =-1; + + buffer = plugin_get_buffer(&buffer_size); + if (!buffer) + return get_next_directory(dir); + strcpy(prev_dir,dir); + if (get_random_dir_worker(dir,buffer, &buffer_start, + &buffer_size,&dir_count) != -1) + { + int i,j; + bool exit = false; + srand(current_tick); + while (!exit) + { + j = rand()%dir_count; + s = buffer; + for (i=0;idirfilter); - - if (recursion){ + + if (global_settings.next_folder == NEXTFOLDER_RANDOM) + { + strcpy(dir,"/"); + result = get_random_directory(dir); + if (dir[1] == '/') + memmove(dir,&dir[1],strlen(dir)); + return ft_load(tc, dir)<0?-1:result; + } + if (recursion){ /* start with root */ dir[0] = '\0'; } @@ -2337,7 +2446,7 @@ struct playlist_info* playlist = ¤t_playlist; /* always allow folder navigation */ - if (global_settings.next_folder && playlist->in_ram) + if ((global_settings.next_folder != NEXTFOLDER_NO) && playlist->in_ram) return true; int index = get_next_index(playlist, steps, -1); @@ -2458,7 +2567,7 @@ playlist->index = 0; index = 0; } - else if (playlist->in_ram && global_settings.next_folder) + else if (playlist->in_ram && (global_settings.next_folder != NEXTFOLDER_NO)) { char dir[MAX_PATH+1]; Index: apps/settings.c =================================================================== RCS file: /cvsroot/rockbox/apps/settings.c,v retrieving revision 1.389 diff -u -r1.389 settings.c --- apps/settings.c 6 Jun 2006 22:23:40 -0000 1.389 +++ apps/settings.c 19 Jun 2006 11:42:08 -0000 @@ -94,7 +94,7 @@ #include "dsp.h" #endif -#define CONFIG_BLOCK_VERSION 44 +#define CONFIG_BLOCK_VERSION 45 #define CONFIG_BLOCK_SIZE 512 #define RTC_BLOCK_SIZE 44 @@ -506,7 +506,7 @@ {1, S_O(spdif_enable), false, "spdif enable", off_on}, #endif - {1, S_O(next_folder), false, "folder navigation", off_on }, + {2, S_O(next_folder), 0, "folder navigation", "no,yes,random" }, {1, S_O(runtimedb), false, "gather runtime data", off_on }, #if CONFIG_CODEC == SWCODEC Index: apps/settings.h =================================================================== RCS file: /cvsroot/rockbox/apps/settings.h,v retrieving revision 1.219 diff -u -r1.219 settings.h --- apps/settings.h 25 May 2006 13:34:51 -0000 1.219 +++ apps/settings.h 19 Jun 2006 11:42:08 -0000 @@ -166,6 +166,10 @@ #define CROSSFADE_ENABLE_SHUFFLE 1 #define CROSSFADE_ENABLE_ALWAYS 2 +#define NEXTFOLDER_NO 0 +#define NEXTFOLDER_YES 1 +#define NEXTFOLDER_RANDOM 2 + /* These define "virtual pointers", which could either be a literal string, or a mean a string ID if the pointer is in a certain range. This helps to save space for menus and options. */ @@ -408,7 +412,7 @@ #endif #endif - bool next_folder; /* move to next folder */ + int next_folder; /* move to next folder */ bool runtimedb; /* runtime database active? */ #if CONFIG_CODEC == SWCODEC Index: apps/settings_menu.c =================================================================== RCS file: /cvsroot/rockbox/apps/settings_menu.c,v retrieving revision 1.257 diff -u -r1.257 settings_menu.c --- apps/settings_menu.c 6 Jun 2006 22:23:41 -0000 1.257 +++ apps/settings_menu.c 19 Jun 2006 11:42:10 -0000 @@ -1290,7 +1290,14 @@ static bool next_folder(void) { - return set_bool( str(LANG_NEXT_FOLDER), &global_settings.next_folder ); + static const struct opt_items names[] = { + { STR(LANG_SET_BOOL_NO) }, + { STR(LANG_SET_BOOL_YES) }, + { STR(LANG_RANDOM_DIRECTORY) }, + }; + return set_option(str(LANG_NEXT_FOLDER), + &global_settings.next_folder, + INT, names, 3, NULL ); } static bool codepage_setting(void) Index: apps/lang/english.lang =================================================================== RCS file: /cvsroot/rockbox/apps/lang/english.lang,v retrieving revision 1.252 diff -u -r1.252 english.lang --- apps/lang/english.lang 25 May 2006 13:34:51 -0000 1.252 +++ apps/lang/english.lang 19 Jun 2006 11:42:15 -0000 @@ -8528,4 +8528,18 @@ *: "Remote Scrolling Options" + + + id: LANG_RANDOM_DIRECTORY + desc: Random + user: + + *: "Random Directory" + + + *: "Random Directory" + + + *: "" +