|
@@ -16,29 +16,20 @@ import VideoType from '../../service/RTC/VideoType';
|
16
|
16
|
const logger = getLogger(__filename);
|
17
|
17
|
|
18
|
18
|
/**
|
19
|
|
- * Creates Promise for mute/unmute operation.
|
|
19
|
+ * Creates Promise for mute/unmute operation. Mute operations are chained, so
|
|
20
|
+ * this function can be called as many times as needed in a row and operations
|
|
21
|
+ * will be executed in a serialized fashion.
|
20
|
22
|
*
|
21
|
23
|
* @param {JitsiLocalTrack} track - The track that will be muted/unmuted.
|
22
|
24
|
* @param {boolean} mute - Whether to mute or unmute the track.
|
23
|
25
|
* @returns {Promise}
|
24
|
26
|
*/
|
25
|
27
|
function createMuteUnmutePromise(track, mute) {
|
26
|
|
- if (track.inMuteOrUnmuteProgress) {
|
27
|
|
- return Promise.reject(
|
28
|
|
- new JitsiTrackError(JitsiTrackErrors.TRACK_MUTE_UNMUTE_IN_PROGRESS)
|
29
|
|
- );
|
30
|
|
- }
|
|
28
|
+ const doMute = () => track._setMute(mute);
|
31
|
29
|
|
32
|
|
- track.inMuteOrUnmuteProgress = true;
|
|
30
|
+ track._mutePromise = track._mutePromise.then(doMute, doMute);
|
33
|
31
|
|
34
|
|
- return track._setMute(mute)
|
35
|
|
- .then(() => {
|
36
|
|
- track.inMuteOrUnmuteProgress = false;
|
37
|
|
- })
|
38
|
|
- .catch(status => {
|
39
|
|
- track.inMuteOrUnmuteProgress = false;
|
40
|
|
- throw status;
|
41
|
|
- });
|
|
32
|
+ return track._mutePromise;
|
42
|
33
|
}
|
43
|
34
|
|
44
|
35
|
/**
|
|
@@ -109,7 +100,15 @@ export default class JitsiLocalTrack extends JitsiTrack {
|
109
|
100
|
|
110
|
101
|
this.deviceId = deviceId;
|
111
|
102
|
this.storedMSID = this.getMSID();
|
112
|
|
- this.inMuteOrUnmuteProgress = false;
|
|
103
|
+
|
|
104
|
+ /**
|
|
105
|
+ * The promise which indicates a mute or unmute operation is in
|
|
106
|
+ * progress.
|
|
107
|
+ *
|
|
108
|
+ * @private
|
|
109
|
+ * @type {Promise}
|
|
110
|
+ */
|
|
111
|
+ this._mutePromise = Promise.resolve();
|
113
|
112
|
|
114
|
113
|
/**
|
115
|
114
|
* The facing mode of the camera from which this JitsiLocalTrack
|