|
1 <!DOCTYPE HTML> |
|
2 <html> |
|
3 <head> |
|
4 <title>Test whether we can create an AudioContext interface</title> |
|
5 <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> |
|
6 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" /> |
|
7 </head> |
|
8 <body> |
|
9 <pre id="test"> |
|
10 <script src="webaudio.js" type="text/javascript"></script> |
|
11 <script class="testbody" type="text/javascript"> |
|
12 |
|
13 SimpleTest.waitForExplicitFinish(); |
|
14 addLoadEvent(function() { |
|
15 var context = new AudioContext(); |
|
16 var buffer = context.createBuffer(2, 2048, context.sampleRate); |
|
17 SpecialPowers.gc(); // Make sure that our channels are accessible after GC |
|
18 ok(buffer, "Buffer was allocated successfully"); |
|
19 is(buffer.sampleRate, context.sampleRate, "Correct sample rate"); |
|
20 is(buffer.length, 2048, "Correct length"); |
|
21 ok(Math.abs(buffer.duration - 2048 / context.sampleRate) < 0.0001, "Correct duration"); |
|
22 is(buffer.numberOfChannels, 2, "Correct number of channels"); |
|
23 for (var i = 0; i < buffer.numberOfChannels; ++i) { |
|
24 var buf = buffer.getChannelData(i); |
|
25 ok(buf, "Buffer index " + i + " exists"); |
|
26 ok(buf instanceof Float32Array, "Result is a typed array"); |
|
27 is(buf.length, buffer.length, "Correct length"); |
|
28 var foundNonZero = false; |
|
29 for (var j = 0; j < buf.length; ++j) { |
|
30 if (buf[j] != 0) { |
|
31 foundNonZero = true; |
|
32 break; |
|
33 } |
|
34 buf[j] = j; |
|
35 } |
|
36 ok(!foundNonZero, "Buffer " + i + " should be initialized to 0"); |
|
37 } |
|
38 |
|
39 // Now test copying the channel data out of a normal buffer |
|
40 var copy = new Float32Array(100); |
|
41 buffer.copyFromChannel(copy, 0, 1024); |
|
42 for (var i = 0; i < copy.length; ++i) { |
|
43 is(copy[i], 1024 + i, "Correct sample"); |
|
44 } |
|
45 |
|
46 // Test copying the channel data out of a playing buffer |
|
47 var srcNode = context.createBufferSource(); |
|
48 srcNode.buffer = buffer; |
|
49 srcNode.start(0); |
|
50 copy = new Float32Array(100); |
|
51 buffer.copyFromChannel(copy, 0, 1024); |
|
52 for (var i = 0; i < copy.length; ++i) { |
|
53 is(copy[i], 1024 + i, "Correct sample"); |
|
54 } |
|
55 |
|
56 // Test copying to the channel data |
|
57 var newData = new Float32Array(200); |
|
58 buffer.copyToChannel(newData, 0, 100); |
|
59 var changedData = buffer.getChannelData(0); |
|
60 for (var i = 0; i < changedData.length; ++i) { |
|
61 if (i < 100 || i >= 300) { |
|
62 is(changedData[i], i, "Untouched sample"); |
|
63 } else { |
|
64 is(changedData[i], 0, "Correct sample"); |
|
65 } |
|
66 } |
|
67 |
|
68 // Now, neuter the array buffer |
|
69 var worker = new Worker("audioBufferSourceNodeNeutered_worker.js"); |
|
70 var data = buffer.getChannelData(0).buffer; |
|
71 worker.postMessage(data, [data]); |
|
72 SpecialPowers.gc(); |
|
73 |
|
74 expectException(function() { |
|
75 buffer.copyFromChannel(copy, 0, 1024); |
|
76 }, DOMException.INDEX_SIZE_ERR); |
|
77 |
|
78 expectException(function() { |
|
79 buffer.copyToChannel(newData, 0, 100); |
|
80 }, DOMException.INDEX_SIZE_ERR); |
|
81 |
|
82 expectException(function() { |
|
83 context.createBuffer(2, 2048, 7999); |
|
84 }, DOMException.INDEX_SIZE_ERR); |
|
85 expectException(function() { |
|
86 context.createBuffer(2, 2048, 192001); |
|
87 }, DOMException.INDEX_SIZE_ERR); |
|
88 context.createBuffer(2, 2048, 8000); // no exception |
|
89 context.createBuffer(2, 2048, 192000); // no exception |
|
90 context.createBuffer(32, 2048, 48000); // no exception |
|
91 // Null length |
|
92 expectException(function() { |
|
93 context.createBuffer(2, 0, 48000); |
|
94 }, DOMException.INDEX_SIZE_ERR); |
|
95 // Null number of channels |
|
96 expectException(function() { |
|
97 context.createBuffer(0, 2048, 48000); |
|
98 }, DOMException.INDEX_SIZE_ERR); |
|
99 SimpleTest.finish(); |
|
100 }); |
|
101 |
|
102 </script> |
|
103 </pre> |
|
104 </body> |
|
105 </html> |