[PR #422] [MERGED] Run PulseAudio inside the Wolf container #453

Closed
opened 2026-10-15 13:00:42 +00:00 by bsakaguchi · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/games-on-whales/wolf/pull/422
Author: @JBailes
Created: 6/7/2026
Status: ✅ Merged
Merged: 6/7/2026
Merged by: @ABeltramo

Base: stable ← Head: fix/embedded-pulseaudio


📝 Commits (5)

  • fee5994 Run PulseAudio inside the Wolf container
  • 4b0c97d Supervise PulseAudio and Wolf with supervisord
  • 441006c Allow supervisord.conf through .dockerignore
  • 8ac72af feat: suppress PA logs
  • 5cd682b Gracefully stop sessions and lobbies on shutdown signal

📊 Changes

6 files changed (+150 additions, -9 deletions)

View changed files

📝 .dockerignore (+2 -1)
📝 docker/startup.sh (+24 -1)
➕ docker/supervisord.conf (+58 -0)
📝 docker/wolf.Dockerfile (+13 -0)
📝 docs/modules/user/pages/configuration.adoc (+5 -1)
📝 src/moonlight-server/wolf.cpp (+48 -6)

📄 Description

Fixes #374.

The external WolfPulseAudio sidecar has caused nothing but trouble. Wolf sleeps for WOLF_PULSE_CONTAINER_TIMEOUT_MS and then connects once, so you either set it too low and get no audio, or set it high (I had to use 30s on Unraid) and then any session started before the deadline gets no audio.

This runs PulseAudio inside the Wolf container and waits for the socket before launching Wolf, so PA is already up when Wolf does its existing "is there a PA server available?" check. Per @ABeltramo's suggestion it's Dockerfile-only, no C++ changes, and the sidecar stays as a fallback. Set PULSE_SERVER yourself to point Wolf at an external/host PA instead.

Changes

  • wolf.Dockerfile: install pulseaudio + pulseaudio-utils
  • startup.sh: start PA on $XDG_RUNTIME_DIR/pulse-socket, wait for the socket, export PULSE_SERVER as the bare path, then exec Wolf. Skipped if PULSE_SERVER is already set
  • docs: document PULSE_SERVER, note WOLF_PULSE_IMAGE is fallback-only

Testing

Built FROM ghcr.io/games-on-whales/wolf:stable with these changes and ran the real Wolf binary:

  • Wolf connects to the embedded PA on boot ([PULSE] Pulse connection ready -> [PULSE_ROUTER] Setup complete), no sidecar started, no "Unable to connect"
  • App containers get PULSE_SERVER as the bare socket path they expect (pa_context_get_server returns it verbatim, no unix: prefix, so the socket mount still lines up)
  • With PA removed, Wolf still falls back to the sidecar container as before

🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/games-on-whales/wolf/pull/422 **Author:** [@JBailes](https://github.com/JBailes) **Created:** 6/7/2026 **Status:** ✅ Merged **Merged:** 6/7/2026 **Merged by:** [@ABeltramo](https://github.com/ABeltramo) **Base:** `stable` ← **Head:** `fix/embedded-pulseaudio` --- ### 📝 Commits (5) - [`fee5994`](https://github.com/games-on-whales/wolf/commit/fee5994d519c3de404ac8f564d743c1ebc556949) Run PulseAudio inside the Wolf container - [`4b0c97d`](https://github.com/games-on-whales/wolf/commit/4b0c97d5f34aeae26a8aea2791ed66302c220796) Supervise PulseAudio and Wolf with supervisord - [`441006c`](https://github.com/games-on-whales/wolf/commit/441006cd2215edfd4f9a386d45ebcfad7545d4b4) Allow supervisord.conf through .dockerignore - [`8ac72af`](https://github.com/games-on-whales/wolf/commit/8ac72af98eaa4915e5296b3c377b9c03c8f1ea0f) feat: suppress PA logs - [`5cd682b`](https://github.com/games-on-whales/wolf/commit/5cd682b7b48db868242a72ff7e1fa0bf4720f94f) Gracefully stop sessions and lobbies on shutdown signal ### 📊 Changes **6 files changed** (+150 additions, -9 deletions) <details> <summary>View changed files</summary> 📝 `.dockerignore` (+2 -1) 📝 `docker/startup.sh` (+24 -1) ➕ `docker/supervisord.conf` (+58 -0) 📝 `docker/wolf.Dockerfile` (+13 -0) 📝 `docs/modules/user/pages/configuration.adoc` (+5 -1) 📝 `src/moonlight-server/wolf.cpp` (+48 -6) </details> ### 📄 Description Fixes #374. The external WolfPulseAudio sidecar has caused nothing but trouble. Wolf sleeps for `WOLF_PULSE_CONTAINER_TIMEOUT_MS` and then connects once, so you either set it too low and get no audio, or set it high (I had to use 30s on Unraid) and then any session started before the deadline gets no audio. This runs PulseAudio inside the Wolf container and waits for the socket before launching Wolf, so PA is already up when Wolf does its existing "is there a PA server available?" check. Per @ABeltramo's suggestion it's Dockerfile-only, no C++ changes, and the sidecar stays as a fallback. Set `PULSE_SERVER` yourself to point Wolf at an external/host PA instead. ## Changes - `wolf.Dockerfile`: install `pulseaudio` + `pulseaudio-utils` - `startup.sh`: start PA on `$XDG_RUNTIME_DIR/pulse-socket`, wait for the socket, export `PULSE_SERVER` as the bare path, then exec Wolf. Skipped if `PULSE_SERVER` is already set - docs: document `PULSE_SERVER`, note `WOLF_PULSE_IMAGE` is fallback-only ## Testing Built `FROM ghcr.io/games-on-whales/wolf:stable` with these changes and ran the real Wolf binary: - Wolf connects to the embedded PA on boot (`[PULSE] Pulse connection ready` -> `[PULSE_ROUTER] Setup complete`), no sidecar started, no "Unable to connect" - App containers get `PULSE_SERVER` as the bare socket path they expect (`pa_context_get_server` returns it verbatim, no `unix:` prefix, so the socket mount still lines up) - With PA removed, Wolf still falls back to the sidecar container as before --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
bsakaguchi 2026-10-15 13:00:42 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
games-on-whales/wolf#453
No description provided.