Index: content/test/data/media/webrtc_test_audio.js |
diff --git a/content/test/data/media/webrtc_test_audio.js b/content/test/data/media/webrtc_test_audio.js |
index 1e69211d961dd1c7c69e5ab6fe5a3fc6e189eae1..836862d069f1deedf9d1744f26e1eff94dec7505 100644 |
--- a/content/test/data/media/webrtc_test_audio.js |
+++ b/content/test/data/media/webrtc_test_audio.js |
@@ -15,8 +15,7 @@ var MAX_AUDIO_OUTPUT_ENERGY = 32768; |
function ensureAudioPlaying(peerConnection, beLenient) { |
addExpectedEvent(); |
- // Gather 50 samples per second for 2 seconds. |
- gatherAudioLevelSamples(peerConnection, 100, 50, function(samples) { |
+ gatherAudioLevelSamples(peerConnection, 3 * 1000, function(samples) { |
identifyFakeDeviceSignal_(samples, beLenient); |
eventOccured(); |
}); |
@@ -27,7 +26,7 @@ function ensureAudioPlaying(peerConnection, beLenient) { |
function ensureSilence(peerConnection) { |
addExpectedEvent(); |
setTimeout(function() { |
- gatherAudioLevelSamples(peerConnection, 100, 50, function(samples) { |
+ gatherAudioLevelSamples(peerConnection, 1 * 1000, function(samples) { |
identifySilence_(samples); |
eventOccured(); |
}); |
@@ -48,32 +47,38 @@ function workAroundSeveralReportsIssue(audioOutputLevels) { |
return Math.max(audioOutputLevels[0], audioOutputLevels[1]); |
} |
-// Gathers |numSamples| samples at |frequency| number of times per second and |
-// calls back |callback| with an array with numbers in the [0, 32768] range. |
-function gatherAudioLevelSamples(peerConnection, numSamples, frequency, |
- callback) { |
- console.log('Gathering ' + numSamples + ' audio samples...'); |
+// Gathers samples from WebRTC stats as fast as possible for |durationMs| |
+// milliseconds and calls back |callback| with an array with numbers in the |
+// [0, 32768] range. There are no guarantees for how often we will be able to |
+// collect values, but this function deliberately avoids setTimeout calls in |
+// order be as insensitive as possible to starvation (particularly when this |
+// code runs in parallel with other tests on a heavily loaded bot). |
+function gatherAudioLevelSamples(peerConnection, durationMs, callback) { |
+ console.log('Gathering audio samples for ' + durationMs + ' milliseconds...'); |
var audioLevelSamples = [] |
// If this times out and never found any audio output levels, the call |
// probably doesn't have an audio stream. |
- var gatherSamples = setInterval(function() { |
- peerConnection.getStats(function(response) { |
- audioOutputLevels = getAudioLevelFromStats_(response); |
- if (audioOutputLevels.length == 0) { |
- // The call probably isn't up yet. |
- return; |
- } |
- var outputLevel = workAroundSeveralReportsIssue(audioOutputLevels); |
- audioLevelSamples.push(outputLevel); |
- |
- if (audioLevelSamples.length == numSamples) { |
- console.log('Gathered all samples.'); |
- clearInterval(gatherSamples); |
- callback(audioLevelSamples); |
- } |
- }); |
- }, 1000 / frequency); |
+ var startTime = new Date(); |
+ var gotStats = function(response) { |
+ audioOutputLevels = getAudioLevelFromStats_(response); |
+ if (audioOutputLevels.length == 0) { |
+ // The call probably isn't up yet. |
+ peerConnection.getStats(gotStats); |
+ return; |
+ } |
+ var outputLevel = workAroundSeveralReportsIssue(audioOutputLevels); |
+ audioLevelSamples.push(outputLevel); |
+ |
+ var elapsed = new Date() - startTime; |
+ if (elapsed > durationMs) { |
+ console.log('Gathered all samples.'); |
+ callback(audioLevelSamples); |
+ return; |
+ } |
+ peerConnection.getStats(gotStats); |
+ } |
+ peerConnection.getStats(gotStats); |
} |
/** |
@@ -96,7 +101,7 @@ function identifyFakeDeviceSignal_(samples, beLenient) { |
var currentlyOverThreshold = false; |
// Detect when we have been been over the threshold and is going back again |
- // (i.e. count peaks). We should see about one peak per second. |
+ // (i.e. count peaks). We should see about two peaks per second. |
for (var i = 0; i < samples.length; ++i) { |
if (currentlyOverThreshold && samples[i] < threshold) |
numPeaks++; |