#[doc = "Internal: the `gain_kernel!` macro used by AVX2 and AVX-512 gain kernels."]
mod kernel_macro;
mod avx2;
mod avx512;
pub use avx2::*;
pub use avx512::*;
pub unsafe fn apply_gain(data: &mut [f32], gain: f32) {
crate::math::common::dispatch_simd!(apply_gain(data, gain))
}
pub unsafe fn apply_gain_stereo(left: &mut [f32], right: &mut [f32], gain: f32) {
crate::math::common::dispatch_simd!(apply_gain_stereo(left, right, gain))
}
pub unsafe fn apply_gain_and_detect_clipping_mono(data: &mut [f32], gain: f32) -> bool {
crate::math::common::dispatch_simd!(apply_gain_and_detect_clipping_mono(data, gain))
}
pub unsafe fn apply_gain_and_detect_clipping_stereo(
left: &mut [f32],
right: &mut [f32],
gain: f32,
) -> bool {
crate::math::common::dispatch_simd!(apply_gain_and_detect_clipping_stereo(left, right, gain))
}
pub unsafe fn apply_ramp_stereo(left: &mut [f32], right: &mut [f32], start: f32, step: f32) {
crate::math::common::dispatch_simd!(apply_ramp_stereo(left, right, start, step))
}
pub unsafe fn apply_ramp(data: &mut [f32], start: f32, step: f32) {
crate::math::common::dispatch_simd!(apply_ramp(data, start, step))
}
pub fn apply_gain_simd(buffer: &mut [f32], gain_linear: f32) {
if (gain_linear - 1.0).abs() < 1e-6 {
return;
}
unsafe { apply_gain(buffer, gain_linear) };
}
pub fn apply_ramp_simd(buffer: &mut [f32], start: f32, step: f32) {
if step.abs() < 1e-9 {
apply_gain_simd(buffer, start);
return;
}
unsafe { apply_ramp(buffer, start, step) };
}
pub unsafe fn apply_gain_then_dither(data: &mut [f32], gain: f32, offset: f32) {
crate::math::common::dispatch_simd!(apply_gain_then_dither(data, gain, offset))
}
pub unsafe fn apply_dither_add(data: &mut [f32], offset: f32) {
crate::math::common::dispatch_simd!(apply_dither_add(data, offset))
}
pub unsafe fn crossfade_blend_mono(out: &mut [f32], pending: &[f32], t: f32) {
crate::math::common::dispatch_simd!(crossfade_blend_mono(out, pending, t))
}
#[inline]
pub fn crossfade_blend_mono_simd(out: &mut [f32], pending: &[f32], t: f32) {
if out.len() != pending.len() {
let n = out.len().min(pending.len());
unsafe { crossfade_blend_mono(&mut out[..n], &pending[..n], t) };
return;
}
unsafe { crossfade_blend_mono(out, pending, t) };
}
pub fn apply_dither_add_simd(buffer: &mut [f32], offset: f32) {
unsafe { apply_dither_add(buffer, offset) };
}
#[cfg(test)]
#[path = "../gain_test.rs"]
mod gain_test;