ensure audio is playing (#826)

* ensure audio is playing

* more
This commit is contained in:
Logan McNaughton 2026-05-03 07:18:28 +02:00 committed by GitHub
parent 9cc6d48493
commit b754891d45
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 18 additions and 14 deletions

View File

@ -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

View File

@ -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)
}

View File

@ -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() {

View File

@ -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) {