use std::ops::{Deref, DerefMut};
#[derive(Clone, Copy)]
pub struct PCMSlice<'a, T> {
planar_pcm: &'a [T],
frequency: u32,
channels: u32,
}
impl<'a, T: Copy + Clone + Default> PCMSlice<'a, T> {
pub fn new(pcm_buffer: &'a mut [T], frequency: u32, channels: u32) -> Self {
Self {
planar_pcm: pcm_buffer,
frequency,
channels,
}
}
pub fn with_slice<'b>(mut self, pcm_buffer: &'b [T]) -> Self
where
'b: 'a,
{
self.planar_pcm = pcm_buffer;
self
}
pub fn frequency(&self) -> u32 {
self.frequency
}
pub fn channels(&self) -> u32 {
self.channels
}
pub fn samples(&self)->usize{
self.planar_pcm.len()
}
pub fn samples_per_channel(&self) -> u64 {
(self.planar_pcm.len() as u32 / self.channels as u32) as u64
}
fn planar_pcm_mut<'b>(&'a self) -> &'b mut [T]
where
'a: 'b,
{
let ptr = self.planar_pcm as *const [T] as *mut [T];
unsafe { &mut *ptr }
}
pub fn set_zero(&mut self) {
self.iter_mut().for_each(|e| *e = T::default())
}
pub fn duration_in_ms_u32(&self) -> u32 {
const NUM_MILLISECONDS_IN_ONE_SECOND: u32 = 1000;
(self.planar_pcm.len() as u32 * NUM_MILLISECONDS_IN_ONE_SECOND)
/ (self.channels * self.frequency)
}
pub fn duration_in_ms_f32(&self) -> f32 {
const NUM_MILLISECONDS_IN_ONE_SECOND: f32 = 1000.0;
(self.planar_pcm.len() as f32 * NUM_MILLISECONDS_IN_ONE_SECOND)
/ (self.channels as f32 * self.frequency as f32)
}
}
impl<'a, T> Deref for PCMSlice<'a, T> {
type Target = [T];
fn deref(&self) -> &Self::Target {
self.planar_pcm
}
}
impl<'a, T: Copy + Default> DerefMut for PCMSlice<'a, T> {
fn deref_mut(&mut self) -> &mut Self::Target {
self.planar_pcm_mut()
}
}