alac-encoder 0.2.0

Rust port of Apple's open source ALAC library
Documentation
use std::fs;

use alac_encoder::{AlacEncoder, FormatDescription, MAX_ESCAPE_HEADER_BYTES};
use criterion::{Criterion, black_box, criterion_group, criterion_main};

fn test_case (input: &str, frame_size: u32, channels: u32) {
    let input_format = FormatDescription::pcm::<i16>(44100.0, channels);
    let output_format = FormatDescription::alac(44100.0, frame_size, channels);

    let mut encoder = AlacEncoder::new(&output_format);

    let pcm = fs::read(format!("fixtures/{}", input)).unwrap();

    let mut output = vec![0u8; (frame_size as usize * channels as usize * 2) + MAX_ESCAPE_HEADER_BYTES];

    for chunk in pcm.chunks(frame_size as usize * channels as usize * 2) {
        let size = encoder.encode(&input_format, &chunk, &mut output);
        black_box(Vec::from(&output[0..size]));
    }
}

fn criterion_benchmark(c: &mut Criterion) {
    c.bench_function("sample_352_2", |b| {
        b.iter(|| test_case("sample.pcm", 352, 2));
    });

    c.bench_function("sample_4096_2", |b| {
        b.iter(|| test_case("sample.pcm", 4096, 2));
    });
}

criterion_group!(benches, criterion_benchmark);
criterion_main!(benches);