Browse Source

fix: Reuse the existing JitsiLocalTrack on presenter unmute

master
Jaya Allamsetty 5 years ago
parent
commit
0b25e62c5c

+ 78
- 49
conference.js View File

815
      * @param {boolean} [showUI] when set to false will not display any error
815
      * @param {boolean} [showUI] when set to false will not display any error
816
      * dialogs in case of media permissions error.
816
      * dialogs in case of media permissions error.
817
      */
817
      */
818
-    async mutePresenterVideo(mute, showUI = true) {
818
+    async mutePresenter(mute, showUI = true) {
819
         const maybeShowErrorDialog = error => {
819
         const maybeShowErrorDialog = error => {
820
             showUI && APP.store.dispatch(notifyCameraError(error));
820
             showUI && APP.store.dispatch(notifyCameraError(error));
821
         };
821
         };
823
         if (mute) {
823
         if (mute) {
824
             try {
824
             try {
825
                 await this.localVideo.setEffect(undefined);
825
                 await this.localVideo.setEffect(undefined);
826
-                APP.store.dispatch(
827
-                    setVideoMuted(mute, MEDIA_TYPE.PRESENTER));
828
             } catch (err) {
826
             } catch (err) {
829
-                logger.error('Failed to mute the Presenter video');
827
+                logger.error('Failed to remove the presenter effect', err);
828
+                maybeShowErrorDialog(err);
829
+            }
830
+        } else {
831
+            try {
832
+                await this.localVideo.setEffect(await this._createPresenterStreamEffect());
833
+            } catch (err) {
834
+                logger.error('Failed to apply the presenter effect', err);
835
+                maybeShowErrorDialog(err);
830
             }
836
             }
831
-
832
-            return;
833
-        }
834
-        const { height } = this.localVideo.track.getSettings();
835
-        const defaultCamera
836
-            = getUserSelectedCameraDeviceId(APP.store.getState());
837
-        let effect;
838
-
839
-        try {
840
-            effect = await this._createPresenterStreamEffect(height,
841
-                defaultCamera);
842
-        } catch (err) {
843
-            logger.error('Failed to unmute Presenter Video');
844
-            maybeShowErrorDialog(err);
845
-
846
-            return;
847
-        }
848
-        try {
849
-            await this.localVideo.setEffect(effect);
850
-            APP.store.dispatch(setVideoMuted(mute, MEDIA_TYPE.PRESENTER));
851
-        } catch (err) {
852
-            logger.error('Failed to apply the Presenter effect', err);
853
         }
837
         }
854
     },
838
     },
855
 
839
 
868
         }
852
         }
869
 
853
 
870
         if (this.isSharingScreen) {
854
         if (this.isSharingScreen) {
871
-            return this.mutePresenterVideo(mute);
855
+            return this._mutePresenterVideo(mute);
872
         }
856
         }
873
 
857
 
874
         // If not ready to modify track's state yet adjust the base/media
858
         // If not ready to modify track's state yet adjust the base/media
1612
      * @return {Promise<JitsiStreamPresenterEffect>} - A promise resolved with
1596
      * @return {Promise<JitsiStreamPresenterEffect>} - A promise resolved with
1613
      * {@link JitsiStreamPresenterEffect} if it succeeds.
1597
      * {@link JitsiStreamPresenterEffect} if it succeeds.
1614
      */
1598
      */
1615
-    async _createPresenterStreamEffect(height, cameraDeviceId = null) {
1616
-        let presenterTrack;
1617
-
1618
-        try {
1619
-            presenterTrack = await createLocalPresenterTrack({
1620
-                cameraDeviceId
1621
-            },
1622
-            height);
1623
-        } catch (err) {
1624
-            logger.error('Failed to create a camera track for presenter', err);
1599
+    async _createPresenterStreamEffect(height = null, cameraDeviceId = null) {
1600
+        if (!this.localPresenterVideo) {
1601
+            try {
1602
+                this.localPresenterVideo = await createLocalPresenterTrack({ cameraDeviceId }, height);
1603
+            } catch (err) {
1604
+                logger.error('Failed to create a camera track for presenter', err);
1625
 
1605
 
1626
-            return;
1606
+                return;
1607
+            }
1608
+            APP.store.dispatch(trackAdded(this.localPresenterVideo));
1627
         }
1609
         }
1628
-        this.localPresenterVideo = presenterTrack;
1629
         try {
1610
         try {
1630
-            const effect = await createPresenterEffect(presenterTrack.stream);
1631
-
1632
-            APP.store.dispatch(trackAdded(this.localPresenterVideo));
1611
+            const effect = await createPresenterEffect(this.localPresenterVideo.stream);
1633
 
1612
 
1634
             return effect;
1613
             return effect;
1635
         } catch (err) {
1614
         } catch (err) {
1636
             logger.error('Failed to create the presenter effect', err);
1615
             logger.error('Failed to create the presenter effect', err);
1637
-            APP.store.dispatch(
1638
-                setVideoMuted(true, MEDIA_TYPE.PRESENTER));
1639
-            APP.store.dispatch(notifyCameraError(err));
1616
+        }
1617
+    },
1618
+
1619
+    /**
1620
+     * Tries to turn the presenter video track on or off. If a presenter track
1621
+     * doesn't exist, a new video track is created.
1622
+     *
1623
+     * @param mute - true for mute and false for unmute.
1624
+     *
1625
+     * @private
1626
+     */
1627
+    async _mutePresenterVideo(mute) {
1628
+        const maybeShowErrorDialog = error => {
1629
+            APP.store.dispatch(notifyCameraError(error));
1630
+        };
1631
+
1632
+        if (!this.localPresenterVideo && !mute) {
1633
+            // create a new presenter track and apply the presenter effect.
1634
+            const { height } = this.localVideo.track.getSettings();
1635
+            const defaultCamera
1636
+                = getUserSelectedCameraDeviceId(APP.store.getState());
1637
+            let effect;
1638
+
1639
+            try {
1640
+                effect = await this._createPresenterStreamEffect(height,
1641
+                    defaultCamera);
1642
+            } catch (err) {
1643
+                logger.error('Failed to unmute Presenter Video');
1644
+                maybeShowErrorDialog(err);
1645
+
1646
+                return;
1647
+            }
1648
+            try {
1649
+                await this.localVideo.setEffect(effect);
1650
+                APP.store.dispatch(setVideoMuted(mute, MEDIA_TYPE.PRESENTER));
1651
+            } catch (err) {
1652
+                logger.error('Failed to apply the Presenter effect', err);
1653
+            }
1654
+        } else {
1655
+            APP.store.dispatch(setVideoMuted(mute, MEDIA_TYPE.PRESENTER));
1640
         }
1656
         }
1641
     },
1657
     },
1642
 
1658
 
2108
 
2124
 
2109
                     // dispose the existing presenter track and create a new
2125
                     // dispose the existing presenter track and create a new
2110
                     // camera track.
2126
                     // camera track.
2111
-                    APP.store.dispatch(setVideoMuted(true, MEDIA_TYPE.PRESENTER));
2127
+                    this.localPresenterVideo.dispose();
2128
+                    this.localPresenterVideo = null;
2112
 
2129
 
2113
                     return this._createPresenterStreamEffect(height, cameraDeviceId)
2130
                     return this._createPresenterStreamEffect(height, cameraDeviceId)
2114
                         .then(effect => this.localVideo.setEffect(effect))
2131
                         .then(effect => this.localVideo.setEffect(effect))
2115
                         .then(() => {
2132
                         .then(() => {
2116
-                            muteLocalVideo(false);
2117
                             this.setVideoMuteStatus(false);
2133
                             this.setVideoMuteStatus(false);
2118
                             logger.log('switched local video device');
2134
                             logger.log('switched local video device');
2119
                             this._updateVideoDeviceId();
2135
                             this._updateVideoDeviceId();
2120
                         })
2136
                         })
2121
                         .catch(err => APP.store.dispatch(notifyCameraError(err)));
2137
                         .catch(err => APP.store.dispatch(notifyCameraError(err)));
2122
 
2138
 
2123
-                // If screenshare is in progress but video is muted,
2124
-                // update the default device id for video.
2139
+                // If screenshare is in progress but video is muted, update the default device
2140
+                // id for video, dispose the existing presenter track and create a new effect
2141
+                // that can be applied on un-mute.
2125
                 } else if (this.isSharingScreen && videoWasMuted) {
2142
                 } else if (this.isSharingScreen && videoWasMuted) {
2126
                     logger.log('switched local video device');
2143
                     logger.log('switched local video device');
2144
+                    const { height } = this.localVideo.track.getSettings();
2145
+
2127
                     this._updateVideoDeviceId();
2146
                     this._updateVideoDeviceId();
2147
+                    this.localPresenterVideo.dispose();
2148
+                    this.localPresenterVideo = null;
2149
+                    this._createPresenterStreamEffect(height, cameraDeviceId);
2128
 
2150
 
2129
                 // if there is only video, switch to the new camera stream.
2151
                 // if there is only video, switch to the new camera stream.
2130
                 } else {
2152
                 } else {
2379
                 cameraDeviceId: this.localVideo.getDeviceId()
2401
                 cameraDeviceId: this.localVideo.getDeviceId()
2380
             }));
2402
             }));
2381
         }
2403
         }
2404
+
2405
+        // If screenshare is in progress, get the device id from the presenter track.
2406
+        if (this.localPresenterVideo) {
2407
+            APP.store.dispatch(updateSettings({
2408
+                cameraDeviceId: this.localPresenterVideo.getDeviceId()
2409
+            }));
2410
+        }
2382
     },
2411
     },
2383
 
2412
 
2384
     /**
2413
     /**

+ 2
- 2
package-lock.json View File

10931
       }
10931
       }
10932
     },
10932
     },
10933
     "lib-jitsi-meet": {
10933
     "lib-jitsi-meet": {
10934
-      "version": "github:jitsi/lib-jitsi-meet#4a87f342858963c36bb64a8a0e89d8d7e6e06060",
10935
-      "from": "github:jitsi/lib-jitsi-meet#4a87f342858963c36bb64a8a0e89d8d7e6e06060",
10934
+      "version": "github:jitsi/lib-jitsi-meet#ea2114ca92b80bf27a04c9e3c124f80eb91c924f",
10935
+      "from": "github:jitsi/lib-jitsi-meet#ea2114ca92b80bf27a04c9e3c124f80eb91c924f",
10936
       "requires": {
10936
       "requires": {
10937
         "@jitsi/sdp-interop": "0.1.14",
10937
         "@jitsi/sdp-interop": "0.1.14",
10938
         "@jitsi/sdp-simulcast": "0.2.2",
10938
         "@jitsi/sdp-simulcast": "0.2.2",

+ 1
- 1
package.json View File

57
     "js-utils": "github:jitsi/js-utils#192b1c996e8c05530eb1f19e82a31069c3021e31",
57
     "js-utils": "github:jitsi/js-utils#192b1c996e8c05530eb1f19e82a31069c3021e31",
58
     "jsrsasign": "8.0.12",
58
     "jsrsasign": "8.0.12",
59
     "jwt-decode": "2.2.0",
59
     "jwt-decode": "2.2.0",
60
-    "lib-jitsi-meet": "github:jitsi/lib-jitsi-meet#4a87f342858963c36bb64a8a0e89d8d7e6e06060",
60
+    "lib-jitsi-meet": "github:jitsi/lib-jitsi-meet#ea2114ca92b80bf27a04c9e3c124f80eb91c924f",
61
     "libflacjs": "github:mmig/libflac.js#93d37e7f811f01cf7d8b6a603e38bd3c3810907d",
61
     "libflacjs": "github:mmig/libflac.js#93d37e7f811f01cf7d8b6a603e38bd3c3810907d",
62
     "lodash": "4.17.13",
62
     "lodash": "4.17.13",
63
     "moment": "2.19.4",
63
     "moment": "2.19.4",

+ 1
- 1
react/features/base/tracks/functions.js View File

35
         video: {
35
         video: {
36
             aspectRatio: 4 / 3,
36
             aspectRatio: 4 / 3,
37
             height: {
37
             height: {
38
-                exact: result
38
+                ideal: result
39
             }
39
             }
40
         }
40
         }
41
     };
41
     };

+ 6
- 1
react/features/base/tracks/middleware.js View File

135
             const isVideoTrack = jitsiTrack.type !== MEDIA_TYPE.AUDIO;
135
             const isVideoTrack = jitsiTrack.type !== MEDIA_TYPE.AUDIO;
136
 
136
 
137
             if (isVideoTrack) {
137
             if (isVideoTrack) {
138
-                if (jitsiTrack.isLocal()) {
138
+                if (jitsiTrack.type === MEDIA_TYPE.PRESENTER) {
139
+                    APP.conference.mutePresenter(muted);
140
+                }
141
+
142
+                // Make sure we change the video mute state only for camera tracks.
143
+                if (jitsiTrack.isLocal() && jitsiTrack.videoType !== 'desktop') {
139
                     APP.conference.setVideoMuteStatus(muted);
144
                     APP.conference.setVideoMuteStatus(muted);
140
                 } else {
145
                 } else {
141
                     APP.UI.setVideoMuted(participantID, muted);
146
                     APP.UI.setVideoMuted(participantID, muted);

Loading…
Cancel
Save