summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorHardeep Sidhu <dyp@pobox.com>2002-10-06 05:50:41 +0000
committerHardeep Sidhu <dyp@pobox.com>2002-10-06 05:50:41 +0000
commit83611fe8c32d99bb463358f5ec8e0ebe466f1f42 (patch)
treeb91fa4d1e70adbccb10978b64db3c5d721b4b71c /apps
parentac2e0f1c3286edff9027404d4d15bc5e2445a4a2 (diff)
downloadrockbox-83611fe8c32d99bb463358f5ec8e0ebe466f1f42.tar.gz
rockbox-83611fe8c32d99bb463358f5ec8e0ebe466f1f42.zip
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
Diffstat (limited to 'apps')
-rw-r--r--apps/playlist.c20
-rw-r--r--apps/playlist.h8
-rw-r--r--apps/settings.c10
-rw-r--r--apps/settings.h1
-rw-r--r--apps/tree.c15
5 files changed, 38 insertions, 16 deletions
diff --git a/apps/playlist.c b/apps/playlist.c
index 038e710829..23c3f5d606 100644
--- a/apps/playlist.c
+++ b/apps/playlist.c
@@ -68,23 +68,30 @@ int playlist_add(char *filename)
68 68
69static int get_next_index(int steps) 69static int get_next_index(int steps)
70{ 70{
71 int next_index = -1; 71 int current_index = playlist.index;
72 int next_index = -1;
72 73
73 switch (global_settings.repeat_mode) 74 switch (global_settings.repeat_mode)
74 { 75 {
75 case REPEAT_OFF: 76 case REPEAT_OFF:
76 next_index = playlist.index+steps; 77 if (current_index < playlist.first_index)
78 current_index += playlist.amount;
79 current_index -= playlist.first_index;
80
81 next_index = current_index+steps;
77 if ((next_index < 0) || (next_index >= playlist.amount)) 82 if ((next_index < 0) || (next_index >= playlist.amount))
78 next_index = -1; 83 next_index = -1;
84 else
85 next_index = (next_index+playlist.first_index)%playlist.amount;
79 break; 86 break;
80 87
81 case REPEAT_ONE: 88 case REPEAT_ONE:
82 next_index = playlist.index; 89 next_index = current_index;
83 break; 90 break;
84 91
85 case REPEAT_ALL: 92 case REPEAT_ALL:
86 default: 93 default:
87 next_index = (playlist.index+steps) % playlist.amount; 94 next_index = (current_index+steps) % playlist.amount;
88 while (next_index < 0) 95 while (next_index < 0)
89 next_index += playlist.amount; 96 next_index += playlist.amount;
90 break; 97 break;
@@ -212,13 +219,15 @@ int play_list(char *dir, /* "current directory" */
212 bool shuffled_index, /* if TRUE the specified index is for the 219 bool shuffled_index, /* if TRUE the specified index is for the
213 playlist AFTER the shuffle */ 220 playlist AFTER the shuffle */
214 int start_offset, /* offset in the file */ 221 int start_offset, /* offset in the file */
215 int random_seed ) /* used for shuffling */ 222 int random_seed, /* used for shuffling */
223 int first_index ) /* first index of playlist */
216{ 224{
217 char *sep=""; 225 char *sep="";
218 int dirlen; 226 int dirlen;
219 empty_playlist(); 227 empty_playlist();
220 228
221 playlist.index = start_index; 229 playlist.index = start_index;
230 playlist.first_index = first_index;
222 231
223#ifdef HAVE_LCD_BITMAP 232#ifdef HAVE_LCD_BITMAP
224 if(global_settings.statusbar) 233 if(global_settings.statusbar)
@@ -283,6 +292,7 @@ int play_list(char *dir, /* "current directory" */
283 if(seek_pos == playlist.indices[i]) { 292 if(seek_pos == playlist.indices[i]) {
284 /* here's the start song! yiepee! */ 293 /* here's the start song! yiepee! */
285 playlist.index = i; 294 playlist.index = i;
295 playlist.first_index = i;
286 break; /* now stop searching */ 296 break; /* now stop searching */
287 } 297 }
288 } 298 }
diff --git a/apps/playlist.h b/apps/playlist.h
index a18240db7f..9f66b7f49e 100644
--- a/apps/playlist.h
+++ b/apps/playlist.h
@@ -28,10 +28,11 @@
28 28
29struct playlist_info 29struct playlist_info
30{ 30{
31 char filename[MAX_PATH]; /* path name of m3u playlist on disk */ 31 char filename[MAX_PATH]; /* path name of m3u playlist on disk */
32 int dirlen; /* Length of the path to the playlist file */ 32 int dirlen; /* Length of the path to the playlist file */
33 int indices[MAX_PLAYLIST_SIZE]; /* array of indices */ 33 int indices[MAX_PLAYLIST_SIZE]; /* array of indices */
34 int index; /* index of *NEXT* track to play */ 34 int index; /* index of current playing track */
35 int first_index; /* index of first song in playlist */
35 int seed; /* random seed */ 36 int seed; /* random seed */
36 int amount; /* number of tracks in the index */ 37 int amount; /* number of tracks in the index */
37 bool in_ram; /* True if the playlist is RAM-based */ 38 bool in_ram; /* True if the playlist is RAM-based */
@@ -41,7 +42,8 @@ extern struct playlist_info playlist;
41extern bool playlist_shuffle; 42extern bool playlist_shuffle;
42 43
43int play_list(char *dir, char *file, int start_index, 44int play_list(char *dir, char *file, int start_index,
44 bool shuffled_index, int start_offset, int random_seed ); 45 bool shuffled_index, int start_offset,
46 int random_seed, int first_index);
45char* playlist_peek(int steps); 47char* playlist_peek(int steps);
46int playlist_next(int steps); 48int playlist_next(int steps);
47void randomise_playlist( unsigned int seed ); 49void randomise_playlist( unsigned int seed );
diff --git a/apps/settings.c b/apps/settings.c
index 0ba72df110..dab44fe229 100644
--- a/apps/settings.c
+++ b/apps/settings.c
@@ -112,6 +112,7 @@ modified unless the header & checksum test fails.
112 112
113Rest of config block, only saved to disk: 113Rest of config block, only saved to disk:
114 114
1150xF4 (int) Playlist first index
1150xF8 (int) Playlist shuffle seed 1160xF8 (int) Playlist shuffle seed
1160xFC (char[260]) Resume playlist (path/to/dir or path/to/playlist.m3u) 1170xFC (char[260]) Resume playlist (path/to/dir or path/to/playlist.m3u)
117 118
@@ -316,9 +317,11 @@ int settings_save( void )
316 config_block[0x1e] = (unsigned char)global_settings.peak_meter_release; 317 config_block[0x1e] = (unsigned char)global_settings.peak_meter_release;
317 config_block[0x1f] = (unsigned char)global_settings.repeat_mode; 318 config_block[0x1f] = (unsigned char)global_settings.repeat_mode;
318 319
320 memcpy(&config_block[0x24], &global_settings.total_uptime, 4);
321
322 memcpy(&config_block[0xF4], &global_settings.resume_first_index, 4);
319 memcpy(&config_block[0xF8], &global_settings.resume_seed, 4); 323 memcpy(&config_block[0xF8], &global_settings.resume_seed, 4);
320 324
321 memcpy(&config_block[0x24], &global_settings.total_uptime, 4);
322 strncpy(&config_block[0xFC], global_settings.resume_file, MAX_PATH); 325 strncpy(&config_block[0xFC], global_settings.resume_file, MAX_PATH);
323 326
324 DEBUGF("+Resume file %s\n",global_settings.resume_file); 327 DEBUGF("+Resume file %s\n",global_settings.resume_file);
@@ -471,11 +474,12 @@ void settings_load(void)
471 if (config_block[0x1f] != 0xFF) 474 if (config_block[0x1f] != 0xFF)
472 global_settings.repeat_mode = config_block[0x1f]; 475 global_settings.repeat_mode = config_block[0x1f];
473 476
474 memcpy(&global_settings.resume_seed, &config_block[0xF8], 4);
475
476 if (config_block[0x24] != 0xFF) 477 if (config_block[0x24] != 0xFF)
477 memcpy(&global_settings.total_uptime, &config_block[0x24], 4); 478 memcpy(&global_settings.total_uptime, &config_block[0x24], 4);
478 479
480 memcpy(&global_settings.resume_first_index, &config_block[0xF4], 4);
481 memcpy(&global_settings.resume_seed, &config_block[0xF8], 4);
482
479 strncpy(global_settings.resume_file, &config_block[0xFC], MAX_PATH); 483 strncpy(global_settings.resume_file, &config_block[0xFC], MAX_PATH);
480 global_settings.resume_file[MAX_PATH]=0; 484 global_settings.resume_file[MAX_PATH]=0;
481 } 485 }
diff --git a/apps/settings.h b/apps/settings.h
index b30d8aa744..d64d00e8cf 100644
--- a/apps/settings.h
+++ b/apps/settings.h
@@ -73,6 +73,7 @@ struct user_settings
73 int resume_index; /* index in playlist (-1 for no active resume) */ 73 int resume_index; /* index in playlist (-1 for no active resume) */
74 int resume_offset; /* byte offset in mp3 file */ 74 int resume_offset; /* byte offset in mp3 file */
75 int resume_seed; /* random seed for playlist shuffle */ 75 int resume_seed; /* random seed for playlist shuffle */
76 int resume_first_index; /* first index of playlist */
76 unsigned char resume_file[MAX_PATH+1]; /* playlist name (or dir) */ 77 unsigned char resume_file[MAX_PATH+1]; /* playlist name (or dir) */
77 78
78 /* misc options */ 79 /* misc options */
diff --git a/apps/tree.c b/apps/tree.c
index 653b6afa2a..f4a49a9dce 100644
--- a/apps/tree.c
+++ b/apps/tree.c
@@ -505,7 +505,8 @@ void start_resume(void)
505 global_settings.resume_index, 505 global_settings.resume_index,
506 true, /* the index is AFTER shuffle */ 506 true, /* the index is AFTER shuffle */
507 global_settings.resume_offset, 507 global_settings.resume_offset,
508 global_settings.resume_seed ); 508 global_settings.resume_seed,
509 global_settings.resume_first_index);
509 *slash='/'; 510 *slash='/';
510 } 511 }
511 else { 512 else {
@@ -523,7 +524,8 @@ void start_resume(void)
523 global_settings.resume_index, 524 global_settings.resume_index,
524 true, 525 true,
525 global_settings.resume_offset, 526 global_settings.resume_offset,
526 global_settings.resume_seed ); 527 global_settings.resume_seed,
528 global_settings.resume_first_index);
527 } 529 }
528 } 530 }
529 else { 531 else {
@@ -541,7 +543,8 @@ void start_resume(void)
541 global_settings.resume_index, 543 global_settings.resume_index,
542 true, 544 true,
543 global_settings.resume_offset, 545 global_settings.resume_offset,
544 global_settings.resume_seed); 546 global_settings.resume_seed,
547 global_settings.resume_first_index);
545 } 548 }
546 549
547 status_set_playmode(STATUS_PLAY); 550 status_set_playmode(STATUS_PLAY);
@@ -775,7 +778,8 @@ bool dirbrowse(char *root)
775 snprintf(global_settings.resume_file, 778 snprintf(global_settings.resume_file,
776 MAX_PATH, "%s/%s", 779 MAX_PATH, "%s/%s",
777 currdir, file->name); 780 currdir, file->name);
778 play_list(currdir, file->name, 0, false, 0, seed ); 781 play_list(currdir, file->name, 0, false, 0,
782 seed, 0);
779 start_index = 0; 783 start_index = 0;
780 play = true; 784 play = true;
781 break; 785 break;
@@ -790,7 +794,7 @@ bool dirbrowse(char *root)
790 the (shuffled) list and stor that */ 794 the (shuffled) list and stor that */
791 start_index = play_list(currdir, NULL, 795 start_index = play_list(currdir, NULL,
792 start_index, false, 796 start_index, false,
793 0, seed); 797 0, seed, 0);
794 play = true; 798 play = true;
795 break; 799 break;
796 800
@@ -872,6 +876,7 @@ bool dirbrowse(char *root)
872 shuffled list in case shuffle is enabled */ 876 shuffled list in case shuffle is enabled */
873 global_settings.resume_index = start_index; 877 global_settings.resume_index = start_index;
874 global_settings.resume_offset = 0; 878 global_settings.resume_offset = 0;
879 global_settings.resume_first_index = start_index;
875 global_settings.resume_seed = seed; 880 global_settings.resume_seed = seed;
876 settings_save(); 881 settings_save();
877 } 882 }