Bug 1208371 - Add disconnect method to test helper AudioStreamAnalyser to improve performance on slow devices. r?padenot
MozReview-Commit-ID: 4MYF004uK8R
--- a/dom/media/tests/mochitest/head.js
+++ b/dom/media/tests/mochitest/head.js
@@ -91,16 +91,27 @@ AudioStreamAnalyser.prototype = {
return;
}
this.debugCanvas.stopDrawing = true;
this.debugCanvas.parentElement.removeChild(this.debugCanvas);
},
/**
+ * Disconnects the input stream from our internal analyser node.
+ * Call this to reduce main thread processing, mostly necessary on slow
+ * devices.
+ */
+ disconnect: function() {
+ this.disableDebugCanvas();
+ this.sourceNodes.forEach(n => n.disconnect());
+ this.sourceNodes = [];
+ },
+
+ /**
* Return a Promise, that will be resolved when the function passed as
* argument, when called, returns true (meaning the analysis was a
* success).
*
* @param {function} analysisFunction
* A fonction that performs an analysis, and returns true if the
* analysis was a success (i.e. it found what it was looking for)
*/
--- a/dom/media/tests/mochitest/test_getUserMedia_mediaStreamClone.html
+++ b/dom/media/tests/mochitest/test_getUserMedia_mediaStreamClone.html
@@ -139,54 +139,58 @@
array[analyser.binIndexForFrequency(50)] < 50 &&
// WebAudioDestination streams do not handle stop()
// XXX Should they? Plan to resolve that in bug 1208384.
// array[analyser.binIndexForFrequency(1000)] < 50 &&
array[analyser.binIndexForFrequency(3000)] < 50 &&
// array[analyser.binIndexForFrequency(5000)] < 50 &&
array[analyser.binIndexForFrequency(10000)] < 50);
})
+ .then(() => analyser.disconnect());
}).then(() => {
info("Analysing audio output of stream clone (1k + 5k)");
var stream = new MediaStream();
stream.addTrack(audioTrack1kClone);
stream.addTrack(audioTrack5kClone);
var analyser = new AudioStreamAnalyser(ac, stream);
return analyser.waitForAnalysisSuccess(array =>
array[analyser.binIndexForFrequency(50)] < 50 &&
array[analyser.binIndexForFrequency(1000)] > 200 &&
array[analyser.binIndexForFrequency(3000)] < 50 &&
array[analyser.binIndexForFrequency(5000)] > 200 &&
- array[analyser.binIndexForFrequency(10000)] < 50);
+ array[analyser.binIndexForFrequency(10000)] < 50)
+ .then(() => analyser.disconnect());
}).then(() => {
info("Analysing audio output of clone of clone (1k + 5k)");
var stream = new MediaStream([audioTrack1kClone, audioTrack5kClone]).clone();
var analyser = new AudioStreamAnalyser(ac, stream);
return analyser.waitForAnalysisSuccess(array =>
array[analyser.binIndexForFrequency(50)] < 50 &&
array[analyser.binIndexForFrequency(1000)] > 200 &&
array[analyser.binIndexForFrequency(3000)] < 50 &&
array[analyser.binIndexForFrequency(5000)] > 200 &&
- array[analyser.binIndexForFrequency(10000)] < 50);
+ array[analyser.binIndexForFrequency(10000)] < 50)
+ .then(() => analyser.disconnect());
}).then(() => {
info("Analysing audio output of clone() + addTrack()ed tracks (1k + 5k)");
var stream =
new MediaStream(new MediaStream([ audioTrack1kClone
, audioTrack5kClone
]).clone().getTracks());
var analyser = new AudioStreamAnalyser(ac, stream);
return analyser.waitForAnalysisSuccess(array =>
array[analyser.binIndexForFrequency(50)] < 50 &&
array[analyser.binIndexForFrequency(1000)] > 200 &&
array[analyser.binIndexForFrequency(3000)] < 50 &&
array[analyser.binIndexForFrequency(5000)] > 200 &&
- array[analyser.binIndexForFrequency(10000)] < 50);
+ array[analyser.binIndexForFrequency(10000)] < 50)
+ .then(() => analyser.disconnect());
}).then(() => {
info("Analysing audio output of clone()d tracks in original stream (1k) " +
"and clone()d tracks in stream clone (5k)");
var stream = new MediaStream([audioTrack1kClone, audioTrack5kClone]);
var streamClone = stream.clone();
stream.getTracks().forEach(t => stream.removeTrack(t));
stream.addTrack(streamClone.getTracks()[0]);
@@ -194,22 +198,24 @@
var analyser = new AudioStreamAnalyser(ac, stream);
return analyser.waitForAnalysisSuccess(array =>
array[analyser.binIndexForFrequency(50)] < 50 &&
array[analyser.binIndexForFrequency(1000)] > 200 &&
array[analyser.binIndexForFrequency(3000)] < 50 &&
array[analyser.binIndexForFrequency(5000)] < 50)
.then(() => {
+ analyser.disconnect();
var cloneAnalyser = new AudioStreamAnalyser(ac, streamClone);
return cloneAnalyser.waitForAnalysisSuccess(array =>
array[cloneAnalyser.binIndexForFrequency(1000)] < 50 &&
array[cloneAnalyser.binIndexForFrequency(3000)] < 50 &&
array[cloneAnalyser.binIndexForFrequency(5000)] > 200 &&
- array[cloneAnalyser.binIndexForFrequency(10000)] < 50);
+ array[cloneAnalyser.binIndexForFrequency(10000)] < 50)
+ .then(() => cloneAnalyser.disconnect());
});
}).then(() => {
info("Analysing audio output enabled and disabled tracks that don't affect each other");
var stream = new MediaStream([audioTrack1kClone, audioTrack5kClone]);
var clone = stream.clone();
stream.getTracks()[0].enabled = true;
stream.getTracks()[1].enabled = false;
@@ -219,22 +225,24 @@
var analyser = new AudioStreamAnalyser(ac, stream);
return analyser.waitForAnalysisSuccess(array =>
array[analyser.binIndexForFrequency(50)] < 50 &&
array[analyser.binIndexForFrequency(1000)] > 200 &&
array[analyser.binIndexForFrequency(3000)] < 50 &&
array[analyser.binIndexForFrequency(5000)] < 50)
.then(() => {
+ analyser.disconnect();
var cloneAnalyser = new AudioStreamAnalyser(ac, clone);
return cloneAnalyser.waitForAnalysisSuccess(array =>
array[cloneAnalyser.binIndexForFrequency(1000)] < 50 &&
array[cloneAnalyser.binIndexForFrequency(3000)] < 50 &&
array[cloneAnalyser.binIndexForFrequency(5000)] > 200 &&
- array[cloneAnalyser.binIndexForFrequency(10000)] < 50);
+ array[cloneAnalyser.binIndexForFrequency(10000)] < 50)
+ .then(() => cloneAnalyser.disconnect());
})
// Restore original tracks
.then(() => stream.getTracks().forEach(t => t.enabled = true));
});
}));
</script>
</pre>
</body>
--- a/dom/media/tests/mochitest/test_getUserMedia_mediaStreamConstructors.html
+++ b/dom/media/tests/mochitest/test_getUserMedia_mediaStreamConstructors.html
@@ -91,43 +91,47 @@
return Promise.resolve().then(() => {
info("Analysing audio output with empty default constructed stream");
var stream = new MediaStream();
var analyser = new AudioStreamAnalyser(audioContext, stream);
return analyser.waitForAnalysisSuccess(array =>
array[analyser.binIndexForFrequency(1000)] < 50 &&
array[analyser.binIndexForFrequency(5000)] < 50 &&
- array[analyser.binIndexForFrequency(10000)] < 50);
+ array[analyser.binIndexForFrequency(10000)] < 50)
+ .then(() => analyser.disconnect());
}).then(() => {
info("Analysing audio output with copy constructed 5k stream");
var stream = new MediaStream(osc5k);
var analyser = new AudioStreamAnalyser(audioContext, stream);
return analyser.waitForAnalysisSuccess(array =>
array[analyser.binIndexForFrequency(1000)] < 50 &&
array[analyser.binIndexForFrequency(5000)] > 200 &&
- array[analyser.binIndexForFrequency(10000)] < 50);
+ array[analyser.binIndexForFrequency(10000)] < 50)
+ .then(() => analyser.disconnect());
}).then(() => {
info("Analysing audio output with empty-list constructed stream");
var stream = new MediaStream([]);
var analyser = new AudioStreamAnalyser(audioContext, stream);
return analyser.waitForAnalysisSuccess(array =>
array[analyser.binIndexForFrequency(1000)] < 50 &&
array[analyser.binIndexForFrequency(5000)] < 50 &&
- array[analyser.binIndexForFrequency(10000)] < 50);
+ array[analyser.binIndexForFrequency(10000)] < 50)
+ .then(() => analyser.disconnect());
}).then(() => {
info("Analysing audio output with list constructed 1k, 5k and 10k tracks");
var stream = new MediaStream([audioTrack1k, audioTrack5k, audioTrack10k]);
var analyser = new AudioStreamAnalyser(audioContext, stream);
return analyser.waitForAnalysisSuccess(array =>
array[analyser.binIndexForFrequency(50)] < 50 &&
array[analyser.binIndexForFrequency(1000)] > 200 &&
array[analyser.binIndexForFrequency(2500)] < 50 &&
array[analyser.binIndexForFrequency(5000)] > 200 &&
array[analyser.binIndexForFrequency(7500)] < 50 &&
array[analyser.binIndexForFrequency(10000)] > 200 &&
- array[analyser.binIndexForFrequency(11000)] < 50);
+ array[analyser.binIndexForFrequency(11000)] < 50)
+ .then(() => analyser.disconnect());
});
}));
</script>
</pre>
</body>
</html>
--- a/dom/media/tests/mochitest/test_getUserMedia_mediaStreamTrackClone.html
+++ b/dom/media/tests/mochitest/test_getUserMedia_mediaStreamTrackClone.html
@@ -103,54 +103,57 @@
return analyser.waitForAnalysisSuccess(array =>
array[analyser.binIndexForFrequency(50)] < 50 &&
// WebAudioDestination streams do not handle stop()
// XXX Should they? Plan to resolve that in bug 1208384.
// array[analyser.binIndexForFrequency(1000)] < 50 &&
array[analyser.binIndexForFrequency(3000)] < 50 &&
// array[analyser.binIndexForFrequency(5000)] < 50 &&
array[analyser.binIndexForFrequency(10000)] < 50);
- });
+ }).then(() => analyser.disconnect());
}).then(() => {
info("Analysing audio output of clones of clones (1kx2 + 5kx5)");
var stream = new MediaStream([audioTrack1kClone.clone(),
audioTrack5kClone.clone().clone().clone().clone()]);
var analyser = new AudioStreamAnalyser(ac, stream);
return analyser.waitForAnalysisSuccess(array =>
array[analyser.binIndexForFrequency(50)] < 50 &&
array[analyser.binIndexForFrequency(1000)] > 200 &&
array[analyser.binIndexForFrequency(3000)] < 50 &&
array[analyser.binIndexForFrequency(5000)] > 200 &&
- array[analyser.binIndexForFrequency(10000)] < 50);
+ array[analyser.binIndexForFrequency(10000)] < 50)
+ .then(() => analyser.disconnect());
}).then(() => {
info("Analysing audio output enabled and disabled tracks that don't affect each other");
audioTrack1kOriginal.enabled = true;
audioTrack5kOriginal.enabled = false;
audioTrack1kClone.enabled = false;
audioTrack5kClone.enabled = true;
var analyser =
new AudioStreamAnalyser(ac, new MediaStream([audioTrack1kOriginal,
audioTrack5kOriginal]));
return analyser.waitForAnalysisSuccess(array =>
array[analyser.binIndexForFrequency(50)] < 50 &&
array[analyser.binIndexForFrequency(1000)] > 200 &&
array[analyser.binIndexForFrequency(3000)] < 50 &&
- array[analyser.binIndexForFrequency(5000)] < 50);
+ array[analyser.binIndexForFrequency(5000)] < 50)
+ .then(() => analyser.disconnect())
.then(() => {
var cloneAnalyser =
new AudioStreamAnalyser(ac, new MediaStream([audioTrack1kClone,
audioTrack5kClone]));
return cloneAnalyser.waitForAnalysisSuccess(array =>
array[cloneAnalyser.binIndexForFrequency(1000)] < 50 &&
array[cloneAnalyser.binIndexForFrequency(3000)] < 50 &&
array[cloneAnalyser.binIndexForFrequency(5000)] > 200 &&
- array[cloneAnalyser.binIndexForFrequency(10000)] < 50);
+ array[cloneAnalyser.binIndexForFrequency(10000)] < 50)
+ .then(() => cloneAnalyser.disconnect());
})
// Restore original tracks
.then(() => [audioTrack1kOriginal,
audioTrack5kOriginal,
audioTrack1kClone,
audioTrack5kClone].forEach(t => t.enabled = true));
});
}));