From a0f6eea363cf1d62238746dbd264cc2301c3224e Mon Sep 17 00:00:00 2001 From: Robert Long Date: Tue, 12 Oct 2021 14:48:59 -0700 Subject: [PATCH] Add support for replacing existing sender tracks --- src/webrtc/call.ts | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/src/webrtc/call.ts b/src/webrtc/call.ts index 69fe6dc67..50ed1182f 100644 --- a/src/webrtc/call.ts +++ b/src/webrtc/call.ts @@ -1010,7 +1010,46 @@ export class MatrixCall extends EventEmitter { true, ); - this.pushLocalFeed(stream, SDPStreamMetadataPurpose.Usermedia, true); + const callFeed = this.localUsermediaFeed; + + callFeed.setNewStream(stream); + + const newSenders = []; + + for (const track of stream.getTracks()) { + const oldSender = this.usermediaSenders.find((sender) => { + return sender.track?.kind === track.kind; + }); + + let newSender: RTCRtpSender; + + try { + logger.info( + `Replacing track (` + + `id="${track.id}", ` + + `kind="${track.kind}", ` + + `streamId="${stream}", ` + + `streamPurpose="${callFeed.purpose}"` + + `) to peer connection`, + ); + await oldSender.replaceTrack(track); + newSender = oldSender; + } catch (error) { + logger.info( + `Adding track (` + + `id="${track.id}", ` + + `kind="${track.kind}", ` + + `streamId="${stream}", ` + + `streamPurpose="${callFeed.purpose}"` + + `) to peer connection`, + ); + newSender = this.peerConn.addTrack(track, stream); + } + + newSenders.push(newSender); + } + + this.usermediaSenders = newSenders; this.client.getMediaHandler().stopUserMediaStream(oldStream); }