Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 <!DOCTYPE html> | 1 <!DOCTYPE html> |
| 2 | 2 |
| 3 <!-- | 3 <!-- |
| 4 Tests that we are able to schedule a series of notes to playback with sample-acc uracy. | 4 Tests that we are able to schedule a series of notes to playback with sample-acc uracy. |
| 5 We use an impulse so we can tell exactly where the rendering is happening. | 5 We use an impulse so we can tell exactly where the rendering is happening. |
| 6 --> | 6 --> |
| 7 | 7 |
| 8 <html> | 8 <html> |
| 9 <head> | 9 <head> |
| 10 <script src="../../resources/js-test.js"></script> | 10 <script src="../../resources/testharness.js"></script> |
| 11 <script src="../../resources/testharnessreport.js"></script> | |
| 11 <script src="../resources/audit-util.js"></script> | 12 <script src="../resources/audit-util.js"></script> |
| 12 <script src="../resources/audio-testing.js"></script> | 13 <script src="../resources/audit.js"></script> |
| 13 <script type="text/javascript" src="../resources/buffer-loader.js"></script> | 14 <script src="../resources/buffer-loader.js"></script> |
| 14 </head> | 15 </head> |
| 15 | 16 |
| 16 <body> | 17 <body> |
| 17 | 18 |
| 18 <div id="description"></div> | 19 <script> |
| 19 <div id="console"></div> | 20 let audit = Audit.createTaskRunner(); |
| 20 | 21 |
| 21 <script> | 22 let sampleRate = 44100.0; |
| 22 description("Tests sample-accurate scheduling."); | 23 let lengthInSeconds = 4; |
| 23 | 24 |
| 24 var sampleRate = 44100.0; | 25 let context = 0; |
| 25 var lengthInSeconds = 4; | 26 let bufferLoader = 0; |
| 26 | 27 let impulse; |
| 27 var context = 0; | |
| 28 var bufferLoader = 0; | |
| 29 var impulse; | |
| 30 | 28 |
| 31 // See if we can render at exactly these sample offsets. | 29 // See if we can render at exactly these sample offsets. |
| 32 var sampleOffsets = [0, 3, 512, 517, 1000, 1005, 20000, 21234, 37590]; | 30 let sampleOffsets = [0, 3, 512, 517, 1000, 1005, 20000, 21234, 37590]; |
| 33 | 31 |
| 34 function createImpulse() { | 32 function createImpulse() { |
| 35 // An impulse has a value of 1 at time 0, and is otherwise 0. | 33 // An impulse has a value of 1 at time 0, and is otherwise 0. |
| 36 impulse = context.createBuffer(2, 512, sampleRate); | 34 impulse = context.createBuffer(2, 512, sampleRate); |
| 37 var sampleDataL = impulse.getChannelData(0); | 35 let sampleDataL = impulse.getChannelData(0); |
| 38 var sampleDataR = impulse.getChannelData(1); | 36 let sampleDataR = impulse.getChannelData(1); |
| 39 sampleDataL[0] = 1.0; | 37 sampleDataL[0] = 1.0; |
| 40 sampleDataR[0] = 1.0; | 38 sampleDataR[0] = 1.0; |
| 41 } | 39 } |
| 42 | 40 |
| 43 function playNote(time) { | 41 function playNote(time) { |
| 44 var bufferSource = context.createBufferSource(); | 42 let bufferSource = context.createBufferSource(); |
| 45 bufferSource.buffer = impulse; | 43 bufferSource.buffer = impulse; |
| 46 bufferSource.connect(context.destination); | 44 bufferSource.connect(context.destination); |
| 47 bufferSource.start(time); | 45 bufferSource.start(time); |
| 48 } | 46 } |
| 49 | 47 |
| 50 function checkSampleAccuracy(event) { | 48 function checkSampleAccuracy(buffer, should) { |
| 51 var buffer = event.renderedBuffer; | 49 let bufferDataL = buffer.getChannelData(0); |
| 50 let bufferDataR = buffer.getChannelData(1); | |
| 52 | 51 |
| 53 var bufferDataL = buffer.getChannelData(0); | 52 let success = true; |
| 54 var bufferDataR = buffer.getChannelData(1); | 53 let impulseCount = 0; |
| 54 let badOffsetCount = 0; | |
| 55 | 55 |
| 56 var success = true; | 56 // Left and right channels must be the same. |
| 57 var impulseCount = 0; | 57 should(bufferDataL, "Content of left and right channels match and") |
| 58 var badOffsetCount = false; | 58 .beEqualToArray(bufferDataR); |
| 59 | 59 |
| 60 // Go through every sample and make sure it's 0, except at positions in samp leOffsets. | 60 // Go through every sample and make sure it's 0, except at positions in |
| 61 for (var i = 0; i < buffer.length; ++i) { | 61 // sampleOffsets. |
| 62 // Make sure left == right | 62 for (let i = 0; i < buffer.length; ++i) { |
| 63 if (bufferDataL[i] != bufferDataR[i]) { | |
| 64 testFailed("Rendered buffer left and right channels are not identica l."); | |
| 65 success = false; | |
| 66 break; | |
| 67 } | |
| 68 | |
| 69 if (bufferDataL[i] != 0) { | 63 if (bufferDataL[i] != 0) { |
| 70 // Make sure this index is in sampleOffsets | 64 // Make sure this index is in sampleOffsets |
| 71 var found = false; | 65 let found = false; |
| 72 for (var j = 0; j < sampleOffsets.length; ++j) { | 66 for (let j = 0; j < sampleOffsets.length; ++j) { |
| 73 if (sampleOffsets[j] == i) { | 67 if (sampleOffsets[j] == i) { |
| 74 found = true; | 68 found = true; |
| 75 break; | 69 break; |
| 76 } | 70 } |
| 77 } | 71 } |
| 78 ++impulseCount; | 72 ++impulseCount; |
| 73 should(found, "Non-zero sample found at sample offset " + i) | |
| 74 .beTrue(); | |
| 79 if (!found) { | 75 if (!found) { |
| 80 testFailed("Non-zero sample found at sample offset " + i); | |
| 81 success = false; | 76 success = false; |
|
hongchan
2017/01/18 18:25:15
Is this |success| used some where?
Raymond Toy
2017/01/18 19:21:36
Nope. I'll remove it.
| |
| 82 ++badOffsetCount; | 77 ++badOffsetCount; |
| 83 } | 78 } |
| 84 } | 79 } |
| 85 } | 80 } |
| 86 | 81 |
| 82 should(impulseCount, "Number of impulses found") | |
| 83 .beEqualTo(sampleOffsets.length); | |
| 84 | |
| 87 if (impulseCount == sampleOffsets.length) { | 85 if (impulseCount == sampleOffsets.length) { |
| 88 if (badOffsetCount == 0) { | 86 should(badOffsetCount, "bad offset") |
| 89 testPassed("Expected number of events found."); | 87 .beEqualTo(0); |
| 90 } else { | |
| 91 testFailed("Expected number of events found, but " + badOffsetCount + " are at incorrect offsets."); | |
| 92 success = false; | |
| 93 } | |
| 94 } else { | |
| 95 testFailed("Expected " + sampleOffsets.length + " impulses but only foun d " + impulseCount); | |
| 96 success = false; | |
| 97 } | 88 } |
| 98 | |
| 99 if (success) { | |
| 100 testPassed("All events rendered with sample-accuracy."); | |
| 101 } else { | |
| 102 testFailed("Events NOT rendered with sample-accuracy."); | |
| 103 } | |
| 104 | |
| 105 finishJSTest(); | |
| 106 } | 89 } |
| 107 | 90 |
| 108 function runTest() { | 91 audit.define("test", function (task, should) { |
| 109 if (window.testRunner) { | 92 task.describe("Test sample-accurate scheduling"); |
| 110 testRunner.dumpAsText(); | 93 |
| 111 testRunner.waitUntilDone(); | |
| 112 } | |
| 113 | |
| 114 window.jsTestIsAsync = true; | |
| 115 | |
| 116 // Create offline audio context. | 94 // Create offline audio context. |
| 117 context = new OfflineAudioContext(2, sampleRate * lengthInSeconds, sampleRat e); | 95 context = new OfflineAudioContext(2, sampleRate * lengthInSeconds, sampleRat e); |
| 118 createImpulse(); | 96 createImpulse(); |
| 119 | 97 |
| 120 for (var i = 0; i < sampleOffsets.length; ++i) { | 98 for (let i = 0; i < sampleOffsets.length; ++i) { |
| 121 var timeInSeconds = sampleOffsets[i] / sampleRate; | 99 let timeInSeconds = sampleOffsets[i] / sampleRate; |
| 122 playNote(timeInSeconds); | 100 playNote(timeInSeconds); |
| 123 } | 101 } |
| 124 | 102 |
| 125 context.oncomplete = checkSampleAccuracy; | 103 context.startRendering() |
| 126 context.startRendering(); | 104 .then(function (buffer) { |
| 127 } | 105 checkSampleAccuracy(buffer, should); |
| 106 }) | |
| 107 .then(task.done.bind(task));; | |
| 108 }); | |
| 128 | 109 |
| 129 runTest(); | 110 audit.run(); |
| 130 | |
| 131 </script> | 111 </script> |
| 132 | 112 |
| 133 </body> | 113 </body> |
| 134 </html> | 114 </html> |
| OLD | NEW |