diff --git a/.vscode/settings.json b/.vscode/settings.json index c44832dca4..386e8341f9 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -41,6 +41,8 @@ "ozone_texture.h": "c", "string_list.h": "c", "core_info.h": "c" + "thread": "c", + "xlocale": "c" }, "C_Cpp.dimInactiveRegions": false, } \ No newline at end of file diff --git a/command.c b/command.c index a87a52e1e4..a378a97de9 100644 --- a/command.c +++ b/command.c @@ -1899,6 +1899,8 @@ bool command_event(enum event_command cmd, void *data) break; case CMD_EVENT_LOAD_CORE: { + subsystem_size = 0; + content_clear_subsystem(); bool success = command_event(CMD_EVENT_LOAD_CORE_PERSIST, NULL); (void)success; @@ -2019,8 +2021,10 @@ bool command_event(enum event_command cmd, void *data) command_event(CMD_EVENT_RESTORE_REMAPS, NULL); if (is_inited) + { if (!task_push_start_dummy_core(&content_info)) return false; + } #ifdef HAVE_DYNAMIC path_clear(RARCH_PATH_CORE); rarch_ctl(RARCH_CTL_SYSTEM_INFO_FREE, NULL); @@ -2037,6 +2041,11 @@ bool command_event(enum event_command cmd, void *data) command_event(CMD_EVENT_DISCORD_UPDATE, &userdata); } #endif + if (is_inited) + { + subsystem_size = 0; + content_clear_subsystem(); + } } break; case CMD_EVENT_QUIT: diff --git a/dynamic.c b/dynamic.c index 04698748e3..bacbefde07 100644 --- a/dynamic.c +++ b/dynamic.c @@ -176,12 +176,80 @@ void libretro_free_system_info(struct retro_system_info *info) static bool environ_cb_get_system_info(unsigned cmd, void *data) { + rarch_system_info_t *system = runloop_get_system_info(); switch (cmd) { case RETRO_ENVIRONMENT_SET_SUPPORT_NO_GAME: *load_no_content_hook = *(const bool*)data; break; + case RETRO_ENVIRONMENT_SET_SUBSYSTEM_INFO: + { + unsigned i, j; + const struct retro_subsystem_info *info = + (const struct retro_subsystem_info*)data; + subsystem_size = 0; + RARCH_LOG("Environ SET_SUBSYSTEM_INFO.\n"); + for (i = 0; info[i].ident; i++) + { + RARCH_LOG("Subsystem ID: %d\n", i); + RARCH_LOG("Special game type: %s\n", info[i].desc); + RARCH_LOG(" Ident: %s\n", info[i].ident); + RARCH_LOG(" ID: %u\n", info[i].id); + RARCH_LOG(" Content:\n"); + for (j = 0; j < info[i].num_roms; j++) + { + RARCH_LOG(" %s (%s)\n", + info[i].roms[j].desc, info[i].roms[j].required ? + "required" : "optional"); + } + } + + RARCH_LOG("Subsystems: %d\n", i); + unsigned size = i; + + if (system) + { + for (i = 0; i < size; i++) + { + subsystem_data[i].desc = strdup(info[i].desc); + subsystem_data[i].ident = strdup(info[i].ident); + subsystem_data[i].id = info[i].id; + subsystem_data[i].num_roms = info[i].num_roms; + + for (j = 0; j < subsystem_data[i].num_roms; j++) + { + subsystem_data_roms[i][j].desc = strdup(info[i].roms[j].desc); + subsystem_data_roms[i][j].valid_extensions = strdup(info[i].roms[j].valid_extensions); + subsystem_data_roms[i][j].required = info[i].roms[j].required; + subsystem_data_roms[i][j].block_extract = info[i].roms[j].block_extract; + subsystem_data_roms[i][j].need_fullpath = info[i].roms[j].need_fullpath; + } + subsystem_data[i].roms = subsystem_data_roms[i]; + } + + for (i = 0; i < size; i++) + { +#if 1 + RARCH_LOG("Subsystem ID: %d\n", i); + RARCH_LOG("Special game type: %s\n", subsystem_data[i].desc); + RARCH_LOG(" Ident: %s\n", subsystem_data[i].ident); + RARCH_LOG(" ID: %u\n", subsystem_data[i].id); + RARCH_LOG(" Content:\n"); +#endif + for (j = 0; j < subsystem_data[i].num_roms; j++) + { + RARCH_LOG(" %s (%s)\n", + subsystem_data[i].roms[j].desc, subsystem_data[i].roms[j].required ? + "required" : "optional"); + } + } + RARCH_LOG("Subsystems: %d\n", subsystem_size); + subsystem_size = size; + RARCH_LOG("Subsystems: %d\n", subsystem_size); + } + break; + } default: return false; } @@ -396,7 +464,6 @@ bool libretro_get_system_info(const char *path, #ifdef HAVE_DYNAMIC dylib_close(lib); #endif - return true; } diff --git a/dynamic.h b/dynamic.h index e930a2edc8..505082bc97 100644 --- a/dynamic.h +++ b/dynamic.h @@ -146,6 +146,10 @@ bool init_libretro_sym_custom(enum rarch_core_type type, struct retro_core_t *cu **/ void uninit_libretro_sym(struct retro_core_t *core); +struct retro_subsystem_info subsystem_data[20]; +struct retro_subsystem_rom_info subsystem_data_roms[10][10]; +unsigned subsystem_size; + RETRO_END_DECLS #endif diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index c4ff5f6cf5..0c61484fc3 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -40,6 +40,7 @@ #include "../../retroarch.h" #include "../../content.h" +#include "../../dynamic.h" #include "../../configuration.h" #include "../../managers/cheat_manager.h" @@ -513,14 +514,14 @@ static int action_bind_sublabel_subsystem_add( char *s, size_t len) { rarch_system_info_t *system = runloop_get_system_info(); - const struct retro_subsystem_info *subsystem = (system && system->subsystem.data) ? - system->subsystem.data + (type - MENU_SETTINGS_SUBSYSTEM_ADD) : NULL; + const struct retro_subsystem_info *subsystem = (system && subsystem_size > 0) ? + subsystem_data + (type - MENU_SETTINGS_SUBSYSTEM_ADD) : NULL; - if (subsystem && content_get_subsystem_rom_id() < subsystem->num_roms) + if (subsystem_size > 0 && content_get_subsystem_rom_id() < subsystem->num_roms) snprintf(s, len, " Current Content: %s", - content_get_subsystem() == type - MENU_SETTINGS_SUBSYSTEM_ADD - ? subsystem->roms[content_get_subsystem_rom_id()].desc - : subsystem->roms[0].desc); + content_get_subsystem() == type - MENU_SETTINGS_SUBSYSTEM_ADD + ? subsystem->roms[content_get_subsystem_rom_id()].desc + : subsystem->roms[0].desc); return 0; } @@ -539,8 +540,8 @@ static int action_bind_sublabel_remap_kbd_sublabel( input_config_get_device_display_name(user_idx) ? input_config_get_device_display_name(user_idx) : (input_config_get_device_name(user_idx) ? - input_config_get_device_name(user_idx) : - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE))); + input_config_get_device_name(user_idx) : + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE))); return 0; } diff --git a/menu/drivers/nuklear/nk_common.c b/menu/drivers/nuklear/nk_common.c index 67323c0cf1..61800585fd 100644 --- a/menu/drivers/nuklear/nk_common.c +++ b/menu/drivers/nuklear/nk_common.c @@ -1,7 +1,7 @@ /* RetroArch - A frontend for libretro. * Copyright (C) 2011-2017 - Daniel De Matteis - * Copyright (C) 2014-2017 - Jean-Andr� Santoni - * Copyright (C) 2016-2017 - Andr�s Su�rez + * Copyright (C) 2014-2017 - Jean-André Santoni + * Copyright (C) 2016-2017 - Andrés Suárez * * RetroArch is free software: you can redistribute it and/or modify it under the terms * of the GNU General Public License as published by the Free Software Found- diff --git a/menu/drivers/ozone/ozone.c b/menu/drivers/ozone/ozone.c index 556b59fe20..4dbea26628 100644 --- a/menu/drivers/ozone/ozone.c +++ b/menu/drivers/ozone/ozone.c @@ -45,6 +45,7 @@ #include "../../../core.h" #include "../../../verbosity.h" #include "../../../tasks/tasks_internal.h" +#include "../../../dynamic.h" ozone_node_t *ozone_alloc_node() { @@ -583,16 +584,16 @@ static int ozone_list_push(void *data, void *userdata, if (settings->bools.menu_show_load_content) { - const struct retro_subsystem_info* subsystem = NULL; - entry.enum_idx = MENU_ENUM_LABEL_LOAD_CONTENT_LIST; menu_displaylist_setting(&entry); subsystem = system->subsystem.data; - if (subsystem) + if (subsystem_size > 0) { - for (i = 0; i < (unsigned)system->subsystem.size; i++, subsystem++) + const struct retro_subsystem_info* subsystem = NULL; + subsystem = subsystem_data; + for (i = 0; i < subsystem_size; i++, subsystem++) { char s[PATH_MAX_LENGTH]; if (content_get_subsystem() == i) diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index 2a2f542a0e..da7dbb0a25 100755 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -55,6 +55,7 @@ #include "../widgets/menu_filebrowser.h" #include "../../verbosity.h" +#include "../../dynamic.h" #include "../../configuration.h" #include "../../playlist.h" #include "../../retroarch.h" @@ -5597,16 +5598,15 @@ static int xmb_list_push(void *data, void *userdata, if (settings->bools.menu_show_load_content) { - const struct retro_subsystem_info* subsystem = NULL; + entry.enum_idx = MENU_ENUM_LABEL_LOAD_CONTENT_LIST; menu_displaylist_setting(&entry); - - subsystem = system->subsystem.data; - - if (subsystem) + if (subsystem_size > 0) { - for (i = 0; i < (unsigned)system->subsystem.size; i++, subsystem++) + const struct retro_subsystem_info* subsystem = NULL; + subsystem = subsystem_data; + for (i = 0; i < subsystem_size; i++, subsystem++) { char s[PATH_MAX_LENGTH]; if (content_get_subsystem() == i) diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index c009494f51..2aa5f9348d 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -1,7 +1,7 @@ /* RetroArch - A frontend for libretro. * Copyright (C) 2011-2017 - Daniel De Matteis - * Copyright (C) 2014-2017 - Jean-André Santoni - * Copyright (C) 2015-2017 - Andrés Suárez + * Copyright (C) 2014-2017 - Jean-André Santoni + * Copyright (C) 2015-2017 - Andrés Suárez * Copyright (C) 2016-2017 - Brad Parker * * RetroArch is free software: you can redistribute it and/or modify it under the terms @@ -2584,25 +2584,6 @@ static int menu_displaylist_parse_load_content_settings( #endif rarch_system_info_t *system = runloop_get_system_info(); -#if 0 - const struct retro_subsystem_info* subsystem = system ? system->subsystem.data : NULL; - - if (subsystem) - { - unsigned p; - - for (p = 0; p < system->subsystem.size; p++, subsystem++) - { - char s[PATH_MAX_LENGTH]; - snprintf(s, sizeof(s), "%s (%s)", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LOAD_CONTENT_LIST), subsystem->desc); - menu_entries_append_enum(info->list, - s, - msg_hash_to_str(MENU_ENUM_LABEL_LOAD_CONTENT_SPECIAL), - MENU_ENUM_LABEL_LOAD_CONTENT_SPECIAL, - MENU_SETTING_ACTION, 0, 0); - } - } -#endif menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_RESUME_CONTENT), msg_hash_to_str(MENU_ENUM_LABEL_RESUME_CONTENT), @@ -2633,7 +2614,7 @@ static int menu_displaylist_parse_load_content_settings( if (settings->bools.quick_menu_show_save_load_state #ifdef HAVE_CHEEVOS - && !cheevos_hardcore_active + && !cheevos_hardcore_active #endif ) { diff --git a/menu/widgets/menu_filebrowser.c b/menu/widgets/menu_filebrowser.c index 89fe44c091..ee19acefbe 100644 --- a/menu/widgets/menu_filebrowser.c +++ b/menu/widgets/menu_filebrowser.c @@ -39,6 +39,7 @@ #include "../../core.h" #include "../../content.h" #include "../../verbosity.h" +#include "../../dynamic.h" static enum filebrowser_enums filebrowser_types = FILEBROWSER_NONE; @@ -83,10 +84,9 @@ void filebrowser_parse(menu_displaylist_info_t *info, unsigned type_data) str_list = file_archive_get_file_list(path, info->exts); else { - rarch_system_info_t *system = runloop_get_system_info(); - const struct retro_subsystem_info *subsystem = system->subsystem.data + content_get_subsystem(); + const struct retro_subsystem_info *subsystem = &subsystem_data[content_get_subsystem()]; - if (subsystem) + if (subsystem_size > 0) str_list = file_archive_get_file_list(path, subsystem->roms[content_get_subsystem_rom_id()].valid_extensions); } } @@ -94,11 +94,9 @@ void filebrowser_parse(menu_displaylist_info_t *info, unsigned type_data) { if (filebrowser_types == FILEBROWSER_SELECT_FILE_SUBSYSTEM) { - rarch_system_info_t *system = runloop_get_system_info(); - const struct retro_subsystem_info *subsystem = - system->subsystem.data + content_get_subsystem(); + const struct retro_subsystem_info *subsystem = &subsystem_data[content_get_subsystem()]; - if (subsystem && content_get_subsystem_rom_id() < subsystem->num_roms) + if (subsystem_size > 0 && content_get_subsystem_rom_id() < subsystem->num_roms) str_list = dir_list_new(path, (filter_ext && info) ? subsystem->roms[content_get_subsystem_rom_id()].valid_extensions : NULL, true, settings->bools.show_hidden_files, true, false); diff --git a/paths.c b/paths.c index b956989638..869d6b8e34 100644 --- a/paths.c +++ b/paths.c @@ -311,7 +311,7 @@ static bool path_init_subsystem(void) /* For subsystems, we know exactly which RAM types are supported. */ info = libretro_find_subsystem_info( - system->subsystem.data, + subsystem_data, system->subsystem.size, path_get(RARCH_PATH_SUBSYSTEM)); diff --git a/tasks/task_content.c b/tasks/task_content.c index af28c4fcac..3db8f943b0 100644 --- a/tasks/task_content.c +++ b/tasks/task_content.c @@ -1782,11 +1782,11 @@ void content_set_subsystem(unsigned idx) { rarch_system_info_t *system = runloop_get_system_info(); const struct retro_subsystem_info *subsystem = system ? - system->subsystem.data + idx : NULL; + subsystem_data + idx : NULL; pending_subsystem_id = idx; - if (subsystem) + if (subsystem_size > 0) { strlcpy(pending_subsystem_ident, subsystem->ident, sizeof(pending_subsystem_ident));