| 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 |