oddio 0.7.4

Lightweight game audio library
Documentation
const DURATION_SECS: u32 = 3;
const RATE: u32 = 44100;
const BLOCK_SIZE: usize = 512;
const SPEED: f32 = 50.0;

fn main() {
    let boop = oddio::Frames::from_iter(
        RATE,
        // Generate a simple sine wave
        (0..RATE * DURATION_SECS).map(|i| {
            let t = i as f32 / RATE as f32;
            (t * 500.0 * 2.0 * core::f32::consts::PI).sin() * 80.0
        }),
    );
    let (mut scene_handle, mut scene) = oddio::SpatialScene::new();
    scene_handle.play(
        oddio::FramesSignal::from(boop),
        oddio::SpatialOptions {
            position: [-SPEED, 10.0, 0.0].into(),
            velocity: [SPEED, 0.0, 0.0].into(),
            radius: 0.1,
        },
    );

    let spec = hound::WavSpec {
        channels: 2,
        sample_rate: RATE,
        bits_per_sample: 16,
        sample_format: hound::SampleFormat::Int,
    };
    let mut writer = hound::WavWriter::create("offline.wav", spec).unwrap();

    for _ in 0..(RATE * DURATION_SECS / BLOCK_SIZE as u32) {
        let mut block = [[0.0; 2]; BLOCK_SIZE];
        oddio::run(&mut scene, RATE, &mut block);
        for &frame in &block {
            for &sample in &frame {
                writer
                    .write_sample((sample * i16::MAX as f32) as i16)
                    .unwrap();
            }
        }
    }

    writer.finalize().unwrap();
}