feat: add audio mode config

This commit is contained in:
Kingtous 2023-01-30 22:06:52 +08:00
parent 393e0e9afb
commit 8ab49d11d1
3 changed files with 43 additions and 12 deletions

View File

@ -1259,7 +1259,7 @@ impl LoginConfigHandler {
///
/// * `q` - The audio mode option.
/// * `ignore_default` - Ignore the default value.
fn get_audio_mode_enum(&self, q: &str, ignore_default: bool) -> Option<AudioMode> {
pub fn get_audio_mode_enum(q: &str, ignore_default: bool) -> Option<AudioMode> {
if q == "guest-to-host" {
Some(AudioMode::GuestToHost)
} else if q == "two-way" {
@ -1361,7 +1361,7 @@ impl LoginConfigHandler {
pub fn save_audio_mode(&mut self, value: String) -> Option<Message> {
let mut res = None;
if let Some(q) = self.get_audio_mode_enum(&value, false) {
if let Some(q) = LoginConfigHandler::get_audio_mode_enum(&value, false) {
let mut misc = Misc::new();
misc.set_option(OptionMessage {
audio_mode: q.into(),
@ -1981,6 +1981,7 @@ pub enum Data {
RemovePortForward(i32),
AddPortForward((i32, String, i32)),
ToggleClipboardFile,
ChangeAudioMode(AudioMode),
NewRDP,
SetConfirmOverrideFile((i32, i32, bool, bool, bool)),
AddJob((i32, String, String, i32, bool, bool)),

View File

@ -1,5 +1,5 @@
use crate::client::{
Client, CodecFormat, MediaData, MediaSender, QualityStatus, MILLI1, SEC30,
Client, CodecFormat, LoginConfigHandler, MediaData, MediaSender, QualityStatus, MILLI1, SEC30,
SERVER_CLIPBOARD_ENABLED, SERVER_FILE_TRANSFER_ENABLED, SERVER_KEYBOARD_ENABLED,
};
#[cfg(not(any(target_os = "android", target_os = "ios")))]
@ -386,6 +386,24 @@ impl<T: InvokeUiSession> Remote<T> {
Data::ToggleClipboardFile => {
self.check_clipboard_file_context();
}
Data::ChangeAudioMode(audio_mode) => {
match audio_mode {
AudioMode::GuestToHost => {
if let Some(sender) = self.stop_local_audio_sender.take() {
allow_err!(sender.send(()));
}
}
AudioMode::TwoWay => {
// Start audio thread for playback.
// Cancel previous local audio session.
if let Some(sender) = self.stop_local_audio_sender.take() {
allow_err!(sender.send(()));
}
// Start client audio when connection is established.
self.stop_local_audio_sender = self.start_client_audio();
}
}
}
Data::Message(msg) => {
allow_err!(peer.send(&msg).await);
}
@ -866,19 +884,27 @@ impl<T: InvokeUiSession> Remote<T> {
});
}
}
// Start audio thread for playback
if !self.handler.is_file_transfer() && !self.handler.is_port_forward() {
// Cancel previous local audio session.
if let Some(sender) = self.stop_local_audio_sender.take() {
allow_err!(sender.send(()));
}
// Start client audio when connection is established.
self.stop_local_audio_sender = self.start_client_audio();
}
if self.handler.is_file_transfer() {
self.handler.load_last_jobs();
}
// Start audio thread for playback if current audio mode is two-way transmission.
if !self.handler.is_file_transfer() && !self.handler.is_port_forward() {
let audio_mode = LoginConfigHandler::get_audio_mode_enum(
self.handler.load_config().audio_mode.as_str(),
false,
)
.unwrap_or(AudioMode::GuestToHost);
if audio_mode == AudioMode::TwoWay {
// Cancel previous local audio session.
if let Some(sender) = self.stop_local_audio_sender.take() {
allow_err!(sender.send(()));
}
// Start client audio when connection is established.
self.stop_local_audio_sender = self.start_client_audio();
}
}
}
_ => {}
},

View File

@ -94,6 +94,10 @@ impl<T: InvokeUiSession> Session<T> {
}
pub fn save_audio_mode(&self, value: String) {
let mode = LoginConfigHandler::get_audio_mode_enum(value.as_str(), false);
if let Some(mode)= mode {
self.send(Data::ChangeAudioMode(mode));
}
let msg = self.lc.write().unwrap().save_audio_mode(value);
// Notify remote guest that the audio mode has been changed.
if let Some(msg) = msg {