[object Object]

← 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 →