use core::{
i16,
ops::{Add, Mul, MulAssign, Sub},
};
pub trait RawSample: Clone + Copy + MulAssign + Mul + Add + Sub {}
impl RawSample for f64 {}
impl RawSample for f32 {}
impl RawSample for i16 {}
#[derive(Clone, Copy)]
pub struct SoundSample<T>
where
T: RawSample,
{
pub left: T,
pub right: T,
}
impl<T> SoundSample<T>
where
T: RawSample,
{
pub fn new(left: T, right: T) -> SoundSample<T> {
SoundSample { left, right }
}
pub fn mul_eq(&mut self, val: T) -> &mut Self {
self.left *= val;
self.right *= val;
self
}
pub fn mul(&mut self, val_left: T, val_right: T) -> &mut Self {
self.left *= val_left;
self.right *= val_right;
self
}
}
impl SoundSample<f64> {
pub fn mix<'a>(&'a mut self, sample: &SoundSample<f64>) -> &'a mut Self {
self.left += sample.left;
self.right += sample.right;
self
}
pub fn into_f32(self) -> SoundSample<f32> {
SoundSample {
left: self.left as f32,
right: self.right as f32,
}
}
}
pub(crate) trait SampleGenerator<T>
where
T: RawSample,
{
fn gen_sample(&mut self) -> SoundSample<T>;
}