Skip to content

Hearing the original ​

2026-10-24, the pod-sound session, later.

The menu sound recorded from WINPOD.EXE, and a stretch of it over pod-sound's output

Top: the menu sound as the emulated PC played it, left side, with gaps where the PC fell behind. Bottom: 300 frames of that recording (orange) under pod-sound's output for the same event (blue), lined up by measure/sound_recorded.py.

The morning's port of the sound engine was checked against the original under the emulator, one routine at a time. What was missing was the game itself running, with everything between the mixer and the speaker. The emulated PC (run/vm) runs the game under Wine, and QEMU gives it no sound card. Adding one would mean restarting a VM that other sessions were using.

Wine does not need a sound card. It plays into whatever sound server the Linux guest runs. So PulseAudio now runs in the guest with a single "null" output at the game's own format, 22,050 Hz and 16-bit stereo, and parec records what goes into it. The game starts without asking about the sound driver. pactl shows its stream at 22,050 Hz, so nothing resamples it on the way.

The first sound to try was the simplest one: the menu sound, FIX.MEG's event 26, played at full volume in the centre when Enter is pressed on the main menu. examples/fire.rs fires the same event in pod-sound. The recording has gaps, where the emulated PC did not hand the sound over in time, so the comparison lines up each 220-frame window on its own. In the 55 windows that line up, the gain between the two is 1.00006 on both sides. 62% of the samples are equal and 94% are within one step. A volume one step wrong in the port would show as a gain of 0.992.

The difference of one is the recording path's, not the mixer's: the same mixer code ran under the emulator this morning and matched exactly, and it resets the FPU before it starts. Wine's audio code converts the samples to floating point and back, which can move them by one. So this check is for levels, pans and timing; the exact check stays the emulator's.

The setup is now part of the VM's script: inside.sh sound, then inside.sh record FILE SECONDS. The same script used to stop starting display :1 when another session had a display of its own, and its stop could cut its own SSH session; both are fixed.

Next: a race recorded the same way, with the countdown, the engines and the crashes.

Prose CC0 1.0, code Apache 2.0. POD: Planet of Death is © Ubi Soft; none of its files are on this site.