Skip to content

useMediaDeviceSelect doesn't pass track to setupDeviceSelector, making setActiveMediaDevice ineffective in preview mode #1315

@rm-labo

Description

@rm-labo

Bug Report

useMediaDeviceSelect calls setupDeviceSelector(kind, roomFallback) without passing the track argument, even though track is accepted as a prop.

File: packages/react/src/hooks/useMediaDeviceSelect.ts line 63

const { className, activeDeviceObservable, setActiveMediaDevice } = React.useMemo(
  () => setupDeviceSelector(kind, roomFallback),  // track is not passed
  [kind, roomFallback, track],
);

setupDeviceSelector in @livekit/components-core expects 3 arguments: (kind, room, localTrack). When localTrack is provided, it correctly calls localTrack.setDeviceId(). Without it, it falls back to room.switchActiveDevice(), which does nothing in preview mode (pre-room-connect) since room is a dummy new Room() instance.

Expected fix

- () => setupDeviceSelector(kind, roomFallback),
+ () => setupDeviceSelector(kind, roomFallback, track),

Impact

In any pre-join / preview UI that uses useMediaDeviceSelect with a track from usePreviewTracks / createLocalTracks, calling setActiveMediaDevice silently does nothing — users cannot switch microphone or camera before joining a room.

Versions

  • @livekit/components-react: 2.9.20
  • @livekit/components-core: 0.12.13
  • livekit-client: 2.18.0

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions