@@ -1072,6 +1072,53 @@ export class MatrixCall extends EventEmitter {
1072
1072
}
1073
1073
}
1074
1074
1075
+ /**
1076
+ * Replaces/adds the tracks from the passed stream to the localUsermediaStream
1077
+ * @param {MediaStream } stream to use a replacement for the local usermedia stream
1078
+ */
1079
+ public async updateLocalUsermediaStream ( stream : MediaStream ) : Promise < void > {
1080
+ const callFeed = this . localUsermediaFeed ;
1081
+ const micShouldBeMuted = callFeed . isAudioMuted ( ) || this . remoteOnHold ;
1082
+ const vidShouldBeMuted = callFeed . isVideoMuted ( ) || this . remoteOnHold ;
1083
+ setTracksEnabled ( stream . getAudioTracks ( ) , ! micShouldBeMuted ) ;
1084
+ setTracksEnabled ( stream . getVideoTracks ( ) , ! vidShouldBeMuted ) ;
1085
+ callFeed . setNewStream ( stream ) ;
1086
+
1087
+ const newSenders = [ ] ;
1088
+
1089
+ for ( const track of stream . getTracks ( ) ) {
1090
+ const oldSender = this . usermediaSenders . find ( ( sender ) => sender . track ?. kind === track . kind ) ;
1091
+ let newSender : RTCRtpSender ;
1092
+
1093
+ if ( oldSender ) {
1094
+ logger . info (
1095
+ `Replacing track (` +
1096
+ `id="${ track . id } ", ` +
1097
+ `kind="${ track . kind } ", ` +
1098
+ `streamId="${ stream . id } ", ` +
1099
+ `streamPurpose="${ callFeed . purpose } "` +
1100
+ `) to peer connection` ,
1101
+ ) ;
1102
+ await oldSender . replaceTrack ( track ) ;
1103
+ newSender = oldSender ;
1104
+ } else {
1105
+ logger . info (
1106
+ `Adding track (` +
1107
+ `id="${ track . id } ", ` +
1108
+ `kind="${ track . kind } ", ` +
1109
+ `streamId="${ stream . id } ", ` +
1110
+ `streamPurpose="${ callFeed . purpose } "` +
1111
+ `) to peer connection` ,
1112
+ ) ;
1113
+ newSender = this . peerConn . addTrack ( track , stream ) ;
1114
+ }
1115
+
1116
+ newSenders . push ( newSender ) ;
1117
+ }
1118
+
1119
+ this . usermediaSenders = newSenders ;
1120
+ }
1121
+
1075
1122
/**
1076
1123
* Set whether our outbound video should be muted or not.
1077
1124
* @param {boolean } muted True to mute the outbound video.
0 commit comments