Discord: a shared screen is silent #231

Closed
opened 2026-09-23 15:16:09 -04:00 by Salastil · 1 comment
Owner

Go Live hosting works (#14), but it carries picture and nothing else. A viewer
on the other side gets the window and hears none of it - not the game, not the
video, not the call being shared.

It is absent by construction rather than broken, in three places that agree:

  • nobilis/src/backend/discord/streamconn.rs:400 announces "audio_ssrc": 0.
    Opus is offered in the codec list a few lines above as a handshake
    formality, but no audio SSRC is ever claimed.
  • src/renderer/src/state/store.ts opens the capture with audio: false.
  • src/renderer/src/lib/discordscreen.ts encodes VP8 and has no audio path at
    all.

So nothing is dropping frames somewhere - there is no second media type yet.

The pieces it needs are already standing. The stream has its own connection,
its own UDP socket, its own crypto and its own DAVE session, and all of that is
indifferent to what it carries: encrypt already takes a MediaType. What is
missing is a real audio_ssrc, Opus frames packetised onto the same pipe, and
a capture to feed them - which on Linux means asking the desktop portal for the
shared window's sound rather than the microphone, and is the part with no
equivalent elsewhere in the codebase to copy.

Worth doing before the viewing half of #14: somebody watching a silent stream
cannot tell whether the sound is missing or the stream is broken.

Go Live hosting works (#14), but it carries picture and nothing else. A viewer on the other side gets the window and hears none of it - not the game, not the video, not the call being shared. It is absent by construction rather than broken, in three places that agree: - `nobilis/src/backend/discord/streamconn.rs:400` announces `"audio_ssrc": 0`. Opus is offered in the codec list a few lines above as a handshake formality, but no audio SSRC is ever claimed. - `src/renderer/src/state/store.ts` opens the capture with `audio: false`. - `src/renderer/src/lib/discordscreen.ts` encodes VP8 and has no audio path at all. So nothing is dropping frames somewhere - there is no second media type yet. The pieces it needs are already standing. The stream has its own connection, its own UDP socket, its own crypto and its own DAVE session, and all of that is indifferent to what it carries: `encrypt` already takes a `MediaType`. What is missing is a real `audio_ssrc`, Opus frames packetised onto the same pipe, and a capture to feed them - which on Linux means asking the desktop portal for the shared window's sound rather than the microphone, and is the part with no equivalent elsewhere in the codebase to copy. Worth doing before the viewing half of #14: somebody watching a silent stream cannot tell whether the sound is missing or the stream is broken.
Salastil added the feature label 2026-09-23 15:16:09 -04:00
Author
Owner
Finished https://git.salastil.com/Salastil/nobilis/commit/92dffca011ca3f2140e62058a45aa1fa0d6b71ad https://git.salastil.com/Salastil/moho/commit/c67cbde8dd03d899e683dcc9ee559ff87264234f
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Salastil/moho#231