| <!DOCTYPE html> |
| <html> |
| |
| <head> |
| <script src="../resources/js-test.js"></script> |
| <script src="resources/compatibility.js"></script> |
| <script src="resources/audio-testing.js"></script> |
| </head> |
| |
| <body> |
| <script> |
| description('AudioBufferSourceNode: test the "zero" playbackRate.'); |
| window.jsTestIsAsync = true; |
| |
| // Sample rate should be power of 128 to observe the change of AudioParam at |
| // the beginning of rendering quantum. (playbackRate is k-rate) This is the |
| // minimum sample rate in the valid sample rate range. |
| var sampleRate = 4096; |
| |
| // The render duration in seconds, and the length in samples. |
| var renderDuration = 1.0; |
| var renderLength = renderDuration * sampleRate; |
| |
| var context = new OfflineAudioContext(1, renderLength, sampleRate); |
| var audit = Audit.createTaskRunner(); |
| |
| |
| // Task: Render the actual buffer and compare with the reference. |
| audit.defineTask('synthesize-verify', function (done) { |
| var ramp = context.createBufferSource(); |
| var rampBuffer = createLinearRampBuffer(context, renderLength); |
| ramp.buffer = rampBuffer; |
| |
| ramp.connect(context.destination); |
| ramp.start(); |
| |
| // Leave the playbackRate as 1 for the first half, then change it |
| // to zero at the exact half. The zero playback rate should hold the |
| // sample value of the buffer index at the moment. (sample-and-hold) |
| ramp.playbackRate.setValueAtTime(1.0, 0.0); |
| ramp.playbackRate.setValueAtTime(0.0, renderDuration / 2); |
| |
| context.startRendering().then(function (renderedBuffer) { |
| var data = renderedBuffer.getChannelData(0); |
| var rampData = rampBuffer.getChannelData(0); |
| var half = rampData.length / 2; |
| var passed = true; |
| |
| for (var i = 1; i < rampData.length; i++) { |
| if (i < half) { |
| // Before the half position, the actual should match with the |
| // original ramp data. |
| if (data[i] !== rampData[i]) { |
| passed = false; |
| break; |
| } |
| } else { |
| // From the half position, the actual value should not change. |
| if (data[i] !== rampData[half]) { |
| passed = false; |
| break; |
| } |
| } |
| } |
| |
| if (passed) { |
| testPassed('The zero playbackRate held the sample value correctly.'); |
| } else { |
| testFailed('The zero playbackRate should hold the sample value. ' + |
| 'Expected ' + rampData[half] + ' but got ' + data[i] + ' at the index ' + |
| i + '.'); |
| } |
| }).then(done); |
| }); |
| |
| audit.defineTask('finish', function (done) { |
| finishJSTest(); |
| done(); |
| }); |
| |
| audit.runTasks( |
| 'synthesize-verify', |
| 'finish' |
| ); |
| |
| successfullyParsed = true; |
| </script> |
| </body> |
| |
| </html> |