49 lines
2.1 KiB
HTML
49 lines
2.1 KiB
HTML
<!doctype html>
|
|
<head>
|
|
<title>Test HTMLMediaElement.setSinkId() with MediaElementAudioSourceNode</title>
|
|
<link rel="help" href="https://webaudio.github.io/web-audio-api/#MediaElementAudioSourceNode">
|
|
</head>
|
|
<script src=/resources/testharness.js></script>
|
|
<script src=/resources/testharnessreport.js></script>
|
|
<script src=/resources/testdriver.js></script>
|
|
<script src=/resources/testdriver-vendor.js></script>
|
|
<script>
|
|
"use strict";
|
|
/*
|
|
MediaElementAudioSourceNode silences HTMLMediaElement output to underlying
|
|
devices but setSinkId() should still function as if there were no
|
|
MediaElementAudioSourceNode according to
|
|
"The HTMLMediaElement MUST behave in an identical fashion after the
|
|
MediaElementAudioSourceNode has been created, except that the rendered audio
|
|
will no longer be heard directly, but instead will be heard as a consequence
|
|
of the MediaElementAudioSourceNode being connected through the routing graph."
|
|
*/
|
|
|
|
let audio;
|
|
promise_setup(async () => {
|
|
audio = new Audio();
|
|
audio.src = "/media/sound_5.oga";
|
|
audio.autoplay = true;
|
|
audio.loop = true;
|
|
new AudioContext().createMediaElementSource(audio);
|
|
await new Promise(r => audio.onplay = r);
|
|
});
|
|
|
|
promise_test(t => audio.setSinkId(""), "setSinkId on default audio output should always work");
|
|
|
|
promise_test(t => promise_rejects_dom(t, "NotFoundError", audio.setSinkId("nonexistent_device_id")),
|
|
"setSinkId fails with NotFoundError on made up deviceid");
|
|
|
|
promise_test(async t => {
|
|
await test_driver.bless('transient activation for selectAudioOutput()');
|
|
const {deviceId} = await navigator.mediaDevices.selectAudioOutput();
|
|
assert_greater_than(deviceId.length, 0, "deviceId.length");
|
|
const p1 = audio.setSinkId(deviceId);
|
|
assert_equals(audio.sinkId, "", "before it resolves, setSinkId is unchanged");
|
|
await p1;
|
|
assert_equals(audio.sinkId, deviceId, "setSinkId updates sinkId to the requested deviceId");
|
|
await audio.setSinkId("");
|
|
assert_equals(audio.sinkId, "", "resetting sink ID to default audio output should always work");
|
|
}, "setSinkId() with output device ID exposed by selectAudioOutput() should resolve");
|
|
|
|
</script>
|