use std::marker::PhantomData;
pub use num;
pub use num::Float;
pub use num::Zero;
pub use atomic_float::{AtomicF32, AtomicF64};
pub use audio_buffer::{AudioBuffer, InterleavedAudioBuffer, OwnedAudioBuffer, VecAudioBuffer};
pub use midi::{MidiEventHandler, MidiMessageLike, NoopMidiEventHandler};
pub use simple_processor::{BufferProcessor, SimpleAudioProcessor};
pub mod atomic_float;
pub mod audio_buffer;
pub mod midi;
pub mod parameters;
pub mod simple_processor;
#[derive(Clone, PartialEq, Debug, Copy)]
pub struct AudioProcessorSettings {
pub sample_rate: f32,
pub input_channels: usize,
pub output_channels: usize,
pub block_size: usize,
}
impl Default for AudioProcessorSettings {
fn default() -> Self {
Self::new(44100.0, 2, 2, 512)
}
}
impl AudioProcessorSettings {
pub fn new(
sample_rate: f32,
input_channels: usize,
output_channels: usize,
block_size: usize,
) -> Self {
AudioProcessorSettings {
sample_rate,
input_channels,
output_channels,
block_size,
}
}
pub fn sample_rate(&self) -> f32 {
self.sample_rate
}
pub fn input_channels(&self) -> usize {
self.input_channels
}
pub fn output_channels(&self) -> usize {
self.output_channels
}
pub fn block_size(&self) -> usize {
self.block_size
}
}
impl AudioProcessorSettings {
pub fn set_sample_rate(&mut self, sample_rate: f32) {
self.sample_rate = sample_rate;
}
pub fn set_input_channels(&mut self, input_channels: usize) {
self.input_channels = input_channels;
}
pub fn set_output_channels(&mut self, output_channels: usize) {
self.output_channels = output_channels;
}
pub fn set_block_size(&mut self, block_size: usize) {
self.block_size = block_size;
}
}
pub trait AudioProcessor {
type SampleType;
fn prepare(&mut self, _settings: AudioProcessorSettings) {}
fn process<BufferType: AudioBuffer<SampleType = Self::SampleType>>(
&mut self,
data: &mut BufferType,
);
}
pub trait SliceAudioProcessor {
fn prepare_slice(&mut self, _settings: AudioProcessorSettings) {}
fn process_slice(&mut self, num_channels: usize, data: &mut [f32]);
}
impl<Processor> SliceAudioProcessor for Processor
where
Processor: AudioProcessor<SampleType = f32>,
{
fn prepare_slice(&mut self, settings: AudioProcessorSettings) {
<Processor as AudioProcessor>::prepare(self, settings);
}
fn process_slice(&mut self, num_channels: usize, data: &mut [f32]) {
let mut buffer = InterleavedAudioBuffer::new(num_channels, data);
<Processor as AudioProcessor>::process(self, &mut buffer);
}
}
pub trait ObjectAudioProcessor<BufferType> {
fn prepare_obj(&mut self, _settings: AudioProcessorSettings) {}
fn process_obj(&mut self, data: &mut BufferType);
}
impl<SampleType, BufferType, Processor> ObjectAudioProcessor<BufferType> for Processor
where
SampleType: Float + Send,
BufferType: AudioBuffer<SampleType = SampleType>,
Processor: AudioProcessor<SampleType = SampleType>,
{
fn prepare_obj(&mut self, settings: AudioProcessorSettings) {
<Processor as AudioProcessor>::prepare(self, settings);
}
fn process_obj(&mut self, data: &mut BufferType) {
<Processor as AudioProcessor>::process(self, data);
}
}
pub struct NoopAudioProcessor<SampleType>(PhantomData<SampleType>);
impl<SampleType> Default for NoopAudioProcessor<SampleType> {
fn default() -> Self {
Self::new()
}
}
impl<SampleType> NoopAudioProcessor<SampleType> {
pub fn new() -> Self {
NoopAudioProcessor(PhantomData::default())
}
}
impl<SampleType: Send + Copy> SimpleAudioProcessor for NoopAudioProcessor<SampleType> {
type SampleType = SampleType;
fn s_process_frame(&mut self, _frame: &mut [SampleType]) {}
}
pub struct SilenceAudioProcessor<SampleType>(PhantomData<SampleType>);
impl<SampleType> SilenceAudioProcessor<SampleType> {
pub fn new() -> Self {
SilenceAudioProcessor(PhantomData)
}
}
impl<SampleType> Default for SilenceAudioProcessor<SampleType> {
fn default() -> Self {
Self::new()
}
}
impl<SampleType: Float + Send> AudioProcessor for SilenceAudioProcessor<SampleType> {
type SampleType = SampleType;
fn process<BufferType: AudioBuffer<SampleType = Self::SampleType>>(
&mut self,
output: &mut BufferType,
) {
for sample in output.slice_mut() {
*sample = SampleType::zero();
}
}
}