Discord: the camera is never turned on #180

Closed
opened 2026-09-11 22:25:55 -04:00 by Salastil · 2 comments
Owner

"self_video": false is written as a literal in two places
(nobilis/src/backend/discord/calls.rs:111 and :253). There is no path that sets it
true and no camera capture anywhere in the daemon.

So a Discord call is voice only. Somebody else's camera cannot be seen either - the
video streams are simply not subscribed to.

Screen share is tracked separately in #14; this is the camera half, and the two are
close enough in plumbing that whichever is done first should leave room for the other.

`"self_video": false` is written as a literal in two places (`nobilis/src/backend/discord/calls.rs:111` and `:253`). There is no path that sets it true and no camera capture anywhere in the daemon. So a Discord call is voice only. Somebody else's camera cannot be seen either - the video streams are simply not subscribed to. Screen share is tracked separately in #14; this is the camera half, and the two are close enough in plumbing that whichever is done first should leave room for the other.
Salastil added the feature label 2026-09-11 22:25:55 -04:00
Author
Owner

The UI arrangement for calls is now settled by #189, and this should follow it rather than invent its own.

One row of controls on CallStage, in this order: microphone, camera, screen. Each button is offered on every call whatever shape it is, and each does one thing — the component is already service-agnostic ("it draws two streams and a row of buttons, which is what a call is on any service").

The camera contract that came out of #189 and is worth copying exactly:

  • Turning a camera off removes the track and renegotiates, rather than setting enabled = false. A disabled track keeps sending a black rectangle, which the far end cannot tell from a frozen camera.
  • cameraOn is asked of the call, never held as a fixed value — the phase-change handler runs repeatedly and a fixed answer puts the button back to "off" the moment a call connects.
  • Renegotiations are serialised; camera-on followed a second later by screen-share is two changes to one connection.
  • A remote track that goes away is dropped from its stream, so the tile stops drawing its last frame.

Discord's side is different in one way that matters: its audio lives in the daemon, because the connection is a bespoke protocol no browser speaks. So whichever of these two is done first has to decide where Discord's video is decoded before the buttons can be wired up — that is the real work here, not the controls.

scripts/callcheck/run.sh is a loopback harness that proves the camera half end to end with no hardware and no second person; it is worth pointing at whatever Discord ends up using.

The UI arrangement for calls is now settled by #189, and this should follow it rather than invent its own. One row of controls on `CallStage`, in this order: **microphone, camera, screen**. Each button is offered on every call whatever shape it is, and each does one thing — the component is already service-agnostic ("it draws two streams and a row of buttons, which is what a call is on any service"). The camera contract that came out of #189 and is worth copying exactly: - Turning a camera **off removes the track and renegotiates**, rather than setting `enabled = false`. A disabled track keeps sending a black rectangle, which the far end cannot tell from a frozen camera. - `cameraOn` is **asked of the call**, never held as a fixed value — the phase-change handler runs repeatedly and a fixed answer puts the button back to "off" the moment a call connects. - Renegotiations are **serialised**; camera-on followed a second later by screen-share is two changes to one connection. - A remote track that goes away is **dropped from its stream**, so the tile stops drawing its last frame. Discord's side is different in one way that matters: its audio lives in the daemon, because the connection is a bespoke protocol no browser speaks. So whichever of these two is done first has to decide where Discord's video is decoded before the buttons can be wired up — that is the real work here, not the controls. `scripts/callcheck/run.sh` is a loopback harness that proves the camera half end to end with no hardware and no second person; it is worth pointing at whatever Discord ends up using.
Author
Owner
Finished https://git.salastil.com/Salastil/nobilis/commit/ac6ef9c https://git.salastil.com/Salastil/moho/commit/fb5724a https://git.salastil.com/Salastil/moho/commit/414730f
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Salastil/moho#180