37 lines
1.0 KiB
Rust
37 lines
1.0 KiB
Rust
use crate::base::ControlFlow;
|
|
use crate::prelude::*;
|
|
|
|
use std::os::raw::c_uint;
|
|
|
|
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)
|
|
}
|
|
}
|