fix: Fix multiple bugs with new authentication flow
This commit is contained in:
+58
-8
@@ -112,10 +112,17 @@ export class VoicePlaybackService {
|
||||
return;
|
||||
}
|
||||
|
||||
this.removePipeline(peerId);
|
||||
this.rawRemoteStreams.set(peerId, stream);
|
||||
this.masterVolume = options.outputVolume;
|
||||
this.deafened = options.isDeafened;
|
||||
|
||||
if (this.shouldReusePipeline(peerId, stream)) {
|
||||
this.rawRemoteStreams.set(peerId, stream);
|
||||
this.applyGain(peerId);
|
||||
return;
|
||||
}
|
||||
|
||||
this.removePipeline(peerId);
|
||||
this.rawRemoteStreams.set(peerId, stream);
|
||||
this.createPipeline(peerId, stream);
|
||||
}
|
||||
|
||||
@@ -142,13 +149,19 @@ export class VoicePlaybackService {
|
||||
for (const peerId of peers) {
|
||||
const stream = this.voiceConnection.getRemoteVoiceStream(peerId);
|
||||
|
||||
if (stream && this.hasAudio(stream)) {
|
||||
const trackedRaw = this.rawRemoteStreams.get(peerId);
|
||||
|
||||
if (!trackedRaw || trackedRaw !== stream) {
|
||||
this.handleRemoteStream(peerId, stream, options);
|
||||
}
|
||||
if (!stream || !this.hasAudio(stream)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (this.shouldReusePipeline(peerId, stream)) {
|
||||
this.masterVolume = options.outputVolume;
|
||||
this.deafened = options.isDeafened;
|
||||
this.rawRemoteStreams.set(peerId, stream);
|
||||
this.applyGain(peerId);
|
||||
continue;
|
||||
}
|
||||
|
||||
this.handleRemoteStream(peerId, stream, options);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -433,4 +446,41 @@ export class VoicePlaybackService {
|
||||
private hasAudio(stream: MediaStream): boolean {
|
||||
return stream.getAudioTracks().length > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remote composite-stream notifications (camera, screen share, renegotiation)
|
||||
* can arrive without any change to the underlying voice audio tracks.
|
||||
* Rebuilding the Web Audio graph in that case only churns AudioContexts.
|
||||
*/
|
||||
private shouldReusePipeline(peerId: string, stream: MediaStream): boolean {
|
||||
const trackedRaw = this.rawRemoteStreams.get(peerId);
|
||||
|
||||
return this.peerPipelines.has(peerId)
|
||||
&& !!trackedRaw
|
||||
&& this.streamsShareLiveAudioTracks(trackedRaw, stream);
|
||||
}
|
||||
|
||||
private streamsShareLiveAudioTracks(previous: MediaStream, next: MediaStream): boolean {
|
||||
const previousTrackIds = this.getLiveAudioTrackIds(previous);
|
||||
const nextTrackIds = this.getLiveAudioTrackIds(next);
|
||||
|
||||
if (previousTrackIds.length === 0 || nextTrackIds.length === 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (previousTrackIds.length !== nextTrackIds.length) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const previousIds = new Set(previousTrackIds);
|
||||
|
||||
return nextTrackIds.every((trackId) => previousIds.has(trackId));
|
||||
}
|
||||
|
||||
private getLiveAudioTrackIds(stream: MediaStream): string[] {
|
||||
return stream
|
||||
.getAudioTracks()
|
||||
.filter((track) => track.readyState === 'live')
|
||||
.map((track) => track.id);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user