use super::*;
use super::{
noise::{ColoredNoise, WhiteNoise},
silence::Silence,
sine::Sine,
sweep::Sweep,
};
use crate::*;
use rand::prelude::*;
use snafu::prelude::*;
use std::fmt::Debug;
use std::ops::{Deref, DerefMut};
type Result<T> = std::result::Result<T, SiggenError>;
#[enum_dispatch::enum_dispatch(SourceImpl)]
#[derive(Clone, Debug)]
pub enum Source {
Sine(Sine),
Silence(Silence),
WhiteNoise(WhiteNoise),
Sweep(Sweep),
PinkNoise(ColoredNoise),
}
#[enum_dispatch::enum_dispatch]
pub trait SourceImpl: Send + Sync + Debug {
fn genSignal_unscaled(&mut self, sig: &mut dyn ExactSizeIterator<Item = &mut Flt>);
fn fs(&self) -> StrictlyPositive;
}
impl Source {
pub fn new(srcdesc: &SourceDescriptor, fs: StrictlyPositive) -> Result<Self> {
match srcdesc {
SourceDescriptor::Sine { frequency } => Ok(Sine::new(*frequency, fs)?.into()),
SourceDescriptor::Silence {} => Ok(Silence::new(fs).into()),
SourceDescriptor::WhiteNoise { interrupt_time } => {
Ok(WhiteNoise::new(fs, *interrupt_time).into())
}
SourceDescriptor::PinkNoise {
interrupt_time,
rolloffPoint,
} => Ok(ColoredNoise::newPinkNoise(fs, *rolloffPoint, *interrupt_time)?.into()),
SourceDescriptor::Sweep { settings: params } => {
Ok(Sweep::new(params.clone(), fs)?.into())
}
}
}
}