From fa213a724f2aaf0cc48245ae219fe16e289f3393 Mon Sep 17 00:00:00 2001 From: jdgleaver <38211560+jdgleaver@users.noreply.github.com> Date: Wed, 26 Jan 2022 17:30:07 +0000 Subject: [PATCH] Fix crash when cores using RETRO_ENVIRONMENT_SET_AUDIO_CALLBACK return false from retro_load_game() (#13547) --- retroarch.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/retroarch.c b/retroarch.c index 823c7ad694..bf4297f2ad 100644 --- a/retroarch.c +++ b/retroarch.c @@ -2360,9 +2360,10 @@ bool command_event(enum event_command cmd, void *data) } case CMD_EVENT_CORE_INIT: { - enum rarch_core_type *type = (enum rarch_core_type*)data; - rarch_system_info_t *sys_info = &runloop_st->system; - input_driver_state_t *input_st= input_state_get_ptr(); + enum rarch_core_type *type = (enum rarch_core_type*)data; + rarch_system_info_t *sys_info = &runloop_st->system; + input_driver_state_t *input_st = input_state_get_ptr(); + audio_driver_state_t *audio_st = audio_state_get_ptr(); content_reset_savestate_backups(); @@ -2370,8 +2371,19 @@ bool command_event(enum event_command cmd, void *data) if (sys_info) disk_control_set_ext_callback(&sys_info->disk_control, NULL); + /* Ensure that audio callback interface is reset */ + audio_st->callback.callback = NULL; + audio_st->callback.set_state = NULL; + if (!type || !runloop_event_init_core(settings, input_st, *type)) + { + /* If core failed to initialise, audio callback + * interface may be assigned invalid function + * pointers -> ensure it is reset */ + audio_st->callback.callback = NULL; + audio_st->callback.set_state = NULL; return false; + } } break; case CMD_EVENT_VIDEO_APPLY_STATE_CHANGES: