#![allow(clippy::new_without_default)]
use crate::interface::Frame;
use core::marker::PhantomData;
#[path = "in_vol_db.rs"]
mod in_vol_db;
pub use in_vol_db::InVoldB;
#[derive(Debug, Eq, PartialEq, Clone, Copy)]
pub struct Left;
#[derive(Debug, Eq, PartialEq, Clone, Copy)]
pub struct Right;
#[derive(Debug, Eq, PartialEq, Clone, Copy)]
pub struct LineIn<CHANNEL> {
data: u16,
channel: PhantomData<CHANNEL>,
}
pub type LeftLineIn = LineIn<Left>;
pub type RightLineIn = LineIn<Right>;
impl Default for LeftLineIn {
fn default() -> Self {
Self::new()
}
}
impl Default for RightLineIn {
fn default() -> Self {
Self::new()
}
}
impl LeftLineIn {
pub fn new() -> Self {
Self {
data: 0b0_1001_0111,
channel: PhantomData::<Left>,
}
}
pub fn to_frame(&self) -> Frame {
Frame { data: self.data }
}
}
impl RightLineIn {
pub fn new() -> Self {
Self {
data: 0x1 << 9 | 0b0_1001_0111,
channel: PhantomData::<Right>,
}
}
pub fn to_frame(&self) -> Frame {
Frame {
data: 0x1 << 9 | self.data,
}
}
}
impl<CHANNEL> LineIn<CHANNEL> {
pub fn vol(&self) -> InVoldB {
unsafe { InVoldB::from_raw_unchecked((self.data & 0b11111) as _) }
}
pub fn mute(&self) -> bool {
let pos = 7;
self.data & (1 << pos) == 1 << pos
}
pub fn both(&self) -> bool {
let pos = 8;
self.data & (1 << pos) == 1 << pos
}
pub fn set_vol(&mut self, volume: InVoldB) -> &mut Self {
self.data = self.data & !0b11111 | (volume.into_raw() as u16);
self
}
pub fn set_mute(&mut self, value: bool) -> &mut Self {
let pos = 7;
self.data = self.data & !(1 << pos) | (value as u16) << pos;
self
}
pub fn set_both(&mut self, value: bool) -> &mut Self {
let pos = 8;
self.data = self.data & !(1 << pos) | (value as u16) << pos;
self
}
}