forked from mystiq/hydrogen-web
don't re-clone streams when not needed
This commit is contained in:
parent
99769eb84e
commit
55c6dcf613
3 changed files with 40 additions and 12 deletions
|
@ -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.stopExcept(undefined);
|
||||||
|
}
|
||||||
|
|
||||||
|
stopExcept(newMedia: LocalMedia | undefined) {
|
||||||
|
if(newMedia?.userMedia?.id !== this.userMedia?.id) {
|
||||||
this.userMedia?.audioTrack?.stop();
|
this.userMedia?.audioTrack?.stop();
|
||||||
this.userMedia?.videoTrack?.stop();
|
this.userMedia?.videoTrack?.stop();
|
||||||
|
}
|
||||||
|
if(newMedia?.screenShare?.id !== this.screenShare?.id) {
|
||||||
this.screenShare?.videoTrack?.stop();
|
this.screenShare?.videoTrack?.stop();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Reference in a new issue