use std::sync::Arc;
pub trait AudioEngine: Send + Sync {
fn play_sound(&self, name: &str, volume: f32);
fn play_spatial(&self, name: &str, position: [f32; 3], volume: f32);
fn set_listener_position(&self, _position: [f32; 3]) {}
fn stop_all(&self) {}
fn play_buffer(&self, _data: &[u8], _volume: f32) {}
}
pub struct NullAudioEngine;
impl AudioEngine for NullAudioEngine {
fn play_sound(&self, _name: &str, _volume: f32) {}
fn play_spatial(&self, _name: &str, _position: [f32; 3], _volume: f32) {}
fn set_listener_position(&self, _position: [f32; 3]) {}
fn stop_all(&self) {}
}
pub trait HapticEngine: Send + Sync {
fn impact(&self, _intensity: HapticIntensity) {}
fn selection(&self) {}
fn success(&self) {}
fn warning(&self) {}
fn error(&self) {}
fn visual_tick(&self, _intensity: f32) {}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum HapticIntensity {
Light,
Medium,
Heavy,
}
pub struct NullHapticEngine;
impl HapticEngine for NullHapticEngine {
fn impact(&self, _intensity: HapticIntensity) {}
fn selection(&self) {}
fn success(&self) {}
fn warning(&self) {}
fn error(&self) {}
fn visual_tick(&self, _intensity: f32) {}
}
pub mod sounds {
pub const CLICK: &str = "click";
pub const TOGGLE_ON: &str = "toggle_on";
pub const TOGGLE_OFF: &str = "toggle_off";
pub const SUCCESS: &str = "success";
pub const ERROR: &str = "error";
pub const WARNING: &str = "warning";
pub const SCRUB: &str = "scrub";
pub const SELECTION: &str = "selection";
pub const NAVIGATION_TICK: &[u8] = include_bytes!("../assets/sounds/nav_tick.wav");
pub const SUCCESS_CHIME: &[u8] = include_bytes!("../assets/sounds/success_chime.wav");
pub const WARNING_TONE: &[u8] = include_bytes!("../assets/sounds/warning_tone.wav");
}
static AUDIO_ENGINE: once_cell::sync::Lazy<Arc<dyn AudioEngine>> =
once_cell::sync::Lazy::new(|| Arc::new(NullAudioEngine));
static HAPTIC_ENGINE: once_cell::sync::Lazy<Arc<dyn HapticEngine>> =
once_cell::sync::Lazy::new(|| Arc::new(NullHapticEngine));
pub fn set_audio_engine(engine: Arc<dyn AudioEngine>) {
let _ = engine;
}
pub fn set_haptic_engine(engine: Arc<dyn HapticEngine>) {
let _ = engine;
}
pub fn play_sound(name: &str, volume: f32) {
AUDIO_ENGINE.play_sound(name, volume);
}
pub fn haptic_impact(intensity: HapticIntensity) {
HAPTIC_ENGINE.impact(intensity);
}
pub fn haptic_selection() {
HAPTIC_ENGINE.selection();
}
pub fn haptic_success() {
HAPTIC_ENGINE.success();
}
pub fn haptic_error() {
HAPTIC_ENGINE.error();
}