Provide "quick" option for loading database into RAM

The directory cache and the database's Load to RAM feature
each result in a much better user experience.

But, when both features are enabled at the same time, it
can take a very long time on older players - easily several
minutes for larger libraries - until all of the database's
dircache references have been updated.

Include a 'Quick' option that causes the database to ignore
dircache references which can *significantly* reduce disk
activity after booting.

Change-Id: I25ae779c97d03885b06d5a28d8be55c0d05692a5
This commit is contained in:
Christian Soffke 2023-10-07 15:10:53 +02:00
parent 4a52147122
commit 3ce3b102dd
5 changed files with 45 additions and 6 deletions

View file

@ -16669,3 +16669,17 @@
*: "Remove Queued Tracks?"
</voice>
</phrase>
<phrase>
id: LANG_QUICK_IGNORE_DIRACHE
desc: in Settings
user: core
<source>
*: "Quick (Ignore Directory Cache)"
</source>
<dest>
*: "Quick (Ignore Directory Cache)"
</dest>
<voice>
*: "Quick (Ignore Directory Cache)"
</voice>
</phrase>

View file

@ -136,6 +136,13 @@ enum
};
#endif
enum
{
TAGCACHE_RAM_OFF = 0,
TAGCACHE_RAM_ON = 1,
TAGCACHE_RAM_QUICK = 2
};
/* dir filter options */
/* Note: Any new filter modes need to be added before NUM_FILTER_MODES.
* Any new rockbox browse filter modes (accessible through the menu)
@ -576,7 +583,7 @@ struct user_settings
#endif
#ifdef HAVE_TAGCACHE
#ifdef HAVE_TC_RAMCACHE
bool tagcache_ram; /* load tagcache to ram? */
int tagcache_ram; /* load tagcache to ram: 1=on, 2=quick (ignore dircache) */
#endif
bool tagcache_autoupdate; /* automatically keep tagcache in sync? */
bool autoresume_enable; /* enable auto-resume feature? */

View file

@ -1813,7 +1813,10 @@ const struct settings_list settings[] = {
#ifdef HAVE_TAGCACHE
#ifdef HAVE_TC_RAMCACHE
OFFON_SETTING(F_BANFROMQS,tagcache_ram,LANG_TAGCACHE_RAM,false,"tagcache_ram",NULL),
CHOICE_SETTING(F_BANFROMQS, tagcache_ram, LANG_TAGCACHE_RAM,
0, "tagcache_ram", "off,on,quick",
NULL, 3,
ID2P(LANG_OFF), ID2P(LANG_ON), ID2P(LANG_QUICK_IGNORE_DIRACHE)),
#endif
OFFON_SETTING(F_BANFROMQS, tagcache_autoupdate, LANG_TAGCACHE_AUTOUPDATE, false,
"tagcache_autoupdate", NULL),

View file

@ -800,7 +800,8 @@ static long find_entry_ram(const char *filename)
struct dircache_fileref dcfref;
/* Check if tagcache is loaded into ram. */
if (!tc_stat.ramcache)
if (!tc_stat.ramcache
|| global_settings.tagcache_ram != TAGCACHE_RAM_ON)
return -1;
if (dircache_search(DCS_CACHED_PATH | DCS_UPDATE_FILEREF, &dcfref,
@ -5247,6 +5248,7 @@ static void tagcache_thread(void)
if (!tc_stat.ramcache && global_settings.tagcache_ram)
{
load_ramcache();
if (global_settings.tagcache_ram == TAGCACHE_RAM_ON)
check_file_refs(global_settings.tagcache_autoupdate);
if (tc_stat.ramcache && global_settings.tagcache_autoupdate)
tagcache_build();

View file

@ -52,10 +52,23 @@ with logging
browsing but it does not use extra RAM and saves some battery on boot up.
\opt{HAVE_DISK_STORAGE}{
\note{If you browse your music frequently using the database, you should
If you browse your music frequently using the database, you should
load to RAM, as this will reduce the overall battery consumption because
the disk will not need to spin on each search.}
the disk will not need to spin on each search.
}
\note{When Load to RAM is turned on, and the directory cache is enabled as well,
it may take an unexpectedly long amount of time for disk activity to
wind down after booting, depending on your library size and player.
This can be mitigated by choosing the \setting{Quick} option instead, which causes
the database to ignore cached file references. In that case, you may notice brief
moments of disk activity once the path for a database entry has to be retrieved.
Set to \setting{On}, if you plan to take advantage the database's Update function,
or use a WPS that displays multiple upcoming tracks from the current playlist.
Otherwise, you may notice file names instead of metadata being displayed for those
tracks.}
}
\item[Auto Update]