From 49e719136902534a25be10351f6d11a61af57704 Mon Sep 17 00:00:00 2001 From: Samsu Date: Thu, 3 Oct 2024 14:27:27 +0200 Subject: [PATCH] feat: fine grained volume adjustment (#8) --- src/player.rs | 20 ++++---------------- src/player/ui.rs | 12 +++++++----- src/player/ui/components.rs | 2 +- 3 files changed, 12 insertions(+), 22 deletions(-) diff --git a/src/player.rs b/src/player.rs index 8d95848..dc0a005 100644 --- a/src/player.rs +++ b/src/player.rs @@ -39,11 +39,8 @@ pub enum Messages { /// Pauses the [Sink]. This will also unpause it if it is paused. Pause, - /// Increase the volume of playback - VolumeUp, - - /// Decrease the volume of playback - VolumeDown, + /// Change the volume of playback + ChangeVolume(f32), } const TIMEOUT: Duration = Duration::from_secs(8); @@ -220,17 +217,8 @@ impl Player { player.sink.pause(); } } - Messages::VolumeUp => { - // Increase the volume, if possible. - if player.sink.volume() < 1.0 { - player.sink.set_volume(player.sink.volume() + 0.1); - } - } - Messages::VolumeDown => { - // Decreaes the volume, if possible. - if player.sink.volume() > 0.0 { - player.sink.set_volume(player.sink.volume() - 0.1); - } + Messages::ChangeVolume(change) => { + player.sink.set_volume((player.sink.volume() + change).clamp(0.0, 1.0)); } } } diff --git a/src/player/ui.rs b/src/player/ui.rs index 88c22b8..23edeb7 100644 --- a/src/player/ui.rs +++ b/src/player/ui.rs @@ -120,8 +120,10 @@ pub async fn start( let messages = match event.code { // Arrow key volume controls. - KeyCode::Up | KeyCode::Right => Messages::VolumeUp, - KeyCode::Down | KeyCode::Left => Messages::VolumeDown, + KeyCode::Up => Messages::ChangeVolume(0.1), + KeyCode::Right => Messages::ChangeVolume(0.01), + KeyCode::Down => Messages::ChangeVolume(-0.1), + KeyCode::Left => Messages::ChangeVolume(-0.01), KeyCode::Char(character) => match character { // Ctrl+C 'c' if event.modifiers == KeyModifiers::CONTROL => break, @@ -136,8 +138,8 @@ pub async fn start( 'p' => Messages::Pause, // Volume up & down - '+' | '=' => Messages::VolumeUp, - '-' | '_' => Messages::VolumeDown, + '+' | '=' => Messages::ChangeVolume(0.1), + '-' | '_' => Messages::ChangeVolume(-0.1), _ => continue, }, _ => continue, @@ -145,7 +147,7 @@ pub async fn start( // If it's modifying the volume, then we'll set the `volume_timer` to 1 // so that the ui thread will know that it should show the audio bar. - if messages == Messages::VolumeDown || messages == Messages::VolumeUp { + if let Messages::ChangeVolume(_) = messages { volume_timer.store(1, Ordering::Relaxed); } diff --git a/src/player/ui/components.rs b/src/player/ui/components.rs index 70c08d1..cb9fb66 100644 --- a/src/player/ui/components.rs +++ b/src/player/ui/components.rs @@ -49,7 +49,7 @@ pub fn audio_bar(player: &Arc) -> String { let volume = player.sink.volume(); let audio = (player.sink.volume() * AUDIO_WIDTH as f32).round() as usize; - let percentage = format!("{}%", (volume * 100.0).ceil().abs()); + let percentage = format!("{}%", (volume * 100.0).round().abs()); format!( " volume: [{}{}] {}{} ",