在OpenAL中播放声音时收到通知

Mel*_*Mel 6 iphone audio openal core-audio

我在iPhone上使用OpenAL同时播放多个音频样本.

我可以让OpenAL在单个样本播放时通知我吗?

我想避免硬编码样本长度和设置计时器.

pes*_*669 5

我在 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)

如果这不是您所需要的,那么最好的选择可能是计时器。您不需要对任何值进行硬编码。您可以在填充缓冲区时确定播放时间。

对问题“为什么”的一些深入了解可能会提供一些额外的选择。


zou*_*oul 3

如果您将 OpenAL 源抽象为一个类,我想您可以performSelector:afterDelay:在启动声音时简单地调用:

\n\n
- (void) play\n{\n    [delegate performSelector:@selector(soundHasFinishedPlaying)\n        afterDelay:self.length];\n    \xe2\x80\xa6\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

(如果您同时手动停止声音,则可以取消回调,请参阅NSObject 类参考。)或者您可以轮询AL_SOURCE_STATE

\n\n
- (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}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我不知道如何让 OpenAL 给您回电。您到底想要回调做什么?有些事情不需要回调就能更好地解决。

\n