diff --git a/tasks/task_content.c b/tasks/task_content.c index 54c0c0470e..18ede7deb1 100644 --- a/tasks/task_content.c +++ b/tasks/task_content.c @@ -120,7 +120,7 @@ typedef struct content_information_ctx content_information_ctx_t; #ifdef HAVE_CDROM enum cdrom_dump_state { - DUMP_STATE_TOC_PENDING, + DUMP_STATE_TOC_PENDING = 0, DUMP_STATE_WRITE_CUE, DUMP_STATE_NEXT_TRACK, DUMP_STATE_READ_TRACK @@ -128,33 +128,43 @@ enum cdrom_dump_state typedef struct { - RFILE *file; - RFILE *output_file; - libretro_vfs_implementation_file *stream; - const cdrom_toc_t *toc; - char cdrom_path[64]; - char drive_letter[2]; - char title[512]; + bool next; + enum cdrom_dump_state state; unsigned char cur_track; int64_t cur_track_bytes; int64_t track_written_bytes; int64_t disc_total_bytes; int64_t disc_read_bytes; - bool next; - enum cdrom_dump_state state; + char drive_letter[2]; + char cdrom_path[64]; + char title[512]; + const cdrom_toc_t *toc; + RFILE *file; + RFILE *output_file; + libretro_vfs_implementation_file *stream; } task_cdrom_dump_state_t; #endif struct content_stream { - uint32_t a; const uint8_t *b; size_t c; + uint32_t a; uint32_t crc; }; struct content_information_ctx { + bool is_ips_pref; + bool is_bps_pref; + bool is_ups_pref; + bool block_extract; + bool need_fullpath; + bool set_supports_no_game_enable; + bool patch_is_blocked; + bool bios_is_missing; + bool check_firmware_before_loading; + struct { struct retro_subsystem_info *data; @@ -169,38 +179,33 @@ struct content_information_ctx char *directory_cache; char *directory_system; - bool is_ips_pref; - bool is_bps_pref; - bool is_ups_pref; - bool block_extract; - bool need_fullpath; - bool set_supports_no_game_enable; - bool patch_is_blocked; - bool bios_is_missing; - bool check_firmware_before_loading; - struct string_list *temporary_content; }; -static struct string_list *temporary_content = NULL; static bool _launched_from_cli = true; -static bool _content_is_inited = false; -static bool core_does_not_need_content = false; -static uint32_t content_rom_crc = 0; -static bool pending_subsystem_init = false; -static int pending_subsystem_rom_num = 0; -static int pending_subsystem_id = 0; -static unsigned pending_subsystem_rom_id = 0; +typedef struct content_state +{ + bool is_inited; + bool core_does_not_need_content; + bool pending_subsystem_init; + bool pending_rom_crc; -static bool pending_content_rom_crc = false; -static char pending_content_rom_crc_path[PATH_MAX_LENGTH] = {0}; + int pending_subsystem_rom_num; + int pending_subsystem_id; + unsigned pending_subsystem_rom_id; + uint32_t rom_crc; -static char pending_subsystem_ident[255]; -static char *pending_subsystem_roms[RARCH_MAX_SUBSYSTEM_ROMS]; + char companion_ui_crc32[32]; + char pending_subsystem_ident[255]; + char pending_rom_crc_path[PATH_MAX_LENGTH]; + char companion_ui_db_name[PATH_MAX_LENGTH]; + char *pending_subsystem_roms[RARCH_MAX_SUBSYSTEM_ROMS]; -static char companion_ui_db_name[PATH_MAX_LENGTH] = {0}; -static char companion_ui_crc32[32] = {0}; + struct string_list *temporary_content; +} content_state_t; + +static content_state_t content_st = {}; #ifdef HAVE_CDROM static void task_cdrom_dump_handler(retro_task_t *task) @@ -213,15 +218,11 @@ static void task_cdrom_dump_handler(retro_task_t *task) if (task_get_progress(task) == 100) { if (state->file) - { filestream_close(state->file); - state->file = NULL; - } if (state->output_file) - { filestream_close(state->output_file); - state->file = NULL; - } + state->file = NULL; + state->output_file = NULL; task_set_finished(task, true); @@ -581,6 +582,7 @@ static bool content_load(content_ctx_info_t *info) char **rarch_argv_ptr = (char**)info->argv; int *rarch_argc_ptr = (int*)&info->argc; struct rarch_main_wrap *wrap_args = NULL; + content_state_t *p_content = (content_state_t*)&content_st; if (!(wrap_args = (struct rarch_main_wrap*) calloc(1, sizeof(*wrap_args)))) @@ -613,7 +615,7 @@ static bool content_load(content_ctx_info_t *info) return false; } - if (pending_subsystem_init) + if (p_content->pending_subsystem_init) { command_event(CMD_EVENT_CORE_INIT, NULL); content_clear_subsystem(); @@ -656,7 +658,8 @@ static bool load_content_into_memory( unsigned i, const char *path, void **buf, int64_t *length) { - uint8_t *ret_buf = NULL; + uint8_t *ret_buf = NULL; + content_state_t *p_content = (content_state_t*)&content_st; RARCH_LOG("%s: %s.\n", msg_hash_to_str(MSG_LOADING_CONTENT_FILE), path); @@ -693,18 +696,18 @@ static bool load_content_into_memory( if (has_patch) { - content_rom_crc = encoding_crc32(0, ret_buf, (size_t)*length); - RARCH_LOG("CRC32: 0x%x .\n", (unsigned)content_rom_crc); + p_content->rom_crc = encoding_crc32(0, ret_buf, (size_t)*length); + RARCH_LOG("CRC32: 0x%x .\n", (unsigned)p_content->rom_crc); } else { - pending_content_rom_crc = true; - strlcpy(pending_content_rom_crc_path, - path, sizeof(pending_content_rom_crc_path)); + p_content->pending_rom_crc = true; + strlcpy(p_content->pending_rom_crc_path, + path, sizeof(p_content->pending_rom_crc_path)); } } else - content_rom_crc = 0; + p_content->rom_crc = 0; } *buf = ret_buf; @@ -898,6 +901,7 @@ static bool content_file_load( #ifdef __WINRT__ rarch_system_info_t *system = runloop_get_system_info(); #endif + content_state_t *p_content = (content_state_t*)&content_st; for (i = 0; i < content->size; i++) { @@ -1042,9 +1046,9 @@ static bool content_file_load( RARCH_LOG("%s\n", msg_hash_to_str( MSG_CONTENT_LOADING_SKIPPED_IMPLEMENTATION_WILL_DO_IT)); - pending_content_rom_crc = true; - strlcpy(pending_content_rom_crc_path, - path, sizeof(pending_content_rom_crc_path)); + p_content->pending_rom_crc = true; + strlcpy(p_content->pending_rom_crc_path, + path, sizeof(p_content->pending_rom_crc_path)); } } @@ -1300,8 +1304,9 @@ static void task_push_to_history_list( bool launched_from_cli, bool launched_from_companion_ui) { - bool contentless = false; - bool is_inited = false; + bool contentless = false; + bool is_inited = false; + content_state_t *p_content = (content_state_t*)&content_st; content_get_status(&contentless, &is_inited); @@ -1382,11 +1387,11 @@ static void task_push_to_history_list( { /* Database name + checksum are supplied * by the companion UI itself */ - if (!string_is_empty(companion_ui_crc32)) - crc32 = companion_ui_crc32; + if (!string_is_empty(p_content->companion_ui_crc32)) + crc32 = p_content->companion_ui_crc32; - if (!string_is_empty(companion_ui_db_name)) - db_name = companion_ui_db_name; + if (!string_is_empty(p_content->companion_ui_db_name)) + db_name = p_content->companion_ui_db_name; } #ifdef HAVE_MENU else @@ -2094,19 +2099,22 @@ bool task_push_load_content_with_new_core_from_companion_ui( retro_task_callback_t cb, void *user_data) { - global_t *global = global_get_ptr(); + global_t *global = global_get_ptr(); + content_state_t *p_content = (content_state_t*)&content_st; path_set(RARCH_PATH_CONTENT, fullpath); path_set(RARCH_PATH_CORE, core_path); - companion_ui_db_name[0] = '\0'; - companion_ui_crc32[0] = '\0'; + p_content->companion_ui_db_name[0] = '\0'; + p_content->companion_ui_crc32[0] = '\0'; if (!string_is_empty(db_name)) - strlcpy(companion_ui_db_name, db_name, sizeof(companion_ui_db_name)); + strlcpy(p_content->companion_ui_db_name, + db_name, sizeof(p_content->companion_ui_db_name)); if (!string_is_empty(crc32)) - strlcpy(companion_ui_crc32, crc32, sizeof(companion_ui_crc32)); + strlcpy(p_content->companion_ui_crc32, + crc32, sizeof(p_content->companion_ui_crc32)); #ifdef HAVE_DYNAMIC command_event(CMD_EVENT_LOAD_CORE, NULL); @@ -2184,12 +2192,14 @@ bool task_push_load_content_with_current_core_from_companion_ui( retro_task_callback_t cb, void *user_data) { + content_state_t *p_content = (content_state_t*)&content_st; + path_set(RARCH_PATH_CONTENT, fullpath); /* TODO/FIXME: Enable setting of these values * via function arguments */ - companion_ui_db_name[0] = '\0'; - companion_ui_crc32[0] = '\0'; + p_content->companion_ui_db_name[0] = '\0'; + p_content->companion_ui_crc32[0] = '\0'; /* Load content * > TODO/FIXME: Set loading_from_companion_ui 'false' for @@ -2239,7 +2249,9 @@ bool task_push_load_subsystem_with_core_from_menu( retro_task_callback_t cb, void *user_data) { - pending_subsystem_init = true; + content_state_t *p_content = (content_state_t*)&content_st; + + p_content->pending_subsystem_init = true; /* Load content */ if (!task_load_content_callback(content_info, true, false, false)) @@ -2261,24 +2273,27 @@ void content_get_status( bool *contentless, bool *is_inited) { - *contentless = core_does_not_need_content; - *is_inited = _content_is_inited; + content_state_t *p_content = (content_state_t*)&content_st; + + *contentless = p_content->core_does_not_need_content; + *is_inited = p_content->is_inited; } /* Clears the pending subsystem rom buffer*/ void content_clear_subsystem(void) { unsigned i; + content_state_t *p_content = (content_state_t*)&content_st; - pending_subsystem_rom_id = 0; - pending_subsystem_init = false; + p_content->pending_subsystem_rom_id = 0; + p_content->pending_subsystem_init = false; for (i = 0; i < RARCH_MAX_SUBSYSTEM_ROMS; i++) { - if (pending_subsystem_roms[i]) + if (p_content->pending_subsystem_roms[i]) { - free(pending_subsystem_roms[i]); - pending_subsystem_roms[i] = NULL; + free(p_content->pending_subsystem_roms[i]); + p_content->pending_subsystem_roms[i] = NULL; } } } @@ -2292,14 +2307,16 @@ bool content_launched_from_cli(void) /* Get the current subsystem */ int content_get_subsystem(void) { - return pending_subsystem_id; + content_state_t *p_content = (content_state_t*)&content_st; + return p_content->pending_subsystem_id; } /* Set the current subsystem*/ void content_set_subsystem(unsigned idx) { - rarch_system_info_t *system = runloop_get_system_info(); const struct retro_subsystem_info *subsystem; + rarch_system_info_t *system = runloop_get_system_info(); + content_state_t *p_content = (content_state_t*)&content_st; /* Core fully loaded, use the subsystem data */ if (system->subsystem.data) @@ -2308,18 +2325,20 @@ void content_set_subsystem(unsigned idx) else subsystem = subsystem_data + idx; - pending_subsystem_id = idx; + p_content->pending_subsystem_id = idx; if (subsystem && subsystem_current_count > 0) { - strlcpy(pending_subsystem_ident, - subsystem->ident, sizeof(pending_subsystem_ident)); + strlcpy(p_content->pending_subsystem_ident, + subsystem->ident, sizeof(p_content->pending_subsystem_ident)); - pending_subsystem_rom_num = subsystem->num_roms; + p_content->pending_subsystem_rom_num = subsystem->num_roms; } RARCH_LOG("[subsystem] settings current subsytem to: %d(%s) roms: %d\n", - pending_subsystem_id, pending_subsystem_ident, pending_subsystem_rom_num); + p_content->pending_subsystem_id, + p_content->pending_subsystem_ident, + p_content->pending_subsystem_rom_num); } /* Sets the subsystem by name */ @@ -2376,63 +2395,77 @@ void content_get_subsystem_friendly_name(const char* subsystem_name, char* subsy /* Add a rom to the subsystem rom buffer */ void content_add_subsystem(const char* path) { - size_t pending_size = PATH_MAX_LENGTH * sizeof(char); - pending_subsystem_roms[pending_subsystem_rom_id] = (char*)malloc(pending_size); + content_state_t *p_content = (content_state_t*)&content_st; + size_t pending_size = PATH_MAX_LENGTH * sizeof(char); + p_content->pending_subsystem_roms[p_content->pending_subsystem_rom_id] = (char*)malloc(pending_size); - strlcpy(pending_subsystem_roms[pending_subsystem_rom_id], path, pending_size); - RARCH_LOG("[subsystem] subsystem id: %d subsystem ident: %s rom id: %d, rom path: %s\n", - pending_subsystem_id, pending_subsystem_ident, pending_subsystem_rom_id, - pending_subsystem_roms[pending_subsystem_rom_id]); - pending_subsystem_rom_id++; + strlcpy(p_content->pending_subsystem_roms[ + p_content->pending_subsystem_rom_id], + path, pending_size); + RARCH_LOG("[subsystem] subsystem id: %d subsystem ident:" + " %s rom id: %d, rom path: %s\n", + p_content->pending_subsystem_id, + p_content->pending_subsystem_ident, + p_content->pending_subsystem_rom_id, + p_content->pending_subsystem_roms[ + p_content->pending_subsystem_rom_id]); + p_content->pending_subsystem_rom_id++; } /* Get the current subsystem rom id */ unsigned content_get_subsystem_rom_id(void) { - return pending_subsystem_rom_id; + content_state_t *p_content = (content_state_t*)&content_st; + return p_content->pending_subsystem_rom_id; } void content_set_does_not_need_content(void) { - core_does_not_need_content = true; + content_state_t *p_content = (content_state_t*)&content_st; + p_content->core_does_not_need_content = true; } void content_unset_does_not_need_content(void) { - core_does_not_need_content = false; + content_state_t *p_content = (content_state_t*)&content_st; + p_content->core_does_not_need_content = false; } uint32_t content_get_crc(void) { - if (pending_content_rom_crc) + content_state_t *p_content = (content_state_t*)&content_st; + if (p_content->pending_rom_crc) { - pending_content_rom_crc = false; - content_rom_crc = file_crc32(0, - (const char*)pending_content_rom_crc_path); - RARCH_LOG("CRC32: 0x%x .\n", (unsigned)content_rom_crc); + p_content->pending_rom_crc = false; + p_content->rom_crc = file_crc32(0, + (const char*)p_content->pending_rom_crc_path); + RARCH_LOG("CRC32: 0x%x .\n", (unsigned)p_content->rom_crc); } - return content_rom_crc; + return p_content->rom_crc; } char* content_get_subsystem_rom(unsigned index) { - return pending_subsystem_roms[index]; + content_state_t *p_content = (content_state_t*)&content_st; + return p_content->pending_subsystem_roms[index]; } bool content_is_inited(void) { - return _content_is_inited; + content_state_t *p_content = (content_state_t*)&content_st; + return p_content->is_inited; } void content_deinit(void) { unsigned i; + content_state_t *p_content = (content_state_t*)&content_st; - if (temporary_content) + if (p_content->temporary_content) { - for (i = 0; i < temporary_content->size; i++) + for (i = 0; i < p_content->temporary_content->size; i++) { - const char *path = temporary_content->elems[i].data; + const char *path = p_content->temporary_content->elems[i].data; RARCH_LOG("%s: %s.\n", msg_hash_to_str(MSG_REMOVING_TEMPORARY_CONTENT_FILE), path); @@ -2441,24 +2474,26 @@ void content_deinit(void) msg_hash_to_str(MSG_FAILED_TO_REMOVE_TEMPORARY_FILE), path); } - string_list_free(temporary_content); + string_list_free(p_content->temporary_content); } - temporary_content = NULL; - content_rom_crc = 0; - _content_is_inited = false; - core_does_not_need_content = false; - pending_content_rom_crc = false; + p_content->temporary_content = NULL; + p_content->rom_crc = 0; + p_content->is_inited = false; + p_content->core_does_not_need_content = false; + p_content->pending_rom_crc = false; } /* Set environment variables before a subsystem load */ void content_set_subsystem_info(void) { - if (!pending_subsystem_init) + content_state_t *p_content = (content_state_t*)&content_st; + if (!p_content->pending_subsystem_init) return; - path_set(RARCH_PATH_SUBSYSTEM, pending_subsystem_ident); - path_set_special(pending_subsystem_roms, pending_subsystem_rom_num); + path_set(RARCH_PATH_SUBSYSTEM, p_content->pending_subsystem_ident); + path_set_special(p_content->pending_subsystem_roms, + p_content->pending_subsystem_rom_num); } /* Initializes and loads a content file for the currently @@ -2466,6 +2501,7 @@ void content_set_subsystem_info(void) bool content_init(void) { content_information_ctx_t content_ctx; + content_state_t *p_content = (content_state_t*)&content_st; bool ret = true; char *error_string = NULL; @@ -2478,14 +2514,14 @@ bool content_init(void) const char *path_dir_system = settings->paths.directory_system; const char *path_dir_cache = settings->paths.directory_cache; - temporary_content = string_list_new(); + p_content->temporary_content = string_list_new(); content_ctx.check_firmware_before_loading = check_firmware_before_loading; content_ctx.patch_is_blocked = rarch_ctl(RARCH_CTL_IS_PATCH_BLOCKED, NULL); content_ctx.is_ips_pref = rarch_ctl(RARCH_CTL_IS_IPS_PREF, NULL); content_ctx.is_bps_pref = rarch_ctl(RARCH_CTL_IS_BPS_PREF, NULL); content_ctx.is_ups_pref = rarch_ctl(RARCH_CTL_IS_UPS_PREF, NULL); - content_ctx.temporary_content = temporary_content; + content_ctx.temporary_content = p_content->temporary_content; content_ctx.directory_system = NULL; content_ctx.directory_cache = NULL; content_ctx.name_ips = NULL; @@ -2529,10 +2565,10 @@ bool content_init(void) content_ctx.subsystem.size = sys_info->subsystem.size; } - _content_is_inited = true; - content = string_list_new(); + p_content->is_inited = true; + content = string_list_new(); - if ( !temporary_content + if ( !p_content->temporary_content || !content_file_init(&content_ctx, content, &error_string)) { content_deinit();