diff --git a/src/device/vi.rs b/src/device/vi.rs index 232613f..881b8fa 100644 --- a/src/device/vi.rs +++ b/src/device/vi.rs @@ -134,16 +134,19 @@ pub fn write_regs(device: &mut device::Device, address: u64, value: u32, mask: u } pub fn vertical_interrupt_event(device: &mut device::Device) { - ui::video::check_callback(device); + let mut speed_limiter_toggled = ui::video::check_callback(device); if device.netplay.is_some() { netplay::send_sync_check(device); - device.vi.enable_speed_limiter = !device.netplay.as_ref().unwrap().fast_forward; + if device.vi.enable_speed_limiter == device.netplay.as_ref().unwrap().fast_forward { + speed_limiter_toggled = true; + device.vi.enable_speed_limiter = !device.netplay.as_ref().unwrap().fast_forward; + } } device.vi.vi_counter += 1; if device.vi.vi_counter % device.vi.limit_freq == 0 && device.vi.enable_speed_limiter { - speed_limiter(device); + speed_limiter(device, speed_limiter_toggled); } ui::video::update_screen(); @@ -175,7 +178,7 @@ pub fn init(device: &mut device::Device) { } } -fn speed_limiter(device: &mut device::Device) { +fn speed_limiter(device: &mut device::Device, speed_limiter_toggled: bool) { let result = device.vi.limiter.as_ref().unwrap().check(); if let Err(outcome) = result { let dur = outcome.wait_time_from(governor::clock::DefaultClock::default().now()); @@ -194,14 +197,17 @@ fn speed_limiter(device: &mut device::Device) { .as_secs_f64() > 1.0 { - if device.vi.min_wait_time.as_secs_f64() == 0.0 && device.vi.limit_freq < MAX_LIMIT_FREQ { - device.vi.limit_freq += 1; - create_limiter(device); - } else if device.vi.min_wait_time.as_secs_f64() > device.vi.frame_time - && device.vi.limit_freq > 1 - { - device.vi.limit_freq -= 1; - create_limiter(device); + if !speed_limiter_toggled { + if device.vi.min_wait_time.as_secs_f64() == 0.0 && device.vi.limit_freq < MAX_LIMIT_FREQ + { + device.vi.limit_freq += 1; + create_limiter(device); + } else if device.vi.min_wait_time.as_secs_f64() > device.vi.frame_time + && device.vi.limit_freq > 1 + { + device.vi.limit_freq -= 1; + create_limiter(device); + } } //println!("limit freq: {}", device.vi.limit_freq); diff --git a/src/ui/video.rs b/src/ui/video.rs index fb71c7c..33cec88 100644 --- a/src/ui/video.rs +++ b/src/ui/video.rs @@ -114,7 +114,8 @@ pub fn load_state(device: &mut device::Device, rdp_state: *const u8) { } } -pub fn check_callback(device: &mut device::Device) { +pub fn check_callback(device: &mut device::Device) -> bool { + let mut speed_limiter_toggled = false; let callback = unsafe { rdp_check_callback() }; device.cpu.running = callback.emu_running; if device.netplay.is_none() { @@ -123,7 +124,10 @@ pub fn check_callback(device: &mut device::Device) { } else if callback.load_state { device.load_state = true; } - device.vi.enable_speed_limiter = callback.enable_speedlimiter; + if device.vi.enable_speed_limiter != callback.enable_speedlimiter { + speed_limiter_toggled = true; + device.vi.enable_speed_limiter = callback.enable_speedlimiter; + } } if callback.lower_volume { @@ -131,6 +135,7 @@ pub fn check_callback(device: &mut device::Device) { } else if callback.raise_volume { ui::audio::raise_audio_volume(&mut device.ui); } + speed_limiter_toggled } pub fn set_register(reg: u32, value: u32) {