зеркало из https://github.com/mozilla/gecko-dev.git
118 строки
4.2 KiB
HTML
118 строки
4.2 KiB
HTML
<!DOCTYPE HTML>
|
|
<html>
|
|
<head>
|
|
<script type="application/javascript" src="mediaStreamPlayback.js"></script>
|
|
<script type="application/javascript" src="head.js"></script>
|
|
</head>
|
|
<body>
|
|
<pre id="test">
|
|
<script>
|
|
|
|
createHTML({
|
|
bug: "1259788",
|
|
title: "Test CaptureStream audio content on HTMLMediaElement playing a gUM MediaStream",
|
|
visible: true
|
|
});
|
|
|
|
var audioContext;
|
|
var gUMAudioElement;
|
|
var analyser;
|
|
runTest(() => getUserMedia({audio: true})
|
|
.then(stream => {
|
|
gUMAudioElement = createMediaElement("audio", "gUMAudio");
|
|
gUMAudioElement.srcObject = stream;
|
|
|
|
audioContext = new AudioContext();
|
|
info("Capturing");
|
|
|
|
analyser = new AudioStreamAnalyser(audioContext,
|
|
gUMAudioElement.mozCaptureStream());
|
|
analyser.enableDebugCanvas();
|
|
return analyser.waitForAnalysisSuccess(array =>
|
|
array[analyser.binIndexForFrequency(50)] < 50 &&
|
|
array[analyser.binIndexForFrequency(TEST_AUDIO_FREQ)] > 200 &&
|
|
array[analyser.binIndexForFrequency(2500)] < 50);
|
|
})
|
|
.then(() => {
|
|
info("Audio flowing. Pausing.");
|
|
gUMAudioElement.pause();
|
|
|
|
return analyser.waitForAnalysisSuccess(array =>
|
|
array[analyser.binIndexForFrequency(50)] < 50 &&
|
|
array[analyser.binIndexForFrequency(TEST_AUDIO_FREQ)] < 50 &&
|
|
array[analyser.binIndexForFrequency(2500)] < 50);
|
|
})
|
|
.then(() => {
|
|
info("Audio stopped flowing. Playing.");
|
|
gUMAudioElement.play();
|
|
|
|
return analyser.waitForAnalysisSuccess(array =>
|
|
array[analyser.binIndexForFrequency(50)] < 50 &&
|
|
array[analyser.binIndexForFrequency(TEST_AUDIO_FREQ)] > 200 &&
|
|
array[analyser.binIndexForFrequency(2500)] < 50);
|
|
})
|
|
.then(() => {
|
|
info("Audio flowing. Removing source.");
|
|
var stream = gUMAudioElement.srcObject;
|
|
gUMAudioElement.srcObject = null;
|
|
|
|
return analyser.waitForAnalysisSuccess(array =>
|
|
array[analyser.binIndexForFrequency(50)] < 50 &&
|
|
array[analyser.binIndexForFrequency(TEST_AUDIO_FREQ)] < 50 &&
|
|
array[analyser.binIndexForFrequency(2500)] < 50)
|
|
.then(() => stream);
|
|
})
|
|
.then(stream => {
|
|
info("Audio stopped flowing. Setting source.");
|
|
gUMAudioElement.srcObject = stream;
|
|
|
|
return analyser.waitForAnalysisSuccess(array =>
|
|
array[analyser.binIndexForFrequency(50)] < 50 &&
|
|
array[analyser.binIndexForFrequency(TEST_AUDIO_FREQ)] > 200 &&
|
|
array[analyser.binIndexForFrequency(2500)] < 50);
|
|
})
|
|
.then(() => {
|
|
info("Audio flowing from new source. Adding a track.");
|
|
let oscillator = audioContext.createOscillator();
|
|
oscillator.type = 'sine';
|
|
oscillator.frequency.value = 2000;
|
|
oscillator.start();
|
|
|
|
let oscOut = audioContext.createMediaStreamDestination();
|
|
oscillator.connect(oscOut);
|
|
|
|
gUMAudioElement.srcObject.addTrack(oscOut.stream.getTracks()[0]);
|
|
|
|
return analyser.waitForAnalysisSuccess(array =>
|
|
array[analyser.binIndexForFrequency(50)] < 50 &&
|
|
array[analyser.binIndexForFrequency(TEST_AUDIO_FREQ)] > 200 &&
|
|
array[analyser.binIndexForFrequency(1500)] < 50 &&
|
|
array[analyser.binIndexForFrequency(2000)] > 200 &&
|
|
array[analyser.binIndexForFrequency(2500)] < 50);
|
|
})
|
|
.then(() => {
|
|
info("Audio flowing from new track. Removing a track.");
|
|
|
|
const gUMTrack = gUMAudioElement.srcObject.getTracks()[0];
|
|
gUMAudioElement.srcObject.removeTrack(gUMTrack);
|
|
|
|
is(gUMAudioElement.srcObject.getTracks().length, 1,
|
|
"A track should have been removed");
|
|
|
|
return analyser.waitForAnalysisSuccess(array =>
|
|
array[analyser.binIndexForFrequency(50)] < 50 &&
|
|
array[analyser.binIndexForFrequency(TEST_AUDIO_FREQ)] < 50 &&
|
|
array[analyser.binIndexForFrequency(1500)] < 50 &&
|
|
array[analyser.binIndexForFrequency(2000)] > 200 &&
|
|
array[analyser.binIndexForFrequency(2500)] < 50)
|
|
.then(() => [gUMTrack, ...gUMAudioElement.srcObject.getTracks()]
|
|
.forEach(t => t.stop()));
|
|
})
|
|
.then(() => ok(true, "Test passed."))
|
|
.catch(e => ok(false, "Test failed: " + e + (e.stack ? "\n" + e.stack : ""))));
|
|
|
|
</script>
|
|
</pre>
|
|
</body>
|
|
</html>
|