Add sinks command

This commit is contained in:
2024-08-14 11:11:02 +02:00
parent 1f6e33fa75
commit e4ffeb6747
7 changed files with 146 additions and 33 deletions

62
src/pulse.rs Normal file
View File

@ -0,0 +1,62 @@
use serde::{Deserialize, Serialize};
use crate::{
output::{self, SinkList},
util::CommandExt,
};
#[derive(Serialize, Deserialize)]
pub struct Sink {
pub state: String,
pub name: String,
pub description: String,
pub mute: bool,
}
pub fn get_sinks() -> eyre::Result<output::SinkList> {
let default_sink = pactl_get_default_sink_name()?;
let sinks = pactl_get_sinks()?;
let mut output = SinkList::default();
for sink in sinks {
let default = dbg!(&sink.name) == dbg!(&default_sink);
let sink = output::Sink {
name: sink.name,
pretty_name: sink.description,
muted: sink.mute,
default,
volume: 0, // TODO
};
if default {
output.default = Some(sink.clone());
}
output.all.push(sink);
}
output.all.sort_by_key(|s| s.pretty_name.clone());
Ok(output)
}
fn pactl_get_sinks() -> eyre::Result<Vec<Sink>> {
std::process::Command::new("pactl")
.args(["--format", "json"])
.args(["list", "sinks"])
.just_exec_json()
}
fn pactl_get_default_sink_name() -> eyre::Result<String> {
let mut default_sink = std::process::Command::new("pactl")
.arg("get-default-sink")
.just_exec()?;
while default_sink.ends_with(char::is_whitespace) {
default_sink.pop();
}
Ok(default_sink)
}