From be04eeded0509bfde4159642bc6b35c3329aae51 Mon Sep 17 00:00:00 2001 From: Bruno Windels <274386+bwindels@users.noreply.github.com> Date: Wed, 27 Apr 2022 17:33:27 +0200 Subject: [PATCH] always reevaluate remote media when receiving a new remote track not just when we don't know the stream already this caused the video track to not appear when the other party sends the invite. Also added more logging --- src/matrix/calls/PeerCall.ts | 63 ++++++++++++++++++++++-------------- 1 file changed, 38 insertions(+), 25 deletions(-) diff --git a/src/matrix/calls/PeerCall.ts b/src/matrix/calls/PeerCall.ts index 6aff72c1..15331ab5 100644 --- a/src/matrix/calls/PeerCall.ts +++ b/src/matrix/calls/PeerCall.ts @@ -902,6 +902,9 @@ export class PeerCall implements IDisposable { private onRemoteTrack(track: Track, streams: ReadonlyArray, log: ILogItem) { + log.set("kind", track.kind); + log.set("id", track.id); + log.set("streams", streams.map(s => s.id)); if (streams.length === 0) { log.log({l: `ignoring ${track.kind} streamless track`, id: track.id}); return; @@ -932,39 +935,49 @@ export class PeerCall implements IDisposable { disposeListener, stream }); - this.updateRemoteMedia(log); } + this.updateRemoteMedia(log); } private updateRemoteMedia(log: ILogItem): void { - this._remoteMedia.userMedia = undefined; - this._remoteMedia.screenShare = undefined; - if (this.remoteSDPStreamMetadata) { - for (const streamDetails of this._remoteStreams.values()) { - const {stream} = streamDetails; - const metaData = this.remoteSDPStreamMetadata[stream.id]; - if (metaData) { - if (metaData.purpose === SDPStreamMetadataPurpose.Usermedia) { - this._remoteMedia.userMedia = stream; - const audioReceiver = this.findReceiverForStream(TrackKind.Audio, stream.id); - if (audioReceiver) { - audioReceiver.track.enabled = !metaData.audio_muted; + log.wrap("reevaluating remote media", log => { + this._remoteMedia.userMedia = undefined; + this._remoteMedia.screenShare = undefined; + if (this.remoteSDPStreamMetadata) { + for (const streamDetails of this._remoteStreams.values()) { + const {stream} = streamDetails; + const metaData = this.remoteSDPStreamMetadata[stream.id]; + if (metaData) { + if (metaData.purpose === SDPStreamMetadataPurpose.Usermedia) { + this._remoteMedia.userMedia = stream; + const audioReceiver = this.findReceiverForStream(TrackKind.Audio, stream.id); + if (audioReceiver) { + audioReceiver.track.enabled = !metaData.audio_muted; + } + const videoReceiver = this.findReceiverForStream(TrackKind.Video, stream.id); + if (videoReceiver) { + videoReceiver.track.enabled = !metaData.video_muted; + } + this._remoteMuteSettings = new MuteSettings( + metaData.audio_muted || !audioReceiver?.track, + metaData.video_muted || !videoReceiver?.track + ); + log.log({ + l: "setting userMedia", + micMuted: this._remoteMuteSettings.microphone, + cameraMuted: this._remoteMuteSettings.camera + }); + } else if (metaData.purpose === SDPStreamMetadataPurpose.Screenshare) { + this._remoteMedia.screenShare = stream; + log.log("setting screenShare"); } - const videoReceiver = this.findReceiverForStream(TrackKind.Video, stream.id); - if (videoReceiver) { - videoReceiver.track.enabled = !metaData.video_muted; - } - this._remoteMuteSettings = new MuteSettings( - metaData.audio_muted || !audioReceiver?.track, - metaData.video_muted || !videoReceiver?.track - ); - } else if (metaData.purpose === SDPStreamMetadataPurpose.Screenshare) { - this._remoteMedia.screenShare = stream; + } else { + log.log({l: "no metadata yet for stream, ignoring for now", id: stream.id}); } } } - } - this.options.emitUpdate(this, undefined); + this.options.emitUpdate(this, undefined); + }); } private updateLocalMedia(localMedia: LocalMedia, logItem: ILogItem): Promise {