ferretro/ferretro_components/src/provided/sdl2/fps.rs

35 lines
1.0 KiB
Rust

use crate::base::ControlFlow;
use crate::prelude::*;
use sdl2::gfx::framerate::FPSManager;
pub struct SimpleSdl2FramerateLimitComponent {
did_sleep: bool,
started_video: bool,
fps_manager: FPSManager,
}
impl RetroComponent for SimpleSdl2FramerateLimitComponent {
fn pre_run(&mut self, _retro: &mut LibretroWrapper) -> ControlFlow {
self.did_sleep = false;
ControlFlow::Continue
}
fn post_run(&mut self, _retro: &mut LibretroWrapper) -> ControlFlow {
if self.started_video && !self.did_sleep {
self.fps_manager.delay();
}
ControlFlow::Continue
}
}
impl RetroCallbacks for SimpleSdl2FramerateLimitComponent {
fn video_refresh(&mut self, _frame: &VideoFrame) {
self.started_video = true;
self.fps_manager.delay();
self.did_sleep = true;
}
fn set_system_av_info(&mut self, system_av_info: &SystemAvInfo) -> Option<bool> {
self.fps_manager.set_framerate(system_av_info.timing.fps.round() as u32).ok().map(|_| true)
}
}