use std::sync::Arc;
use crate::animation::Animation;
use crate::duration::TimeStamp;
#[derive(Clone, Debug)]
pub struct AudioCue {
pub trigger: TimeStamp,
pub source: AudioSource,
pub volume: Animation,
pub duck: Vec<DuckBus>,
pub end: Option<TimeStamp>,
}
#[non_exhaustive]
#[derive(Clone, Debug)]
pub enum AudioSource {
Path(String),
EncodedBytes(Arc<[u8]>),
PcmS16 {
sample_rate: u32,
channels: u8,
samples: Arc<[i16]>,
},
PcmF32 {
sample_rate: u32,
channels: u8,
samples: Arc<[f32]>,
},
Generator(Generator),
}
#[non_exhaustive]
#[derive(Clone, Copy, Debug)]
pub enum Generator {
Silence,
SineWave { frequency_hz: f32, amplitude: f32 },
WhiteNoise { amplitude: f32 },
}
#[derive(Clone, Copy, Debug)]
pub struct DuckBus {
pub bus: u32,
pub reduction_db: f32,
pub attack_ms: u32,
pub release_ms: u32,
}
#[cfg(test)]
mod tests {
use super::*;
use crate::animation::{AnimatedProperty, Easing, Repeat};
#[test]
fn default_volume_animation_holds_unity() {
let cue = AudioCue {
trigger: 0,
source: AudioSource::Generator(Generator::Silence),
volume: Animation::new(
AnimatedProperty::Volume,
Vec::new(),
Easing::Linear,
Repeat::Once,
),
duck: Vec::new(),
end: None,
};
assert!(cue.volume.sample(0).is_none());
}
}