Skip to content

Commit 31a2b04

Browse files
authored
Improve default device handling (#1056)
1 parent 9f71b4d commit 31a2b04

File tree

18 files changed

+93
-81
lines changed

18 files changed

+93
-81
lines changed

.changeset/unlucky-emus-float.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"@livekit/components-core": minor
3+
"@livekit/components-react": minor
4+
---
5+
6+
Improve default device handling

.npmrc

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
dedupe-peer-dependents=true
21
resolve-peers-from-workspace-root=true
32
manage-package-manager-versions=true
43
package-manager-strict-version=true

docs/storybook/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"dependencies": {
1414
"@livekit/components-react": "workspace:*",
1515
"@livekit/components-styles": "workspace:*",
16-
"livekit-client": "^2.5.7",
16+
"livekit-client": "catalog:",
1717
"react": "^18.2.0",
1818
"react-dom": "^18.2.0"
1919
},

examples/nextjs/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"@livekit/components-react": "workspace:*",
1414
"@livekit/components-styles": "workspace:*",
1515
"@livekit/track-processors": "^0.3.2",
16-
"livekit-client": "^2.5.7",
16+
"livekit-client": "catalog:",
1717
"livekit-server-sdk": "^2.6.1",
1818
"next": "^14.2.13",
1919
"react": "^18.2.0",

package.json

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,6 @@
4040
"turbo": "^2.1.1",
4141
"typescript": "5.6.2"
4242
},
43-
"dependencies": {
44-
"livekit-client": "^2.5.7"
45-
},
4643
"engines": {
4744
"node": ">=18"
4845
},

packages/core/etc/components-core.api.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -546,9 +546,9 @@ export function setupDataMessageHandler<T extends string>(room: Room, topic?: T
546546
};
547547

548548
// @public (undocumented)
549-
export function setupDeviceSelector(kind: MediaDeviceKind, room?: Room, localTrack?: LocalAudioTrack | LocalVideoTrack): {
549+
export function setupDeviceSelector(kind: MediaDeviceKind, room: Room, localTrack?: LocalAudioTrack | LocalVideoTrack): {
550550
className: string;
551-
activeDeviceObservable: Observable<string | undefined>;
551+
activeDeviceObservable: Observable<string>;
552552
setActiveMediaDevice: (id: string, options?: SetMediaDeviceOptions) => Promise<void>;
553553
};
554554

packages/core/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
"rxjs": "7.8.1"
4141
},
4242
"peerDependencies": {
43-
"livekit-client": "^2.5.7",
43+
"livekit-client": "catalog:",
4444
"tslib": "^2.6.2"
4545
},
4646
"devDependencies": {

packages/core/src/components/mediaDeviceSelect.ts

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,21 @@ export type SetMediaDeviceOptions = {
2020

2121
export function setupDeviceSelector(
2222
kind: MediaDeviceKind,
23-
room?: Room,
23+
room: Room,
2424
localTrack?: LocalAudioTrack | LocalVideoTrack,
2525
) {
2626
const activeDeviceSubject = new BehaviorSubject<string | undefined>(undefined);
2727

28-
const activeDeviceObservable = room
29-
? createActiveDeviceObservable(room, kind)
30-
: activeDeviceSubject.asObservable();
28+
const activeDeviceObservable = createActiveDeviceObservable(room, kind);
3129

3230
const setActiveMediaDevice = async (id: string, options: SetMediaDeviceOptions = {}) => {
33-
if (room) {
31+
if (localTrack) {
32+
await localTrack.setDeviceId(options.exact ? { exact: id } : id);
33+
const actualId = await localTrack.getDeviceId(false);
34+
activeDeviceSubject.next(
35+
id === 'default' && localTrack.mediaStreamTrack.label.startsWith('Default') ? id : actualId,
36+
);
37+
} else if (room) {
3438
log.debug(`Switching active device of kind "${kind}" with id ${id}.`);
3539
await room.switchActiveDevice(kind, id, options.exact);
3640
const actualDeviceId: string | undefined = room.getActiveDevice(kind) ?? id;
@@ -49,17 +53,6 @@ export function setupDeviceSelector(
4953
(id === 'default' && !targetTrack) ||
5054
(id === 'default' && targetTrack?.mediaStreamTrack.label.startsWith('Default'));
5155
activeDeviceSubject.next(useDefault ? id : actualDeviceId);
52-
} else if (localTrack) {
53-
await localTrack.setDeviceId(options.exact ? { exact: id } : id);
54-
const actualId = await localTrack.getDeviceId();
55-
activeDeviceSubject.next(
56-
id === 'default' && localTrack.mediaStreamTrack.label.startsWith('Default') ? id : actualId,
57-
);
58-
} else if (activeDeviceSubject.value !== id) {
59-
log.warn(
60-
'device switch skipped, please provide either a room or a local track to switch on. ',
61-
);
62-
activeDeviceSubject.next(id);
6356
}
6457
};
6558
const className: string = prefixClass('media-device-select');

packages/core/src/persistent-storage/user-choices.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ export type LocalUserChoices = {
3939
export const defaultUserChoices: LocalUserChoices = {
4040
videoEnabled: true,
4141
audioEnabled: true,
42-
videoDeviceId: '',
43-
audioDeviceId: '',
42+
videoDeviceId: 'default',
43+
audioDeviceId: 'default',
4444
username: '',
4545
} as const;
4646

packages/react/etc/components-react.api.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1075,14 +1075,14 @@ export interface UsePersistentUserChoicesOptions {
10751075
// @public
10761076
export function usePinnedTracks(layoutContext?: LayoutContextType): TrackReferenceOrPlaceholder[];
10771077

1078-
// @public (undocumented)
1078+
// @public @deprecated (undocumented)
10791079
export function usePreviewDevice<T extends LocalVideoTrack | LocalAudioTrack>(enabled: boolean, deviceId: string, kind: 'videoinput' | 'audioinput'): {
10801080
selectedDevice: MediaDeviceInfo | undefined;
10811081
localTrack: T | undefined;
10821082
deviceError: Error | null;
10831083
};
10841084

1085-
// @alpha (undocumented)
1085+
// @public (undocumented)
10861086
export function usePreviewTracks(options: CreateLocalTracksOptions, onError?: (err: Error) => void): LocalTrack<Track.Kind>[] | undefined;
10871087

10881088
// Warning: (ae-incompatible-release-tags) The symbol "useRemoteParticipant" is marked as @public, but its signature references "ParticipantIdentifier" which is marked as @beta

0 commit comments

Comments
 (0)