feat: set to default input device when in dual-way
This commit is contained in:
parent
cab1fc719a
commit
7e5c5b50e5
@ -2,13 +2,14 @@ use crate::client::{
|
|||||||
Client, CodecFormat, LoginConfigHandler, MediaData, MediaSender, QualityStatus, MILLI1, SEC30,
|
Client, CodecFormat, LoginConfigHandler, MediaData, MediaSender, QualityStatus, MILLI1, SEC30,
|
||||||
SERVER_CLIPBOARD_ENABLED, SERVER_FILE_TRANSFER_ENABLED, SERVER_KEYBOARD_ENABLED,
|
SERVER_CLIPBOARD_ENABLED, SERVER_FILE_TRANSFER_ENABLED, SERVER_KEYBOARD_ENABLED,
|
||||||
};
|
};
|
||||||
|
use crate::common::{get_default_sound_input, set_sound_input};
|
||||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||||
use crate::common::{check_clipboard, update_clipboard, ClipboardContext, CLIPBOARD_INTERVAL};
|
use crate::common::{check_clipboard, update_clipboard, ClipboardContext, CLIPBOARD_INTERVAL};
|
||||||
use crate::{audio_service, common, ConnInner, CLIENT_SERVER};
|
use crate::{audio_service, common, ConnInner, CLIENT_SERVER};
|
||||||
|
|
||||||
#[cfg(windows)]
|
#[cfg(windows)]
|
||||||
use clipboard::{cliprdr::CliprdrClientContext, ContextSend};
|
use clipboard::{cliprdr::CliprdrClientContext, ContextSend};
|
||||||
use hbb_common::futures::channel::mpsc::unbounded;
|
|
||||||
use hbb_common::tokio::sync::mpsc::error::TryRecvError;
|
use hbb_common::tokio::sync::mpsc::error::TryRecvError;
|
||||||
|
|
||||||
use crate::server::Service;
|
use crate::server::Service;
|
||||||
@ -32,7 +33,7 @@ use hbb_common::tokio::{
|
|||||||
};
|
};
|
||||||
use hbb_common::{allow_err, message_proto::*, sleep};
|
use hbb_common::{allow_err, message_proto::*, sleep};
|
||||||
use hbb_common::{fs, log, Stream};
|
use hbb_common::{fs, log, Stream};
|
||||||
use std::borrow::Borrow;
|
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
use std::sync::atomic::{AtomicUsize, Ordering};
|
use std::sync::atomic::{AtomicUsize, Ordering};
|
||||||
@ -270,6 +271,11 @@ impl<T: InvokeUiSession> Remote<T> {
|
|||||||
if self.handler.is_file_transfer() || self.handler.is_port_forward() {
|
if self.handler.is_file_transfer() || self.handler.is_port_forward() {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
// Switch to default input device
|
||||||
|
let default_sound_device = get_default_sound_input();
|
||||||
|
if let Some(device) = default_sound_device {
|
||||||
|
set_sound_input(device);
|
||||||
|
}
|
||||||
// Create a channel to receive error or closed message
|
// Create a channel to receive error or closed message
|
||||||
let (tx, rx) = std::sync::mpsc::channel();
|
let (tx, rx) = std::sync::mpsc::channel();
|
||||||
let (tx_audio_data, mut rx_audio_data) = hbb_common::tokio::sync::mpsc::unbounded_channel();
|
let (tx_audio_data, mut rx_audio_data) = hbb_common::tokio::sync::mpsc::unbounded_channel();
|
||||||
|
@ -30,6 +30,8 @@ use hbb_common::{
|
|||||||
// #[cfg(any(target_os = "android", target_os = "ios", feature = "cli"))]
|
// #[cfg(any(target_os = "android", target_os = "ios", feature = "cli"))]
|
||||||
use hbb_common::{config::RENDEZVOUS_PORT, futures::future::join_all};
|
use hbb_common::{config::RENDEZVOUS_PORT, futures::future::join_all};
|
||||||
|
|
||||||
|
use crate::ui_interface::{set_option, get_option};
|
||||||
|
|
||||||
pub type NotifyMessageBox = fn(String, String, String, String) -> dyn Future<Output = ()>;
|
pub type NotifyMessageBox = fn(String, String, String, String) -> dyn Future<Output = ()>;
|
||||||
|
|
||||||
pub const CLIPBOARD_NAME: &'static str = "clipboard";
|
pub const CLIPBOARD_NAME: &'static str = "clipboard";
|
||||||
@ -105,6 +107,46 @@ pub fn check_clipboard(
|
|||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Set sound input device.
|
||||||
|
pub fn set_sound_input(device: String) {
|
||||||
|
let prior_device = get_option("audio-input".to_owned());
|
||||||
|
if prior_device != device {
|
||||||
|
log::info!("switch to audio input device {}", device);
|
||||||
|
set_option("audio-input".to_owned(), device);
|
||||||
|
} else {
|
||||||
|
log::info!("audio input is already set to {}", device);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Get system's default sound input device name.
|
||||||
|
#[inline]
|
||||||
|
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||||
|
pub fn get_default_sound_input() -> Option<String> {
|
||||||
|
#[cfg(not(target_os = "linux"))]
|
||||||
|
{
|
||||||
|
use cpal::traits::{DeviceTrait, HostTrait};
|
||||||
|
let host = cpal::default_host();
|
||||||
|
let dev = host.default_input_device();
|
||||||
|
return if let Some(dev) = dev {
|
||||||
|
match dev.name() {
|
||||||
|
Ok(name) => Some(name),
|
||||||
|
Err(_) => None,
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
};
|
||||||
|
}
|
||||||
|
#[cfg(target_os = "linux")]
|
||||||
|
{
|
||||||
|
let input = crate::platform::linux::get_default_pa_source();
|
||||||
|
return if let Some(input) = input {
|
||||||
|
Some(input.1)
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||||
pub fn update_clipboard(clipboard: Clipboard, old: Option<&Arc<Mutex<String>>>) {
|
pub fn update_clipboard(clipboard: Clipboard, old: Option<&Arc<Mutex<String>>>) {
|
||||||
let content = if clipboard.compress {
|
let content = if clipboard.compress {
|
||||||
@ -715,5 +757,5 @@ pub fn make_fd_to_json(id: i32, path: String, entries: &Vec<FileEntry>) -> Strin
|
|||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod test_common {
|
mod test_common {
|
||||||
use super::*;
|
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,9 @@ use std::str::FromStr;
|
|||||||
use flutter_rust_bridge::{StreamSink, SyncReturn, ZeroCopyBuffer};
|
use flutter_rust_bridge::{StreamSink, SyncReturn, ZeroCopyBuffer};
|
||||||
use serde_json::json;
|
use serde_json::json;
|
||||||
|
|
||||||
|
use crate::common::{is_keyboard_mode_supported, get_default_sound_input};
|
||||||
|
use hbb_common::message_proto::KeyboardMode;
|
||||||
|
use hbb_common::ResultType;
|
||||||
use hbb_common::{
|
use hbb_common::{
|
||||||
config::{self, LocalConfig, ONLINE, PeerConfig},
|
config::{self, LocalConfig, ONLINE, PeerConfig},
|
||||||
fs, log,
|
fs, log,
|
||||||
@ -534,6 +537,13 @@ pub fn main_get_sound_inputs() -> Vec<String> {
|
|||||||
vec![String::from("")]
|
vec![String::from("")]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn main_get_default_sound_input() -> Option<String> {
|
||||||
|
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||||
|
return get_default_sound_input();
|
||||||
|
#[cfg(any(target_os = "android", target_os = "ios"))]
|
||||||
|
String::from("")
|
||||||
|
}
|
||||||
|
|
||||||
pub fn main_get_hostname() -> SyncReturn<String> {
|
pub fn main_get_hostname() -> SyncReturn<String> {
|
||||||
SyncReturn(crate::common::hostname())
|
SyncReturn(crate::common::hostname())
|
||||||
}
|
}
|
||||||
|
@ -534,6 +534,24 @@ pub fn get_pa_sources() -> Vec<(String, String)> {
|
|||||||
out
|
out
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn get_default_pa_source() -> Option<(String, String)> {
|
||||||
|
use pulsectl::controllers::*;
|
||||||
|
match SourceController::create() {
|
||||||
|
Ok(mut handler) => {
|
||||||
|
if let Ok(dev) = handler.get_default_device() {
|
||||||
|
return Some((
|
||||||
|
dev.name.unwrap_or("".to_owned()),
|
||||||
|
dev.description.unwrap_or("".to_owned()),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Err(err) => {
|
||||||
|
log::error!("Failed to get_pa_source: {:?}", err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
None
|
||||||
|
}
|
||||||
|
|
||||||
pub fn lock_screen() {
|
pub fn lock_screen() {
|
||||||
std::process::Command::new("xdg-screensaver")
|
std::process::Command::new("xdg-screensaver")
|
||||||
.arg("lock")
|
.arg("lock")
|
||||||
|
@ -5,7 +5,7 @@ use crate::clipboard_file::*;
|
|||||||
use crate::common::update_clipboard;
|
use crate::common::update_clipboard;
|
||||||
#[cfg(windows)]
|
#[cfg(windows)]
|
||||||
use crate::portable_service::client as portable_client;
|
use crate::portable_service::client as portable_client;
|
||||||
use crate::{video_service, client::{MediaSender, start_audio_thread, LatencyController, MediaData}};
|
use crate::{video_service, client::{MediaSender, start_audio_thread, LatencyController, MediaData}, common::{get_default_sound_input, set_sound_input}};
|
||||||
#[cfg(any(target_os = "android", target_os = "ios"))]
|
#[cfg(any(target_os = "android", target_os = "ios"))]
|
||||||
use crate::{common::DEVICE_NAME, flutter::connection_manager::start_channel};
|
use crate::{common::DEVICE_NAME, flutter::connection_manager::start_channel};
|
||||||
use crate::{ipc, VERSION};
|
use crate::{ipc, VERSION};
|
||||||
@ -1542,6 +1542,11 @@ impl Connection {
|
|||||||
},
|
},
|
||||||
Some(misc::Union::AudioFormat(format)) => {
|
Some(misc::Union::AudioFormat(format)) => {
|
||||||
if !self.disable_audio {
|
if !self.disable_audio {
|
||||||
|
// Switch to default input device
|
||||||
|
let default_sound_device = get_default_sound_input();
|
||||||
|
if let Some(device) = default_sound_device {
|
||||||
|
set_sound_input(device);
|
||||||
|
}
|
||||||
allow_err!(self.audio_sender.send(MediaData::AudioFormat(format)));
|
allow_err!(self.audio_sender.send(MediaData::AudioFormat(format)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user