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

时间:2011-05-04 14:34:22

标签: c++ openal

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

所以问题出现的时候,我想100%确定一旦声音停止播放,另一种声音会立即开始播放,不会有任何延迟。

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

我该怎么做?

1 个答案:

答案 0 :(得分:2)

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

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

开始播放源。

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

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