On Fri Jan 23 17:34:40 2026 +0000, Dzmitry Keremsha wrote:
Honkai doesn't crackle on Windows, nor does it crackle with winealsa. It's not an underfill, but I don't entirely understand how it refills properly. Regarding app's event - as you can see I have a logic that tries to make it fire every period (I think we only expose padding and NtSetEvent to the app? I honestly don't know if there is something else), but because of the safe bytes offset it becomes inconsistent. Unfortunately I have to agree this is not the way, I tried making it so NtSetEvent triggers strictly once per period, but I keep having issues with the write pointer overwriting the read pointer. Actually I think it might be happening with the original winepulse - I haven't tested it yet, but in games like Arc Raiders with buzz issues it does sound very much like my pointer overlap problems, so these might not be underruns. If you don't mind answering, what exactly happens when we trigger NtSetEvent late? For instance, instead of triggering NtSetEvent at T=10ms, we trigger it at T=12ms and get a 10ms refill. Physics run for the entire 12ms, so where do the 2ms go? All the data is fit into 10ms worth of samples, or are the last 2ms discarded? I am asking because maybe my idea could at least be wrapped in an environment variable and added as a band aid fix in downstream protons. Inconsistent NtSetEvent surprisingly doesn't affect even spatial audio games, so if no audio is discarded it could be of some use at least. [steam-13203515507082264576.tar.gz](/uploads/f6f8c24d926ab9622e5611f726593a05/steam-13203515507082264576.tar.gz) Minreq is equal to period_bytes, which is equal to the quant, while a game's refill is whatever the engine decides. Tlength to minreq ratio is 3.5-2.5:1, and even hardcoding higher, I couldn't change it. It probably has something to do with how pipewire-pulse sets it. Winealsa is 4:1 though.
-- https://gitlab.winehq.org/wine/wine/-/merge_requests/9840#note_127787