feat(ui,voice): add speaker mute button to VoiceBar
Speaker (output) mute existed in the legacy _AudioControls widget and the rust.setOutputMuted bridge call but was lost when SDD-097 replaced _AudioControls with VoiceBar. Mic mute carried over; speaker mute did not. Wire it back: VoiceBar gains an outputMuted prop + onToggleOutputMute callback and renders a headset/headset_off icon next to the existing mic mute. main.dart wires the existing _toggleOutputMute handler (previously dead-code with // ignore: unused_element). The bridge call setOutputMuted already does both effects together: local engine silencer + server-broadcast ClientOutputMuted flag. l10n: rename voiceHardMuteLabel to 'Mute microphone'/'麦克风静音' to distinguish from the new voiceOutputMuteLabel 'Mute speakers'/ '扬声器静音'. flutter analyze: clean (6 pre-existing Radio.groupValue infos).
This commit is contained in:
@@ -18,6 +18,7 @@ class VoiceBar extends StatelessWidget {
|
||||
required this.inChannel,
|
||||
required this.transmitMode,
|
||||
required this.hardMute,
|
||||
required this.outputMuted,
|
||||
required this.releaseTailMs,
|
||||
required this.channelName,
|
||||
required this.audioStats,
|
||||
@@ -26,6 +27,7 @@ class VoiceBar extends StatelessWidget {
|
||||
required this.pttBoundInputClass,
|
||||
required this.pttBoundKeyLabel,
|
||||
required this.onToggleMute,
|
||||
required this.onToggleOutputMute,
|
||||
required this.onConfigure,
|
||||
required this.onLeave,
|
||||
});
|
||||
@@ -39,6 +41,13 @@ class VoiceBar extends StatelessWidget {
|
||||
/// Hard-mute clamp state.
|
||||
final bool hardMute;
|
||||
|
||||
/// Speaker (output) mute state. Mirrors the server-broadcast
|
||||
/// `ClientOutputMuted` flag plus the engine's local output
|
||||
/// silencer — toggling this hushes incoming voice immediately
|
||||
/// AND tells the server so other clients see the headphone-off
|
||||
/// icon next to our name.
|
||||
final bool outputMuted;
|
||||
|
||||
/// Configured release-tail in milliseconds (0..=500). Surfaced as
|
||||
/// a hint underneath the mode badge.
|
||||
final int releaseTailMs;
|
||||
@@ -67,6 +76,9 @@ class VoiceBar extends StatelessWidget {
|
||||
/// Toggle the hard-mute clamp.
|
||||
final VoidCallback onToggleMute;
|
||||
|
||||
/// Toggle speaker (output) mute.
|
||||
final VoidCallback onToggleOutputMute;
|
||||
|
||||
/// Open the voice settings dialog. This is the SINGLE entry point
|
||||
/// for transmit-mode selection, PTT key binding, and release-tail
|
||||
/// configuration. The capability badge below is information-only
|
||||
@@ -136,6 +148,15 @@ class VoiceBar extends StatelessWidget {
|
||||
),
|
||||
],
|
||||
const Spacer(),
|
||||
IconButton(
|
||||
tooltip: l10n.voiceOutputMuteLabel,
|
||||
icon: Icon(
|
||||
outputMuted ? Icons.headset_off : Icons.headset,
|
||||
),
|
||||
isSelected: outputMuted,
|
||||
selectedIcon: const Icon(Icons.headset_off),
|
||||
onPressed: onToggleOutputMute,
|
||||
),
|
||||
IconButton(
|
||||
tooltip: l10n.voiceHardMuteLabel,
|
||||
icon: Icon(hardMute ? Icons.mic_off : Icons.mic),
|
||||
|
||||
Reference in New Issue
Block a user