OLD | NEW |
| (Empty) |
1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> | |
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 <script src="resources/note-grain-on-testing.js"></script> | |
9 </head> | |
10 | |
11 <body> | |
12 <div id="description"></div> | |
13 <div id="console"></div> | |
14 | |
15 <script> | |
16 description("Test noteGrainOn offset rendering."); | |
17 | |
18 // To test noteGrainOn, a single ramp signal is created. | |
19 // Various sections of the ramp are rendered by noteGrainOn() at | |
20 // different times, and we verify that the actual output | |
21 // consists of the correct section of the ramp at the correct | |
22 // time. | |
23 | |
24 var linearRampBuffer; | |
25 | |
26 // Array of the grain offset used for each ramp played. | |
27 var grainOffsetTime = []; | |
28 | |
29 // Verify the received signal is a ramp from the correct section | |
30 // of our ramp signal. | |
31 function verifyGrain(renderedData, startFrame, endFrame, grainIndex) { | |
32 var grainOffsetFrame = timeToSampleFrame(grainOffsetTime[grainIndex],
sampleRate); | |
33 var grainFrameLength = endFrame - startFrame; | |
34 var ramp = linearRampBuffer.getChannelData(0); | |
35 var isCorrect = true; | |
36 | |
37 var expected; | |
38 var actual; | |
39 var frame; | |
40 | |
41 for (var k = 0; k < grainFrameLength; ++k) { | |
42 if (renderedData[startFrame + k] != ramp[grainOffsetFrame + k]) { | |
43 expected = ramp[grainOffsetFrame + k]; | |
44 actual = renderedData[startFrame + k]; | |
45 frame = startFrame + k; | |
46 isCorrect = false; | |
47 break; | |
48 } | |
49 } | |
50 return { verified: isCorrect, | |
51 expected : expected , | |
52 actual : actual, | |
53 frame : frame }; | |
54 } | |
55 | |
56 function checkResult(event) { | |
57 var buffer = event.renderedBuffer; | |
58 renderedData = buffer.getChannelData(0); | |
59 var nSamples = renderedData.length; | |
60 | |
61 var success = true; | |
62 | |
63 // Number of grains that we found that have incorrect data. | |
64 var invalidGrainDataCount = 0; | |
65 | |
66 var startEndFrames = findStartAndEndSamples(renderedData); | |
67 | |
68 // Verify the start and stop times. Not strictly needed for | |
69 // this test, but it's useful to know that if the ramp data | |
70 // appears to be incorrect. | |
71 success = success && verifyStartAndEndFrames(startEndFrames); | |
72 | |
73 // Loop through each of the rendered grains and check that | |
74 // each grain contains our expected ramp. | |
75 for (var k = 0; k < startEndFrames.start.length; ++k) { | |
76 // Verify that the rendered data matches the expected | |
77 // section of our ramp signal. | |
78 var result = verifyGrain(renderedData, startEndFrames.start[k], st
artEndFrames.end[k], k); | |
79 | |
80 if (!result.verified) { | |
81 testFailed("Grain " + k + " incorrect. Expected " + result.ex
pected + " but received " + result.actual + " at sample frame " + result.frame); | |
82 ++invalidGrainDataCount; | |
83 success = false; | |
84 } | |
85 } | |
86 | |
87 if (!invalidGrainDataCount) { | |
88 testPassed("All " + numberOfTests + " grains contained the correct
data."); | |
89 } else { | |
90 testFailed(invalidGrainDataCount + " grains out of " + numberOfTes
ts + " did not contain the expected data."); | |
91 success = false; | |
92 } | |
93 | |
94 if (success) { | |
95 testPassed("noteGrainOn offset rendering tests passed."); | |
96 } else { | |
97 testFailed("noteGrainOn offset rendering tests failed."); | |
98 } | |
99 | |
100 finishJSTest(); | |
101 } | |
102 | |
103 function runTest() { | |
104 if (window.testRunner) { | |
105 testRunner.dumpAsText(); | |
106 testRunner.waitUntilDone(); | |
107 } | |
108 | |
109 window.jsTestIsAsync = true; | |
110 | |
111 // Create offline audio context. | |
112 context = new OfflineAudioContext(2, sampleRate * renderTime, sampleRa
te); | |
113 | |
114 // Create a linear ramp for testing noteGrainOn. | |
115 linearRampBuffer = createSignalBuffer(context, | |
116 function(k) { | |
117 // Want the ramp to start | |
118 // with 1, not 0. | |
119 return k + 1; | |
120 }); | |
121 | |
122 var grainInfo = playAllGrains(context, linearRampBuffer, numberOfTests
); | |
123 | |
124 grainOffsetTime = grainInfo.grainOffsetTimes; | |
125 | |
126 context.oncomplete = checkResult; | |
127 context.startRendering(); | |
128 } | |
129 | |
130 runTest(); | |
131 successfullyParsed = true; | |
132 | |
133 </script> | |
134 | |
135 </body> | |
136 </html> | |
OLD | NEW |