Bug 1436096 - In PannerNode mochitest correct mono input and add test for stereo input. r?padenot draft
authorAlex Chronopoulos <achronop@gmail.com>
Fri, 02 Mar 2018 21:06:58 +0200
changeset 762606 9c436b3aa8377965c39e0807f5aabb1b25b2dbd3
parent 762605 7d89df751ed6f129e2ea156a8ac3fc1b50e0f540
push id101221
push userachronop@gmail.com
push dateFri, 02 Mar 2018 19:09:41 +0000
reviewerspadenot
bugs1436096
milestone60.0a1
Bug 1436096 - In PannerNode mochitest correct mono input and add test for stereo input. r?padenot MozReview-Commit-ID: KEdtm85lzlx
dom/media/webaudio/test/test_pannerNodeAtZeroDistance.html
--- a/dom/media/webaudio/test/test_pannerNodeAtZeroDistance.html
+++ b/dom/media/webaudio/test/test_pannerNodeAtZeroDistance.html
@@ -12,25 +12,25 @@
 
 var BUF_SIZE = 128;
 
 var types = [
   "equalpower",
   "HRTF"
 ]
 
-var finished = types.length;
+var finished = 2 * types.length;
 
 function finish() {
   if (!--finished) {
     SimpleTest.finish();
   }
 }
 
-function test(type) {
+function testMono(type) {
   var ac = new OfflineAudioContext(1, BUF_SIZE, 44100);
 
   // A sine to be used to fill the buffers
   function sine(t) {
     return Math.sin(440 * 2 * Math.PI * t / ac.sampleRate);
   }
 
   var monoBuffer = ac.createBuffer(1, BUF_SIZE, ac.sampleRate);
@@ -63,22 +63,85 @@ function test(type) {
   panner3.refDistance = 1;
   panner3.positionX.value = 0;
   panner3.positionY.value = 0;
   panner3.positionZ.value = 0;
   panner2.connect(panner3);
 
   panner3.connect(ac.destination);
 
+  // Use the input buffer to compare the output. According to the spec,
+  // mono input at zero distance will apply gain = cos(0.5 * Math.PI / 2)
+  // https://webaudio.github.io/web-audio-api/#Spatialzation-equal-power-panning
+  const gain = Math.cos(0.5 * Math.PI / 2);
+  for (var i = 0; i < BUF_SIZE; ++i) {
+    monoBuffer.getChannelData(0)[i] = gain * monoBuffer.getChannelData(0)[i];
+  }
+
   ac.startRendering().then(function(buffer) {
     compareBuffers(buffer, monoBuffer);
     finish();
   });
 }
 
+function testStereo(type) {
+  var ac = new OfflineAudioContext(2, BUF_SIZE, 44100);
+
+  // A sine to be used to fill the buffers
+  function sine(t) {
+    return Math.sin(440 * 2 * Math.PI * t / ac.sampleRate);
+  }
+
+  var stereoBuffer = ac.createBuffer(2, BUF_SIZE, ac.sampleRate);
+  for (var i = 0; i < BUF_SIZE; ++i) {
+    stereoBuffer.getChannelData(0)[i] = sine(i);
+    stereoBuffer.getChannelData(1)[i] = sine(i);
+  }
+
+  var stereoSource = ac.createBufferSource();
+  stereoSource.buffer = stereoBuffer;
+  stereoSource.start(0);
+
+  var panner = ac.createPanner();
+  panner.distanceModel = "linear";
+  panner.refDistance = 1;
+  panner.positionX.value = 0;
+  panner.positionY.value = 0;
+  panner.positionZ.value = 0;
+  stereoSource.connect(panner);
+
+  var panner2 = ac.createPanner();
+  panner2.distanceModel = "inverse";
+  panner2.refDistance = 1;
+  panner2.positionX.value = 0;
+  panner2.positionY.value = 0;
+  panner2.positionZ.value = 0;
+  panner.connect(panner2);
+
+  var panner3 = ac.createPanner();
+  panner3.distanceModel = "exponential";
+  panner3.refDistance = 1;
+  panner3.positionX.value = 0;
+  panner3.positionY.value = 0;
+  panner3.positionZ.value = 0;
+  panner2.connect(panner3);
+
+  panner3.connect(ac.destination);
+
+  ac.startRendering().then(function(buffer) {
+    compareBuffers(buffer, stereoBuffer);
+    finish();
+  });
+}
+
+function test(type) {
+  testMono(type);
+  testStereo(type);
+}
+
 addLoadEvent(function() {
   types.forEach(test);
 });
 
 SimpleTest.waitForExplicitFinish();
 
 </script>
 </pre>