zebra-report: stream toggle on own row — DJ self-monitor

DJ can preview the ~2s delayed Ogg/Opus stream of their own mic to
confirm what listeners hear. Closed headphones recommended; open
speakers + music mode = feedback (title attr warns).
This commit is contained in:
russell@unturf.com 2026-06-03 18:44:14 -04:00
parent 9b55fd96ce
commit e14c92e037
No known key found for this signature in database

View file

@ -4013,17 +4013,27 @@ function renderRoom(){
/* per-speaker "stream" toggle: anyone can flip another speaker's
* audio from WebRTC subscribe → HTTP Ogg/Opus tap. Higher latency,
* cleaner playback under loss. Not a mod action — every listener
* gets to pick their own path per speaker. */
if (canSpeak(m.role) && m.uuid !== myUUID && m.pubkey){
* gets to pick their own path per speaker. Also rendered on your
* own row as a DJ self-monitor: confirms what listeners are hearing
* (~2s delayed). Safe with closed headphones; loud feedback with
* open speakers + music-mode mic — title attr warns. */
if (canSpeak(m.role) && m.pubkey){
let mPubHex = '';
try { mPubHex = hex(unb64(m.pubkey)); } catch(_){}
if (mPubHex){
const isSelf = (m.uuid === myUUID);
const sb = document.createElement('button'); sb.className = 'small';
const on = streamMode.has(mPubHex);
sb.textContent = on ? '◉ stream' : '○ stream';
sb.title = on
? 'streaming — click to switch back to live (low-latency WebRTC)'
: 'switch to HTTP Ogg/Opus stream (~2s delay, glitch-free for DJ sets)';
if (isSelf){
sb.title = on
? 'monitoring your own DJ stream — click to stop (feedback risk on open speakers!)'
: 'preview what listeners hear of YOUR mic (~2s delay) — headphones recommended';
} else {
sb.title = on
? 'streaming — click to switch back to live (low-latency WebRTC)'
: 'switch to HTTP Ogg/Opus stream (~2s delay, glitch-free for DJ sets)';
}
if (on) sb.classList.add('invert');
sb.onclick = () => toggleStreamFor(m.uuid, mPubHex);
acts.appendChild(sb);
@ -4539,8 +4549,8 @@ logLine('', 'ready — pick a handle, type a rendezvous code, enter the space');
<footer style="margin:2.2rem auto 0;font-size:0.65rem;color:#999;line-height:1.7;word-break:break-all;font-family:monospace">
<span id="pi-seal" style="color:#777;cursor:default;user-select:none" title="">page integrity</span> &nbsp;·&nbsp; built <span class="stamp-date">2026-06-03</span><br>
md5 <span class="stamp-md5">beebb8a6a5d5675bfcf12f83230fe283</span><br>
sha256 <span class="stamp-sha">898175e9ffac08ae9e56390a594701728bd94ec8b0d36942589df921efcfa716</span><br>
md5 <span class="stamp-md5">19c10cee08169563958d1edbb2c8ecae</span><br>
sha256 <span class="stamp-sha">0774caba0cbd90e06e69bb75823edd2c2a58139b969bdd4a6f287ead5df4cec0</span><br>
<span style="color:#bbb">hashes are of this page with these two fields zeroed — to verify, blank them and re-hash</span><br>
<span style="color:#bbb">one self-contained file — <strong>save a copy</strong> and verify against these hashes; point at your own servers with ?signal= and ?turncred=, or <a href="host-your-own.html" style="color:#999">host your own community</a></span>
</footer>