| <!DOCTYPE html> |
| <html> |
| <head> |
| <title> |
| Test DelayNode when maxDelayTime requires rounding |
| </title> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src="/webaudio/resources/audit-util.js"></script> |
| <script src="/webaudio/resources/audit.js"></script> |
| </head> |
| <body> |
| <script id="layout-test-code"> |
| let sampleRate = 44100; |
| let inputLengthSeconds = 1; |
| let renderLengthSeconds = 2; |
| |
| // Delay for one second plus 0.4 of a sample frame, to test that |
| // DelayNode is properly rounding up when calculating its buffer |
| // size (crbug.com/1065110). |
| let delayTimeSeconds = 1 + 0.4 / sampleRate; |
| |
| let audit = Audit.createTaskRunner(); |
| |
| audit.define( |
| { |
| label: 'maxdelay-rounding', |
| description: 'Test DelayNode when maxDelayTime requires rounding', |
| }, |
| (task, should) => { |
| let context = new OfflineAudioContext({ |
| numberOfChannels: 1, |
| length: sampleRate * renderLengthSeconds, |
| sampleRate: sampleRate, |
| }); |
| |
| // Create a constant source to use as input. |
| let src = new ConstantSourceNode(context); |
| |
| // Create a DelayNode to delay for delayTimeSeconds. |
| let delay = new DelayNode(context, { |
| maxDelayTime: delayTimeSeconds, |
| delayTime: delayTimeSeconds, |
| }); |
| |
| src.connect(delay).connect(context.destination); |
| |
| src.start(); |
| context.startRendering() |
| .then(renderedBuffer => { |
| let renderedData = renderedBuffer.getChannelData(0); |
| |
| // The first delayTimeSeconds of output should be silent. |
| let expectedSilentFrames = Math.floor( |
| delayTimeSeconds * sampleRate); |
| |
| should( |
| renderedData.slice(0, expectedSilentFrames), |
| `output[0:${expectedSilentFrames - 1}]`) |
| .beConstantValueOf(0); |
| |
| // The rest should be non-silent: that is, there should |
| // be at least one non-zero sample. (Any reasonable |
| // interpolation algorithm will make all these samples |
| // non-zero, but I don't think that's guaranteed by the |
| // spec, so we use a conservative test for now.) |
| should( |
| renderedData.slice(expectedSilentFrames), |
| `output[${expectedSilentFrames}:]`) |
| .notBeConstantValueOf(0); |
| }) |
| .then(() => task.done()); |
| }); |
| |
| audit.run(); |
| </script> |
| </body> |
| </html> |