如何在另一个声音结束后立即播放声音

How to play a sound instantly after another sound ended?

本文关键字:播放声音 结束 声音 另一个      更新时间:2023-10-16

我无法通过检查声音是否在我的程序中停止来确保这一点,因为声音在不同的线程中处理,对吗?

因此,当我想 100% 确定一旦声音停止播放时,另一个声音会立即开始,没有任何延迟的可能性时,问题就来了。

第二种声音将是循环声音类型,所以我不能只是将两种声音粘合在一起。

我该怎么做?

我不知道 OpenAL 中有任何功能可以让您直接做这样的事情,例如通过阻止或通知您,因此可以像您所说的那样进行无缝播放。任何像"在第一个声音的持续时间内睡觉,然后开始第二个声音"这样的解决方案都注定会失败,因为睡眠是不可靠的。反复检查源是否已停止播放也不起作用,因为在您看到源完成时,已经存在可听见的差距。

但是,您可以通过对第一个声音使用一次alSourceQueueBuffers,对第二个(循环)声音使用一次来间接使用它。

开始播放源。

然后定期打电话给alGetSourcei(source, AL_BUFFERS_PROCESSED, &num_done)。您不需要一直调用它,只需比循环声音的持续时间更频繁。

如果这告诉您缓冲区已完成,请取消排队。这是第一个声音完成,第二个声音现在正在播放。现在,快速排队再次保存第二个声音的缓冲区,并继续排队/取消排队,只要您希望声音循环。