diff options
| author | littleblack111 <littleblack11111@gmail.com> | 2025-11-12 23:31:23 +0800 |
|---|---|---|
| committer | littleblack111 <littleblack11111@gmail.com> | 2025-11-12 23:31:23 +0800 |
| commit | 6e4d5e070d52f9d1af90cc6ad8a280bd91b6220d (patch) | |
| tree | 9b37c5a5de276146fbdc695a7afed8e842087d0f | |
| parent | 0092f7acac640499c80f8e7f775d8230e5652176 (diff) | |
refactor: use `Duration` for volume transition
fix: error and panics
| -rw-r--r-- | src/main.rs | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/src/main.rs b/src/main.rs index 59cb4f1..306f909 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,7 @@ -use std::{thread::sleep, time::Duration}; +use std::{ + thread::sleep, + time::{Duration, Instant}, +}; use clap::Parser; use mpris::{DBusError, FindingError, PlaybackStatus, Player, PlayerFinder}; @@ -10,6 +13,7 @@ const BROWSER_IDENTITY: &str = "Mozilla zen"; // percentages const LOWER_VOLUME: u8 = 45; const NORMAL_VOLUME: u8 = 80; +const VOLUME_TRANSITION: Duration = Duration::from_millis(300); #[derive(Parser)] struct Args { @@ -66,15 +70,34 @@ fn set_volume(player: &Player, volume: u8) -> Vec<Result<(), DBusError>> { let current_volume = normalize_volume( player .get_volume() - .expect("Failed to retrieve {player} volume"), + .unwrap_or_else(|e| panic!("Failed to retrieve {:#?} volume: {e}", player)), ); + + if volume == current_volume { + return res; + } + + let mut intervel = VOLUME_TRANSITION + / current_volume + .abs_diff(volume) + .into(); if current_volume > volume { for v in (volume..=current_volume).rev() { + let t = Instant::now(); res.push(player.set_volume(denormal_volume(v))); + intervel = intervel.saturating_sub(t.elapsed()); + if !intervel.is_zero() { + sleep(intervel); + } } } else { for v in current_volume..=volume { + let t = Instant::now(); res.push(player.set_volume(denormal_volume(v))); + intervel = intervel.saturating_sub(t.elapsed()); + if !intervel.is_zero() { + sleep(intervel); + } } } res @@ -123,13 +146,13 @@ fn daemon() -> ! { fn set_lower(player: &Player) { set_volume(player, LOWER_VOLUME) .into_iter() - .for_each(|r| r.unwrap()); + .for_each(|r| r.unwrap_or_else(|e| eprintln!("Failed to set volume: {e}"))); } fn set_normal(player: &Player) { set_volume(player, NORMAL_VOLUME) .into_iter() - .for_each(|r| r.unwrap()); + .for_each(|r| r.unwrap_or_else(|e| eprintln!("Failed to set volume: {e}"))); } fn main() { |
