summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/webaudio/the-audio-api/the-channelsplitternode-interface/audiochannelsplitter.html
blob: 954c71a96b288530e6c22878fed7a91f42091dc2 (plain)
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
<!DOCTYPE html>
<!--
Tests that AudioChannelSplitter works correctly.
-->
<html>
  <head>
    <title>
      audiochannelsplitter.html
    </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 id="layout-test-code">
      let audit = Audit.createTaskRunner();

      let sampleRate = 44100.0;
      let lengthInSampleFrames = 512;

      let context = 0;
      let sourceBuffer;
      let sourceNode;
      let channelSplitter;
      let channelMerger;

      function createStereoBufferWithDCOffset(length, sampleRate, offset) {
        let buffer = context.createBuffer(2, length, sampleRate);
        let n = buffer.length;
        let channelL = buffer.getChannelData(0);
        let channelR = buffer.getChannelData(1);

        for (let i = 0; i < n; ++i) {
          channelL[i] = offset;
          channelR[i] = -1.0 * offset;
        }

        return buffer;
      }

      // checkResult() checks that the rendered buffer is stereo and that the
      // left channel is all -1 and right channel all +1. In other words, we've
      // reversed the order of the two channels.
      function checkResult(buffer, should) {
        let success = true;

        if (buffer.numberOfChannels == 2) {
          let bufferDataL = buffer.getChannelData(0);
          let bufferDataR = buffer.getChannelData(1);

          success = should(bufferDataL, 'Left channel').beConstantValueOf(-1) &&
              success;
          success = should(bufferDataR, 'Right channel').beConstantValueOf(1) &&
              success;
        } else {
          success = false;
        }

        should(success, 'Left and right channels were exchanged')
            .message('correctly', 'incorrectly');
      }

      audit.define(
          {
            label: 'construction',
            description: 'Construction of ChannelSplitterNode'
          },
          function(task, should) {

            // Create stereo offline audio context.
            context =
                new OfflineAudioContext(2, lengthInSampleFrames, sampleRate);

            let splitternode;
            should(() => {
              let splitternode = context.createChannelSplitter(0);
            }, 'createChannelSplitter(0)').throw(DOMException, 'IndexSizeError');

            should(() => {
              splitternode = context.createChannelSplitter(33);
            }, 'createChannelSplitter(33)').throw(DOMException, 'IndexSizeError');

            should(() => {
              splitternode = context.createChannelSplitter(32);
            }, 'splitternode = context.createChannelSplitter(32)').notThrow();

            should(splitternode.numberOfOutputs, 'splitternode.numberOfOutputs')
                .beEqualTo(32);
            should(splitternode.numberOfInputs, 'splitternode.numberOfInputs')
                .beEqualTo(1)

            should(() => {
              splitternode = context.createChannelSplitter();
            }, 'splitternode = context.createChannelSplitter()').notThrow();

            should(splitternode.numberOfOutputs, 'splitternode.numberOfOutputs')
                .beEqualTo(6);

            task.done();
          });

      audit.define(
          {
            label: 'functionality',
            description: 'Functionality of ChannelSplitterNode'
          },
          function(task, should) {

            // Create a stereo buffer, with all +1 values in left channel, all
            // -1 in right channel.
            sourceBuffer = createStereoBufferWithDCOffset(
                lengthInSampleFrames, sampleRate, 1);

            sourceNode = context.createBufferSource();
            sourceNode.buffer = sourceBuffer;

            // Create a channel splitter and connect it so that it split the
            // stereo stream into two mono streams.
            channelSplitter = context.createChannelSplitter(2);
            sourceNode.connect(channelSplitter);

            // Create a channel merger to merge the output of channel splitter.
            channelMerger = context.createChannelMerger();
            channelMerger.connect(context.destination);

            // When merging, exchange channel layout: left->right, right->left
            channelSplitter.connect(channelMerger, 0, 1);
            channelSplitter.connect(channelMerger, 1, 0);

            sourceNode.start(0);

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

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