summaryrefslogtreecommitdiffstats
path: root/dom/media/webrtc/tests/mochitests/test_getUserMedia_audioCapture.html
diff options
context:
space:
mode:
Diffstat (limited to 'dom/media/webrtc/tests/mochitests/test_getUserMedia_audioCapture.html')
-rw-r--r--dom/media/webrtc/tests/mochitests/test_getUserMedia_audioCapture.html104
1 files changed, 104 insertions, 0 deletions
diff --git a/dom/media/webrtc/tests/mochitests/test_getUserMedia_audioCapture.html b/dom/media/webrtc/tests/mochitests/test_getUserMedia_audioCapture.html
new file mode 100644
index 0000000000..2cc649a321
--- /dev/null
+++ b/dom/media/webrtc/tests/mochitests/test_getUserMedia_audioCapture.html
@@ -0,0 +1,104 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test AudioCapture </title>
+ <script type="application/javascript" src="mediaStreamPlayback.js"></script>
+</head>
+<body>
+<pre id="test">
+<script>
+
+(async () => {
+ // Get an opus file containing a sine wave at maximum amplitude, of duration
+ // `lengthSeconds`, and of frequency `frequency`.
+ async function getSineWaveFile(frequency, lengthSeconds) {
+ const off = new OfflineAudioContext(1, lengthSeconds * 48000, 48000);
+ const osc = off.createOscillator();
+ const rec = new MediaRecorder(off.destination,
+ {mimeType: "audio/ogg; codecs=opus"});
+ osc.frequency.value = frequency;
+ osc.connect(off.destination);
+ osc.start();
+ rec.start();
+ off.startRendering();
+ const {data} = await new Promise(r => rec.ondataavailable = r);
+ return data;
+ }
+
+ await createHTML({
+ bug: "1156472",
+ title: "Test AudioCapture with regular HTMLMediaElement, AudioContext, " +
+ "and HTMLMediaElement playing a MediaStream",
+ visible: true
+ });
+
+ await runTestWhenReady(async () => {
+ /**
+ * Get two HTMLMediaElements:
+ * - One playing a sine tone from a blob (of an opus file created on the fly)
+ * - One being the output for an AudioContext's OscillatorNode, connected to
+ * a MediaSourceDestinationNode.
+ *
+ * Also, use the AudioContext playing through its AudioDestinationNode another
+ * tone, using another OscillatorNode.
+ *
+ * Capture the output of the document, feed that back into the AudioContext,
+ * with an AnalyserNode, and check the frequency content to make sure we
+ * have recorded the three sources.
+ *
+ * The three sine tones have frequencies far apart from each other, so that we
+ * can check that the spectrum of the capture stream contains three
+ * components with a high magnitude.
+ */
+ const wavtone = createMediaElement("audio", "WaveTone");
+ const acTone = createMediaElement("audio", "audioContextTone");
+ const ac = new AudioContext();
+
+ const oscThroughMediaElement = ac.createOscillator();
+ oscThroughMediaElement.frequency.value = 1000;
+ const oscThroughAudioDestinationNode = ac.createOscillator();
+ oscThroughAudioDestinationNode.frequency.value = 5000;
+ const msDest = ac.createMediaStreamDestination();
+
+ oscThroughMediaElement.connect(msDest);
+ oscThroughAudioDestinationNode.connect(ac.destination);
+
+ acTone.srcObject = msDest.stream;
+
+ const blob = await getSineWaveFile(10000, 10);
+ wavtone.src = URL.createObjectURL(blob);
+ oscThroughMediaElement.start();
+ oscThroughAudioDestinationNode.start();
+ wavtone.loop = true;
+ wavtone.play();
+ acTone.play();
+
+ const constraints = {audio: {mediaSource: "audioCapture"}};
+
+ const stream = await getUserMedia(constraints);
+ try {
+ const analyser = new AudioStreamAnalyser(ac, stream);
+ analyser.enableDebugCanvas();
+ await analyser.waitForAnalysisSuccess(array => {
+ // We want to find three frequency components here, around 1000, 5000
+ // and 10000Hz. Frequency are logarithmic. Also make sure we have low
+ // energy in between, not just a flat white noise.
+ return (array[analyser.binIndexForFrequency(50)] < 50 &&
+ array[analyser.binIndexForFrequency(1000)] > 200 &&
+ array[analyser.binIndexForFrequency(2500)] < 50 &&
+ array[analyser.binIndexForFrequency(5000)] > 200 &&
+ array[analyser.binIndexForFrequency(7500)] < 50 &&
+ array[analyser.binIndexForFrequency(10000)] > 200);
+ });
+ } finally {
+ for (let t of stream.getTracks()) {
+ t.stop();
+ }
+ ac.close();
+ }
+ });
+})();
+</script>
+</pre>
+</body>
+</html>