Mel*_*Mel 6 iphone audio openal core-audio
我在iPhone上使用OpenAL同时播放多个音频样本.
我可以让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];
Run Code Online (Sandbox Code Playgroud)
如果这不是您所需要的,那么最好的选择可能是计时器。您不需要对任何值进行硬编码。您可以在填充缓冲区时确定播放时间。
对问题“为什么”的一些深入了解可能会提供一些额外的选择。
如果您将 OpenAL 源抽象为一个类,我想您可以performSelector:afterDelay:在启动声音时简单地调用:
- (void) play\n{\n [delegate performSelector:@selector(soundHasFinishedPlaying)\n afterDelay:self.length];\n \xe2\x80\xa6\n}\nRun Code Online (Sandbox Code Playgroud)\n\n(如果您同时手动停止声音,则可以取消回调,请参阅NSObject 类参考。)或者您可以轮询AL_SOURCE_STATE:
- (void) checkStatus\n{\n ALint state;\n alGetSourcei(source, AL_SOURCE_STATE, &state);\n if (state == AL_PLAYING)\n return;\n [timer invalidate];\n [delegate soundHasFinishedPlaying];\n}\nRun Code Online (Sandbox Code Playgroud)\n\n我不知道如何让 OpenAL 给您回电。您到底想要回调做什么?有些事情不需要回调就能更好地解决。
\n| 归档时间: |
|
| 查看次数: |
8035 次 |
| 最近记录: |