use crate::{Detect, Detector};
use dasp_frame::Frame;
use dasp_peak as peak;
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub struct Peak<R = peak::FullWave> {
rectifier: R,
}
impl Peak<peak::FullWave> {
pub fn full_wave() -> Self {
peak::FullWave.into()
}
}
impl Peak<peak::PositiveHalfWave> {
pub fn positive_half_wave() -> Self {
peak::PositiveHalfWave.into()
}
}
impl Peak<peak::NegativeHalfWave> {
pub fn negative_half_wave() -> Self {
peak::NegativeHalfWave.into()
}
}
impl<F, R> Detector<F, Peak<R>>
where
F: Frame,
R: peak::Rectifier<F>,
{
pub fn peak_from_rectifier(rectifier: R, attack_frames: f32, release_frames: f32) -> Self {
let peak = rectifier.into();
Self::new(peak, attack_frames, release_frames)
}
}
impl<F> Detector<F, Peak<peak::FullWave>>
where
F: Frame,
{
pub fn peak(attack_frames: f32, release_frames: f32) -> Self {
let peak = Peak::full_wave();
Self::new(peak, attack_frames, release_frames)
}
}
impl<F> Detector<F, Peak<peak::PositiveHalfWave>>
where
F: Frame,
{
pub fn peak_positive_half_wave(attack_frames: f32, release_frames: f32) -> Self {
let peak = Peak::positive_half_wave();
Self::new(peak, attack_frames, release_frames)
}
}
impl<F> Detector<F, Peak<peak::NegativeHalfWave>>
where
F: Frame,
{
pub fn peak_negative_half_wave(attack_frames: f32, release_frames: f32) -> Self {
let peak = Peak::negative_half_wave();
Self::new(peak, attack_frames, release_frames)
}
}
impl<F, R> Detect<F> for Peak<R>
where
F: Frame,
R: peak::Rectifier<F>,
{
type Output = R::Output;
fn detect(&mut self, frame: F) -> Self::Output {
self.rectifier.rectify(frame)
}
}
impl<R> From<R> for Peak<R> {
fn from(rectifier: R) -> Self {
Peak {
rectifier: rectifier,
}
}
}