0

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

音乐播放并且在技术上可以循环播放,但是当重新加载曲目时会出现可怕的口吃,并且完全拒绝遵守这些格式支持的“位置跳转”命令。我的理解这更像是一个 SDL_Mixer 问题,而不是实际处理格式的底层 MikMod 库。

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

4

1 回答 1

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,如果该 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. 更改的源版本必须清楚地标明,并且不得被误认为是原始软件。

于 2017-03-19T01:54:51.493 回答