in src/backend/mixer.rs [113:162]
fn mix(
&self,
input_buffer_ptr: *const (),
input_buffer_size: usize,
output_buffer_ptr: *mut (),
output_buffer_size: usize,
frames: usize,
) {
use std::slice;
// Check input buffer size.
let size_needed = frames * self.input_channels().len() * self.sample_size();
assert!(input_buffer_size >= size_needed);
// Check output buffer size.
let size_needed = frames * self.output_channels().len() * self.sample_size();
assert!(output_buffer_size >= size_needed);
match self {
MixerType::IntegerMixer(m) => {
let in_buf_ptr = input_buffer_ptr as *const i16;
let out_buf_ptr = output_buffer_ptr as *mut i16;
let input_buffer = unsafe {
slice::from_raw_parts(in_buf_ptr, frames * self.input_channels().len())
};
let output_buffer = unsafe {
slice::from_raw_parts_mut(out_buf_ptr, frames * self.output_channels().len())
};
let mut in_buf = input_buffer.chunks(self.input_channels().len());
let mut out_buf = output_buffer.chunks_mut(self.output_channels().len());
for _ in 0..frames {
m.mix(in_buf.next().unwrap(), out_buf.next().unwrap());
}
}
MixerType::FloatMixer(m) => {
let in_buf_ptr = input_buffer_ptr as *const f32;
let out_buf_ptr = output_buffer_ptr as *mut f32;
let input_buffer = unsafe {
slice::from_raw_parts(in_buf_ptr, frames * self.input_channels().len())
};
let output_buffer = unsafe {
slice::from_raw_parts_mut(out_buf_ptr, frames * self.output_channels().len())
};
let mut in_buf = input_buffer.chunks(self.input_channels().len());
let mut out_buf = output_buffer.chunks_mut(self.output_channels().len());
for _ in 0..frames {
m.mix(in_buf.next().unwrap(), out_buf.next().unwrap());
}
}
};
}