diff --git a/runloop.c b/runloop.c index d928c814a4..90d855275d 100644 --- a/runloop.c +++ b/runloop.c @@ -825,6 +825,55 @@ static void rarch_main_cmd_get_state(driver_t *driver, RARCH_CHEAT_TOGGLE); } +/* Time to exit out of the main loop? + * Reasons for exiting: + * a) Shutdown environment callback was invoked. + * b) Quit key was pressed. + * c) Frame count exceeds or equals maximum amount of frames to run. + * d) Video driver no longer alive. + * e) End of BSV movie and BSV EOF exit is true. (TODO/FIXME - explain better) + */ +static INLINE int rarch_main_iterate_time_to_exit(event_cmd_state_t *cmd) +{ + settings_t *settings = config_get_ptr(); + global_t *global = global_get_ptr(); + driver_t *driver = driver_get_ptr(); + rarch_system_info_t *system = rarch_system_info_get_ptr(); + video_driver_t *video = driver ? (video_driver_t*)driver->video : NULL; + bool shutdown_pressed = (system && system->shutdown) || cmd->quit_key_pressed; + bool video_alive = video && video->alive(driver->video_data); + bool movie_end = (global->bsv.movie_end && global->bsv.eof_exit); + uint64_t *frame_count = video_driver_get_frame_count(); + bool frame_count_end = main_max_frames && (*frame_count >= main_max_frames); + + if (shutdown_pressed || frame_count_end || movie_end || !video_alive || global->exec) + { + if (global->exec) + global->exec = false; + + /* Quits out of RetroArch main loop. + * On special case, loads dummy core + * instead of exiting RetroArch completely. + * Aborts core shutdown if invoked. + */ + if (global->core_shutdown_initiated + && settings->load_dummy_on_core_shutdown) + { + if (!event_command(EVENT_CMD_PREPARE_DUMMY)) + return -1; + + system->shutdown = false; + global->core_shutdown_initiated = false; + + return 0; + } + + return -1; + } + + return 0; +} + /** * rarch_main_iterate: * @@ -835,6 +884,7 @@ static void rarch_main_cmd_get_state(driver_t *driver, **/ int rarch_main_iterate(unsigned *sleep_ms) { + int ret; unsigned i; retro_input_t trigger_input; event_cmd_state_t cmd; @@ -920,47 +970,11 @@ int rarch_main_iterate(unsigned *sleep_ms) rarch_main_iterate_linefeed_overlay(driver, settings); #endif - { - /* Time to exit out of the main loop? - * Reasons for exiting: - * a) Shutdown environment callback was invoked. - * b) Quit key was pressed. - * c) Frame count exceeds or equals maximum amount of frames to run. - * d) Video driver no longer alive. - * e) End of BSV movie and BSV EOF exit is true. (TODO/FIXME - explain better) - */ - video_driver_t *video = driver ? (video_driver_t*)driver->video : NULL; - bool shutdown_pressed = (system && system->shutdown) || cmd.quit_key_pressed; - bool video_alive = video && video->alive(driver->video_data); - bool movie_end = (global->bsv.movie_end && global->bsv.eof_exit); - uint64_t *frame_count = video_driver_get_frame_count(); - bool frame_count_end = main_max_frames && (*frame_count >= main_max_frames); + ret = rarch_main_iterate_time_to_exit(&cmd); - if (shutdown_pressed || frame_count_end || movie_end || !video_alive || global->exec) - { - if (global->exec) - global->exec = false; + if (ret == -1) + return -1; - /* Quits out of RetroArch main loop. - * On special case, loads dummy core - * instead of exiting RetroArch completely. - * Aborts core shutdown if invoked. - */ - if (global->core_shutdown_initiated - && settings->load_dummy_on_core_shutdown) - { - if (!event_command(EVENT_CMD_PREPARE_DUMMY)) - return -1; - - system->shutdown = false; - global->core_shutdown_initiated = false; - - return 0; - } - - return -1; - } - } #ifdef HAVE_MENU if (menu_driver_alive())