From 9b6e55fe23890ee89efd5b16605ae44b903471e6 Mon Sep 17 00:00:00 2001 From: salmonik Date: Tue, 5 May 2026 23:12:45 +0200 Subject: Add dev/release config separation and volume query command --- TODO.md | 4 ++++ src/audio.rs | 9 +++++++++ src/config.rs | 18 ++++++++++++------ src/daemon.rs | 4 ++++ 4 files changed, 29 insertions(+), 6 deletions(-) diff --git a/TODO.md b/TODO.md index efcc440..2d4db2f 100644 --- a/TODO.md +++ b/TODO.md @@ -2,6 +2,10 @@ ## Completed ✓ +- [x] **Dev/release build config separation** - Store config next to binary in dev mode, use XDG in release mode. + +- [x] **Volume without argument returns current volume** - `rsplayer volume` now returns current level. + - [x] **Fix SampleRate access in audio.rs:104** - `config.sample_rate().0` is invalid because `cpal::SampleRate` is a type alias for `u32`, not a tuple struct. - [x] **Implement previous track logic** (`src/playback.rs:99`) - Implemented basic previous() that restarts current track if playing/paused. diff --git a/src/audio.rs b/src/audio.rs index 4e26263..93eb8e6 100644 --- a/src/audio.rs +++ b/src/audio.rs @@ -18,6 +18,7 @@ pub struct AudioEngine { is_playing: Arc, current_track: Arc>>, track_ended: Arc, + volume: Arc>, } impl AudioEngine { @@ -48,6 +49,7 @@ impl AudioEngine { is_playing, current_track, track_ended, + volume, } } @@ -75,6 +77,13 @@ impl AudioEngine { let _ = self.command_tx.send(AudioCommand::SetVolume(volume)); } + pub fn get_volume(&self) -> u8 { + self.volume + .lock() + .map(|v| (*v * 100.0) as u8) + .unwrap_or(100) + } + pub fn is_playing(&self) -> bool { self.is_playing.load(Ordering::SeqCst) } diff --git a/src/config.rs b/src/config.rs index cda59f4..42573ed 100644 --- a/src/config.rs +++ b/src/config.rs @@ -20,13 +20,19 @@ pub struct Config { impl Config { pub fn load() -> Result> { - let proj_dirs = ProjectDirs::from("com", "rsplayer", "rsplayer") - .ok_or("Failed to get project directories")?; - - let config_dir = if let Ok(xdg) = std::env::var("XDG_CONFIG_HOME") { - PathBuf::from(xdg).join("rsplayer") + let config_dir = if cfg!(debug_assertions) { + std::env::current_exe()? + .parent() + .map(|p| p.to_path_buf()) + .unwrap_or_else(|| PathBuf::from(".")) } else { - proj_dirs.config_dir().to_path_buf() + let proj_dirs = ProjectDirs::from("com", "rsplayer", "rsplayer") + .ok_or("Failed to get project directories")?; + if let Ok(xdg) = std::env::var("XDG_CONFIG_HOME") { + PathBuf::from(xdg).join("rsplayer") + } else { + proj_dirs.config_dir().to_path_buf() + } }; let config_path = config_dir.join("config.toml"); diff --git a/src/daemon.rs b/src/daemon.rs index b0da698..dab0e5a 100644 --- a/src/daemon.rs +++ b/src/daemon.rs @@ -645,6 +645,10 @@ fn process_command( format!("File not found: {}\n", path_str) } } + _ if cmd == "volume" => { + let vol = audio.get_volume(); + format!("Volume: {}\n", vol) + } _ if cmd.starts_with("volume ") => { if let Ok(level) = cmd[7..].trim().parse::() { audio.set_volume(level as f32 / 100.0); -- cgit v1.2.3