summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/webaudio/the-audio-api/the-periodicwave-interface/periodicWave.html
blob: fe42f8ad50484d4f09a4aa4d15cbd93336f51b92 (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
<!DOCTYPE html>
<html>
  <head>
    <title>
      Test Constructor: PeriodicWave
    </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">
      // real and imag are used in separate PeriodicWaves to make their peak values
      // easy to determine.
      const realMax = 99;
      var real = new Float32Array(realMax + 1);
      real[1] = 2.0; // fundamental
      real[realMax] = 3.0;
      const realPeak = real[1] + real[realMax];
      const realFundamental = 19.0;
      var imag = new Float32Array(4);
      imag[0] = 6.0; // should be ignored.
      imag[3] = 0.5;
      const imagPeak = imag[3];
      const imagFundamental = 551.0;

      const testLength = 8192;
      let context = new AudioContext();

      let audit = Audit.createTaskRunner();

      // Create with the factory method

      audit.define('create with factory method', (task, should) => {
        should(() => {
          context.createPeriodicWave(new Float32Array(testLength), new Float32Array(testLength));
        }, 'context.createPeriodicWave(new Float32Array(' + testLength + '), ' +
        'new Float32Array(' + testLength + '))').notThrow();
        task.done();
      });

      audit.define('different length with factory method', (task, should) => {
        should(() => {
          context.createPeriodicWave(new Float32Array(512), new Float32Array(4));
        }, 'context.createPeriodicWave(new Float32Array(512), ' +
        'new Float32Array(4))').throw(DOMException, "IndexSizeError");
        task.done();
      });

      audit.define('too small with factory method', (task, should) => {
        should(() => {
          context.createPeriodicWave(new Float32Array(1), new Float32Array(1));
        }, 'context.createPeriodicWave(new Float32Array(1), ' +
        'new Float32Array(1))').throw(DOMException, "IndexSizeError");
        task.done();
      });

      // Create with the constructor

      audit.define('create with constructor', (task, should) => {
        should(() => {
          new PeriodicWave(context, { real: new Float32Array(testLength), imag: new Float32Array(testLength) });
        }, 'new PeriodicWave(context, { real : new Float32Array(' + testLength + '), ' +
        'imag : new Float32Array(' + testLength + ') })').notThrow();
        task.done();
      });

      audit.define('different length with constructor', (task, should) => {
        should(() => {
          new PeriodicWave(context, { real: new Float32Array(testLength), imag: new Float32Array(4) });
        }, 'new PeriodicWave(context, { real : new Float32Array(' + testLength + '), ' +
        'imag : new Float32Array(4) })').throw(DOMException, "IndexSizeError");
        task.done();
      });

      audit.define('too small with constructor', (task, should) => {
        should(() => {
          new PeriodicWave(context, { real: new Float32Array(1), imag: new Float32Array(1) });
        }, 'new PeriodicWave(context, { real : new Float32Array(1), ' +
        'imag : new Float32Array(1) })').throw(DOMException, "IndexSizeError");
        task.done();
      });

      audit.define('output test', (task, should) => {
        let context = new OfflineAudioContext(2, testLength, 44100);
        // Create the expected output buffer
        let expectations = context.createBuffer(2, testLength, context.sampleRate);
        for (var i = 0; i < expectations.length; ++i) {

          expectations.getChannelData(0)[i] = 1.0 / realPeak *
            (real[1] * Math.cos(2 * Math.PI * realFundamental * i /
                                context.sampleRate) +
             real[realMax] * Math.cos(2 * Math.PI * realMax * realFundamental * i /
                                context.sampleRate));

          expectations.getChannelData(1)[i] = 1.0 / imagPeak *
             imag[3] * Math.sin(2 * Math.PI * 3 * imagFundamental * i /
                                context.sampleRate);
        }

        // Create the real output buffer
        let merger = context.createChannelMerger();

        let osc1 = context.createOscillator();
        let osc2 = context.createOscillator();

        osc1.setPeriodicWave(context.createPeriodicWave(
                                real, new Float32Array(real.length)));
        osc2.setPeriodicWave(context.createPeriodicWave(
                                new Float32Array(imag.length), imag));
        osc1.frequency.value = realFundamental;
        osc2.frequency.value = imagFundamental;

        osc1.start();
        osc2.start();

        osc1.connect(merger, 0, 0);
        osc2.connect(merger, 0, 1);

        context.startRendering().then(reality => {
          should(reality, 'rendering PeriodicWave').beEqualToArray(expectations);
          task.done();
        });
      });

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