gpt4 book ai didi

iphone - iPhone SDK-OpenAL, 'Beat Box'样式的声音引擎

转载 作者:行者123 更新时间:2023-12-03 00:11:45 24 4
gpt4 key购买 nike

如何创建“节拍盒”式的声音引擎,可以在播放之前和播放期间将一系列声音排队。这些声音需要无间隙或打h地播放。

我研究了OpenAL,并尝试使用alSourceQueueBuffers()创建具有一系列预缓冲剪辑的源,但是没有实现我想要的。

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

然后,我使用alGenSources创建一个源,并保留对该源的引用。然后,我多次调用alSourceQueueBuffers(sourceId,1,&bufferId),其中bufferId是传递给我的“queueClip”方法的参数,并引用了许多不同的片段。

在执行完此操作并调用alSourcePlay之后,我听到了似乎是两个片段的播放,是连续播放的……但是什么都没有(我将其加载了3个音频文件,并使用alSourceQueueBuffers将它们随机添加到源中。几次)。

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

最佳答案

您是否正在轮询源以查看其何时耗尽了缓冲区?

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。

关于iphone - iPhone SDK-OpenAL, 'Beat Box'样式的声音引擎,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1107409/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com