From aa5c7cc38e706ce2dd7f1ac57823adc0bdf3656c Mon Sep 17 00:00:00 2001 From: yanfeng Date: Mon, 28 Feb 2022 11:45:02 +0800 Subject: [PATCH] Fix switch audio input device failed in index page on Linux. --- src/ipc.rs | 4 ++++ src/server/audio_service.rs | 13 ++++++++++++- src/ui.rs | 5 +++++ src/ui/index.tis | 1 + 4 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/ipc.rs b/src/ipc.rs index 41f59bddb..6f639a99a 100644 --- a/src/ipc.rs +++ b/src/ipc.rs @@ -515,6 +515,10 @@ pub fn set_option(key: &str, value: &str) { set_options(options).ok(); } +pub fn restart_autdio_input() { + crate::audio_service::restart(); +} + #[tokio::main(flavor = "current_thread")] pub async fn set_options(value: HashMap) -> ResultType<()> { let mut c = connect(1000, "").await?; diff --git a/src/server/audio_service.rs b/src/server/audio_service.rs index e02df1f8c..95b15029e 100644 --- a/src/server/audio_service.rs +++ b/src/server/audio_service.rs @@ -14,9 +14,11 @@ use super::*; use magnum_opus::{Application::*, Channels::*, Encoder}; +use std::sync::atomic::{AtomicBool, Ordering}; pub const NAME: &'static str = "audio"; pub const AUDIO_DATA_SIZE_U8: usize = 960 * 4; // 10ms in 48000 stereo +static RESTARTING: AtomicBool = AtomicBool::new(false); #[cfg(not(target_os = "linux"))] pub fn new() -> GenericService { @@ -32,12 +34,21 @@ pub fn new() -> GenericService { sp } +pub fn restart() { + log::info!("restart the audio service, freezing now..."); + if RESTARTING.load(Ordering::SeqCst) { + return; + } + RESTARTING.store(true, Ordering::SeqCst); +} + #[cfg(target_os = "linux")] mod pa_impl { use super::*; #[tokio::main(flavor = "current_thread")] pub async fn run(sp: GenericService) -> ResultType<()> { hbb_common::sleep(0.1).await; // one moment to wait for _pa ipc + RESTARTING.store(false, Ordering::SeqCst); let mut stream = crate::ipc::connect(1000, "_pa").await?; unsafe { AUDIO_ZERO_COUNT = 0; @@ -61,7 +72,7 @@ mod pa_impl { if data.len() == 0 { send_f32(&zero_audio_frame, &mut encoder, &sp); continue; - } + } if data.len() != AUDIO_DATA_SIZE_U8 { continue; } diff --git a/src/ui.rs b/src/ui.rs index c59f01299..ba6cc0bf5 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -364,6 +364,10 @@ impl UI { } } + fn refresh_audio_input(&self) { + ipc::restart_autdio_input(); + } + fn install_path(&mut self) -> String { #[cfg(windows)] return crate::platform::windows::get_install_info().1; @@ -701,6 +705,7 @@ impl sciter::EventHandler for UI { fn create_shortcut(String); fn discover(); fn get_lan_peers(); + fn refresh_audio_input(); } } diff --git a/src/ui/index.tis b/src/ui/index.tis index a2cea681d..99748830b 100644 --- a/src/ui/index.tis +++ b/src/ui/index.tis @@ -131,6 +131,7 @@ class AudioInputs: Reactor.Component { if (v == this.get_value()) return; if (v == this.get_default()) v = ""; handler.set_option("audio-input", v); + handler.refresh_audio_input(); this.toggleMenuState(); } }