Skip to content

Commit f1fbf51

Browse files
committed
Add updateLocalUsermediaStream()
Signed-off-by: Šimon Brandner <[email protected]>
1 parent 0d97b6a commit f1fbf51

File tree

1 file changed

+47
-0
lines changed

1 file changed

+47
-0
lines changed

src/webrtc/call.ts

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1072,6 +1072,53 @@ export class MatrixCall extends EventEmitter {
10721072
}
10731073
}
10741074

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+
10751122
/**
10761123
* Set whether our outbound video should be muted or not.
10771124
* @param {boolean} muted True to mute the outbound video.

0 commit comments

Comments
 (0)