use mpdclient_sys::{
MPD_SAMPLE_FORMAT_DSD, MPD_SAMPLE_FORMAT_FLOAT, MPD_SAMPLE_FORMAT_UNDEFINED, mpd_audio_format,
};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct AudioFormat {
pub sample_rate: Option<u32>,
pub bits: SupportedBits,
pub channels: Channels,
}
impl From<mpd_audio_format> for AudioFormat {
fn from(value: mpd_audio_format) -> Self {
let sample_rate = if value.sample_rate == 0 {
None
} else {
Some(value.sample_rate)
};
AudioFormat {
sample_rate,
bits: SupportedBits::from(value.bits),
channels: Channels::from(value.channels),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[allow(clippy::cast_possible_wrap)]
pub enum SupportedBits {
Undefined = MPD_SAMPLE_FORMAT_UNDEFINED as isize,
N8 = 8,
N16 = 16,
N24 = 24,
N32 = 32,
Float = MPD_SAMPLE_FORMAT_FLOAT as isize,
DSD = MPD_SAMPLE_FORMAT_DSD as isize,
}
impl From<u8> for SupportedBits {
fn from(value: u8) -> Self {
match value {
0 => Self::Undefined,
8 => Self::N8,
16 => Self::N16,
24 => Self::N24,
32 => Self::N32,
0xe0 => Self::Float,
0xe1 => Self::DSD,
_ => unreachable!(),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Channels {
Unknown = 0,
Mono = 1,
Stereo = 2,
}
impl From<u8> for Channels {
fn from(value: u8) -> Self {
match value {
0 => Self::Unknown,
1 => Self::Mono,
2 => Self::Stereo,
_ => unimplemented!(),
}
}
}