e9b9d3c121
Proven via device telemetry: inside a WKWebView, WebKit owns the WebRTC audio unit and forces the loudspeaker; overrideOutputAudioPort(.none) is a no-op (route settles on Speaker 1.2s later), so the built-in earpiece cannot be selected. Present only what actually works on iOS: Speaker, and Bluetooth/wired headset when connected. bzApplyRoute now maps only 'speaker' to the loudspeaker override; bt/headset use the default port. Coerce any stale 'earpiece' pref to speaker on iOS. Also strips the route debug telemetry. Other platforms keep the earpiece option. build batch147. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>