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" />
11 <script class=
"testbody" type=
"text/javascript">
20 async function testMono(type) {
21 var ac = new OfflineAudioContext(
1, BUF_SIZE,
44100);
23 // A sine to be used to fill the buffers
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;
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
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) {
101 await testStereo(type);
104 add_task(async function() {
105 for (const panningModel of types) {
106 await test(panningModel);