// Main application routine static inline void ProcessApplication( struct SEventStruct *evmask ) { core_poll( evmask ); if ( wake_up & WUR_USR ) // wake-up from stop state by keypress ui_st = PM_SLEEP; if ( evmask->timer_tick_10ms || evmask->key_event ) { ui_st = ui_poll( evmask ); } sys_pwr |= ui_st; }
int vsync_do_vsync(struct video_canvas_s *canvas, int been_skipped) { int skip_next_frame = 0; int frame_delay; int now, dopoll; /* this can happen in some rare cases; make sure emulation stops then */ while (EmuPaused != 0) { ui_poll(1); } if (FullScreenMode != 0) { EmuWindowHasInputFocus = 1; } else { RO_Caret caret; Wimp_GetCaretPosition(&caret); /* This will be used by keyboard and joystick code */ EmuWindowHasInputFocus = (canvas_for_handle(caret.WHandle) == NULL) ? 0 : 1; } now = OS_ReadMonotonicTime(); if (warp_mode_enabled) { if (skip_counter < MaxSkippedFrames) { skip_next_frame = 1; skip_counter++; } else { skip_counter = 0; } } else if (refresh_rate != 0) { if (skip_counter < refresh_rate - 1) { skip_next_frame = 1; skip_counter++; } else { skip_counter = 0; } } else { /* Use NumberOfFrames+1 because this frame isn't counted yet */ if ((VSYNC_TIME_DELTA(now, NumberOfFrames+1) < 0) && (skip_counter < MaxSkippedFrames)) { skip_next_frame = 1; skip_counter++; } else { skip_counter = 0; } } /* always pass the actual speed unless in reSID mode */ frame_delay = sound_flush(); if (frame_counter >= refresh_frequency * 2) { num_skipped_frames = 0; frame_counter = 0; } else { frame_counter++; } if (skip_next_frame == 0) { NumberOfRefreshes++; } vsync_hook(); joystick(); mousedrv_sync(); NumberOfFrames += 1 - frame_delay; /* Speed limiter? Wait */ if ((CurrentSpeedLimit != 0) && (warp_mode_enabled == 0)) { while (VSYNC_TIME_DELTA(now, NumberOfFrames) > 0) { now = OS_ReadMonotonicTime(); } } LastFrame = now; if (speed_eval_suspended) { vsync_resync_speed(); speed_eval_suspended = 0; } else { if ((now - LastSpeed) >= SpeedEvery) { int val; RelativeSpeed = (10000 * NumberOfFrames) / (FramesPerSecond * (now - LastSpeed)); ui_display_speed(RelativeSpeed, (100 * NumberOfRefreshes) / (now - LastSpeed), 0); LastSpeed = now; NumberOfFrames = 0; NumberOfRefreshes = 0; resources_get_int("MachineVideoStandard", &val); FramesPerSecond = (val == MACHINE_SYNC_PAL) ? 50 : 60; } } dopoll = 0; if ((now - LastPoll) >= PollEvery) { dopoll = 1; LastPoll = now; } ui_poll(dopoll); video_full_screen_plot_status(); kbdbuf_flush(); return skip_next_frame; }