| <!DOCTYPE html> |
| <html> |
| <head> |
| <title>Mixed-Audio Loop Benchmark</title> |
| <style>* { font-family: monospace; }</style> |
| </head> |
| <body> |
| <h1>Mixed-Audio Loop Benchmark </h1> |
| <p> |
| Benchmark measuring how fast we can continuously repeat a short sound |
| clip, while another clip is running in the background. In the ideal |
| scenario we'd have zero latency processing script, seeking back to the |
| beginning of the clip, and resuming audio playback. |
| </p> |
| |
| <button onclick="startTest();">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> |
| // Total time to run the the test is approximately: |
| // TIMES x (shortclip_duration + latency) =~ 50 x (140 + 50) = 9500ms. |
| // The background clip should last long enough till the test is finished. |
| // So a 20sec background clip should be sufficient. |
| var TIMES = 50, averageLatency = 0; |
| |
| function getAndClearElement(id) { |
| var elem = document.getElementById(id); |
| elem.innerText = ''; |
| return elem; |
| } |
| |
| function startTest() { |
| 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'; |
| audio.addEventListener('seeked', onLoop); |
| startTime = window.performance.now(); |
| audio.play(); |
| } |
| |
| startBackgroundClip(); |
| var audio = document.createElement('audio'); |
| audio.addEventListener('canplaythrough', onLoaded); |
| audio.loop = true; |
| audio.src = '../pink_noise_140ms.wav'; |
| |
| function onLoop() { |
| ++loopCount; |
| timesElem.innerText = loopCount + '/' + TIMES; |
| if (loopCount == TIMES) { |
| actualDuration = window.performance.now() - 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); |
| |
| audio.pause(); |
| } |
| } |
| } |
| |
| function startBackgroundClip() { |
| var audio = document.createElement('audio'); |
| audio.src = '../avperf/pink_noise_20s.wav'; |
| audio.play(); |
| } |
| </script> |
| </body> |
| </html> |