Bug 1208371 - Add disconnect method to test helper AudioStreamAnalyser to improve performance on slow devices. r?padenot draft
authorAndreas Pehrson <pehrsons@gmail.com>
Tue, 05 Jan 2016 10:16:32 +0800
changeset 342162 88eb2907e497528f3d13833782ae4986146f6fdd
parent 342161 8d33b3ab5ce16ebe13985cd2c698fc04c4891258
child 342163 f338639b37cf3371012436f1f9ad163b37719f36
push id13352
push userpehrsons@gmail.com
push dateFri, 18 Mar 2016 13:49:47 +0000
reviewerspadenot
bugs1208371
milestone47.0a1
Bug 1208371 - Add disconnect method to test helper AudioStreamAnalyser to improve performance on slow devices. r?padenot MozReview-Commit-ID: 4MYF004uK8R
dom/media/tests/mochitest/head.js
dom/media/tests/mochitest/test_getUserMedia_mediaStreamClone.html
dom/media/tests/mochitest/test_getUserMedia_mediaStreamConstructors.html
dom/media/tests/mochitest/test_getUserMedia_mediaStreamTrackClone.html
--- 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));
       });
     }));