feat: add audio switch ui

This commit is contained in:
Kingtous 2023-01-30 20:30:35 +08:00
parent 95d06e160b
commit cb228bef2b
39 changed files with 219 additions and 0 deletions

View File

@ -106,6 +106,12 @@ const kRemoteImageQualityLow = 'low';
/// [kRemoteImageQualityCustom] Custom image quality.
const kRemoteImageQualityCustom = 'custom';
/// [kRemoteAudioGuestToHost] Guest to host audio mode(default).
const kRemoteAudioGuestToHost = 'guest-to-host';
/// [kRemoteAudioTwoWay] two-way audio mode(default).
const kRemoteAudioTwoWay = 'two-way';
const kIgnoreDpi = true;
/// flutter/packages/flutter/lib/src/services/keyboard_key.dart -> _keyLabels

View File

@ -1106,6 +1106,30 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
padding: padding,
),
MenuEntryDivider<String>(),
MenuEntryRadios<String>(
text: translate('Audio Transmission Mode'),
optionsGetter: () => [
MenuEntryRadioOption(
text: translate('Guest to Host'),
value: kRemoteAudioGuestToHost,
dismissOnClicked: true,
),
MenuEntryRadioOption(
text: translate('Two way'),
value: kRemoteAudioTwoWay,
dismissOnClicked: true,
),
],
curOptionGetter: () async =>
// null means peer id is not found, which there's no need to care about
await bind.sessionGetAudioMode(id: widget.id) ?? '',
optionSetter: (String oldValue, String newValue) async {
if (oldValue != newValue) {
await bind.sessionSetAudioMode(id: widget.id, value: newValue);
}
},
padding: padding,
),
];
if (widget.state.viewStyle.value == kRemoteViewStyleOriginal) {
@ -1337,6 +1361,8 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
if (perms['audio'] != false) {
displayMenu
.add(_createSwitchMenuEntry('Mute', 'disable-audio', padding, true));
displayMenu
.add(_createSwitchMenuEntry('Mute', 'disable-audio', padding, true));
}
if (Platform.isWindows &&

View File

@ -444,6 +444,11 @@ enum ImageQuality {
Best = 4;
}
enum AudioMode {
GuestToHost = 0;
TwoWay = 1;
}
message VideoCodecState {
enum PreferCodec {
Auto = 0;
@ -475,6 +480,7 @@ message OptionMessage {
BoolOption enable_file_transfer = 9;
VideoCodecState video_codec_state = 10;
int32 custom_fps = 11;
AudioMode audio_mode = 12;
}
message TestDelay {

View File

@ -212,6 +212,11 @@ pub struct PeerConfig {
deserialize_with = "PeerConfig::deserialize_image_quality"
)]
pub image_quality: String,
#[serde(
default = "PeerConfig::default_audio_mode",
deserialize_with = "PeerConfig::deserialize_audio_mode"
)]
pub audio_mode: String,
#[serde(
default = "PeerConfig::default_custom_image_quality",
deserialize_with = "PeerConfig::deserialize_custom_image_quality"
@ -996,6 +1001,11 @@ impl PeerConfig {
deserialize_image_quality,
UserDefaultConfig::load().get("image_quality")
);
serde_field_string!(
default_audio_mode,
deserialize_audio_mode,
"guest-to-host".to_owned()
);
fn default_custom_image_quality() -> Vec<i32> {
let f: f64 = UserDefaultConfig::load()

View File

@ -1252,6 +1252,27 @@ impl LoginConfigHandler {
}
}
/// Parse the audio mode option.
/// Return [`AudioMode`] if the option is valid, otherwise return `None`.
///
/// # Arguments
///
/// * `q` - The audio mode option.
/// * `ignore_default` - Ignore the default value.
fn get_audio_mode_enum(&self, q: &str, ignore_default: bool) -> Option<AudioMode> {
if q == "guest-to-host" {
Some(AudioMode::GuestToHost)
} else if q == "two-way" {
Some(AudioMode::TwoWay)
} else {
if ignore_default {
None
} else {
Some(AudioMode::GuestToHost)
}
}
}
/// Get the status of a toggle option.
///
/// # Arguments
@ -1338,6 +1359,24 @@ impl LoginConfigHandler {
res
}
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) {
let mut misc = Misc::new();
misc.set_option(OptionMessage {
audio_mode: q.into(),
..Default::default()
});
let mut msg_out = Message::new();
msg_out.set_misc(misc);
res = Some(msg_out);
}
let mut config = self.load_config();
config.audio_mode = value;
self.save_config(config);
res
}
/// Create a [`Message`] for saving custom fps.
///
/// # Arguments

View File

@ -233,6 +233,20 @@ pub fn session_set_image_quality(id: String, value: String) {
}
}
pub fn session_get_audio_mode(id: String) -> Option<String> {
if let Some(session) = SESSIONS.read().unwrap().get(&id) {
Some(session.get_audio_mode())
} else {
None
}
}
pub fn session_set_audio_mode(id: String, value: String) {
if let Some(session) = SESSIONS.write().unwrap().get_mut(&id) {
session.save_audio_mode(value);
}
}
pub fn session_get_keyboard_mode(id: String) -> Option<String> {
if let Some(session) = SESSIONS.read().unwrap().get(&id) {
Some(session.get_keyboard_mode())

View File

@ -445,5 +445,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("FPS", ""),
("Auto", ""),
("Other Default Options", ""),
("Guest to Host", ""),
("Two way", ""),
("Audio Transmission Mode", ""),
].iter().cloned().collect();
}

View File

@ -445,5 +445,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("FPS", "帧率"),
("Auto", "自动"),
("Other Default Options", "其它默认选项"),
("Guest to Host", "被控到主机"),
("Two way", "双向"),
("Audio Transmission Mode", "音频传输模式"),
].iter().cloned().collect();
}

View File

@ -445,5 +445,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("FPS", ""),
("Auto", ""),
("Other Default Options", ""),
("Guest to Host", ""),
("Two way", ""),
("Audio Transmission Mode", ""),
].iter().cloned().collect();
}

View File

@ -436,6 +436,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Switch Sides", ""),
("Please confirm if you want to share your desktop?", ""),
("Closed as expected", ""),
("Guest to Host", ""),
("Two way", ""),
("Audio Transmission Mode", ""),
("Display", ""),
("Default View Style", ""),
("Default Scroll Style", ""),

View File

@ -445,5 +445,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("FPS", "fps"),
("Auto", "Automatisch"),
("Other Default Options", "Weitere Standardoptionen"),
("Guest to Host", ""),
("Two way", ""),
("Audio Transmission Mode", ""),
].iter().cloned().collect();
}

View File

@ -445,5 +445,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("FPS", ""),
("Auto", ""),
("Other Default Options", ""),
("Guest to Host", ""),
("Two way", ""),
("Audio Transmission Mode", ""),
].iter().cloned().collect();
}

View File

@ -445,5 +445,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("FPS", ""),
("Auto", ""),
("Other Default Options", "Otras opciones predeterminadas"),
("Closed as expected", ""),
("Guest to Host", ""),
("Two way", ""),
("Audio Transmission Mode", ""),
].iter().cloned().collect();
}

View File

@ -445,5 +445,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("FPS", "FPS"),
("Auto", "خودکار"),
("Other Default Options", "سایر گزینه های پیش فرض"),
("Guest to Host", ""),
("Two way", ""),
("Audio Transmission Mode", ""),
].iter().cloned().collect();
}

View File

@ -445,5 +445,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("FPS", "FPS"),
("Auto", "Auto"),
("Other Default Options", "Autres options par défaut"),
("Guest to Host", ""),
("Two way", ""),
("Audio Transmission Mode", ""),
].iter().cloned().collect();
}

View File

@ -445,5 +445,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("FPS", ""),
("Auto", ""),
("Other Default Options", ""),
("Guest to Host", ""),
("Two way", ""),
("Audio Transmission Mode", ""),
].iter().cloned().collect();
}

View File

@ -445,5 +445,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("FPS", ""),
("Auto", ""),
("Other Default Options", ""),
("Guest to Host", ""),
("Two way", ""),
("Audio Transmission Mode", ""),
].iter().cloned().collect();
}

View File

@ -445,5 +445,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("FPS", ""),
("Auto", ""),
("Other Default Options", ""),
("Guest to Host", ""),
("Two way", ""),
("Audio Transmission Mode", ""),
].iter().cloned().collect();
}

View File

@ -445,5 +445,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("FPS", "FPS"),
("Auto", "Auto"),
("Other Default Options", "Altre Opzioni Predefinite"),
("Guest to Host", ""),
("Two way", ""),
("Audio Transmission Mode", ""),
].iter().cloned().collect();
}

View File

@ -445,5 +445,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("FPS", ""),
("Auto", ""),
("Other Default Options", ""),
("Guest to Host", ""),
("Two way", ""),
("Audio Transmission Mode", ""),
].iter().cloned().collect();
}

View File

@ -445,5 +445,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("FPS", ""),
("Auto", ""),
("Other Default Options", ""),
("Guest to Host", ""),
("Two way", ""),
("Audio Transmission Mode", ""),
].iter().cloned().collect();
}

View File

@ -445,5 +445,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("FPS", ""),
("Auto", ""),
("Other Default Options", ""),
("Guest to Host", ""),
("Two way", ""),
("Audio Transmission Mode", ""),
].iter().cloned().collect();
}

View File

@ -445,5 +445,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("FPS", "FPS"),
("Auto", "Auto"),
("Other Default Options", "Inne opcje domyślne"),
("Guest to Host", ""),
("Two way", ""),
("Audio Transmission Mode", ""),
].iter().cloned().collect();
}

View File

@ -445,5 +445,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("FPS", ""),
("Auto", ""),
("Other Default Options", ""),
("Guest to Host", ""),
("Two way", ""),
("Audio Transmission Mode", ""),
].iter().cloned().collect();
}

View File

@ -445,5 +445,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("FPS", ""),
("Auto", ""),
("Other Default Options", ""),
("Guest to Host", ""),
("Two way", ""),
("Audio Transmission Mode", ""),
].iter().cloned().collect();
}

View File

@ -445,5 +445,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("FPS", ""),
("Auto", ""),
("Other Default Options", ""),
("Guest to Host", ""),
("Two way", ""),
("Audio Transmission Mode", ""),
].iter().cloned().collect();
}

View File

@ -445,5 +445,10 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("FPS", "FPS"),
("Auto", "Авто"),
("Other Default Options", "Другие параметры по умолчанию"),
("Please confirm if you want to share your desktop?", "Подтвердите, что хотите поделиться своим рабочим столом?"),
("Closed as expected", ""),
("Guest to Host", ""),
("Two way", ""),
("Audio Transmission Mode", ""),
].iter().cloned().collect();
}

View File

@ -445,5 +445,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("FPS", ""),
("Auto", ""),
("Other Default Options", ""),
("Guest to Host", ""),
("Two way", ""),
("Audio Transmission Mode", ""),
].iter().cloned().collect();
}

View File

@ -445,5 +445,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("FPS", ""),
("Auto", ""),
("Other Default Options", ""),
("Guest to Host", ""),
("Two way", ""),
("Audio Transmission Mode", ""),
].iter().cloned().collect();
}

View File

@ -445,5 +445,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("FPS", ""),
("Auto", ""),
("Other Default Options", ""),
("Guest to Host", ""),
("Two way", ""),
("Audio Transmission Mode", ""),
].iter().cloned().collect();
}

View File

@ -445,5 +445,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("FPS", ""),
("Auto", ""),
("Other Default Options", ""),
("Guest to Host", ""),
("Two way", ""),
("Audio Transmission Mode", ""),
].iter().cloned().collect();
}

View File

@ -445,5 +445,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("FPS", ""),
("Auto", ""),
("Other Default Options", ""),
("Guest to Host", ""),
("Two way", ""),
("Audio Transmission Mode", ""),
].iter().cloned().collect();
}

View File

@ -445,5 +445,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("FPS", ""),
("Auto", ""),
("Other Default Options", ""),
("Guest to Host", ""),
("Two way", ""),
("Audio Transmission Mode", ""),
].iter().cloned().collect();
}

View File

@ -445,5 +445,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("FPS", ""),
("Auto", ""),
("Other Default Options", ""),
("Guest to Host", ""),
("Two way", ""),
("Audio Transmission Mode", ""),
].iter().cloned().collect();
}

View File

@ -445,5 +445,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("FPS", ""),
("Auto", ""),
("Other Default Options", ""),
("Guest to Host", ""),
("Two way", ""),
("Audio Transmission Mode", ""),
].iter().cloned().collect();
}

View File

@ -445,5 +445,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("FPS", "幀率"),
("Auto", "自動"),
("Other Default Options", "其它默認選項"),
("Guest to Host", ""),
("Two way", ""),
("Audio Transmission Mode", ""),
].iter().cloned().collect();
}

View File

@ -445,5 +445,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("FPS", ""),
("Auto", ""),
("Other Default Options", ""),
("Guest to Host", ""),
("Two way", ""),
("Audio Transmission Mode", ""),
].iter().cloned().collect();
}

View File

@ -445,5 +445,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("FPS", ""),
("Auto", ""),
("Other Default Options", ""),
("Guest to Host", ""),
("Two way", ""),
("Audio Transmission Mode", ""),
].iter().cloned().collect();
}

View File

@ -89,6 +89,18 @@ impl<T: InvokeUiSession> Session<T> {
self.lc.write().unwrap().save_keyboard_mode(value);
}
pub fn get_audio_mode(&self) -> String {
self.lc.read().unwrap().audio_mode.clone()
}
pub fn save_audio_mode(&self, value: String) {
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 {
self.send(Data::Message(msg));
}
}
pub fn save_view_style(&mut self, value: String) {
self.lc.write().unwrap().save_view_style(value);
}
@ -653,6 +665,13 @@ impl<T: InvokeUiSession> Session<T> {
}
}
}
fn get_audio_transmission_mode(&self, id: &str) {
}
fn set_audio_transmission_mode(&self, id: &str, mode: String) {
}
}
pub trait InvokeUiSession: Send + Sync + Clone + 'static + Sized + Default {