#768·camoufox

mediaDevices:speakers never honored — enumerateDevices() returns zero audiooutput devices

Author: KNawmCreated Sep 11, 2026Updated Sep 11, 2026

Summary

The mediaDevices:speakers config key is never honored: with speaker spoofing configured, navigator.mediaDevices.enumerateDevices() returns zero audiooutput devices, while the sibling input keys (mediaDevices:micros, mediaDevices:webcams) spoof their counts correctly.

Environment

  • Camoufox 152.0.4-beta.30 (official fetched binary), macOS arm64 host
  • Config delivered at launch via the chunked env mechanism the Python launcher consumes

Config keys delivered

mediaDevices:enabled=true
mediaDevices:micros=3
mediaDevices:webcams=1
mediaDevices:speakers=1

Observed

Page-realm enumerateDevices() counts:

audioinput: 3   <- micros honored
videoinput: 1   <- webcams honored
audiooutput:    <- never present, 0 devices, in every launch

Evidence

  • 10 consecutive launches with the identical config: audioinput/videoinput counts spoofed correctly every launch; audiooutput absent in all 10.
  • Both origins tried: on a non-secure-context origin (http://localtest.me:<port>) navigator.mediaDevices is structurally undefined (expected — it is a [SecureContext] API); on the loopback secure-context origin (http://127.0.0.1:<port>/) the API is present, the input counts are spoofed, and audiooutput is still absent everywhere.
  • No other config/pref surface for the speaker count is documented beyond mediaDevices:speakers.

Expected

mediaDevices:speakers=N should surface N audiooutput devices through enumerateDevices(), mirroring how micros/webcams drive audioinput/videoinput. The output-device enumeration (count and labels, plus setSinkId() behavior) is an active fingerprinting surface, so the input keys working while the output key silently no-ops leaves a detectable asymmetry.