我正在尝试使用SDL 1.2来完成一个学校项目,但我遇到了一个我无法解决的障碍。
游戏中有几个游戏状态模块,每个模块都有一个功能 int Run(SDL_Surface * screen);
在每个模块中,Run()初始化音频,在其循环中运行,然后在返回之前关闭音频。
所有模块都使用Mix_OpenAudio()和Mix_CloseAudio()来初始化/取消声音,并且可以一起正常工作。
唯一的例外是电影电影模块,我使用SDL_FFMpeg来显示电影。这个模块强迫我使用 SDL_OpenAudio()。
SDL_OpenAudio第一次失败,错误“音频设备已经打开”,但第二次正常工作。
一旦我运行了电影模块,其他模块中的所有声音都会停止工作,即使它们的所有功能都返回0表示成功。
任何人都有什么想法?
答案 0 :(得分:3)
使用SDL_mixer函数时 需要避免以下功能 来自SDL:
SDL_OpenAudio 改为使用Mix_OpenAudio。
因此我想您的问题的答案是:您不能混用SDL_OpenAudio()
和MIX_OpenAudio()
函数。
答案 1 :(得分:0)
SDL_OpenAudio()
和SDL_CloseAudio()
是一对配对功能,一旦你在某个地方打开音频,你必须关闭它,否则你会得到像
音频设备已打开
使用SDL_OpenAudio()
时,它是一个单例,通过跟踪到SDL源代码,您可能会发现有一个current_audio
对象,这是全局音频对象。如果同时打开多个音频文件,可能会导致竞争状况。
我认为这对功能仅适用于音频/视频播放,不适用于游戏(游戏中可能同时有多个音频源),因为您可能无法同时播放多个音频/视频时间在一个过程中。因此,在开始播放视频/音频文件之前,您必须通过调用SDL_AUDIO_STOPPED
确保SDL的音频状态为SDL_GetAudioStatus()
。播放音频/视频文件后,您应该执行以下操作:
SDL_LockAudio(); SDL_CloseAudio(); SDL_UnlockAudio();
这将确保音频完全停止。顺便说一句,锁定/解锁操作是为了确保您的音频回调代码不会在此时运行。