Store the first index of the playlist and use it when calculating the next index in repeat off mode so that shuffled dirplay works correctly when "play selected" is enabled.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@2514 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Hardeep Sidhu 2002-10-06 05:50:41 +00:00
parent ac2e0f1c32
commit 83611fe8c3
5 changed files with 38 additions and 16 deletions

View File

@ -68,23 +68,30 @@ int playlist_add(char *filename)
static int get_next_index(int steps)
{
int next_index = -1;
int current_index = playlist.index;
int next_index = -1;
switch (global_settings.repeat_mode)
{
case REPEAT_OFF:
next_index = playlist.index+steps;
if (current_index < playlist.first_index)
current_index += playlist.amount;
current_index -= playlist.first_index;
next_index = current_index+steps;
if ((next_index < 0) || (next_index >= playlist.amount))
next_index = -1;
else
next_index = (next_index+playlist.first_index)%playlist.amount;
break;
case REPEAT_ONE:
next_index = playlist.index;
next_index = current_index;
break;
case REPEAT_ALL:
default:
next_index = (playlist.index+steps) % playlist.amount;
next_index = (current_index+steps) % playlist.amount;
while (next_index < 0)
next_index += playlist.amount;
break;
@ -212,13 +219,15 @@ int play_list(char *dir, /* "current directory" */
bool shuffled_index, /* if TRUE the specified index is for the
playlist AFTER the shuffle */
int start_offset, /* offset in the file */
int random_seed ) /* used for shuffling */
int random_seed, /* used for shuffling */
int first_index ) /* first index of playlist */
{
char *sep="";
int dirlen;
empty_playlist();
playlist.index = start_index;
playlist.first_index = first_index;
#ifdef HAVE_LCD_BITMAP
if(global_settings.statusbar)
@ -283,6 +292,7 @@ int play_list(char *dir, /* "current directory" */
if(seek_pos == playlist.indices[i]) {
/* here's the start song! yiepee! */
playlist.index = i;
playlist.first_index = i;
break; /* now stop searching */
}
}

View File

@ -28,10 +28,11 @@
struct playlist_info
{
char filename[MAX_PATH]; /* path name of m3u playlist on disk */
char filename[MAX_PATH]; /* path name of m3u playlist on disk */
int dirlen; /* Length of the path to the playlist file */
int indices[MAX_PLAYLIST_SIZE]; /* array of indices */
int index; /* index of *NEXT* track to play */
int index; /* index of current playing track */
int first_index; /* index of first song in playlist */
int seed; /* random seed */
int amount; /* number of tracks in the index */
bool in_ram; /* True if the playlist is RAM-based */
@ -41,7 +42,8 @@ extern struct playlist_info playlist;
extern bool playlist_shuffle;
int play_list(char *dir, char *file, int start_index,
bool shuffled_index, int start_offset, int random_seed );
bool shuffled_index, int start_offset,
int random_seed, int first_index);
char* playlist_peek(int steps);
int playlist_next(int steps);
void randomise_playlist( unsigned int seed );

View File

@ -112,6 +112,7 @@ modified unless the header & checksum test fails.
Rest of config block, only saved to disk:
0xF4 (int) Playlist first index
0xF8 (int) Playlist shuffle seed
0xFC (char[260]) Resume playlist (path/to/dir or path/to/playlist.m3u)
@ -316,9 +317,11 @@ int settings_save( void )
config_block[0x1e] = (unsigned char)global_settings.peak_meter_release;
config_block[0x1f] = (unsigned char)global_settings.repeat_mode;
memcpy(&config_block[0x24], &global_settings.total_uptime, 4);
memcpy(&config_block[0xF4], &global_settings.resume_first_index, 4);
memcpy(&config_block[0xF8], &global_settings.resume_seed, 4);
memcpy(&config_block[0x24], &global_settings.total_uptime, 4);
strncpy(&config_block[0xFC], global_settings.resume_file, MAX_PATH);
DEBUGF("+Resume file %s\n",global_settings.resume_file);
@ -471,11 +474,12 @@ void settings_load(void)
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)
memcpy(&global_settings.total_uptime, &config_block[0x24], 4);
memcpy(&global_settings.resume_first_index, &config_block[0xF4], 4);
memcpy(&global_settings.resume_seed, &config_block[0xF8], 4);
strncpy(global_settings.resume_file, &config_block[0xFC], MAX_PATH);
global_settings.resume_file[MAX_PATH]=0;
}

View File

@ -73,6 +73,7 @@ struct user_settings
int resume_index; /* index in playlist (-1 for no active resume) */
int resume_offset; /* byte offset in mp3 file */
int resume_seed; /* random seed for playlist shuffle */
int resume_first_index; /* first index of playlist */
unsigned char resume_file[MAX_PATH+1]; /* playlist name (or dir) */
/* misc options */

View File

@ -505,7 +505,8 @@ void start_resume(void)
global_settings.resume_index,
true, /* the index is AFTER shuffle */
global_settings.resume_offset,
global_settings.resume_seed );
global_settings.resume_seed,
global_settings.resume_first_index);
*slash='/';
}
else {
@ -523,7 +524,8 @@ void start_resume(void)
global_settings.resume_index,
true,
global_settings.resume_offset,
global_settings.resume_seed );
global_settings.resume_seed,
global_settings.resume_first_index);
}
}
else {
@ -541,7 +543,8 @@ void start_resume(void)
global_settings.resume_index,
true,
global_settings.resume_offset,
global_settings.resume_seed);
global_settings.resume_seed,
global_settings.resume_first_index);
}
status_set_playmode(STATUS_PLAY);
@ -775,7 +778,8 @@ bool dirbrowse(char *root)
snprintf(global_settings.resume_file,
MAX_PATH, "%s/%s",
currdir, file->name);
play_list(currdir, file->name, 0, false, 0, seed );
play_list(currdir, file->name, 0, false, 0,
seed, 0);
start_index = 0;
play = true;
break;
@ -790,7 +794,7 @@ bool dirbrowse(char *root)
the (shuffled) list and stor that */
start_index = play_list(currdir, NULL,
start_index, false,
0, seed);
0, seed, 0);
play = true;
break;
@ -872,6 +876,7 @@ bool dirbrowse(char *root)
shuffled list in case shuffle is enabled */
global_settings.resume_index = start_index;
global_settings.resume_offset = 0;
global_settings.resume_first_index = start_index;
global_settings.resume_seed = seed;
settings_save();
}