如何创建一个“节拍盒”风格的声音引擎,其中一系列声音可以提前排队并在播放期间排队。这些声音需要播放,没有任何间隙或打嗝。
我研究过OpenAL并尝试使用alSourceQueueBuffers()来创建一个带有一系列预缓冲剪辑的源,但是没有达到我想要的效果。
我使用AudioFileOpenURL加载我的音频文件,然后使用AudioFileReadBytes将其加载到char数组中,使用alGenBuffers创建缓冲区,然后使用alBufferData缓冲。
然后我使用alGenSources创建一个源,并保留对该源的引用。然后我调用alSourceQueueBuffers(sourceId,1,& bufferId)几次,其中bufferId是一个传递到我的'queueClip'方法的参数,并引用了一些不同的剪辑。
执行此操作并调用alSourcePlay后,我听到似乎是我的两个片段播放,背靠背......但后来没有(我加载了3个音频文件,并随机添加到源使用alSourceQueueBuffers几次。)
我还需要了解更新源码的最佳方法,为其添加新声音并从中删除已播放的声音以清理内存等。
答案 0 :(得分:3)
您是否在轮询来源以查看它何时耗尽了缓冲区?
ALuint freeBuffer;
ALint processed;
alGetSourcei (myALSource, AL_BUFFERS_PROCESSED, &processed);
while (processed > 0) {
// remove spent buffer
alSourceUnqueueBuffers(myALSource, 1, &freeBuffer);
// refill buffer with samples, if they're going to be different this time
// ...
// re-queue buffer on source
alSourceQueueBuffers(myALSource, 1, &freeBuffer);
// check again for more processed buffers
alGetSourcei (myALSource, AL_BUFFERS_PROCESSED, &processed);
}
您需要继续执行此轮询以检查已用完的缓冲区...我使用了一个简单的NSTimer。
答案 1 :(得分:0)
我忽略了一个更容易的选择。在源代码上设置AL_LOOPING属性:
alSourcei (myALSource, AL_LOOPING, AL_TRUE);