files/en-us/web/api/audio_output_devices_api/index.md
{{DefaultAPISidebar("Audio Output Devices API")}}{{securecontext_header}}{{SeeCompatTable}}
The Audio Output Devices API allows web applications to prompt users about what output device should be used for audio playback.
Operating systems commonly allow users to specify that audio should be played from speakers, a Bluetooth headset, or some other audio output device. This API allows applications to provide this same functionality from within a web page.
Even if allowed by a permission policy, access to a particular audio output device still requires explicit user permission, as the user may be in a location where playing audio through some output devices is not appropriate.
The API provides the {{domxref("MediaDevices.selectAudioOutput()")}} method that allows users to select their desired audio output from those that are allowed by the speaker-selection directive of the {{httpheader("Permissions-Policy")}} HTTP header for the document.
The selected device then has user permission, allowing it to be enumerated with {{domxref("MediaDevices.enumerateDevices()")}} and set as the audio output device using {{domxref("HTMLMediaElement.setSinkId()")}}.
Audio devices may arbitrarily connect and disconnect.
Applications that wish to react to this kind of change can listen to the {{domxref("MediaDevices/devicechange_event", "devicechange")}} event and use {{domxref("MediaDevices.enumerateDevices", "enumerateDevices()")}} to determine if sinkId is present in the returned devices.
This might trigger, for example, pausing or unpausing playback.
The Audio Output Devices API extends the following APIs, adding the listed features:
Access to the API is subject to the following constraints:
All methods and properties may only be called in a secure context.
{{domxref("MediaDevices.selectAudioOutput()")}} grants user permission for a selected device to be used as the audio output sink:
speaker-selection HTTP Permission Policy.{{domxref("HTMLMediaElement.setSinkId()")}} sets a permitted ID as the audio output:
speaker-selection HTTP Permission Policy.MediaDevices.selectAudioOutput()Here's an example of using selectAudioOutput(), within a function that is triggered by a button click, and then setting the selected device as the audio output.
The code first checks if selectAudioOutput() is supported, and if it is, uses it to select an output and return a device ID.
We then play some audio using the default output, and then call setSinkId() in order to switch to the selected output device.
document.querySelector("#myButton").addEventListener("click", async () => {
if (!navigator.mediaDevices.selectAudioOutput) {
console.log("selectAudioOutput() not supported or not in secure context.");
return;
}
// Display prompt to select device
const audioDevice = await navigator.mediaDevices.selectAudioOutput();
// Create an audio element and start playing audio on the default device
const audio = document.createElement("audio");
audio.src = "https://example.com/audio.mp3";
audio.play();
// Change the sink to the selected audio output device.
audio.setSinkId(audioDevice.deviceId);
});
Note that if you log the output details, they might look something like this:
console.log(
`${audioDevice.kind}: ${audioDevice.label} id = ${audioDevice.deviceId}`,
);
// audiooutput: Realtek Digital Output (Realtek(R) Audio) id = 0wE6fURSZ20H0N2NbxqgowQJLWbwo+5ablCVVJwRM3k=
{{Specifications}}
{{Compat}}