generated from PlexSheep/rs-base
parent
6465f38c68
commit
ed929df3c2
|
@ -15,7 +15,7 @@ categories = ["date-and-time"]
|
||||||
[features]
|
[features]
|
||||||
default = ["desktop", "sound"]
|
default = ["desktop", "sound"]
|
||||||
desktop = ["dep:notify-rust"]
|
desktop = ["dep:notify-rust"]
|
||||||
sound = ["dep:rodio", "desktop"]
|
sound = ["dep:rodio"]
|
||||||
|
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
@ -25,5 +25,7 @@ humantime = "2.1.0"
|
||||||
libpt = { version = "0.6.0", features = ["cli"] }
|
libpt = { version = "0.6.0", features = ["cli"] }
|
||||||
notify-rust = { version = "4.11.0", optional = true }
|
notify-rust = { version = "4.11.0", optional = true }
|
||||||
ratatui = "0.27.0"
|
ratatui = "0.27.0"
|
||||||
rodio = { version = "0.19.0", optional = true }
|
rodio = { version = "0.19.0", optional = true, default-features = false, features = [
|
||||||
|
"mp3",
|
||||||
|
] }
|
||||||
tui-big-text = "0.4.5"
|
tui-big-text = "0.4.5"
|
||||||
|
|
|
@ -28,6 +28,6 @@ and sound alerts for countdown mode. (Use `cargo build -r --no-default-features`
|
||||||
|
|
||||||
## Acknoledgements
|
## Acknoledgements
|
||||||
|
|
||||||
The included alarm sound is from pixabay, royalty free:
|
The included alarm sound is from [freesound.org](https://freesound.org):
|
||||||
|
|
||||||
-> ["Alarm Clock 1"](https://pixabay.com/?utm_source=link-attribution&utm_medium=referral&utm_campaign=music&utm_content=105903)
|
-> ["effect_notify.wav" by ricemaster (CC-0)](https://freesound.org/people/ricemaster/sounds/278142/)
|
||||||
|
|
Binary file not shown.
Binary file not shown.
26
src/clock.rs
26
src/clock.rs
|
@ -77,6 +77,9 @@ pub struct Clock {
|
||||||
/// Precision: only to seconds
|
/// Precision: only to seconds
|
||||||
#[clap(short = 'u', long, value_parser = humantime::parse_duration)]
|
#[clap(short = 'u', long, value_parser = humantime::parse_duration)]
|
||||||
pub countdown: Option<std::time::Duration>,
|
pub countdown: Option<std::time::Duration>,
|
||||||
|
/// Play a notification sound when the countdown is up
|
||||||
|
#[clap(short, long)]
|
||||||
|
pub sound: bool,
|
||||||
|
|
||||||
// internal variables
|
// internal variables
|
||||||
#[clap(skip)]
|
#[clap(skip)]
|
||||||
|
@ -406,19 +409,26 @@ impl Clock {
|
||||||
fn notify(&mut self) -> anyhow::Result<()> {
|
fn notify(&mut self) -> anyhow::Result<()> {
|
||||||
Self::beep()?;
|
Self::beep()?;
|
||||||
#[cfg(feature = "sound")]
|
#[cfg(feature = "sound")]
|
||||||
{
|
if self.sound {
|
||||||
trace!("playing bundled sound");
|
std::thread::spawn(|| {
|
||||||
use rodio::{source::Source, Decoder, OutputStream};
|
use rodio::{Decoder, OutputStream, Sink};
|
||||||
|
|
||||||
// only 30 KiB, so let's just include it in the binary and not worry about reading it
|
// only 30 KiB, so let's just include it in the binary and not worry about reading it
|
||||||
// from the fs and somehow making the file be there
|
// from the fs and somehow making the file be there
|
||||||
let sound: Cursor<_> = std::io::Cursor::new(include_bytes!("../data/media/alarm.mp3"));
|
const SOUND_RAW: &[u8] = include_bytes!("../data/media/alarm.mp3");
|
||||||
|
|
||||||
|
trace!("playing bundled sound");
|
||||||
|
|
||||||
|
let sound_data: Cursor<_> = std::io::Cursor::new(SOUND_RAW);
|
||||||
|
|
||||||
// Get an output stream handle to the default physical sound device
|
|
||||||
let (_stream, stream_handle) = OutputStream::try_default().unwrap();
|
let (_stream, stream_handle) = OutputStream::try_default().unwrap();
|
||||||
let source = Decoder::new(sound).expect("could not load the included sound");
|
let sink = Sink::try_new(&stream_handle).unwrap();
|
||||||
stream_handle.play_raw(source.convert_samples())?; // the sound plays in another thread
|
sink.append(
|
||||||
|
Decoder::new(sound_data).expect("could not decode the bundled alarm sound"),
|
||||||
|
);
|
||||||
|
sink.sleep_until_end();
|
||||||
|
|
||||||
debug!("played bundled sound");
|
debug!("played bundled sound");
|
||||||
|
});
|
||||||
}
|
}
|
||||||
#[cfg(feature = "desktop")]
|
#[cfg(feature = "desktop")]
|
||||||
{
|
{
|
||||||
|
|
Reference in New Issue