#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct MediaKey(pub u16);
impl MediaKey {
pub const fn new(usage: u16) -> MediaKey {
MediaKey(usage)
}
pub const fn usage(self) -> u16 {
self.0
}
pub const PLAY_PAUSE: MediaKey = MediaKey(0xCD);
pub const STOP: MediaKey = MediaKey(0xB7);
pub const NEXT_TRACK: MediaKey = MediaKey(0xB5);
pub const PREV_TRACK: MediaKey = MediaKey(0xB6);
pub const MUTE: MediaKey = MediaKey(0xE2);
pub const VOLUME_UP: MediaKey = MediaKey(0xE9);
pub const VOLUME_DOWN: MediaKey = MediaKey(0xEA);
pub const PLAY: MediaKey = MediaKey(0xB0);
pub const PAUSE: MediaKey = MediaKey(0xB1);
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct MediaEvent {
pub keys: Vec<MediaKey>,
}
impl MediaEvent {
pub(crate) fn from_payload(p: &[u8]) -> Option<MediaEvent> {
let n = *p.first()? as usize;
let mut keys = Vec::with_capacity(n);
for i in 0..n {
let lo = *p.get(1 + 2 * i)?;
let hi = *p.get(2 + 2 * i)?;
keys.push(MediaKey(u16::from_le_bytes([lo, hi])));
}
Some(MediaEvent { keys })
}
pub fn is_pressed(&self, key: MediaKey) -> bool {
self.keys.contains(&key)
}
}