VIDEO: Move gamecontroller/joystick cleanup to the right place.

This commit is contained in:
Mark Pizzolato 2020-06-11 12:53:28 -07:00
parent ebb327bff6
commit 737f31fea0

View file

@ -354,6 +354,8 @@ t_bool vid_ready;
char vid_title[128]; char vid_title[128];
static void vid_beep_setup (int duration_ms, int tone_frequency); static void vid_beep_setup (int duration_ms, int tone_frequency);
static void vid_beep_cleanup (void); static void vid_beep_cleanup (void);
static void vid_init_controllers (void);
static void vid_cleanup_controllers (void);
t_bool vid_key_state[SDL_NUM_SCANCODES]; t_bool vid_key_state[SDL_NUM_SCANCODES];
SDL_Texture *vid_texture; /* video buffer in GPU */ SDL_Texture *vid_texture; /* video buffer in GPU */
SDL_Renderer *vid_renderer; SDL_Renderer *vid_renderer;
@ -508,67 +510,81 @@ return SCPE_OK;
} }
#endif #endif
static t_stat vid_init_controllers (void) static void vid_init_controllers (void)
{ {
SDL_Joystick *y; SDL_Joystick *y;
SDL_version ver; SDL_version ver;
int i, n; int i, n;
if (vid_gamepad_inited) if (vid_gamepad_inited)
return SCPE_OK; return;
/* Chech that the SDL_GameControllerFromInstanceID function is /* Chech that the SDL_GameControllerFromInstanceID function is
available at run time. */ available at run time. */
SDL_GetVersion(&ver); SDL_GetVersion(&ver);
vid_gamepad_ok = (ver.major > 2 || vid_gamepad_ok = (ver.major > 2 ||
(ver.major == 2 && (ver.minor > 0 || ver.patch >= 4))); (ver.major == 2 && (ver.minor > 0 || ver.patch >= 4)));
if (vid_gamepad_ok)
SDL_InitSubSystem(SDL_INIT_GAMECONTROLLER);
else
SDL_InitSubSystem(SDL_INIT_JOYSTICK);
if (SDL_JoystickEventState (SDL_ENABLE) < 0) {
if (vid_gamepad_ok) if (vid_gamepad_ok)
SDL_InitSubSystem(SDL_INIT_GAMECONTROLLER); SDL_QuitSubSystem(SDL_INIT_GAMECONTROLLER);
else else
SDL_InitSubSystem(SDL_INIT_JOYSTICK); SDL_QuitSubSystem(SDL_INIT_JOYSTICK);
sim_printf ("%s: vid_init_controllers(): SDL_JoystickEventState error: %s\n", vid_dname(vid_dev), SDL_GetError());
return;
}
if (SDL_JoystickEventState (SDL_ENABLE) < 0) { if (vid_gamepad_ok && SDL_GameControllerEventState (SDL_ENABLE) < 0) {
if (vid_gamepad_ok) if (vid_gamepad_ok)
SDL_QuitSubSystem(SDL_INIT_GAMECONTROLLER); SDL_QuitSubSystem(SDL_INIT_GAMECONTROLLER);
else else
SDL_QuitSubSystem(SDL_INIT_JOYSTICK); SDL_QuitSubSystem(SDL_INIT_JOYSTICK);
return SCPE_IOERR; sim_printf ("%s: vid_init_controllers(): SDL_GameControllerEventState error: %s\n", vid_dname(vid_dev), SDL_GetError());
} return;
}
if (vid_gamepad_ok && SDL_GameControllerEventState (SDL_ENABLE) < 0) { n = SDL_NumJoysticks();
if (vid_gamepad_ok)
SDL_QuitSubSystem(SDL_INIT_GAMECONTROLLER);
else
SDL_QuitSubSystem(SDL_INIT_JOYSTICK);
return SCPE_IOERR;
}
n = SDL_NumJoysticks(); for (i = 0; i < n; i++) {
if (vid_gamepad_ok && SDL_IsGameController (i)) {
for (i = 0; i < n; i++) { SDL_GameController *x = SDL_GameControllerOpen (i);
if (vid_gamepad_ok && SDL_IsGameController (i)) { if (x != NULL) {
SDL_GameController *x = SDL_GameControllerOpen (i); sim_debug (SIM_VID_DBG_VIDEO, vid_dev,
if (x != NULL) { "Game controller: %s\n", SDL_GameControllerNameForIndex(i));
sim_debug (SIM_VID_DBG_VIDEO, vid_dev,
"Game controller: %s\n", SDL_GameControllerNameForIndex(i));
}
}
else {
y = SDL_JoystickOpen (i);
if (y != NULL) {
sim_debug (SIM_VID_DBG_VIDEO, vid_dev,
"Joystick: %s\n", SDL_JoystickNameForIndex(i));
sim_debug (SIM_VID_DBG_VIDEO, vid_dev,
"Number of axes: %d, buttons: %d\n",
SDL_JoystickNumAxes(y),
SDL_JoystickNumButtons(y));
}
} }
} }
else {
y = SDL_JoystickOpen (i);
if (y != NULL) {
sim_debug (SIM_VID_DBG_VIDEO, vid_dev,
"Joystick: %s\n", SDL_JoystickNameForIndex(i));
sim_debug (SIM_VID_DBG_VIDEO, vid_dev,
"Number of axes: %d, buttons: %d\n",
SDL_JoystickNumAxes(y),
SDL_JoystickNumButtons(y));
}
}
}
vid_gamepad_inited = 1; vid_gamepad_inited = 1;
return SCPE_OK; }
static void vid_cleanup_controllers (void)
{
if (vid_gamepad_inited) {
vid_gamepad_inited = 0;
memset (motion_callback, 0, sizeof motion_callback);
memset (button_callback, 0, sizeof button_callback);
if (vid_gamepad_ok)
SDL_QuitSubSystem(SDL_INIT_GAMECONTROLLER);
else
SDL_QuitSubSystem(SDL_INIT_JOYSTICK);
}
} }
t_stat vid_open (DEVICE *dptr, const char *title, uint32 width, uint32 height, int flags) t_stat vid_open (DEVICE *dptr, const char *title, uint32 width, uint32 height, int flags)
@ -606,10 +622,7 @@ if (!vid_active) {
if (stat != SCPE_OK) if (stat != SCPE_OK)
return stat; return stat;
if (vid_init_controllers () != SCPE_OK) { vid_init_controllers ();
sim_debug (SIM_VID_DBG_VIDEO, vid_dev,
"vid_open() - Failed initializing game controllers\n");
}
sim_debug (SIM_VID_DBG_VIDEO|SIM_VID_DBG_KEY|SIM_VID_DBG_MOUSE, vid_dev, "vid_open() - Success\n"); sim_debug (SIM_VID_DBG_VIDEO|SIM_VID_DBG_KEY|SIM_VID_DBG_MOUSE, vid_dev, "vid_open() - Success\n");
} }
@ -641,14 +654,6 @@ if (vid_active) {
while (vid_ready) while (vid_ready)
sim_os_ms_sleep (10); sim_os_ms_sleep (10);
vid_gamepad_inited = 0;
memset (motion_callback, 0, sizeof motion_callback);
memset (button_callback, 0, sizeof button_callback);
if (vid_gamepad_ok)
SDL_QuitSubSystem(SDL_INIT_GAMECONTROLLER);
else
SDL_QuitSubSystem(SDL_INIT_JOYSTICK);
if (vid_mouse_events.sem) { if (vid_mouse_events.sem) {
SDL_DestroySemaphore(vid_mouse_events.sem); SDL_DestroySemaphore(vid_mouse_events.sem);
vid_mouse_events.sem = NULL; vid_mouse_events.sem = NULL;
@ -657,6 +662,7 @@ if (vid_active) {
SDL_DestroySemaphore(vid_key_events.sem); SDL_DestroySemaphore(vid_key_events.sem);
vid_key_events.sem = NULL; vid_key_events.sem = NULL;
} }
vid_cleanup_controllers ();
} }
return SCPE_OK; return SCPE_OK;
} }