Device Management
The Telnyx WebRTC JS SDK uses the browser’sMediaDevices API for audio device management. This guide covers selecting devices, switching mid-call, and handling permission changes.
Enumerate Devices
List available audio input and output devices:Device labels are only available after the user grants microphone permission. Before permission,
label is an empty string and deviceId is a placeholder.Request Permissions
Before you can select a specific device, the user must grant microphone access:Select a Specific Device
When placing a call
Via ICallOptions constraints
Switch Devices Mid-Call
Replace the audio track on an active PeerConnection:replaceTrack() doesn’t require renegotiation — the switch is seamless. The remote party won’t hear a gap.Speaker Output
Set the audio output device (sink) on the audio element:setSinkId() is not supported in all browsers. Safari does not support it as of 2026. Check typeof audioElement.sinkId !== 'undefined' before using.Device Change Detection
Listen for device changes (headphones plugged in, Bluetooth connected, etc.):- Headphones plugged in → switch output to headphones
- Bluetooth headset disconnected → fall back to built-in speaker
- USB microphone connected → update device list
Mute vs Device Off
Don’t confuse muting with device management:Common Issues
”Device not found” after permission grant
Cause: The device list was cached before permission was granted. Labels and real device IDs are only available aftergetUserMedia().
Fix: Re-enumerate devices after permission is granted:
Echo or feedback
Cause: Speaker output is being picked up by the microphone (especially with built-in speakers + mic on laptops). Fix:- Use echo cancellation (enabled by default in most browsers)
- Recommend headphones for long calls
- Use
call.muteAudio()when not speaking
Device disappears mid-call
Cause: Bluetooth disconnected, USB device unplugged. Fix:- Listen for
devicechangeevents - Fall back to the default device:
See Also
- Call Class —
muteAudio(),unmuteAudio() - ICallOptions —
localStreamfor custom device selection - Best Practices — Production deployment guide