mirror of
https://github.com/PCSX2/pcsx2.git
synced 2026-11-02 20:41:22 +01:00
This issue occurs during the transition when Talk Topic ends and enters Dule Talk Topic: the device has already been set to paused by a previous fade-out; the transition script first does a 30 frames fade-out on the current BGM, then hardcodes a 31 frames waiting before set the new BGM. Because of Nearest EE rounding mode, on this platform the fade-out actually needs 31 frames to finish (PS2 is 30 frames). The hardcoded 31 frames wait is right on the fade-out completion boundary, so when the new stream starts binding, the EE side state machine is still in fade state. The game code assumes the device must be playing during fade-in/fade-out, so it directly sets the EE side state machine to playing, without sending resume to IOP/SPU. As a result, the corresponding SPU port is still paused and refuses later playback, while the EE side thinks it is playing. Changing the wait to 32 frames lets the fade-out finish first, EE-side state machine enters paused, and when the new binding comes it goes through the resume path, so the state keeps synchronized. The EU version needs +1 more frame; I guess it is also a frame boundary/rounding timing difference, but it is not fully confirmed yet. Other paths rarely have this issue: two consecutive fade-outs are rare; or the second wait is long enough for the fade-out to complete; or because there is only one fade-out---when the new binding comes, the fade has not finished yet and the pause command has not been sent, so the state will not be out of sync.