12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- 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,
- required this.isCm,
- required this.isVoiceCall})
- : super(key: key);
- static String getDefault() {
- if (isWindows) return translate('System Sound');
- return '';
- }
- 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 {
- return getDefault();
- }
- }
- static Future<void> setDevice(
- String device, bool isCm, bool isVoiceCall) async {
- if (device == getDefault()) 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(
- bool isCm, bool isVoiceCall) async {
- List<String> devices = (await bind.mainGetSoundInputs()).toList();
- if (isWindows) {
- devices.insert(0, translate(_kWindowsSystemSound));
- }
- String current = await getValue(isCm, isVoiceCall);
- return {'devices': devices, 'current': current};
- }
- @override
- Widget build(BuildContext context) {
- return futureBuilder(
- 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, (devices) {
- setDevice(devices, isCm, isVoiceCall);
- });
- },
- );
- }
- }
|