Repeat off/all/one toggle. By Hardeep Sidhu.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@2498 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
a31bae655e
commit
a6d0abb602
|
@ -869,3 +869,18 @@ id: LANG_BACKLIGHT_ON_WHEN_CHARGING
|
|||
desc: in display_settings_menu
|
||||
eng: "Backlight on when charging"
|
||||
new:
|
||||
|
||||
id: LANG_REPEAT
|
||||
desc: in settings_menu
|
||||
eng: "Repeat"
|
||||
new:
|
||||
|
||||
id: LANG_REPEAT_ALL
|
||||
desc: repeat playlist once all songs have completed
|
||||
eng: "All"
|
||||
new:
|
||||
|
||||
id: LANG_REPEAT_ONE
|
||||
desc: repeat one song
|
||||
eng: "One"
|
||||
new:
|
||||
|
|
|
@ -66,15 +66,37 @@ int playlist_add(char *filename)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int get_next_index(int steps)
|
||||
{
|
||||
int next_index = -1;
|
||||
|
||||
switch (global_settings.repeat_mode)
|
||||
{
|
||||
case REPEAT_OFF:
|
||||
next_index = playlist.index+steps;
|
||||
if ((next_index < 0) || (next_index >= playlist.amount))
|
||||
next_index = -1;
|
||||
break;
|
||||
|
||||
case REPEAT_ONE:
|
||||
next_index = playlist.index;
|
||||
break;
|
||||
|
||||
case REPEAT_ALL:
|
||||
default:
|
||||
next_index = (playlist.index+steps) % playlist.amount;
|
||||
while (next_index < 0)
|
||||
next_index += playlist.amount;
|
||||
break;
|
||||
}
|
||||
|
||||
return next_index;
|
||||
}
|
||||
|
||||
int playlist_next(int steps)
|
||||
{
|
||||
playlist.index = (playlist.index+steps) % playlist.amount;
|
||||
while ( playlist.index < 0 ) {
|
||||
if ( global_settings.loop_playlist )
|
||||
playlist.index += playlist.amount;
|
||||
else
|
||||
playlist.index = 0;
|
||||
}
|
||||
playlist.index = get_next_index(steps);
|
||||
|
||||
return playlist.index;
|
||||
}
|
||||
|
||||
|
@ -93,14 +115,11 @@ char* playlist_peek(int steps)
|
|||
/* prevent madness when all files are empty/bad */
|
||||
return NULL;
|
||||
|
||||
index = (playlist.index+steps) % playlist.amount;
|
||||
while ( index < 0 ) {
|
||||
if ( global_settings.loop_playlist )
|
||||
index += playlist.amount;
|
||||
else
|
||||
index = 0;
|
||||
}
|
||||
index = get_next_index(steps);
|
||||
if (index >= 0)
|
||||
seek = playlist.indices[index];
|
||||
else
|
||||
return NULL;
|
||||
|
||||
if(playlist.in_ram)
|
||||
{
|
||||
|
|
|
@ -164,6 +164,7 @@ bool f2_screen(void)
|
|||
bool used = false;
|
||||
int w, h;
|
||||
char buf[32];
|
||||
int oldrepeat = global_settings.repeat_mode;
|
||||
|
||||
/* Get the font height */
|
||||
lcd_getstringsize("A",&w,&h);
|
||||
|
@ -176,6 +177,7 @@ bool f2_screen(void)
|
|||
|
||||
lcd_clear_display();
|
||||
|
||||
/* Shuffle mode */
|
||||
lcd_putsxy(0, LCD_HEIGHT/2 - h*2, str(LANG_SHUFFLE));
|
||||
lcd_putsxy(0, LCD_HEIGHT/2 - h, str(LANG_F2_MODE));
|
||||
lcd_putsxy(0, LCD_HEIGHT/2,
|
||||
|
@ -184,6 +186,7 @@ bool f2_screen(void)
|
|||
lcd_bitmap(bitmap_icons_7x8[Icon_FastBackward],
|
||||
LCD_WIDTH/2 - 16, LCD_HEIGHT/2 - 4, 7, 8, true);
|
||||
|
||||
/* Directory Filter */
|
||||
switch ( global_settings.dirfilter ) {
|
||||
case SHOW_ALL:
|
||||
ptr = str(LANG_FILTER_ALL);
|
||||
|
@ -206,6 +209,28 @@ bool f2_screen(void)
|
|||
lcd_bitmap(bitmap_icons_7x8[Icon_DownArrow],
|
||||
LCD_WIDTH/2 - 3, LCD_HEIGHT - h*3, 7, 8, true);
|
||||
|
||||
/* Repeat Mode */
|
||||
switch ( global_settings.repeat_mode ) {
|
||||
case REPEAT_OFF:
|
||||
ptr = str(LANG_OFF);
|
||||
break;
|
||||
|
||||
case REPEAT_ALL:
|
||||
ptr = str(LANG_REPEAT_ALL);
|
||||
break;
|
||||
|
||||
case REPEAT_ONE:
|
||||
ptr = str(LANG_REPEAT_ONE);
|
||||
break;
|
||||
}
|
||||
|
||||
lcd_getstringsize(str(LANG_REPEAT),&w,&h);
|
||||
lcd_putsxy(LCD_WIDTH - w, LCD_HEIGHT/2 - h*2, str(LANG_REPEAT));
|
||||
lcd_putsxy(LCD_WIDTH - w, LCD_HEIGHT/2 - h, str(LANG_F2_MODE));
|
||||
lcd_putsxy(LCD_WIDTH - w, LCD_HEIGHT/2, ptr);
|
||||
lcd_bitmap(bitmap_icons_7x8[Icon_FastForward],
|
||||
LCD_WIDTH/2 + 8, LCD_HEIGHT/2 - 4, 7, 8, true);
|
||||
|
||||
lcd_update();
|
||||
|
||||
switch (button_get(true)) {
|
||||
|
@ -229,6 +254,14 @@ bool f2_screen(void)
|
|||
used = true;
|
||||
break;
|
||||
|
||||
case BUTTON_RIGHT:
|
||||
case BUTTON_F2 | BUTTON_RIGHT:
|
||||
global_settings.repeat_mode++;
|
||||
if ( global_settings.repeat_mode >= NUM_REPEAT_MODES )
|
||||
global_settings.repeat_mode = 0;
|
||||
used = true;
|
||||
break;
|
||||
|
||||
case BUTTON_F2 | BUTTON_REL:
|
||||
if ( used )
|
||||
exit = true;
|
||||
|
@ -247,6 +280,8 @@ bool f2_screen(void)
|
|||
|
||||
settings_save();
|
||||
lcd_setfont(FONT_UI);
|
||||
if ( oldrepeat != global_settings.repeat_mode )
|
||||
mpeg_flush_and_reload_tracks();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -91,6 +91,7 @@ offset abs
|
|||
0x1c 0x30 <peak meter hold timeout (bit 0-4)>
|
||||
0x1d 0x31 <peak meter clip hold timeout (bit 0-4)>
|
||||
0x1e 0x32 <peak meter release step size>
|
||||
0x1f 0x33 <repeat mode>
|
||||
|
||||
<all unused space filled with 0xff>
|
||||
|
||||
|
@ -313,6 +314,7 @@ int settings_save( void )
|
|||
config_block[0x1c] = (unsigned char)global_settings.peak_meter_hold;
|
||||
config_block[0x1d] = (unsigned char)global_settings.peak_meter_clip_hold;
|
||||
config_block[0x1e] = (unsigned char)global_settings.peak_meter_release;
|
||||
config_block[0x1f] = (unsigned char)global_settings.repeat_mode;
|
||||
|
||||
memcpy(&config_block[0xF8], &global_settings.resume_seed, 4);
|
||||
|
||||
|
@ -466,6 +468,9 @@ void settings_load(void)
|
|||
if (config_block[0x1e] != 0xFF)
|
||||
global_settings.peak_meter_release = config_block[0x1e];
|
||||
|
||||
if (config_block[0x1f] != 0xFF)
|
||||
global_settings.repeat_mode = config_block[0x1f];
|
||||
|
||||
memcpy(&global_settings.resume_seed, &config_block[0xF8], 4);
|
||||
|
||||
if (config_block[0x24] != 0xFF)
|
||||
|
@ -623,7 +628,7 @@ void settings_reset(void) {
|
|||
global_settings.sort_case = false;
|
||||
global_settings.statusbar = true;
|
||||
global_settings.scrollbar = true;
|
||||
global_settings.loop_playlist = true;
|
||||
global_settings.repeat_mode = REPEAT_ALL;
|
||||
global_settings.playlist_shuffle = false;
|
||||
global_settings.discharge = 0;
|
||||
global_settings.total_uptime = 0;
|
||||
|
|
|
@ -77,7 +77,7 @@ struct user_settings
|
|||
|
||||
/* misc options */
|
||||
|
||||
int loop_playlist; /* do we return to top of playlist at end? */
|
||||
int repeat_mode; /* 0=off 1=repeat all 2=repeat one */
|
||||
int dirfilter; /* 0=display all, 1=only supported, 2=only music */
|
||||
bool sort_case; /* dir sort order: 0=case insensitive, 1=sensitive */
|
||||
int scroll_speed; /* long texts scrolling speed: 1-30 */
|
||||
|
@ -151,6 +151,9 @@ extern char rockboxdir[];
|
|||
#define DEFAULT_FF_REWIND_MIN_STEP FF_REWIND_1000
|
||||
#define DEFAULT_FF_REWIND_ACCEL_SETTING 3
|
||||
|
||||
/* repeat mode options */
|
||||
enum { REPEAT_OFF, REPEAT_ALL, REPEAT_ONE, NUM_REPEAT_MODES };
|
||||
|
||||
/* dir filter options */
|
||||
enum { SHOW_ALL, SHOW_SUPPORTED, SHOW_MUSIC, NUM_FILTER_MODES };
|
||||
|
||||
|
|
|
@ -109,12 +109,28 @@ static bool peak_meter_menu(void)
|
|||
}
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_RECORDER_KEYPAD
|
||||
static bool shuffle(void)
|
||||
{
|
||||
return set_bool( str(LANG_SHUFFLE), &global_settings.playlist_shuffle );
|
||||
}
|
||||
#endif
|
||||
|
||||
static bool repeat_mode(void)
|
||||
{
|
||||
bool result;
|
||||
char* names[] = { str(LANG_OFF),
|
||||
str(LANG_REPEAT_ALL),
|
||||
str(LANG_REPEAT_ONE) };
|
||||
|
||||
int old_repeat = global_settings.repeat_mode;
|
||||
|
||||
result = set_option( str(LANG_REPEAT), &global_settings.repeat_mode,
|
||||
names, 3, NULL );
|
||||
|
||||
if (old_repeat != global_settings.repeat_mode)
|
||||
mpeg_flush_and_reload_tracks();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static bool play_selected(void)
|
||||
{
|
||||
|
@ -299,9 +315,8 @@ static bool playback_settings_menu(void)
|
|||
bool result;
|
||||
|
||||
struct menu_items items[] = {
|
||||
#ifndef HAVE_RECORDER_KEYPAD
|
||||
{ str(LANG_SHUFFLE), shuffle },
|
||||
#endif
|
||||
{ str(LANG_REPEAT), repeat_mode },
|
||||
{ str(LANG_PLAY_SELECTED), play_selected },
|
||||
{ str(LANG_RESUME), resume },
|
||||
{ str(LANG_FFRW_STEP), ff_rewind_min_step },
|
||||
|
|
|
@ -191,7 +191,7 @@ void status_draw(void)
|
|||
#endif
|
||||
statusbar_icon_volume(volume);
|
||||
statusbar_icon_play_state(current_mode + Icon_Play);
|
||||
if (global_settings.loop_playlist)
|
||||
if (global_settings.repeat_mode != REPEAT_OFF)
|
||||
statusbar_icon_play_mode(Icon_Repeat);
|
||||
else
|
||||
statusbar_icon_play_mode(Icon_Normal);
|
||||
|
|
|
@ -543,7 +543,6 @@ bool wps_refresh(struct mp3entry* id3, int ffwd_offset, bool refresh_all)
|
|||
if (!id3)
|
||||
{
|
||||
lcd_stop_scroll();
|
||||
lcd_clear_display();
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -411,7 +411,9 @@ static bool ffwd_rew(int button)
|
|||
|
||||
static void update(void)
|
||||
{
|
||||
if (mpeg_has_changed_track())
|
||||
bool track_changed = mpeg_has_changed_track();
|
||||
|
||||
if (track_changed)
|
||||
{
|
||||
lcd_stop_scroll();
|
||||
id3 = mpeg_current_track();
|
||||
|
@ -435,6 +437,11 @@ static void update(void)
|
|||
global_settings.resume_offset = id3->offset;
|
||||
settings_save();
|
||||
}
|
||||
else if ( !id3 && track_changed ) {
|
||||
global_settings.resume_index = -1;
|
||||
global_settings.resume_offset = -1;
|
||||
settings_save();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -733,8 +733,11 @@ static void update_playlist(void)
|
|||
{
|
||||
int index;
|
||||
|
||||
if (num_tracks_in_memory() > 0)
|
||||
{
|
||||
index = playlist_next(id3tags[tag_read_idx]->id3.index);
|
||||
id3tags[tag_read_idx]->id3.index = index;
|
||||
}
|
||||
}
|
||||
|
||||
static void track_change(void)
|
||||
|
@ -878,15 +881,15 @@ static void mpeg_thread(void)
|
|||
|
||||
case MPEG_NEXT:
|
||||
DEBUGF("MPEG_NEXT\n");
|
||||
/* is next track in ram? */
|
||||
if ( num_tracks_in_memory() > 1 ) {
|
||||
int unplayed_space_left, unswapped_space_left;
|
||||
|
||||
/* stop the current stream */
|
||||
play_pending = false;
|
||||
playing = false;
|
||||
stop_dma();
|
||||
|
||||
/* is next track in ram? */
|
||||
if ( num_tracks_in_memory() > 1 ) {
|
||||
int unplayed_space_left, unswapped_space_left;
|
||||
|
||||
track_change();
|
||||
mp3buf_read = id3tags[tag_read_idx]->mempos;
|
||||
init_dma();
|
||||
|
@ -912,6 +915,14 @@ static void mpeg_thread(void)
|
|||
}
|
||||
}
|
||||
else {
|
||||
if (!playlist_peek(1))
|
||||
break;
|
||||
|
||||
/* stop the current stream */
|
||||
play_pending = false;
|
||||
playing = false;
|
||||
stop_dma();
|
||||
|
||||
reset_mp3_buffer();
|
||||
remove_all_tags();
|
||||
|
||||
|
@ -940,6 +951,8 @@ static void mpeg_thread(void)
|
|||
case MPEG_PREV: {
|
||||
int numtracks = num_tracks_in_memory();
|
||||
DEBUGF("MPEG_PREV\n");
|
||||
if (!playlist_peek(-1))
|
||||
break;
|
||||
/* stop the current stream */
|
||||
play_pending = false;
|
||||
playing = false;
|
||||
|
@ -1162,7 +1175,7 @@ static void mpeg_thread(void)
|
|||
case MPEG_SWAP_DATA:
|
||||
free_space_left = get_unswapped_space();
|
||||
|
||||
if(free_space_left == 0)
|
||||
if(free_space_left == 0 && !play_pending)
|
||||
break;
|
||||
|
||||
amount_to_swap = MIN(MPEG_SWAP_CHUNKSIZE, free_space_left);
|
||||
|
|
Loading…
Reference in New Issue
Block a user