/** * do_pre_state_checks: * @input : input sample for this frame * @old_input : input sample of the previous frame * @trigger_input : difference' input sample - difference * between 'input' and 'old_input' * * Checks for state changes in this frame. * * Unlike do_state_checks(), this is performed for both * the menu and the regular loop. * * Returns: 0. **/ static int do_pre_state_checks( retro_input_t input, retro_input_t old_input, retro_input_t trigger_input) { if (BIT64_GET(trigger_input, RARCH_OVERLAY_NEXT)) rarch_main_command(RARCH_CMD_OVERLAY_NEXT); if (!g_extern.is_paused || g_extern.is_menu) { if (BIT64_GET(trigger_input, RARCH_FULLSCREEN_TOGGLE_KEY)) rarch_main_command(RARCH_CMD_FULLSCREEN_TOGGLE); } if (BIT64_GET(trigger_input, RARCH_GRAB_MOUSE_TOGGLE)) rarch_main_command(RARCH_CMD_GRAB_MOUSE_TOGGLE); #ifdef HAVE_MENU if (check_enter_menu_func(trigger_input) || (g_extern.libretro_dummy)) do_state_check_menu_toggle(); #endif return 0; }
int rarch_main_iterate(void) { unsigned i; retro_input_t trigger_input; int ret = 0; static retro_input_t last_input = 0; retro_input_t old_input = last_input; retro_input_t input = input_keys_pressed(); last_input = input; if (driver.flushing_input) driver.flushing_input = (input) ? input_flush(&input) : false; trigger_input = input & ~old_input; if (time_to_exit(input)) return -1; if (g_extern.system.frame_time.callback) update_frame_time(); #ifdef HAVE_MENU if (check_enter_menu_func(trigger_input) || (g_extern.libretro_dummy)) do_state_check_menu_toggle(); if (g_extern.is_menu) { if (menu_iterate(input, old_input, trigger_input) == -1) rarch_main_set_state(RARCH_ACTION_STATE_MENU_RUNNING_FINISHED); if (!input && g_settings.menu.pause_libretro) ret = 1; goto success; } #endif if (g_extern.exec) { g_extern.exec = false; return -1; } if (do_state_checks(input, old_input, trigger_input)) { /* RetroArch has been paused */ driver.retro_ctx.poll_cb(); rarch_sleep(10); return 1; } #if defined(HAVE_THREADS) lock_autosave(); #endif #ifdef HAVE_NETPLAY if (driver.netplay_data) netplay_pre_frame((netplay_t*)driver.netplay_data); #endif if (g_extern.bsv.movie) bsv_movie_set_frame_start(g_extern.bsv.movie); if (g_extern.system.camera_callback.caps) driver_camera_poll(); /* Update binds for analog dpad modes. */ for (i = 0; i < MAX_PLAYERS; i++) { if (!g_settings.input.analog_dpad_mode[i]) continue; input_push_analog_dpad(g_settings.input.binds[i], g_settings.input.analog_dpad_mode[i]); input_push_analog_dpad(g_settings.input.autoconf_binds[i], g_settings.input.analog_dpad_mode[i]); } if ((g_settings.video.frame_delay > 0) && !driver.nonblock_state) rarch_sleep(g_settings.video.frame_delay); /* Run libretro for one frame. */ pretro_run(); for (i = 0; i < MAX_PLAYERS; i++) { if (!g_settings.input.analog_dpad_mode[i]) continue; input_pop_analog_dpad(g_settings.input.binds[i]); input_pop_analog_dpad(g_settings.input.autoconf_binds[i]); } if (g_extern.bsv.movie) bsv_movie_set_frame_end(g_extern.bsv.movie); #ifdef HAVE_NETPLAY if (driver.netplay_data) netplay_post_frame((netplay_t*)driver.netplay_data); #endif #if defined(HAVE_THREADS) unlock_autosave(); #endif success: if (g_settings.fastforward_ratio_throttle_enable) limit_frame_time(); return ret; }