SDL_Mixer MOD音乐循环

时间:2016-10-26 21:08:44

标签: android c++ sdl sdl-mixer

我尝试使用SDL_Mixer在SDL(2)应用程序中循环播放一些mod音乐,但我发现该库不能很好地处理IT / XM / S3M / MOD格式

音乐播放并且它可以在技术上循环播放,但是当曲目被重新加载时它会出现可怕的断断续续的声音并且它在右边拒绝服从"位置跳跃"这些格式支持的命令。我理解这更像是SDL_Mixer问题,而不是实际处理格式的底层MikMod库。

请记住,这个程序需要支持多个平台(也就是Android)是否有一种hacky方法来创建一个更清晰的循环机制和/或SDL_Mixer的可行替代方案?

1 个答案:

答案 0 :(得分:0)

要在不放弃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)用于其SDL 2.0版本和MikMod对于SDL来说它是1.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。修改后的源版本必须明确标记,不得歪曲为原始软件。