要在不放弃 SDL_Mixer 的情况下完成此操作,您需要为 MikMod 和 libmodplug 编辑一些结构。有两种方法可以编辑这些结构:
无需编辑和重新编译 SDL_Mixer
第一个选项是将 MikMod 或 libmodplug 包含并链接到您的项目中。SDL_Mixer 通常只使用其中一种。
#ifdef MIKMOD_HACK
#include <mikmod.h>
#elif defined MODPLUG_HACK
#include <libmodplug/modplug.h>
#endif
调用 Mix_OpenAudio 后,您可以应用 libmodplug hack:
Mix_OpenAudio(11025, AUDIO_U8, 4096)
#ifdef MODPLUG_HACK
ModPlug_Settings settings;
ModPlug_GetSettings(&settings);
settings.mLoopCount = -1;
ModPlug_SetSettings(&settings)
#endif
播放完 Mix_Music 后,您可以应用 MikMod hack:
Mix_PlayMusic(music, 0) /*we won't be using SDL's looping*/
#ifdef MIKMOD_HACK
MODULE *mod = Player_GetModule()
mod->wrap = 1; /*This option will loop without stutter*/
mod->loop = 1; /*This option will make the player obey Position Jumps*/
#endif
至于找出使用哪个 hack... 默认情况下,SDL_Mixer 使用 libmodplug 0.8.8.5。如果 SDL_Mixer 使用 0.8.8.5,则该 hack 似乎不适用于链接 0.8.9.0,如果该 hack 使用 0.8.9.0,则该 hack 似乎不适用于链接 0.8.8.5。SDL_Mixer 使用 0.8.8.5 用于 SDL_Mixer 2.0.1 及更低版本,release 和 MikMod 用于 SDL_mixer 1.2 版本。SDL_Mixer 将 0.8.9.0 用于 SDL_Mixer 2.0.2。
编辑和重新编译 SDL_Mixer
另一种选择是修改 SDL2_Mixer 的源代码并自己重新编译。您可以在 music_mod.c 和 music_modplug.c 中更改这些值:
在 music_mod.c 中:更改
module->wrap = 0;
module->loop = 0;
至
module->wrap = 1; /*This option will loop without stutter*/
module->loop = 1; /*This option will make the player obey Position Jumps*/
在 music_modplug.c 中,更改:
settings.mLoopCount=0;
至
settings.mLoopCount=-1;
我不确定,但如果你走这条路,根据 zlib 许可证,你必须在显示许可证的地方将 SDL2_mixer 标记为已修改。
2. 更改的源版本必须清楚地标明,并且不得被误认为是原始软件。