0

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

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

我有一个块数组,我在初始化期间定期加载,使用 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());
        }
    }
}

尝试快速连续多次播放单个声音(例如,延迟 100 毫秒/10 bps),尽管以 10 bps 调用函数,但我仍以设定的较慢间隔(大约 500 毫秒左右/2 bps)播放声音。

我已经使用了“Mix_AllocateChannels(16);” 以确保我已经分配了频道(如果我使用不正确,请告诉我)并且仍然,阵列中的单个块拒绝以特定速率播放。

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

4

1 回答 1

1

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

因此,如果您的块长于 1.6 秒(16 个通道*100 毫秒),您将在 1.6 秒后用完通道,因此您将无法播放新块,直到其中一个通道结束播放。

所以基本上有2个解决方案:

  1. 分配更多通道(超过:ChunkDuration(秒)/延迟(秒))
  2. 停止频道,以便您可以使用它。(并且要正确执行此操作,您不应使用 -1 作为通道,而是每次播放块时递增的变量(当它等于您的通道数时,不要忘记将其设置回 0))
于 2017-07-21T19:59:08.273 回答