embedded-audio-core 0.2.1

no_std duty-modulated PWM audio: effect banks, tiered DSP, and mixing for Cortex-M
Documentation
use embedded_audio::{
    AdsrSpec, BANK_BUILD_CAP, BankBuilder, EffectKind, SoundBank,
    encode::wav::build_wav_u8,
    flags,
    preview::{pcm_i8_to_u8, render_effect_pcm, write_mono_u8},
};

#[test]
fn render_tone_to_pcm() {
    let mut built = heapless::Vec::<u8, BANK_BUILD_CAP>::new();
    let mut b = BankBuilder::new(16_000);
    b.add_effect(1, EffectKind::Tone, flags::ONE_SHOT, 255, 440, 80, &[])
        .unwrap();
    b.finish(&mut built).unwrap();
    let bank = SoundBank::parse(&built).unwrap();
    let pcm = render_effect_pcm(bank, 1, 16_000, AdsrSpec::click()).unwrap();
    assert!(!pcm.is_empty());
    assert!(pcm.iter().any(|&s| s != 0));
}

#[test]
fn wav_roundtrip_header() {
    let samples = [128u8; 16];
    let wav = build_wav_u8(16_000, &samples);
    assert!(wav.starts_with(b"RIFF"));
    assert!(wav.get(8..12) == Some(b"WAVE"));
}

#[test]
fn pcm_i8_to_u8_centers() {
    let u = pcm_i8_to_u8(&[0, 127, -127]);
    assert_eq!(u[0], 128);
    assert_eq!(u[1], 255);
    assert_eq!(u[2], 1);
}

#[test]
fn write_wav_tmp() {
    let path = std::env::temp_dir().join("embedded_audio_test.wav");
    let path_str = path.to_str().unwrap();
    write_mono_u8(path_str, 16_000, &[128, 200, 80, 128]).unwrap();
    let data = std::fs::read(path_str).unwrap();
    assert!(data.len() > 44);
    let _ = std::fs::remove_file(path);
}