Files
songbird/benches/base-mixing.rs

105 lines
3.5 KiB
Rust

use criterion::{black_box, criterion_group, criterion_main, BatchSize, BenchmarkId, Criterion};
use songbird::{
constants::*,
driver::{
bench_internals::mixer::{mix_logic, state::DecodeState},
MixMode,
},
input::{codecs::*, Input, LiveInput, Parsed},
test_utils as utils,
};
use std::io::Cursor;
use symphonia_core::audio::{AudioBuffer, Layout, SampleBuffer, Signal, SignalSpec};
pub fn mix_one_frame(c: &mut Criterion) {
let floats = utils::make_sine(1 * STEREO_FRAME_SIZE, true);
let symph_layout = MixMode::Stereo.into();
let mut symph_mix = AudioBuffer::<f32>::new(
MONO_FRAME_SIZE as u64,
symphonia_core::audio::SignalSpec::new_with_layout(SAMPLE_RATE_RAW as u32, symph_layout),
);
let mut resample_scratch = AudioBuffer::<f32>::new(
MONO_FRAME_SIZE as u64,
SignalSpec::new_with_layout(SAMPLE_RATE_RAW as u32, Layout::Stereo),
);
let mut group = c.benchmark_group("Stereo Target");
for (pres, hz) in [("", 48_000), (" (Resample)", 44_100)] {
group.bench_with_input(
BenchmarkId::new(format!("Stereo Source{}", pres), hz),
&hz,
|b, i| {
b.iter_batched_ref(
|| black_box(make_src(&floats, 2, *i)),
|(ref mut input, ref mut local_input)| {
symph_mix.clear();
symph_mix.render_reserved(Some(MONO_FRAME_SIZE));
resample_scratch.clear();
black_box(mix_logic::mix_symph_indiv(
&mut symph_mix,
&mut resample_scratch,
input,
local_input,
black_box(1.0),
None,
));
},
BatchSize::SmallInput,
)
},
);
group.bench_with_input(
BenchmarkId::new(format!("Mono Source{}", pres), hz),
&hz,
|b, i| {
b.iter_batched_ref(
|| black_box(make_src(&floats, 1, *i)),
|(ref mut input, ref mut local_input)| {
symph_mix.clear();
symph_mix.render_reserved(Some(MONO_FRAME_SIZE));
resample_scratch.clear();
black_box(mix_logic::mix_symph_indiv(
&mut symph_mix,
&mut resample_scratch,
input,
local_input,
black_box(1.0),
None,
));
},
BatchSize::SmallInput,
)
},
);
}
group.finish();
}
fn make_src(src: &Vec<u8>, chans: u32, hz: u32) -> (Parsed, DecodeState) {
let local_input = Default::default();
let adapted: Input =
songbird::input::RawAdapter::new(Cursor::new(src.clone()), hz, chans).into();
let promoted = match adapted {
Input::Live(l, _) => l.promote(get_codec_registry(), get_probe()),
_ => panic!("Failed to create a guaranteed source."),
};
let parsed = match promoted {
Ok(LiveInput::Parsed(parsed)) => parsed,
Err(e) => panic!("AR {:?}", e),
_ => panic!("Failed to create a guaranteed source."),
};
(parsed, local_input)
}
criterion_group!(benches, mix_one_frame);
criterion_main!(benches);