diff --git a/src/main/js/media_manager.js b/src/main/js/media_manager.js index 7ef2860a..743567e5 100644 --- a/src/main/js/media_manager.js +++ b/src/main/js/media_manager.js @@ -354,7 +354,7 @@ export class MediaManager { */ setDesktopwithCameraSource(stream, streamId, onEndedCallback) { this.desktopStream = stream; - return this.navigatorUserMedia({video: true, audio: false}, cameraStream => { + return this.navigatorUserMedia({video: this.mediaConstraints.video, audio: false}, cameraStream => { this.smallVideoTrack = cameraStream.getVideoTracks()[0]; //create a canvas element @@ -579,12 +579,7 @@ export class MediaManager { // If error catched then redirect Default Stream Camera if (this.localStream == null) { - var mediaConstraints = { - video: true, - audio: true - }; - - this.openStream(mediaConstraints); + this.openStream(this.mediaConstraints); } else { this.switchVideoCameraCapture(streamId); } @@ -614,14 +609,14 @@ export class MediaManager { return this.navigatorDisplayMedia(streamId,mediaConstraints).then(stream => { if (this.smallVideoTrack) this.smallVideoTrack.stop(); - return this.prepareStreamTracks(mediaConstraints, audioConstraint, stream, streamId); + return this.prepareStreamTracks(this.mediaConstraints, audioConstraint, stream, streamId); }); } else { return this.navigatorUserMedia(mediaConstraints).then(stream => { if (this.smallVideoTrack) this.smallVideoTrack.stop(); - return this.prepareStreamTracks(mediaConstraints, audioConstraint, stream, streamId); + return this.prepareStreamTracks(this.mediaConstraints, audioConstraint, stream, streamId); }).catch(error => { if (error.name == "NotFoundError") { this.getDevices() @@ -921,11 +916,13 @@ export class MediaManager { switchDesktopCapture(streamId) { this.publishMode = "screen"; - if (typeof this.mediaConstraints.video != "undefined" && this.mediaConstraints.video != false) { - this.mediaConstraints.video = true - } - //TODO: I don't think we need to get audio again. We just need to switch the video stream - return this.getMedia(this.mediaConstraints, streamId); + let shareMediaConstraints = JSON.parse(JSON.stringify(this.mediaConstraints)); + if (typeof this.mediaConstraints.video != "undefined" && this.mediaConstraints.video != false) { + shareMediaConstraints.video = true; + } + + //TODO: I don't think we need to get audio again. We just need to switch the video stream + return this.getMedia(shareMediaConstraints, streamId); } /** @@ -935,14 +932,15 @@ export class MediaManager { * @param {*} streamId */ switchDesktopCaptureWithCamera(streamId) { - if (typeof this.mediaConstraints.video != "undefined" && this.mediaConstraints.video != false) { - this.mediaConstraints.video = true - } - this.publishMode = "screen+camera"; - //TODO: I don't think we need to get audio again. We just need to switch the video stream - return this.getMedia(this.mediaConstraints, streamId); + let shareMediaConstraints = JSON.parse(JSON.stringify(this.mediaConstraints)); + if (typeof this.mediaConstraints.video != "undefined" && this.mediaConstraints.video != false) { + shareMediaConstraints.video = true; + } + + //TODO: I don't think we need to get audio again. We just need to switch the video stream + return this.getMedia(shareMediaConstraints, streamId); } /** diff --git a/src/main/js/webrtc_adaptor.js b/src/main/js/webrtc_adaptor.js index a0424954..6055e07a 100644 --- a/src/main/js/webrtc_adaptor.js +++ b/src/main/js/webrtc_adaptor.js @@ -2193,6 +2193,39 @@ export class WebRTCAdaptor { }; this.webSocketAdaptor.send(JSON.stringify(jsCmd)); } + + + /** + * Called to get the subscriber count for a stream. AMS responds with the subscriberCount notification. + * Parameters: + * @param {string} streamId : stream id to get subscribers list + */ + getSubscriberCount(streamId) { + let jsCmd = { + command: "getSubscriberCount", + streamId: streamId, + }; + this.webSocketAdaptor.send(JSON.stringify(jsCmd)); + } + + /** + * Called to get the subscribers for a stream. AMS responds with the subscriberList notification. + * Parameters: + * @param {string} streamId : stream id to get subscribers list + * @param {number} offset : offset for the subtrack list + * @param {number} size : size for the subtrack list + */ + getSubscriberList(streamId, offset, size) { + let jsCmd = { + command: "getSubscribers", + streamId: streamId, + offset: offset, + size: size, + }; + this.webSocketAdaptor.send(JSON.stringify(jsCmd)); + } + + /** * The following messages are forwarded to MediaManager. They are also kept here because of backward compatibility. diff --git a/src/test/js/media_manager.test.js b/src/test/js/media_manager.test.js index e161cd91..51c0dfc7 100644 --- a/src/test/js/media_manager.test.js +++ b/src/test/js/media_manager.test.js @@ -256,6 +256,57 @@ describe("MediaManager", function () { }); + + it("testSwitchDesktopCapture", async function () { + var videoElement = document.createElement("video"); + + var streamId = "stream1"; + + var mediaConstraints = {video: "something_video", audio: "something_audio"}; + + var adaptor = new WebRTCAdaptor({ + websocketURL: "ws://example.com", + localVideoElement: videoElement, + initializeComponents: false, + mediaConstraints: mediaConstraints + }); + + var shareMediaConstraint = JSON.parse(JSON.stringify(mediaConstraints)); + shareMediaConstraint.video = true; + + var getMediaStub = sinon.stub(adaptor.mediaManager, "getMedia"); + + await adaptor.mediaManager.switchDesktopCapture(streamId); + + sinon.assert.calledWith(getMediaStub, shareMediaConstraint, streamId); + }); + + + it("switchDesktopCaptureWithCamera", async function () { + var videoElement = document.createElement("video"); + + var streamId = "stream1"; + + var mediaConstraints = {video: "something_video", audio: "something_audio"}; + + var adaptor = new WebRTCAdaptor({ + websocketURL: "ws://example.com", + localVideoElement: videoElement, + initializeComponents: false, + mediaConstraints: mediaConstraints + }); + + var shareMediaConstraint = JSON.parse(JSON.stringify(mediaConstraints)); + shareMediaConstraint.video = true; + + var getMediaStub = sinon.stub(adaptor.mediaManager, "getMedia"); + + await adaptor.mediaManager.switchDesktopCaptureWithCamera(streamId); + + sinon.assert.calledWith(getMediaStub, shareMediaConstraint, streamId); + }); + + describe("checkAndStopLocalVideoTrackOnAndroid", function () { diff --git a/src/test/js/webrtc_adaptor.test.js b/src/test/js/webrtc_adaptor.test.js index 3f44de3a..878c8c3b 100644 --- a/src/test/js/webrtc_adaptor.test.js +++ b/src/test/js/webrtc_adaptor.test.js @@ -2112,6 +2112,58 @@ describe("WebRTCAdaptor", function() { expect(initPeerConnection.calledWithExactly(streamId, "play")).to.be.true; }); + + it("getSubscriberCount", async function() { + + let adaptor = new WebRTCAdaptor({ + websocketURL: "ws://example.com", + isPlayMode: true + }); + + let streamId = "roomId"; + + let jsCmd = { + command: "getSubscriberCount", + streamId: streamId, + }; + + let webSocketAdaptor = sinon.mock(adaptor.webSocketAdaptor); + + let sendExpectation = webSocketAdaptor.expects("send").once().withArgs(JSON.stringify(jsCmd)); + + adaptor.getSubscriberCount(streamId); + + sendExpectation.verify() + + }); + + it("getSubscriberList", async function() { + + let adaptor = new WebRTCAdaptor({ + websocketURL: "ws://example.com", + isPlayMode: true + }); + + let streamId = "roomId"; + let offset = Math.floor(Math.random() * 100); + let size = Math.floor(Math.random() * 100); + + let jsCmd = { + command: "getSubscribers", + streamId: streamId, + offset: offset, + size: size, + }; + + let webSocketAdaptor = sinon.mock(adaptor.webSocketAdaptor); + + let sendExpectation = webSocketAdaptor.expects("send").once().withArgs(JSON.stringify(jsCmd)); + + adaptor.getSubscriberList(streamId, offset, size); + + sendExpectation.verify() + + }); });