use kira::manager::AudioManagerSettings;
use kira::sound::static_sound::{StaticSoundData, StaticSoundSettings};
use kira::tween::Value;
use kira::Volume;
use std::path::Path;
pub struct AudioManager {
sounds: Vec<StaticSoundData>,
kira: kira::manager::AudioManager,
}
impl AudioManager {
#[inline]
pub fn new() -> Option<AudioManager> {
Some(AudioManager {
sounds: Vec::new(),
kira: kira::manager::AudioManager::new(AudioManagerSettings::default()).ok()?,
})
}
#[inline]
pub fn load(
&mut self,
path: impl AsRef<Path>,
volume: f64,
panning: Panning,
reverse: bool,
) -> Option<()> {
self.sounds.push(
StaticSoundData::from_file(
path,
StaticSoundSettings::new()
.volume(Volume::Decibels(volume))
.panning(panning.to_f64())
.reverse(reverse),
)
.ok()?,
);
Some(())
}
#[inline]
pub fn play(&mut self, index: usize) -> Option<()> {
self.kira.play(self.sounds.get(index)?.clone()).ok()?;
Some(())
}
#[inline]
pub fn kira(&self) -> &kira::manager::AudioManager { &self.kira }
#[inline]
pub fn sounds(&self) -> &Vec<StaticSoundData> { &self.sounds }
#[inline]
pub fn unload(&mut self, index: usize) { self.sounds.remove(index); }
#[inline]
pub fn set_volume(&mut self, index: usize, volume: f64) -> Option<()> {
self.sounds.get_mut(index)?.settings.volume =
Value::from(Volume::Decibels(volume).as_amplitude());
Some(())
}
#[inline]
pub fn set_panning(&mut self, index: usize, panning: Panning) -> Option<()> {
self.sounds.get_mut(index)?.settings.panning = Value::from(panning.to_f64());
Some(())
}
#[inline]
pub fn set_reverse(&mut self, index: usize, reverse: bool) -> Option<()> {
self.sounds.get_mut(index)?.settings.reverse = reverse;
Some(())
}
#[inline]
pub fn get_volume(&self, index: usize) -> Option<f64> {
if let Value::Fixed(vol) = self.sounds.get(index)?.settings.volume {
Some(vol.as_decibels())
} else {
None
}
}
#[inline]
pub fn get_panning(&self, index: usize) -> Option<Panning> {
if let Value::Fixed(pan) = self.sounds.get(index)?.settings.panning {
Some(Panning::From(pan))
} else {
None
}
}
#[inline]
pub fn get_reverse(&self, index: usize) -> Option<bool> {
Some(self.sounds.get(index)?.settings.reverse)
}
}
pub enum Panning {
HardLeft,
Left,
Normal,
Right,
HardRight,
From(f64),
}
impl Default for Panning {
#[inline]
fn default() -> Self { Self::Normal }
}
impl Panning {
#[inline]
pub fn to_f64(&self) -> f64 {
match self {
Self::HardLeft => 0.0,
Self::Left => 0.25,
Self::Normal => 0.5,
Self::Right => 0.75,
Self::HardRight => 1.0,
Self::From(v) => *v,
}
}
}