繁体   English   中英

SDL_Mixer是否可以自己播放单个块?

[英]SDL_Mixer is playing single chunk over itself possible?

我在使用SDL_Mixer时遇到了麻烦(我缺乏经验)。 块和音乐可以很好地播放(使用Mix_PlayChannel和Mix_PlayMusic),同时播放两个不同的块不是问题。

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

我有一个块数组,我使用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)播放声音。

我已经使用了“ Mix_AllocateChannels(16);” 以确保分配了通道(让我知道我是否使用了不正确的通道),并且仍然从数组中分离出一个块以一定速率拒绝播放。

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

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

因此,如果您的块超过1.6秒(16个通道* 100ms),您将在1.6秒后用完所有通道,因此直到其中一个通道结束播放之前,您都无法播放新块。

因此,基本上有两种解决方案:

  1. 分配更多通道(大于:ChunkDuration(以秒为单位)/ Delay(以秒为单位))
  2. 停止频道,以便您可以使用它。 (并且要正确执行此操作,您不应使用-1作为通道,而应使用每次播放块时增加的变量(当它等于通道数时,不要忘记将其设置回0))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM