use bevy::{app::{App, Plugin, Startup, Update}, ecs::{component::Component, system::{Commands, Query}}, math::{Quat, Vec3}, transform::components::Transform}; use kira::{AudioManager, AudioManagerSettings, DefaultBackend, Tween, listener::ListenerHandle}; use crate::source::FelixAudioSource; pub const SAMPLE_RATE: usize = 48_000; pub const BUFFER_SIZE: usize = 512; const MONO_20MS: usize = SAMPLE_RATE * 20 / 1000; pub mod source; pub mod utils; pub mod voice; // TODO: Make this use HRTF at some point // Maybe revisit steam audio? // Or just find some other library that does HRTFs. fn update_audio_system( mut audio_system: Query<&mut FelixAudioComponent>, listener: Query<(&FelixAudioListener, &Transform)>, sources: Query<(&mut FelixAudioSource, &Transform)>, ){ let mut audio_system = audio_system.single_mut().expect("Cannot find FelixAudioComponent, has audio system been initialised?"); let ( _, listener_transform ) = listener.single().expect("Cannot find FelixAudioListener."); audio_system.main_listener.set_position(listener_transform.translation, Tween::default()); audio_system.main_listener.set_orientation(listener_transform.rotation, Tween::default()); for ( mut source, transform ) in sources{ if source.needs_init(){ source.init(&mut audio_system); } else { source.update(transform); } } } #[derive(Component)] pub struct FelixAudioListener; #[derive(Component)] pub struct FelixAudioComponent{ manager: AudioManager, main_listener: ListenerHandle } pub struct FelixAudio; impl Plugin for FelixAudio{ fn build(&self, app: &mut App) { app.add_systems(Startup, move | mut commands: Commands | { let mut manager = AudioManager::::new(AudioManagerSettings::default()).unwrap(); let main_listener = manager.add_listener(Vec3::default(), Quat::default()).unwrap(); let handle = FelixAudioComponent { manager, main_listener }; commands.spawn(handle); }); app.add_systems(Update, update_audio_system); } }