From 5d4e3183aa82d1af3c47a5a48e1b3ea12f1dc807 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 8 Feb 2022 11:13:58 +0100 Subject: [PATCH] Don't store streams that are only used once (#2157) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/webrtc/call.ts | 5 +++-- src/webrtc/mediaHandler.ts | 17 +++++++++++++---- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/webrtc/call.ts b/src/webrtc/call.ts index 3806e2de1..da4dc8a4b 100644 --- a/src/webrtc/call.ts +++ b/src/webrtc/call.ts @@ -937,7 +937,7 @@ export class MatrixCall extends EventEmitter { const upgradeVideo = video && !this.hasLocalUserMediaVideoTrack; logger.debug(`Upgrading call: audio?=${upgradeAudio} video?=${upgradeVideo}`); - const stream = await this.client.getMediaHandler().getUserMediaStream(upgradeAudio, upgradeVideo); + const stream = await this.client.getMediaHandler().getUserMediaStream(upgradeAudio, upgradeVideo, false); if (upgradeAudio && upgradeVideo) { if (this.hasLocalUserMediaAudioTrack) return; if (this.hasLocalUserMediaVideoTrack) return; @@ -1978,7 +1978,7 @@ export class MatrixCall extends EventEmitter { } private stopAllMedia(): void { - logger.debug(`stopAllMedia (stream=${this.localUsermediaStream})`); + logger.debug("Stopping all media for call", this.callId); for (const feed of this.feeds) { if (feed.isLocal() && feed.purpose === SDPStreamMetadataPurpose.Usermedia) { @@ -1986,6 +1986,7 @@ export class MatrixCall extends EventEmitter { } else if (feed.isLocal() && feed.purpose === SDPStreamMetadataPurpose.Screenshare) { this.client.getMediaHandler().stopScreensharingStream(feed.stream); } else { + logger.debug("Stopping remote stream", feed.stream.id); for (const track of feed.stream.getTracks()) { track.stop(); } diff --git a/src/webrtc/mediaHandler.ts b/src/webrtc/mediaHandler.ts index 4a20823bd..b1c599d45 100644 --- a/src/webrtc/mediaHandler.ts +++ b/src/webrtc/mediaHandler.ts @@ -54,9 +54,12 @@ export class MediaHandler { } /** + * @param audio should have an audio track + * @param video should have a video track + * @param reusable is allowed to be reused by the MediaHandler * @returns {MediaStream} based on passed parameters */ - public async getUserMediaStream(audio: boolean, video: boolean): Promise { + public async getUserMediaStream(audio: boolean, video: boolean, reusable = true): Promise { const shouldRequestAudio = audio && await this.hasAudioDevice(); const shouldRequestVideo = video && await this.hasVideoDevice(); @@ -78,7 +81,9 @@ export class MediaHandler { stream = await navigator.mediaDevices.getUserMedia(constraints); } - this.userMediaStreams.push(stream); + if (reusable) { + this.userMediaStreams.push(stream); + } return stream; } @@ -101,9 +106,11 @@ export class MediaHandler { } /** + * @param desktopCapturerSourceId sourceId for Electron DesktopCapturer + * @param reusable is allowed to be reused by the MediaHandler * @returns {MediaStream} based on passed parameters */ - public async getScreensharingStream(desktopCapturerSourceId: string): Promise { + public async getScreensharingStream(desktopCapturerSourceId: string, reusable = true): Promise { let stream: MediaStream; if (this.screensharingStreams.length === 0) { @@ -125,7 +132,9 @@ export class MediaHandler { stream = matchingStream.clone(); } - this.screensharingStreams.push(stream); + if (reusable) { + this.screensharingStreams.push(stream); + } return stream; }