diff options
author | Anton Oleynikov <len0x@rockbox.org> | 2005-11-02 22:32:04 +0000 |
---|---|---|
committer | Anton Oleynikov <len0x@rockbox.org> | 2005-11-02 22:32:04 +0000 |
commit | d102e1f345c5b6aa3976be5c6a50142f9e111b15 (patch) | |
tree | 7d8456b6be3ce03076f1f9e9a90fbfd22dd119c2 /apps | |
parent | 0263ece7f8a69fc34034860a9bc959d61314dc65 (diff) | |
download | rockbox-d102e1f345c5b6aa3976be5c6a50142f9e111b15.tar.gz rockbox-d102e1f345c5b6aa3976be5c6a50142f9e111b15.zip |
patch 1328447: folder skip routines in playlist API plus next/prev folder navigation for iRiver's remote
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@7735 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps')
-rw-r--r-- | apps/filetree.c | 8 | ||||
-rw-r--r-- | apps/lang/english.lang | 6 | ||||
-rw-r--r-- | apps/playback.c | 45 | ||||
-rw-r--r-- | apps/playlist.c | 110 | ||||
-rw-r--r-- | apps/playlist.h | 1 | ||||
-rw-r--r-- | apps/settings.c | 2 | ||||
-rw-r--r-- | apps/wps.c | 14 | ||||
-rw-r--r-- | apps/wps.h | 2 |
8 files changed, 166 insertions, 22 deletions
diff --git a/apps/filetree.c b/apps/filetree.c index e8b8df73ad..8a365cc574 100644 --- a/apps/filetree.c +++ b/apps/filetree.c @@ -172,12 +172,18 @@ static int compare(const void* p1, const void* p2) return t1 - t2; /* else fall through to alphabetical sorting */ } - case 0: /* sort alphabetically */ + case 0: /* sort alphabetically asc */ if (global_settings.sort_case) return strncmp(e1->name, e2->name, MAX_PATH); else return strncasecmp(e1->name, e2->name, MAX_PATH); + case 4: /* sort alphabetically desc */ + if (global_settings.sort_case) + return strncmp(e2->name, e1->name, MAX_PATH); + else + return strncasecmp(e2->name, e1->name, MAX_PATH); + case 1: /* sort date */ return e1->time_write - e2->time_write; diff --git a/apps/lang/english.lang b/apps/lang/english.lang index 94f434f2f4..3d9486a79f 100644 --- a/apps/lang/english.lang +++ b/apps/lang/english.lang @@ -3144,9 +3144,9 @@ voice: "Optical output" new: id: LANG_NEXT_FOLDER -desc: in settings_menu. Should we move to next folder when current one ends -eng: "Move to Next Folder" -voice: "Move to Next Folder" +desc: in settings_menu. Should we allow skip directories and move to next folder when current one ends +eng: "Directory navigation" +voice: "Directory navigation" new: id: LANG_RUNTIMEDB_ACTIVE diff --git a/apps/playback.c b/apps/playback.c index caaee8c5f5..8d869ceda3 100644 --- a/apps/playback.c +++ b/apps/playback.c @@ -92,6 +92,8 @@ static volatile bool paused; #define AUDIO_CODEC_DONE 9 #define AUDIO_FLUSH 10 #define AUDIO_TRACK_CHANGED 11 +#define AUDIO_DIR_NEXT 12 +#define AUDIO_DIR_PREV 13 #define CODEC_LOAD 1 #define CODEC_LOAD_DISK 2 @@ -1653,6 +1655,24 @@ static void initiate_track_change(int peek_index) codec_track_changed(); } +static void initiate_dir_change(int direction) +{ + if(!playlist_next_dir(direction)) + return; + + /* Detect if disk is spinning.. */ + if (filling) { + queue_post(&audio_queue, AUDIO_PLAY, 0); + } else { + new_track = 0; + ci.reload_codec = true; + if (!pcmbuf_is_crossfade_enabled()) + pcmbuf_flush_audio(); + } + + codec_track_changed(); +} + void audio_thread(void) { struct event ev; @@ -1735,6 +1755,21 @@ void audio_thread(void) initiate_track_change(-1); break; + + case AUDIO_DIR_NEXT: + logf("audio_dir_next"); + if (global_settings.beep) + pcmbuf_beep(5000, 100, 2500*global_settings.beep); + initiate_dir_change(1); + break; + + case AUDIO_DIR_PREV: + logf("audio_dir_prev"); + if (global_settings.beep) + pcmbuf_beep(5000, 100, 2500*global_settings.beep); + initiate_dir_change(-1); + break; + case AUDIO_FLUSH: audio_invalidate_tracks(); break ; @@ -2008,6 +2043,16 @@ void audio_prev(void) queue_post(&audio_queue, AUDIO_PREV, 0); } +void audio_next_dir(void) +{ + queue_post(&audio_queue, AUDIO_DIR_NEXT, 0); +} + +void audio_prev_dir(void) +{ + queue_post(&audio_queue, AUDIO_DIR_PREV, 0); +} + void audio_ff_rewind(int newpos) { logf("rewind: %d", newpos); diff --git a/apps/playlist.c b/apps/playlist.c index 2646a27040..9ab1ad9f4a 100644 --- a/apps/playlist.c +++ b/apps/playlist.c @@ -162,6 +162,8 @@ static int compare(const void* p1, const void* p2); static int get_filename(struct playlist_info* playlist, int seek, bool control_file, char *buf, int buf_length); static int get_next_directory(char *dir); +static int get_next_dir(char *dir, bool is_forward, bool recursion); +static int get_previous_directory(char *dir); static int check_subdir_for_music(char *dir, char *subdir); static int format_track_path(char *dest, char *src, int buf_length, int max, char *dir); @@ -1098,26 +1100,53 @@ static int get_filename(struct playlist_info* playlist, int seek, return (format_track_path(buf, tmp_buf, buf_length, max, dir_buf)); } +static int get_next_directory(char *dir){ + return get_next_dir(dir,true,false); +} + +static int get_previous_directory(char *dir){ + return get_next_dir(dir,false,false); +} + /* * search through all the directories (starting with the current) to find * one that has tracks to play */ -static int get_next_directory(char *dir) +static int get_next_dir(char *dir, bool is_forward, bool recursion) { struct playlist_info* playlist = ¤t_playlist; int result = -1; int dirfilter = global_settings.dirfilter; + int sort_dir = global_settings.sort_dir; char *start_dir = NULL; bool exit = false; struct tree_context* tc = tree_get_context(); - /* start with current directory */ - strncpy(dir, playlist->filename, playlist->dirlen-1); - dir[playlist->dirlen-1] = '\0'; + if (recursion){ + /* start with root */ + dir[0] = '\0'; + } + else{ + /* start with current directory */ + strncpy(dir, playlist->filename, playlist->dirlen-1); + dir[playlist->dirlen-1] = '\0'; + } /* use the tree browser dircache to load files */ global_settings.dirfilter = SHOW_ALL; + /* sort in another direction if previous dir is requested */ + if(!is_forward){ + if ((global_settings.sort_dir == 0) || (global_settings.sort_dir == 3)) + global_settings.sort_dir = 4; + else if (global_settings.sort_dir == 1) + global_settings.sort_dir = 2; + else if (global_settings.sort_dir == 2) + global_settings.sort_dir = 1; + else if (global_settings.sort_dir == 4) + global_settings.sort_dir = 0; + } + while (!exit) { struct entry *files; @@ -1180,8 +1209,14 @@ static int get_next_directory(char *dir) reloaded */ reload_directory(); - /* restore dirfilter */ + /* restore dirfilter & sort_dir */ global_settings.dirfilter = dirfilter; + global_settings.sort_dir = sort_dir; + + /* special case if nothing found: try start searching again from root */ + if (result == -1 && !recursion){ + result = get_next_dir(dir,is_forward, true); + } return result; } @@ -1922,13 +1957,14 @@ int playlist_start(int start_index, int offset) bool playlist_check(int steps) { struct playlist_info* playlist = ¤t_playlist; + + /* always allow folder navigation */ + if (global_settings.next_folder && playlist->in_ram) + return true; + int index = get_next_index(playlist, steps, -1); - if (index < 0 && steps >= 0 && - (global_settings.repeat_mode == REPEAT_SHUFFLE || - (global_settings.next_folder && playlist->in_ram))) - /* shuffle repeat and move to next folder are the same as repeat all - for check purposes */ + if (index < 0 && steps >= 0 && global_settings.repeat_mode == REPEAT_SHUFFLE) index = get_next_index(playlist, steps, REPEAT_ALL); return (index >= 0); @@ -2031,23 +2067,40 @@ int playlist_next(int steps) playlist_start(0, 0); index = 0; } - else if (global_settings.next_folder && playlist->in_ram) + else if (playlist->in_ram && global_settings.next_folder) { char dir[MAX_PATH+1]; - if (!get_next_directory(dir)) + if (steps > 0) { - /* start playing new directory */ + if (!get_next_directory(dir)) + { + /* start playing next directory */ + if (playlist_create(dir, NULL) != -1) + { + ft_build_playlist(tree_get_context(), 0); + if (global_settings.playlist_shuffle) + playlist_shuffle(current_tick, -1); + playlist_start(0, 0); + index = 0; + } + } + } + else + { + if (!get_previous_directory(dir)) + { + /* start playing previous directory */ if (playlist_create(dir, NULL) != -1) { ft_build_playlist(tree_get_context(), 0); if (global_settings.playlist_shuffle) playlist_shuffle(current_tick, -1); - - playlist_start(0, 0); - index = 0; + playlist_start(current_playlist.amount-1,0); + index = current_playlist.amount-1; } - } + } + } } return index; @@ -2096,6 +2149,29 @@ int playlist_next(int steps) return index; } +/* try playing next or previous folder */ +bool playlist_next_dir(int direction) +{ + char dir[MAX_PATH+1]; + + if (((direction > 0) && !get_next_directory(dir)) || + ((direction < 0) && !get_previous_directory(dir))) + { + if (playlist_create(dir, NULL) != -1) + { + ft_build_playlist(tree_get_context(), 0); + if (global_settings.playlist_shuffle) + playlist_shuffle(current_tick, -1); + playlist_start(0,0); + return true; + } + else + return false; + } + else + return false; +} + /* Get resume info for current playing song. If return value is -1 then settings shouldn't be saved. */ int playlist_get_resume_info(int *resume_index) diff --git a/apps/playlist.h b/apps/playlist.h index 1937c48a12..efac303f30 100644 --- a/apps/playlist.h +++ b/apps/playlist.h @@ -80,6 +80,7 @@ int playlist_start(int start_index, int offset); bool playlist_check(int steps); char *playlist_peek(int steps); int playlist_next(int steps); +bool playlist_next_dir(int direction); int playlist_get_resume_info(int *resume_index); int playlist_update_resume_info(const struct mp3entry* id3); int playlist_get_display_index(void); diff --git a/apps/settings.c b/apps/settings.c index 0f3c95d979..4924669059 100644 --- a/apps/settings.c +++ b/apps/settings.c @@ -429,7 +429,7 @@ static const struct bit_entry hd_bits[] = {1, S_O(spdif_enable), false, "spdif enable", off_on}, #endif - {1, S_O(next_folder), false, "move to next folder", off_on }, + {1, S_O(next_folder), true, "folder navigation", off_on }, {1, S_O(runtimedb), false, "gather runtime data", off_on }, #if CONFIG_CODEC == SWCODEC diff --git a/apps/wps.c b/apps/wps.c index 784289ada4..84f862de9c 100644 --- a/apps/wps.c +++ b/apps/wps.c @@ -64,6 +64,9 @@ static struct mp3entry* id3 = NULL; static struct mp3entry* nid3 = NULL; static char current_track_path[MAX_PATH+1]; +void audio_next_dir(void); +void audio_prev_dir(void); + /* set volume return true if screen restore is needed return false otherwise @@ -601,6 +604,17 @@ long wps_show(void) } break; +#ifdef WPS_RC_NEXT_DIR + case WPS_RC_NEXT_DIR: + audio_next_dir(); + break; +#endif +#ifdef WPS_RC_PREV_DIR + case WPS_RC_PREV_DIR: + audio_prev_dir(); + break; +#endif + /* next */ case WPS_NEXT: #ifdef WPS_NEXT_PRE diff --git a/apps/wps.h b/apps/wps.h index e32bd3c815..e1f053a3d2 100644 --- a/apps/wps.h +++ b/apps/wps.h @@ -43,6 +43,8 @@ #define WPS_CONTEXT (BUTTON_SELECT | BUTTON_REPEAT) #define WPS_QUICK (BUTTON_MODE | BUTTON_REPEAT) +#define WPS_RC_NEXT_DIR (BUTTON_RC_BITRATE | BUTTON_REL) +#define WPS_RC_PREV_DIR (BUTTON_RC_SOURCE | BUTTON_REL) #define WPS_RC_NEXT (BUTTON_RC_FF | BUTTON_REL) #define WPS_RC_NEXT_PRE BUTTON_RC_FF #define WPS_RC_PREV (BUTTON_RC_REW | BUTTON_REL) |