use core::ptr;
pub(crate) unsafe fn copy_channels_sequential<T>(
data: ptr::NonNull<T>,
channels: usize,
frames: usize,
from: usize,
to: usize,
) where
T: Copy,
{
assert! {
from < channels,
"copy from channel {} is out of bounds 0-{}",
from,
channels
};
assert! {
to < channels,
"copy to channel {} which is out of bounds 0-{}",
to,
channels
};
if from != to {
let from = data.as_ptr().add(from * frames);
let to = data.as_ptr().add(to * frames);
ptr::copy_nonoverlapping(from, to, frames);
}
}
pub(crate) unsafe fn copy_channels_interleaved<T>(
data: ptr::NonNull<T>,
channels: usize,
frames: usize,
from: usize,
to: usize,
) where
T: Copy,
{
assert! {
from < channels,
"copy from channel {} is out of bounds 0-{}",
from,
channels
};
assert! {
to < channels,
"copy to channel {} which is out of bounds 0-{}",
to,
channels
};
if from != to {
for n in 0..frames {
let from = data.as_ptr().add(from + channels * n) as *const _;
let to = data.as_ptr().add(to + channels * n);
let f = ptr::read(from);
ptr::write(to, f);
}
}
}