🎙️ 麥克風波形測試器

+1.0
0
−1.0

⏳ 等待啟動…


📐 架構圖
flowchart TD
    USER["使用者點擊\n▶ 啟動麥克風"] --> PERM["navigator.mediaDevices\n.getUserMedia({ audio: true })\nTry-Catch 授權處理"]
    PERM -->|"授權成功\nMediaStream"| CTX["new AudioContext()\n建立音訊處理上下文"]
    PERM -->|"授權拒絕 /\n無麥克風裝置"| ERR["❌ 狀態列顯示錯誤\n#mic-status"]
    CTX --> SRC["createMediaStreamSource(stream)\n將麥克風串流接入 AudioContext"]
    SRC --> ANA["createAnalyser()\nfftSize = 2048\nfrequencyBinCount = 1024\n→ Uint8Array(1024)"]
    ANA --> RAF["requestAnimationFrame 渲染迴圈\n每幀呼叫 analyser.getByteTimeDomainData()"]
    RAF --> CANVAS["<canvas#mic-canvas>\n線條:#00ff00 螢光綠\n背景:#1a1a1a 深黑\n網格線:rgba(0,255,0,.08)"]
    CANVAS -->|"每 16ms\n(~60fps)"| RAF
    STOP["使用者點擊\n■ 停止測試"] --> CLOSE["cancelAnimationFrame()\nAudioContext.close()\nstream.getTracks().stop()\n狀態 → 已停止"]