SDL_Mixer可以单独播放单个块吗?

时间:2017-07-09 22:02:20

标签: c++ sdl channel chunks sdl-mixer

我在使用SDL_Mixer时遇到了麻烦(我缺乏经验)。 Chunks和Music播放得很好(使用Mix_PlayChannel和Mix_PlayMusic),同时播放两个不同的块并不是问题。

我的问题是我想播放一些chunk1,然后播放chunk1的第二次迭代,重叠第一次。我试图快速连续播放一个单块,但它反而以更长的间隔重复播放声音(不是我想要的那么快)。我测试了控制台输出,我的播放/循环方法没有错,因为我可以看到控制台消息打印,以正确的速度循环。

我有一个Chunks数组,我在初始化期间定期加载,使用Mix_LoadWAV();

Mix_Chunk *sounds[32];

我还有一个保留用于播放这些块的功能:

void PlaySound(int snd_id)
{
    if(snd_id >= 0 && snd_id < 32)
    {
        if(Mix_PlayChannel(-1, sounds[snd_id], 0) == -1)
        {
            printf("Mix_PlayChannel: %s\n",Mix_GetError());
        }
    }
}

尝试快速连续几次播放单个声音(例如,100ms延迟/ 10bps),尽管以10bps的速率调用该功能,但我会以设定的较慢间隔(约500ms左右/ 2bps)播放声音

我已经使用了&#34; Mix_AllocateChannels(16);&#34;确保我已经分配了频道(让我知道我是否正确地使用了这个频道)但是,阵列中的一个块拒绝以一定的速率播放。

感谢任何想法/帮助,以及对我如何发布此问题的批评。

1 个答案:

答案 0 :(得分:1)

如SDL_Mixer(https://www.libsdl.org/projects/SDL_mixer/docs/SDL_mixer_28.html)的文档中所述: “......为第一个免费无保留频道。”

因此,如果您的大块超过1.6秒(16个通道* 100毫秒),您将在1.6秒后耗尽通道,因此您将无法播放新的块,直到其中一个通道结束播放。

所以基本上有两种解决方案:

  1. 分配更多频道(超过:ChunkDuration(以秒为单位)/延迟(以秒为单位))
  2. 停止频道,以便您可以使用它。 (并且要正确地执行,你不应该使用-1作为通道,而是每次你玩一个块时增加的变量(当它等于你的通道数时不要忘记将它设置回0)) LI>