use std::time::Duration;
use itertools::izip;
use rawdio::{prelude::*, Recorder};
fn record_sampler(
sample_rate: usize,
channel_count: usize,
buffer: &OwnedAudioBuffer,
) -> OwnedAudioBuffer {
let (mut context, mut process) =
create_engine_with_options(EngineOptions::default().with_sample_rate(sample_rate));
let recorder = Recorder::new(context.as_mut(), channel_count, sample_rate);
connect_nodes!("input" => recorder.borrow_mut());
recorder.borrow_mut().record_now();
recorder
.borrow_mut()
.stop_record_at_time(Timestamp::from_samples(
(buffer.frame_count() + 1) as f64,
sample_rate,
));
let frame_count = 2 * buffer.frame_count();
let mut input_buffer = OwnedAudioBuffer::new(frame_count, channel_count, sample_rate);
input_buffer.copy_from(
buffer,
SampleLocation::origin(),
SampleLocation::origin(),
channel_count,
buffer.frame_count(),
);
let mut output_buffer = OwnedAudioBuffer::new(frame_count, channel_count, sample_rate);
context.start();
process.process(&input_buffer, &mut output_buffer);
context.process_notifications();
context.stop();
let recording = recorder
.borrow_mut()
.take_recording()
.expect("No recording was made");
recording
}
fn has_identical_data(buffer_1: &dyn AudioBuffer, buffer_2: &dyn AudioBuffer) -> bool {
if buffer_1.channel_count() != buffer_2.channel_count() {
return false;
}
if buffer_1.frame_count() != buffer_2.frame_count() {
return false;
}
for channel in 0..buffer_1.channel_count() {
let location = SampleLocation::channel(channel);
let buffer_1_data = buffer_1.get_channel_data(location);
let buffer_2_data = buffer_2.get_channel_data(location);
if izip!(buffer_1_data.iter(), buffer_2_data.iter())
.any(|(buffer_1_sample, buffer_2_sample)| buffer_1_sample != buffer_2_sample)
{
return false;
}
}
true
}
#[test]
fn records_data() {
let sample_duration = Duration::from_secs(1);
let sample_rate = 48_000;
let sample_duration = Timestamp::from_duration(sample_duration);
let sample_frame_count = sample_duration.as_samples(sample_rate).ceil() as usize;
let channel_count = 2;
let buffer = OwnedAudioBuffer::white_noise(sample_frame_count, channel_count, sample_rate);
let recorded_buffer = record_sampler(sample_rate, channel_count, &buffer);
for channel in 0..channel_count {
assert!(!recorded_buffer.channel_is_silent(channel));
}
assert!(has_identical_data(&buffer, &recorded_buffer));
}