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