diff --git a/public/locales/en-GB/app.json b/public/locales/en-GB/app.json index 78c86257..938e4ff7 100644 --- a/public/locales/en-GB/app.json +++ b/public/locales/en-GB/app.json @@ -116,6 +116,7 @@ "Talking…": "Talking…", "Thanks! We'll get right on it.": "Thanks! We'll get right on it.", "This call already exists, would you like to join?": "This call already exists, would you like to join?", + "This feature is only supported on Firefox.": "This feature is only supported on Firefox.", "This site is protected by ReCAPTCHA and the Google <2>Privacy Policy and <6>Terms of Service apply.<9>By clicking \"Register\", you agree to our <12>Terms and conditions": "This site is protected by ReCAPTCHA and the Google <2>Privacy Policy and <6>Terms of Service apply.<9>By clicking \"Register\", you agree to our <12>Terms and conditions", "This will make a speaker's audio seem as if it is coming from where their tile is positioned on screen. (Experimental feature: this may impact the stability of audio.)": "This will make a speaker's audio seem as if it is coming from where their tile is positioned on screen. (Experimental feature: this may impact the stability of audio.)", "This will send anonymised data (such as the duration of a call and the number of participants) to the Element Call team to help us optimise the application based on how it is used.": "This will send anonymised data (such as the duration of a call and the number of participants) to the Element Call team to help us optimise the application based on how it is used.", diff --git a/src/input/Input.module.css b/src/input/Input.module.css index fce0a938..b9c7c7af 100644 --- a/src/input/Input.module.css +++ b/src/input/Input.module.css @@ -151,6 +151,15 @@ margin-right: 10px; } +.checkboxField.disabled, +.checkboxField.disabled .description { + color: var(--quinary-content); +} + +.checkboxField.disabled .checkbox { + border-color: var(--quinary-content); +} + .checkbox svg { display: none; } diff --git a/src/room/InCallView.tsx b/src/room/InCallView.tsx index 8f8dc6cd..e773b454 100644 --- a/src/room/InCallView.tsx +++ b/src/room/InCallView.tsx @@ -55,14 +55,14 @@ import { useShowInspector, useSpatialAudio } from "../settings/useSetting"; import { useModalTriggerState } from "../Modal"; import { useAudioContext } from "../video-grid/useMediaStream"; import { useFullscreen } from "../video-grid/useFullscreen"; -import { AudioContainer } from "../video-grid/AudioContainer"; -import { useAudioOutputDevice } from "../video-grid/useAudioOutputDevice"; import { PosthogAnalytics } from "../PosthogAnalytics"; import { widget, ElementWidgetActions } from "../widget"; import { useJoinRule } from "./useJoinRule"; import { useUrlParams } from "../UrlParams"; import { usePrefersReducedMotion } from "../usePrefersReducedMotion"; -import { ConnectionState, ParticipantInfo } from "./useGroupCall"; +import { ParticipantInfo } from "./useGroupCall"; +import { TileDescriptor } from "../video-grid/TileDescriptor"; +import { AudioSink } from "../video-grid/AudioSink"; const canScreenshare = "getDisplayMedia" in (navigator.mediaDevices ?? {}); // There is currently a bug in Safari our our code with cloning and sending MediaStreams @@ -91,18 +91,6 @@ interface Props { hideHeader: boolean; } -// Represents something that should get a tile on the layout, -// ie. a user's video feed or a screen share feed. -export interface TileDescriptor { - id: string; - member: RoomMember; - focused: boolean; - presenter: boolean; - callFeed?: CallFeed; - isLocal?: boolean; - connectionState: ConnectionState; -} - export function InCallView({ client, groupCall, @@ -145,15 +133,12 @@ export function InCallView({ const [spatialAudio] = useSpatialAudio(); - const [audioContext, audioDestination, audioRef] = useAudioContext(); - const { audioOutput } = useMediaHandler(); + const [audioContext, audioDestination] = useAudioContext(); const [showInspector] = useShowInspector(); const { modalState: feedbackModalState, modalProps: feedbackModalProps } = useModalTriggerState(); - useAudioOutputDevice(audioRef, audioOutput); - const { hideScreensharing } = useUrlParams(); useEffect(() => { @@ -348,6 +333,27 @@ export function InCallView({ [styles.maximised]: maximisedParticipant, }); + // If spatial audio is disabled, we render one audio tag for each participant + // (with spatial audio, all the audio goes via the Web Audio API) + // We also do this if there's a feed maximised because we only trigger spatial + // audio rendering for feeds that we're displaying, which will need to be fixed + // once we start having more participants than we can fit on a screen, but this + // is a workaround for now. + const { audioOutput } = useMediaHandler(); + const audioElements: JSX.Element[] = []; + if (!spatialAudio || maximisedParticipant) { + for (const item of items) { + if (item.isLocal) continue; // We don't want to render own audio + audioElements.push( + + ); + } + } + let footer: JSX.Element | null; if (noControls) { @@ -386,14 +392,7 @@ export function InCallView({ return (
-