在互斥锁被毒化后,libwilhelm 正在发送音频
经过与 AI 的来回交流后,它声称这不是它们的错(当然),因为它声称在 RetroArch 关闭音频后,没有任何音频可以阻止发送。 启动时的核心行是一个用于将崩溃打印到日志中的崩溃处理程序。 (用于音频回调的 retro_set_audio_sample_batch 使用了在 retro_unload_game 中加锁,以防在 RetroArch 关闭后继续发送音频。)
(音频回调用于 retro_set_audio_sample_batch 由在该函数开始处进行的原子设置保护。)
以下是说服我报告此问题的引文:
这两者都无法解决问题,原因在于我们自己的调用图: s_audio_callback 有两个调用者,LibretroAudioAPI::FlushAudio,并且这两个调用者都来自 retro_run(CemuLibretro.cpp:4828 和 4919)。 RetroArch 在同一线程上调用 retro_unload_game,因此在卸载开始时,流量计数结构上为零。 计数器等待了什么,而无条件的 2s 也会这样做 - 它只会将 2s 加到每个关闭中。 它在 66daf51d 上再次崩溃,这完全符合这个情况。 真正的原因是 libwilhelm 和 AudioTrack::processAudioBuffer 在堆栈中,其中一个互斥锁被 0x5555 的毒素覆盖。 对于 libretro 构建,ENABLE_CUBEB 被强制关闭(CMakeLists.txt:216-218),因此我们的任何东西都不会创建一个 AudioTrack 对象 - 该对象是 RetroArch 自己的 OpenSL 驱动在其回调线程中释放其锁。
内容来源: libretro/RetroArch