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}