From d1eec7399a96d8641dbfdd15a293c23def03475d Mon Sep 17 00:00:00 2001 From: GHOSCHT <31184695+GHOSCHT@users.noreply.github.com> Date: Tue, 30 Apr 2024 21:54:34 +0200 Subject: [PATCH] Add application control prototype --- src/pulse_client.rs | 55 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 47 insertions(+), 8 deletions(-) diff --git a/src/pulse_client.rs b/src/pulse_client.rs index c7b1436..d962ff3 100644 --- a/src/pulse_client.rs +++ b/src/pulse_client.rs @@ -82,9 +82,23 @@ pub fn run() { mainloop.borrow_mut().unlock(); //--------------------- - mainloop.borrow_mut().lock(); + let ml = Rc::clone(&mainloop); + let ctx = Rc::clone(&context); + mute_sink_input(ml, ctx, "Firefox", false); + //--------------------- - let sink_filter = Regex::new("USB_Audio_CODEC").expect("Creating RegEx failed"); + loop { + std::thread::sleep(time::Duration::from_secs(u64::MAX)); + } +} + +pub fn set_default_sink( + mainloop: Rc>, + context: Rc>, + name: &str, +) { + mainloop.borrow_mut().lock(); + let sink_filter = Regex::new(name).expect("Creating RegEx failed"); let callback_context = context.clone(); context .borrow_mut() @@ -100,11 +114,36 @@ pub fn run() { } _ => {} }); - mainloop.borrow_mut().unlock(); - //--------------------- - - loop { - std::thread::sleep(time::Duration::from_secs(u64::MAX)); - } +} + +pub fn mute_sink_input( + mainloop: Rc>, + context: Rc>, + name: &str, + state: bool, +) { + mainloop.borrow_mut().lock(); + let sink_filter = Regex::new(name).expect("Creating RegEx failed"); + let callback_context = context.clone(); + context + .borrow_mut() + .introspect() + .get_sink_input_info_list(move |items_result| match items_result { + pulse::callbacks::ListResult::Item(item) => { + let application_name = item.proplist.get_str("application.name").unwrap(); + let matches_regex = sink_filter.is_match(&application_name); + + println!("{:?}", application_name); + if matches_regex { + println!("Setting default sink to: {}", application_name); + callback_context + .borrow_mut() + .introspect() + .set_sink_input_mute(item.index, state, Option::None); + } + } + _ => {} + }); + mainloop.borrow_mut().unlock(); }