Files
docker-dosbox-novnc/TODO.md
T
jensandClaude Sonnet 5 dcdf4fa9b3 Update TODO reference from common/ to the new docker-common repo
common/scripts/ was replaced by the docker-common repo.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NiNnj78HGx1KWyCCo39HSz
2026-07-28 11:00:51 +02:00

4.3 KiB

TODO

  • ~Reduce image size of jayfield/dosbox-novnc (currently 2.3GB). Done in two steps:

    1. Merged the game download/extract steps and the unzip/smbclient install into a single layer (so the downloaded zips and the packages only needed to extract them no longer persist in the final image). 2.31GB -> 1.6GB.
    2. Stopped baking the games into the image at all (927MB of that was just t7g's two CD ISOs). run.sh mounts a named volume (dosbox-games) so installed games persist across --rm restarts. 1.6GB -> ~690MB. Container now needs network access to vlda-01 at runtime (not just build time) to install games.
    3. Dropped the auto-download at container startup entirely. scripts/setup_server.py is a small stdlib-only HTTP server (started alongside Xvnc/fluxbox/websockify) that serves an HTML page on ${SETUP_PORT} (70${DISPLAY_NUM}, published as 7099 by run.sh) listing every *.zip on the SMB share with an Installed/Install status per game; the user clicks "Install" to fetch+extract a specific game into ${GAMES_HOME} on demand.
  • Manifest-driven games + Start/Stop/Uninstall (test balloon, stuntcar only): games are no longer discovered from raw *.zip files on the share. setup_server.py now lists *.json manifests instead (one per game, e.g. Games\dosbox\stuntcar.json), each declaring name/title/zip/start_cmd. The web page grew Start/Stop/Uninstall buttons alongside Install, driven entirely by that manifest — nothing about a game's identity or how to run it is hardcoded in the image anymore. Only stuntcar.json exists on the share so far (as a deliberate pilot); t7g has no manifest yet and will not show up in the setup page until one is added (t7g.json with a start_cmd for its dosbox-0.74-3.conf). game.sh/scripts/start_game.sh (the old docker exec-based launch path, with its hardcoded DOSBOX_VERSION/run.bat convention) were intentionally left untouched for this pilot and now overlap with the new Start button — worth reconciling (or removing) once the manifest approach is rolled out to all games.

  • Create manifests for SCUMM engine games (Monkey Island, Day of the Tentacle, Indiana Jones, etc.). Note these are usually best run via ScummVM rather than raw DOSBox — scummvm isn't installed in the image yet, so this may need a Dockerfile change (add the scummvm package) alongside the manifests themselves, and each manifest's start_cmd would invoke scummvm with the right game-id instead of dosbox run.bat -conf ....

  • Get game sound actually audible during play. --device /dev/snd is passed through and alsa-utils is installed, so DOSBox can write to an ALSA device inside the container, but VNC/noVNC only ever streams video, not audio — nothing currently carries that sound out to the browser.

    Target latency is a few tens of ms, not seconds — that rules out the "obvious" approach of a PulseAudio null sink piped through ffmpeg into a compressed (mp3/ogg) HTTP/Icecast-style stream consumed by an <audio> tag: codec frame buffering plus the <audio> element's own jitter buffer realistically puts that in the 1-3s range, no matter how it's tuned.

    Concrete approach instead: PulseAudio null sink → capture raw/lightly-buffered PCM (small frames, e.g. parec with a short --latency) → push those frames to the browser over a plain WebSocket (new endpoint alongside setup_server.py, or a small dedicated process) → browser side, feed them straight into the Web Audio API via an AudioWorkletNode (not <audio>, not ScriptProcessorNode — that's deprecated and has worse latency) for near-real-time scheduled playback. No container/codec framing in the path at all.

    Build this to be reusable across the other noVNC-family projects (docker-xserver-novnc, docker-sdr-novnc), not dosbox-specific — it's a "browser audio + noVNC" concern, nothing about it is really about DOSBox. Follow the docker-common/scripts/signals.sh precedent (see the docker-common repo): keep the generic PulseAudio-sink/WebSocket/AudioWorklet piece project-agnostic there, then copy it (not symlink) into each project's own scripts/ the same way signal handling is shared, so a fix in one place gets propagated by hand to the others.