mirror of
https://github.com/weyne85/rustdesk.git
synced 2025-10-29 17:00:05 +00:00
refact: seperate audio device for voice call (#8703)
Signed-off-by: fufesou <linlong1266@gmail.com>
This commit is contained in:
@@ -2,22 +2,39 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter_hbb/common.dart';
|
||||
import 'package:flutter_hbb/models/platform_model.dart';
|
||||
|
||||
const _kWindowsSystemSound = 'System Sound';
|
||||
|
||||
typedef AudioINputSetDevice = void Function(String device);
|
||||
typedef AudioInputBuilder = Widget Function(
|
||||
List<String> devices, String currentDevice, AudioINputSetDevice setDevice);
|
||||
|
||||
class AudioInput extends StatelessWidget {
|
||||
final AudioInputBuilder builder;
|
||||
final bool isCm;
|
||||
final bool isVoiceCall;
|
||||
|
||||
const AudioInput({Key? key, required this.builder}) : super(key: key);
|
||||
const AudioInput(
|
||||
{Key? key,
|
||||
required this.builder,
|
||||
required this.isCm,
|
||||
required this.isVoiceCall})
|
||||
: super(key: key);
|
||||
|
||||
static String getDefault() {
|
||||
if (isWindows) return translate('System Sound');
|
||||
return '';
|
||||
}
|
||||
|
||||
static Future<String> getValue() async {
|
||||
String device = await bind.mainGetOption(key: 'audio-input');
|
||||
static Future<String> getAudioInput(bool isCm, bool isVoiceCall) {
|
||||
if (isVoiceCall) {
|
||||
return bind.getVoiceCallInputDevice(isCm: isCm);
|
||||
} else {
|
||||
return bind.mainGetOption(key: 'audio-input');
|
||||
}
|
||||
}
|
||||
|
||||
static Future<String> getValue(bool isCm, bool isVoiceCall) async {
|
||||
String device = await getAudioInput(isCm, isVoiceCall);
|
||||
if (device.isNotEmpty) {
|
||||
return device;
|
||||
} else {
|
||||
@@ -25,31 +42,39 @@ class AudioInput extends StatelessWidget {
|
||||
}
|
||||
}
|
||||
|
||||
static Future<void> setDevice(String device) async {
|
||||
static Future<void> setDevice(
|
||||
String device, bool isCm, bool isVoiceCall) async {
|
||||
if (device == getDefault()) device = '';
|
||||
await bind.mainSetOption(key: 'audio-input', value: device);
|
||||
if (isVoiceCall) {
|
||||
await bind.setVoiceCallInputDevice(isCm: isCm, device: device);
|
||||
} else {
|
||||
await bind.mainSetOption(key: 'audio-input', value: device);
|
||||
}
|
||||
}
|
||||
|
||||
static Future<Map<String, Object>> getDevicesInfo() async {
|
||||
static Future<Map<String, Object>> getDevicesInfo(
|
||||
bool isCm, bool isVoiceCall) async {
|
||||
List<String> devices = (await bind.mainGetSoundInputs()).toList();
|
||||
if (isWindows) {
|
||||
devices.insert(0, translate('System Sound'));
|
||||
devices.insert(0, translate(_kWindowsSystemSound));
|
||||
}
|
||||
String current = await getValue();
|
||||
String current = await getValue(isCm, isVoiceCall);
|
||||
return {'devices': devices, 'current': current};
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return futureBuilder(
|
||||
future: getDevicesInfo(),
|
||||
future: getDevicesInfo(isCm, isVoiceCall),
|
||||
hasData: (data) {
|
||||
String currentDevice = data['current'];
|
||||
List<String> devices = data['devices'] as List<String>;
|
||||
if (devices.isEmpty) {
|
||||
return const Offstage();
|
||||
}
|
||||
return builder(devices, currentDevice, setDevice);
|
||||
return builder(devices, currentDevice, (devices) {
|
||||
setDevice(devices, isCm, isVoiceCall);
|
||||
});
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
@@ -500,7 +500,7 @@ class _GeneralState extends State<_General> {
|
||||
return const Offstage();
|
||||
}
|
||||
|
||||
return AudioInput(builder: (devices, currentDevice, setDevice) {
|
||||
builder(devices, currentDevice, setDevice) {
|
||||
return _Card(title: 'Audio Input Device', children: [
|
||||
...devices.map((device) => _Radio<String>(context,
|
||||
value: device,
|
||||
@@ -511,7 +511,9 @@ class _GeneralState extends State<_General> {
|
||||
setState(() {});
|
||||
}))
|
||||
]);
|
||||
});
|
||||
}
|
||||
|
||||
return AudioInput(builder: builder, isCm: false, isVoiceCall: false);
|
||||
}
|
||||
|
||||
Widget record(BuildContext context) {
|
||||
|
||||
@@ -732,7 +732,7 @@ class _CmControlPanel extends StatelessWidget {
|
||||
child: buildButton(context,
|
||||
color: MyTheme.accent,
|
||||
onClick: null, onTapDown: (details) async {
|
||||
final devicesInfo = await AudioInput.getDevicesInfo();
|
||||
final devicesInfo = await AudioInput.getDevicesInfo(true, true);
|
||||
List<String> devices = devicesInfo['devices'] as List<String>;
|
||||
if (devices.isEmpty) {
|
||||
msgBox(
|
||||
@@ -758,13 +758,13 @@ class _CmControlPanel extends StatelessWidget {
|
||||
value: d,
|
||||
height: 18,
|
||||
padding: EdgeInsets.zero,
|
||||
onTap: () => AudioInput.setDevice(d),
|
||||
onTap: () => AudioInput.setDevice(d, true, true),
|
||||
child: IgnorePointer(
|
||||
child: RadioMenuButton(
|
||||
value: d,
|
||||
groupValue: currentDevice,
|
||||
onChanged: (v) {
|
||||
if (v != null) AudioInput.setDevice(v);
|
||||
if (v != null) AudioInput.setDevice(v, true, true);
|
||||
},
|
||||
child: Container(
|
||||
child: Text(
|
||||
|
||||
@@ -1984,28 +1984,31 @@ class _VoiceCallMenu extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
menuChildrenGetter() {
|
||||
final audioInput =
|
||||
AudioInput(builder: (devices, currentDevice, setDevice) {
|
||||
return Column(
|
||||
children: devices
|
||||
.map((d) => RdoMenuButton<String>(
|
||||
child: Container(
|
||||
child: Text(
|
||||
d,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
final audioInput = AudioInput(
|
||||
builder: (devices, currentDevice, setDevice) {
|
||||
return Column(
|
||||
children: devices
|
||||
.map((d) => RdoMenuButton<String>(
|
||||
child: Container(
|
||||
child: Text(
|
||||
d,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
constraints: BoxConstraints(maxWidth: 250),
|
||||
),
|
||||
constraints: BoxConstraints(maxWidth: 250),
|
||||
),
|
||||
value: d,
|
||||
groupValue: currentDevice,
|
||||
onChanged: (v) {
|
||||
if (v != null) setDevice(v);
|
||||
},
|
||||
ffi: ffi,
|
||||
))
|
||||
.toList(),
|
||||
);
|
||||
});
|
||||
value: d,
|
||||
groupValue: currentDevice,
|
||||
onChanged: (v) {
|
||||
if (v != null) setDevice(v);
|
||||
},
|
||||
ffi: ffi,
|
||||
))
|
||||
.toList(),
|
||||
);
|
||||
},
|
||||
isCm: false,
|
||||
isVoiceCall: true,
|
||||
);
|
||||
return [
|
||||
audioInput,
|
||||
Divider(),
|
||||
|
||||
Reference in New Issue
Block a user