Speaker Test Guide
A reference for the desktest.net Speaker Test. Explains what the tool checks via the Web Audio API, how to read the verdict, and what to do when a workstation goes silent or plays in only one ear.
What does the Speaker Test check?
Three checks run in order against the Web Audio API. No microphone permission is requested; no audio is uploaded.
- AudioContext is available. The page calls
new AudioContext()(orwebkitAudioContexton older Safari) and reads backstate,sampleRate, andbaseLatency. State will besuspendeduntil step 3. - Output device is enumerable.
navigator.mediaDevices.enumerateDevices()filtered forkind === 'audiooutput'. Chrome and Edge return a dropdown of every OS output. Firefox and Safari return nothing, so the step passes in "limited" mode and the system default is used. - You hear the 440 Hz tone. Click Play test tone for a 1.5 second sine through both channels, then Play left only and Play right only. Two yes/no questions: did you hear it, and did you hear it in both ears.
When should I run this?
- Before a Zoom or Teams call. Confirms the OS is sending audio to the device on your head, not the monitor speakers you forgot were the default.
- Right after plugging in headphones. Windows will sometimes keep the previous device active and silently swallow the new one.
- Troubleshooting accessibility text-to-speech. If NVDA, JAWS, VoiceOver, or Narrator went quiet, the question is "which device is the OS sending sound to." This page answers that without involving the screen reader.
Reading the results
Each step shows a badge: Pending (grey), Running (yellow), Pass (green), Partial (yellow), or Fail (red). On fail or partial, the row expands with a fix block.
The verdict panel summarises in one of three shapes:
- Pass: all green. Tone confirmed in both ears.
- Partial: heard the tone, but only on one side. Diagnosis
mono-only. - Fail: a step went red. The verdict names the likely cause and the next step.
Copy Diagnostic Report copies a plain-text report to the clipboard: per-step results, sample rate, enumerated outputs with deviceId, the yes/no answers, the diagnosis, the user-agent, and a timestamp.
Common failures and fixes
The tool produces a named diagnosis for every failure. One ground rule before the list: setSinkId() only works on Chromium-based browsers (Chrome, Edge, Opera, Brave, Arc). Firefox and Safari fall back to the system default output, and that is by design, not a bug in either the browser or this page. If the dropdown lists devices but the wrong one keeps playing, you are on a non-Chromium browser; change the OS default instead.
audiocontext-unsupported: Web Audio API missing
The browser does not expose AudioContext. Almost impossible on a current desktop browser; usually a very old version, a kiosk shell, or an embedded webview that strips the API. Update to current Chrome, Firefox, Edge, or Safari, or open the page in a real browser tab instead of an embed.
audiocontext-suspended: context will not resume
By spec, an AudioContext starts suspended and only resumes on a user gesture. The Play test tone button IS that gesture: clicking it calls audioCtx.resume() before starting the oscillator. If you click Play and nothing happens, reload with Ctrl+F5.
no-output-device: enumeration returned nothing usable
No audiooutput entries came back, or the call threw. Firefox / Safari's empty list is a "limited" pass. A hard failure means the OS audio service is down.
- Windows: services.msc, restart Windows Audio and Windows Audio Endpoint Builder.
- macOS:
sudo killall coreaudiod; the service relaunches itself. - Linux: restart PipeWire (
systemctl --user restart pipewire pipewire-pulse) or PulseAudio.
no-sound: tone played but you heard nothing
The most common failure. The browser reports the oscillator ran and the analyser saw amplitude, but you answered No. In order of frequency: muted volume, wrong default device, headset cable not seated, or Bluetooth not actually connected.
- Click the speaker icon in the Windows system tray. Confirm the slider is above zero and not muted. Click the device name above the slider; pick the output you actually want (your headset, not the HDMI monitor).
- Open the Windows Volume Mixer (right-click the speaker icon). Confirm the browser is not muted independently of the system volume.
- For wired headsets, confirm the 3.5mm jack or USB cable is fully seated. A 3.5mm plug that is one click short of home contacts only the ground sleeve and produces dead silence with no error.
- For Bluetooth, check that the headset is paired AND connected. Windows lists it under Bluetooth & devices as Paired even when it is not currently connected; only Connected devices receive audio.
- In Chrome or Edge, right-click the tab and confirm Mute site is off. In Firefox the tab shows a speaker icon when muted.
- Disable audio enhancements (Dolby, Realtek effects, Loudness Equalization) if they are on. Settings, System, Sound, click the output, set Audio enhancements to Off. They have been known to produce odd artifacts on a short 440 Hz sine.
- Test another source (a video, the OS sound-settings test tone). If that fails too, the issue is OS or hardware.
mono-only: heard in only one ear
Step 3 reports Partial. Use Play left only and Play right only to identify the silent side, then work down the list.
- Broken headphone wire. Most common cause, at the strain-relief point where cable meets jack. Wiggle the cable while playing; if the dead side returns, the wire is gone. Swap headphones to confirm.
- Wrong stereo balance. Windows: Settings, Accessibility, Audio. Confirm Mono audio is OFF. Then Settings, System, Sound, click the output; both balance sliders should be at 100. macOS: System Settings, Accessibility, Audio; balance slider centered.
- Sound card or jack failure. If a known-good headset is also one-sided on the same workstation but works elsewhere, the jack or sound chip is failing. Try a USB DAC.
- Bluetooth stuck on HFP. A headset on Hands-Free Profile is mono. Disconnect and reconnect, and confirm no app is holding a microphone handle on it.
aborted: cancelled before answering
You clicked Cancel before both questions were answered. Not a hardware failure. Run again and answer both.
For IT admins
Default audio output is a per-user preference on Windows. No first-party GPO. Options for fleets:
- SoundVolumeView (NirSoft) with
/SetDefaultin a logon script. Most call centres pin Plantronics or Jabra USB headsets this way. - PowerShell with
AudioDeviceCmdletsin a scheduled task. - Intune proactive remediations comparing current default to desired device ID.
Common USB headset DSP gotchas:
- Plantronics / Poly Hub often exposes two devices per headset: the headset and a "Plantronics Hub" virtual device. Pin the right one.
- Jabra Direct hijacks the default on dock and loses it on undock. For a fixed default, uninstall it and set the device via login script.
- Realtek Audio Console can apply room correction that silences a channel. If
mono-onlydiagnoses cluster on one model, check it first.
Bluetooth: Windows occasionally loses the pairing record after sleep. Remove the device under Settings, Bluetooth & devices, then re-pair. If the headset pairs but refuses to be the default output, confirm both Headset and Hands-free services are enabled in advanced properties.
Behind the scenes
One static HTML file plus app.js. No build, no audio assets. Tone generation:
OscillatorNodewithtype = 'sine'andfrequency = 440 Hz: loud enough to confirm, low enough not to hurt.GainNodewith a 40 ms linear ramp on each end of the 1.5 second envelope. Without the ramp, the hard start/stop pops from the waveform discontinuity.StereoPannerNodefor L/R (pan = -1,+1,0).AnalyserNodereads time-domain data per frame; peak deviation from 128 drives the amplitude bar.
Output routing uses HTMLMediaElement.setSinkId(). When a non-default output is selected, the page creates a MediaStreamDestination, attaches it to a hidden <audio> element, calls setSinkId(deviceId), and pipes the oscillator graph in. Chrome and Edge route correctly; Firefox and Safari fall back to the system default. The AudioContext is closed in beforeunload so long-lived contexts do not hold the audio device handle.
Related
- Speaker Test - the diagnostic itself
- Microphone Test Guide - the input side of the call
- Webcam Test Guide - the video side of the call
- About desktest.net
- desktest.net home