"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.
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.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
"self_video": falseis written as a literal in two places(
nobilis/src/backend/discord/calls.rs:111and:253). There is no path that sets ittrue 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.
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:
enabled = false. A disabled track keeps sending a black rectangle, which the far end cannot tell from a frozen camera.cameraOnis 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.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.shis 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.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