weresocool_vorbis 1.0.47

Vorbis for WereSoCool
Documentation
use itertools::Itertools;
use weresocool_shared::Settings;

pub fn encode_lr_channels_to_ogg_vorbis(l: Vec<f64>, r: Vec<f64>) -> Vec<u8> {
    if l.len() != r.len() {
        panic!("Error encoding audio to ogg vorbis. Channels are not the same length");
    }

    let interleaved: Vec<f64> = interleave_channels(l, r);
    let veci16 = pcm_f64_to_i16(interleaved);

    let mut encoder =
        vorbis_encoder::Encoder::new(2, Settings::global().sample_rate as u64, 1.0).unwrap();
    let mut encoded = encoder.encode(&veci16).unwrap();
    encoded.append(&mut encoder.flush().unwrap());
    encoded
}

pub fn interleave_channels(l: Vec<f64>, r: Vec<f64>) -> Vec<f64> {
    l.iter().interleave(&r).copied().collect()
}

fn pcm_f64_to_i16(vecf64: Vec<f64>) -> Vec<i16> {
    vecf64
        .iter()
        .map(|v| {
            let mut f = v * 32768.0;
            if f > 32767.0 {
                f = 32767.0
            };
            if f < -32768.0 {
                f = -32768.0
            };
            f as i16
        })
        .collect()
}