【问题标题】:Can I use Mix_OpenAudio and SDL_OpenAudio in the same game? [closed]我可以在同一个游戏中使用 Mix_OpenAudio 和 SDL_OpenAudio 吗? [关闭]
【发布时间】:2011-01-04 18:55:48
【问题描述】:

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

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

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

所有模块都使用 Mix_OpenAudio() 和 Mix_CloseAudio() 来初始化/取消初始化声音,并且协同工作。

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

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

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

有人知道发生了什么吗?

【问题讨论】:

  • 显示相关模块的一些代码?
  • 呃...无论如何还是谢谢..但最终解决问题的方法让我彻底愤怒。我终于受够了,只是在每个模块的末尾又卡住了 5 个 SDL_CloseAudio() 调用......你不知道,问题就消失了!所以我一一删除了额外的电话,直到......我的号码和我开始时一样,除了它仍然有效......
  • 上面的评论听起来你的编译器没有注意到有变化。这可能会发生。如果您对为什么不工作感到困惑,您应该做的一件事是强制编译器重新编译整个项目。手动删除所有 .obj 文件或在 IDE 中使用一些“清除项目”命令。再次运行,看看它现在是否有效。如果它仍然不起作用,请询问 SO。 ;-)

标签: c++ audio sdl


【解决方案1】:

The conflicts chapter 告诉我们:

使用 SDL_mixer 函数时,您 需要避免以下功能 来自 SDL:

SDL_OpenAudio 请改用 Mix_OpenAudio。

因此我猜你的问题的答案是:你不能混合使用 SDL_OpenAudio()MIX_OpenAudio() 函数。

【讨论】:

  • 1 月 4 日:“我正在尝试使用 SDL 1.2 完成一个学校项目”你有点晚了 =)
  • @Nick 最好迟到,然后永远;)
【解决方案2】:

SDL_OpenAudio()SDL_CloseAudio() 是一对函数,一旦你在某个地方打开音频,你必须关闭它,否则你会得到类似的错误

音频设备已打开

使用SDL_OpenAudio()时,它是一个单例,通过跟踪SDL源代码,您可能会发现有一个current_audio对象,这是全局音频对象。如果您同时打开多个音频文件,这可能会导致竞争条件。

我认为这个配对功能只适合音频/视频播放,不适用于游戏(游戏中可能同时有多个音频源),因为您可能不会同时播放多个音频/视频时间在一个过程中。所以在开始播放视频/音频文件之前,您必须通过调用SDL_GetAudioStatus() 确保SDL 的音频状态为SDL_AUDIO_STOPPED。播放音频/视频文件后,您应该执行以下操作:

SDL_LockAudio();
SDL_CloseAudio();
SDL_UnlockAudio();

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多