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:
EdisonJwa
2026-05-16 00:18:18 +08:00
parent 33d80894d0
commit 82b99ebcff
7 changed files with 42 additions and 6 deletions
@@ -526,9 +526,15 @@ abstract class AppL10n {
/// No description provided for @voiceHardMuteLabel.
///
/// In en, this message translates to:
/// **'Mute'**
/// **'Mute microphone'**
String get voiceHardMuteLabel;
/// No description provided for @voiceOutputMuteLabel.
///
/// In en, this message translates to:
/// **'Mute speakers'**
String get voiceOutputMuteLabel;
/// No description provided for @voiceSettingsTitle.
///
/// In en, this message translates to:
@@ -255,7 +255,10 @@ class AppL10nEn extends AppL10n {
String get voiceLeaveAction => 'Leave voice';
@override
String get voiceHardMuteLabel => 'Mute';
String get voiceHardMuteLabel => 'Mute microphone';
@override
String get voiceOutputMuteLabel => 'Mute speakers';
@override
String get voiceSettingsTitle => 'Voice settings';
@@ -249,7 +249,10 @@ class AppL10nZh extends AppL10n {
String get voiceLeaveAction => '离开语音';
@override
String get voiceHardMuteLabel => '静音';
String get voiceHardMuteLabel => '麦克风静音';
@override
String get voiceOutputMuteLabel => '扬声器静音';
@override
String get voiceSettingsTitle => '语音设置';