Add API extension for cores to query the number of active inputs provided by the frontend

This commit is contained in:
jdgleaver 2020-08-11 14:07:00 +01:00
parent d3b234f404
commit ee8a2f4268
2 changed files with 40 additions and 16 deletions

View File

@ -1321,6 +1321,18 @@ enum retro_mod
* fallback, stderr). * fallback, stderr).
*/ */
#define RETRO_ENVIRONMENT_GET_INPUT_MAX_USERS 61
/* unsigned * --
* Unsigned value is the number of active input devices
* provided by the frontend. This may change at any time.
* If callback returns true, a core need not poll any
* input device with an index greater than or equal to
* the number of active devices.
* If callback returns false, the number of active input
* devices is unknown. In this case, all input devices
* should be considered active.
*/
/* VFS functionality */ /* VFS functionality */
/* File paths: /* File paths:

View File

@ -2143,12 +2143,12 @@ struct rarch_state
#if defined(HAVE_RUNAHEAD) #if defined(HAVE_RUNAHEAD)
#if defined(HAVE_DYNAMIC) || defined(HAVE_DYLIB) #if defined(HAVE_DYNAMIC) || defined(HAVE_DYLIB)
int port_map[16]; int port_map[MAX_USERS];
#endif #endif
#endif #endif
#if defined(HAVE_ACCESSIBILITY) && defined(HAVE_TRANSLATE) #if defined(HAVE_ACCESSIBILITY) && defined(HAVE_TRANSLATE)
int ai_gamepad_state[16]; int ai_gamepad_state[MAX_USERS];
#endif #endif
#ifdef HAVE_NETWORKING #ifdef HAVE_NETWORKING
int reannounce; int reannounce;
@ -14507,8 +14507,8 @@ static void command_event_init_controllers(struct rarch_state *p_rarch)
const char *ident = NULL; const char *ident = NULL;
bool set_controller = false; bool set_controller = false;
const struct retro_controller_description *desc = NULL; const struct retro_controller_description *desc = NULL;
unsigned max_users = p_rarch->input_driver_max_users; unsigned num_active_users = p_rarch->input_driver_max_users;
unsigned device = (i < max_users) unsigned device = (i < num_active_users)
? input_config_get_device(i) ? input_config_get_device(i)
: RETRO_DEVICE_NONE; : RETRO_DEVICE_NONE;
@ -20064,6 +20064,10 @@ static bool rarch_environment_cb(unsigned cmd, void *data)
break; break;
} }
case RETRO_ENVIRONMENT_GET_INPUT_MAX_USERS:
*(unsigned *)data = p_rarch->input_driver_max_users;
break;
/* Private environment callbacks. /* Private environment callbacks.
* *
* Should all be properly addressed in version 2. * Should all be properly addressed in version 2.
@ -20643,7 +20647,7 @@ static void remember_controller_port_device(
struct rarch_state *p_rarch, struct rarch_state *p_rarch,
long port, long device) long port, long device)
{ {
if (port >= 0 && port < 16) if (port >= 0 && port < MAX_USERS)
p_rarch->port_map[port] = (int)device; p_rarch->port_map[port] = (int)device;
if (p_rarch->secondary_module && p_rarch->secondary_core.retro_set_controller_port_device) if (p_rarch->secondary_module && p_rarch->secondary_core.retro_set_controller_port_device)
p_rarch->secondary_core.retro_set_controller_port_device((unsigned)port, (unsigned)device); p_rarch->secondary_core.retro_set_controller_port_device((unsigned)port, (unsigned)device);
@ -20653,7 +20657,7 @@ static void clear_controller_port_map(struct rarch_state *p_rarch)
{ {
unsigned port; unsigned port;
for (port = 0; port < 16; port++) for (port = 0; port < MAX_USERS; port++)
p_rarch->port_map[port] = -1; p_rarch->port_map[port] = -1;
} }
@ -20843,11 +20847,13 @@ static bool rarch_environment_secondary_core_hook(
static bool secondary_core_create(struct rarch_state *p_rarch) static bool secondary_core_create(struct rarch_state *p_rarch)
{ {
long port, device; unsigned port;
bool contentless = false; bool contentless = false;
bool is_inited = false; bool is_inited = false;
const enum rarch_core_type const enum rarch_core_type
last_core_type = p_rarch->last_core_type; last_core_type = p_rarch->last_core_type;
rarch_system_info_t *info = &p_rarch->runloop_system;
unsigned num_active_users = p_rarch->input_driver_max_users;
if ( last_core_type != CORE_TYPE_PLAIN || if ( last_core_type != CORE_TYPE_PLAIN ||
!p_rarch->load_content_info || !p_rarch->load_content_info ||
@ -20913,13 +20919,19 @@ static bool secondary_core_create(struct rarch_state *p_rarch)
p_rarch->secondary_core.retro_set_input_state(p_rarch->secondary_callbacks.state_cb); p_rarch->secondary_core.retro_set_input_state(p_rarch->secondary_callbacks.state_cb);
p_rarch->secondary_core.retro_set_input_poll(p_rarch->secondary_callbacks.poll_cb); p_rarch->secondary_core.retro_set_input_poll(p_rarch->secondary_callbacks.poll_cb);
for (port = 0; port < 16; port++) if (info)
for (port = 0; port < MAX_USERS; port++)
{ {
device = p_rarch->port_map[port]; if (port < info->ports.size)
if (device >= 0) {
unsigned device = (port < num_active_users) ?
p_rarch->port_map[port] : RETRO_DEVICE_NONE;
p_rarch->secondary_core.retro_set_controller_port_device( p_rarch->secondary_core.retro_set_controller_port_device(
(unsigned)port, (unsigned)device); port, device);
} }
}
clear_controller_port_map(p_rarch); clear_controller_port_map(p_rarch);
return true; return true;
@ -38563,7 +38575,7 @@ static enum runloop_state runloop_check_state(
p_rarch->gamepad_input_override = 0; p_rarch->gamepad_input_override = 0;
for (i = 0; i < 16; i++) for (i = 0; i < MAX_USERS; i++)
{ {
if (p_rarch->ai_gamepad_state[i] == 2) if (p_rarch->ai_gamepad_state[i] == 2)
set_gamepad_input_override(p_rarch, i, true); set_gamepad_input_override(p_rarch, i, true);