SenPatcher项目:东京幻都音频恢复Bug分析与修复

SenPatcher项目:东京幻都音频恢复Bug分析与修复

问题背景

在东京幻都(Tokyo Xanadu)的PC版本中,存在一个非常奇怪的音频播放Bug。游戏会记住音频轨道的最后播放位置,当下次遇到播放同一音频轨道的请求时,无论游戏原本意图是从头播放还是继续播放,都会从上次的位置恢复播放。这种行为与Vita/PS4/Switch版本的表现不符,需要修复使其符合预期行为。

问题分析

经过深入追踪和调试,发现问题的根源在于游戏代码中的一个特定分支(0x447037)。该函数本应获取正确的音频播放偏移量(存储在[ebp+0xc]中),但这个分支却完全忽略了该参数。对比冷钢2(CS2)中的相同函数(0x4229f0),可以发现CS2中根本不存在这个分支。

这个函数调用最终会指向0x409270,即prOggFile类的一个方法。这表明游戏的文件缓存层可能在重用prOggFile对象时没有正确重置它们的状态,导致音频播放位置信息被错误保留。

解决方案

正确的解决方案需要为0x409270函数(以及相关的虚函数,如prWavFile上的0x41be20)添加一个额外参数,用于传递预期的播放偏移量。引擎本身确实正确地跟踪了这个偏移量。

在函数内部,需要将预期偏移量与实际偏移量进行比较,如果两者不匹配,则重新同步播放位置。这个方案虽然实现起来较为复杂,但能够从根本上解决问题。

修复过程中的发现

在实现修复的过程中,还发现了一个额外的问题:音频循环播放时可能存在最多128个样本的偏差。这个问题也在修复过程中一并解决了。

修复结果

通过上述分析和修改,最终在v1.2.2版本中彻底修复了这个音频恢复Bug。修复后,游戏音频播放行为现在与Vita/PS4/Switch版本保持一致,能够按照开发者的预期正确播放音频,不再出现意外恢复播放位置的情况。

这个修复不仅解决了主要的音频恢复问题,还提高了音频播放的精确度,为玩家提供了更好的游戏体验。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值