audio_processor_bitcrusher/
generic_handle.rs1use audio_garbage_collector::Shared;
25use audio_processor_traits::atomic_float::AtomicFloatRepresentable;
26use audio_processor_traits::parameters::{
27 AudioProcessorHandle, FloatType, ParameterSpec, ParameterType, ParameterValue,
28};
29use audio_processor_traits::Float;
30
31use crate::BitCrusherHandleImpl;
32
33pub struct BitCrusherHandleRef<ST: AtomicFloatRepresentable + Float = f32>(
34 Shared<BitCrusherHandleImpl<ST>>,
35);
36
37impl<ST> BitCrusherHandleRef<ST>
38where
39 ST: AtomicFloatRepresentable + Float,
40{
41 pub fn new(inner: Shared<BitCrusherHandleImpl<ST>>) -> Self {
42 BitCrusherHandleRef(inner)
43 }
44}
45
46impl<ST> AudioProcessorHandle for BitCrusherHandleRef<ST>
47where
48 ST: AtomicFloatRepresentable + Float,
49 ST: From<f32>,
50 f32: From<ST>,
51 ST::AtomicType: Send + Sync,
52{
53 fn name(&self) -> String {
54 "Bit-crusher".to_string()
55 }
56
57 fn parameter_count(&self) -> usize {
58 1
59 }
60
61 fn get_parameter_spec(&self, _index: usize) -> ParameterSpec {
62 ParameterSpec::new(
63 "Bit rate".into(),
64 ParameterType::Float(FloatType {
65 range: (100.0, self.0.sample_rate()),
66 step: None,
67 }),
68 )
69 }
70
71 fn get_parameter(&self, _index: usize) -> Option<ParameterValue> {
72 Some(ParameterValue::Float {
73 value: self.0.bit_rate(),
74 })
75 }
76
77 fn set_parameter(&self, _index: usize, request: ParameterValue) {
78 let ParameterValue::Float { value } = request;
79 self.0.set_bit_rate(value);
80 }
81}