don't re-clone streams when not needed

This commit is contained in:
Bruno Windels 2022-04-21 10:11:24 +02:00
parent 99769eb84e
commit 55c6dcf613
3 changed files with 40 additions and 12 deletions

View file

@ -43,13 +43,43 @@ export class LocalMedia {
return new LocalMedia(this.userMedia, this.microphoneMuted, this.cameraMuted, this.screenShare, options); return new LocalMedia(this.userMedia, this.microphoneMuted, this.cameraMuted, this.screenShare, options);
} }
replaceClone(oldClone: LocalMedia | undefined, oldOriginal: LocalMedia | undefined): LocalMedia {
let userMedia;
let screenShare;
const cloneOrAdoptStream = (oldOriginalStream: Stream | undefined, oldCloneStream: Stream | undefined, newStream: Stream | undefined): Stream | undefined => {
let stream;
if (oldOriginalStream?.id === newStream?.id) {
stream = oldCloneStream;
} else {
stream = newStream?.clone();
oldCloneStream?.audioTrack?.stop();
oldCloneStream?.videoTrack?.stop();
}
return stream;
}
return new LocalMedia(
cloneOrAdoptStream(oldOriginal?.userMedia, oldClone?.userMedia, this.userMedia),
this.microphoneMuted, this.cameraMuted,
cloneOrAdoptStream(oldOriginal?.screenShare, oldClone?.screenShare, this.screenShare),
this.dataChannelOptions
);
}
clone(): LocalMedia { clone(): LocalMedia {
return new LocalMedia(this.userMedia?.clone(), this.microphoneMuted, this.cameraMuted, this.screenShare?.clone(), this.dataChannelOptions); return new LocalMedia(this.userMedia?.clone(), this.microphoneMuted, this.cameraMuted, this.screenShare?.clone(), this.dataChannelOptions);
} }
dispose() { dispose() {
this.userMedia?.audioTrack?.stop(); this.stopExcept(undefined);
this.userMedia?.videoTrack?.stop(); }
this.screenShare?.videoTrack?.stop();
stopExcept(newMedia: LocalMedia | undefined) {
if(newMedia?.userMedia?.id !== this.userMedia?.id) {
this.userMedia?.audioTrack?.stop();
this.userMedia?.videoTrack?.stop();
}
if(newMedia?.screenShare?.id !== this.screenShare?.id) {
this.screenShare?.videoTrack?.stop();
}
} }
} }

View file

@ -124,13 +124,13 @@ export class GroupCall extends EventEmitter<{change: never}> {
} }
async setMedia(localMedia: LocalMedia): Promise<void> { async setMedia(localMedia: LocalMedia): Promise<void> {
if (this._state === GroupCallState.Joining || this._state === GroupCallState.Joined) { if (this._state === GroupCallState.Joining || this._state === GroupCallState.Joined && this._localMedia) {
const oldMedia = this._localMedia; const oldMedia = this._localMedia!;
this._localMedia = localMedia; this._localMedia = localMedia;
await Promise.all(Array.from(this._members.values()).map(m => { await Promise.all(Array.from(this._members.values()).map(m => {
return m.setMedia(localMedia!.clone()); return m.setMedia(localMedia, oldMedia);
})); }));
oldMedia?.dispose(); oldMedia?.stopExcept(localMedia);
} }
} }

View file

@ -185,11 +185,9 @@ export class Member {
} }
/** @internal */ /** @internal */
async setMedia(localMedia: LocalMedia): Promise<void> { async setMedia(localMedia: LocalMedia, previousMedia: LocalMedia): Promise<void> {
const oldMedia = this.localMedia; this.localMedia = localMedia.replaceClone(this.localMedia, previousMedia);
this.localMedia = localMedia; await this.peerCall?.setMedia(this.localMedia);
await this.peerCall?.setMedia(localMedia);
oldMedia?.dispose();
} }
private _createPeerCall(callId: string): PeerCall { private _createPeerCall(callId: string): PeerCall {