Skip to content

feat: show participant avatars and speaking indicators during calls - #105

Open
Danidfra wants to merge 4 commits into
lnbits:mainfrom
Danidfra:feat/call-avatars-speakers
Open

Danidfra wants to merge 4 commits into
lnbits:mainfrom
Danidfra:feat/call-avatars-speakers

Conversation

@Danidfra

@Danidfra Danidfra commented Oct 22, 2026 •

Copy link
Copy Markdown

Summary

  • Call tiles show participants' Nostr profile pictures (or initials) when the camera is off, in room and direct calls.
  • Adds a speaking ring for whoever is talking, using the existing audio meters.
  • Audio meters pause while the app is hidden or the call is minimized, but keep running while the separate call window is open so its speaking rings stay live.

Testing

Unit and browser call tests pass; quality:all and build pass. No live call between two peers yet.

Rebased onto current main (a4db9c6). The call window now relies on upstream's incremental mirroring, so this PR only exposes whether that window is open.

Limitations: no speaking indicator on WebKit or Firefox for the MediaSource audio path. Expect a small merge conflict with #104 in CallOverlay.svelte.

…g in calls

Room tiles with the camera off now show the participant's Nostr avatar
(profile picture, initials as the fallback) instead of a generic person
icon. The overlay retains each visible participant's profile, and the
direct-call peer's, through the existing visible-profile hydration, and
releases it when they leave or the call closes.

A ring marks whoever is speaking: room tiles in gallery and speaker view,
with the camera on or off and beside a shared screen, and the peer's
avatar or video in direct calls. It reuses the existing activity meters,
now running while a call is active and on screen rather than only in
speaker view; muted inputs are not metered. A small tracker beside the
active-speaker selector needs two loud samples to start and holds
through pauses, and the overlay updates only when the speaking set
changes.
…in the call window

Direct calls with only the local camera on, or a shared screen and no
remote camera, hid the header avatar and showed no remote frame, so the
speaking ring had nowhere to appear. The stage now keeps the peer's
avatar in place of their video, carrying the same ring.

Gallery tiles no longer receive the speaker-view promotion class.

Speech now starts on two consecutive meter samples with half a sample
of timer tolerance, so early timers do not delay the ring and separate
noise spikes within the hold no longer count as speech.

Documents that WebKit's MediaSource path cannot be metered and that
mobile routing with the meter context is unvalidated on devices.
…fecting playback

A ring could stay on after a call ended or its audio went away mid-word,
because speech only expired when another level sample arrived. A meter
that stops now reports that its input is no longer metered, and the
tracker forgets it at once, so the ring clears and cannot return when
metering resumes. The active-speaker selector still reads a stopped
input as silent, so speaker-view focus is unchanged.

Metering no longer falls back to Firefox's mozCaptureStream, which can
divert the element's playback away from the speakers; that path is not
metered. Streams the meter captures itself are stopped when it stops,
so restarts no longer leave live captures behind. Streams registered
by the call are never stopped.

Max fill in direct calls again shows the local camera or shared screen
alone on stage; the peer's stage avatar appears only outside Max fill.
…meters in the background

Meters now keep running while the recording window is open, even with the
overlay minimized or the main window hidden, so its speaking rings and
speaker view keep updating. With the recording window closed, meters stop
while the call is minimized or the main window is hidden, and restart when
it is visible again.
@Danidfra
Danidfra force-pushed the feat/call-avatars-speakers branch from fa94966 to fd67225 Compare October 23, 2026 14:02

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant