Move all applications to the new sink when switching the default

This commit is contained in:
2022-02-17 22:43:12 +01:00
parent fee6f14ab0
commit 6dfd77c9e0

View File

@@ -1,6 +1,6 @@
use hidapi::{HidApi, HidDevice, HidError}; use hidapi::{HidApi, HidDevice, HidError};
use libpulse_binding::proplist::Proplist; use libpulse_binding::proplist::Proplist;
use pulsectl::controllers::{types::DeviceInfo, DeviceControl, SinkController, SourceController}; use pulsectl::controllers::{types::DeviceInfo, DeviceControl, SinkController, SourceController, AppControl};
trait Headset { trait Headset {
const VENDOR_ID: u16; const VENDOR_ID: u16;
@@ -44,6 +44,16 @@ fn is_device_headset(sink: &DeviceInfo) -> bool {
return true; return true;
} }
fn switch_sink(new_sink: &DeviceInfo, sink_controller: &mut SinkController) {
let old_sink = sink_controller.get_default_device().unwrap();
for app in sink_controller.list_applications().unwrap() {
if app.connection_id == old_sink.index {
sink_controller.move_app_by_index(app.index, new_sink.index).unwrap();
}
}
sink_controller.set_default_device(new_sink.name.as_ref().unwrap()).unwrap();
}
fn handle_report(device: &HidDevice, report: &[u8]) -> Result<(), HidError> { fn handle_report(device: &HidDevice, report: &[u8]) -> Result<(), HidError> {
match report[0] { match report[0] {
8 => { 8 => {
@@ -56,7 +66,6 @@ fn handle_report(device: &HidDevice, report: &[u8]) -> Result<(), HidError> {
.unwrap(); .unwrap();
// Invert mute state of pulse device // Invert mute state of pulse device
println!("{:#?}", mic);
source_controller.set_device_mute_by_index(mic.index, !mic.mute); source_controller.set_device_mute_by_index(mic.index, !mic.mute);
} }
17 => { 17 => {
@@ -70,9 +79,7 @@ fn handle_report(device: &HidDevice, report: &[u8]) -> Result<(), HidError> {
// Set default sink to non headset // Set default sink to non headset
let sinks = sink_controller.list_devices().unwrap(); let sinks = sink_controller.list_devices().unwrap();
let new_sink = sinks.iter().find(|sink| !is_device_headset(*sink)).unwrap(); let new_sink = sinks.iter().find(|sink| !is_device_headset(*sink)).unwrap();
sink_controller switch_sink(new_sink, &mut sink_controller);
.set_default_device(new_sink.name.as_ref().unwrap())
.unwrap();
} else { } else {
// Power on event // Power on event
@@ -85,9 +92,7 @@ fn handle_report(device: &HidDevice, report: &[u8]) -> Result<(), HidError> {
// Set default sink to the headset // Set default sink to the headset
let sinks = sink_controller.list_devices().unwrap(); let sinks = sink_controller.list_devices().unwrap();
let headset = sinks.iter().find(|sink| is_device_headset(*sink)).unwrap(); let headset = sinks.iter().find(|sink| is_device_headset(*sink)).unwrap();
sink_controller switch_sink(headset, &mut sink_controller);
.set_default_device(headset.name.as_ref().unwrap())
.unwrap();
} }
} }
} }