Skip to content

Commit 04bc6c7

Browse files
authored
developer option to mute all audio (#3239)
1 parent 34b3b9d commit 04bc6c7

File tree

8 files changed

+45
-11
lines changed

8 files changed

+45
-11
lines changed

locales/en/app.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
"livekit_server_info": "LiveKit Server Info",
7171
"livekit_sfu": "LiveKit SFU: {{url}}",
7272
"matrix_id": "Matrix ID: {{id}}",
73+
"mute_all_audio": "Mute all audio (participants, reactions, join sounds)",
7374
"show_connection_stats": "Show connection statistics",
7475
"show_non_member_tiles": "Show tiles for non-member media",
7576
"url_params": "URL parameters",

src/room/CallEventAudioRenderer.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,15 @@ export const callEventAudioSounds = prefetchSounds({
4747

4848
export function CallEventAudioRenderer({
4949
vm,
50+
muted,
5051
}: {
5152
vm: CallViewModel;
53+
muted?: boolean;
5254
}): ReactNode {
5355
const audioEngineCtx = useAudioContext({
5456
sounds: callEventAudioSounds,
5557
latencyHint: "interactive",
58+
muted,
5659
});
5760
const audioEngineRef = useLatest(audioEngineCtx);
5861

src/room/GroupCallView.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,9 @@ import {
6262
} from "../utils/errors.ts";
6363
import { GroupCallErrorBoundary } from "./GroupCallErrorBoundary.tsx";
6464
import {
65-
useExperimentalToDeviceTransportSetting,
66-
useNewMembershipManagerSetting as useNewMembershipManagerSetting,
65+
useNewMembershipManager as useNewMembershipManagerSetting,
66+
useExperimentalToDeviceTransport as useExperimentalToDeviceTransportSetting,
67+
muteAllAudio as muteAllAudioSetting,
6768
useSetting,
6869
} from "../settings/settings";
6970
import { useTypedEventEmitter } from "../useEvents";
@@ -104,11 +105,13 @@ export const GroupCallView: FC<Props> = ({
104105
null,
105106
);
106107

108+
const [muteAllAudio] = useSetting(muteAllAudioSetting);
107109
const memberships = useMatrixRTCSessionMemberships(rtcSession);
108110
const leaveSoundContext = useLatest(
109111
useAudioContext({
110112
sounds: callEventAudioSounds,
111113
latencyHint: "interactive",
114+
muted: muteAllAudio,
112115
}),
113116
);
114117
// This should use `useEffectEvent` (only available in experimental versions)

src/room/InCallView.tsx

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,8 @@ import { ReactionsOverlay } from "./ReactionsOverlay";
9696
import { CallEventAudioRenderer } from "./CallEventAudioRenderer";
9797
import {
9898
debugTileLayout as debugTileLayoutSetting,
99-
useExperimentalToDeviceTransportSetting,
99+
useExperimentalToDeviceTransport as useExperimentalToDeviceTransportSetting,
100+
muteAllAudio as muteAllAudioSetting,
100101
useSetting,
101102
} from "../settings/settings";
102103
import { ReactionsReader } from "../reactions/ReactionsReader";
@@ -220,6 +221,8 @@ export const InCallView: FC<InCallViewProps> = ({
220221
room: livekitRoom,
221222
});
222223

224+
const [muteAllAudio] = useSetting(muteAllAudioSetting);
225+
223226
const [toDeviceEncryptionSetting] = useSetting(
224227
useExperimentalToDeviceTransportSetting,
225228
);
@@ -693,10 +696,10 @@ export const InCallView: FC<InCallViewProps> = ({
693696
</Text>
694697
)
695698
}
696-
<RoomAudioRenderer />
699+
<RoomAudioRenderer muted={muteAllAudio} />
697700
{renderContent()}
698-
<CallEventAudioRenderer vm={vm} />
699-
<ReactionsAudioRenderer vm={vm} />
701+
<CallEventAudioRenderer vm={vm} muted={muteAllAudio} />
702+
<ReactionsAudioRenderer vm={vm} muted={muteAllAudio} />
700703
<ReactionsOverlay vm={vm} />
701704
{footer}
702705
{layout.type !== "pip" && (

src/room/ReactionAudioRenderer.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,10 @@ const soundMap = Object.fromEntries([
2424

2525
export function ReactionsAudioRenderer({
2626
vm,
27+
muted,
2728
}: {
2829
vm: CallViewModel;
30+
muted?: boolean;
2931
}): ReactNode {
3032
const [shouldPlay] = useSetting(playReactionsSound);
3133
const [soundCache, setSoundCache] = useState<ReturnType<
@@ -34,6 +36,7 @@ export function ReactionsAudioRenderer({
3436
const audioEngineCtx = useAudioContext({
3537
sounds: soundCache,
3638
latencyHint: "interactive",
39+
muted,
3740
});
3841
const audioEngineRef = useLatest(audioEngineCtx);
3942

src/settings/DeveloperSettingsTab.tsx

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,9 @@ import {
1515
debugTileLayout as debugTileLayoutSetting,
1616
showNonMemberTiles as showNonMemberTilesSetting,
1717
showConnectionStats as showConnectionStatsSetting,
18-
useNewMembershipManagerSetting,
19-
useExperimentalToDeviceTransportSetting,
18+
useNewMembershipManager as useNewMembershipManagerSetting,
19+
useExperimentalToDeviceTransport as useExperimentalToDeviceTransportSetting,
20+
muteAllAudio as muteAllAudioSetting,
2021
} from "./settings";
2122
import type { MatrixClient } from "matrix-js-sdk";
2223
import type { Room as LivekitRoom } from "livekit-client";
@@ -49,6 +50,9 @@ export const DeveloperSettingsTab: FC<Props> = ({ client, livekitRoom }) => {
4950
useExperimentalToDeviceTransport,
5051
setUseExperimentalToDeviceTransport,
5152
] = useSetting(useExperimentalToDeviceTransportSetting);
53+
54+
const [muteAllAudio, setMuteAllAudio] = useSetting(muteAllAudioSetting);
55+
5256
const urlParams = useUrlParams();
5357

5458
const sfuUrl = useMemo((): URL | null => {
@@ -175,6 +179,20 @@ export const DeveloperSettingsTab: FC<Props> = ({ client, livekitRoom }) => {
175179
)}
176180
/>
177181
</FieldRow>
182+
<FieldRow>
183+
<InputField
184+
id="muteAllAudio"
185+
type="checkbox"
186+
label={t("developer_mode.mute_all_audio")}
187+
checked={muteAllAudio}
188+
onChange={useCallback(
189+
(event: ChangeEvent<HTMLInputElement>): void => {
190+
setMuteAllAudio(event.target.checked);
191+
},
192+
[setMuteAllAudio],
193+
)}
194+
/>
195+
</FieldRow>
178196
{livekitRoom ? (
179197
<>
180198
<p>

src/settings/settings.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,14 +115,16 @@ export const soundEffectVolumeSetting = new Setting<number>(
115115
0.5,
116116
);
117117

118-
export const useNewMembershipManagerSetting = new Setting<boolean>(
118+
export const useNewMembershipManager = new Setting<boolean>(
119119
"new-membership-manager",
120120
true,
121121
);
122122

123-
export const useExperimentalToDeviceTransportSetting = new Setting<boolean>(
123+
export const useExperimentalToDeviceTransport = new Setting<boolean>(
124124
"experimental-to-device-transport",
125125
true,
126126
);
127127

128+
export const muteAllAudio = new Setting<boolean>("mute-all-audio", false);
129+
128130
export const alwaysShowSelf = new Setting<boolean>("always-show-self", true);

src/useAudioContext.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ interface Props<S extends string> {
4747
*/
4848
sounds: PrefetchedSounds<S> | null;
4949
latencyHint: AudioContextLatencyCategory;
50+
muted?: boolean;
5051
}
5152

5253
interface UseAudioContext<S> {
@@ -112,7 +113,7 @@ export function useAudioContext<S extends string>(
112113
}, [audioContext, devices]);
113114

114115
// Don't return a function until we're ready.
115-
if (!audioContext || !audioBuffers) {
116+
if (!audioContext || !audioBuffers || props.muted) {
116117
return null;
117118
}
118119
return {

0 commit comments

Comments
 (0)