Skip to content

Commit cf1a07d

Browse files
authored
Only override deviceId constraint if it diverges (#1388)
1 parent a0d7208 commit cf1a07d

File tree

2 files changed

+14
-7
lines changed

2 files changed

+14
-7
lines changed

src/room/track/LocalTrack.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,7 @@ export default abstract class LocalTrack<
232232
) {
233233
return true;
234234
}
235+
235236
this._constraints.deviceId = deviceId;
236237

237238
// when track is muted, underlying media stream track is stopped and
@@ -313,6 +314,7 @@ export default abstract class LocalTrack<
313314
if (!constraints) {
314315
constraints = this._constraints;
315316
}
317+
const { deviceId, ...otherConstraints } = this._constraints;
316318
this.log.debug('restarting track with constraints', { ...this.logContext, constraints });
317319

318320
const streamConstraints: MediaStreamConstraints = {
@@ -321,9 +323,9 @@ export default abstract class LocalTrack<
321323
};
322324

323325
if (this.kind === Track.Kind.Video) {
324-
streamConstraints.video = constraints;
326+
streamConstraints.video = deviceId ? { deviceId } : true;
325327
} else {
326-
streamConstraints.audio = constraints;
328+
streamConstraints.audio = deviceId ? { deviceId } : true;
327329
}
328330

329331
// these steps are duplicated from setMediaStreamTrack because we must stop
@@ -340,6 +342,7 @@ export default abstract class LocalTrack<
340342
// create new track and attach
341343
const mediaStream = await navigator.mediaDevices.getUserMedia(streamConstraints);
342344
const newTrack = mediaStream.getTracks()[0];
345+
await newTrack.applyConstraints(otherConstraints);
343346
newTrack.addEventListener('ended', this.handleEnded);
344347
this.log.debug('re-acquired MediaStreamTrack', this.logContext);
345348

src/room/track/create.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import DeviceManager from '../DeviceManager';
22
import { audioDefaults, videoDefaults } from '../defaults';
33
import { DeviceUnsupportedError, TrackInvalidError } from '../errors';
44
import { mediaTrackToLocalTrack } from '../participant/publishUtils';
5-
import { isAudioTrack, isSafari17, isVideoTrack } from '../utils';
5+
import { isAudioTrack, isSafari17, isVideoTrack, unwrapConstraint } from '../utils';
66
import LocalAudioTrack from './LocalAudioTrack';
77
import type LocalTrack from './LocalTrack';
88
import LocalVideoTrack from './LocalVideoTrack';
@@ -68,10 +68,14 @@ export async function createLocalTracks(
6868

6969
// update the constraints with the device id the user gave permissions to in the permission prompt
7070
// otherwise each track restart (e.g. mute - unmute) will try to initialize the device again -> causing additional permission prompts
71-
if (trackConstraints) {
72-
trackConstraints.deviceId = mediaStreamTrack.getSettings().deviceId;
73-
} else {
74-
trackConstraints = { deviceId: mediaStreamTrack.getSettings().deviceId };
71+
const newDeviceId = mediaStreamTrack.getSettings().deviceId;
72+
if (
73+
trackConstraints?.deviceId &&
74+
unwrapConstraint(trackConstraints.deviceId) !== newDeviceId
75+
) {
76+
trackConstraints.deviceId = newDeviceId;
77+
} else if (!trackConstraints) {
78+
trackConstraints = { deviceId: newDeviceId };
7579
}
7680

7781
const track = mediaTrackToLocalTrack(mediaStreamTrack, trackConstraints);

0 commit comments

Comments
 (0)