OLD | NEW |
1 <!doctype> | 1 <!DOCTYPE html> |
2 <html> | 2 <html> |
3 <head> | 3 <head> |
| 4 <title> |
| 5 note-grain-on-play.html |
| 6 </title> |
4 <script src="../../resources/testharness.js"></script> | 7 <script src="../../resources/testharness.js"></script> |
5 <script src="../../resources/testharnessreport.js"></script> | 8 <script src="../../resources/testharnessreport.js"></script> |
6 <script src="../resources/audit-util.js"></script> | 9 <script src="../resources/audit-util.js"></script> |
7 <script src="../resources/audit.js"></script> | 10 <script src="../resources/audit.js"></script> |
8 <script src="../resources/note-grain-on-testing.js"></script> | 11 <script src="../resources/note-grain-on-testing.js"></script> |
9 </head> | 12 </head> |
10 | |
11 <body> | 13 <body> |
12 <div id="description"></div> | 14 <div id="description"></div> |
13 <div id="console"></div> | 15 <div id="console"></div> |
14 | 16 <script id="layout-test-code"> |
15 <script> | |
16 let audit = Audit.createTaskRunner(); | 17 let audit = Audit.createTaskRunner(); |
17 | 18 |
18 // To test noteGrainOn, a single ramp signal is created. | 19 // To test noteGrainOn, a single ramp signal is created. |
19 // Various sections of the ramp are rendered by noteGrainOn() at | 20 // Various sections of the ramp are rendered by noteGrainOn() at |
20 // different times, and we verify that the actual output | 21 // different times, and we verify that the actual output |
21 // consists of the correct section of the ramp at the correct | 22 // consists of the correct section of the ramp at the correct |
22 // time. | 23 // time. |
23 | 24 |
24 let linearRampBuffer; | 25 let linearRampBuffer; |
25 | 26 |
26 // Array of the grain offset used for each ramp played. | 27 // Array of the grain offset used for each ramp played. |
27 let grainOffsetTime = []; | 28 let grainOffsetTime = []; |
28 | 29 |
29 // Verify the received signal is a ramp from the correct section | 30 // Verify the received signal is a ramp from the correct section |
30 // of our ramp signal. | 31 // of our ramp signal. |
31 function verifyGrain(renderedData, startFrame, endFrame, grainIndex) { | 32 function verifyGrain(renderedData, startFrame, endFrame, grainIndex) { |
32 let grainOffsetFrame = timeToSampleFrame(grainOffsetTime[ | 33 let grainOffsetFrame = |
33 grainIndex], sampleRate); | 34 timeToSampleFrame(grainOffsetTime[grainIndex], sampleRate); |
34 let grainFrameLength = endFrame - startFrame; | 35 let grainFrameLength = endFrame - startFrame; |
35 let ramp = linearRampBuffer.getChannelData(0); | 36 let ramp = linearRampBuffer.getChannelData(0); |
36 let isCorrect = true; | 37 let isCorrect = true; |
37 | 38 |
38 let expected; | 39 let expected; |
39 let actual; | 40 let actual; |
40 let frame; | 41 let frame; |
41 | 42 |
42 for (let k = 0; k < grainFrameLength; ++k) { | 43 for (let k = 0; k < grainFrameLength; ++k) { |
43 if (renderedData[startFrame + k] != ramp[grainOffsetFrame + | 44 if (renderedData[startFrame + k] != ramp[grainOffsetFrame + k]) { |
44 k]) { | 45 expected = ramp[grainOffsetFrame + k]; |
45 expected = ramp[grainOffsetFrame + k]; | 46 actual = renderedData[startFrame + k]; |
46 actual = renderedData[startFrame + k]; | 47 frame = startFrame + k; |
47 frame = startFrame + k; | 48 isCorrect = false; |
48 isCorrect = false; | 49 break; |
49 break; | |
50 } | |
51 } | 50 } |
52 return { | 51 } |
53 verified: isCorrect, | 52 return { |
54 expected: expected, | 53 verified: isCorrect, |
55 actual: actual, | 54 expected: expected, |
56 frame: frame | 55 actual: actual, |
57 }; | 56 frame: frame |
| 57 }; |
58 } | 58 } |
59 | 59 |
60 function checkResult(buffer, should) { | 60 function checkResult(buffer, should) { |
61 renderedData = buffer.getChannelData(0); | 61 renderedData = buffer.getChannelData(0); |
62 let nSamples = renderedData.length; | 62 let nSamples = renderedData.length; |
63 | 63 |
64 // Number of grains that we found that have incorrect data. | 64 // Number of grains that we found that have incorrect data. |
65 let invalidGrainDataCount = 0; | 65 let invalidGrainDataCount = 0; |
66 | 66 |
67 let startEndFrames = findStartAndEndSamples(renderedData); | 67 let startEndFrames = findStartAndEndSamples(renderedData); |
68 | 68 |
69 // Verify the start and stop times. Not strictly needed for | 69 // Verify the start and stop times. Not strictly needed for |
70 // this test, but it's useful to know that if the ramp data | 70 // this test, but it's useful to know that if the ramp data |
71 // appears to be incorrect. | 71 // appears to be incorrect. |
72 verifyStartAndEndFrames(startEndFrames, should); | 72 verifyStartAndEndFrames(startEndFrames, should); |
73 | 73 |
74 // Loop through each of the rendered grains and check that | 74 // Loop through each of the rendered grains and check that |
75 // each grain contains our expected ramp. | 75 // each grain contains our expected ramp. |
76 for (let k = 0; k < startEndFrames.start.length; ++k) { | 76 for (let k = 0; k < startEndFrames.start.length; ++k) { |
77 // Verify that the rendered data matches the expected | 77 // Verify that the rendered data matches the expected |
78 // section of our ramp signal. | 78 // section of our ramp signal. |
79 let result = verifyGrain(renderedData, startEndFrames.start[ | 79 let result = verifyGrain( |
80 k], startEndFrames.end[k], k); | 80 renderedData, startEndFrames.start[k], startEndFrames.end[k], k); |
81 should(result.verified, "Pulse " + k + | 81 should(result.verified, 'Pulse ' + k + ' contained the expected data') |
82 " contained the expected data") | |
83 .beTrue(); | 82 .beTrue(); |
84 } | 83 } |
85 should(invalidGrainDataCount, | 84 should( |
86 "Number of grains that did not contain the expected data") | 85 invalidGrainDataCount, |
| 86 'Number of grains that did not contain the expected data') |
87 .beEqualTo(0); | 87 .beEqualTo(0); |
88 } | 88 } |
89 | 89 |
90 audit.define({ | 90 audit.define( |
91 label: "note-grain-on-play", | 91 { |
92 description: "Test noteGrainOn offset rendering" | 92 label: 'note-grain-on-play', |
93 }, function(task, should) { | 93 description: 'Test noteGrainOn offset rendering' |
94 // Create offline audio context. | 94 }, |
95 context = new OfflineAudioContext(2, sampleRate * | 95 function(task, should) { |
96 renderTime, sampleRate); | 96 // Create offline audio context. |
| 97 context = |
| 98 new OfflineAudioContext(2, sampleRate * renderTime, sampleRate); |
97 | 99 |
98 // Create a linear ramp for testing noteGrainOn. | 100 // Create a linear ramp for testing noteGrainOn. |
99 linearRampBuffer = createSignalBuffer(context, | 101 linearRampBuffer = createSignalBuffer(context, function(k) { |
100 function(k) { | 102 // Want the ramp to start |
101 // Want the ramp to start | 103 // with 1, not 0. |
102 // with 1, not 0. | 104 return k + 1; |
103 return k + 1; | 105 }); |
104 }); | |
105 | 106 |
106 let grainInfo = playAllGrains(context, linearRampBuffer, | 107 let grainInfo = |
107 numberOfTests); | 108 playAllGrains(context, linearRampBuffer, numberOfTests); |
108 | 109 |
109 grainOffsetTime = grainInfo.grainOffsetTimes; | 110 grainOffsetTime = grainInfo.grainOffsetTimes; |
110 | 111 |
111 context.startRendering() | 112 context.startRendering().then(function(audioBuffer) { |
112 .then(function(audioBuffer) { | 113 checkResult(audioBuffer, should); |
113 checkResult(audioBuffer, should); | 114 task.done(); |
114 task.done(); | 115 }); |
115 }); | 116 }); |
116 }); | 117 |
117 | |
118 audit.run(); | 118 audit.run(); |
119 </script> | 119 </script> |
120 </body> | 120 </body> |
121 </html> | 121 </html> |
OLD | NEW |