作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我无法通过检查声音是否已在我的程序中停止来确保这一点,因为声音是在不同的线程中处理的,对吗?
所以当我想 100% 确定一旦一个声音停止播放,另一个声音将在它之后立即开始播放时,没有任何延迟的可能性,问题就来了。
第二个声音将是循环声音类型,所以我不能将这两个声音粘在一起。
我该怎么做?
最佳答案
我不知道 OpenAL 中有任何函数可以让你直接做这样的事情,例如通过阻止或通知您,可以按照您所说的方式进行无缝播放。任何像“在第一个声音的持续时间内 sleep ,然后开始第二个声音”这样的解决方案都注定会失败,因为 sleep 是不可靠的。反复检查源是否已停止播放也不起作用,因为当您看到源已完成播放时,已经有一个可听见的间隙。
但是,您可以通过对第一个声音使用一次 alSourceQueueBuffers
和对第二个(循环)声音使用一次来间接实现此功能。
开始播放源。
然后定期调用 alGetSourcei(source, AL_BUFFERS_PROCESSED, &num_done)
。您不需要一直调用它,只需比循环声音的持续时间更频繁即可。
如果这告诉您缓冲区已完成,请取消排队。这是完成的第一个声音,现在正在播放第二个。现在,再次快速将包含第二个声音的缓冲区放入队列,并在您希望声音循环播放时一直保持队列/取消队列。
关于c++ - 如何在另一个声音结束后立即播放一个声音?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5885114/
我是一名优秀的程序员,十分优秀!