feat: you can now get volume for all sound individually, not only via fullstate

This commit is contained in:
2026-02-25 00:34:05 +03:00
parent e72fc519a0
commit ce948ce678
5 changed files with 36 additions and 8 deletions
+5 -2
View File
@@ -75,7 +75,10 @@ enum GetCommands {
/// Check if the player is paused
IsPaused,
/// Playback volume
Volume,
Volume {
#[clap(short, long)]
id: Option<u32>,
},
/// Playback position (in seconds)
Position {
#[clap(short, long)]
@@ -146,7 +149,7 @@ async fn main() -> Result<(), Box<dyn Error>> {
},
Commands::Get { parameter } => match parameter {
GetCommands::IsPaused => Request::get_is_paused(),
GetCommands::Volume => Request::get_volume(),
GetCommands::Volume { id } => Request::get_volume(id),
GetCommands::Position { id } => Request::get_position(id),
GetCommands::Duration { id } => Request::get_duration(id),
GetCommands::State => Request::get_state(),
+12
View File
@@ -208,6 +208,18 @@ impl AudioPlayer {
PlayerState::Stopped
}
pub fn get_volume(&mut self, id: Option<u32>) -> Option<f32> {
if let Some(id) = id {
if let Some(sound) = self.tracks.get_mut(&id) {
return Some(sound.sink.volume());
} else {
return None;
}
} else {
return Some(self.volume);
}
}
pub fn set_volume(&mut self, volume: f32, id: Option<u32>) {
if let Some(id) = id {
if let Some(sound) = self.tracks.get_mut(&id) {
+10 -3
View File
@@ -40,7 +40,9 @@ pub struct IsPausedCommand {}
pub struct GetStateCommand {}
pub struct GetVolumeCommand {}
pub struct GetVolumeCommand {
pub id: Option<u32>,
}
pub struct SetVolumeCommand {
pub volume: Option<f32>,
@@ -188,9 +190,14 @@ impl Executable for GetStateCommand {
#[async_trait]
impl Executable for GetVolumeCommand {
async fn execute(&self) -> Response {
let audio_player = get_audio_player().await.lock().await;
let volume = audio_player.volume;
let mut audio_player = get_audio_player().await.lock().await;
let volume = audio_player.get_volume(self.id);
if let Some(volume) = volume {
Response::new(true, volume.to_string())
} else {
Response::new(false, "Failed to get volume")
}
}
}
+8 -2
View File
@@ -82,8 +82,14 @@ impl Request {
Request::new("is_paused", vec![])
}
pub fn get_volume() -> Self {
Request::new("get_volume", vec![])
pub fn get_volume(id: Option<u32>) -> Self {
let mut args = vec![];
let id_str;
if let Some(id) = id {
id_str = id.to_string();
args.push(("id", id_str.as_str()));
}
Request::new("get_volume", args)
}
pub fn get_position(id: Option<u32>) -> Self {
+1 -1
View File
@@ -14,7 +14,7 @@ pub fn parse_command(request: &Request) -> Option<Box<dyn Executable + Send>> {
"stop" => Some(Box::new(StopCommand { id })),
"is_paused" => Some(Box::new(IsPausedCommand {})),
"get_state" => Some(Box::new(GetStateCommand {})),
"get_volume" => Some(Box::new(GetVolumeCommand {})),
"get_volume" => Some(Box::new(GetVolumeCommand { id })),
"set_volume" => {
let volume = request
.args