import { useCallback, useEffect, useRef, useState } from "react" // Push-to-talk-Aufnahme über MediaRecorder. `start` beim Drücken (Taste/Button), `stop` beim // Loslassen → fertiges Audio-Blob (webm/opus) geht an `onAudio`. Bewusst minimal & generisch. export function usePushToTalk(onAudio: (blob: Blob) => void) { const [recording, setRecording] = useState(false) const recRef = useRef(null) const chunksRef = useRef([]) const streamRef = useRef(null) const start = useCallback(async () => { if (recRef.current) return let stream: MediaStream try { stream = await navigator.mediaDevices.getUserMedia({ audio: true }) } catch (e) { console.error("Mikrofon-Zugriff verweigert:", e) return } streamRef.current = stream const mime = MediaRecorder.isTypeSupported("audio/webm;codecs=opus") ? "audio/webm;codecs=opus" : "audio/webm" const rec = new MediaRecorder(stream, { mimeType: mime }) chunksRef.current = [] rec.ondataavailable = (e) => { if (e.data.size) chunksRef.current.push(e.data) } rec.onstop = () => { const blob = new Blob(chunksRef.current, { type: mime }) streamRef.current?.getTracks().forEach((t) => t.stop()) streamRef.current = null recRef.current = null setRecording(false) if (blob.size > 1200) onAudio(blob) // Mini-Blobs (Versehen) ignorieren } rec.start() recRef.current = rec setRecording(true) }, [onAudio]) const stop = useCallback(() => { recRef.current?.stop() }, []) useEffect(() => () => { recRef.current?.stop() streamRef.current?.getTracks().forEach((t) => t.stop()) }, []) return { recording, start, stop } }