Skip to content

Commit 5d4e318

Browse files
Don't store streams that are only used once (#2157)
Signed-off-by: Šimon Brandner <[email protected]>
1 parent 07171a9 commit 5d4e318

File tree

2 files changed

+16
-6
lines changed

2 files changed

+16
-6
lines changed

src/webrtc/call.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -937,7 +937,7 @@ export class MatrixCall extends EventEmitter {
937937
const upgradeVideo = video && !this.hasLocalUserMediaVideoTrack;
938938
logger.debug(`Upgrading call: audio?=${upgradeAudio} video?=${upgradeVideo}`);
939939

940-
const stream = await this.client.getMediaHandler().getUserMediaStream(upgradeAudio, upgradeVideo);
940+
const stream = await this.client.getMediaHandler().getUserMediaStream(upgradeAudio, upgradeVideo, false);
941941
if (upgradeAudio && upgradeVideo) {
942942
if (this.hasLocalUserMediaAudioTrack) return;
943943
if (this.hasLocalUserMediaVideoTrack) return;
@@ -1978,14 +1978,15 @@ export class MatrixCall extends EventEmitter {
19781978
}
19791979

19801980
private stopAllMedia(): void {
1981-
logger.debug(`stopAllMedia (stream=${this.localUsermediaStream})`);
1981+
logger.debug("Stopping all media for call", this.callId);
19821982

19831983
for (const feed of this.feeds) {
19841984
if (feed.isLocal() && feed.purpose === SDPStreamMetadataPurpose.Usermedia) {
19851985
this.client.getMediaHandler().stopUserMediaStream(feed.stream);
19861986
} else if (feed.isLocal() && feed.purpose === SDPStreamMetadataPurpose.Screenshare) {
19871987
this.client.getMediaHandler().stopScreensharingStream(feed.stream);
19881988
} else {
1989+
logger.debug("Stopping remote stream", feed.stream.id);
19891990
for (const track of feed.stream.getTracks()) {
19901991
track.stop();
19911992
}

src/webrtc/mediaHandler.ts

+13-4
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,12 @@ export class MediaHandler {
5454
}
5555

5656
/**
57+
* @param audio should have an audio track
58+
* @param video should have a video track
59+
* @param reusable is allowed to be reused by the MediaHandler
5760
* @returns {MediaStream} based on passed parameters
5861
*/
59-
public async getUserMediaStream(audio: boolean, video: boolean): Promise<MediaStream> {
62+
public async getUserMediaStream(audio: boolean, video: boolean, reusable = true): Promise<MediaStream> {
6063
const shouldRequestAudio = audio && await this.hasAudioDevice();
6164
const shouldRequestVideo = video && await this.hasVideoDevice();
6265

@@ -78,7 +81,9 @@ export class MediaHandler {
7881
stream = await navigator.mediaDevices.getUserMedia(constraints);
7982
}
8083

81-
this.userMediaStreams.push(stream);
84+
if (reusable) {
85+
this.userMediaStreams.push(stream);
86+
}
8287

8388
return stream;
8489
}
@@ -101,9 +106,11 @@ export class MediaHandler {
101106
}
102107

103108
/**
109+
* @param desktopCapturerSourceId sourceId for Electron DesktopCapturer
110+
* @param reusable is allowed to be reused by the MediaHandler
104111
* @returns {MediaStream} based on passed parameters
105112
*/
106-
public async getScreensharingStream(desktopCapturerSourceId: string): Promise<MediaStream | null> {
113+
public async getScreensharingStream(desktopCapturerSourceId: string, reusable = true): Promise<MediaStream | null> {
107114
let stream: MediaStream;
108115

109116
if (this.screensharingStreams.length === 0) {
@@ -125,7 +132,9 @@ export class MediaHandler {
125132
stream = matchingStream.clone();
126133
}
127134

128-
this.screensharingStreams.push(stream);
135+
if (reusable) {
136+
this.screensharingStreams.push(stream);
137+
}
129138

130139
return stream;
131140
}

0 commit comments

Comments
 (0)