| <!DOCTYPE html> |
| <html> |
| <head> |
| <title> |
| Test AudioWorkletNode's dynamic channel count feature |
| </title> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src="/webaudio/resources/audit.js"></script> |
| <script src="/webaudio/resources/audit-util.js"></script> |
| </head> |
| <body> |
| <script id="layout-test-code"> |
| let audit = Audit.createTaskRunner(); |
| |
| // Arbitrary numbers used to align the test with render quantum boundary. |
| let sampleRate = RENDER_QUANTUM_FRAMES * 100; |
| let renderLength = RENDER_QUANTUM_FRAMES * 2; |
| let context; |
| |
| let filePath = 'processors/gain-processor.js'; |
| |
| let testChannelValues = [1, 2, 3]; |
| |
| // Creates a 3-channel buffer and play with BufferSourceNode. The source |
| // goes through a bypass AudioWorkletNode (gain value of 1). |
| audit.define('setup-buffer-and-worklet', (task, should) => { |
| context = new OfflineAudioContext(testChannelValues.length, |
| renderLength, |
| sampleRate); |
| |
| // Explicitly sets the destination channelCountMode and |
| // channelInterpretation to make sure the result does no mixing. |
| context.channeCountMode = 'explicit'; |
| context.channelInterpretation = 'discrete'; |
| |
| context.audioWorklet.addModule(filePath).then(() => { |
| let testBuffer = createConstantBuffer(context, 1, testChannelValues); |
| let sourceNode = new AudioBufferSourceNode(context); |
| let gainWorkletNode = new AudioWorkletNode(context, 'gain'); |
| |
| gainWorkletNode.parameters.get('gain').value = 1.0; |
| sourceNode.connect(gainWorkletNode).connect(context.destination); |
| |
| // Suspend the context at 128 sample frames and play the source with |
| // the assigned buffer. |
| context.suspend(RENDER_QUANTUM_FRAMES/sampleRate).then(() => { |
| sourceNode.buffer = testBuffer; |
| sourceNode.loop = true; |
| sourceNode.start(); |
| context.resume(); |
| }); |
| task.done(); |
| }); |
| }); |
| |
| // Verifies if the rendered buffer has all zero for the first half (before |
| // 128 samples) and the expected values for the second half. |
| audit.define('verify-rendered-buffer', (task, should) => { |
| context.startRendering().then(renderedBuffer => { |
| testChannelValues.forEach((value, index) => { |
| let channelData = renderedBuffer.getChannelData(index); |
| should(channelData.subarray(0, RENDER_QUANTUM_FRAMES), |
| 'First half of Channel #' + index) |
| .beConstantValueOf(0); |
| should(channelData.subarray(RENDER_QUANTUM_FRAMES, renderLength), |
| 'Second half of Channel #' + index) |
| .beConstantValueOf(value); |
| }); |
| task.done(); |
| }); |
| }); |
| |
| audit.run(); |
| </script> |
| </body> |
| </html> |