From c16dbbfd1fb7bf4bc268a4693bbed21497456b30 Mon Sep 17 00:00:00 2001 From: Paul Sauro Date: Wed, 28 Aug 2024 22:55:52 +0200 Subject: Reworks to the shuffle system to improve performance and allow fast shuffling from a big library (but this work for all database views) This improvement brings a huge performance improvement to start a random mix of your library. Previously, the only way to do this was to increase the size of a playlist with absurd sizes number. Now it will respect the limitation but will insert random songs from the current view. Database: Add true random songs in playlist if it is gonna exceed its maximum capacity More context is available here : https://www.reddit.com/r/rockbox/comments/1ez0mq4/i_developped_true_full_library_shuffle_for/ Also : - Improved layout in the DB browser - New default max playlists capacity is now 2000 on old PortalPlayer targets to give a better user experience and not having to wait dozens of seconds while creating a playlist - "Show insert shuffled" option is now true by default - Add a new shortcut to play all songs shuffled in the DB browser - Now the feature is fully optional and enabled only on targets that have more than 2MB of RAM - Add entries about this feature in the manual to explain it to the users Change-Id: I1aebaf7ebcff2bf907080f1861027d530619097c Change-Id: I3354923b148eeef1975171990e814a1a505d1df0 --- apps/tree.c | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) (limited to 'apps/tree.c') diff --git a/apps/tree.c b/apps/tree.c index 71a7ee3f62..b4cd9d77b0 100644 --- a/apps/tree.c +++ b/apps/tree.c @@ -735,6 +735,17 @@ static int dirbrowse(void) oldbutton = button; gui_synclist_do_button(&tree_lists, &button); tc.selected_item = gui_synclist_get_sel_pos(&tree_lists); + int customaction = ONPLAY_NO_CUSTOMACTION; + bool do_restore_display = true; + #ifdef HAVE_TAGCACHE + if (id3db && (button == ACTION_STD_OK || button == ACTION_STD_CONTEXT)) { + customaction = tagtree_get_custom_action(&tc); + if (customaction == ONPLAY_CUSTOMACTION_SHUFFLE_SONGS) { + button = ACTION_STD_CONTEXT; /** The code to insert shuffled is on the context branch of the switch so we always go here */ + do_restore_display = false; + } + } + #endif switch ( button ) { case ACTION_STD_OK: /* nothing to do if no files to display */ @@ -773,7 +784,7 @@ static int dirbrowse(void) default: break; } - restore = true; + restore = do_restore_display; break; case ACTION_STD_CANCEL: @@ -798,12 +809,12 @@ static int dirbrowse(void) if (ft_exit(&tc) == 3) exit_func = true; - restore = true; + restore = do_restore_display; break; case ACTION_TREE_STOP: if (list_stop_handler()) - restore = true; + restore = do_restore_display; break; case ACTION_STD_MENU: @@ -851,7 +862,7 @@ static int dirbrowse(void) skin_update(CUSTOM_STATUSBAR, i, SKIN_REFRESH_ALL); } - restore = true; + restore = do_restore_display; break; } #endif @@ -872,7 +883,7 @@ static int dirbrowse(void) break; if(!numentries) - onplay_result = onplay(NULL, 0, curr_context, hotkey); + onplay_result = onplay(NULL, 0, curr_context, hotkey, customaction); else { #ifdef HAVE_TAGCACHE if (id3db) @@ -902,7 +913,7 @@ static int dirbrowse(void) ft_assemble_path(buf, sizeof(buf), currdir, entry->name); } - onplay_result = onplay(buf, attr, curr_context, hotkey); + onplay_result = onplay(buf, attr, curr_context, hotkey, customaction); } switch (onplay_result) { @@ -911,7 +922,7 @@ static int dirbrowse(void) break; case ONPLAY_OK: - restore = true; + restore = do_restore_display; break; case ONPLAY_RELOAD_DIR: @@ -988,7 +999,7 @@ static int dirbrowse(void) lastfilter = *tc.dirfilter; lastsortcase = global_settings.sort_case; - restore = true; + restore = do_restore_display; } if (exit_func) -- cgit v1.2.3