mirror of
https://github.com/games-on-whales/wolf.git
synced 2026-10-15 13:02:03 +00:00
[GH-ISSUE #489] POST /api/v1/apps/add: apps added through the API have an empty video_producer_buffer_caps → no video until Wolf is restarted #300
Labels
No labels
🧠 1 - 🤖 999
AMD
bug
bug
cannot reproduce
documentation
duplicate
easy
enhancement
enhancement
enhancement
fixed?
fixed?
good first issue
hard
help wanted
Intel
invalid
LXC
medium
moonlight-protocol
Multi GPU
nixos
not a bug
nvidia
pull-request
question
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
games-on-whales/wolf#300
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @tomblancdev on GitHub (Aug 28, 2026).
Original GitHub issue: https://github.com/games-on-whales/wolf/issues/489
Summary
An app added through
POST /api/v1/apps/addis saved toconfig.tomlright away (state::update_profiles→rfl::toml::save), but the in-memoryevents::Appit creates has an emptyvideo_producer_buffer_caps. The field is not part of the API'sAppshape and nothing defaults it, so the Wayland producer pipeline for that app is built as(note the stray comma where the caps should be). That pipeline cannot negotiate DMABuf with the VA encoder, no frame is ever produced, and Moonlight drops the session after ~14 s with its generic "firewall" message. The same app streams fine after a Wolf restart, because
parse_apps(configTOML.cpp) reads it back fromconfig.tomland computes the caps from thegstreamer.videodefaults at load time.Apps defined in
config.tomlare unaffected; only apps managed through the API hit this.Where (stable,
7f416ec)src/moonlight-server/events/reflectors.hpp—Reflector<events::App>::ReflTypehas novideo_producer_buffer_caps;to()leaves it empty andfrom()never reports it, so the field can neither be set nor read through the API.src/moonlight-server/api/endpoints.cpp—endpoint_AddAppstoresReflector<events::App>::to(app, …)as is.src/moonlight-server/state/configTOML.cpp:193—parse_appssets.video_producer_buffer_caps = default_video_settings.producer_buffer_caps.value()for apps read from the file — the only place the field is ever populated.endpoint_StreamSessionAdd(endpoints.cpp:239) already copiessample_app->video_producer_buffer_capswhen it builds its dummy app, and the lobby/runner requests carry the field explicitly inVideoSettings— those paths work.Reproduce
stable(ghcr.io/games-on-whales/wolf:stable, image built from7f416ec), a working config-defined app (say Firefox) that streams.GET /api/v1/apps, copy Firefox's JSON, changetitleandid,POST /api/v1/apps/add→{"success":true}. The app appears in Moonlight and inconfig.toml.Suggested fix
Either add
std::optional<std::string> video_producer_buffer_capsto the APIAppreflector (settable, and reported byfrom()), or — probably simpler and safer — default it inendpoint_AddAppwhen empty, the wayendpoint_StreamSessionAdddoes from a sample app, or from the config'sgstreamer.videodefaults (default_video_settings.producer_buffer_caps) so it matches whatparse_appswould compute.Related: #260 (a PR fixing exactly this, closed in Sept 2025 as covered by #179 — #179 did not change the
Appreflector, and stable still has the gap) and #465 (the same endpoint droppingstart_audio_server, fixed 2026-08-08).Happy to open a PR along the
endpoint_AddAppdefault line if that's the preferred shape.