Move all applications to the new sink when switching the default
This commit is contained in:
21
src/main.rs
21
src/main.rs
@@ -1,6 +1,6 @@
|
||||
use hidapi::{HidApi, HidDevice, HidError};
|
||||
use libpulse_binding::proplist::Proplist;
|
||||
use pulsectl::controllers::{types::DeviceInfo, DeviceControl, SinkController, SourceController};
|
||||
use pulsectl::controllers::{types::DeviceInfo, DeviceControl, SinkController, SourceController, AppControl};
|
||||
|
||||
trait Headset {
|
||||
const VENDOR_ID: u16;
|
||||
@@ -44,6 +44,16 @@ fn is_device_headset(sink: &DeviceInfo) -> bool {
|
||||
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> {
|
||||
match report[0] {
|
||||
8 => {
|
||||
@@ -56,7 +66,6 @@ fn handle_report(device: &HidDevice, report: &[u8]) -> Result<(), HidError> {
|
||||
.unwrap();
|
||||
|
||||
// Invert mute state of pulse device
|
||||
println!("{:#?}", mic);
|
||||
source_controller.set_device_mute_by_index(mic.index, !mic.mute);
|
||||
}
|
||||
17 => {
|
||||
@@ -70,9 +79,7 @@ fn handle_report(device: &HidDevice, report: &[u8]) -> Result<(), HidError> {
|
||||
// Set default sink to non headset
|
||||
let sinks = sink_controller.list_devices().unwrap();
|
||||
let new_sink = sinks.iter().find(|sink| !is_device_headset(*sink)).unwrap();
|
||||
sink_controller
|
||||
.set_default_device(new_sink.name.as_ref().unwrap())
|
||||
.unwrap();
|
||||
switch_sink(new_sink, &mut sink_controller);
|
||||
} else {
|
||||
// Power on event
|
||||
|
||||
@@ -85,9 +92,7 @@ fn handle_report(device: &HidDevice, report: &[u8]) -> Result<(), HidError> {
|
||||
// Set default sink to the headset
|
||||
let sinks = sink_controller.list_devices().unwrap();
|
||||
let headset = sinks.iter().find(|sink| is_device_headset(*sink)).unwrap();
|
||||
sink_controller
|
||||
.set_default_device(headset.name.as_ref().unwrap())
|
||||
.unwrap();
|
||||
switch_sink(headset, &mut sink_controller);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user