<!DOCTYPE html>
<html>
  <head>
    <title>
      audiochannelmerger-disconnect.html
    </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 renderQuantum = 128;

      let numberOfChannels = 2;
      let sampleRate = 44100;
      let renderDuration = 0.5;
      let disconnectTime = 0.5 * renderDuration;

      let audit = Audit.createTaskRunner();

      // Task: Check if the merger outputs a silent channel when an input is
      // disconnected.
      audit.define('silent-disconnect', (task, should) => {
        let context = new OfflineAudioContext(
            numberOfChannels, renderDuration * sampleRate, sampleRate);
        let merger = context.createChannelMerger();
        let source1 = context.createBufferSource();
        let source2 = context.createBufferSource();

        // Create and assign a constant buffer.
        let bufferDCOffset = createConstantBuffer(context, 1, 1);
        source1.buffer = source2.buffer = bufferDCOffset;
        source1.loop = source2.loop = true;

        // Connect the output of source into the 4th input of merger. The merger
        // should produce 6 channel output.
        source1.connect(merger, 0, 0);
        source2.connect(merger, 0, 1);
        merger.connect(context.destination);
        source1.start();
        source2.start();

        // Schedule the disconnection of |source2| at the half of render
        // duration.
        context.suspend(disconnectTime).then(function() {
          source2.disconnect();
          context.resume();
        });

        context.startRendering()
            .then(function(buffer) {
              // The entire first channel of the output should be 1.
              should(buffer.getChannelData(0), 'Channel #0')
                  .beConstantValueOf(1);

              // Calculate the first zero index in the second channel.
              let channel1 = buffer.getChannelData(1);
              let disconnectIndex = disconnectTime * sampleRate;
              disconnectIndex -= (disconnectIndex) % renderQuantum;
              let firstZeroIndex = channel1.findIndex(function(element, index) {
                if (element === 0)
                  return index;
              });

              // The second channel should contain 1, and 0 after the
              // disconnection.
              should(channel1, 'Channel #1').containValues([1, 0]);
              should(
                  firstZeroIndex, 'The index of first zero in the channel #1')
                  .beEqualTo(disconnectIndex);

            })
            .then(() => task.done());
      });

      audit.run();
    </script>
  </body>
</html>
