1use bytes::{Buf, Bytes};
2
3#[derive(Clone, Debug, PartialEq)]
5pub struct AudioTag {
6 pub header: AudioTagHeader, pub body: AudioTagBody,
11}
12
13#[derive(Copy, Clone, Debug, Eq, PartialEq)]
15pub struct AudioTagHeader {
16 pub sound_format: SoundFormat,
18
19 pub sound_rate: SoundRate,
21
22 pub sound_size: SoundSize,
24
25 pub sound_type: SoundType,
27}
28
29#[derive(Clone, Debug, PartialEq)]
31pub struct AudioTagBody {
32 pub data: Bytes,
34}
35
36#[allow(clippy::upper_case_acronyms)]
38#[derive(Copy, Clone, Debug, Eq, PartialEq)]
39pub enum SoundFormat {
40 PcmPlatformEndian,
42
43 ADPCM,
45
46 MP3,
48
49 PcmLittleEndian,
51
52 Nellymoser16kHzMono,
54
55 Nellymoser8kHzMono,
57
58 Nellymoser,
60
61 PcmALaw,
63
64 PcmMuLaw,
66
67 ExHeader,
69
70 AAC,
72
73 Speex,
75
76 MP3_8kHz,
78
79 DeviceSpecific,
81}
82
83impl From<u8> for SoundFormat {
84 fn from(value: u8) -> Self {
85 match value {
86 0 => SoundFormat::PcmPlatformEndian,
87 1 => SoundFormat::ADPCM,
88 2 => SoundFormat::MP3,
89 3 => SoundFormat::PcmLittleEndian,
90 4 => SoundFormat::Nellymoser16kHzMono,
91 5 => SoundFormat::Nellymoser8kHzMono,
92 6 => SoundFormat::Nellymoser,
93 7 => SoundFormat::PcmALaw,
94 8 => SoundFormat::PcmMuLaw,
95 9 => SoundFormat::ExHeader,
96 10 => SoundFormat::AAC,
97 11 => SoundFormat::Speex,
98 14 => SoundFormat::MP3_8kHz,
99 15 => SoundFormat::DeviceSpecific,
100 _ => unreachable!(),
101 }
102 }
103}
104
105#[derive(Copy, Clone, Debug, Eq, PartialEq)]
107pub enum SoundRate {
108 _5_5KHZ,
110
111 _11KHZ,
113
114 _22KHZ,
116
117 _44KHZ,
119}
120
121impl From<u8> for SoundRate {
122 fn from(value: u8) -> Self {
123 match value {
124 0 => SoundRate::_5_5KHZ,
125 1 => SoundRate::_11KHZ,
126 2 => SoundRate::_22KHZ,
127 3 => SoundRate::_44KHZ,
128 _ => unreachable!(),
129 }
130 }
131}
132
133#[derive(Copy, Clone, Debug, Eq, PartialEq)]
135pub enum SoundSize {
136 _8Bit,
138
139 _16Bit,
141}
142
143impl From<u8> for SoundSize {
144 fn from(value: u8) -> Self {
145 match value {
146 0 => SoundSize::_8Bit,
147 1 => SoundSize::_16Bit,
148 _ => unreachable!(),
149 }
150 }
151}
152
153#[derive(Copy, Clone, Debug, Eq, PartialEq)]
155pub enum SoundType {
156 Mono,
158
159 Stereo,
161}
162
163impl From<u8> for SoundType {
164 fn from(value: u8) -> Self {
165 match value {
166 0 => SoundType::Mono,
167 1 => SoundType::Stereo,
168 _ => unreachable!(),
169 }
170 }
171}
172
173#[derive(Clone, Debug, PartialEq)]
175pub struct AACAudioPacket {
176 pub packet_type: AACPacketType,
178
179 pub aac_data: Bytes,
181}
182
183#[derive(Copy, Clone, Debug, Eq, PartialEq)]
185pub enum AACPacketType {
186 SequenceHeader,
188
189 Raw,
191}
192
193impl From<u8> for AACPacketType {
194 fn from(value: u8) -> Self {
195 match value {
196 0 => AACPacketType::SequenceHeader,
197 _ => AACPacketType::Raw,
198 }
199 }
200}
201
202pub fn aac_audio_packet(mut reader: Bytes) -> AACAudioPacket {
204 let packet_type = reader.get_u8();
205
206 AACAudioPacket {
207 packet_type: AACPacketType::from(packet_type),
208 aac_data: reader,
209 }
210}