radius 2018-12-10 21:38:30 -05:00
parent 048b2df5b0
commit cad5ae287f
8 changed files with 41 additions and 28 deletions

View File

@ -1901,7 +1901,7 @@ bool command_event(enum event_command cmd, void *data)
case CMD_EVENT_LOAD_CORE: case CMD_EVENT_LOAD_CORE:
{ {
bool success = false; bool success = false;
subsystem_size = 0; subsystem_current_count = 0;
content_clear_subsystem(); content_clear_subsystem();
success = command_event(CMD_EVENT_LOAD_CORE_PERSIST, NULL); success = command_event(CMD_EVENT_LOAD_CORE_PERSIST, NULL);
(void)success; (void)success;
@ -2045,7 +2045,7 @@ bool command_event(enum event_command cmd, void *data)
#endif #endif
if (is_inited) if (is_inited)
{ {
subsystem_size = 0; subsystem_current_count = 0;
content_clear_subsystem(); content_clear_subsystem();
} }
} }

View File

@ -188,7 +188,7 @@ static bool environ_cb_get_system_info(unsigned cmd, void *data)
unsigned size = i; unsigned size = i;
const struct retro_subsystem_info *info = const struct retro_subsystem_info *info =
(const struct retro_subsystem_info*)data; (const struct retro_subsystem_info*)data;
subsystem_size = 0; subsystem_current_count = 0;
RARCH_LOG("Environ SET_SUBSYSTEM_INFO.\n"); RARCH_LOG("Environ SET_SUBSYSTEM_INFO.\n");
for (i = 0; info[i].ident; i++) for (i = 0; info[i].ident; i++)
@ -207,18 +207,24 @@ static bool environ_cb_get_system_info(unsigned cmd, void *data)
} }
RARCH_LOG("Subsystems: %d\n", i); RARCH_LOG("Subsystems: %d\n", i);
size = i; size = i;
if (size > SUBSYSTEM_MAX_SUBSYSTEMS)
RARCH_WARN("Subsystems exceed subsystem max, clamping to %d\n", SUBSYSTEM_MAX_SUBSYSTEMS);
if (system) if (system)
{ {
for (i = 0; i < size; i++) for (i = 0; i < size && i < SUBSYSTEM_MAX_SUBSYSTEMS; i++)
{ {
subsystem_data[i].desc = strdup(info[i].desc); subsystem_data[i].desc = strdup(info[i].desc);
subsystem_data[i].ident = strdup(info[i].ident); subsystem_data[i].ident = strdup(info[i].ident);
subsystem_data[i].id = info[i].id; subsystem_data[i].id = info[i].id;
subsystem_data[i].num_roms = info[i].num_roms; subsystem_data[i].num_roms = info[i].num_roms;
for (j = 0; j < subsystem_data[i].num_roms; j++) if (subsystem_data[i].num_roms > SUBSYSTEM_MAX_SUBSYSTEM_ROMS)
RARCH_WARN("Subsystems exceed subsystem max roms, clamping to %d\n", SUBSYSTEM_MAX_SUBSYSTEM_ROMS);
for (j = 0; j < subsystem_data[i].num_roms && j < SUBSYSTEM_MAX_SUBSYSTEM_ROMS; j++)
{ {
subsystem_data_roms[i][j].desc = strdup(info[i].roms[j].desc); 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].valid_extensions = strdup(info[i].roms[j].valid_extensions);
@ -229,15 +235,19 @@ static bool environ_cb_get_system_info(unsigned cmd, void *data)
subsystem_data[i].roms = subsystem_data_roms[i]; subsystem_data[i].roms = subsystem_data_roms[i];
} }
for (i = 0; i < size; i++)
subsystem_current_count = size <= SUBSYSTEM_MAX_SUBSYSTEMS ? size : SUBSYSTEM_MAX_SUBSYSTEMS;
#if 0
RARCH_LOG("Subsystems: %d\n", subsystem_current_count);
for (i = 0; i < subsystem_current_count; i++)
{ {
#if 1
RARCH_LOG("Subsystem ID: %d\n", i); RARCH_LOG("Subsystem ID: %d\n", i);
RARCH_LOG("Special game type: %s\n", subsystem_data[i].desc); RARCH_LOG("Special game type: %s\n", subsystem_data[i].desc);
RARCH_LOG(" Ident: %s\n", subsystem_data[i].ident); RARCH_LOG(" Ident: %s\n", subsystem_data[i].ident);
RARCH_LOG(" ID: %u\n", subsystem_data[i].id); RARCH_LOG(" ID: %u\n", subsystem_data[i].id);
RARCH_LOG(" Content:\n"); RARCH_LOG(" Content:\n");
#endif
for (j = 0; j < subsystem_data[i].num_roms; j++) for (j = 0; j < subsystem_data[i].num_roms; j++)
{ {
RARCH_LOG(" %s (%s)\n", RARCH_LOG(" %s (%s)\n",
@ -245,9 +255,7 @@ static bool environ_cb_get_system_info(unsigned cmd, void *data)
"required" : "optional"); "required" : "optional");
} }
} }
RARCH_LOG("Subsystems: %d\n", subsystem_size); #endif
subsystem_size = size;
RARCH_LOG("Subsystems: %d\n", subsystem_size);
} }
break; break;
} }
@ -1461,7 +1469,6 @@ bool rarch_environment_cb(unsigned cmd, void *data)
cb, offsetof(struct retro_hw_render_callback, stencil)); cb, offsetof(struct retro_hw_render_callback, stencil));
memset(hwr + offsetof(struct retro_hw_render_callback, stencil), memset(hwr + offsetof(struct retro_hw_render_callback, stencil),
0, sizeof(*cb) - offsetof(struct retro_hw_render_callback, stencil)); 0, sizeof(*cb) - offsetof(struct retro_hw_render_callback, stencil));
} }
else else
memcpy(hwr, cb, sizeof(*cb)); memcpy(hwr, cb, sizeof(*cb));

View File

@ -146,9 +146,14 @@ bool init_libretro_sym_custom(enum rarch_core_type type, struct retro_core_t *cu
**/ **/
void uninit_libretro_sym(struct retro_core_t *core); void uninit_libretro_sym(struct retro_core_t *core);
struct retro_subsystem_info subsystem_data[20]; /* Arbitrary twenty subsystems limite */
struct retro_subsystem_rom_info subsystem_data_roms[10][10]; #define SUBSYSTEM_MAX_SUBSYSTEMS 20
unsigned subsystem_size; /* Arbitrary 10 roms for each subsystem limit */
#define SUBSYSTEM_MAX_SUBSYSTEM_ROMS 10
struct retro_subsystem_info subsystem_data[SUBSYSTEM_MAX_SUBSYSTEMS];
struct retro_subsystem_rom_info subsystem_data_roms[SUBSYSTEM_MAX_SUBSYSTEMS][SUBSYSTEM_MAX_SUBSYSTEM_ROMS];
unsigned subsystem_current_count;
RETRO_END_DECLS RETRO_END_DECLS

View File

@ -521,10 +521,11 @@ static int action_bind_sublabel_subsystem_add(
char *s, size_t len) char *s, size_t len)
{ {
rarch_system_info_t *system = runloop_get_system_info(); rarch_system_info_t *system = runloop_get_system_info();
const struct retro_subsystem_info *subsystem = (system && subsystem_size > 0) ? const struct retro_subsystem_info *subsystem = (system && subsystem_current_count > 0) ?
subsystem_data + (type - MENU_SETTINGS_SUBSYSTEM_ADD) : NULL; subsystem_data + (type - MENU_SETTINGS_SUBSYSTEM_ADD) : NULL;
if (subsystem_size > 0 && content_get_subsystem_rom_id() < subsystem->num_roms) /* To-Do: localization & sublabels for pre-init case */
if (subsystem_current_count > 0 && content_get_subsystem_rom_id() < subsystem->num_roms)
snprintf(s, len, " Current Content: %s", snprintf(s, len, " Current Content: %s",
content_get_subsystem() == type - MENU_SETTINGS_SUBSYSTEM_ADD content_get_subsystem() == type - MENU_SETTINGS_SUBSYSTEM_ADD
? subsystem->roms[content_get_subsystem_rom_id()].desc ? subsystem->roms[content_get_subsystem_rom_id()].desc

View File

@ -596,10 +596,10 @@ static int ozone_list_push(void *data, void *userdata,
entry.enum_idx = MENU_ENUM_LABEL_LOAD_CONTENT_LIST; entry.enum_idx = MENU_ENUM_LABEL_LOAD_CONTENT_LIST;
menu_displaylist_setting(&entry); menu_displaylist_setting(&entry);
if (subsystem_size > 0) if (subsystem_current_count > 0)
{ {
const struct retro_subsystem_info* subsystem = subsystem_data; const struct retro_subsystem_info* subsystem = subsystem_data;
for (i = 0; i < subsystem_size; i++, subsystem++) for (i = 0; i < subsystem_current_count; i++, subsystem++)
{ {
char s[PATH_MAX_LENGTH]; char s[PATH_MAX_LENGTH];
if (content_get_subsystem() == i) if (content_get_subsystem() == i)

View File

@ -5548,10 +5548,10 @@ static int xmb_list_push(void *data, void *userdata,
entry.enum_idx = MENU_ENUM_LABEL_LOAD_CONTENT_LIST; entry.enum_idx = MENU_ENUM_LABEL_LOAD_CONTENT_LIST;
menu_displaylist_setting(&entry); menu_displaylist_setting(&entry);
if (subsystem_size > 0) if (subsystem_current_count > 0)
{ {
const struct retro_subsystem_info* subsystem = subsystem_data; const struct retro_subsystem_info* subsystem = subsystem_data;
for (i = 0; i < subsystem_size; i++, subsystem++) for (i = 0; i < subsystem_current_count; i++, subsystem++)
{ {
char s[PATH_MAX_LENGTH]; char s[PATH_MAX_LENGTH];
if (content_get_subsystem() == i) if (content_get_subsystem() == i)

View File

@ -86,7 +86,7 @@ void filebrowser_parse(menu_displaylist_info_t *info, unsigned type_data)
{ {
const struct retro_subsystem_info *subsystem = &subsystem_data[content_get_subsystem()]; const struct retro_subsystem_info *subsystem = &subsystem_data[content_get_subsystem()];
if (subsystem_size > 0) if (subsystem_current_count > 0)
str_list = file_archive_get_file_list(path, subsystem->roms[content_get_subsystem_rom_id()].valid_extensions); str_list = file_archive_get_file_list(path, subsystem->roms[content_get_subsystem_rom_id()].valid_extensions);
} }
} }
@ -96,7 +96,7 @@ void filebrowser_parse(menu_displaylist_info_t *info, unsigned type_data)
{ {
const struct retro_subsystem_info *subsystem = &subsystem_data[content_get_subsystem()]; const struct retro_subsystem_info *subsystem = &subsystem_data[content_get_subsystem()];
if (subsystem_size > 0 && content_get_subsystem_rom_id() < subsystem->num_roms) if (subsystem_current_count > 0 && content_get_subsystem_rom_id() < subsystem->num_roms)
str_list = dir_list_new(path, str_list = dir_list_new(path,
(filter_ext && info) ? subsystem->roms[content_get_subsystem_rom_id()].valid_extensions : NULL, (filter_ext && info) ? subsystem->roms[content_get_subsystem_rom_id()].valid_extensions : NULL,
true, settings->bools.show_hidden_files, true, false); true, settings->bools.show_hidden_files, true, false);

View File

@ -663,7 +663,7 @@ error:
static const struct static const struct
retro_subsystem_info *content_file_init_subsystem( retro_subsystem_info *content_file_init_subsystem(
const struct retro_subsystem_info *subsystem_data, const struct retro_subsystem_info *subsystem_data,
size_t subsystem_size, size_t subsystem_current_count,
char **error_string, char **error_string,
bool *ret) bool *ret)
{ {
@ -671,7 +671,7 @@ retro_subsystem_info *content_file_init_subsystem(
char *msg = (char*)malloc(path_size); char *msg = (char*)malloc(path_size);
struct string_list *subsystem = path_get_subsystem_list(); struct string_list *subsystem = path_get_subsystem_list();
const struct retro_subsystem_info *special = libretro_find_subsystem_info( const struct retro_subsystem_info *special = libretro_find_subsystem_info(
subsystem_data, subsystem_size, subsystem_data, subsystem_current_count,
path_get(RARCH_PATH_SUBSYSTEM)); path_get(RARCH_PATH_SUBSYSTEM));
msg[0] = '\0'; msg[0] = '\0';
@ -1786,7 +1786,7 @@ void content_set_subsystem(unsigned idx)
pending_subsystem_id = idx; pending_subsystem_id = idx;
if (subsystem_size > 0) if (subsystem_current_count > 0)
{ {
strlcpy(pending_subsystem_ident, strlcpy(pending_subsystem_ident,
subsystem->ident, sizeof(pending_subsystem_ident)); subsystem->ident, sizeof(pending_subsystem_ident));