pub(crate) fn downmix_to_mono(interleaved: &[f32], channels: u16) -> Vec<f32> {
if channels <= 1 {
return interleaved.to_vec();
}
let ch = channels as usize;
let frames = interleaved.len() / ch;
let mut out = Vec::with_capacity(frames);
for f in 0..frames {
let base = f * ch;
let sum: f32 = interleaved[base..base + ch].iter().copied().sum();
out.push(sum / ch as f32);
}
out
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn downmix_averages_channels() {
let stereo = [1.0, 3.0, -1.0, 1.0];
assert_eq!(downmix_to_mono(&stereo, 2), vec![2.0, 0.0]);
assert_eq!(downmix_to_mono(&[0.5, 0.25], 1), vec![0.5, 0.25]);
}
}