gpt4 book ai didi

c++ - SDL_Mixer 是否可以在自身上播放单个 block ?

转载 作者:行者123 更新时间:2023-11-28 05:05:10 26 4
gpt4 key购买 nike

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

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

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

Mix_Chunk *sounds[32];

我还保留了一个函数来播放这些 block :

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 毫秒延迟/10bps),尽管以 10bps 的速度调用该函数,但我还是以设定的较慢间隔(大约 500 毫秒/2bps)播放声音.

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

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

最佳答案

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

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

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

  1. 分配更多 channel (超过:ChunkDuration(秒)/延迟(秒))
  2. 停止 channel ,以便您可以使用它。 (为了正确地做到这一点,你不应该使用 -1 作为 channel ,而是每次播放一个 block 时你递增的变量(当它等于你的 channel 数时不要忘记将它设置回 0))<

关于c++ - SDL_Mixer 是否可以在自身上播放单个 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45001462/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com