【问题标题】:SDL_Mixer MOD music loopingSDL_Mixer MOD 音乐循环播放
【发布时间】:2016-10-26 21:08:44
【问题描述】:

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

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

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

【问题讨论】:

    标签: android c++ sdl sdl-mixer


    【解决方案1】:

    要在不放弃 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 。更改后的源版本必须清楚地标明,并且不得歪曲为原始软件。

    【讨论】:

    • 不幸的是,这些方法都不适合我...这是用 SDL_Mixer 2.0.2 测试的吗?而且我认为您的意思是“music_mikmod.c”而不是“music_mod.c”,两次都被提及。
    • 我的理解是SDL_Mixer 2.0.2使用libmodplug-0.8.9.0,所以必须使用那个版本。你是说重新编译也不起作用?
    • 这是不久前的事了,但从内存中它重新编译并表现出相同的行为。我想如果我再次走这条路,我会考虑使用 libopenmpt。
    猜你喜欢
    • 2021-06-27
    • 2020-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    相关资源
    最近更新 更多