use crate::block::Block;
use crate::common::{BLOCK_SIZE, SUB_FRAME_LENGTH};
#[derive(Debug)]
pub struct BlockFramer {
num_bands: usize,
num_channels: usize,
buffer: Vec<Vec<Vec<f32>>>,
}
impl BlockFramer {
pub fn new(num_bands: usize, num_channels: usize) -> Self {
debug_assert!(num_bands > 0);
debug_assert!(num_channels > 0);
Self {
num_bands,
num_channels,
buffer: vec![vec![vec![0.0f32; BLOCK_SIZE]; num_channels]; num_bands],
}
}
pub fn insert_block(&mut self, block: &Block) {
debug_assert_eq!(self.num_bands, block.num_bands());
debug_assert_eq!(self.num_channels, block.num_channels());
for band in 0..self.num_bands {
for channel in 0..self.num_channels {
debug_assert!(self.buffer[band][channel].is_empty());
self.buffer[band][channel].clear();
self.buffer[band][channel].extend_from_slice(block.view(band, channel));
}
}
}
pub fn insert_block_and_extract_sub_frame(
&mut self,
block: &Block,
sub_frame: &mut [Vec<Vec<f32>>],
) {
debug_assert_eq!(self.num_bands, block.num_bands());
debug_assert_eq!(self.num_channels, block.num_channels());
debug_assert_eq!(self.num_bands, sub_frame.len());
for (band, (buf_band, sf_band)) in
self.buffer.iter_mut().zip(sub_frame.iter_mut()).enumerate()
{
debug_assert_eq!(self.num_channels, sf_band.len());
for (channel, (buf_ch, sf_ch)) in
buf_band.iter_mut().zip(sf_band.iter_mut()).enumerate()
{
let buf_len = buf_ch.len();
debug_assert!(SUB_FRAME_LENGTH <= buf_len + BLOCK_SIZE);
debug_assert!(buf_len <= BLOCK_SIZE);
debug_assert_eq!(SUB_FRAME_LENGTH, sf_ch.len());
let samples_to_frame = SUB_FRAME_LENGTH - buf_len;
sf_ch[..buf_len].copy_from_slice(buf_ch);
sf_ch[buf_len..SUB_FRAME_LENGTH]
.copy_from_slice(&block.view(band, channel)[..samples_to_frame]);
buf_ch.clear();
buf_ch.extend_from_slice(&block.view(band, channel)[samples_to_frame..]);
}
}
}
}