use enum_primitive_derive::Primitive;
use num_traits::FromPrimitive;
use super::*;
use crate::protocol::ProtocolError;
#[derive(Default, Debug, Copy, Clone, Eq, PartialEq, Primitive)]
pub enum FormatEncoding {
Any = 0,
#[default]
Pcm = 1,
Ac3Iec61937 = 2,
Eac3Iec61937 = 3,
MpegIec61937 = 4,
DtsIec61937 = 5,
Mpeg2Iec61937 = 6,
}
#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub struct FormatInfo {
pub encoding: FormatEncoding,
pub props: Props,
}
impl FormatInfo {
pub fn new(encoding: FormatEncoding) -> Self {
Self {
encoding,
props: Props::new(),
}
}
}
impl TagStructRead for FormatInfo {
fn read(ts: &mut TagStructReader<'_>, _protocol_version: u16) -> Result<Self, ProtocolError> {
ts.expect_tag(Tag::FormatInfo)?;
let encoding = ts.read_u8()?;
let encoding = FormatEncoding::from_u8(encoding).ok_or(ProtocolError::Invalid(format!(
"invalid format encoding: 0x{encoding:2x}"
)))?;
let props = ts.read()?;
Ok(Self { encoding, props })
}
}
impl TagStructWrite for FormatInfo {
fn write(
&self,
w: &mut TagStructWriter<'_>,
_protocol_version: u16,
) -> Result<(), ProtocolError> {
w.inner.write_u8(Tag::FormatInfo as u8)?;
w.write_u8(self.encoding as u8)?;
w.write(&self.props)?;
Ok(())
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::protocol::test_util::test_serde;
#[test]
fn format_info_serde() -> anyhow::Result<()> {
test_serde(&FormatInfo::new(FormatEncoding::Ac3Iec61937))
}
}