| <!DOCTYPE html> |
| <html> |
| <head> |
| <title> |
| audiobuffersource-late-start.html |
| </title> |
| <script src="../../imported/w3c/web-platform-tests/resources/testharness.js"></script> |
| <script src="../../resources/testharnessreport.js"></script> |
| <script src="../resources/audit-util.js"></script> |
| <script src="../resources/audit.js"></script> |
| </head> |
| <body> |
| <script id="layout-test-code"> |
| let renderQuantum = 128; |
| |
| let sampleRate = 44100; |
| let renderDuration = 0.25; |
| let startTime = 0.5 * renderDuration; |
| |
| let audit = Audit.createTaskRunner(); |
| |
| // Calculate the index for actual start time. |
| function getStartIndex(time) { |
| let startIndex = time * sampleRate; |
| startIndex = renderQuantum * |
| Math.floor((startIndex + renderQuantum - 1) / renderQuantum); |
| return startIndex; |
| } |
| |
| // Get the index of value change. |
| function getValueChangeIndex(array, targetValue) { |
| return array.findIndex(function(element, index) { |
| if (element === targetValue) |
| return true; |
| }); |
| } |
| |
| audit.define('test-late-start', (task, should) => { |
| let context = |
| new OfflineAudioContext(1, renderDuration * sampleRate, sampleRate); |
| let dcOffsetbuffer = createConstantBuffer(context, 1, 1.0); |
| let source = context.createBufferSource(); |
| source.buffer = dcOffsetbuffer; |
| source.loop = true; |
| source.connect(context.destination); |
| |
| // Schedule source.start(0) at 0.01 second. The specified timing of |
| // start() call is already passed in terms of the context time. So the |
| // argument |0| will be clamped to the current context time. |
| // |
| // With the sample rate of 44100, 0.01 second is 441 samples. Rounding |
| // it down to the render quantum gives 384 samples. This is clearly |
| // larger than a single render quantum. |
| // |
| // See issue: crbug.com/462167 |
| context.suspend(startTime).then(function() { |
| source.start(0); |
| context.resume(); |
| }); |
| |
| // Start rendering and verify result: this verifies if 1) the rendered |
| // buffer contains at least one non-zero value and 2) the non-zero value |
| // is found later than the first output sample. |
| context.startRendering() |
| .then(function(buffer) { |
| let channelData = buffer.getChannelData(0); |
| let startIndex = getStartIndex(startTime); |
| let nonZeroValueIndex = getValueChangeIndex(channelData, 1.0); |
| |
| should(channelData, 'The output').containValues([0, 1]); |
| should(nonZeroValueIndex, 'The index of value change') |
| .beEqualTo(startIndex); |
| |
| should( |
| nonZeroValueIndex, 'The index of the first non-zero sample') |
| .notBeEqualTo(0) |
| }) |
| .then(() => task.done()); |
| }); |
| |
| audit.run(); |
| </script> |
| </body> |
| </html> |