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