OLD | NEW |
| (Empty) |
1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> | |
2 <html> | |
3 <head> | |
4 <script src="../resources/js-test.js"></script> | |
5 <script src="resources/compatibility.js"></script> | |
6 </head> | |
7 | |
8 <body> | |
9 <div id="description"></div> | |
10 <div id="console"></div> | |
11 | |
12 <script> | |
13 description("Test WaveShaperNode including values outside the range of [-1
,1]"); | |
14 | |
15 var context; | |
16 var bufferData; | |
17 var outputData; | |
18 var reference; | |
19 | |
20 var sampleRate = 48000; | |
21 // Must be odd so we have an exact middle point. | |
22 var testFrames = 23; | |
23 var scale = 1 / ((testFrames - 1) / 2 - 1); | |
24 // Number of decimal digits to print | |
25 var decimals = 6; | |
26 // Required accuracy | |
27 var diffThreshold = Math.pow(10, -decimals); | |
28 | |
29 // Generate reference data | |
30 function generateReference() { | |
31 // The curve data is 0, 1, 0, and the input data is a ramp from -1+eps t
o 1+eps. Then the | |
32 // output is a ramp from 0 to 1 back to 0. | |
33 var ref = new Float32Array(testFrames); | |
34 var midPoint = (testFrames - 1) / 2; | |
35 // First sample is below -1 at -1-scale. | |
36 ref[0] = 0; | |
37 // Generate ramp up to the mid-point | |
38 for (var k = 0; k < midPoint; ++k) { | |
39 ref[k + 1] = k * scale; | |
40 } | |
41 // The value at the mid-point must be 1, from the curve | |
42 ref[midPoint] = 1; | |
43 // Generate a ramp from 1 down to 0 | |
44 for (var k = midPoint; k < testFrames - 1; ++k) { | |
45 ref[k + 1] = 2 - k * scale; | |
46 } | |
47 // The last sample is out of range at 1+scale | |
48 ref[testFrames - 1] = 0; | |
49 return ref; | |
50 } | |
51 | |
52 function checkResult (event) { | |
53 outputData = event.renderedBuffer.getChannelData(0); | |
54 reference = generateReference(); | |
55 var success = true; | |
56 // Verify that every output value matches our expected reference value. | |
57 for (var k = 0; k < outputData.length; ++k) { | |
58 var diff = outputData[k] - reference[k]; | |
59 if (Math.abs(diff) <= diffThreshold) { | |
60 testPassed(bufferData[k].toFixed(decimals) + " -> " + outputData[k
].toFixed(decimals) + "."); | |
61 } else { | |
62 testFailed(bufferData[k].toFixed(decimals) + " -> " + outputData[k
].toFixed(decimals) + ", but expected " + reference[k].toFixed(decimals) + "."); | |
63 success = false; | |
64 } | |
65 } | |
66 | |
67 if (success) | |
68 testPassed("All outputs matched expected results."); | |
69 else | |
70 testFailed("Some outputs did not match expected results."); | |
71 | |
72 finishJSTest(); | |
73 } | |
74 | |
75 function runTest () { | |
76 if (window.testRunner) { | |
77 testRunner.dumpAsText(); | |
78 testRunner.waitUntilDone(); | |
79 } | |
80 | |
81 window.jsTestIsAsync = true; | |
82 | |
83 context = new OfflineAudioContext(1, testFrames, sampleRate); | |
84 // Create input values between -1.1 and 1.1 | |
85 var buffer = context.createBuffer(1, testFrames, context.sampleRate); | |
86 bufferData = buffer.getChannelData(0); | |
87 var start = -1 - scale; | |
88 for (var k = 0; k < testFrames; ++k) { | |
89 bufferData[k] = k * scale + start; | |
90 } | |
91 | |
92 var source = context.createBufferSource(); | |
93 source.buffer = buffer; | |
94 | |
95 // Create simple waveshaper. It should map -1 to 0, 0 to 1, and +1 to 0
and interpolate | |
96 // all points in between using a simple linear interpolator. | |
97 var shaper = context.createWaveShaper(); | |
98 var curve = new Float32Array(3); | |
99 curve[0] = 0; | |
100 curve[1] = 1; | |
101 curve[2] = 0; | |
102 shaper.curve = curve; | |
103 source.connect(shaper); | |
104 shaper.connect(context.destination); | |
105 | |
106 source.start(); | |
107 context.oncomplete = checkResult; | |
108 context.startRendering(); | |
109 } | |
110 | |
111 runTest(); | |
112 successfullyParsed = true; | |
113 </script> | |
114 </body> | |
115 </html> | |
OLD | NEW |