use bytes::{Buf, Bytes};
#[derive(Clone, Debug, PartialEq)]
pub struct AudioTag {
pub header: AudioTagHeader,
pub body: AudioTagBody,
}
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub struct AudioTagHeader {
pub sound_format: SoundFormat,
pub sound_rate: SoundRate,
pub sound_size: SoundSize,
pub sound_type: SoundType,
}
#[derive(Clone, Debug, PartialEq)]
pub struct AudioTagBody {
pub data: Bytes,
}
#[allow(clippy::upper_case_acronyms)]
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub enum SoundFormat {
PcmPlatformEndian,
ADPCM,
MP3,
PcmLittleEndian,
Nellymoser16kHzMono,
Nellymoser8kHzMono,
Nellymoser,
PcmALaw,
PcmMuLaw,
ExHeader,
AAC,
Speex,
MP3_8kHz,
DeviceSpecific,
}
impl From<u8> for SoundFormat {
fn from(value: u8) -> Self {
match value {
0 => SoundFormat::PcmPlatformEndian,
1 => SoundFormat::ADPCM,
2 => SoundFormat::MP3,
3 => SoundFormat::PcmLittleEndian,
4 => SoundFormat::Nellymoser16kHzMono,
5 => SoundFormat::Nellymoser8kHzMono,
6 => SoundFormat::Nellymoser,
7 => SoundFormat::PcmALaw,
8 => SoundFormat::PcmMuLaw,
9 => SoundFormat::ExHeader,
10 => SoundFormat::AAC,
11 => SoundFormat::Speex,
14 => SoundFormat::MP3_8kHz,
15 => SoundFormat::DeviceSpecific,
_ => unreachable!(),
}
}
}
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub enum SoundRate {
_5_5KHZ,
_11KHZ,
_22KHZ,
_44KHZ,
}
impl From<u8> for SoundRate {
fn from(value: u8) -> Self {
match value {
0 => SoundRate::_5_5KHZ,
1 => SoundRate::_11KHZ,
2 => SoundRate::_22KHZ,
3 => SoundRate::_44KHZ,
_ => unreachable!(),
}
}
}
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub enum SoundSize {
_8Bit,
_16Bit,
}
impl From<u8> for SoundSize {
fn from(value: u8) -> Self {
match value {
0 => SoundSize::_8Bit,
1 => SoundSize::_16Bit,
_ => unreachable!(),
}
}
}
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub enum SoundType {
Mono,
Stereo,
}
impl From<u8> for SoundType {
fn from(value: u8) -> Self {
match value {
0 => SoundType::Mono,
1 => SoundType::Stereo,
_ => unreachable!(),
}
}
}
#[derive(Clone, Debug, PartialEq)]
pub struct AACAudioPacket {
pub packet_type: AACPacketType,
pub aac_data: Bytes,
}
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub enum AACPacketType {
SequenceHeader,
Raw,
}
impl From<u8> for AACPacketType {
fn from(value: u8) -> Self {
match value {
0 => AACPacketType::SequenceHeader,
_ => AACPacketType::Raw,
}
}
}
pub fn aac_audio_packet(mut reader: Bytes) -> AACAudioPacket {
let packet_type = reader.get_u8();
AACAudioPacket {
packet_type: AACPacketType::from(packet_type),
aac_data: reader,
}
}