Bug 1387454 - Mochitests for non default rate on webaudio and media recorder. r?padenot draft
authorAlex Chronopoulos <achronop@gmail.com>
Tue, 03 Apr 2018 20:02:15 +0300
changeset 777841 9532c12050f8fc320891e29ad5b815fa50880ac9
parent 777840 57661adaccc2605a1775978578999f9c613b9e38
child 777842 9eef88e029aaae051e3254a850aac2237241aedc
push id105302
push userachronop@gmail.com
push dateThu, 05 Apr 2018 11:36:40 +0000
reviewerspadenot
bugs1387454
milestone61.0a1
Bug 1387454 - Mochitests for non default rate on webaudio and media recorder. r?padenot MozReview-Commit-ID: Bs7oI94WrPu
dom/media/webaudio/test/mochitest.ini
dom/media/webaudio/test/test_audioContextParams_recordNonDefaultSampleRate.html
dom/media/webaudio/test/test_audioContextParams_sampleRate.html
--- a/dom/media/webaudio/test/mochitest.ini
+++ b/dom/media/webaudio/test/mochitest.ini
@@ -25,16 +25,18 @@ support-files =
   ting-48k-1ch.ogg
   ting-48k-2ch.ogg
   ting-44.1k-1ch.wav
   ting-44.1k-2ch.wav
   ting-48k-1ch.wav
   ting-48k-2ch.wav
   sine-440-10s.opus
   webaudio.js
+  ../../tests/mochitest/mediaStreamPlayback.js
+  ../../tests/mochitest/head.js
 
 [test_analyserNode.html]
 skip-if = !asan || toolkit != android
 [test_analyserScale.html]
 skip-if = !asan || toolkit != android
 [test_analyserNodeOutput.html]
 skip-if = !asan || toolkit != android
 [test_analyserNodePassThrough.html]
@@ -216,8 +218,10 @@ skip-if = toolkit == 'android' # bug 109
 [test_stereoPanningWithGain.html]
 [test_waveDecoder.html]
 [test_waveShaper.html]
 [test_waveShaperGain.html]
 [test_waveShaperNoCurve.html]
 [test_waveShaperPassThrough.html]
 [test_waveShaperInvalidLengthCurve.html]
 [test_WebAudioMemoryReporting.html]
+[test_audioContextParams_sampleRate.html]
+[test_audioContextParams_recordNonDefaultSampleRate.html]
new file mode 100644
--- /dev/null
+++ b/dom/media/webaudio/test/test_audioContextParams_recordNonDefaultSampleRate.html
@@ -0,0 +1,48 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+  <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+
+<script class="testbody" type="text/javascript">
+function startTest() {
+  let ctx = new AudioContext({sampleRate: 32000});
+  oscillator = ctx.createOscillator();
+  let dest = ctx.createMediaStreamDestination();
+  oscillator.connect(dest);
+  oscillator.start();
+  let stream = dest.stream;
+
+  recorder = new MediaRecorder(stream);
+  recorder.ondataavailable = (e) => {
+      ok(true, 'recorder ondataavailable event');
+      if (recorder.state == 'recording') {
+        ok(e.data.size > 0, 'check blob has data');
+        recorder.stop();
+      }
+  }
+
+  recorder.onstop = () => {
+      ok(true, 'recorder stop event');
+      SimpleTest.finish();
+  }
+
+  try {
+    recorder.start(1000);
+    ok(true, 'recorder started');
+    is('recording', recorder.state, 'check record state recording');
+  } catch (e) {
+    ok(false, 'Can t record audio context');
+  }
+}
+
+startTest();
+SimpleTest.waitForExplicitFinish();
+</script>
+</pre>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/dom/media/webaudio/test/test_audioContextParams_sampleRate.html
@@ -0,0 +1,78 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+  <script type="application/javascript" src="mediaStreamPlayback.js"></script>
+</head>
+<body>
+<pre id="test">
+
+<script>
+  createHTML({
+    title: "Parallel MSG by setting AudioContextParam sample rate",
+    bug: "1387454",
+    visible: true
+  });
+
+  scriptsReady
+  .then(() => FAKE_ENABLED = false)
+  .then(() => runTestWhenReady( async () => {
+    // Test an AudioContext of specific sample rate.
+    // Verify that the oscillator produces a tone.
+    let rate1 = 500;
+    let ac1 = new AudioContext({sampleRate: 44100});
+    let dest_ac1 = ac1.createMediaStreamDestination();
+    let osc_ac1 = ac1.createOscillator();
+    osc_ac1.frequency.value = rate1;
+    osc_ac1.connect(dest_ac1);
+    osc_ac1.start(0);
+
+    let analyser = new AudioStreamAnalyser(ac1, dest_ac1.stream);
+    analyser.enableDebugCanvas();
+    await analyser.waitForAnalysisSuccess( array => {
+      const freg_50Hz   = array[analyser.binIndexForFrequency(50)];
+      const freq_rate1  = array[analyser.binIndexForFrequency(rate1)];
+      const freq_4000Hz = array[analyser.binIndexForFrequency(4000)];
+
+      info("Analysing audio frequency - low:target1:high = "
+              + freg_50Hz + ':' + freq_rate1 + ':' + freq_4000Hz);
+      return freg_50Hz < 50 && freq_rate1 > 200 && freq_4000Hz < 50;
+    })
+    osc_ac1.stop();
+
+    // Same test using a  new AudioContext of different sample rate.
+    let rate2 = 1500;
+    let ac2 = new AudioContext({sampleRate: 48000});
+    let dest_ac2 = ac2.createMediaStreamDestination();
+    let osc_ac2 = ac2.createOscillator();
+    osc_ac2.frequency.value = rate2;
+    osc_ac2.connect(dest_ac2);
+    osc_ac2.start(0);
+
+    let analyser2 = new AudioStreamAnalyser(ac2, dest_ac2.stream);
+    analyser2.enableDebugCanvas();
+    await analyser2.waitForAnalysisSuccess( array => {
+      const freg_50Hz   = array[analyser2.binIndexForFrequency(50)];
+      const freq_rate2  = array[analyser2.binIndexForFrequency(rate2)];
+      const freq_4000Hz = array[analyser2.binIndexForFrequency(4000)];
+
+      info("Analysing audio frequency - low:target2:high = "
+              + freg_50Hz + ':' + freq_rate2 + ':' + freq_4000Hz);
+      return freg_50Hz < 50 && freq_rate2 > 200 && freq_4000Hz < 50;
+    })
+    osc_ac2.stop();
+
+    // Two AudioContexts with different sample rate cannot communicate.
+    mustThrowWith("Connect nodes with different sample rate", "NotSupportedError",
+                  () => {let source_ac2 = ac2.createMediaStreamSource(dest_ac1.stream)});
+
+    // Two AudioContext with the same sample rate can communicate.
+    let ac3 = new AudioContext({sampleRate: 48000});
+    let dest_ac3 = ac3.createMediaStreamDestination();
+    let source_ac2 = ac2.createMediaStreamSource(dest_ac3.stream);
+    ok(true, "Connect nodes with the same sample rate is ok");
+  }))
+  .then(() => finish())
+</script>
+</pre>
+</body>
+</html>