--- a/dom/media/tests/mochitest/test_getUserMedia_mediaStreamClone.html
+++ b/dom/media/tests/mochitest/test_getUserMedia_mediaStreamClone.html
@@ -15,241 +15,245 @@ createHTML({
runTest(async () => {
await pushPrefs(
["media.getusermedia.camera.stop_on_disable.enabled", true],
["media.getusermedia.camera.stop_on_disable.delay_ms", 0],
["media.getusermedia.microphone.stop_on_disable.enabled", true],
["media.getusermedia.microphone.stop_on_disable.delay_ms", 0]);
- let stream = await getUserMedia({audio: true, video: true});
- info("Test clone()ing an audio/video gUM stream");
- let clone = stream.clone();
+ let gUMStream = await getUserMedia({audio: true, video: true});
+ {
+ info("Test clone()ing an audio/video gUM stream");
+ let clone = gUMStream.clone();
- checkMediaStreamCloneAgainstOriginal(clone, stream);
- checkMediaStreamTrackCloneAgainstOriginal(clone.getAudioTracks()[0],
- stream.getAudioTracks()[0]);
- checkMediaStreamTrackCloneAgainstOriginal(clone.getVideoTracks()[0],
- stream.getVideoTracks()[0]);
+ checkMediaStreamCloneAgainstOriginal(clone, gUMStream);
+ checkMediaStreamTrackCloneAgainstOriginal(clone.getAudioTracks()[0],
+ gUMStream.getAudioTracks()[0]);
+ checkMediaStreamTrackCloneAgainstOriginal(clone.getVideoTracks()[0],
+ gUMStream.getVideoTracks()[0]);
- isnot(clone.id.length, 0, "Stream clone should have an id string");
- isnot(clone.getAudioTracks()[0].id.length, 0,
- "Audio track clone should have an id string");
- isnot(clone.getVideoTracks()[0].id.length, 0,
- "Audio track clone should have an id string");
+ isnot(clone.id.length, 0, "Stream clone should have an id string");
+ isnot(clone.getAudioTracks()[0].id.length, 0,
+ "Audio track clone should have an id string");
+ isnot(clone.getVideoTracks()[0].id.length, 0,
+ "Audio track clone should have an id string");
- info("Stopping original tracks");
- stream.getTracks().forEach(t => t.stop());
-
- info("Playing from track clones");
- let test = createMediaElement('video', 'testClonePlayback');
- let playback = new MediaStreamPlayback(test, clone);
- await playback.playMedia(false);
-
+ info("Playing from track clones");
+ let test = createMediaElement('video', 'testClonePlayback');
+ let playback = new MediaStreamPlayback(test, clone);
+ await playback.playMedia(false);
+ }
- stream = await getUserMedia({video: true});
- let otherStream = await getUserMedia({video: true});
- info("Test addTrack()ing a video track to a stream without affecting its clone");
- let track = stream.getTracks()[0];
- let otherTrack = otherStream.getTracks()[0];
+ {
+ info("Test addTrack()ing a video track to a stream without affecting its clone");
+ let stream = new MediaStream(gUMStream.getVideoTracks());
+ let otherStream = await getUserMedia({video: true});
+ let track = stream.getTracks()[0];
+ let otherTrack = otherStream.getTracks()[0];
- let streamClone = stream.clone();
- let trackClone = streamClone.getTracks()[0];
- checkMediaStreamContains(streamClone, [trackClone], "Initial clone");
+ let streamClone = stream.clone();
+ let trackClone = streamClone.getTracks()[0];
+ checkMediaStreamContains(streamClone, [trackClone], "Initial clone");
- stream.addTrack(otherTrack);
- checkMediaStreamContains(stream, [track, otherTrack],
- "Added video to original");
- checkMediaStreamContains(streamClone, [trackClone],
- "Clone not affected");
+ stream.addTrack(otherTrack);
+ checkMediaStreamContains(stream, [track, otherTrack],
+ "Added video to original");
+ checkMediaStreamContains(streamClone, [trackClone],
+ "Clone not affected");
- stream.removeTrack(track);
- streamClone.addTrack(track);
- checkMediaStreamContains(streamClone, [trackClone, track],
- "Added video to clone");
- checkMediaStreamContains(stream, [otherTrack],
- "Original not affected");
+ stream.removeTrack(track);
+ streamClone.addTrack(track);
+ checkMediaStreamContains(streamClone, [trackClone, track],
+ "Added video to clone");
+ checkMediaStreamContains(stream, [otherTrack],
+ "Original not affected");
- // Not part of streamClone. Does not get stopped by the playback test.
- otherTrack.stop();
- otherStream.stop();
+ // Not part of streamClone. Does not get stopped by the playback test.
+ otherTrack.stop();
+ otherStream.stop();
+
+ let test = createMediaElement('video', 'testClonePlayback');
+ let playback = new MediaStreamPlayback(test, streamClone);
+ await playback.playMedia(false);
+ }
- test = createMediaElement('video', 'testClonePlayback');
- playback = new MediaStreamPlayback(test, streamClone);
- await playback.playMedia(false);
- stream.getTracks().forEach(t => t.stop());
- stream.stop();
-
+ {
+ info("Test cloning a stream into inception");
+ let stream = gUMStream.clone()
+ let clone = stream;
+ let clones = Array(10).fill().map(() => clone = clone.clone());
+ let inceptionClone = clones.pop();
+ checkMediaStreamCloneAgainstOriginal(inceptionClone, stream);
+ stream.getTracks().forEach(t => (stream.removeTrack(t),
+ inceptionClone.addTrack(t)));
+ is(inceptionClone.getAudioTracks().length, 2,
+ "The inception clone should contain the original audio track and a track clone");
+ is(inceptionClone.getVideoTracks().length, 2,
+ "The inception clone should contain the original video track and a track clone");
- stream = await getUserMedia({audio: true, video: true});
- info("Test cloning a stream into inception");
- clone = stream;
- let clones = Array(10).fill().map(() => clone = clone.clone());
- let inceptionClone = clones.pop();
- checkMediaStreamCloneAgainstOriginal(inceptionClone, stream);
- stream.getTracks().forEach(t => (stream.removeTrack(t),
- inceptionClone.addTrack(t)));
- is(inceptionClone.getAudioTracks().length, 2,
- "The inception clone should contain the original audio track and a track clone");
- is(inceptionClone.getVideoTracks().length, 2,
- "The inception clone should contain the original video track and a track clone");
+ let test = createMediaElement('video', 'testClonePlayback');
+ let playback = new MediaStreamPlayback(test, inceptionClone);
+ await playback.playMedia(false);
+ clones.forEach(c => c.getTracks().forEach(t => t.stop()));
+ stream.getTracks().forEach(t => t.stop());
+ }
- test = createMediaElement('video', 'testClonePlayback');
- playback = new MediaStreamPlayback(test, inceptionClone);
- await playback.playMedia(false);
- clones.forEach(c => c.getTracks().forEach(t => t.stop()));
-
-
- stream = await getUserMedia({audio: true, video: true});
- info("Test adding tracks from many stream clones to the original stream");
+ {
+ info("Test adding tracks from many stream clones to the original stream");
+ let stream = gUMStream.clone();
- const LOOPS = 3;
- for (let i = 0; i < LOOPS; i++) {
- stream.clone().getTracks().forEach(t => stream.addTrack(t));
- }
- is(stream.getAudioTracks().length, Math.pow(2, LOOPS),
- "The original track should contain the original audio track and all the audio clones");
- is(stream.getVideoTracks().length, Math.pow(2, LOOPS),
- "The original track should contain the original video track and all the video clones");
- stream.getTracks().forEach(t1 => is(stream.getTracks()
- .filter(t2 => t1.id == t2.id)
- .length,
- 1, "Each track should be unique"));
+ const LOOPS = 3;
+ for (let i = 0; i < LOOPS; i++) {
+ stream.clone().getTracks().forEach(t => stream.addTrack(t));
+ }
+ is(stream.getAudioTracks().length, Math.pow(2, LOOPS),
+ "The original track should contain the original audio track and all the audio clones");
+ is(stream.getVideoTracks().length, Math.pow(2, LOOPS),
+ "The original track should contain the original video track and all the video clones");
+ stream.getTracks().forEach(t1 => is(stream.getTracks()
+ .filter(t2 => t1.id == t2.id)
+ .length,
+ 1, "Each track should be unique"));
- test = createMediaElement('video', 'testClonePlayback');
- playback = new MediaStreamPlayback(test, stream);
- await playback.playMedia(false);
+ let test = createMediaElement('video', 'testClonePlayback');
+ let playback = new MediaStreamPlayback(test, stream);
+ await playback.playMedia(false);
+ }
-
- info("Testing audio content routing with MediaStream.clone()");
- let ac = new AudioContext();
+ {
+ info("Testing audio content routing with MediaStream.clone()");
+ let ac = new AudioContext();
- let osc1kOriginal = createOscillatorStream(ac, 1000);
- let audioTrack1kOriginal = osc1kOriginal.getTracks()[0];
- let audioTrack1kClone = osc1kOriginal.clone().getTracks()[0];
+ let osc1kOriginal = createOscillatorStream(ac, 1000);
+ let audioTrack1kOriginal = osc1kOriginal.getTracks()[0];
+ let audioTrack1kClone = osc1kOriginal.clone().getTracks()[0];
- let osc5kOriginal = createOscillatorStream(ac, 5000);
- let audioTrack5kOriginal = osc5kOriginal.getTracks()[0];
- let audioTrack5kClone = osc5kOriginal.clone().getTracks()[0];
+ let osc5kOriginal = createOscillatorStream(ac, 5000);
+ let audioTrack5kOriginal = osc5kOriginal.getTracks()[0];
+ let audioTrack5kClone = osc5kOriginal.clone().getTracks()[0];
+
+ info("Analysing audio output of original stream (1k + 5k)");
+ let stream = new MediaStream();
+ stream.addTrack(audioTrack1kOriginal);
+ stream.addTrack(audioTrack5kOriginal);
- info("Analysing audio output of original stream (1k + 5k)");
- stream = new MediaStream();
- stream.addTrack(audioTrack1kOriginal);
- stream.addTrack(audioTrack5kOriginal);
+ let analyser = new AudioStreamAnalyser(ac, stream);
+ await 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);
- let analyser = new AudioStreamAnalyser(ac, stream);
- await 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);
+ info("Waiting for original tracks to stop");
+ stream.getTracks().forEach(t => t.stop());
+ await 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);
+ analyser.disconnect();
- info("Waiting for original tracks to stop");
- stream.getTracks().forEach(t => t.stop());
- await 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);
- analyser.disconnect();
+ info("Analysing audio output of stream clone (1k + 5k)");
+ stream = new MediaStream();
+ stream.addTrack(audioTrack1kClone);
+ stream.addTrack(audioTrack5kClone);
- info("Analysing audio output of stream clone (1k + 5k)");
- stream = new MediaStream();
- stream.addTrack(audioTrack1kClone);
- stream.addTrack(audioTrack5kClone);
+ analyser = new AudioStreamAnalyser(ac, stream);
+ await 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);
+ analyser.disconnect();
- analyser = new AudioStreamAnalyser(ac, stream);
- await 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);
- analyser.disconnect();
+ info("Analysing audio output of clone of clone (1k + 5k)");
+ stream = new MediaStream([audioTrack1kClone, audioTrack5kClone]).clone();
- info("Analysing audio output of clone of clone (1k + 5k)");
- stream = new MediaStream([audioTrack1kClone, audioTrack5kClone]).clone();
+ analyser = new AudioStreamAnalyser(ac, stream);
+ await 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);
+ analyser.disconnect();
- analyser = new AudioStreamAnalyser(ac, stream);
- await 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);
- analyser.disconnect();
-
- info("Analysing audio output of clone() + addTrack()ed tracks (1k + 5k)");
- stream = new MediaStream(new MediaStream([ audioTrack1kClone
- , audioTrack5kClone
- ]).clone().getTracks());
+ info("Analysing audio output of clone() + addTrack()ed tracks (1k + 5k)");
+ stream = new MediaStream(new MediaStream([ audioTrack1kClone
+ , audioTrack5kClone
+ ]).clone().getTracks());
- analyser = new AudioStreamAnalyser(ac, stream);
- await 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);
- analyser.disconnect();
+ analyser = new AudioStreamAnalyser(ac, stream);
+ await 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);
+ analyser.disconnect();
- info("Analysing audio output of clone()d tracks in original stream (1k) " +
- "and clone()d tracks in stream clone (5k)");
- stream = new MediaStream([audioTrack1kClone, audioTrack5kClone]);
- streamClone = stream.clone();
+ info("Analysing audio output of clone()d tracks in original stream (1k) " +
+ "and clone()d tracks in stream clone (5k)");
+ stream = new MediaStream([audioTrack1kClone, audioTrack5kClone]);
+ let streamClone = stream.clone();
- stream.getTracks().forEach(t => stream.removeTrack(t));
- stream.addTrack(streamClone.getTracks()[0]);
- streamClone.removeTrack(streamClone.getTracks()[0]);
+ stream.getTracks().forEach(t => stream.removeTrack(t));
+ stream.addTrack(streamClone.getTracks()[0]);
+ streamClone.removeTrack(streamClone.getTracks()[0]);
- analyser = new AudioStreamAnalyser(ac, stream);
- await analyser.waitForAnalysisSuccess(array =>
- array[analyser.binIndexForFrequency(50)] < 50 &&
- array[analyser.binIndexForFrequency(1000)] > 200 &&
- array[analyser.binIndexForFrequency(3000)] < 50 &&
- array[analyser.binIndexForFrequency(5000)] < 50);
- analyser.disconnect();
+ analyser = new AudioStreamAnalyser(ac, stream);
+ await analyser.waitForAnalysisSuccess(array =>
+ array[analyser.binIndexForFrequency(50)] < 50 &&
+ array[analyser.binIndexForFrequency(1000)] > 200 &&
+ array[analyser.binIndexForFrequency(3000)] < 50 &&
+ array[analyser.binIndexForFrequency(5000)] < 50);
+ analyser.disconnect();
- let cloneAnalyser = new AudioStreamAnalyser(ac, streamClone);
- await cloneAnalyser.waitForAnalysisSuccess(array =>
- array[cloneAnalyser.binIndexForFrequency(1000)] < 50 &&
- array[cloneAnalyser.binIndexForFrequency(3000)] < 50 &&
- array[cloneAnalyser.binIndexForFrequency(5000)] > 200 &&
- array[cloneAnalyser.binIndexForFrequency(10000)] < 50);
- cloneAnalyser.disconnect();
+ let cloneAnalyser = new AudioStreamAnalyser(ac, streamClone);
+ await cloneAnalyser.waitForAnalysisSuccess(array =>
+ array[cloneAnalyser.binIndexForFrequency(1000)] < 50 &&
+ array[cloneAnalyser.binIndexForFrequency(3000)] < 50 &&
+ array[cloneAnalyser.binIndexForFrequency(5000)] > 200 &&
+ array[cloneAnalyser.binIndexForFrequency(10000)] < 50);
+ cloneAnalyser.disconnect();
- info("Analysing audio output enabled and disabled tracks that don't affect each other");
- stream = new MediaStream([audioTrack1kClone, audioTrack5kClone]);
- clone = stream.clone();
+ info("Analysing audio output enabled and disabled tracks that don't affect each other");
+ stream = new MediaStream([audioTrack1kClone, audioTrack5kClone]);
+ let clone = stream.clone();
- stream.getTracks()[0].enabled = true;
- stream.getTracks()[1].enabled = false;
+ stream.getTracks()[0].enabled = true;
+ stream.getTracks()[1].enabled = false;
- clone.getTracks()[0].enabled = false;
- clone.getTracks()[1].enabled = true;
+ clone.getTracks()[0].enabled = false;
+ clone.getTracks()[1].enabled = true;
- analyser = new AudioStreamAnalyser(ac, stream);
- await analyser.waitForAnalysisSuccess(array =>
- array[analyser.binIndexForFrequency(50)] < 50 &&
- array[analyser.binIndexForFrequency(1000)] > 200 &&
- array[analyser.binIndexForFrequency(3000)] < 50 &&
- array[analyser.binIndexForFrequency(5000)] < 50);
- analyser.disconnect();
+ analyser = new AudioStreamAnalyser(ac, stream);
+ await analyser.waitForAnalysisSuccess(array =>
+ array[analyser.binIndexForFrequency(50)] < 50 &&
+ array[analyser.binIndexForFrequency(1000)] > 200 &&
+ array[analyser.binIndexForFrequency(3000)] < 50 &&
+ array[analyser.binIndexForFrequency(5000)] < 50);
+ analyser.disconnect();
- cloneAnalyser = new AudioStreamAnalyser(ac, clone);
- await cloneAnalyser.waitForAnalysisSuccess(array =>
- array[cloneAnalyser.binIndexForFrequency(1000)] < 50 &&
- array[cloneAnalyser.binIndexForFrequency(3000)] < 50 &&
- array[cloneAnalyser.binIndexForFrequency(5000)] > 200 &&
- array[cloneAnalyser.binIndexForFrequency(10000)] < 50);
- cloneAnalyser.disconnect();
+ cloneAnalyser = new AudioStreamAnalyser(ac, clone);
+ await cloneAnalyser.waitForAnalysisSuccess(array =>
+ array[cloneAnalyser.binIndexForFrequency(1000)] < 50 &&
+ array[cloneAnalyser.binIndexForFrequency(3000)] < 50 &&
+ array[cloneAnalyser.binIndexForFrequency(5000)] > 200 &&
+ array[cloneAnalyser.binIndexForFrequency(10000)] < 50);
+ cloneAnalyser.disconnect();
- // Restore original tracks
- stream.getTracks().forEach(t => t.enabled = true);
+ // Restore original tracks
+ stream.getTracks().forEach(t => t.enabled = true);
+ }
+
+ gUMStream.getTracks().forEach(t => t.stop());
});
</script>
</pre>
</body>
</html>