Chromium Code Reviews| OLD | NEW | 
|---|---|
| 1 <!doctype html> | 1 <!doctype html> | 
| 2 <html> | 2 <html> | 
| 3 <head> | 3 <head> | 
| 4 <script src="../../resources/testharness.js"></script> | 4 <script src="../../resources/testharness.js"></script> | 
| 5 <script src="../../resources/testharnessreport.js"></script> | 5 <script src="../../resources/testharnessreport.js"></script> | 
| 6 <script src="../resources/audit-util.js"></script> | 6 <script src="../resources/audit-util.js"></script> | 
| 7 <script src="../resources/audio-testing.js"></script> | 7 <script src="../resources/audit.js"></script> | 
| 8 <title>Test Multiple Calls to getFloatFrequencyData</title> | 8 <title>Test Multiple Calls to getFloatFrequencyData</title> | 
| 9 </head> | 9 </head> | 
| 10 | 10 | 
| 11 <body> | 11 <body> | 
| 12 <script> | 12 <script> | 
| 13 var sampleRate = 48000; | 13 var sampleRate = 48000; | 
| 14 // Render enough data to run the test. | 14 // Render enough data to run the test. | 
| 15 var renderFrames = 2*1024; | 15 var renderFrames = 2*1024; | 
| 16 var renderDuration = renderFrames / sampleRate; | 16 var renderDuration = renderFrames / sampleRate; | 
| 17 | 17 | 
| 18 var audit = Audit.createTaskRunner(); | 18 var audit = Audit.createTaskRunner(); | 
| 19 | 19 | 
| 20 audit.defineTask("test", function (done) { | 20 audit.define("test", (task, should) => { | 
| 21 | 21 | 
| 22 var context = new OfflineAudioContext(1, renderFrames, sampleRate); | 22 var context = new OfflineAudioContext(1, renderFrames, sampleRate); | 
| 23 | 23 | 
| 24 // Use sawtooth oscillator as the source because it has quite a bit of h armonic content. | 24 // Use sawtooth oscillator as the source because it has quite a bit of h armonic content. | 
| 25 // Otherwise, the type doesn't really matter. | 25 // Otherwise, the type doesn't really matter. | 
| 26 var osc = context.createOscillator(); | 26 var osc = context.createOscillator(); | 
| 27 osc.type = "sawtooth"; | 27 osc.type = "sawtooth"; | 
| 28 | 28 | 
| 29 // Create an analyser with 256-point FFT. The FFT size doesn't really m atter much. | 29 // Create an analyser with 256-point FFT. The FFT size doesn't really m atter much. | 
| 30 var analyser = context.createAnalyser(); | 30 var analyser = context.createAnalyser(); | 
| 31 analyser.fftSize = 256; | 31 analyser.fftSize = 256; | 
| 32 | 32 | 
| 33 osc.connect(analyser); | 33 osc.connect(analyser); | 
| 34 analyser.connect(context.destination); | 34 analyser.connect(context.destination); | 
| 35 | 35 | 
| 36 var success = true; | 36 var success = true; | 
| 37 | 37 | 
| 38 // Suspend after getting a full analyser frame. (Not really necessary, b ut it's nice that | 38 // Suspend after getting a full analyser frame. (Not really necessary, b ut it's nice that | 
| 39 // the frame doesn't include any initial zeroes. | 39 // the frame doesn't include any initial zeroes. | 
| 40 var suspendFrame = analyser.fftSize; | 40 var suspendFrame = analyser.fftSize; | 
| 41 context.suspend(suspendFrame / sampleRate).then(function () { | 41 context.suspend(suspendFrame / sampleRate).then(function () { | 
| 42 // Test successive calls to getFloatFrequencyData in the same renderin g quantum. | 42 // Test successive calls to getFloatFrequencyData in the same renderin g quantum. | 
| 43 var f1 = new Float32Array(analyser.frequencyBinCount); | 43 let f1 = new Float32Array(analyser.frequencyBinCount); | 
| 44 var f2 = new Float32Array(analyser.frequencyBinCount); | 44 let f2 = new Float32Array(analyser.frequencyBinCount); | 
| 45 | 45 | 
| 46 analyser.getFloatFrequencyData(f1); | 46 analyser.getFloatFrequencyData(f1); | 
| 47 analyser.getFloatFrequencyData(f2); | 47 analyser.getFloatFrequencyData(f2); | 
| 48 | 48 should(f2, "Second call to getFloatFrequencyData") | 
| 49 success = Should("Second call to getFloatFrequencyData", f2, { | 49 .beEqualToArray(f1); | 
| 50 precision: 5 | |
| 51 }).beEqualToArray(f1) && success; | |
| 52 }).then(context.resume.bind(context)); | 50 }).then(context.resume.bind(context)); | 
| 53 | 51 | 
| 54 suspendFrame += 128; | 52 suspendFrame += 128; | 
| 55 context.suspend(suspendFrame / sampleRate).then(function () { | 53 context.suspend(suspendFrame / sampleRate).then(function () { | 
| 56 // Test successive calls to getByteFrequencyData in the same rendering quantum. | 54 // Test successive calls to getByteFrequencyData in the same rendering quantum. | 
| 57 var f1 = new Uint8Array(analyser.frequencyBinCount); | 55 let f1 = new Uint8Array(analyser.frequencyBinCount); | 
| 58 var f2 = new Uint8Array(analyser.frequencyBinCount); | 56 let f2 = new Uint8Array(analyser.frequencyBinCount); | 
| 59 | 57 | 
| 60 analyser.getByteFrequencyData(f1); | 58 analyser.getByteFrequencyData(f1); | 
| 61 analyser.getByteFrequencyData(f2); | 59 analyser.getByteFrequencyData(f2); | 
| 62 | 60 | 
| 63 success = Should("Second call to getByteFrequencyData", f2) | 61 console.log("f1"); | 
| 64 .beEqualToArray(f1) && success; | 62 console.log(f1); | 
| 63 console.log("f2"); | |
| 64 console.log(f2); | |
| 
 
hongchan
2017/03/29 21:07:02
Remove all the console.logs.
 
Raymond Toy
2017/03/29 21:44:31
Heh. This is how I found out beEqualToArray didn't
 
 | |
| 65 should(f2, "Second call to getByteFrequencyData") | |
| 66 .beEqualToArray(f1); | |
| 65 }).then(context.resume.bind(context)); | 67 }).then(context.resume.bind(context)); | 
| 66 | 68 | 
| 67 suspendFrame += 128; | 69 suspendFrame += 128; | 
| 68 context.suspend(suspendFrame / sampleRate).then(function () { | 70 context.suspend(suspendFrame / sampleRate).then(function () { | 
| 69 // Test calls to getFloatFrequencyData followed by getByteFrequencyDat a. The float data, | 71 // Test calls to getFloatFrequencyData followed by getByteFrequencyDat a. The float data, | 
| 70 // when converted to byte values should be identical to the result fro m | 72 // when converted to byte values should be identical to the result fro m | 
| 71 // getByteFrequencyData. | 73 // getByteFrequencyData. | 
| 72 var f1 = new Float32Array(analyser.frequencyBinCount); | 74 let f1 = new Float32Array(analyser.frequencyBinCount); | 
| 73 var f2 = new Uint8Array(analyser.frequencyBinCount); | 75 let f2 = new Uint8Array(analyser.frequencyBinCount); | 
| 74 | 76 | 
| 75 analyser.getFloatFrequencyData(f1); | 77 analyser.getFloatFrequencyData(f1); | 
| 76 analyser.getByteFrequencyData(f2); | 78 analyser.getByteFrequencyData(f2); | 
| 77 | 79 | 
| 78 var byteValuesFromFloat = convertFloatToByte(f1, analyser.minDecibels, analyser.maxDecibels); | 80 var byteValuesFromFloat = convertFloatToByte(f1, analyser.minDecibels, analyser.maxDecibels); | 
| 79 success = Should("Output of getByteFrequencyData after getFloatFrequen cyData", | 81 should(byteValuesFromFloat, "Output of getByteFrequencyData after getF loatFrequencyData") | 
| 80 byteValuesFromFloat) | 82 .beEqualToArray(f2); | 
| 81 .beEqualToArray(f2) && success; | |
| 82 }).then(context.resume.bind(context)); | 83 }).then(context.resume.bind(context)); | 
| 83 | 84 | 
| 84 suspendFrame += 128; | 85 suspendFrame += 128; | 
| 85 context.suspend(suspendFrame / sampleRate).then(function () { | 86 context.suspend(suspendFrame / sampleRate).then(function () { | 
| 86 // Test calls to getByteFrequencyData followed by getFloatFrequencyDat a. The float data, | 87 // Test calls to getByteFrequencyData followed by getFloatFrequencyDat a. The float data, | 
| 87 // when converted to byte values should be identical to the result fro m | 88 // when converted to byte values should be identical to the result fro m | 
| 88 // getByteFrequencyData. | 89 // getByteFrequencyData. | 
| 89 var f1 = new Uint8Array(analyser.frequencyBinCount); | 90 var f1 = new Uint8Array(analyser.frequencyBinCount); | 
| 90 var f2 = new Float32Array(analyser.frequencyBinCount); | 91 var f2 = new Float32Array(analyser.frequencyBinCount); | 
| 91 | 92 | 
| 92 analyser.getByteFrequencyData(f1); | 93 analyser.getByteFrequencyData(f1); | 
| 93 analyser.getFloatFrequencyData(f2); | 94 analyser.getFloatFrequencyData(f2); | 
| 94 | 95 | 
| 95 var byteValuesFromFloat = convertFloatToByte(f2, analyser.minDecibels, analyser.maxDecibels); | 96 var byteValuesFromFloat = convertFloatToByte(f2, analyser.minDecibels, analyser.maxDecibels); | 
| 96 success = Should( | 97 should(f1, | 
| 97 "Output of getFloatFrequenycData (converted to byte) after getByte FrequencyData", | 98 "Output of getFloatFrequenycData (converted to byte) after getByte FrequencyData") | 
| 98 f1) | 99 .beEqualToArray(byteValuesFromFloat); | 
| 99 .beEqualToArray(byteValuesFromFloat) && success; | |
| 100 }).then(context.resume.bind(context)); | 100 }).then(context.resume.bind(context)); | 
| 101 | 101 | 
| 102 osc.start(); | 102 osc.start(); | 
| 103 context.startRendering().then(done); | 103 context.startRendering().then(() => task.done()); | 
| 104 }); | 104 }); | 
| 105 | 105 | 
| 106 audit.defineTask("finish", function (done) { | 106 audit.run(); | 
| 107 done(); | |
| 108 }); | |
| 109 | |
| 110 audit.runTasks(); | |
| 111 | 107 | 
| 112 // Convert the float frequency data (in dB), |floatFreqData|, to byte valu es using the dB | 108 // Convert the float frequency data (in dB), |floatFreqData|, to byte valu es using the dB | 
| 113 // limits |minDecibels| and |maxDecibels|. The new byte array is returned . | 109 // limits |minDecibels| and |maxDecibels|. The new byte array is returned . | 
| 114 function convertFloatToByte(floatFreqData, minDecibels, maxDecibels) { | 110 function convertFloatToByte(floatFreqData, minDecibels, maxDecibels) { | 
| 115 var scale = 255 / (maxDecibels - minDecibels); | 111 var scale = 255 / (maxDecibels - minDecibels); | 
| 116 | 112 | 
| 117 return floatFreqData.map(function (x) { | 113 return floatFreqData.map(function (x) { | 
| 118 var value = Math.floor(scale * (x - minDecibels)); | 114 var value = Math.floor(scale * (x - minDecibels)); | 
| 119 return Math.min(255, Math.max(0, value)); | 115 return Math.min(255, Math.max(0, value)); | 
| 120 }); | 116 }); | 
| 121 } | 117 } | 
| 122 </script> | 118 </script> | 
| 123 </body> | 119 </body> | 
| 124 </html> | 120 </html> | 
| OLD | NEW |