iPhone SDK - OpenAL,'Beat Box'风格的声音引擎

时间:2009-07-10 02:29:05

标签: iphone openal audio

如何创建一个“节拍盒”风格的声音引擎,其中一系列声音可以提前排队并在播放期间排队。这些声音需要播放,没有任何间隙或打嗝。

我研究过OpenAL并尝试使用alSourceQueueBuffers()来创建一个带有一系列预缓冲剪辑的源,但是没有达到我想要的效果。

我使用AudioFileOpenURL加载我的音频文件,然后使用AudioFileReadBytes将其加载到char数组中,使用alGenBuffers创建缓冲区,然后使用alBufferData缓冲。

然后我使用alGenSources创建一个源,并保留对该源的引用。然后我调用alSourceQueueBuffers(sourceId,1,& bufferId)几次,其中bufferId是一个传递到我的'queueClip'方法的参数,并引用了一些不同的剪辑。

执行此操作并调用alSourcePlay后,我听到似乎是我的两个片段播放,背靠背......但后来没有(我加载了3个音频文件,并随机添加到源使用alSourceQueueBuffers几次。)

我还需要了解更新源码的最佳方法,为其添加新声音并从中删除已播放的声音以清理内存等。

2 个答案:

答案 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);