#[cfg(feature = "adapter-api")] use nesemu_adapter_api::{ AudioSink, BUTTONS_COUNT, ButtonState, InputSource, TimeSource, VideoSink, }; #[cfg(feature = "adapter-api")] use crate::runtime::{FrameClock, JoypadButtons}; #[cfg(feature = "adapter-api")] fn to_joypad_buttons(buttons: ButtonState) -> JoypadButtons { let mut out = [false; crate::runtime::JOYPAD_BUTTONS_COUNT]; out.copy_from_slice(&buttons[..BUTTONS_COUNT]); out } #[cfg(feature = "adapter-api")] pub struct InputAdapter { inner: T, } #[cfg(feature = "adapter-api")] impl InputAdapter { pub const fn new(inner: T) -> Self { Self { inner } } pub fn into_inner(self) -> T { self.inner } } #[cfg(feature = "adapter-api")] impl crate::runtime::InputProvider for InputAdapter where T: InputSource, { fn poll_buttons(&mut self) -> JoypadButtons { to_joypad_buttons(self.inner.poll_buttons()) } } #[cfg(feature = "adapter-api")] pub struct VideoAdapter { inner: T, } #[cfg(feature = "adapter-api")] impl VideoAdapter { pub const fn new(inner: T) -> Self { Self { inner } } pub fn into_inner(self) -> T { self.inner } } #[cfg(feature = "adapter-api")] impl crate::runtime::VideoOutput for VideoAdapter where T: VideoSink, { fn present_rgba(&mut self, frame: &[u8], width: usize, height: usize) { self.inner.present_rgba(frame, width as u32, height as u32); } } #[cfg(feature = "adapter-api")] pub struct AudioAdapter { inner: T, } #[cfg(feature = "adapter-api")] impl AudioAdapter { pub const fn new(inner: T) -> Self { Self { inner } } pub fn into_inner(self) -> T { self.inner } } #[cfg(feature = "adapter-api")] impl crate::runtime::AudioOutput for AudioAdapter where T: AudioSink, { fn push_samples(&mut self, samples: &[f32]) { self.inner.push_samples(samples); } } #[cfg(feature = "adapter-api")] pub struct ClockAdapter { inner: T, } #[cfg(feature = "adapter-api")] impl ClockAdapter { pub const fn new(inner: T) -> Self { Self { inner } } pub fn into_inner(self) -> T { self.inner } } #[cfg(feature = "adapter-api")] impl FrameClock for ClockAdapter where T: TimeSource, { fn wait_next_frame(&mut self) { self.inner.wait_next_frame(); } }