HydraIssues

Rupelmonde stream delivers audio but the wrong video: Unreal app renders on physical display, Sunshine captures virtual desktop
open bug Project: hydrabody Reporter: 22 Apr 2026 18:56

Description

## Symptom

Streaming `rupelmonde-castle-viewer` from **boom-pickle-38** (tvl-hydra-007, Windows, Sunshine host, LAN 10.110.0.51 / WG 10.10.100.7) to **peppy-dumpling-32** at Rupelmonde now connects cleanly since the v6.1.19 client fixes landed. The visitor **hears** the Rupelmonde Unreal app (menu music, ambience) but **sees** the wrong frames — a black / empty / purple display surface rather than the actual game.

This is body-side, orthogonal to the kiosk and overlay work. The Moonlight stream is delivering whatever Sunshine's capturing; Sunshine is capturing the wrong surface.

## Evidence from earlier Sunshine log (in-stream debug overlay captured during a 2026-04-22 screenshot):

```
Offset : 0x0
Virtual Desktop : 5760x1080
Desktop resolution : 1920x1080
Desktop format : DXGI_FORMAT_B8G8R8A8_UNORM
Creating encoder [h264_nvenc]
NvEnc: created encoder H.264 P1 async two-pass rfi
```

So Sunshine is in display-duplication mode, sees a 5760×1080 virtual desktop (three 1920×1080 tiles) and is encoding a 1920×1080 region — likely the wrong tile, because the Rupelmonde Unreal app is launching with `-ResX=1920 -ResY=1080 -windowed -ForceRes` and rendering onto the primary physical desktop rather than onto whatever display Sunshine is capturing.

## What was set up today on the client side (unrelated to this bug)

- hydraheadflatscreen v2.0.27/2.0.28: `--absolute-mouse`, `--display-mode borderless`, goroutine that shows the kiosk immediately when stream exits.
- hydra-experiencenet v6.1.19: floating Qt exit overlay that follows all Spaces; fullscreen Space kiosk; `NSWindowCollectionBehaviorCanJoinAllSpaces` on the overlay.

Client-side streaming works end-to-end. This is purely a Sunshine/body configuration problem.

## Expected fix avenues

1. **Point Sunshine at the physical display the Unreal app renders to** via its encoder/output setting (Sunshine web UI at `https://10.110.0.51:47990` → Configuration → Video → Output name / display).
2. **Pin the Unreal app to the captured display** via the app's prep-cmd in Sunshine's `apps.json` — e.g. move the window to the captured display's top-left using `-WinX=...` `-WinY=...` or Windows' `SetWindowPos` before the experience starts.
3. **Switch Sunshine to Windows.Graphics.Capture (wgc)** mode which captures a specific window rather than a display, and name the Rupelmonde window explicitly in the app config.
4. **Make the Unreal app launch borderless-fullscreen on the Sunshine-captured display index** rather than windowed on the primary.

## Affected nodes

- Body: `boom-pickle-38` (node-74f9fbf2), Sunshine at `https://10.110.0.51:47990`, credentials sunshine/sunshine.
- Experience: `rupelmonde-castle-viewer`, launches `C:\experiences\rupelmonde-castle-viewer\Windows\Rupelmonde.exe -ResX=1920 -ResY=1080 -windowed -ForceRes`.
- Same Sunshine instance also hosts `mercator-talks` — worth verifying whether that experience is affected by the same display-capture misrouting.

## How to verify the fix

1. On the body: configure / change whatever setting you pick.
2. On peppy (kiosk): stop any running stream (`pkill -9 -f 'HydraExperienceNet stream'` via hydracluster exec), trigger a fresh one via `POST http://127.0.0.1:9740/api/v1/stream/start {"experience":"rupelmonde-castle-viewer"}`.
3. Take a screenshot of the kiosk — should show the actual Rupelmonde castle scene, not black / empty virtual-desktop space.

## Related prior context

- `project_rupelmonde_stream_issue.md` in the agent's auto-memory describes this class of issue from an earlier encounter (purple virtual display / game on wrong display).
- First Sunshine-capture misconfiguration we've hit on a Rupelmonde deployment; Cloud Seven's cosmic-pretzel-98 did not exhibit it when we streamed the same experience from that body earlier.