use anyhow::{anyhow, Error};
use bevy::prelude::*;
use crate::sound::sound_types::{KiraPlayable, KiraPlayingSound};
use kira::{
clock::{ClockHandle, ClockSpeed},
manager::{backend::cpal::CpalBackend, AudioManager, AudioManagerSettings},
sound::static_sound::{StaticSoundData, StaticSoundHandle},
track::{TrackBuilder, TrackHandle},
};
pub struct KiraContext {
manager: Option<AudioManager>,
}
impl Default for KiraContext {
fn default() -> Self {
let manager = AudioManager::<CpalBackend>::new(AudioManagerSettings::default());
if let Err(ref error) = manager {
error!("Error creating KiraContext: {}", error);
}
Self {
manager: manager.ok(),
}
}
}
impl KiraContext {
pub fn play(&mut self, sound: StaticSoundData) -> Result<StaticSoundHandle, Error> {
let manager = self.get_manager()?;
manager.play(sound).map_err(|e| e.into())
}
pub fn play_dynamic(
&mut self,
sound: Box<dyn KiraPlayable>,
) -> Result<KiraPlayingSound, Error> {
let manager = self.get_manager()?;
sound.play_in_manager(manager)
}
pub fn add_clock(&mut self, clock_speed: ClockSpeed) -> Result<ClockHandle, Error> {
let manager = self.get_manager()?;
manager.add_clock(clock_speed).map_err(|e| e.into())
}
pub fn add_track(&mut self, track: TrackBuilder) -> Result<TrackHandle, Error> {
let manager = self.get_manager()?;
manager.add_sub_track(track).map_err(|e| e.into())
}
pub fn get_manager(&mut self) -> Result<&mut AudioManager, Error> {
if let Some(manager) = &mut self.manager {
return Ok(manager);
}
Err(anyhow!("KiraContext has no manager"))
}
}