tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

automation-rate.html (5963B)


      1 <!doctype html>
      2 <html>
      3  <head>
      4    <title>AudioParam.automationRate tests</title>
      5    <script src="/resources/testharness.js"></script>
      6    <script src="/resources/testharnessreport.js"></script>
      7  </head>
      8 
      9  <body>
     10    <script>
     11      // For each node that has an AudioParam, verify that the default
     12      // |automationRate| has the expected value and that we can change it or
     13      // throw an error if it can't be changed.
     14 
     15      // Any valid sample rate is fine; we don't actually render anything in the
     16      // tests.
     17      const sampleRate = 8000;
     18 
     19      // Array of tests.  Each test is a dictonary consisting of the name of the
     20      // node and an array specifying the AudioParam's of the node.  This array
     21      // in turn gives the name of the AudioParam, the default value for the
     22      // |automationRate|, and whether it is fixed (isFixed).
     23      const tests = [
     24        {
     25          nodeName: 'AudioBufferSourceNode',
     26          audioParams: [
     27            {name: 'detune', defaultRate: 'k-rate', isFixed: true},
     28            {name: 'playbackRate', defaultRate: 'k-rate', isFixed: true}
     29          ]
     30        },
     31        {
     32          nodeName: 'BiquadFilterNode',
     33          audioParams: [
     34            {name: 'frequency', defaultRate: 'a-rate', isFixed: false},
     35            {name: 'detune', defaultRate: 'a-rate', isFixed: false},
     36            {name: 'Q', defaultRate: 'a-rate', isFixed: false},
     37            {name: 'gain', defaultRate: 'a-rate', isFixed: false},
     38          ]
     39        },
     40        {
     41          nodeName: 'ConstantSourceNode',
     42          audioParams: [{name: 'offset', defaultRate: 'a-rate', isFixed: false}]
     43        },
     44        {
     45          nodeName: 'DelayNode',
     46          audioParams:
     47              [{name: 'delayTime', defaultRate: 'a-rate', isFixed: false}]
     48        },
     49        {
     50          nodeName: 'DynamicsCompressorNode',
     51          audioParams: [
     52            {name: 'threshold', defaultRate: 'k-rate', isFixed: true},
     53            {name: 'knee', defaultRate: 'k-rate', isFixed: true},
     54            {name: 'ratio', defaultRate: 'k-rate', isFixed: true},
     55            {name: 'attack', defaultRate: 'k-rate', isFixed: true},
     56            {name: 'release', defaultRate: 'k-rate', isFixed: true}
     57          ]
     58        },
     59        {
     60          nodeName: 'GainNode',
     61          audioParams: [{name: 'gain', defaultRate: 'a-rate', isFixed: false}]
     62        },
     63        {
     64          nodeName: 'OscillatorNode',
     65          audioParams: [
     66            {name: 'frequency', defaultRate: 'a-rate', isFixed: false},
     67            {name: 'detune', defaultRate: 'a-rate', isFixed: false}
     68          ]
     69        },
     70        {
     71          nodeName: 'PannerNode',
     72          audioParams: [
     73            {name: 'positionX', defaultRate: 'a-rate', isFixed: false},
     74            {name: 'positionY', defaultRate: 'a-rate', isFixed: false},
     75            {name: 'positionZ', defaultRate: 'a-rate', isFixed: false},
     76            {name: 'orientationX', defaultRate: 'a-rate', isFixed: false},
     77            {name: 'orientationY', defaultRate: 'a-rate', isFixed: false},
     78            {name: 'orientationZ', defaultRate: 'a-rate', isFixed: false},
     79          ]
     80        },
     81        {
     82          nodeName: 'StereoPannerNode',
     83          audioParams: [{name: 'pan', defaultRate: 'a-rate', isFixed: false}]
     84        },
     85      ];
     86 
     87       function testAudioParam(context, node, param) {
     88        const audioParam = node[param.name];
     89        const defaultRate = param.defaultRate;
     90 
     91        // Verify that the default value is correct.
     92        assert_equals(
     93          audioParam.automationRate,
     94          defaultRate,
     95          `Default ${context}.${param.name}.automationRate should be
     96              "${defaultRate}"`
     97        );
     98 
     99        // Try setting the rate to a different rate.  If the |automationRate|
    100        // is fixed, expect an error.  Otherwise, expect no error and expect
    101        // the value is changed to the new value.
    102        const newRate = defaultRate === 'a-rate' ? 'k-rate' : 'a-rate';
    103 
    104        if (param.isFixed) {
    105          assert_throws_dom(
    106            'InvalidStateError',
    107            () => {
    108              audioParam.automationRate = newRate;
    109            },
    110            `Setting ${context}.${param.name}.automationRate to
    111                "${newRate}" should throw InvalidStateError`
    112          );
    113        } else {
    114          audioParam.automationRate = newRate;
    115          assert_equals(
    116            audioParam.automationRate,
    117            newRate,
    118            `${context}.${param.name}.automationRate should change
    119                to "${newRate}"`
    120          );
    121        }
    122      }
    123 
    124      // Tests for each AudioNode type
    125      for (const { nodeName, audioParams } of tests) {
    126        test(() => {
    127          const context = new OfflineAudioContext({ length: sampleRate,
    128              sampleRate });
    129          const node = new window[nodeName](context);
    130          audioParams.forEach(param => testAudioParam(nodeName, node,
    131              param));
    132        }, `${nodeName}`);
    133      }
    134 
    135      // Special case: AudioListener tests
    136      test(() => {
    137        const context = new OfflineAudioContext({ length: sampleRate,
    138            sampleRate });
    139        const listenerParams = [
    140          { name: 'positionX', defaultRate: 'a-rate', isFixed: false },
    141          { name: 'positionY', defaultRate: 'a-rate', isFixed: false },
    142          { name: 'positionZ', defaultRate: 'a-rate', isFixed: false },
    143          { name: 'forwardX', defaultRate: 'a-rate', isFixed: false },
    144          { name: 'forwardY', defaultRate: 'a-rate', isFixed: false },
    145          { name: 'forwardZ', defaultRate: 'a-rate', isFixed: false },
    146          { name: 'upX', defaultRate: 'a-rate', isFixed: false },
    147          { name: 'upY', defaultRate: 'a-rate', isFixed: false },
    148          { name: 'upZ', defaultRate: 'a-rate', isFixed: false }
    149        ];
    150 
    151        listenerParams.forEach(param => {
    152          testAudioParam('AudioListener', context.listener, param);
    153        });
    154      }, 'AudioListener');
    155    </script>
    156  </body>
    157 </html>