{"record":{"id":"2878f792fcb00c55","repo":"tinyhumansai/openhuman","slug":"meet-video-producer-silent-audio-play-failed","errorCode":null,"errorMessage":"[meet-video-producer] silent audio play() failed","messagePattern":"\\[meet-video-producer\\] silent audio play\\(\\) failed","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"app/src/features/meet/MascotFrameProducer.tsx","lineNumber":335,"sourceCode":"    }\n  }, [session.requestId]);\n\n  useEffect(() => {\n    stoppedRef.current = false;\n\n    const SILENT_WAV =\n      'data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEAQB8AAEAfAAABAAgAAABmYWN0BAAAAAAAAABkYXRhAAAAAA==';\n    const keepAliveAudio = document.createElement('audio');\n    keepAliveAudio.muted = true;\n    keepAliveAudio.loop = true;\n    keepAliveAudio.autoplay = true;\n    keepAliveAudio.preload = 'auto';\n    keepAliveAudio.src = SILENT_WAV;\n    keepAliveAudio.style.display = 'none';\n    document.body.appendChild(keepAliveAudio);\n    void keepAliveAudio\n      .play()\n      .catch(err => console.warn('[meet-video-producer] silent audio play() failed', err));\n\n    const url = `ws://127.0.0.1:${session.port}`;\n    let ws: WebSocket;\n    try {\n      ws = new WebSocket(url);\n    } catch (err) {\n      console.warn('[meet-video-producer] ws ctor failed', err);\n      return;\n    }\n    ws.binaryType = 'arraybuffer';\n    wsRef.current = ws;\n    ws.onopen = () => {\n      wsReadyRef.current = true;\n      console.log('[meet-video-producer] ws connected', url);\n    };\n    ws.onclose = () => {\n      wsReadyRef.current = false;\n      console.log('[meet-video-producer] ws closed');","sourceCodeStart":317,"sourceCodeEnd":353,"githubUrl":"https://github.com/tinyhumansai/openhuman/blob/749120085864ce16e0f273c7b86fac7740b39c5b/app/src/features/meet/MascotFrameProducer.tsx#L317-L353","documentation":"Playing the muted looping silent-WAV keep-alive audio element failed at producer mount. The element exists to keep the webview's audio pipeline warm (a Chromium autoplay/audio-graph workaround for the meet session); its play() rejected — typically because autoplay policy blocked it before any user gesture, or the element was detached mid-play. Impact is limited to potential first-sound latency/under-run, not correctness of video frames.","triggerScenarios":"Thrown at app/src/features/meet/MascotFrameProducer.tsx:335 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["If audio in the meet session also fails, trigger any user gesture in the window and check whether audio then works (autoplay policy)","Check the warned err name — NotAllowedError confirms autoplay blocking; AbortError usually means the element was reset mid-play","No action needed if meet audio works — the keep-alive is best-effort","If persistent, restart the meet session after a user interaction with the window"],"exampleFix":null,"handlingStrategy":"fallback","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"749120085864ce16e0f273c7b86fac7740b39c5b","analyzedAt":"2026-08-17T21:21:45.363Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}