diff --git a/src/state/MediaViewModel.test.ts b/src/state/MediaViewModel.test.ts index 1e5e3e58..8b186658 100644 --- a/src/state/MediaViewModel.test.ts +++ b/src/state/MediaViewModel.test.ts @@ -182,8 +182,9 @@ test("switch cameras", async () => { async (vm) => { // Switch to back camera getValue(vm.switchCamera$)!(); - expect(restartTrack).toHaveBeenCalledTimes(1); - expect(restartTrack).toHaveBeenCalledWith({ facingMode: "environment" }); + expect(restartTrack).toHaveBeenCalledExactlyOnceWith({ + facingMode: "environment", + }); await waitFor(() => { expect(selectVideoInput).toHaveBeenCalledTimes(1); expect(selectVideoInput).toHaveBeenCalledWith("back camera"); diff --git a/src/state/MediaViewModel.ts b/src/state/MediaViewModel.ts index 704440a1..2e690226 100644 --- a/src/state/MediaViewModel.ts +++ b/src/state/MediaViewModel.ts @@ -456,11 +456,13 @@ export class LocalUserMediaViewModel extends BaseUserMediaViewModel { const track = v?.publication?.track; if (!(track instanceof LocalVideoTrack)) return of(null); return merge( - // Watch for track restarts because they indicate a camera switch + // Watch for track restarts because they indicate a camera switch. + // This event is also emitted when unmuting the track object. fromEvent(track, TrackEvent.Restarted).pipe( startWith(null), map(() => track), ), + // When the track object is muted, reset it to null. fromEvent(track, TrackEvent.Muted).pipe(map(() => null)), ); }),