use std::io::Result;
use std::thread::sleep;
use evdev::{Device, EventType, InputEvent, SoundCode};
use crate::Note;
pub trait Beep {
fn beep(&mut self, hertz: u16) -> Result<()>;
fn note(&mut self, note: &Note) -> Result<()> {
if note.repeats() > 0 {
self.beep(note.frequency())?;
sleep(note.length());
self.beep(0)?;
}
for _ in 1..note.repeats() {
sleep(note.delay());
self.beep(note.frequency())?;
sleep(note.length());
self.beep(0)?;
}
Ok(())
}
fn play<T>(&mut self, melody: T) -> Result<()>
where
T: AsRef<[Note]>,
{
for note in melody.as_ref() {
self.note(note)?;
}
Ok(())
}
}
impl Beep for Device {
fn beep(&mut self, hertz: u16) -> Result<()> {
self.send_events(&[InputEvent::new(
EventType::SOUND.0,
SoundCode::SND_TONE.0,
i32::from(hertz),
)])
}
}