From f048be3640bff1924992e2bf98913fc9b22d77f9 Mon Sep 17 00:00:00 2001 From: 3nd3r Date: Fri, 2 Jan 2026 21:50:59 -0600 Subject: [PATCH] Fix browser blocked audio by calling play() immediately on user gesture --- script.js | 52 +++++++++++++++++----------------------------------- 1 file changed, 17 insertions(+), 35 deletions(-) diff --git a/script.js b/script.js index d803097..e3714a4 100644 --- a/script.js +++ b/script.js @@ -2344,50 +2344,32 @@ async function enableListenerAudio() { return window.listenerAudio.buffered && window.listenerAudio.buffered.length > 0; }; - // If no buffered data yet, wait a bit for it to arrive + // Attempt playback IMMEDIATELY to capture user gesture + // We do this before waiting for data so we don't lose the "user interaction" token + console.log('▶️ Attempting to play audio...'); + const playPromise = window.listenerAudio.play(); + + // If no buffered data yet, show status but don't block playback if (!hasBufferedData()) { console.log('⏳ Waiting for audio data to buffer...'); if (audioText) { audioText.textContent = chunksReceived > 0 ? 'BUFFERING...' : 'WAITING FOR STREAM...'; } - - // Wait up to 10 seconds for data to arrive (increased from 5) - const waitForData = new Promise((resolve) => { - let attempts = 0; - const maxAttempts = 100; // 10 seconds (100 * 100ms) - - const checkInterval = setInterval(() => { - attempts++; - - if (audioText && chunksReceived > 0 && audioText.textContent === 'WAITING FOR STREAM...') { - audioText.textContent = 'BUFFERING...'; - } - - if (attempts % 10 === 0) { // Log every second - console.log(`⏱️ Attempt ${attempts}/${maxAttempts} - Buffered: ${window.listenerAudio.buffered.length}, ReadyState: ${window.listenerAudio.readyState}`); - } - - if (hasBufferedData()) { - clearInterval(checkInterval); - console.log('✅ Audio data buffered, ready to play'); - resolve(); - } else if (attempts >= maxAttempts) { - clearInterval(checkInterval); - // Don't reject - try to play anyway, MediaSource might handle it - console.warn('⚠️ Timeout waiting for buffered data, attempting playback anyway...'); - resolve(); - } - }, 100); - }); - - await waitForData; + + // Start a background checker to update UI + const checkInterval = setInterval(() => { + if (hasBufferedData()) { + clearInterval(checkInterval); + console.log('✅ Audio data buffered'); + } else if (audioText && chunksReceived > 0 && audioText.textContent === 'WAITING FOR STREAM...') { + audioText.textContent = 'BUFFERING...'; + } + }, 500); } else { console.log('✅ Audio already has buffered data'); } - // Attempt playback - console.log('▶️ Attempting to play audio...'); - await window.listenerAudio.play(); + await playPromise; console.log('✅ Audio playback started successfully'); // Mark audio as enabled so status updates can now display