import styles from "./Panes.module.scss"; import { Text } from "preact-i18n"; import { useEffect, useState } from "preact/hooks"; import { TextReact } from "../../../lib/i18n"; import { stopPropagation } from "../../../lib/stopPropagation"; import { voiceState } from "../../../lib/vortex/VoiceState"; import Button from "../../../components/ui/Button"; import ComboBox from "../../../components/ui/ComboBox"; import Overline from "../../../components/ui/Overline"; import Tip from "../../../components/ui/Tip"; import opusSVG from "../assets/opus_logo.svg"; { /*import OpusSVG from "../assets/opus_logo.svg";*/ } const constraints = { audio: true }; // TODO: do not rewrite this code until voice is rewritten! export function Audio() { const [mediaStream, setMediaStream] = useState( undefined, ); const [mediaDevices, setMediaDevices] = useState< MediaDeviceInfo[] | undefined >(undefined); const [permission, setPermission] = useState( undefined, ); const [error, setError] = useState(undefined); const askOrGetPermission = async () => { try { const result = await navigator.mediaDevices.getUserMedia( constraints, ); setMediaStream(result); } catch (err) { // The user has blocked the permission setError(err as DOMException); } try { const { state } = await navigator.permissions.query({ // eslint-disable-next-line // @ts-ignore: very few browsers accept this `PermissionName`, but it has been drafted in https://www.w3.org/TR/permissions/#powerful-features-registry name: "microphone", }); setPermission(state); } catch (err) { // the browser might not support `query` functionnality or `PermissionName` // nothing to do } }; useEffect(() => { return () => { if (mediaStream) { // close microphone access on unmount mediaStream.getTracks().forEach((track) => { track.stop(); }); } }; }, [mediaStream]); useEffect(() => { if (!mediaStream) { return; } navigator.mediaDevices.enumerateDevices().then( (devices) => { setMediaDevices(devices); }, (err) => { setError(err as DOMException); }, ); }, [mediaStream]); const handleAskForPermission = ( ev: JSX.TargetedMouseEvent, ) => { stopPropagation(ev); setError(undefined); askOrGetPermission(); }; return ( <>
{!permission && ( )} {error && permission === "prompt" && ( . )}

changeAudioDevice( e.currentTarget.value, "input", ) }> {mediaDevices ?.filter( (device) => device.kind === "audioinput", ) .map((device) => { return ( ); })} {/*TOFIX: add logic to sound notches*/} {/*
*/} {!permission && ( )} {error && error.name === "NotAllowedError" && ( )}

{/* TOFIX: create audio output combobox*/} changeAudioDevice( e.currentTarget.value, "output", ) }> {mediaDevices ?.filter( (device) => device.kind === "audiooutput", ) .map((device) => { return ( ); })} {/*
*/}

Audio codec powered by Opus
); } function changeAudioDevice(deviceId: string, deviceType: string) { if (deviceType === "input") { window.localStorage.setItem("audioInputDevice", deviceId); if (voiceState.isProducing("audio")) { voiceState.stopProducing("audio"); voiceState.startProducing("audio"); } } else if (deviceType === "output") { window.localStorage.setItem("audioOutputDevice", deviceId); } }