我试图使用SDL_Mixer在SDL(2)应用程序中循环一些mod音乐,但是我发现这个库不能很好地处理IT/XM/S3M/MOD格式。
音乐播放,它可以在技术上循环,但有一个可怕的口吃,因为轨道是重新加载和它的权利拒绝服从这些格式支持的“位置跳转”命令。我的理解是,这更多地是一个SDL_Mixer问题,而不是实际处理格式的底层MikMod库。
请记住,该程序需要支持多个平台(又名Android),是否有一种方法可以创建更干净的循环机制和/或SDL_Mixer的可行替代方案?
发布于 2017-03-19 01:54:51
要在不放弃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:
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至于找出要使用的黑客..。默认情况下,SDL_Mixer使用libmodplug 0.8.8.5。如果SDL_Mixer使用0.8.8.5,则该黑客似乎不适用于链接0.8.9.0;如果黑客使用0.8.9.0,则该黑客似乎不适用于链接0.8.8.5。SDL_Mixer对SDL_Mixer 2.0.1及更低版本使用0.8.8.5,对于SDL_mixer 1.2版本使用MikMod。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.修改后的源版本必须清楚地标记为原始版本,并且不能被错误地表示为原始软件。
https://stackoverflow.com/questions/40272144
复制相似问题