From 4de3ad4cab9db7df2fb9c4656a2ed15d4a1b4414 Mon Sep 17 00:00:00 2001 From: ericek111 Date: Thu, 24 Sep 2026 14:25:58 +0000 Subject: [PATCH] Make the talking-while-muted beep optional Co-Authored-By: Claude Opus 5.5 --- .../src/main/java/com/ts3client/config/Settings.java | 4 ++++ .../java/com/ts3client/net/TeamspeakConnection.java | 1 + .../src/main/java/com/ts3client/ui/DevicesPanel.java | 12 ++++++++++++ 3 files changed, 17 insertions(+) diff --git a/ts3-client/core/src/main/java/com/ts3client/config/Settings.java b/ts3-client/core/src/main/java/com/ts3client/config/Settings.java index 45a8dbc..6399d26 100644 --- a/ts3-client/core/src/main/java/com/ts3client/config/Settings.java +++ b/ts3-client/core/src/main/java/com/ts3client/config/Settings.java @@ -138,6 +138,8 @@ public final class Settings { public boolean typingAttenuation = true; /** Automatic gain control: normalise microphone loudness to a target level. */ public boolean agc = true; + /** Beep when speech is picked up while the microphone is muted. */ + public boolean mutedTalkWarning = true; // ---- notification sounds ---- /** Directory name of the active sound pack; empty picks the first one found. */ @@ -258,6 +260,7 @@ public final class Settings { denoise = parseB(props.getProperty("denoise"), denoise); denoiserLevel = parseD(props.getProperty("denoiserLevel"), denoiserLevel); typingAttenuation = parseB(props.getProperty("typingAttenuation"), typingAttenuation); + mutedTalkWarning = parseB(props.getProperty("mutedTalkWarning"), mutedTalkWarning); agc = parseB(props.getProperty("agc"), agc); soundPack = props.getProperty("soundPack", soundPack); soundVolume = parseD(props.getProperty("soundVolume"), soundVolume); @@ -307,6 +310,7 @@ public final class Settings { props.setProperty("denoise", Boolean.toString(denoise)); props.setProperty("denoiserLevel", Double.toString(denoiserLevel)); props.setProperty("typingAttenuation", Boolean.toString(typingAttenuation)); + props.setProperty("mutedTalkWarning", Boolean.toString(mutedTalkWarning)); props.setProperty("agc", Boolean.toString(agc)); props.setProperty("soundPack", soundPack); props.setProperty("soundVolume", Double.toString(soundVolume)); diff --git a/ts3-client/core/src/main/java/com/ts3client/net/TeamspeakConnection.java b/ts3-client/core/src/main/java/com/ts3client/net/TeamspeakConnection.java index e682ea7..a3054a5 100644 --- a/ts3-client/core/src/main/java/com/ts3client/net/TeamspeakConnection.java +++ b/ts3-client/core/src/main/java/com/ts3client/net/TeamspeakConnection.java @@ -543,6 +543,7 @@ public final class TeamspeakConnection implements TS3Listener { /** Reminds the user, at most every few seconds, that the microphone is muted. */ private void onTalkingWhileMuted() { + if (!settings.mutedTalkWarning) return; long now = System.nanoTime(); if (now - lastMutedTalkNanos < MUTED_TALK_COOLDOWN_NANOS) return; lastMutedTalkNanos = now; diff --git a/ts3-client/swing/src/main/java/com/ts3client/ui/DevicesPanel.java b/ts3-client/swing/src/main/java/com/ts3client/ui/DevicesPanel.java index 9b87b67..c72f803 100644 --- a/ts3-client/swing/src/main/java/com/ts3client/ui/DevicesPanel.java +++ b/ts3-client/swing/src/main/java/com/ts3client/ui/DevicesPanel.java @@ -32,6 +32,7 @@ final class DevicesPanel extends FormPanel { private final JSlider denoiseLevel; private final JCheckBox typingCheck; private final JCheckBox agcCheck; + private final JCheckBox mutedWarningCheck; DevicesPanel(Settings settings, VoiceOutput livePlayback, Consumer> applyLive, @@ -124,6 +125,16 @@ final class DevicesPanel extends FormPanel { applyLive.accept(m -> m.setDenoiserLevel(denoiseLevel.getValue() / 100.0))); syncNoise.run(); + mutedWarningCheck = new JCheckBox("Beep when talking while muted", settings.mutedTalkWarning); + mutedWarningCheck.setToolTipText("Play a reminder sound when you speak into a muted microphone."); + c.gridx = 0; + c.gridy = row++; + c.gridwidth = 2; + c.insets = UIScale.scale(new Insets(14, 4, 4, 4)); + add(mutedWarningCheck, c); + c.insets = UIScale.scale(new Insets(4, 4, 4, 4)); + c.gridwidth = 1; + c.gridx = 0; c.gridy = row; c.weighty = 1; @@ -140,6 +151,7 @@ final class DevicesPanel extends FormPanel { target.denoiserLevel = denoiseLevel.getValue() / 100.0; target.typingAttenuation = typingCheck.isSelected(); target.agc = agcCheck.isSelected(); + target.mutedTalkWarning = mutedWarningCheck.isSelected(); } private static void selectOrDefault(JComboBox combo, String deviceId) {