|
@@ -778,12 +778,9 @@ JitsiConference.prototype._sendBridgeVideoTypeMessage = function(localtrack) {
|
778
|
778
|
videoType = BridgeVideoType.DESKTOP_HIGH_FPS;
|
779
|
779
|
}
|
780
|
780
|
|
781
|
|
- if (FeatureFlags.isSourceNameSignalingEnabled()) {
|
782
|
|
- this.rtc.sendSourceVideoType(
|
783
|
|
- getSourceNameForJitsiTrack(this.myUserId(), MediaType.VIDEO, 0),
|
784
|
|
- videoType
|
785
|
|
- );
|
786
|
|
- } else {
|
|
781
|
+ if (FeatureFlags.isSourceNameSignalingEnabled() && localtrack) {
|
|
782
|
+ this.rtc.sendSourceVideoType(localtrack.getSourceName(), videoType);
|
|
783
|
+ } else if (!FeatureFlags.isSourceNameSignalingEnabled()) {
|
787
|
784
|
this.rtc.setVideoType(videoType);
|
788
|
785
|
}
|
789
|
786
|
};
|
|
@@ -1252,6 +1249,13 @@ JitsiConference.prototype.removeTrack = function(track) {
|
1252
|
1249
|
* @returns {Promise} resolves when the replacement is finished
|
1253
|
1250
|
*/
|
1254
|
1251
|
JitsiConference.prototype.replaceTrack = function(oldTrack, newTrack) {
|
|
1252
|
+ const oldVideoType = oldTrack?.getVideoType();
|
|
1253
|
+ const newVideoType = newTrack?.getVideoType();
|
|
1254
|
+
|
|
1255
|
+ if (FeatureFlags.isMultiStreamSupportEnabled() && oldTrack && newTrack && oldVideoType !== newVideoType) {
|
|
1256
|
+ throw new Error(`Replacing a track of videoType=${oldVideoType} with a track of videoType=${newVideoType} is`
|
|
1257
|
+ + ' not supported in this mode.');
|
|
1258
|
+ }
|
1255
|
1259
|
const oldTrackBelongsToConference = this === oldTrack?.conference;
|
1256
|
1260
|
|
1257
|
1261
|
if (oldTrackBelongsToConference && oldTrack.disposed) {
|
|
@@ -1395,29 +1399,30 @@ JitsiConference.prototype._setupNewTrack = function(newTrack) {
|
1395
|
1399
|
* @private
|
1396
|
1400
|
*/
|
1397
|
1401
|
JitsiConference.prototype._setNewVideoType = function(track) {
|
1398
|
|
- if (FeatureFlags.isSourceNameSignalingEnabled() && track) {
|
1399
|
|
- // FIXME once legacy signaling using 'sendCommand' is removed, signalingLayer.setTrackVideoType must be adjusted
|
1400
|
|
- // to send the presence (not just modify it).
|
1401
|
|
- this._signalingLayer.setTrackVideoType(track.getSourceName(), track.videoType);
|
|
1402
|
+ let videoTypeChanged = false;
|
1402
|
1403
|
|
1403
|
|
- // TODO: Optimize to detect whether presence was changed, for now always report changed to send presence
|
1404
|
|
- return true;
|
|
1404
|
+ if (FeatureFlags.isSourceNameSignalingEnabled() && track) {
|
|
1405
|
+ videoTypeChanged = this._signalingLayer.setTrackVideoType(track.getSourceName(), track.videoType);
|
1405
|
1406
|
}
|
1406
|
1407
|
|
1407
|
|
- const videoTypeTagName = 'videoType';
|
|
1408
|
+ if (!FeatureFlags.isMultiStreamSupportEnabled()) {
|
|
1409
|
+ const videoTypeTagName = 'videoType';
|
1408
|
1410
|
|
1409
|
|
- // if track is missing we revert to default type Camera, the case where we screenshare and
|
1410
|
|
- // we return to be video muted
|
1411
|
|
- const trackVideoType = track ? track.videoType : VideoType.CAMERA;
|
|
1411
|
+ // If track is missing we revert to default type Camera, the case where we screenshare and
|
|
1412
|
+ // we return to be video muted.
|
|
1413
|
+ const trackVideoType = track ? track.videoType : VideoType.CAMERA;
|
1412
|
1414
|
|
1413
|
|
- // if video type is camera and there is no videoType in presence, we skip adding it, as this is the default one
|
1414
|
|
- if (trackVideoType !== VideoType.CAMERA || this.room.getFromPresence(videoTypeTagName)) {
|
1415
|
|
- // we will not use this.sendCommand here to avoid sending the presence immediately, as later we may also set
|
1416
|
|
- // and the mute status
|
1417
|
|
- return this.room.addOrReplaceInPresence(videoTypeTagName, { value: trackVideoType });
|
|
1415
|
+ // If video type is camera and there is no videoType in presence, we skip adding it, as this is the default one
|
|
1416
|
+ if (trackVideoType !== VideoType.CAMERA || this.room.getFromPresence(videoTypeTagName)) {
|
|
1417
|
+ // We will not use this.sendCommand here to avoid sending the presence immediately, as later we may also
|
|
1418
|
+ // set the mute status.
|
|
1419
|
+ const legacyTypeChanged = this.room.addOrReplaceInPresence(videoTypeTagName, { value: trackVideoType });
|
|
1420
|
+
|
|
1421
|
+ videoTypeChanged = videoTypeChanged || legacyTypeChanged;
|
|
1422
|
+ }
|
1418
|
1423
|
}
|
1419
|
1424
|
|
1420
|
|
- return false;
|
|
1425
|
+ return videoTypeChanged;
|
1421
|
1426
|
};
|
1422
|
1427
|
|
1423
|
1428
|
/**
|
|
@@ -1429,21 +1434,31 @@ JitsiConference.prototype._setNewVideoType = function(track) {
|
1429
|
1434
|
* @private
|
1430
|
1435
|
*/
|
1431
|
1436
|
JitsiConference.prototype._setTrackMuteStatus = function(mediaType, localTrack, isMuted) {
|
1432
|
|
- if (FeatureFlags.isSourceNameSignalingEnabled()) {
|
1433
|
|
- // TODO When legacy signaling part is removed, remember to adjust signalingLayer.setTrackMuteStatus, so that
|
1434
|
|
- // it triggers sending the presence (it only updates it for now, because the legacy code below sends).
|
1435
|
|
- this._signalingLayer.setTrackMuteStatus(localTrack?.getSourceName(), isMuted);
|
1436
|
|
- }
|
|
1437
|
+ let presenceChanged = false;
|
1437
|
1438
|
|
1438
|
|
- if (!this.room) {
|
1439
|
|
- return false;
|
|
1439
|
+ if (FeatureFlags.isSourceNameSignalingEnabled() && localTrack) {
|
|
1440
|
+ presenceChanged = this._signalingLayer.setTrackMuteStatus(localTrack.getSourceName(), isMuted);
|
1440
|
1441
|
}
|
1441
|
1442
|
|
1442
|
|
- if (mediaType === MediaType.AUDIO) {
|
1443
|
|
- return this.room.addAudioInfoToPresence(isMuted);
|
|
1443
|
+ // Add the 'audioMuted' and 'videoMuted' tags when source name signaling is enabled for backward compatibility.
|
|
1444
|
+ // It won't be used anymore when multiple stream support is enabled.
|
|
1445
|
+ if (!FeatureFlags.isMultiStreamSupportEnabled()) {
|
|
1446
|
+ let audioMuteChanged, videoMuteChanged;
|
|
1447
|
+
|
|
1448
|
+ if (!this.room) {
|
|
1449
|
+ return false;
|
|
1450
|
+ }
|
|
1451
|
+
|
|
1452
|
+ if (mediaType === MediaType.AUDIO) {
|
|
1453
|
+ audioMuteChanged = this.room.addAudioInfoToPresence(isMuted);
|
|
1454
|
+ } else {
|
|
1455
|
+ videoMuteChanged = this.room.addVideoInfoToPresence(isMuted);
|
|
1456
|
+ }
|
|
1457
|
+
|
|
1458
|
+ presenceChanged = presenceChanged || audioMuteChanged || videoMuteChanged;
|
1444
|
1459
|
}
|
1445
|
1460
|
|
1446
|
|
- return this.room.addVideoInfoToPresence(isMuted);
|
|
1461
|
+ return presenceChanged;
|
1447
|
1462
|
};
|
1448
|
1463
|
|
1449
|
1464
|
/**
|
|
@@ -1470,11 +1485,7 @@ JitsiConference.prototype._addLocalTrackAsUnmute = function(track) {
|
1470
|
1485
|
logger.debug('Add local MediaStream as unmute - no P2P Jingle session started yet');
|
1471
|
1486
|
}
|
1472
|
1487
|
|
1473
|
|
- return Promise.allSettled(addAsUnmutePromises)
|
1474
|
|
- .then(() => {
|
1475
|
|
- // Signal the video type to the bridge.
|
1476
|
|
- track.isVideoTrack() && this._sendBridgeVideoTypeMessage(track);
|
1477
|
|
- });
|
|
1488
|
+ return Promise.allSettled(addAsUnmutePromises);
|
1478
|
1489
|
};
|
1479
|
1490
|
|
1480
|
1491
|
/**
|
|
@@ -1498,11 +1509,7 @@ JitsiConference.prototype._removeLocalTrackAsMute = function(track) {
|
1498
|
1509
|
logger.debug('Remove local MediaStream - no P2P JingleSession started yet');
|
1499
|
1510
|
}
|
1500
|
1511
|
|
1501
|
|
- return Promise.allSettled(removeAsMutePromises)
|
1502
|
|
- .then(() => {
|
1503
|
|
- // Signal the video type to the bridge.
|
1504
|
|
- track.isVideoTrack() && this._sendBridgeVideoTypeMessage();
|
1505
|
|
- });
|
|
1512
|
+ return Promise.allSettled(removeAsMutePromises);
|
1506
|
1513
|
};
|
1507
|
1514
|
|
1508
|
1515
|
/**
|
|
@@ -3608,27 +3615,26 @@ JitsiConference.prototype._updateRoomPresence = function(jingleSession, ctx) {
|
3608
|
3615
|
ctx.skip = true;
|
3609
|
3616
|
}
|
3610
|
3617
|
|
3611
|
|
- const localAudioTracks = jingleSession.peerconnection.getLocalTracks(MediaType.AUDIO);
|
3612
|
|
- const localVideoTracks = jingleSession.peerconnection.getLocalTracks(MediaType.VIDEO);
|
3613
|
3618
|
let presenceChanged = false;
|
|
3619
|
+ let muteStatusChanged, videoTypeChanged;
|
|
3620
|
+ const localTracks = this.getLocalTracks();
|
3614
|
3621
|
|
3615
|
|
- if (localAudioTracks && localAudioTracks.length) {
|
3616
|
|
- presenceChanged = this._setTrackMuteStatus(MediaType.AUDIO, localAudioTracks[0], localAudioTracks[0].isMuted());
|
3617
|
|
- } else if (this._setTrackMuteStatus(MediaType.AUDIO, undefined, true)) {
|
3618
|
|
- presenceChanged = true;
|
|
3622
|
+ // Set presence for all the available local tracks.
|
|
3623
|
+ for (const track of localTracks) {
|
|
3624
|
+ muteStatusChanged = this._setTrackMuteStatus(track.getType(), track, track.isMuted());
|
|
3625
|
+ if (track.getType() === MediaType.VIDEO) {
|
|
3626
|
+ videoTypeChanged = this._setNewVideoType(track);
|
|
3627
|
+ }
|
|
3628
|
+ presenceChanged = presenceChanged || muteStatusChanged || videoTypeChanged;
|
3619
|
3629
|
}
|
3620
|
3630
|
|
3621
|
|
- if (localVideoTracks && localVideoTracks.length) {
|
3622
|
|
- const muteStatusChanged = this._setTrackMuteStatus(
|
3623
|
|
- MediaType.VIDEO, localVideoTracks[0], localVideoTracks[0].isMuted());
|
3624
|
|
- const videoTypeChanged = this._setNewVideoType(localVideoTracks[0]);
|
|
3631
|
+ // Set the presence in the legacy format if there are no local tracks and multi stream support is not enabled.
|
|
3632
|
+ if (!localTracks.length && !FeatureFlags.isMultiStreamSupportEnabled()) {
|
|
3633
|
+ const audioMuteStatusChanged = this._setTrackMuteStatus(MediaType.AUDIO, undefined, true);
|
|
3634
|
+ const videoMuteStatusChanged = this._setTrackMuteStatus(MediaType.VIDEO, undefined, true);
|
3625
|
3635
|
|
3626
|
|
- presenceChanged = presenceChanged || muteStatusChanged || videoTypeChanged;
|
3627
|
|
- } else {
|
3628
|
|
- const muteStatusChanged = this._setTrackMuteStatus(MediaType.VIDEO, undefined, true);
|
3629
|
|
- const videoTypeChanged = this._setNewVideoType(); // set back to default video type
|
3630
|
|
-
|
3631
|
|
- presenceChanged = presenceChanged || muteStatusChanged || videoTypeChanged;
|
|
3636
|
+ videoTypeChanged = this._setNewVideoType();
|
|
3637
|
+ presenceChanged = audioMuteStatusChanged || videoMuteStatusChanged || videoTypeChanged;
|
3632
|
3638
|
}
|
3633
|
3639
|
|
3634
|
3640
|
presenceChanged && this.room.sendPresence();
|