Skip to content

Commit

Permalink
Fix joining calls with no media permission
Browse files Browse the repository at this point in the history
You can still try to unmute your media in the preview screen and
the button will show unmuted, but then mute again once you actually
join, so not 100% perfect but better.

Fixes #1907
Fixes #1661
  • Loading branch information
dbkr committed Nov 20, 2023
1 parent 85250e6 commit 861d8ec
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 21 deletions.
34 changes: 18 additions & 16 deletions src/livekit/useECConnectionState.ts
Original file line number Diff line number Diff line change
Expand Up @@ -72,35 +72,37 @@ async function doConnect(
}

logger.info("Pre-creating microphone track");
const audioTracks = await livekitRoom!.localParticipant.createTracks({
audio: audioOptions,
});
if (audioTracks.length < 1) {
logger.info("Tried to pre-create local audio track but got no tracks");
return;
let preCreatedAudioTrack: LocalTrack | undefined;
try {
const audioTracks = await livekitRoom!.localParticipant.createTracks({
audio: audioOptions,
});
if (audioTracks.length < 1) {
logger.info("Tried to pre-create local audio track but got no tracks");
} else {
preCreatedAudioTrack = audioTracks[0];
}
logger.info("Pre-created microphone track");
} catch (e) {
logger.error("Failed to pre-create microphone track", e);
}
if (!audioEnabled) await audioTracks[0].mute();

logger.info("Pre-created microphone track");
if (!audioEnabled) await preCreatedAudioTrack?.mute();

// check again having awaited for the track to create
if (livekitRoom!.localParticipant.getTrack(Track.Source.Microphone)) {
logger.warn(
"Publishing pre-created audio track but participant already appears to have an microphone track: this shouldn't happen!",
"Pre-created audio track but participant already appears to have an microphone track: this shouldn't happen!",
);
for (const t of audioTracks) {
t.stop();
}
preCreatedAudioTrack?.stop();
return;
}

logger.info("Connecting & publishing");
try {
await connectAndPublish(livekitRoom, sfuConfig, audioTracks[0], []);
await connectAndPublish(livekitRoom, sfuConfig, preCreatedAudioTrack, []);
} catch (e) {
for (const t of audioTracks) {
t.stop();
}
preCreatedAudioTrack?.stop();
}
}

Expand Down
24 changes: 19 additions & 5 deletions src/livekit/useLiveKit.ts
Original file line number Diff line number Diff line change
Expand Up @@ -245,11 +245,25 @@ export function useLiveKit(
);
}
} catch (e) {
logger.error(
"Failed to sync audio mute state with LiveKit (will retry to sync in 1s):",
e,
);
setTimeout(() => syncMuteState(iterCount + 1, type), 1000);
if ((e as DOMException).name === "NotAllowedError") {
logger.error(
"Fatal errror while syncing mute state: resetting",
e,
);
if (type === MuteDevice.Microphone) {
audioMuteUpdating.current = false;
muteStates.audio.setEnabled?.(false);
} else {
videoMuteUpdating.current = false;
muteStates.video.setEnabled?.(false);
}
} else {
logger.error(
"Failed to sync audio mute state with LiveKit (will retry to sync in 1s):",
e,
);
setTimeout(() => syncMuteState(iterCount + 1, type), 1000);
}
}
}
};
Expand Down
2 changes: 2 additions & 0 deletions src/room/VideoPreview.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,8 @@ export const VideoPreview: FC<Props> = ({
},
(error) => {
logger.error("Error while creating preview Tracks:", error);
muteStates.audio.setEnabled?.(false);
muteStates.video.setEnabled?.(false);
},
);
const videoTrack = useMemo(
Expand Down

0 comments on commit 861d8ec

Please sign in to comment.