use audio_garbage_collector::Shared;
use audio_processor_traits::atomic_float::AtomicFloatRepresentable;
use audio_processor_traits::parameters::{
AudioProcessorHandle, FloatType, ParameterSpec, ParameterType, ParameterValue,
};
use audio_processor_traits::Float;
use crate::BitCrusherHandleImpl;
pub struct BitCrusherHandleRef<ST: AtomicFloatRepresentable + Float = f32>(
Shared<BitCrusherHandleImpl<ST>>,
);
impl<ST> BitCrusherHandleRef<ST>
where
ST: AtomicFloatRepresentable + Float,
{
pub fn new(inner: Shared<BitCrusherHandleImpl<ST>>) -> Self {
BitCrusherHandleRef(inner)
}
}
impl<ST> AudioProcessorHandle for BitCrusherHandleRef<ST>
where
ST: AtomicFloatRepresentable + Float,
ST: From<f32>,
f32: From<ST>,
ST::AtomicType: Send + Sync,
{
fn name(&self) -> String {
"Bit-crusher".to_string()
}
fn parameter_count(&self) -> usize {
1
}
fn get_parameter_spec(&self, _index: usize) -> ParameterSpec {
ParameterSpec::new(
"Bit rate".into(),
ParameterType::Float(FloatType {
range: (100.0, self.0.sample_rate()),
step: None,
}),
)
}
fn get_parameter(&self, _index: usize) -> Option<ParameterValue> {
Some(ParameterValue::Float {
value: self.0.bit_rate(),
})
}
fn set_parameter(&self, _index: usize, request: ParameterValue) {
let ParameterValue::Float { value } = request;
self.0.set_bit_rate(value);
}
}