rill-io 0.3.0

Audio I/O backends for Rill - CPAL, ALSA, PipeWire, JACK
Documentation
use rill_io::{
    backends::NullBackend, processor::GainProcessor, AudioBackend, AudioConfig, AudioEngine,
    AudioProcessor,
};

mod mocks;
use mocks::test_config;

#[test]
fn test_null_backend_basic() {
    let config = test_config();
    let mut backend = NullBackend::new(config);

    assert_eq!(backend.backend_type().name(), "Null");
    assert!(backend.init().is_ok());
    assert!(backend.start().is_ok());

    let mut buf = vec![0.0; 256];
    let read = backend.read(&mut buf).unwrap();
    assert_eq!(read, 256);
    assert!(buf.iter().all(|&x| x == 0.0));

    let write_buf = vec![0.5; 256];
    let written = backend.write(&write_buf).unwrap();
    assert_eq!(written, 256);

    assert!(backend.stop().is_ok());
    assert_eq!(backend.xruns(), 0);
}

#[test]
fn test_audio_engine_with_null_backend() {
    let config = test_config();

    let backend = NullBackend::new(config.clone());
    let processor = GainProcessor::new(1.0);

    let mut engine = AudioEngine::new(backend, processor);

    assert_eq!(engine.state(), rill_io::EngineState::Stopped);

    engine.start().unwrap();
    assert_eq!(engine.state(), rill_io::EngineState::Running);

    std::thread::sleep(std::time::Duration::from_millis(10));

    engine.stop().unwrap();
    assert_eq!(engine.state(), rill_io::EngineState::Stopped);

    assert_eq!(engine.xruns(), 0);
}

#[test]
fn test_audio_engine_update_processor() {
    let config = test_config();

    let backend = NullBackend::new(config.clone());
    let processor = GainProcessor::new(1.0);

    let mut engine = AudioEngine::new(backend, processor);

    engine.start().unwrap();

    engine
        .update_processor(|p: &mut GainProcessor| {
            p.set_gain(2.0);
        })
        .unwrap();

    std::thread::sleep(std::time::Duration::from_millis(10));

    engine.stop().unwrap();
}