summaryrefslogtreecommitdiffstats
path: root/dom/media/webaudio/test/test_pannerNodeAtZeroDistance.html
diff options
context:
space:
mode:
Diffstat (limited to 'dom/media/webaudio/test/test_pannerNodeAtZeroDistance.html')
-rw-r--r--dom/media/webaudio/test/test_pannerNodeAtZeroDistance.html140
1 files changed, 140 insertions, 0 deletions
diff --git a/dom/media/webaudio/test/test_pannerNodeAtZeroDistance.html b/dom/media/webaudio/test/test_pannerNodeAtZeroDistance.html
new file mode 100644
index 0000000000..b5aff589ee
--- /dev/null
+++ b/dom/media/webaudio/test/test_pannerNodeAtZeroDistance.html
@@ -0,0 +1,140 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test PannerNode produces output even when the even when the distance is from the listener is zero</title>
+ <script src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+const BUF_SIZE = 1024;
+const sampleRate = 44100;
+var types = [
+ "equalpower",
+ "HRTF"
+]
+
+async function testMono(panningModel) {
+ var ac = new OfflineAudioContext(2, BUF_SIZE, sampleRate);
+
+ // 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);
+ for (var i = 0; i < BUF_SIZE; ++i) {
+ monoBuffer.getChannelData(0)[i] = sine(i);
+ }
+
+ var monoSource = ac.createBufferSource();
+ monoSource.buffer = monoBuffer;
+ monoSource.start(0);
+
+ var panner = new PannerNode(ac, {
+ panningModel,
+ distanceModel: "linear",
+ });
+ monoSource.connect(panner);
+
+ var panner2 = new PannerNode(ac, {
+ panningModel,
+ distanceModel: "inverse",
+ });
+ panner.connect(panner2);
+
+ var panner3 = new PannerNode(ac, {
+ panningModel,
+ distanceModel: "exponential"
+ });
+ panner2.connect(panner3);
+
+ panner3.connect(ac.destination);
+
+ const buffer = await ac.startRendering();
+
+ if (panningModel == "equalpower") {
+ // 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];
+ }
+ compareChannels(buffer.getChannelData(0), monoBuffer.getChannelData(0));
+ } else {
+ ok(!isChannelSilent(buffer.getChannelData(0)),
+ "mono panning: expect non-zero left channel");
+ }
+ // Check symmetry
+ compareChannels(buffer.getChannelData(0), buffer.getChannelData(1));
+}
+
+async function testStereo(panningModel) {
+ var ac = new OfflineAudioContext(2, BUF_SIZE, sampleRate);
+
+ // 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 = new PannerNode(ac, {
+ panningModel,
+ distanceModel: "linear",
+ });
+ stereoSource.connect(panner);
+
+ var panner2 = new PannerNode(ac, {
+ panningModel,
+ distanceModel: "inverse",
+ });
+ panner.connect(panner2);
+
+ var panner3 = new PannerNode(ac, {
+ panningModel,
+ distanceModel: "exponential",
+ });
+ panner2.connect(panner3);
+
+ panner3.connect(ac.destination);
+
+ const buffer = await ac.startRendering();
+ if (panningModel == "equalpower") {
+ compareBuffers(buffer, stereoBuffer);
+ } else {
+ ok(!isChannelSilent(buffer.getChannelData(0)),
+ "stereo panning: expect non-zero left channel");
+ // Check symmetry
+ compareChannels(buffer.getChannelData(0), buffer.getChannelData(1));
+ }
+}
+
+async function test(type) {
+ await promiseHRTFReady(sampleRate);
+ await testMono(type)
+ await testStereo(type);
+}
+
+add_task(async function() {
+ for (const panningModel of types) {
+ await test(panningModel);
+ }
+});
+
+</script>
+</pre>
+</body>
+</html>