Bug 212653

Summary: Web Audio AnalyserNode returning bad values for bluetooth headset input volume.
Product: WebKit Reporter: Jon Mudrick <the.jon.mudrick>
Component: Web AudioAssignee: Nobody <webkit-unassigned>
Status: NEW ---    
Severity: Normal CC: eric.carlson, jer.noble, webkit-bug-importer
Priority: P2 Keywords: InRadar
Version: Safari 13   
Hardware: All   
OS: All   

Description Jon Mudrick 2020-06-02 13:36:59 PDT
This issue affects iOS and macOS devices with a pre-attached set of bluetooth headphones being used as an input. First noticed with AirPods Pro and Airpods.

If I try to create an analyser from a fresh AudioContext (using audioContext.createAnalyser() with an appropriate audio input source selected), created when a bluetooth device is connected to the device, any attempts to get volume data returns numbers near 0 instead of proper values. 
I'm using code similar to the example code found here: https://developer.mozilla.org/en-US/docs/Web/API/AnalyserNode/getByteTimeDomainData 
The above link has a demo page (https://mdn.github.io/voice-change-o-matic/) which exhibits the bad behavior.

Some supporting details:
All Data functions on the AnalyserNode return bad values (getFloatFrequencyData, getByteFrequencyData, getFloatTimeDomainData, getByteTimeDomainData)
On iOS, where the only input device option from a call to enumerateDevices is just "iPhone Microphone":
- If no bluetooth headset is connected when the analyser is created, and then a bluetooth headset is subsequently connected, correct data is reported by the AnalyserNode.
- If a bluetooth headset is connected when the analyser is created, no correct data is reported by the AnalyserNode, even after the bluetooth headset is disconnected.

On macOS:
- Multiple audio inputs are available from enumerateDevices, as it can select from the built-in mic and the headset.
- If an AnalyserNode is created from the bluetooth headset, it does not report correct data, but if an AnalyserNode is created from the built-in mic, it works correctly.

I have witnessed similar behavior in chromium-based browsers on Windows, but only with AirPods, not with other types of bluetooth headphones I have handy.
Comment 1 Radar WebKit Bug Importer 2020-06-02 18:28:15 PDT
<rdar://problem/63902783>