use std::process::Command;
use std::{thread, time};
pub struct PACMD {
pub mac: String,
pub sink: String,
pub dbg: bool,
}
impl PACMD {
pub fn get_card_list() -> String {
let output = Command::new("pacmd")
.arg("list-cards")
.output()
.expect("Failed to list cards");
return String::from_utf8_lossy(&output.stdout).to_string();
}
pub fn restart(&self) -> bool {
let out = Command::new("bluetoothctl")
.arg("disconnect")
.arg(&self.mac)
.output()
.expect("Failed to disconnect Bluetooth");
let _disconnected = String::from_utf8_lossy(&out.stdout).contains("Successful disconnected");
self.sleep(7);
Command::new("bluetoothctl")
.arg("connect")
.arg(&self.mac)
.spawn()
.expect("Failed to connect Bluetooth");
self.sleep(3);
let connected = String::from_utf8_lossy(&out.stdout).contains("Connection successful");
return connected;
}
fn sleep(&self, seconds: u64) {
let ten_seconds = time::Duration::from_secs(seconds);
thread::sleep(ten_seconds);
}
pub fn set_a2dp_sink(&self) -> bool {
let out = Command::new("pacmd")
.arg("set-card-profile")
.arg(&self.sink)
.arg("a2dp_sink")
.output();
match out {
Ok(output) => {
let success = output.status.success();
if !success {
println!("Failed to update A2DP, restarting Bluetooth");
let success = self.restart();
if !success {
println!(
"Failed to restart {}",
String::from_utf8_lossy(&output.stderr)
);
} else {
return self.set_a2dp_sink();
}
}
success
}
Err(e) => {
let success = self.restart();
if !success {
println!("Failed to restart {}", e);
} else {
return self.set_a2dp_sink();
}
success
}
}
}
}