tor-browser

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

audiochannelsplitter.html (3677B)


      1 <!DOCTYPE html>
      2 <html>
      3  <head>
      4    <title>
      5      Tests AudioChannelSplitter
      6    </title>
      7    <script src="/resources/testharness.js"></script>
      8    <script src="/resources/testharnessreport.js"></script>
      9    <script src="/webaudio/resources/audit-util.js"></script>
     10  </head>
     11  <body>
     12    <script>
     13 
     14      // Arbitrary power-of-two-length render so timing math is exact.
     15      const sampleRate = 44100.0;
     16      const lengthInSampleFrames = 512;
     17 
     18      // checkResult() checks that the rendered buffer is stereo and that the
     19      // left channel is all –1 and right channel all +1. In other words,
     20      // we've reversed the order of the two channels.
     21      function checkResult(buffer) {
     22        assert_equals(
     23            buffer.numberOfChannels,
     24            2,
     25            'Rendered buffer must be stereo');
     26 
     27        const left = buffer.getChannelData(0);
     28        const right = buffer.getChannelData(1);
     29 
     30        assert_constant_value(left, -1, 'Left channel:');
     31        assert_constant_value(right, 1, 'Right channel:');
     32      }
     33 
     34      function createStereoBufferWithDCOffset(context, length, sr, offset) {
     35        const buffer = new AudioBuffer({
     36          numberOfChannels: 2,
     37          length: length,
     38          sampleRate: sr
     39        });
     40        const channelL = buffer.getChannelData(0);
     41        const channelR = buffer.getChannelData(1);
     42 
     43        for (let i = 0; i < length; ++i) {
     44          channelL[i] = offset;
     45          channelR[i] = -offset;
     46        }
     47        return buffer;
     48      }
     49 
     50      test(t => {
     51        // Create a stereo OfflineAudioContext.
     52        const context = new OfflineAudioContext(
     53            2, lengthInSampleFrames, sampleRate);
     54 
     55        // Invalid splitter channel counts.
     56        assert_throws_dom('IndexSizeError',
     57                          () => context.createChannelSplitter(0),
     58                          'createChannelSplitter(0) must throw');
     59        assert_throws_dom('IndexSizeError',
     60                          () => context.createChannelSplitter(33),
     61                          'createChannelSplitter(33) must throw');
     62 
     63        // Maximum valid splitter.
     64        let splitter = context.createChannelSplitter(32);
     65        assert_equals(splitter.numberOfOutputs, 32,
     66                      'splitter.numberOfOutputs');
     67        assert_equals(splitter.numberOfInputs, 1,
     68                      'splitter.numberOfInputs');
     69 
     70        // Default constructor should yield 6 outputs.
     71        splitter = context.createChannelSplitter();
     72        assert_equals(splitter.numberOfOutputs, 6,
     73                      'Default output count should be 6');
     74      }, 'Construction of ChannelSplitterNode');
     75 
     76 
     77      promise_test(async t => {
     78        // Create a stereo OfflineAudioContext.
     79        const context = new OfflineAudioContext(
     80            2, lengthInSampleFrames, sampleRate);
     81 
     82        // Create a stereo buffer, with all +1 values in left channel, all
     83        // –1 in right channel.
     84        const srcBuffer = createStereoBufferWithDCOffset(
     85            context, lengthInSampleFrames, sampleRate, 1);
     86 
     87        const source = new AudioBufferSourceNode(context, {
     88          buffer: srcBuffer
     89        });
     90        const splitter = new ChannelSplitterNode(context, {
     91          numberOfOutputs: 2
     92        });
     93        const merger = new ChannelMergerNode(context);
     94 
     95        source.connect(splitter);
     96        splitter.connect(merger, 0, 1);
     97        splitter.connect(merger, 1, 0);
     98        merger.connect(context.destination);
     99 
    100        source.start();
    101 
    102        const renderedBuffer = await context.startRendering();
    103        checkResult(renderedBuffer);
    104      }, 'Functionality of ChannelSplitterNode (channel swap)');
    105    </script>
    106  </body>
    107 </html>