我使用iPhone上的OpenAL同时播放多个音频样本。
我能当一个样本播放完毕的OpenAL通知我吗?
我想避免硬编码所述样品的长度和设置定时器。
我使用iPhone上的OpenAL同时播放多个音频样本。
我能当一个样本播放完毕的OpenAL通知我吗?
我想避免硬编码所述样品的长度和设置定时器。
如果您在OpenAL的源抽象为一类,我想你可以简单地调用performSelector:afterDelay:
当您启动声音:
- (void) play
{
[delegate performSelector:@selector(soundHasFinishedPlaying)
afterDelay:self.length];
…
}
(如果你在此期间手动停止声音,回调可以取消,见NSObject类参考 。),也可以轮询AL_SOURCE_STATE
:
- (void) checkStatus
{
ALint state;
alGetSourcei(source, AL_SOURCE_STATE, &state);
if (state == AL_PLAYING)
return;
[timer invalidate];
[delegate soundHasFinishedPlaying];
}
我不知道如何获得的OpenAL给你回电话。 你到底要回调呢? 有些东西可以不用回调来解决更好。
我没有与OpenAL的回调多少运气。 在我的国家机器,我只是轮询源,直到它完成推迟过渡。
- (BOOL)playing {
ALint sourceState;
alGetSourcei(sourceID, AL_SOURCE_STATE, &sourceState);
return sourceState == AL_PLAYING;
}
// ... //
case QSTATE_DYING:
if (![audioSource playing])
[self transitionTo:QSTATE_DEAD];
如果这不是你所需要的,那么你最好的选择可能是一个计时器。 你不应该需要硬编码任何值。 您可以确定播放时间,当你填充你的缓冲区。
有识之士位到“为什么”的问题,可能会提供一些额外的选择。
本OpenAL的引导提出了一种可能的解决方案:
在“流”功能还告诉我们,如果流播放完毕。
...并提供示例源代码来说明使用。
等一下,你说的是在完成一个样品 (例如,44.1千赫音频四万四千百分之一秒)? 或者是你在谈论知道源通过其缓冲发挥,并没有更多的音频播放?
对于后者,我有很好的效果投票时,我流缓冲区源的AL_BUFFERS_PROCESSED财产的来源; 它可能为单缓冲的情况下工作,以寻找该属性的非零值。