weresocool_vorbis/
lib.rs

1use itertools::Itertools;
2use weresocool_shared::Settings;
3
4pub fn encode_lr_channels_to_ogg_vorbis(l: Vec<f64>, r: Vec<f64>) -> Vec<u8> {
5    if l.len() != r.len() {
6        panic!("Error encoding audio to ogg vorbis. Channels are not the same length");
7    }
8
9    let interleaved: Vec<f64> = interleave_channels(l, r);
10    let veci16 = pcm_f64_to_i16(interleaved);
11
12    let mut encoder =
13        vorbis_encoder::Encoder::new(2, Settings::global().sample_rate as u64, 1.0).unwrap();
14    let mut encoded = encoder.encode(&veci16).unwrap();
15    encoded.append(&mut encoder.flush().unwrap());
16    encoded
17}
18
19pub fn interleave_channels(l: Vec<f64>, r: Vec<f64>) -> Vec<f64> {
20    l.iter().interleave(&r).copied().collect()
21}
22
23fn pcm_f64_to_i16(vecf64: Vec<f64>) -> Vec<i16> {
24    vecf64
25        .iter()
26        .map(|v| {
27            let mut f = v * 32768.0;
28            if f > 32767.0 {
29                f = 32767.0
30            };
31            if f < -32768.0 {
32                f = -32768.0
33            };
34            f as i16
35        })
36        .collect()
37}