"use client"; import { cn } from "@repo/shared-components"; import { useEffect, useState } from "react"; type MicrophoneLevelProps = { deviceId: string; volumeInput: number; // Verstärkung der Lautstärke }; export default function MicrophoneLevel({ deviceId, volumeInput }: MicrophoneLevelProps) { const [volumeLevel, setVolumeLevel] = useState(0); useEffect(() => { let audioContext: AudioContext | null = null; let analyser: AnalyserNode | null = null; let source: MediaStreamAudioSourceNode | null = null; let rafId: number; async function start() { audioContext = new AudioContext(); const stream = await navigator.mediaDevices.getUserMedia({ audio: { deviceId: deviceId ? { exact: deviceId } : undefined }, }); source = audioContext.createMediaStreamSource(stream); analyser = audioContext.createAnalyser(); analyser.fftSize = 256; source.connect(analyser); const dataArray = new Uint8Array(analyser.frequencyBinCount); const updateVolume = () => { if (!analyser) return; analyser.getByteFrequencyData(dataArray); const avg = dataArray.reduce((a, b) => a + b, 0) / dataArray.length; setVolumeLevel(avg * volumeInput); rafId = requestAnimationFrame(updateVolume); }; updateVolume(); } start(); return () => { cancelAnimationFrame(rafId); audioContext?.close(); }; }, [deviceId, volumeInput]); const barWidth = Math.min((volumeLevel / 140) * 100, 100); return (
Lautstärke sollte beim Sprechen in dem Grünen bereich bleiben. Beachte das scharfe Laute (z.B. "S" oder "Z") die Anzeige verfälschen können.