use crate::parameters::{AudioProcessorHandleProvider, AudioProcessorHandleRef};
use crate::{
AudioBuffer, AudioProcessor, AudioProcessorSettings, MidiEventHandler, MidiMessageLike,
};
use std::ops::Deref;
pub trait SimpleAudioProcessor {
type SampleType: Copy;
fn s_prepare(&mut self, _settings: AudioProcessorSettings) {}
fn s_process(&mut self, sample: Self::SampleType) -> Self::SampleType {
sample
}
fn s_process_frame(&mut self, frame: &mut [Self::SampleType]) {
for sample in frame {
*sample = self.s_process(*sample);
}
}
}
#[derive(Clone, Default, Debug)]
pub struct BufferProcessor<Processor>(pub Processor);
#[inline]
pub fn process_buffer<Processor, BufferType>(processor: &mut Processor, data: &mut BufferType)
where
Processor: SimpleAudioProcessor,
<Processor as SimpleAudioProcessor>::SampleType: Copy,
BufferType: AudioBuffer<SampleType = Processor::SampleType>,
{
for frame in data.frames_mut() {
processor.s_process_frame(frame);
}
}
impl<Processor> Deref for BufferProcessor<Processor> {
type Target = Processor;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl<Processor> AudioProcessorHandleProvider for BufferProcessor<Processor>
where
Processor: AudioProcessorHandleProvider,
{
fn generic_handle(&self) -> AudioProcessorHandleRef {
self.0.generic_handle()
}
}
impl<Processor> AudioProcessor for BufferProcessor<Processor>
where
Processor: SimpleAudioProcessor,
<Processor as SimpleAudioProcessor>::SampleType: Copy,
{
type SampleType = <Processor as SimpleAudioProcessor>::SampleType;
fn prepare(&mut self, settings: AudioProcessorSettings) {
self.0.s_prepare(settings);
}
#[inline]
fn process<BufferType: AudioBuffer<SampleType = Self::SampleType>>(
&mut self,
data: &mut BufferType,
) {
process_buffer(&mut self.0, data)
}
}
impl<Processor> MidiEventHandler for BufferProcessor<Processor>
where
Processor: MidiEventHandler,
{
fn process_midi_events<Message: MidiMessageLike>(&mut self, midi_messages: &[Message]) {
self.0.process_midi_events(midi_messages)
}
}