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:
Björn Stenberg 2002-10-04 08:48:20 +00:00
parent a31bae655e
commit a6d0abb602
10 changed files with 139 additions and 28 deletions

View File

@ -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:

View File

@ -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)
{

View File

@ -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;
}

View File

@ -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;

View File

@ -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 };

View File

@ -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 },

View File

@ -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);

View File

@ -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;
}

View File

@ -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();
}
}

View File

@ -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);