chromium/third_party/blink/web_tests/webaudio/BiquadFilter/unstable-filter-warning.html

<!doctype html>
<html>
  <head>
    <title>
      Console Warning for Unstable BiquadFilterNode
    </title>
    <script src="../../resources/testharness.js"></script>
    <script src="../../resources/testharnessreport.js"></script>
    <script src="../resources/audit.js"></script>
  </head>

  <body>
    <script>
      let audit = Audit.createTaskRunner({requireResultFile: true});

      // Fairly arbitrary sample rate.  If you change it, be sure to verify that
      // the filter does produce non-finite values before 1 sec is up.
      let sampleRate = 48000;

      audit.define(
          {label: 'test', description: 'Console warning for unstable filter'},
          (task, should) => {
            // The length depends on how fast the filter blows up.  This seems
            // to work.
            let context = new OfflineAudioContext(
                {length: sampleRate, sampleRate: sampleRate});

            // Test consists of an oscillator feeding a biquad filter whose
            // detune parameter is modulated by another oscillator.
            let src =
                new OscillatorNode(context, {type: 'sine', frequency: 80});
            let detuneMod =
                new OscillatorNode(context, {type: 'sine', frequency: 1000});
            let modGain = new GainNode(context, {gain: 3000});
            let filter = new BiquadFilterNode(context, {frequency: 200});
            // Make sure filter detune automation is a-rate!
            filter.detune.automationRate = 'a-rate';

            detuneMod.connect(modGain).connect(filter.detune);
            src.connect(filter).connect(context.destination);

            src.start();
            detuneMod.start();

            context.startRendering()
                .then(buffer => {
                  let output = buffer.getChannelData(0);

                  // This test really requires an a-rate BiquadFilter. Print a
                  // simple message so we know.
                  should(
                      filter.detune.automationRate,
                      'BiquadFilterNode.detune.automationRate')
                      .beEqualTo('a-rate');

                  // The output should have at least one non-finite value.
                  // (Don't care where or how many.)
                  let nonFiniteFound = false;
                  for (let k = 0; k < output.length; ++k) {
                    if (!isFinite(output[k])) {
                      nonFiniteFound = true;
                      break;
                    }
                  }

                  should(nonFiniteFound, 'At least one non-Finite output value')
                      .beTrue();
                })
                .then(() => task.done());
          });

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