Add sinks command
This commit is contained in:
62
src/pulse.rs
Normal file
62
src/pulse.rs
Normal 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)
|
||||
}
|
||||
Reference in New Issue
Block a user