diff options
Diffstat (limited to 'apps')
-rw-r--r-- | apps/lang/english.lang | 15 | ||||
-rw-r--r-- | apps/playlist.c | 47 | ||||
-rw-r--r-- | apps/screens.c | 35 | ||||
-rw-r--r-- | apps/settings.c | 7 | ||||
-rw-r--r-- | apps/settings.h | 5 | ||||
-rw-r--r-- | apps/settings_menu.c | 23 | ||||
-rw-r--r-- | apps/status.c | 2 | ||||
-rw-r--r-- | apps/wps-display.c | 1 | ||||
-rw-r--r-- | apps/wps.c | 9 |
9 files changed, 121 insertions, 23 deletions
diff --git a/apps/lang/english.lang b/apps/lang/english.lang index b67277ba1c..5c7b0a3b86 100644 --- a/apps/lang/english.lang +++ b/apps/lang/english.lang | |||
@@ -869,3 +869,18 @@ id: LANG_BACKLIGHT_ON_WHEN_CHARGING | |||
869 | desc: in display_settings_menu | 869 | desc: in display_settings_menu |
870 | eng: "Backlight on when charging" | 870 | eng: "Backlight on when charging" |
871 | new: | 871 | new: |
872 | |||
873 | id: LANG_REPEAT | ||
874 | desc: in settings_menu | ||
875 | eng: "Repeat" | ||
876 | new: | ||
877 | |||
878 | id: LANG_REPEAT_ALL | ||
879 | desc: repeat playlist once all songs have completed | ||
880 | eng: "All" | ||
881 | new: | ||
882 | |||
883 | id: LANG_REPEAT_ONE | ||
884 | desc: repeat one song | ||
885 | eng: "One" | ||
886 | new: | ||
diff --git a/apps/playlist.c b/apps/playlist.c index b81aed8763..038e710829 100644 --- a/apps/playlist.c +++ b/apps/playlist.c | |||
@@ -66,15 +66,37 @@ int playlist_add(char *filename) | |||
66 | return 0; | 66 | return 0; |
67 | } | 67 | } |
68 | 68 | ||
69 | int playlist_next(int steps) | 69 | static int get_next_index(int steps) |
70 | { | 70 | { |
71 | playlist.index = (playlist.index+steps) % playlist.amount; | 71 | int next_index = -1; |
72 | while ( playlist.index < 0 ) { | 72 | |
73 | if ( global_settings.loop_playlist ) | 73 | switch (global_settings.repeat_mode) |
74 | playlist.index += playlist.amount; | 74 | { |
75 | else | 75 | case REPEAT_OFF: |
76 | playlist.index = 0; | 76 | next_index = playlist.index+steps; |
77 | if ((next_index < 0) || (next_index >= playlist.amount)) | ||
78 | next_index = -1; | ||
79 | break; | ||
80 | |||
81 | case REPEAT_ONE: | ||
82 | next_index = playlist.index; | ||
83 | break; | ||
84 | |||
85 | case REPEAT_ALL: | ||
86 | default: | ||
87 | next_index = (playlist.index+steps) % playlist.amount; | ||
88 | while (next_index < 0) | ||
89 | next_index += playlist.amount; | ||
90 | break; | ||
77 | } | 91 | } |
92 | |||
93 | return next_index; | ||
94 | } | ||
95 | |||
96 | int playlist_next(int steps) | ||
97 | { | ||
98 | playlist.index = get_next_index(steps); | ||
99 | |||
78 | return playlist.index; | 100 | return playlist.index; |
79 | } | 101 | } |
80 | 102 | ||
@@ -93,14 +115,11 @@ char* playlist_peek(int steps) | |||
93 | /* prevent madness when all files are empty/bad */ | 115 | /* prevent madness when all files are empty/bad */ |
94 | return NULL; | 116 | return NULL; |
95 | 117 | ||
96 | index = (playlist.index+steps) % playlist.amount; | 118 | index = get_next_index(steps); |
97 | while ( index < 0 ) { | 119 | if (index >= 0) |
98 | if ( global_settings.loop_playlist ) | ||
99 | index += playlist.amount; | ||
100 | else | ||
101 | index = 0; | ||
102 | } | ||
103 | seek = playlist.indices[index]; | 120 | seek = playlist.indices[index]; |
121 | else | ||
122 | return NULL; | ||
104 | 123 | ||
105 | if(playlist.in_ram) | 124 | if(playlist.in_ram) |
106 | { | 125 | { |
diff --git a/apps/screens.c b/apps/screens.c index 450fdfaaa4..81ed976a61 100644 --- a/apps/screens.c +++ b/apps/screens.c | |||
@@ -164,6 +164,7 @@ bool f2_screen(void) | |||
164 | bool used = false; | 164 | bool used = false; |
165 | int w, h; | 165 | int w, h; |
166 | char buf[32]; | 166 | char buf[32]; |
167 | int oldrepeat = global_settings.repeat_mode; | ||
167 | 168 | ||
168 | /* Get the font height */ | 169 | /* Get the font height */ |
169 | lcd_getstringsize("A",&w,&h); | 170 | lcd_getstringsize("A",&w,&h); |
@@ -176,6 +177,7 @@ bool f2_screen(void) | |||
176 | 177 | ||
177 | lcd_clear_display(); | 178 | lcd_clear_display(); |
178 | 179 | ||
180 | /* Shuffle mode */ | ||
179 | lcd_putsxy(0, LCD_HEIGHT/2 - h*2, str(LANG_SHUFFLE)); | 181 | lcd_putsxy(0, LCD_HEIGHT/2 - h*2, str(LANG_SHUFFLE)); |
180 | lcd_putsxy(0, LCD_HEIGHT/2 - h, str(LANG_F2_MODE)); | 182 | lcd_putsxy(0, LCD_HEIGHT/2 - h, str(LANG_F2_MODE)); |
181 | lcd_putsxy(0, LCD_HEIGHT/2, | 183 | lcd_putsxy(0, LCD_HEIGHT/2, |
@@ -184,6 +186,7 @@ bool f2_screen(void) | |||
184 | lcd_bitmap(bitmap_icons_7x8[Icon_FastBackward], | 186 | lcd_bitmap(bitmap_icons_7x8[Icon_FastBackward], |
185 | LCD_WIDTH/2 - 16, LCD_HEIGHT/2 - 4, 7, 8, true); | 187 | LCD_WIDTH/2 - 16, LCD_HEIGHT/2 - 4, 7, 8, true); |
186 | 188 | ||
189 | /* Directory Filter */ | ||
187 | switch ( global_settings.dirfilter ) { | 190 | switch ( global_settings.dirfilter ) { |
188 | case SHOW_ALL: | 191 | case SHOW_ALL: |
189 | ptr = str(LANG_FILTER_ALL); | 192 | ptr = str(LANG_FILTER_ALL); |
@@ -206,6 +209,28 @@ bool f2_screen(void) | |||
206 | lcd_bitmap(bitmap_icons_7x8[Icon_DownArrow], | 209 | lcd_bitmap(bitmap_icons_7x8[Icon_DownArrow], |
207 | LCD_WIDTH/2 - 3, LCD_HEIGHT - h*3, 7, 8, true); | 210 | LCD_WIDTH/2 - 3, LCD_HEIGHT - h*3, 7, 8, true); |
208 | 211 | ||
212 | /* Repeat Mode */ | ||
213 | switch ( global_settings.repeat_mode ) { | ||
214 | case REPEAT_OFF: | ||
215 | ptr = str(LANG_OFF); | ||
216 | break; | ||
217 | |||
218 | case REPEAT_ALL: | ||
219 | ptr = str(LANG_REPEAT_ALL); | ||
220 | break; | ||
221 | |||
222 | case REPEAT_ONE: | ||
223 | ptr = str(LANG_REPEAT_ONE); | ||
224 | break; | ||
225 | } | ||
226 | |||
227 | lcd_getstringsize(str(LANG_REPEAT),&w,&h); | ||
228 | lcd_putsxy(LCD_WIDTH - w, LCD_HEIGHT/2 - h*2, str(LANG_REPEAT)); | ||
229 | lcd_putsxy(LCD_WIDTH - w, LCD_HEIGHT/2 - h, str(LANG_F2_MODE)); | ||
230 | lcd_putsxy(LCD_WIDTH - w, LCD_HEIGHT/2, ptr); | ||
231 | lcd_bitmap(bitmap_icons_7x8[Icon_FastForward], | ||
232 | LCD_WIDTH/2 + 8, LCD_HEIGHT/2 - 4, 7, 8, true); | ||
233 | |||
209 | lcd_update(); | 234 | lcd_update(); |
210 | 235 | ||
211 | switch (button_get(true)) { | 236 | switch (button_get(true)) { |
@@ -229,6 +254,14 @@ bool f2_screen(void) | |||
229 | used = true; | 254 | used = true; |
230 | break; | 255 | break; |
231 | 256 | ||
257 | case BUTTON_RIGHT: | ||
258 | case BUTTON_F2 | BUTTON_RIGHT: | ||
259 | global_settings.repeat_mode++; | ||
260 | if ( global_settings.repeat_mode >= NUM_REPEAT_MODES ) | ||
261 | global_settings.repeat_mode = 0; | ||
262 | used = true; | ||
263 | break; | ||
264 | |||
232 | case BUTTON_F2 | BUTTON_REL: | 265 | case BUTTON_F2 | BUTTON_REL: |
233 | if ( used ) | 266 | if ( used ) |
234 | exit = true; | 267 | exit = true; |
@@ -247,6 +280,8 @@ bool f2_screen(void) | |||
247 | 280 | ||
248 | settings_save(); | 281 | settings_save(); |
249 | lcd_setfont(FONT_UI); | 282 | lcd_setfont(FONT_UI); |
283 | if ( oldrepeat != global_settings.repeat_mode ) | ||
284 | mpeg_flush_and_reload_tracks(); | ||
250 | 285 | ||
251 | return false; | 286 | return false; |
252 | } | 287 | } |
diff --git a/apps/settings.c b/apps/settings.c index cc09d60884..0ba72df110 100644 --- a/apps/settings.c +++ b/apps/settings.c | |||
@@ -91,6 +91,7 @@ offset abs | |||
91 | 0x1c 0x30 <peak meter hold timeout (bit 0-4)> | 91 | 0x1c 0x30 <peak meter hold timeout (bit 0-4)> |
92 | 0x1d 0x31 <peak meter clip hold timeout (bit 0-4)> | 92 | 0x1d 0x31 <peak meter clip hold timeout (bit 0-4)> |
93 | 0x1e 0x32 <peak meter release step size> | 93 | 0x1e 0x32 <peak meter release step size> |
94 | 0x1f 0x33 <repeat mode> | ||
94 | 95 | ||
95 | <all unused space filled with 0xff> | 96 | <all unused space filled with 0xff> |
96 | 97 | ||
@@ -313,6 +314,7 @@ int settings_save( void ) | |||
313 | config_block[0x1c] = (unsigned char)global_settings.peak_meter_hold; | 314 | config_block[0x1c] = (unsigned char)global_settings.peak_meter_hold; |
314 | config_block[0x1d] = (unsigned char)global_settings.peak_meter_clip_hold; | 315 | config_block[0x1d] = (unsigned char)global_settings.peak_meter_clip_hold; |
315 | config_block[0x1e] = (unsigned char)global_settings.peak_meter_release; | 316 | config_block[0x1e] = (unsigned char)global_settings.peak_meter_release; |
317 | config_block[0x1f] = (unsigned char)global_settings.repeat_mode; | ||
316 | 318 | ||
317 | memcpy(&config_block[0xF8], &global_settings.resume_seed, 4); | 319 | memcpy(&config_block[0xF8], &global_settings.resume_seed, 4); |
318 | 320 | ||
@@ -466,6 +468,9 @@ void settings_load(void) | |||
466 | if (config_block[0x1e] != 0xFF) | 468 | if (config_block[0x1e] != 0xFF) |
467 | global_settings.peak_meter_release = config_block[0x1e]; | 469 | global_settings.peak_meter_release = config_block[0x1e]; |
468 | 470 | ||
471 | if (config_block[0x1f] != 0xFF) | ||
472 | global_settings.repeat_mode = config_block[0x1f]; | ||
473 | |||
469 | memcpy(&global_settings.resume_seed, &config_block[0xF8], 4); | 474 | memcpy(&global_settings.resume_seed, &config_block[0xF8], 4); |
470 | 475 | ||
471 | if (config_block[0x24] != 0xFF) | 476 | if (config_block[0x24] != 0xFF) |
@@ -623,7 +628,7 @@ void settings_reset(void) { | |||
623 | global_settings.sort_case = false; | 628 | global_settings.sort_case = false; |
624 | global_settings.statusbar = true; | 629 | global_settings.statusbar = true; |
625 | global_settings.scrollbar = true; | 630 | global_settings.scrollbar = true; |
626 | global_settings.loop_playlist = true; | 631 | global_settings.repeat_mode = REPEAT_ALL; |
627 | global_settings.playlist_shuffle = false; | 632 | global_settings.playlist_shuffle = false; |
628 | global_settings.discharge = 0; | 633 | global_settings.discharge = 0; |
629 | global_settings.total_uptime = 0; | 634 | global_settings.total_uptime = 0; |
diff --git a/apps/settings.h b/apps/settings.h index 35c345aaad..b30d8aa744 100644 --- a/apps/settings.h +++ b/apps/settings.h | |||
@@ -77,7 +77,7 @@ struct user_settings | |||
77 | 77 | ||
78 | /* misc options */ | 78 | /* misc options */ |
79 | 79 | ||
80 | int loop_playlist; /* do we return to top of playlist at end? */ | 80 | int repeat_mode; /* 0=off 1=repeat all 2=repeat one */ |
81 | int dirfilter; /* 0=display all, 1=only supported, 2=only music */ | 81 | int dirfilter; /* 0=display all, 1=only supported, 2=only music */ |
82 | bool sort_case; /* dir sort order: 0=case insensitive, 1=sensitive */ | 82 | bool sort_case; /* dir sort order: 0=case insensitive, 1=sensitive */ |
83 | int scroll_speed; /* long texts scrolling speed: 1-30 */ | 83 | int scroll_speed; /* long texts scrolling speed: 1-30 */ |
@@ -151,6 +151,9 @@ extern char rockboxdir[]; | |||
151 | #define DEFAULT_FF_REWIND_MIN_STEP FF_REWIND_1000 | 151 | #define DEFAULT_FF_REWIND_MIN_STEP FF_REWIND_1000 |
152 | #define DEFAULT_FF_REWIND_ACCEL_SETTING 3 | 152 | #define DEFAULT_FF_REWIND_ACCEL_SETTING 3 |
153 | 153 | ||
154 | /* repeat mode options */ | ||
155 | enum { REPEAT_OFF, REPEAT_ALL, REPEAT_ONE, NUM_REPEAT_MODES }; | ||
156 | |||
154 | /* dir filter options */ | 157 | /* dir filter options */ |
155 | enum { SHOW_ALL, SHOW_SUPPORTED, SHOW_MUSIC, NUM_FILTER_MODES }; | 158 | enum { SHOW_ALL, SHOW_SUPPORTED, SHOW_MUSIC, NUM_FILTER_MODES }; |
156 | 159 | ||
diff --git a/apps/settings_menu.c b/apps/settings_menu.c index 49e2fe431e..5d130e9cda 100644 --- a/apps/settings_menu.c +++ b/apps/settings_menu.c | |||
@@ -109,12 +109,28 @@ static bool peak_meter_menu(void) | |||
109 | } | 109 | } |
110 | #endif | 110 | #endif |
111 | 111 | ||
112 | #ifndef HAVE_RECORDER_KEYPAD | ||
113 | static bool shuffle(void) | 112 | static bool shuffle(void) |
114 | { | 113 | { |
115 | return set_bool( str(LANG_SHUFFLE), &global_settings.playlist_shuffle ); | 114 | return set_bool( str(LANG_SHUFFLE), &global_settings.playlist_shuffle ); |
116 | } | 115 | } |
117 | #endif | 116 | |
117 | static bool repeat_mode(void) | ||
118 | { | ||
119 | bool result; | ||
120 | char* names[] = { str(LANG_OFF), | ||
121 | str(LANG_REPEAT_ALL), | ||
122 | str(LANG_REPEAT_ONE) }; | ||
123 | |||
124 | int old_repeat = global_settings.repeat_mode; | ||
125 | |||
126 | result = set_option( str(LANG_REPEAT), &global_settings.repeat_mode, | ||
127 | names, 3, NULL ); | ||
128 | |||
129 | if (old_repeat != global_settings.repeat_mode) | ||
130 | mpeg_flush_and_reload_tracks(); | ||
131 | |||
132 | return result; | ||
133 | } | ||
118 | 134 | ||
119 | static bool play_selected(void) | 135 | static bool play_selected(void) |
120 | { | 136 | { |
@@ -299,9 +315,8 @@ static bool playback_settings_menu(void) | |||
299 | bool result; | 315 | bool result; |
300 | 316 | ||
301 | struct menu_items items[] = { | 317 | struct menu_items items[] = { |
302 | #ifndef HAVE_RECORDER_KEYPAD | ||
303 | { str(LANG_SHUFFLE), shuffle }, | 318 | { str(LANG_SHUFFLE), shuffle }, |
304 | #endif | 319 | { str(LANG_REPEAT), repeat_mode }, |
305 | { str(LANG_PLAY_SELECTED), play_selected }, | 320 | { str(LANG_PLAY_SELECTED), play_selected }, |
306 | { str(LANG_RESUME), resume }, | 321 | { str(LANG_RESUME), resume }, |
307 | { str(LANG_FFRW_STEP), ff_rewind_min_step }, | 322 | { str(LANG_FFRW_STEP), ff_rewind_min_step }, |
diff --git a/apps/status.c b/apps/status.c index 410728484e..1de837f28b 100644 --- a/apps/status.c +++ b/apps/status.c | |||
@@ -191,7 +191,7 @@ void status_draw(void) | |||
191 | #endif | 191 | #endif |
192 | statusbar_icon_volume(volume); | 192 | statusbar_icon_volume(volume); |
193 | statusbar_icon_play_state(current_mode + Icon_Play); | 193 | statusbar_icon_play_state(current_mode + Icon_Play); |
194 | if (global_settings.loop_playlist) | 194 | if (global_settings.repeat_mode != REPEAT_OFF) |
195 | statusbar_icon_play_mode(Icon_Repeat); | 195 | statusbar_icon_play_mode(Icon_Repeat); |
196 | else | 196 | else |
197 | statusbar_icon_play_mode(Icon_Normal); | 197 | statusbar_icon_play_mode(Icon_Normal); |
diff --git a/apps/wps-display.c b/apps/wps-display.c index 822b1875e0..3f94a09b9e 100644 --- a/apps/wps-display.c +++ b/apps/wps-display.c | |||
@@ -543,7 +543,6 @@ bool wps_refresh(struct mp3entry* id3, int ffwd_offset, bool refresh_all) | |||
543 | if (!id3) | 543 | if (!id3) |
544 | { | 544 | { |
545 | lcd_stop_scroll(); | 545 | lcd_stop_scroll(); |
546 | lcd_clear_display(); | ||
547 | return false; | 546 | return false; |
548 | } | 547 | } |
549 | 548 | ||
diff --git a/apps/wps.c b/apps/wps.c index db4459c465..4f1fd504f3 100644 --- a/apps/wps.c +++ b/apps/wps.c | |||
@@ -411,7 +411,9 @@ static bool ffwd_rew(int button) | |||
411 | 411 | ||
412 | static void update(void) | 412 | static void update(void) |
413 | { | 413 | { |
414 | if (mpeg_has_changed_track()) | 414 | bool track_changed = mpeg_has_changed_track(); |
415 | |||
416 | if (track_changed) | ||
415 | { | 417 | { |
416 | lcd_stop_scroll(); | 418 | lcd_stop_scroll(); |
417 | id3 = mpeg_current_track(); | 419 | id3 = mpeg_current_track(); |
@@ -435,6 +437,11 @@ static void update(void) | |||
435 | global_settings.resume_offset = id3->offset; | 437 | global_settings.resume_offset = id3->offset; |
436 | settings_save(); | 438 | settings_save(); |
437 | } | 439 | } |
440 | else if ( !id3 && track_changed ) { | ||
441 | global_settings.resume_index = -1; | ||
442 | global_settings.resume_offset = -1; | ||
443 | settings_save(); | ||
444 | } | ||
438 | } | 445 | } |
439 | 446 | ||
440 | 447 | ||