use crate::{
commands::Id, graph::DspNode, parameter::Parameters, prelude::*, utility::create_parameters,
};
use super::{compressor_parameters::get_range, compressor_processor::CompressorProcessor};
pub struct Compressor {
pub node: GraphNode,
params: Parameters,
}
impl DspNode for Compressor {
fn get_parameters_mut(&mut self) -> &mut Parameters {
&mut self.params
}
}
impl Compressor {
pub fn new(context: &dyn Context, channel_count: usize) -> Self {
let id = Id::generate();
let param_ids = [
"attack",
"release",
"ratio",
"threshold",
"knee",
"wet",
"dry",
];
let (params, realtime_params) =
create_parameters(id, context, param_ids.map(|id| (id, get_range(id))));
let processor = Box::new(CompressorProcessor::new(
channel_count,
context.get_sample_rate(),
context.maximum_frame_count(),
));
Self {
node: GraphNode::new(
id,
context,
channel_count,
channel_count,
processor,
realtime_params,
),
params,
}
}
pub fn attack(&mut self) -> &mut AudioParameter {
self.get_parameter_mut("attack")
}
pub fn release(&mut self) -> &mut AudioParameter {
self.get_parameter_mut("release")
}
pub fn ratio(&mut self) -> &mut AudioParameter {
self.get_parameter_mut("ratio")
}
pub fn threshold(&mut self) -> &mut AudioParameter {
self.get_parameter_mut("threshold")
}
pub fn knee(&mut self) -> &mut AudioParameter {
self.get_parameter_mut("knee")
}
pub fn wet(&mut self) -> &mut AudioParameter {
self.get_parameter_mut("wet")
}
pub fn dry(&mut self) -> &mut AudioParameter {
self.get_parameter_mut("dry")
}
}