in src/backend/buffer_manager.rs [58:92]
fn remix_or_drop_channels<T: DataType>(
input_channels: usize,
output_channels: usize,
data: &mut [T],
frame_count: usize,
) -> usize {
assert!(input_channels >= output_channels);
// Nothing to do, just return
if input_channels == output_channels {
return output_channels * frame_count;
}
// Simple stereo downmix
if input_channels == 2 && output_channels == 1 {
let mut read_idx = 0;
for (write_idx, _) in (0..frame_count).enumerate() {
let avg = (data[read_idx].as_() + data[read_idx + 1].as_()) / 2.0;
data[write_idx] = DataType::from_f32(avg);
read_idx += 2;
}
return output_channels * frame_count;
}
// Drop excess channels
let mut read_idx = 0;
let mut write_idx = 0;
let channel_dropped_count = input_channels - output_channels;
for _ in 0..frame_count {
for _ in 0..output_channels {
data[write_idx] = data[read_idx];
write_idx += 1;
read_idx += 1;
}
read_idx += channel_dropped_count;
}
output_channels * frame_count
}