Skip to content

Commit b53c6eb

Browse files
committed
use fallback room for deviceselect outside of room
1 parent 51921f4 commit b53c6eb

File tree

3 files changed

+21
-22
lines changed

3 files changed

+21
-22
lines changed

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(false);
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/react/src/hooks/useMediaDeviceSelect.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { createMediaDeviceObserver, setupDeviceSelector, log } from '@livekit/components-core';
2-
import { getBrowser, type LocalAudioTrack, type LocalVideoTrack, type Room } from 'livekit-client';
2+
import { Room, type LocalAudioTrack, type LocalVideoTrack } from 'livekit-client';
33
import * as React from 'react';
44
import { useMaybeRoomContext } from '../context';
55
import { useObservableState } from './internal';
@@ -46,6 +46,9 @@ export function useMediaDeviceSelect({
4646
onError,
4747
}: UseMediaDeviceSelectProps) {
4848
const roomContext = useMaybeRoomContext();
49+
50+
const roomFallback = React.useMemo(() => room ?? roomContext ?? new Room(), [room, roomContext]);
51+
4952
// List of all devices.
5053
const deviceObserver = React.useMemo(
5154
() => createMediaDeviceObserver(kind, onError, requestPermissions),
@@ -54,11 +57,11 @@ export function useMediaDeviceSelect({
5457
const devices = useObservableState(deviceObserver, [] as MediaDeviceInfo[]);
5558
// Active device management.
5659
const [currentDeviceId, setCurrentDeviceId] = React.useState<string>(
57-
roomContext?.getActiveDevice(kind) ?? 'default',
60+
roomFallback?.getActiveDevice(kind) ?? 'default',
5861
);
5962
const { className, activeDeviceObservable, setActiveMediaDevice } = React.useMemo(
60-
() => setupDeviceSelector(kind, room ?? roomContext, track),
61-
[kind, room, roomContext, track],
63+
() => setupDeviceSelector(kind, roomFallback),
64+
[kind, roomFallback, track],
6265
);
6366

6467
React.useEffect(() => {

packages/react/src/prefabs/PreJoin.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import { useMediaDevices, usePersistentUserChoices } from '../hooks';
2424
import { useWarnAboutMissingStyles } from '../hooks/useWarnAboutMissingStyles';
2525
import { defaultUserChoices } from '@livekit/components-core';
2626
import { roomOptionsStringifyReplacer } from '../utils';
27+
import { useMaybeRoomContext } from '../context';
2728

2829
/**
2930
* Props for the PreJoin component.
@@ -55,7 +56,7 @@ export interface PreJoinProps
5556
videoProcessor?: TrackProcessor<Track.Kind.Video>;
5657
}
5758

58-
/** @alpha */
59+
/** @public */
5960
export function usePreviewTracks(
6061
options: CreateLocalTracksOptions,
6162
onError?: (err: Error) => void,
@@ -100,7 +101,7 @@ export function usePreviewTracks(
100101
return tracks;
101102
}
102103

103-
/** @public */
104+
/** @deprecated use `usePreviewTracks` instead */
104105
export function usePreviewDevice<T extends LocalVideoTrack | LocalAudioTrack>(
105106
enabled: boolean,
106107
deviceId: string,
@@ -358,6 +359,8 @@ export function PreJoin({
358359
}
359360
}
360361

362+
const room = useMaybeRoomContext();
363+
361364
useWarnAboutMissingStyles();
362365

363366
return (

0 commit comments

Comments
 (0)