OLD | NEW |
| (Empty) |
1 <!doctype html> | |
2 <html> | |
3 <head> | |
4 <script src="../resources/js-test.js"></script> | |
5 <script src="resources/compatibility.js"></script> | |
6 <script src="resources/audit-util.js"></script> | |
7 <script src="resources/audio-testing.js"></script> | |
8 <title>Test Negative AudioParam.exponentialRampToValueAtTime</title> | |
9 </head> | |
10 | |
11 <body> | |
12 <script> | |
13 description("Test AudioParam.exponentialRampToValueAtTime() with Negative
Values."); | |
14 window.jsTestIsAsync = true; | |
15 | |
16 var sampleRate = 48000; | |
17 | |
18 var audit = Audit.createTaskRunner(); | |
19 | |
20 audit.defineTask("both negative values", function (done) { | |
21 var renderDuration = 0.125; | |
22 | |
23 // Create context with two channels. Channel 0 contains the positive-va
lued exponential and | |
24 // channel 1 contains the negative-valued exponential. We'll compare th
e two channels to | |
25 // verify that they're the same, as they should be. | |
26 var context = new OfflineAudioContext(2, renderDuration * sampleRate, sa
mpleRate); | |
27 var source = context.createBufferSource(); | |
28 source.buffer = createConstantBuffer(context, 1, 1); | |
29 source.loop = true; | |
30 | |
31 // Gain node gp is for the positive-valued exponential ramp, and gn is f
or the negative-valued | |
32 // exponential ramp. | |
33 var gp = context.createGain(); | |
34 var gn = context.createGain(); | |
35 var merger = context.createChannelMerger(2); | |
36 | |
37 source.connect(gp) | |
38 .connect(merger, 0, 0); | |
39 source.connect(gn) | |
40 .connect(merger, 0, 1); | |
41 merger.connect(context.destination); | |
42 | |
43 gp.gain.setValueAtTime(1, 0); | |
44 gp.gain.exponentialRampToValueAtTime(2, renderDuration); | |
45 | |
46 gn.gain.setValueAtTime(-1, 0); | |
47 gn.gain.exponentialRampToValueAtTime(-2, renderDuration); | |
48 | |
49 source.start(); | |
50 | |
51 context.startRendering().then(function (resultBuffer) { | |
52 // Verify that channels have the same values, except for the sign. | |
53 var expected = resultBuffer.getChannelData(0); | |
54 var actual = resultBuffer.getChannelData(1); | |
55 var inverted = expected.map(sample => -sample); | |
56 | |
57 Should("Negative exponential ramp from -1 to -2", actual) | |
58 .beEqualToArray(inverted); | |
59 }).then(done); | |
60 }); | |
61 | |
62 audit.defineTask("negative-end", function (done) { | |
63 // Positive start value and negative end value should just do nothing. | |
64 var renderDuration = 0.125; | |
65 var context = new OfflineAudioContext(1, renderDuration * sampleRate, sa
mpleRate); | |
66 var source = context.createBufferSource(); | |
67 source.buffer = createConstantBuffer(context, 1, 1); | |
68 source.loop = true; | |
69 | |
70 // Gain node gp is for the positive-valued exponential ramp, and gn is f
or the negative-valued | |
71 // exponential ramp. | |
72 var g = context.createGain(); | |
73 | |
74 g.gain.setValueAtTime(2, 0); | |
75 g.gain.exponentialRampToValueAtTime(-1, renderDuration); | |
76 | |
77 source.connect(g) | |
78 .connect(context.destination); | |
79 | |
80 source.start(); | |
81 | |
82 context.startRendering().then(function (resultBuffer) { | |
83 var actual = resultBuffer.getChannelData(0); | |
84 | |
85 Should("Exponential ramp from 2 to -1", actual) | |
86 .beConstantValueOf(2); | |
87 }).then(done); | |
88 }); | |
89 | |
90 audit.defineTask("positive-end", function (done) { | |
91 // Positive start value and negative end value should just do nothing. | |
92 var renderDuration = 0.125; | |
93 var context = new OfflineAudioContext(1, renderDuration * sampleRate, sa
mpleRate); | |
94 var source = context.createBufferSource(); | |
95 source.buffer = createConstantBuffer(context, 1, 1); | |
96 source.loop = true; | |
97 | |
98 var g = context.createGain(); | |
99 | |
100 g.gain.setValueAtTime(-1, 0); | |
101 g.gain.exponentialRampToValueAtTime(1, renderDuration); | |
102 | |
103 source.connect(g) | |
104 .connect(context.destination); | |
105 source.start(); | |
106 | |
107 context.startRendering().then(function (resultBuffer) { | |
108 var actual = resultBuffer.getChannelData(0); | |
109 | |
110 Should("Exponential ramp from -1 to 1", actual) | |
111 .beConstantValueOf(-1); | |
112 }).then(done); | |
113 }); | |
114 | |
115 audit.defineTask("propagate", function (done) { | |
116 // Test propagation of ramp if the exponential ramp start and end values
have opposite sign. | |
117 var renderDuration = 0.125; | |
118 var linearRampEnd = renderDuration / 4; | |
119 var exponentialRampEnd = renderDuration / 2; | |
120 | |
121 var context = new OfflineAudioContext(1, renderDuration * sampleRate, sa
mpleRate); | |
122 var source = context.createBufferSource(); | |
123 source.buffer = createConstantBuffer(context, 1, 1); | |
124 source.loop = true; | |
125 | |
126 var g = context.createGain(); | |
127 | |
128 g.gain.setValueAtTime(2, 0); | |
129 g.gain.linearRampToValueAtTime(-1, linearRampEnd); | |
130 g.gain.exponentialRampToValueAtTime(1, exponentialRampEnd); | |
131 | |
132 source.connect(g) | |
133 .connect(context.destination); | |
134 source.start(); | |
135 | |
136 context.startRendering().then(function (resultBuffer) { | |
137 var actual = resultBuffer.getChannelData(0); | |
138 | |
139 // Since the start value of the exponential ramp is -1 and the end val
ue is 1, the ramp | |
140 // should just propagate -1 from the end of the linear ramp "forever". | |
141 var endFrame = Math.ceil(linearRampEnd * sampleRate); | |
142 Should("Exponential ramp from -1 to 1 after the end of the linear ramp
", | |
143 actual.slice(endFrame)) | |
144 .beConstantValueOf(-1); | |
145 }).then(done); | |
146 | |
147 }); | |
148 | |
149 audit.defineTask("finish", function (done) { | |
150 finishJSTest(); | |
151 done(); | |
152 }); | |
153 | |
154 audit.runTasks(); | |
155 </script> | |
156 </body> | |
157 </html> | |
OLD | NEW |