use aec3::api::control::EchoControl;
use aec3::audio_processing::aec3::echo_canceller3::EchoCanceller3;
use aec3::audio_processing::audio_buffer::AudioBuffer;
#[test]
fn simple_integration_processes_render_and_capture() {
let sample_rate_hz: i32 = 16_000;
let sample_rate = sample_rate_hz as usize;
let config = EchoCanceller3::create_default_config(2, 2);
let mut aec3 = EchoCanceller3::new(config, sample_rate_hz, 2, 2);
let mut render = AudioBuffer::from_sample_rates(sample_rate, 2, sample_rate, 2, sample_rate);
let mut capture = AudioBuffer::from_sample_rates(sample_rate, 2, sample_rate, 2, sample_rate);
let num_frames = render.num_frames();
for i in 0..num_frames {
let r0 = (i as f32 / 40.0).cos() * 0.4;
let r1 = (i as f32 / 40.0).cos() * 0.2;
render.channel_mut(0)[i] = r0;
render.channel_mut(1)[i] = r1;
let near0 = (i as f32 / 20.0).sin() * 0.4;
let near1 = (i as f32 / 20.0).sin() * 0.2;
capture.channel_mut(0)[i] = near0 + r0 * 0.2;
capture.channel_mut(1)[i] = near1 + r1 * 0.2;
}
let flatten = |b: &AudioBuffer| {
let mut v = Vec::with_capacity(b.num_channels() * b.num_frames());
for ch in 0..b.num_channels() {
v.extend_from_slice(b.channel(ch));
}
v
};
let render_before = flatten(&render);
let capture_before = flatten(&capture);
if render.num_bands() > 1 {
render.split_into_frequency_bands();
capture.split_into_frequency_bands();
}
aec3.analyze_render(&mut render);
let render_after = flatten(&render);
assert_eq!(
render_before, render_after,
"render buffer must remain unmodified"
);
aec3.analyze_capture(&mut capture);
aec3.process_capture(&mut capture, false);
let capture_after = flatten(&capture);
assert_ne!(
capture_before, capture_after,
"capture buffer should be modified by AEC"
);
}