<!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>
