From 972aef7a9df60c9bb3cd0ffa2e125ea414b8badf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Sat, 8 May 2021 07:40:46 +0200 Subject: [PATCH] Merge feed delete methods and add sender arrays MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/webrtc/call.ts | 52 +++++++++++++++++++++------------------------- 1 file changed, 24 insertions(+), 28 deletions(-) diff --git a/src/webrtc/call.ts b/src/webrtc/call.ts index d8dd8aabf..59670933c 100644 --- a/src/webrtc/call.ts +++ b/src/webrtc/call.ts @@ -269,10 +269,14 @@ export class MatrixCall extends EventEmitter { private peerConn: RTCPeerConnection; private feeds: Array; private screenSharingStream: MediaStream; + // TODO: Rename to usermedia rather than AV for consistency private localAVStream: MediaStream; + private usermediaSenders: Array; + private screensharingSenders: Array; private inviteOrAnswerSent: boolean; private waitForLocalAVStream: boolean; // XXX: I don't know why this is called 'config'. + // XXX: Do we even needs this? Seems to be unused private config: MediaStreamConstraints; private successor: MatrixCall; private opponentMember: RoomMember; @@ -349,6 +353,9 @@ export class MatrixCall extends EventEmitter { this.vidMuted = false; this.feeds = []; + + this.usermediaSenders = []; + this.screensharingSenders = []; } /** @@ -549,9 +556,14 @@ export class MatrixCall extends EventEmitter { // why do we enable audio (and only audio) tracks here? -- matthew setTracksEnabled(stream.getAudioTracks(), true); + const senderArray = purpose === SDPStreamMetadataPurpose.Usermedia ? + this.usermediaSenders : this.screensharingSenders; + // Empty the array + senderArray.splice(0, senderArray.length); + for (const track of stream.getTracks()) { logger.info(`Adding track with id ${track.id} and with kind ${track.kind} to peer connection`) - this.peerConn.addTrack(track, stream); + senderArray.push(this.peerConn.addTrack(track, stream)); } } @@ -560,33 +572,10 @@ export class MatrixCall extends EventEmitter { this.emit(CallEvent.FeedsChanged, this.feeds); } - private deleteLocalFeedByStream(stream: MediaStream) { + private deleteFeedByStream(stream: MediaStream) { logger.debug(`Removing feed with stream id ${stream.id}`); - const feed = this.getLocalFeeds().find((feed) => feed.stream.id === stream.id); - if (!feed) { - logger.warn(`Didn't find the feed with stream id ${stream.id} to delete`); - return; - } - - this.feeds.splice(this.feeds.indexOf(feed), 1); - this.emit(CallEvent.FeedsChanged, this.feeds); - - for (const track of stream.getTracks()) { - // XXX: This is ugly and there has to be a way to do this more nicely - for (const sender of this.peerConn.getSenders()) { - if (sender.track?.id === track.id) { - this.peerConn.removeTrack(sender); - } - } - track.stop(); - } - } - - private deleteRemoteFeedByStream(stream: MediaStream) { - logger.debug(`Removing feed with stream id ${stream.id}`); - - const feed = this.getRemoteFeeds().find((feed) => feed.stream.id === stream.id); + const feed = this.feeds.find((feed) => feed.stream.id === stream.id); if (!feed) { logger.warn(`Didn't find the feed with stream id ${stream.id} to delete`); return; @@ -868,7 +857,14 @@ export class MatrixCall extends EventEmitter { logger.warn(`There already isn't a screensharing stream - there is nothing to do!`); return false; } - this.deleteLocalFeedByStream(this.screenSharingStream); + + for (const sender of this.screensharingSenders) { + this.peerConn.removeTrack(sender); + } + for (const track of this.screenSharingStream.getTracks()) { + track.stop(); + } + this.deleteFeedByStream(this.screenSharingStream); this.screenSharingStream = null; return false; } @@ -1510,7 +1506,7 @@ export class MatrixCall extends EventEmitter { const stream = ev.streams[0]; this.pushRemoteFeed(stream); - stream.addEventListener("removetrack", () => this.deleteRemoteFeedByStream(stream)); + stream.addEventListener("removetrack", () => this.deleteFeedByStream(stream)); }; onNegotiationNeeded = async () => {