While testing SereneAudio, we noticed that input had started arriving late across several different drivers.
Because the same delay appeared with multiple devices and backends, it was unlikely to be a controller or driver problem. The fault had to be somewhere in the timing shared by the wider engine.
OutFox inherited several timing systems from StepMania. Audio, input, gameplay, rendering and Lua had gradually become connected through assumptions about update order and which system was responsible for the current time.
Those assumptions could remain unnoticed while the older systems continued to behave in the way the rest of the engine expected. Replacing RageSound and RageInput began to remove that behaviour, exposing dependencies that had previously been difficult to see.
We first reworked the input timing path to fit the new engine model. Testing showed that part of RageInput was still acting as a timing authority, even though that responsibility was being moved elsewhere.
Once that remaining control was removed, input timing began behaving correctly again.
The next test reached the music wheel and crashed.
The new path had exposed an older fault in the wheel that had previously been hidden by the engine’s former timing and update behaviour. Fixing that then uncovered a related problem with video banners, where Lua code still expected the timing behaviour provided by the older systems.
Each issue came from the same underlying problem: several parts of the engine had learned to depend on behaviour they did not formally own.
The replacement work is giving those responsibilities clearer boundaries.
SongClock provides the shared gameplay timeline. SereneAudio handles audio transport and playback. SereneIO collects and timestamps input. The renderer presents the result, while Lua receives consistent timing information without needing to reproduce old engine assumptions.
This does not mean every newly exposed fault was caused by SereneAudio or SereneIO. In several cases, the fault was already present. The older architecture simply arranged events in a way that kept it out of sight.
By the end of the work, the input delay had been corrected, the remaining RageInput timing authority had been removed, and the music wheel and video banner faults had been fixed against the new timing model.
What began as an audio timing test ended up removing another group of hidden dependencies between input, gameplay and presentation.
That is an important part of the Beta I work. The new systems are not being layered over the old architecture indefinitely. They are gradually taking over their intended responsibilities, while the assumptions left behind are identified and corrected.