summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrank Gevaerts <frank@gevaerts.be>2009-07-01 16:59:43 +0000
committerFrank Gevaerts <frank@gevaerts.be>2009-07-01 16:59:43 +0000
commitd5180f7870643e19c37b62909d0e0c545cc23337 (patch)
treebe828862cde4fa4603d40f9bc1c1aa2038c4973c
parentc468273e6d59ddf17c72d94a5d3c97df33c0f0ca (diff)
downloadrockbox-d5180f7870643e19c37b62909d0e0c545cc23337.tar.gz
rockbox-d5180f7870643e19c37b62909d0e0c545cc23337.zip
Add "Play Shuffled" menu item to random_folder_advance_config, which adds all configured configured directories to the current playlist in random order.
(FS#10403) git-svn-id: svn://svn.rockbox.org/rockbox/trunk@21594 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/plugin.c1
-rw-r--r--apps/plugin.h5
-rw-r--r--apps/plugins/random_folder_advance_config.c70
-rw-r--r--manual/plugins/random_folder_advance_config.tex1
4 files changed, 76 insertions, 1 deletions
diff --git a/apps/plugin.c b/apps/plugin.c
index 20c7a3733c..ff80776f7e 100644
--- a/apps/plugin.c
+++ b/apps/plugin.c
@@ -658,6 +658,7 @@ static const struct plugin_api rockbox_api = {
658 appsversion, 658 appsversion,
659 /* new stuff at the end, sort into place next time 659 /* new stuff at the end, sort into place next time
660 the API gets incompatible */ 660 the API gets incompatible */
661 playlist_insert_directory,
661}; 662};
662 663
663int plugin_load(const char* plugin, const void* parameter) 664int plugin_load(const char* plugin, const void* parameter)
diff --git a/apps/plugin.h b/apps/plugin.h
index 160eb2b1e7..db16800309 100644
--- a/apps/plugin.h
+++ b/apps/plugin.h
@@ -128,7 +128,7 @@ void* plugin_get_buffer(size_t *buffer_size);
128#define PLUGIN_MAGIC 0x526F634B /* RocK */ 128#define PLUGIN_MAGIC 0x526F634B /* RocK */
129 129
130/* increase this every time the api struct changes */ 130/* increase this every time the api struct changes */
131#define PLUGIN_API_VERSION 157 131#define PLUGIN_API_VERSION 158
132 132
133/* update this to latest version if a change to the api struct breaks 133/* update this to latest version if a change to the api struct breaks
134 backwards compatibility (and please take the opportunity to sort in any 134 backwards compatibility (and please take the opportunity to sort in any
@@ -821,6 +821,9 @@ struct plugin_api {
821 const char *appsversion; 821 const char *appsversion;
822 /* new stuff at the end, sort into place next time 822 /* new stuff at the end, sort into place next time
823 the API gets incompatible */ 823 the API gets incompatible */
824 int (*playlist_insert_directory)(struct playlist_info* playlist,
825 const char *dirname, int position, bool queue,
826 bool recurse);
824}; 827};
825 828
826/* plugin header */ 829/* plugin header */
diff --git a/apps/plugins/random_folder_advance_config.c b/apps/plugins/random_folder_advance_config.c
index d0a6a26800..0f540baf8a 100644
--- a/apps/plugins/random_folder_advance_config.c
+++ b/apps/plugins/random_folder_advance_config.c
@@ -19,6 +19,7 @@
19 * 19 *
20 ****************************************************************************/ 20 ****************************************************************************/
21#include "plugin.h" 21#include "plugin.h"
22#include "file.h"
22 23
23PLUGIN_HEADER 24PLUGIN_HEADER
24 25
@@ -30,6 +31,7 @@ static int lasttick;
30#define RFADIR_FILE ROCKBOX_DIR "/folder_advance_dir.txt" 31#define RFADIR_FILE ROCKBOX_DIR "/folder_advance_dir.txt"
31#define RFA_FILE_TEXT ROCKBOX_DIR "/folder_advance_list.txt" 32#define RFA_FILE_TEXT ROCKBOX_DIR "/folder_advance_list.txt"
32#define MAX_REMOVED_DIRS 10 33#define MAX_REMOVED_DIRS 10
34#define MAX_SHUFFLE_SIZE (PLUGIN_BUFFER_SIZE/4 - 10000)
33 35
34char *buffer = NULL; 36char *buffer = NULL;
35ssize_t buffer_size; 37ssize_t buffer_size;
@@ -40,6 +42,7 @@ struct file_format {
40 char folder[][MAX_PATH]; 42 char folder[][MAX_PATH];
41}; 43};
42struct file_format *list = NULL; 44struct file_format *list = NULL;
45static int order[MAX_SHUFFLE_SIZE];
43 46
44void update_screen(bool clear) 47void update_screen(bool clear)
45{ 48{
@@ -460,6 +463,68 @@ int import_list_from_file_text(void)
460 return list->count; 463 return list->count;
461} 464}
462 465
466int start_shuffled_play(void)
467{
468 int i = 0;
469 /* load the dat file if not already done */
470 if ((list == NULL || list->count == 0) && (i = load_list()) != 0)
471 {
472 rb->splashf(HZ*2, "Could not load %s, rv = %d", RFA_FILE, i);
473 return 0;
474 }
475
476 if (list->count <= 0)
477 {
478 rb->splashf(HZ*2, "no dirs in list file: %s", RFA_FILE);
479 return 0;
480 }
481
482 /* shuffle the thing */
483 rb->srand(*rb->current_tick);
484 if(list->count>MAX_SHUFFLE_SIZE)
485 {
486 rb->splashf(HZ*2, "Too many files: %d", list->count);
487 return 0;
488 }
489 for(i=0;i<list->count;i++)
490 order[i]=i;
491
492 for(i = list->count - 1; i >= 0; i--)
493 {
494 /* the rand is from 0 to RAND_MAX, so adjust to our value range */
495 int candidate = rb->rand() % (i + 1);
496
497 /* now swap the values at the 'i' and 'candidate' positions */
498 int store = order[candidate];
499 order[candidate] = order[i];
500 order[i] = store;
501 }
502
503 /* We don't want whatever is playing */
504 if (!(rb->playlist_remove_all_tracks(NULL) == 0
505 && rb->playlist_create(NULL, NULL) == 0))
506 {
507 rb->splashf(HZ*2, "Could not clear playlist");
508 return 0;
509 }
510
511 /* add the lot to the playlist */
512 for (i = 0; i < list->count; i++)
513 {
514 if (list->folder[order[i]][0] != ' ')
515 {
516 rb->playlist_insert_directory(NULL,list->folder[order[i]],PLAYLIST_INSERT_LAST,false,false);
517 }
518 if (rb->action_userabort(TIMEOUT_NOBLOCK))
519 {
520 break;
521 }
522 }
523 rb->splash(HZ, "Done");
524 rb->playlist_start(0,0);
525 return 1;
526}
527
463int main_menu(void) 528int main_menu(void)
464{ 529{
465 bool exit = false; 530 bool exit = false;
@@ -469,6 +534,7 @@ int main_menu(void)
469 "Edit Folder List", 534 "Edit Folder List",
470 "Export List To Textfile", 535 "Export List To Textfile",
471 "Import List From Textfile", 536 "Import List From Textfile",
537 "Play Shuffled",
472 "Quit"); 538 "Quit");
473 539
474 switch (rb->do_menu(&menu, NULL, NULL, false)) 540 switch (rb->do_menu(&menu, NULL, NULL, false))
@@ -527,6 +593,10 @@ int main_menu(void)
527 rb->backlight_on(); 593 rb->backlight_on();
528 break; 594 break;
529 case 4: 595 case 4:
596 start_shuffled_play();
597 exit=true;
598 break;
599 case 5:
530 return 1; 600 return 1;
531 } 601 }
532 return exit?1:0; 602 return exit?1:0;
diff --git a/manual/plugins/random_folder_advance_config.tex b/manual/plugins/random_folder_advance_config.tex
index 098407d70b..a4f0a3a53f 100644
--- a/manual/plugins/random_folder_advance_config.tex
+++ b/manual/plugins/random_folder_advance_config.tex
@@ -21,6 +21,7 @@ it you need to have both \fname{-/CDs} and \fname{CDs} as entries.
21 \fname{/.rockbox/folder\_advance\_list.txt} 21 \fname{/.rockbox/folder\_advance\_list.txt}
22\item[Import List From Textfile] Imports the list from 22\item[Import List From Textfile] Imports the list from
23 \fname{/.rockbox/folder\_advance\_list.txt} 23 \fname{/.rockbox/folder\_advance\_list.txt}
24\item[Play Shuffled] Starts playback with the selected directories in random order. Tracks within a directory will be played in normal order. The plugin will exit after starting playback.
24\item[Quit] 25\item[Quit]
25\end{description} 26\end{description}
26 27