| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> |
| <html> |
| <head> |
| <script src="../resources/js-test.js"></script> |
| <script src="resources/compatibility.js"></script> |
| </head> |
| |
| <body> |
| <div id="description"></div> |
| <div id="console"></div> |
| |
| <script> |
| description("Test WaveShaperNode including values outside the range of [-1,1]"); |
| |
| var context; |
| var bufferData; |
| var outputData; |
| var reference; |
| |
| var sampleRate = 48000; |
| // Must be odd so we have an exact middle point. |
| var testFrames = 23; |
| var scale = 1 / ((testFrames - 1) / 2 - 1); |
| // Number of decimal digits to print |
| var decimals = 6; |
| // Required accuracy |
| var diffThreshold = Math.pow(10, -decimals); |
| |
| // Generate reference data |
| function generateReference() { |
| // The curve data is 0, 1, 0, and the input data is a ramp from -1+eps to 1+eps. Then the |
| // output is a ramp from 0 to 1 back to 0. |
| var ref = new Float32Array(testFrames); |
| var midPoint = (testFrames - 1) / 2; |
| // First sample is below -1 at -1-scale. |
| ref[0] = 0; |
| // Generate ramp up to the mid-point |
| for (var k = 0; k < midPoint; ++k) { |
| ref[k + 1] = k * scale; |
| } |
| // The value at the mid-point must be 1, from the curve |
| ref[midPoint] = 1; |
| // Generate a ramp from 1 down to 0 |
| for (var k = midPoint; k < testFrames - 1; ++k) { |
| ref[k + 1] = 2 - k * scale; |
| } |
| // The last sample is out of range at 1+scale |
| ref[testFrames - 1] = 0; |
| return ref; |
| } |
| |
| function checkResult (event) { |
| outputData = event.renderedBuffer.getChannelData(0); |
| reference = generateReference(); |
| var success = true; |
| // Verify that every output value matches our expected reference value. |
| for (var k = 0; k < outputData.length; ++k) { |
| var diff = outputData[k] - reference[k]; |
| if (Math.abs(diff) <= diffThreshold) { |
| testPassed(bufferData[k].toFixed(decimals) + " -> " + outputData[k].toFixed(decimals) + "."); |
| } else { |
| testFailed(bufferData[k].toFixed(decimals) + " -> " + outputData[k].toFixed(decimals) + ", but expected " + reference[k].toFixed(decimals) + "."); |
| success = false; |
| } |
| } |
| |
| if (success) |
| testPassed("All outputs matched expected results."); |
| else |
| testFailed("Some outputs did not match expected results."); |
| |
| finishJSTest(); |
| } |
| |
| function runTest () { |
| if (window.testRunner) { |
| testRunner.dumpAsText(); |
| testRunner.waitUntilDone(); |
| } |
| |
| window.jsTestIsAsync = true; |
| |
| context = new OfflineAudioContext(1, testFrames, sampleRate); |
| // Create input values between -1.1 and 1.1 |
| var buffer = context.createBuffer(1, testFrames, context.sampleRate); |
| bufferData = buffer.getChannelData(0); |
| var start = -1 - scale; |
| for (var k = 0; k < testFrames; ++k) { |
| bufferData[k] = k * scale + start; |
| } |
| |
| var source = context.createBufferSource(); |
| source.buffer = buffer; |
| |
| // Create simple waveshaper. It should map -1 to 0, 0 to 1, and +1 to 0 and interpolate |
| // all points in between using a simple linear interpolator. |
| var shaper = context.createWaveShaper(); |
| var curve = new Float32Array(3); |
| curve[0] = 0; |
| curve[1] = 1; |
| curve[2] = 0; |
| shaper.curve = curve; |
| source.connect(shaper); |
| shaper.connect(context.destination); |
| |
| source.start(); |
| context.oncomplete = checkResult; |
| context.startRendering(); |
| } |
| |
| runTest(); |
| successfullyParsed = true; |
| </script> |
| </body> |
| </html> |