use crate::Interpolator;
use dasp_frame::Frame;
use dasp_sample::{Duplex, Sample};
pub struct Linear<F> {
left: F,
right: F,
}
impl<F> Linear<F> {
pub fn new(left: F, right: F) -> Linear<F> {
Linear {
left: left,
right: right,
}
}
}
impl<F> Interpolator for Linear<F>
where
F: Frame,
F::Sample: Duplex<f64>,
{
type Frame = F;
fn interpolate(&self, x: f64) -> Self::Frame {
self.left.zip_map(self.right, |l, r| {
let l_f = l.to_sample::<f64>();
let r_f = r.to_sample::<f64>();
let diff = r_f - l_f;
((diff * x) + l_f).to_sample::<<Self::Frame as Frame>::Sample>()
})
}
fn next_source_frame(&mut self, source_frame: Self::Frame) {
self.left = self.right;
self.right = source_frame;
}
}