<!DOCTYPE html>
<html>
  <head>
    <title>
      Test AudioBufferSourceNode premature loop stop
    </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">
      // Reasonably low sample rate for the optimum test speed.
      let sampleRate = 8192;

      let audit = Audit.createTaskRunner();

      // Task: Create a buffer with 3 regions filled with constant value of [1,
      // 2, 3]. Then set a loop range over the second region. Start the loop and
      // disable it in the middle of looping. Verify the rendered buffer has the
      // entire content including the looped region.
      audit.define('premature-loop-stop', (task, should) => {
        let regionValues = [1, 2, 3];

        // The region length is 2 * render quantum size to be able to suspend
        // the rendering at the half of the region.
        let regionLength = 256;

        // The test will repeat the second region 3 times, thus the rendered
        // audio have the length of 5 * regionLength.
        let context = new OfflineAudioContext(1, 5 * regionLength, sampleRate);

        // Create 3 constant buffers of [1, 2, 3] and concatenate them together:
        // | 1 | 2 | 3 |
        let testBuffer = context.createBuffer(1, 3 * regionLength, sampleRate);
        let testChannel = testBuffer.getChannelData(0);
        for (let i = 0; i < regionValues.length; i++) {
          let region =
              createConstantBuffer(context, regionLength, regionValues[i]);
          testChannel.set(region.getChannelData(0), regionLength * i);
          ;
        }

        let source = context.createBufferSource();
        source.connect(context.destination);

        source.buffer = testBuffer;
        source.loop = true;

        // Set loop points over the region 2.
        source.loopStart = regionLength / sampleRate;
        source.loopEnd = 2 * regionLength / sampleRate;

        source.start();

        // Disengage the loop at |3.5 * regionLength / sampleRate| which is the
        // end of 7th rendering quantum and also the half of the third iteration
        // of region #2.
        context.suspend(3.5 * regionLength / sampleRate).then(function() {
          source.loop = false;
          context.resume();
        });

        context.startRendering()
            .then(function(renderedBuffer) {
              let channel = renderedBuffer.getChannelData(0);

              // Verify if the rendered buffer has the following structure:
              // | 1 | 2 | 2 | 2 | 3 |
              let region1 = channel.subarray(0, regionLength - 1);
              let region2 =
                  channel.subarray(regionLength, 4 * regionLength - 1);
              let region3 =
                  channel.subarray(4 * regionLength, 5 * regionLength - 1);

              should(region1, 'Region #1').beConstantValueOf(1);
              should(region2, 'Region #2 (looped)').beConstantValueOf(2);
              should(region3, 'Region #3').beConstantValueOf(3);
            })
            .then(() => task.done());
      });

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