我可以在同一个游戏中使用Mix_OpenAudio和SDL_OpenAudio吗?

时间:2011-01-04 18:55:49

标签: c++ audio sdl

我正在尝试使用SDL 1.2来完成一个学校项目,但我遇到了一个我无法解决的障碍。

游戏中有几个游戏状态模块,每个模块都有一个功能 int Run(SDL_Surface * screen);

在每个模块中,Run()初始化音频,在其循环中运行,然后在返回之前关闭音频。

所有模块都使用Mix_OpenAudio()和Mix_CloseAudio()来初始化/取消声音,并且可以一起正常工作。

唯一的例外是电影电影模块,我使用SDL_FFMpeg来显示电影。这个模块强迫我使用 SDL_OpenAudio()

SDL_OpenAudio第一次失败,错误“音频设备已经打开”,但第二次正常工作。

一旦我运行了电影模块,其他模块中的所有声音都会停止工作,即使它们的所有功能都返回0表示成功。

任何人都有什么想法?

2 个答案:

答案 0 :(得分:3)

The conflicts chapter告诉我们:

  

使用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();

这将确保音频完全停止。顺便说一句,锁定/解锁操作是为了确保您的音频回调代码不会在此时运行。