121 lines
4.3 KiB
HTML
121 lines
4.3 KiB
HTML
<!doctype html>
|
|
<html>
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<title>Testing getUserMedia plugged in Web Audio</title>
|
|
<script src="../../resources/testharness.js"></script>
|
|
<script src="../../resources/testharnessreport.js"></script>
|
|
<script src="../../webrtc/routines.js"></script>
|
|
</head>
|
|
<body>
|
|
<script>
|
|
if (window.testRunner)
|
|
testRunner.setUserMediaPermission(true);
|
|
|
|
var finishTest, errorTest;
|
|
promise_test((test) => {
|
|
return navigator.mediaDevices.getUserMedia({ audio: true}).then((stream) => {
|
|
return new Promise((resolve, reject) => {
|
|
finishTest = resolve;
|
|
errorTest = reject;
|
|
var audioContext = new AudioContext();
|
|
var script = audioContext.createScriptProcessor(2048, 1, 1);
|
|
script.onaudioprocess = (event) => {
|
|
var squaredSum = 0.0;
|
|
event.inputBuffer.getChannelData(0).forEach((value) => {
|
|
squaredSum += value * value;
|
|
});
|
|
// Mock source should send some bips with sufficient energy to finish the test
|
|
if (squaredSum > 30) {
|
|
source.disconnect(script);
|
|
script.disconnect(audioContext.destination);
|
|
finishTest();
|
|
}
|
|
};
|
|
let source = audioContext.createMediaStreamSource(stream);
|
|
|
|
source.connect(script);
|
|
script.connect(audioContext.destination);
|
|
});
|
|
});
|
|
}, "Plugging in getUserMedia audio stream into Web Audio");
|
|
|
|
function waitFor(duration)
|
|
{
|
|
return new Promise(resolve => setTimeout(resolve, duration));
|
|
}
|
|
|
|
promise_test(async (test) => {
|
|
if (!window.internals)
|
|
return Promise.reject("Internals API required");
|
|
|
|
const stream = await navigator.mediaDevices.getUserMedia({ audio: {deviceId: true}});
|
|
internals.setMockAudioTrackChannelNumber(stream.getAudioTracks()[0], 1);
|
|
|
|
var audioContext = new AudioContext();
|
|
var script = audioContext.createScriptProcessor(2048, 1, 1);
|
|
let source = audioContext.createMediaStreamSource(stream);
|
|
source.connect(script);
|
|
script.connect(audioContext.destination);
|
|
|
|
await waitFor(200);
|
|
|
|
internals.setMockAudioTrackChannelNumber(stream.getAudioTracks()[0], 2);
|
|
await waitFor(200);
|
|
|
|
source.disconnect(script);
|
|
script.disconnect(audioContext.destination);
|
|
}, "Web Audio should work even if number of channels of a track increases from 1 to 2");
|
|
|
|
promise_test(async (test) => {
|
|
if (!window.internals)
|
|
return Promise.reject("Internals API required");
|
|
const stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: false });
|
|
internals.useMockAudioDestinationCocoa();
|
|
|
|
var audioContext = new AudioContext();
|
|
var analyzer = audioContext.createAnalyser();
|
|
analyzer.fftSize = 256;
|
|
let source = audioContext.createMediaStreamSource(stream);
|
|
source.connect(analyzer);
|
|
analyzer.connect(audioContext.destination);
|
|
|
|
await new Promise(resolve => setTimeout(resolve, 500));
|
|
|
|
source.disconnect(analyzer);
|
|
analyzer.disconnect(audioContext.destination);
|
|
}, "Web Audio should work with mock audio destination");
|
|
|
|
var context;
|
|
async function checkForNoise(stream, expectedHeardNoise, counter)
|
|
{
|
|
if (!counter)
|
|
counter = 1;
|
|
else if (++counter > 50)
|
|
return Promise.resolve(false);
|
|
results = await analyseAudio(stream, 100, context);
|
|
if (results.heardNoise == expectedHeardNoise)
|
|
return Promise.resolve(true);
|
|
var results = await checkForNoise(stream, expectedHeardNoise, counter);
|
|
return results;
|
|
}
|
|
|
|
promise_test(async (test) => {
|
|
context = new AudioContext();
|
|
|
|
let stream = await navigator.mediaDevices.getUserMedia({audio: { echoCancellation : true}});
|
|
assert_true(stream.getAudioTracks()[0].getSettings().echoCancellation);
|
|
assert_true(await checkForNoise(stream, false), "should not hear noise");
|
|
|
|
stream = await navigator.mediaDevices.getUserMedia({audio: { echoCancellation : false}});
|
|
assert_false(stream.getAudioTracks()[0].getSettings().echoCancellation, "settings is ok");
|
|
assert_true(await checkForNoise(stream, true), "heard noise");
|
|
|
|
context.close();
|
|
context = null;
|
|
}, "Check echo cancellation can be disabled in getUserMedia call");
|
|
|
|
</script>
|
|
</body>
|
|
</html>
|