use rustfft::num_traits::FloatConst;
use rustfft::FftNum;
pub trait DctNum: FftNum + FloatConst {
fn half() -> Self;
fn two() -> Self;
}
impl<T: FftNum + FloatConst> DctNum for T {
fn half() -> Self {
Self::from_f64(0.5).unwrap()
}
fn two() -> Self {
Self::from_f64(2.0).unwrap()
}
}
macro_rules! validate_buffer {
($buffer: expr,$expected_buffer_len: expr) => {{
if $buffer.len() != $expected_buffer_len {
dct_error_inplace($buffer.len(), 0, $expected_buffer_len, 0);
return;
}
}};
}
macro_rules! validate_buffers {
($buffer: expr, $scratch: expr, $expected_buffer_len: expr, $expected_scratch_len: expr) => {{
if $buffer.len() != $expected_buffer_len {
dct_error_inplace(
$buffer.len(),
$scratch.len(),
$expected_buffer_len,
$expected_scratch_len,
);
return;
}
if let Some(sliced_scratch) = $scratch.get_mut(0..$expected_scratch_len) {
sliced_scratch
} else {
dct_error_inplace(
$buffer.len(),
$scratch.len(),
$expected_buffer_len,
$expected_scratch_len,
);
return;
}
}};
}
macro_rules! validate_buffers_mdct {
($buffer_a: expr, $buffer_b: expr, $buffer_c: expr, $scratch: expr, $expected_buffer_len: expr, $expected_scratch_len: expr) => {{
if $buffer_a.len() != $expected_buffer_len
|| $buffer_b.len() != $expected_buffer_len
|| $buffer_c.len() != $expected_buffer_len
{
mdct_error_inplace(
$buffer_a.len(),
$buffer_b.len(),
$buffer_c.len(),
$scratch.len(),
$expected_buffer_len,
$expected_scratch_len,
);
return;
}
if let Some(sliced_scratch) = $scratch.get_mut(0..$expected_scratch_len) {
sliced_scratch
} else {
mdct_error_inplace(
$buffer_a.len(),
$buffer_b.len(),
$buffer_c.len(),
$scratch.len(),
$expected_buffer_len,
$expected_scratch_len,
);
return;
}
}};
}
#[cold]
#[inline(never)]
pub fn dct_error_inplace(
actual_len: usize,
actual_scratch: usize,
expected_len: usize,
expected_scratch: usize,
) {
assert!(
actual_len == expected_len,
"Provided buffer must be equal to the transform size. Expected len = {}, got len = {}",
expected_len,
actual_len
);
assert!(
actual_scratch >= expected_scratch,
"Not enough scratch space was provided. Expected scratch len >= {}, got scratch len = {}",
expected_scratch,
actual_scratch
);
}
#[cold]
#[inline(never)]
pub fn mdct_error_inplace(
actual_len_a: usize,
actual_len_b: usize,
actual_len_c: usize,
actual_scratch: usize,
expected_len: usize,
expected_scratch: usize,
) {
assert!(
actual_len_a == expected_len,
"All three MDCT buffers must be equal to the transform size. Expected len = {}, but first buffer was len = {}",
expected_len,
actual_len_a
);
assert!(
actual_len_b == expected_len,
"All three MDCT buffers must be equal to the transform size. Expected len = {}, but second buffer was len = {}",
expected_len,
actual_len_b
);
assert!(
actual_len_c == expected_len,
"All three MDCT buffers must be equal to the transform size. Expected len = {}, but third buffer was len = {}",
expected_len,
actual_len_c
);
assert!(
actual_scratch >= expected_scratch,
"Not enough scratch space was provided. Expected scratch len >= {}, got scratch len = {}",
expected_scratch,
actual_scratch
);
}