use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum MemoryOrder {
ChannelMajor,
TimeMajor,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub struct BufferLayout {
pub channels: usize,
pub samples: usize,
pub order: MemoryOrder,
}
impl BufferLayout {
pub fn new(channels: usize, samples: usize, order: MemoryOrder) -> Self {
Self {
channels,
samples,
order,
}
}
pub fn total_elements(&self) -> usize {
self.channels * self.samples
}
#[inline(always)]
pub fn linear_index(&self, channel: usize, sample: usize) -> usize {
match self.order {
MemoryOrder::ChannelMajor => channel * self.samples + sample,
MemoryOrder::TimeMajor => sample * self.channels + channel,
}
}
}