From 5733d8ebd53f808dba2ddddb5ded55bacc4d949a Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Sun, 9 Jul 2017 00:44:02 -0400 Subject: [PATCH] move content list builder into scanner task with progress, fixes menu freeze with large playlists --- CHANGES.md | 1 + database_info.c | 10 ++++++++-- database_info.h | 5 +++-- intl/msg_hash_ja.h | 2 ++ intl/msg_hash_us.h | 2 ++ msg_hash.h | 1 + tasks/task_database.c | 31 +++++++++++++++++++++++-------- 7 files changed, 40 insertions(+), 12 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 81825c4e01..141246e1be 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -4,6 +4,7 @@ - AUDIO: Audio mixer's volume can now be independently increased/decreased, and muted. - SDL2: Fix 'SDL2 driver does not see the hat on wired Xbox 360 controller" - SCANNING: Fix PS1 game scanning +- SCANNING: Move content list builder into scanner task with progress, fixes menu freeze with large playlists - VITA: Add support for external USB if mounted - VITA: Add cheevos support - MENU: Add 'User Interface -> Views'. Ability to display/hide online updater and core updater diff --git a/database_info.c b/database_info.c index 810347d41c..7871bb1b96 100644 --- a/database_info.c +++ b/database_info.c @@ -399,7 +399,7 @@ static int database_cursor_close(libretrodb_t *db, libretrodb_cursor_t *cur) } database_info_handle_t *database_info_dir_init(const char *dir, - enum database_type type) + enum database_type type, retro_task_t *task) { unsigned i; database_info_handle_t *db = (database_info_handle_t*) @@ -423,6 +423,9 @@ database_info_handle_t *database_info_dir_init(const char *dir, { const char *path = db->list->elems[i].data; + if (task) + task_set_progress(task, (i / (float)db->list->size) * 100); + if (path_is_compressed_file(path) && !path_contains_compressed_file(path)) { struct string_list *archive_list = path_is_compressed_file(path) ? @@ -469,7 +472,7 @@ error: } database_info_handle_t *database_info_file_init(const char *path, - enum database_type type) + enum database_type type, retro_task_t *task) { union string_list_elem_attr attr; database_info_handle_t *db = (database_info_handle_t*) @@ -501,6 +504,9 @@ database_info_handle_t *database_info_file_init(const char *path, char new_path[PATH_MAX_LENGTH]; size_t path_len = strlen(path); + if (task) + task_set_progress(task, (i / (float)archive_list->size) * 100); + new_path[0] = '\0'; strlcpy(new_path, path, sizeof(new_path)); diff --git a/database_info.h b/database_info.h index 31263952cd..04e7ab1589 100644 --- a/database_info.h +++ b/database_info.h @@ -23,6 +23,7 @@ #include #include +#include RETRO_BEGIN_DECLS @@ -125,10 +126,10 @@ database_info_list_t *database_info_list_new(const char *rdb_path, void database_info_list_free(database_info_list_t *list); database_info_handle_t *database_info_dir_init(const char *dir, - enum database_type type); + enum database_type type, retro_task_t *task); database_info_handle_t *database_info_file_init(const char *path, - enum database_type type); + enum database_type type, retro_task_t *task); void database_info_free(database_info_handle_t *handle); diff --git a/intl/msg_hash_ja.h b/intl/msg_hash_ja.h index 411373ab85..55be281076 100644 --- a/intl/msg_hash_ja.h +++ b/intl/msg_hash_ja.h @@ -2987,3 +2987,5 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_CORE_UPDATER, "コアのアップデーターを表示") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_CORE_UPDATER, "Show/hide the ability to update cores (and core info files).") +MSG_HASH(MSG_PREPARING_FOR_CONTENT_SCAN, + "コンテンツをスキャンするための準備中") diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 84a66552d7..40e9c47eca 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -3057,3 +3057,5 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_CORE_UPDATER, "Show Core Updater") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_CORE_UPDATER, "Show/hide the ability to update cores (and core info files).") +MSG_HASH(MSG_PREPARING_FOR_CONTENT_SCAN, + "Preparing for content scan...") diff --git a/msg_hash.h b/msg_hash.h index db4e96fe7a..95a1d7dea7 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -337,6 +337,7 @@ enum msg_hash_enums MSG_REDIRECTING_SAVESTATE_TO, MSG_REDIRECTING_SAVEFILE_TO, MSG_REDIRECTING_CHEATFILE_TO, + MSG_PREPARING_FOR_CONTENT_SCAN, MSG_SCANNING, MSG_SCANNING_OF_DIRECTORY_FINISHED, MSG_LOADED_STATE_FROM_SLOT, diff --git a/tasks/task_database.c b/tasks/task_database.c index 2dd86e62b0..df8d9e00f6 100644 --- a/tasks/task_database.c +++ b/tasks/task_database.c @@ -60,6 +60,10 @@ typedef struct db_handle unsigned status; char playlist_directory[4096]; char content_database_path[4096]; + + bool is_directory; + char fullpath[4096]; + bool scan_started; } db_handle_t; int find_first_data_track(const char* cue_path, @@ -630,6 +634,21 @@ static void task_database_handler(retro_task_t *task) if (!db) goto task_finished; + if (!db->scan_started) + { + db->scan_started = true; + + if (db->is_directory) + db->handle = database_info_dir_init(db->fullpath, DATABASE_TYPE_ITERATE, task); + else + db->handle = database_info_file_init(db->fullpath, DATABASE_TYPE_ITERATE, task); + + task_free_title(task); + + if (db->handle) + db->handle->status = DATABASE_STATUS_ITERATE_BEGIN; + } + dbinfo = db->handle; dbstate = &db->state; @@ -721,20 +740,16 @@ bool task_push_dbscan( t->handler = task_database_handler; t->state = db; t->callback = cb; + t->title = strdup(msg_hash_to_str(MSG_PREPARING_FOR_CONTENT_SCAN)); + db->is_directory = directory; + + strlcpy(db->fullpath, fullpath, sizeof(db->fullpath)); strlcpy(db->playlist_directory, playlist_directory, sizeof(db->playlist_directory)); strlcpy(db->content_database_path, content_database, sizeof(db->content_database_path)); - if (directory) - db->handle = database_info_dir_init(fullpath, DATABASE_TYPE_ITERATE); - else - db->handle = database_info_file_init(fullpath, DATABASE_TYPE_ITERATE); - - if (db->handle) - db->handle->status = DATABASE_STATUS_ITERATE_BEGIN; - task_queue_push(t); return true;