diff --git a/flutter/assets/voice_call.svg b/flutter/assets/voice_call.svg
index bf90ec958..98ebd4bc8 100644
--- a/flutter/assets/voice_call.svg
+++ b/flutter/assets/voice_call.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/flutter/lib/common/widgets/audio_input.dart b/flutter/lib/common/widgets/audio_input.dart
new file mode 100644
index 000000000..36a0e4972
--- /dev/null
+++ b/flutter/lib/common/widgets/audio_input.dart
@@ -0,0 +1,56 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_hbb/common.dart';
+import 'package:flutter_hbb/models/platform_model.dart';
+
+typedef AudioINputSetDevice = void Function(String device);
+typedef AudioInputBuilder = Widget Function(
+ List devices, String currentDevice, AudioINputSetDevice setDevice);
+
+class AudioInput extends StatelessWidget {
+ final AudioInputBuilder builder;
+
+ const AudioInput({Key? key, required this.builder}) : super(key: key);
+
+ static String getDefault() {
+ if (isWindows) return translate('System Sound');
+ return '';
+ }
+
+ static Future getValue() async {
+ String device = await bind.mainGetOption(key: 'audio-input');
+ if (device.isNotEmpty) {
+ return device;
+ } else {
+ return getDefault();
+ }
+ }
+
+ static Future setDevice(String device) async {
+ if (device == getDefault()) device = '';
+ await bind.mainSetOption(key: 'audio-input', value: device);
+ }
+
+ static Future