1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
  
     | 
    
      <!doctype html>
<html>
  <head>
    <title>Test Flushing of NaN to Zero in AudioParams</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>
      let audit = Audit.createTaskRunner();
      // See
      // https://webaudio.github.io/web-audio-api/#computation-of-value.
      //
      // The computed value must replace NaN values in the output with
      // the default value of the param.
      audit.define('AudioParam NaN', async (task, should) => {
        // For testing, we only need a small number of frames; and
        // a low sample rate is perfectly fine.  Use two channels.
        // The first channel is for the AudioParam output.  The
        // second channel is for the AudioParam input.
        let context = new OfflineAudioContext(
            {numberOfChannels: 2, length: 256, sampleRate: 8192});
        let merger = new ChannelMergerNode(
            context, {numberOfInputs: context.destination.channelCount});
        merger.connect(context.destination);
        // A constant source with a huge value.
        let mod = new ConstantSourceNode(context, {offset: 1e30});
        // Gain nodes with a huge positive gain and huge negative
        // gain.  Combined with the huge offset in |mod|, the
        // output of the gain nodes are +Infinity and -Infinity.
        let gainPos = new GainNode(context, {gain: 1e30});
        let gainNeg = new GainNode(context, {gain: -1e30});
        mod.connect(gainPos);
        mod.connect(gainNeg);
        // Connect these to the second merger channel. This is a
        // sanity check that the AudioParam input really is NaN.
        gainPos.connect(merger, 0, 1);
        gainNeg.connect(merger, 0, 1);
        // Source whose AudioParam is connected to the graph
        // that produces NaN values.  Use a non-default value offset
        // just in case something is wrong we get default for some
        // other reason.
        let src = new ConstantSourceNode(context, {offset: 100});
        gainPos.connect(src.offset);
        gainNeg.connect(src.offset);
        // AudioParam output goes to channel 1 of the destination.
        src.connect(merger, 0, 0);
        // Let's go!
        mod.start();
        src.start();
        let buffer = await context.startRendering();
        let input = buffer.getChannelData(1);
        let output = buffer.getChannelData(0);
        // Have to test manually for NaN values in the input because
        // NaN fails all comparisons.
        let isNaN = true;
        for (let k = 0; k < input.length; ++k) {
          if (!Number.isNaN(input[k])) {
            isNaN = false;
            break;
          }
        }
        should(isNaN, 'AudioParam input contains only NaN').beTrue();
        // Output of the AudioParam should have all NaN values
        // replaced by the default.
        should(output, 'AudioParam output')
            .beConstantValueOf(src.offset.defaultValue);
        task.done();
      });
      audit.run();
    </script>
  </body>
</html>
 
     |