guide

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.

Open the Speaker Test ->

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.

  1. AudioContext is available. The page calls new AudioContext() (or webkitAudioContext on older Safari) and reads back state, sampleRate, and baseLatency. State will be suspended until step 3.
  2. Output device is enumerable. navigator.mediaDevices.enumerateDevices() filtered for kind === '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.
  3. 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?

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:

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.

  1. Windows: services.msc, restart Windows Audio and Windows Audio Endpoint Builder.
  2. macOS: sudo killall coreaudiod; the service relaunches itself.
  3. 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.

  1. 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).
  2. Open the Windows Volume Mixer (right-click the speaker icon). Confirm the browser is not muted independently of the system volume.
  3. 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.
  4. 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.
  5. In Chrome or Edge, right-click the tab and confirm Mute site is off. In Firefox the tab shows a speaker icon when muted.
  6. 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.
  7. 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.

  1. 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.
  2. 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.
  3. 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.
  4. 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:

Common USB headset DSP gotchas:

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:

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.