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=1Observed
Page-realm enumerateDevices() counts:
audioinput: 3 <- micros honored
videoinput: 1 <- webcams honored
audiooutput: <- never present, 0 devices, in every launchEvidence
- 10 consecutive launches with the identical config:
audioinput/videoinputcounts spoofed correctly every launch;audiooutputabsent in all 10. - Both origins tried: on a non-secure-context origin (
http://localtest.me:<port>)navigator.mediaDevicesis 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, andaudiooutputis 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.
Source: daijro/camoufox