diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f48fb87..5471cedd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to - 📈(frontend) downgrade unreachable external home URL from error to event - 🐛(frontend) handle 401 responses when syncing user preferences +- 🐛(frontend) harden speaker test against missing sinks and play errors ## [1.26.0] - 2026-08-12 diff --git a/src/frontend/src/components/SoundTester.tsx b/src/frontend/src/components/SoundTester.tsx index 5080a1a4..7faa0845 100644 --- a/src/frontend/src/components/SoundTester.tsx +++ b/src/frontend/src/components/SoundTester.tsx @@ -3,27 +3,30 @@ import { useEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { useMediaDeviceSelect } from '@livekit/components-react' import { reportError } from '@/features/analytics/telemetry' +import { canTestAudioOutput } from '@/features/rooms/utils/canTestAudioOutput' export const SoundTester = () => { const { t } = useTranslation('settings') const [isPlaying, setIsPlaying] = useState(false) const audioRef = useRef(null) - const { activeDeviceId } = useMediaDeviceSelect({ kind: 'audiooutput' }) + const { devices, activeDeviceId } = useMediaDeviceSelect({ + kind: 'audiooutput', + }) useEffect(() => { - const updateActiveId = async (deviceId: string) => { - try { - await audioRef?.current?.setSinkId(deviceId) - } catch (error) { - reportError( - 'device_switch_failure', - new Error(`Error setting sinkId: ${error}`) - ) + if (!canTestAudioOutput() || !activeDeviceId) return + if (!devices.some((device) => device.deviceId === activeDeviceId)) return + audioRef.current?.setSinkId(activeDeviceId).catch((error) => { + if (error instanceof DOMException && error.name === 'NotFoundError') { + return } - } - updateActiveId(activeDeviceId) - }, [activeDeviceId]) + reportError( + 'device_switch_failure', + new Error(`Error setting sinkId: ${error}`) + ) + }) + }, [devices, activeDeviceId]) // prevent pausing the sound navigator.mediaSession.setActionHandler('pause', function () {}) @@ -32,9 +35,13 @@ export const SoundTester = () => { <>