1use std::convert::TryFrom;
9use std::fmt;
10
11#[derive(PartialEq, Debug)]
13pub enum AudioObjectTypeError {
14 EscapeValue,
17 TooLarge(u8),
19}
20
21#[derive(Eq, PartialEq, Copy, Clone)]
54pub struct AudioObjectType(u8);
55
56pub const AOT_ESCAPE_VALUE: u8 = 0b_11111;
59
60impl From<AudioObjectType> for u8 {
61 fn from(v: AudioObjectType) -> Self {
62 v.0
63 }
64}
65impl TryFrom<u8> for AudioObjectType {
66 type Error = AudioObjectTypeError;
67
68 fn try_from(value: u8) -> Result<Self, Self::Error> {
69 match value {
70 AOT_ESCAPE_VALUE => Err(AudioObjectTypeError::EscapeValue),
71 96..=255 => Err(AudioObjectTypeError::TooLarge(value)),
72 _ => Ok(AudioObjectType(value)),
73 }
74 }
75}
76
77macro_rules! implement_aot {
78 (
79 $( $tag:literal $id:ident $desc:literal ),* ,
80 ) => {
81
82 impl AudioObjectType {
83 $(
84 #[doc=$desc]
85 pub const $id: AudioObjectType = AudioObjectType($tag);
86 )*
87 }
88
89 impl fmt::Debug for AudioObjectType {
90 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
91 match self.0 {
92 $(
93 $tag => write!(f, "{}({})", stringify!($id), $tag)
94 ),* ,
95 _ => write!(f, "RESERVED({})", self.0),
96 }
97 }
98 }
99 }
100}
101
102implement_aot! {
103 0 NULL "Null",
104 1 AAC_MAIN "AAC main",
105 3 AAC_SSR "AAC SSR",
106 4 AAC_LTP "AAC LTP",
107 7 TWIN_VQ "TwinVQ",
108 8 CELP "CELP",
109 9 HVXC "HVXC",
110 5 SBR "SBR",
111 6 AAC_SCALABLE "AAC Scalable",
112 2 AAC_LC "AAC LC",
113 12 TTSI "TTSI",
114 13 MAIN_SYNTHETIC "Main synthetic",
115 14 WAVETABLE_SYNTHESIS "Wavetable synthesis",
116 15 GENERAL_MIDI "General MIDI",
117 16 ALGORITHMIC_SYNTHESIS_AND_AUDIO_FX "Algorithmic Synthesis and Audio FX",
118 17 ER_AAC_LC "ER AAC LC",
119 19 ER_AAC_LTP "ER AAC LTP",
120 20 ER_AAC_SCALABLE "ER AAC Scalable",
121 21 ER_TWIN_VQ "ER TwinVQ",
122 22 ER_BSAC "ER BSAC",
123 23 ER_AAC_LD "ER AAC LD",
124 24 ER_CELP "ER CELP",
125 25 ER_HVXC "ER HVXC",
126 26 ER_HILN "ER HILN",
127 27 ER_PARAMETRIC "ER Parametric",
128 28 SSC "SSC",
129 29 PS "PS",
130 30 MPEG_SURROUND "MPEG Surround",
131 32 LAYER1 "Layer-1",
133 34 LAYER3 "Layer-3",
134 35 DST "DST",
135 36 ALS "ALS",
136 37 SLS "SLS",
137 38 SLS_NON_CORE "SLS non-core",
138 39 ER_AAC_ELD "ER AAC ELD",
139 40 SMR_SIMPLE "SMR Simple",
140 41 SMR_MAIN "SMR Main",
141 42 USAC "Unified Speech and Audio Coding",
142 43 SAOC "Spatial Audio Object Coding",
143 44 LD_MPEG_SURROUND "Low Delay MPEG Surround",
144 45 SAOC_DE "Spatial Audio Object Coding Dialogue Enhancement",
145 46 AUDIO_SYNC "Audio synchronization tool",
146}
147
148#[cfg(test)]
149mod tests {
150 use super::*;
151 use std::convert::TryFrom;
152
153 #[test]
154 fn escape_value() {
155 assert_eq!(
156 Err(AudioObjectTypeError::EscapeValue),
157 AudioObjectType::try_from(AOT_ESCAPE_VALUE)
158 );
159 }
160}