diff --git a/src/device.rs b/src/device.rs index fad89f5..ba314aa 100644 --- a/src/device.rs +++ b/src/device.rs @@ -62,7 +62,7 @@ pub fn run_game(device: &mut Device, rom_contents: &[u8], game_settings: ui::Gam rdram::init(device); ui::video::init(device); - ui::audio::init(&mut device.ui, device.ai.freq); + ui::audio::init(device); ui::input::init(&mut device.ui); // must be after video init diff --git a/src/device/ai.rs b/src/device/ai.rs index 84c4a6c..9027f76 100644 --- a/src/device/ai.rs +++ b/src/device/ai.rs @@ -3,12 +3,12 @@ use crate::{device, ui}; const AI_DRAM_ADDR_REG: u32 = 0; const AI_LEN_REG: u32 = 1; // const AI_CONTROL_REG: u32 = 2; -const AI_STATUS_REG: u32 = 3; +pub const AI_STATUS_REG: u32 = 3; const AI_DACRATE_REG: u32 = 4; // const AI_BITRATE_REG: u32 = 5; pub const AI_REGS_COUNT: u32 = 6; -const AI_STATUS_BUSY: u32 = 0x40000000; +pub const AI_STATUS_BUSY: u32 = 0x40000000; const AI_STATUS_FULL: u32 = 0x80000000; #[derive(serde::Serialize, serde::Deserialize)] @@ -148,7 +148,7 @@ pub fn write_regs(device: &mut device::Device, address: u64, value: u32, mask: u if device.ai.regs[reg as usize] != value & mask { device.ai.freq = device.vi.clock / (1 + (value & mask)) as u64; ui::audio::close_game_audio(&mut device.ui); - ui::audio::init_game_audio(&mut device.ui, device.ai.freq) + ui::audio::init_game_audio(device) } device::memory::masked_write_32(&mut device.ai.regs[reg as usize], value, mask) } diff --git a/src/savestates.rs b/src/savestates.rs index 74cc27a..3dc7692 100644 --- a/src/savestates.rs +++ b/src/savestates.rs @@ -201,7 +201,7 @@ pub fn load_savestate(device: &mut device::Device) { } ui::audio::close_game_audio(&mut device.ui); - ui::audio::init_game_audio(&mut device.ui, device.ai.freq); + ui::audio::init_game_audio(device); ui::video::load_state(device, rdp_state.as_ptr()); if !ra_state.is_empty() { diff --git a/src/ui/audio.rs b/src/ui/audio.rs index 3a2bcca..08a4800 100644 --- a/src/ui/audio.rs +++ b/src/ui/audio.rs @@ -3,9 +3,9 @@ use crate::ui; static ADJUST_LOCKED: std::sync::atomic::AtomicBool = std::sync::atomic::AtomicBool::new(false); -pub fn init(ui: &mut ui::Ui, frequency: u64) { +pub fn init(device: &mut device::Device) { ui::sdl_init(sdl3_sys::init::SDL_INIT_AUDIO); - init_game_audio(ui, frequency); + init_game_audio(device); } unsafe extern "C" fn audio_callback( @@ -27,14 +27,14 @@ unsafe extern "C" fn audio_callback( } } -pub fn init_game_audio(ui: &mut ui::Ui, frequency: u64) { +pub fn init_game_audio(device: &mut device::Device) { let game_audio_spec = sdl3_sys::audio::SDL_AudioSpec { format: sdl3_sys::audio::SDL_AUDIO_S16LE, - freq: frequency as i32, + freq: device.ai.freq as i32, channels: 2, }; - ui.audio.audio_stream = unsafe { + device.ui.audio.audio_stream = unsafe { sdl3_sys::audio::SDL_OpenAudioDeviceStream( sdl3_sys::audio::SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK, &game_audio_spec, @@ -42,20 +42,24 @@ pub fn init_game_audio(ui: &mut ui::Ui, frequency: u64) { std::ptr::null_mut(), ) }; - if ui.audio.audio_stream.is_null() { + if device.ui.audio.audio_stream.is_null() { panic!("Could not create audio stream"); } if !unsafe { - sdl3_sys::audio::SDL_SetAudioStreamGain(ui.audio.audio_stream, ui.audio.gain) - && sdl3_sys::audio::SDL_PauseAudioStreamDevice(ui.audio.audio_stream) + sdl3_sys::audio::SDL_SetAudioStreamGain(device.ui.audio.audio_stream, device.ui.audio.gain) && sdl3_sys::audio::SDL_SetAudioStreamGetCallback( - ui.audio.audio_stream, + device.ui.audio.audio_stream, Some(audio_callback), std::ptr::null_mut(), ) } { panic!("Could not initialize audio stream"); } + if device.ai.regs[device::ai::AI_STATUS_REG as usize] & device::ai::AI_STATUS_BUSY != 0 { + resume_game_audio(&mut device.ui); + } else { + pause_game_audio(&mut device.ui); + } } pub fn close(ui: &mut ui::Ui) {