use crate::{
Mix, Value,
effect::{Effect, EffectBuilder},
};
use super::{Reverb, ReverbHandle, command_writers_and_readers};
#[derive(Debug, Copy, Clone, PartialEq)]
pub struct ReverbBuilder {
pub feedback: Value<f64>,
pub damping: Value<f64>,
pub stereo_width: Value<f64>,
pub mix: Value<Mix>,
}
impl ReverbBuilder {
#[must_use]
pub fn new() -> Self {
Self::default()
}
#[must_use = "This method consumes self and returns a modified ReverbBuilder, so the return value should be used"]
pub fn feedback(self, feedback: impl Into<Value<f64>>) -> Self {
Self {
feedback: feedback.into(),
..self
}
}
#[must_use = "This method consumes self and returns a modified ReverbBuilder, so the return value should be used"]
pub fn damping(self, damping: impl Into<Value<f64>>) -> Self {
Self {
damping: damping.into(),
..self
}
}
#[must_use = "This method consumes self and returns a modified ReverbBuilder, so the return value should be used"]
pub fn stereo_width(self, stereo_width: impl Into<Value<f64>>) -> Self {
Self {
stereo_width: stereo_width.into(),
..self
}
}
#[must_use = "This method consumes self and returns a modified ReverbBuilder, so the return value should be used"]
pub fn mix(self, mix: impl Into<Value<Mix>>) -> Self {
Self {
mix: mix.into(),
..self
}
}
}
impl Default for ReverbBuilder {
fn default() -> Self {
Self {
feedback: Value::Fixed(0.9),
damping: Value::Fixed(0.1),
stereo_width: Value::Fixed(1.0),
mix: Value::Fixed(Mix(0.5)),
}
}
}
impl EffectBuilder for ReverbBuilder {
type Handle = ReverbHandle;
fn build(self) -> (Box<dyn Effect>, Self::Handle) {
let (command_writers, command_readers) = command_writers_and_readers();
(
Box::new(Reverb::new(self, command_readers)),
ReverbHandle { command_writers },
)
}
}