dsp 0.11.0

Digital Signal Processing
Documentation

use dsp::core::generator::Sine;
use cpal::traits::{DeviceTrait, HostTrait, StreamTrait};


const SAMPLE_RATE: u32 = 44100;
const BUFFER_SIZE: u32 = 1024;


fn setup_audio<D>(mut sound_gen: D) -> Result<cpal::Stream, cpal::BuildStreamError> 
    where D: FnMut(&mut [f32]) + Send + 'static,
{

    let host = cpal::default_host();

    let device = host
        .default_output_device()
        .ok_or_else(|| anyhow::Error::msg("Default output device is not available")).unwrap();

    let config = cpal::StreamConfig {
        channels: 1,
        sample_rate: cpal::SampleRate(SAMPLE_RATE),
        buffer_size: cpal::BufferSize::Fixed(BUFFER_SIZE),
    };

    let stream = device.build_output_stream(
        &config,
        move |data: &mut [f32], _: &cpal::OutputCallbackInfo| {
            sound_gen(data);
        },
        move |err| {panic!("cpal stream error {:?}", err);},
        None
    );
     
    stream
    
}


fn main() {
    let mut generator = Sine::new(440., SAMPLE_RATE as usize);

    let stream = setup_audio(move |data: &mut [f32]| {
            generator.write_buffer(data);
        },).unwrap();
    stream.play().unwrap();
    
    std::thread::sleep(std::time::Duration::from_millis(1_000));
}