Bug 1882685 remove default value assignments to panner refDistance and position r...
[gecko.git] / dom / media / webaudio / test / test_pannerNodeAtZeroDistance.html
blobc84e2e920f0e4195238f2de95d215d568d878d2a
1 <!DOCTYPE HTML>
2 <html>
3 <head>
4 <title>Test PannerNode produces output even when the even when the distance is from the listener is zero</title>
5 <script src="/tests/SimpleTest/SimpleTest.js"></script>
6 <script type="text/javascript" src="webaudio.js"></script>
7 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
8 </head>
9 <body>
10 <pre id="test">
11 <script class="testbody" type="text/javascript">
13 var BUF_SIZE = 128;
15 var types = [
16 "equalpower",
17 "HRTF"
20 async function testMono(type) {
21 var ac = new OfflineAudioContext(1, BUF_SIZE, 44100);
23 // A sine to be used to fill the buffers
24 function sine(t) {
25 return Math.sin(440 * 2 * Math.PI * t / ac.sampleRate);
28 var monoBuffer = ac.createBuffer(1, BUF_SIZE, ac.sampleRate);
29 for (var i = 0; i < BUF_SIZE; ++i) {
30 monoBuffer.getChannelData(0)[i] = sine(i);
33 var monoSource = ac.createBufferSource();
34 monoSource.buffer = monoBuffer;
35 monoSource.start(0);
37 var panner = ac.createPanner();
38 panner.distanceModel = "linear";
39 monoSource.connect(panner);
41 var panner2 = ac.createPanner();
42 panner2.distanceModel = "inverse";
43 panner.connect(panner2);
45 var panner3 = ac.createPanner();
46 panner3.distanceModel = "exponential";
47 panner2.connect(panner3);
49 panner3.connect(ac.destination);
51 // Use the input buffer to compare the output. According to the spec,
52 // mono input at zero distance will apply gain = cos(0.5 * Math.PI / 2)
53 // https://webaudio.github.io/web-audio-api/#Spatialzation-equal-power-panning
54 const gain = Math.cos(0.5 * Math.PI / 2);
55 for (var i = 0; i < BUF_SIZE; ++i) {
56 monoBuffer.getChannelData(0)[i] = gain * monoBuffer.getChannelData(0)[i];
59 const buffer = await ac.startRendering();
60 compareBuffers(buffer, monoBuffer);
63 async function testStereo(type) {
64 var ac = new OfflineAudioContext(2, BUF_SIZE, 44100);
66 // A sine to be used to fill the buffers
67 function sine(t) {
68 return Math.sin(440 * 2 * Math.PI * t / ac.sampleRate);
71 var stereoBuffer = ac.createBuffer(2, BUF_SIZE, ac.sampleRate);
72 for (var i = 0; i < BUF_SIZE; ++i) {
73 stereoBuffer.getChannelData(0)[i] = sine(i);
74 stereoBuffer.getChannelData(1)[i] = sine(i);
77 var stereoSource = ac.createBufferSource();
78 stereoSource.buffer = stereoBuffer;
79 stereoSource.start(0);
81 var panner = ac.createPanner();
82 panner.distanceModel = "linear";
83 stereoSource.connect(panner);
85 var panner2 = ac.createPanner();
86 panner2.distanceModel = "inverse";
87 panner.connect(panner2);
89 var panner3 = ac.createPanner();
90 panner3.distanceModel = "exponential";
91 panner2.connect(panner3);
93 panner3.connect(ac.destination);
95 const buffer = await ac.startRendering();
96 compareBuffers(buffer, stereoBuffer);
99 async function test(type) {
100 await testMono(type)
101 await testStereo(type);
104 add_task(async function() {
105 for (const panningModel of types) {
106 await test(panningModel);
110 </script>
111 </pre>
112 </body>
113 </html>