audio-processor-standalone

crates.io docs.rs


Provides a stand-alone audio-processor runner for AudioProcessor implementations.

```rust // Imports use std::time::Duration;

use audioprocessortraits::{AudioBuffer, AudioProcessor}; use circulardatastructures::CircularVec;

// Declare a delay audio_processor_traits::AudioProcessor implementation struct SimpleDelayProcessor { currentwriteposition: usize, currentreadposition: usize, delay_buffers: Vec>, }

impl SimpleDelayProcessor { fn new() -> Self { Self { currentwriteposition: (Duration::frommillis(800).assecsf32() * 44100.0) as usize, currentreadposition: 0, delaybuffers: vec![ CircularVec::withsize( (Duration::fromsecs(5).assecsf32() * 44100.0) as usize, 0.0, ), CircularVec::withsize( (Duration::fromsecs(5).assecsf32() * 44100.0) as usize, 0.0, ), ], } } }

impl AudioProcessor for SimpleDelayProcessor { type SampleType = f32;

fn process<BufferType: AudioBuffer<SampleType = Self::SampleType>>(
    &mut self,
    data: &mut BufferType,
) {
    // Mono input stage
    for sample_index in 0..data.num_samples() {
        data.set(0, sample_index, *data.get(1, sample_index));
    }

    // Delay read/write
    for sample_index in 0..data.num_samples() {
        for channel_index in 0..data.num_channels() {
            let input = *data.get(channel_index, sample_index);

            // Read delay output
            let delay_output = self.delay_buffers[channel_index][self.current_read_position];

            // Write input into delay with feedback
            let feedback = 0.3;
            self.delay_buffers[channel_index][self.current_write_position] =
                input + delay_output * feedback;

            // Output stage
            data.set(channel_index, sample_index, input + delay_output);
        }

        self.current_read_position += 1;
        self.current_write_position += 1;
    }
}

}

// Run it fn main() { let processor = SimpleDelayProcessor::new(); audioprocessorstandalone::audioprocessormain(processor); } ```