use core::fmt;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum SampleFormat {
U8,
S16,
S32,
F32,
U8Planar,
S16Planar,
S32Planar,
F32Planar,
}
impl SampleFormat {
pub const fn is_planar(self) -> bool {
matches!(
self,
Self::U8Planar | Self::S16Planar | Self::S32Planar | Self::F32Planar
)
}
pub const fn bytes_per_sample(self) -> usize {
match self {
Self::U8 | Self::U8Planar => 1,
Self::S16 | Self::S16Planar => 2,
Self::S32 | Self::S32Planar | Self::F32 | Self::F32Planar => 4,
}
}
pub const fn as_str(self) -> &'static str {
match self {
Self::U8 => "u8",
Self::S16 => "s16",
Self::S32 => "s32",
Self::F32 => "f32",
Self::U8Planar => "u8-planar",
Self::S16Planar => "s16-planar",
Self::S32Planar => "s32-planar",
Self::F32Planar => "f32-planar",
}
}
pub fn from_spec_name(s: &str) -> Option<Self> {
Some(match s {
"u8" => Self::U8,
"s16" => Self::S16,
"s32" => Self::S32,
"f32" => Self::F32,
"u8-planar" => Self::U8Planar,
"s16-planar" => Self::S16Planar,
"s32-planar" => Self::S32Planar,
"f32-planar" => Self::F32Planar,
_ => return None,
})
}
}
impl fmt::Display for SampleFormat {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(self.as_str())
}
}