diff options
author | Daniel Calviño Sánchez <danxuliu@gmail.com> | 2019-12-04 15:20:17 +0300 |
---|---|---|
committer | Daniel Calviño Sánchez <danxuliu@gmail.com> | 2019-12-05 12:06:38 +0300 |
commit | 25f7d7cdf4718244f69b1452ba3782eed5023f00 (patch) | |
tree | e0f7e221f9c015cbfdca6c032cb175ddfd5582a2 | |
parent | f9b5d5bbfe4f3731cc3c33a82390c61f096405f1 (diff) |
Handle screen Peer in CallParticipantmodel
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
-rw-r--r-- | js/models/callparticipantmodel.js | 40 | ||||
-rw-r--r-- | js/views/videoview.js | 10 | ||||
-rw-r--r-- | js/webrtc.js | 45 |
3 files changed, 53 insertions, 42 deletions
diff --git a/js/models/callparticipantmodel.js b/js/models/callparticipantmodel.js index b37e9eec7..4e309db01 100644 --- a/js/models/callparticipantmodel.js +++ b/js/models/callparticipantmodel.js @@ -51,6 +51,7 @@ stream: null, audioAvailable: undefined, videoAvailable: undefined, + screen: null, }, sync: function(method, model, options) { @@ -75,26 +76,26 @@ }, _handlePeerStreamAdded: function(peer) { - if (this._peer !== peer) { - return; - } + if (this._peer === peer) { + this.set('stream', this._peer.stream || null); - this.set('stream', peer.stream || null); - - // "peer.nick" is set only for users and when the MCU is not used. - if (this._peer.nick !== undefined) { - this.set('name', this._peer.nick); + // "peer.nick" is set only for users and when the MCU is not used. + if (this._peer.nick !== undefined) { + this.set('name', this._peer.nick); + } + } else if (this._screenPeer === peer) { + this.set('screen', this._screenPeer.stream || null); } }, _handlePeerStreamRemoved: function(peer) { - if (this._peer !== peer) { - return; + if (this._peer === peer) { + this.set('stream', null); + this.set('audioAvailable', undefined); + this.set('videoAvailable', undefined); + } else if (this._screenPeer === peer) { + this.set('screen', null); } - - this.set('stream', null); - this.set('audioAvailable', undefined); - this.set('videoAvailable', undefined); }, _handleNick: function(data) { @@ -206,6 +207,17 @@ } }, + setScreenPeer: function(screenPeer) { + if (this.get('peerId') !== screenPeer.id) { + console.warn('Mismatch between stored peer ID and ID of given screen peer: ', this.get('peerId'), screenPeer.id); + } + + this._screenPeer = screenPeer; + + // Reset state that depends on the screen Peer object. + this._handlePeerStreamAdded(this._screenPeer); + }, + setUserId: function(userId) { this.set('userId', userId); }, diff --git a/js/views/videoview.js b/js/views/videoview.js index 0118874d4..8e193a0b9 100644 --- a/js/views/videoview.js +++ b/js/views/videoview.js @@ -78,6 +78,9 @@ 'change:stream': '_setStream', 'change:audioAvailable': '_setAudioAvailable', 'change:videoAvailable': '_setVideoAvailable', + 'change:screen': function(model, screen) { + this._setScreenAvailable(this.model.get('screen')); + }, }, initialize: function() { @@ -100,6 +103,7 @@ this._setStream(this.model, this.model.get('stream')); this._setAudioAvailable(this.model, this.model.get('audioAvailable')); this._setVideoAvailable(this.model, this.model.get('videoAvailable')); + this._setScreenAvailable(this.model.get('screen')); this.getUI('hideRemoteVideoButton').tooltip({ placement: 'top', @@ -352,18 +356,22 @@ this.$el.toggleClass('promoted', promoted); }, - setScreenAvailable: function(screenAvailable) { + _setScreenAvailable: function(screenAvailable) { if (!screenAvailable) { this.getUI('screenSharingIndicator') .removeClass('screen-on') .addClass('screen-off'); + OCA.SpreedMe.speakers.updateVideoContainerDummyIfLatestSpeaker(this.model.get('peerId')); + return; } this.getUI('screenSharingIndicator') .removeClass('screen-off') .addClass('screen-on'); + + OCA.SpreedMe.speakers.updateVideoContainerDummyIfLatestSpeaker(this.model.get('peerId')); }, setScreenVisible: function(screenVisible) { diff --git a/js/webrtc.js b/js/webrtc.js index 2c3a4ba69..cf5a11531 100644 --- a/js/webrtc.js +++ b/js/webrtc.js @@ -496,8 +496,6 @@ var spreedPeerConnectionTable = []; callParticipantModel.setPeer(null); } - videoView.setScreenAvailable(!!spreedListofSharedScreens[id]); - OCA.SpreedMe.videos.videoViews[id] = videoView; videoView.$el.prependTo($('#videos')); @@ -840,14 +838,6 @@ var spreedPeerConnectionTable = []; spreedListofSharedScreens[id] = (new Date()).getTime(); - var currentUser = OCA.SpreedMe.webrtc.connection.getSessionid(); - if (currentUser !== id) { - var videoView = OCA.SpreedMe.videos.videoViews[id]; - if (videoView) { - videoView.setScreenAvailable(true); - } - } - OCA.SpreedMe.sharedScreens.switchScreenToId(id); }, remove: function(id) { @@ -864,11 +854,6 @@ var spreedPeerConnectionTable = []; delete spreedListofSharedScreens[id]; - var videoView = OCA.SpreedMe.videos.videoViews[id]; - if (videoView) { - videoView.setScreenAvailable(false); - } - var mostRecentTime = 0, mostRecentId = null; for (var currentId in spreedListofSharedScreens) { @@ -897,21 +882,27 @@ var spreedPeerConnectionTable = []; OCA.SpreedMe.webrtc.on('createdPeer', function (peer) { console.log('PEER CREATED', peer); - if (peer.type === 'video') { - if (peer.id !== OCA.SpreedMe.webrtc.connection.getSessionid()) { - // In some strange cases a Peer can be added before its - // participant is found in the list of participants. - var callParticipantModel = OCA.SpreedMe.callParticipantModels[peer.id]; - if (!callParticipantModel) { - callParticipantModel = new OCA.Talk.Models.CallParticipantModel({ - peerId: peer.id, - webRtc: OCA.SpreedMe.webrtc, - }); - OCA.SpreedMe.callParticipantModels[peer.id] = callParticipantModel; - } + + if (peer.id !== OCA.SpreedMe.webrtc.connection.getSessionid() && !peer.sharemyscreen) { + // In some strange cases a Peer can be added before its + // participant is found in the list of participants. + var callParticipantModel = OCA.SpreedMe.callParticipantModels[peer.id]; + if (!callParticipantModel) { + callParticipantModel = new OCA.Talk.Models.CallParticipantModel({ + peerId: peer.id, + webRtc: OCA.SpreedMe.webrtc, + }); + OCA.SpreedMe.callParticipantModels[peer.id] = callParticipantModel; + } + + if (peer.type === 'video') { callParticipantModel.setPeer(peer); + } else { + callParticipantModel.setScreenPeer(peer); } + } + if (peer.type === 'video') { OCA.SpreedMe.videos.addPeer(peer); // Make sure required data channels exist for all peers. This // is required for peers that get created by SimpleWebRTC from |