← back to Dead Agentabrams
Fix stray sound leak on manual video picks + reduce backdrop opacity
559b69af33975a9eacee29be7b48c15ca0e89f3a · 2026-09-03 12:08:54 -0700 · Steve Abrams
Steve: "no sound when selected and make not opaque."
1. Sound leak: archive.org has been down all session, so bootMusic's
auto-failover pre-arms a global tap/key "unlock" listener that
unmutes the YouTube player on the NEXT gesture anywhere on the
page. That listener didn't know about muted manual picks from the
Videos panel, so the very click that selected a video (a gesture)
could immediately unmute it right after playConcertManual() set it
muted — a race. Added VB.forceMuted, set true in playConcertManual
(manual picks are meant to be silent decoration) and explicitly
false in enterYouTubeFallback (the real outage fallback IS the
show, still allowed to unmute on a gesture); the unlock listener
now checks it before ever calling unMute().
2. Opacity: #venueVideo was opaque (1) once shown — dropped to .55 so
the backdrop reads as translucent, not a solid opaque panel.
Files touched
Diff
commit 559b69af33975a9eacee29be7b48c15ca0e89f3a
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Thu Sep 3 12:08:54 2026 -0700
Fix stray sound leak on manual video picks + reduce backdrop opacity
Steve: "no sound when selected and make not opaque."
1. Sound leak: archive.org has been down all session, so bootMusic's
auto-failover pre-arms a global tap/key "unlock" listener that
unmutes the YouTube player on the NEXT gesture anywhere on the
page. That listener didn't know about muted manual picks from the
Videos panel, so the very click that selected a video (a gesture)
could immediately unmute it right after playConcertManual() set it
muted — a race. Added VB.forceMuted, set true in playConcertManual
(manual picks are meant to be silent decoration) and explicitly
false in enterYouTubeFallback (the real outage fallback IS the
show, still allowed to unmute on a gesture); the unlock listener
now checks it before ever calling unMute().
2. Opacity: #venueVideo was opaque (1) once shown — dropped to .55 so
the backdrop reads as translucent, not a solid opaque panel.
---
room/index.html | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/room/index.html b/room/index.html
index 67c170d..ba9860e 100644
--- a/room/index.html
+++ b/room/index.html
@@ -35,7 +35,7 @@
overflow:hidden;z-index:0;pointer-events:none;background:#000;opacity:0;
transition:opacity 1.4s ease,left .15s,top .15s,width .15s,height .15s;border-radius:3px}
#venueVideo iframe,#venueVideo>div{position:absolute;inset:0;width:100%;height:100%;border:0;pointer-events:none}
- #stage.video-bg #venueVideo{opacity:1}
+ #stage.video-bg #venueVideo{opacity:.55}
#stage.video-bg #sky{opacity:.20}
#stage.video-bg #scene{opacity:.85}
/* YouTube fallback = the video IS the show → let it fill the frame, not just the riser box */
@@ -1850,6 +1850,7 @@ function _primeYTUnlock(){
const done=()=>{ document.removeEventListener('pointerdown',go,true); document.removeEventListener('keydown',go,true); _ytUnlockArmed=false; };
const go=()=>{
if(VB.mode!=='youtube'){ done(); return; } // left the fallback — stop listening
+ if(VB.forceMuted) return; // a manual Videos-panel pick wants silence — don't let a stray gesture unmute it
if(!VB.player || !VB.player.unMute){ return; } // player not built yet — KEEP listening for the next gesture (no wasted tap)
try{ VB.player.unMute(); VB.player.setVolume(100); VB.player.playVideo(); }catch(e){}
done();
@@ -1865,7 +1866,7 @@ function enterArchiveMode(show){
}
// youtube fallback: archive.org is down → the video BECOMES the audio (unmuted). Mutual exclusion: kill <audio>.
function enterYouTubeFallback(show, hadGesture){
- VB.mode='youtube';
+ VB.mode='youtube'; VB.forceMuted=false; // the real outage fallback IS the show — allowed to unmute on a gesture
try{ audio.pause(); }catch(e){}
try{ audio.removeAttribute('src'); audio.load(); }catch(e){} // no archive audio can leak under the video
// Prefer the gesture captured BEFORE the metadata await (transient activation expires in ~5s); else read it live.
@@ -1892,7 +1893,7 @@ function enterYouTubeFallback(show, hadGesture){
// NOT the full-screen yt-hero "now watching" mode — that stays reserved for the real
// archive.org-is-down fallback (enterYouTubeFallback), where the video IS the whole show.
function playConcertManual(id, title){
- VB.mode='youtube';
+ VB.mode='youtube'; VB.forceMuted=true; // silent decoration — never let the archive-fallback's stray tap-to-unmute listener touch this
try{ audio.pause(); }catch(e){}
try{ audio.removeAttribute('src'); audio.load(); }catch(e){} // one audio owner — kill archive audio
VB.wantId=id; VB.wantPlay=true; VB.wantMuted=true; VB._tried=new Set(); VB._hops=0;
← ff54235 Lock in Steve's dialed-in backdrop position as the default
·
back to Dead Agentabrams
·
Music room: concert plays on a movie SCREEN on the stage, or 650582d →