sim-lib-sound-render 0.1.0-rc.1

SIM workspace package for sim lib sound render.
Documentation
use std::sync::Arc;

use sim_kernel::Cx;
use sim_kernel::{DefaultFactory, EagerPolicy};
use sim_lib_sound_bridge::ScheduledTone;
use sim_lib_sound_core::{Frequency, Tone};

use crate::{PcmRenderer, RendererOptions, install_sound_render_lib};

#[test]
fn render_tone_produces_non_zero_samples_for_sine() {
    let renderer = PcmRenderer::new(RendererOptions::default()).unwrap();
    let tone = Tone::sine(Frequency(440.0), std::time::Duration::from_millis(25));
    let rendered = renderer.render_tone(&tone);
    assert!(rendered.iter().any(|sample| sample.abs() > 0.0));
}

#[test]
fn write_wav_emits_valid_riff_wave_header() {
    let renderer = PcmRenderer::new(RendererOptions::default()).unwrap();
    let tone = Tone::sine(Frequency(440.0), std::time::Duration::from_millis(5));
    let rendered = renderer.render_tone(&tone);
    let wav = renderer.write_wav(&rendered, Vec::new()).unwrap();
    assert_eq!(&wav[0..4], b"RIFF");
    assert_eq!(&wav[8..12], b"WAVE");
}

#[test]
fn render_mix_respects_scheduled_start_and_pan() {
    let renderer = PcmRenderer::new(RendererOptions::default()).unwrap();
    let tones = vec![
        ScheduledTone {
            start: std::time::Duration::ZERO,
            tone: Tone::sine(Frequency(220.0), std::time::Duration::from_millis(10)),
            pan: -1.0,
            channel: 0,
            key: 57,
        },
        ScheduledTone {
            start: std::time::Duration::from_millis(5),
            tone: Tone::sine(Frequency(440.0), std::time::Duration::from_millis(10)),
            pan: 1.0,
            channel: 1,
            key: 69,
        },
    ];
    let mix = renderer.render_mix(&tones);
    assert!(mix.len() > renderer.render_tone(&tones[0].tone).len());
    assert!(mix.iter().any(|sample| sample.abs() > 0.0));
}

#[test]
fn runtime_install_is_idempotent() {
    let mut cx = Cx::new(Arc::new(EagerPolicy), Arc::new(DefaultFactory));
    install_sound_render_lib(&mut cx).unwrap();
    install_sound_render_lib(&mut cx).unwrap();
}