Index: chrome/test/data/media/html/audio_latency_perf.html |
diff --git a/chrome/test/data/media/html/audio_latency_perf.html b/chrome/test/data/media/html/audio_latency_perf.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..41ada7ad1335e1a5f62dde8ff84831a96ccf3acd |
--- /dev/null |
+++ b/chrome/test/data/media/html/audio_latency_perf.html |
@@ -0,0 +1,108 @@ |
+<html> |
scherkus (not reviewing)
2012/05/21 21:08:26
<!DOCTYPE html>
DaleCurtis
2012/05/21 22:22:01
Done.
|
+ <head> |
+ <title>Audio Loop Benchmark</title> |
+ <style>* { font-family: monospace; }</style> |
+ </head> |
+ <body> |
+ <h1>Audio Loop Benchmark</h1> |
+ <p> |
+ Benchmark measuring how fast we can continuously repeat a short sound |
+ clip. In the ideal scenario we'd have zero latency processing script, |
+ seeking back to the beginning of the clip, and resuming audio playback. |
+ </p> |
+ <p> |
+ Using the loop attribute will avoid involving script to seek back to the |
+ beginning of the clip, but testing reveals it isn't adding to latency. |
+ </p> |
+ |
+ <input id="loop" type="checkbox" />Use loop attribute |
scherkus (not reviewing)
2012/05/21 21:08:26
I'd either:
a) Remove loop related stuff
b) Ha
DaleCurtis
2012/05/21 22:22:01
Done. Made loop the default, cleaned up resulting
|
+ <button onclick="startTest(document.getElementById('loop').checked);">Start</button> |
+ |
+ <p> |
+ Times Played: <span id="times"></span></span><br> |
+ Clip Duration: <span id="clip"></span></span><br> |
+ Ideal Duration: <span id="ideal"></span><br> |
+ Actual Duration: <span id="actual"></span><br> |
+ Average Latency: <span id="average"></span><br> |
+ </p> |
+ |
+ <script> |
+ var TIMES = 50, averageLatency = 0; |
+ |
+ function getAndClearElement(id) { |
+ var elem = document.getElementById(id); |
+ elem.innerText = ''; |
+ return elem; |
+ } |
+ |
+ function startTest(use_loop) { |
+ var timesElem = getAndClearElement('times'); |
+ var clipElem = getAndClearElement('clip'); |
+ var idealElem = getAndClearElement('ideal'); |
+ var actualElem = getAndClearElement('actual'); |
+ var averageElem = getAndClearElement('average'); |
+ var buttonElem = document.querySelector('button'); |
+ |
+ var loopCount = 0, idealDuration = 0, actualDuration = 0; |
+ var startTime; |
+ |
+ buttonElem.disabled = true; |
+ |
+ function onLoaded() { |
+ idealDuration = Math.round(audio.duration * TIMES * 1000, 0); |
+ idealElem.innerText = idealDuration + ' ms'; |
+ clipElem.innerText = Math.round(audio.duration * 1000, 0) + ' ms'; |
+ |
+ if (use_loop) { |
+ audio.addEventListener('seeked', onLoop); |
+ audio.loop = true; |
+ } else { |
+ audio.addEventListener('ended', onEnded); |
+ audio.addEventListener('seeked', onSeeked); |
+ } |
+ startTime = new Date(); |
+ audio.play(); |
+ } |
+ |
+ var audio = document.createElement('audio'); |
+ audio.addEventListener('canplaythrough', onLoaded); |
+ audio.src = '../pink_noise_140ms.wav'; |
+ |
+ function isTestDone() { |
+ ++loopCount; |
+ timesElem.innerText = loopCount + '/' + TIMES; |
+ if (loopCount == TIMES) { |
+ actualDuration = new Date() - startTime; |
+ actualElem.innerText = actualDuration + ' ms'; |
+ buttonElem.disabled = false; |
+ |
+ averageLatency = (actualDuration - idealDuration) / loopCount; |
+ averageElem.innerText = averageLatency + ' ms'; |
+ |
+ // Let the PyAuto test know we're done testing. |
+ if (window.domAutomationController) |
+ window.domAutomationController.send(true); |
+ |
+ return true; |
+ } |
+ |
+ return false; |
+ } |
+ |
+ function onEnded() { |
+ if (!isTestDone()) |
+ audio.currentTime = 0; |
+ } |
+ |
+ function onSeeked() { |
+ audio.play(); |
+ } |
+ |
+ function onLoop() { |
+ if (isTestDone()) |
+ audio.pause(); |
+ } |
+ } |
+ </script> |
+ </body> |
+</html> |