通过使用SDL,我需要连续播放音频/视频,因此,在播放音频/视频后,我必须调用SDL_CloseAudio()
关闭音频线程,或者在播放连续的音频/视频时,使用SDL_OpenAudio()
,我会得到错误,因为上次播放还没有关闭设备。
应该有一个回调,你必须在 call 之前挂钩到 SDL SDL_OpenAudio()
,然后麻烦就来了。
我注意到您无法访问由 SDL 内部直接创建的音频线程(它确实创建了线程)。关闭音频的唯一方法是SDL_CloseAudio()
,在调用它之前,您最好先调用它SDL_LockAudio()
。SDL_LockAudio()
确保音频回调未被其内部线程调用,然后是调用的安全点SDL_CloseAudio
。
通过使用一个标志,我们可以确保回调没有被 SDL 内部音频线程调用,然后我们尝试通过调用来锁定音频SDL_LockAudio()
,我认为这是非常安全的,有时它确实运行良好,但其他时候,仍然暂停SDL_CloseAudio()
通话。
我试图改变SDL_CloseAudio()
. 在 SDL 源代码中,音频模块是一个单例,我们可以访问它的音频线程(是一个SDL_Thread
实例),通过使用SDL_KillThread()
,我们可以终止音频线程,这确实是完全安全的,但我不确定这样的暴力力会导致任何其他问题。
我的问题是为什么锁操作成功,但关闭操作仍然挂起?