While testing SereneAudio, we noticed a small but repeatable stutter during gameplay.
Because the audio system had just been replaced, that was the obvious place to start looking. We checked the output paths, buffering and timing measurements, but SereneAudio was behaving normally. There were no underruns, and nothing suggested that the music or sound scheduling was causing the problem.
The stutter was still there, though, so we kept tracing it through the engine.
It eventually led us away from the audio system and into background video playback.
Some hardware-decoded videos were creating brief stalls when their frames were prepared for rendering. The delay was small, but it happened at the wrong point in the frame and was enough to disturb gameplay presentation.
This is why the problem initially looked like a timing fault. The music continued correctly, but the moving notes were not being presented as evenly as they should have been.
StillRiver helped us separate the two, the audio path remained stable during the stutter, while the video and rendering measurements showed where the extra work was occurring. Once we knew which path was responsible, we could fix the video handling rather than trying to compensate elsewhere in the engine.
We have now changed how those video frames are prepared before reaching the renderer, reducing the work that was interrupting active gameplay.
There was no need to adjust song timing, increase audio buffering or add another setting for players to manage. Those would only have hidden the symptom while leaving the actual fault in place.
This was a useful reminder of why we measure several parts of the engine together.
Audio, video, rendering and gameplay all run alongside one another. A fault in one system can easily look like a problem in another, especially when the effect is only a brief interruption rather than a complete failure.
In this case, SereneAudio was doing its job.
The stutter was coming from the video path, and that is where we fixed it.