首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SDL_Mixer MOD音乐循环

SDL_Mixer MOD音乐循环
EN

Stack Overflow用户
提问于 2016-10-26 21:08:44
回答 1查看 904关注 0票数 0

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

音乐播放,它可以在技术上循环,但有一个可怕的口吃,因为轨道是重新加载和它的权利拒绝服从这些格式支持的“位置跳转”命令。我的理解是,这更多地是一个SDL_Mixer问题,而不是实际处理格式的底层MikMod库。

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

EN

回答 1

Stack Overflow用户

发布于 2017-03-19 01:54:51

要在不放弃SDL_Mixer的情况下完成这一任务,您需要为MikMod和libmodplug编辑一些结构。编辑这些结构有两种方法:

无需编辑和重新编译SDL_Mixer

第一个选项是将MikMod或libmodplug包含并链接到您的项目中。SDL_Mixer通常只使用其中之一。

代码语言:javascript
复制
#ifdef MIKMOD_HACK
#include <mikmod.h>
#elif defined MODPLUG_HACK
#include <libmodplug/modplug.h>
#endif

调用Mix_OpenAudio之后,可以应用libmodplug:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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中:更改

代码语言:javascript
复制
module->wrap    = 0;
module->loop    = 0;

代码语言:javascript
复制
module->wrap    = 1; /*This option will loop without stutter*/
module->loop    = 1; /*This option will make the player obey Position Jumps*/

在music_modplug.c中,更改:

代码语言:javascript
复制
settings.mLoopCount=0;

代码语言:javascript
复制
settings.mLoopCount=-1;

我不确定,但是如果您走这条路线,根据zlib许可证,您必须将SDL2_mixer标记为正在显示许可证的某个修改的位置。

2.修改后的源版本必须清楚地标记为原始版本,并且不能被错误地表示为原始软件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40272144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档