Windows Vista / 7上的SDL_Mixer MIDI卷问题

时间:2011-05-03 02:58:49

标签: c++ windows sdl midi sdl-mixer

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

  

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

     

是否有人为此找到了解决方法?我猜测微软似乎不太可能在整个操作系统中以任何方式分别控制单个声音设备的音量。

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

如果你想看一些代码,Chocolate Doom可能是最简单的Doom源端口,你可以抓住它的来源here

对其他开源声音和音乐库的任何建议也会受到欢迎。

4 个答案:

答案 0 :(得分:1)

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

然后使用Mix_SetSoundFonts()加载SF2。

答案 1 :(得分:0)

答案 2 :(得分:0)

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

答案 3 :(得分:0)

最长的时间,我们发现的唯一解决方案是使用像PortMIDI这样的东西。然而,Quasar of Eternity Engine的名声已经找到了一个简洁的解决方案:

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

他基本上将SDL_Mixer放入其自己的进程中并使用RPC控制它。非常聪明。