use anyhow::{Error, anyhow};
use bevy::prelude::*;
use crate::sound::sound_types::{KiraPlayable, KiraPlayingSound, KiraTrackHandle};
use kira::{
AudioManager, AudioManagerSettings,
backend::cpal::CpalBackend,
clock::{ClockHandle, ClockSpeed},
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: Box<dyn KiraPlayable>,
track: Option<&mut KiraTrackHandle>,
) -> Result<KiraPlayingSound, Error> {
let manager = self.get_manager()?;
match track {
Some(track) => sound.play_in_track(track),
None => {
let main_track = manager.main_track();
sound.play_in_main_track(main_track)
}
}
}
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"))
}
}