Windows Vista/7 上的 SDL_Mixer MIDI 音量问题

Posted

技术标签:

【中文标题】Windows Vista/7 上的 SDL_Mixer MIDI 音量问题【英文标题】:SDL_Mixer MIDI Volume issues on Windows Vista/7 【发布时间】:2011-05-03 02:58:48 【问题描述】:

我实际上并不精通 C++ 或 SDL_Mixer,但我还是代表 Doom 社区提出了这个问题。简而言之,编写 Doom 源端口的人似乎无法弄清楚如何在 Windows Vista 或 7 上使用 SDL_Mixer 独立控制正常音量和 MIDI 音量。我让 Eternity Engine 的作者 James Haley 用他自己的话来说吧:

在 Windows Vista 或 7 下似乎不存在本机 MIDI 独立音量的概念,因为在任何具有它们的应用程序(包括大多数使用 SDL_mixer 的游戏)中使用 MIDI 音量滑块也会影响数字声音输出的音量。这使得试图调整音乐的相对音量以获得舒适感是不可能的。

有没有人找到任何解决方法?鉴于微软似乎在整个操作系统中以任何方式分别控制单个声音设备的音量,我猜这不太可能。

我听说过各种涉及 Timidity 驱动程序的解决方法,但这需要用户超越简单地在他的系统上安装游戏。据我所知,唯一能彻底解决此问题的端口是 ZDoom,但它使用不兼容 GPL 的 FModEx,因此不是一个合适的解决方案。

如果您想查看一些代码,Chocolate Doom 可能是最容易理解的 Doom 源端口,您可以获取它的源代码 here。

也欢迎对其他开源声音和音乐库提出任何建议。

【问题讨论】:

为什么不将现有的 MIDI 文件转换为 WAV(或任何可以解压缩为 PCM 流的文件格式)并像管理其他声音一样管理音乐流?跨度> MIDI文件嵌入在.WAD数据文件中,用户自制的.WAD数据文件数以万计,其中一些可以追溯到1994年。事先进行转换可能是出于这个问题。在程序本身中有 Timidity++ 和 Fluidsynth 可以做到这一点,但我听说在这两种情况下转换都不令人满意。 【参考方案1】:

一种解决方案是附带启用 FluidSynth 的 SDL_mixer。您还需要附带一个 SoundFont2 文件。幸运的是,那里有免费的 SF2,有些甚至针对 Doom 的 MIDI 文件进行了优化。许可证应该不是问题,因为 SoundFonts 是资产,而不是代码。

然后使用 Mix_SetSoundFonts() 加载 SF2。

【讨论】:

【参考方案2】:

您可能想查看 SDL 之外的不同 MIDI 库。

http://wildmidi.sourceforge.net/

http://sourceforge.net/apps/trac/fluidsynth/

http://timidity.sourceforge.net

【讨论】:

【参考方案3】:

我正在维护一个类似的游戏端口(Descent 2),我遇到了同样的问题。 Afaik 在使用 SDL_mixer 时没有解决方案。我发现关闭midi音乐时避免声音静音的一种方法是检索临时midi设备的句柄,将midi音量设置为最大,然后再次关闭临时设备。

【讨论】:

【参考方案4】:

长期以来,我们找到的唯一解决方案是使用 PortMIDI 之类的东西。然而,以永恒引擎闻名的 Quasar 找到了一个巧妙的解决方案:

http://www.doomworld.com/vb/showthread.php?s=&postid=1124981#post1124981

他本质上是将 SDL_Mixer 放入自己的进程中,并通过 RPC 控制它。非常聪明。

【讨论】:

以上是关于Windows Vista/7 上的 SDL_Mixer MIDI 音量问题的主要内容,如果未能解决你的问题,请参考以下文章

通过Windows Vista / 7上的Inno Setup将文件安装到原始用户的My Docs文件夹

Windows Vista/7:如何对输出音频混合进行采样?

我如何在 Windows(xp、vista、7)欢迎屏幕或锁定屏幕(如 VNC 或 Dame Ware)中进行交互

PyQt:Windows Vista/7 上 QTableView 中的 QStyledItemDelegate?

Delphi 7 Windows Vista/7 防火墙异常网络位置

在 Windows Vista/7 中支持回声消除的 API