<!DOCTYPE html>
<html>
  <head>
    <title>
      dynamicscompressor-simple.html
    </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">
      let audit = Audit.createTaskRunner();
      let context;
      let compressor;
      let sampleRate = 44100;
      let lengthInSeconds = 1;
      let renderedData;
      // This threshold experimentally determined. It depends on the the gain
      // value of the gain node below and the dynamics compressor.  When the
      // DynamicsCompressor had the pre-emphasis filters, the peak value is
      // about 0.21.  Without it, the peak is about 0.84.
      let peakThreshold = 0.83;

      function checkResult(renderedBuffer, should) {
        renderedData = renderedBuffer.getChannelData(0);
        // Search for a peak in the last part of the data.
        let startSample = sampleRate * (lengthInSeconds - .1);
        let endSample = renderedData.length;
        let k;
        let peak = -1;

        for (k = startSample; k < endSample; ++k) {
          let sample = Math.abs(renderedData[k]);
          if (peak < sample)
            peak = sample;
        }

        should(peak >= peakThreshold, 'Pre-emphasis effect not applied')
            .beTrue();

        should(compressor.reduction !== 0, 'Reduction value changed').beTrue();
      }

      audit.define(
          {
            label: 'test',
            description: 'Test pre-emphasis in DynamicsCompressor is removed'
          },
          function(task, should) {

            context = new OfflineAudioContext(
                1, sampleRate * lengthInSeconds, sampleRate);
            // Connect an oscillator to a gain node to the compressor.  The
            // oscillator frequency is set to a high value for the (original)
            // emphasis to kick in. The gain is a little extra boost to get the
            // compressor enabled.
            //
            let osc = context.createOscillator();
            osc.frequency.value = 15000;
            let gain = context.createGain();
            gain.gain.value = 1.5;
            compressor = context.createDynamicsCompressor();
            osc.connect(gain);
            gain.connect(compressor);
            compressor.connect(context.destination);
            osc.start();

            context.startRendering()
                .then(buffer => checkResult(buffer, should))
                .then(() => task.done());
            ;
          });

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