-->

当声音做是OpenAL的打入门通知(Getting notified when a sound is

2019-09-17 01:49发布

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

我能当一个样本播放完毕的OpenAL通知我吗?

我想避免硬编码所述样品的长度和设置定时器。

Answer 1:

如果您在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给你回电话。 你到底要回调呢? 有些东西可以不用回调来解决更好。



Answer 2:

我没有与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];

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

有识之士位到“为什么”的问题,可能会提供一些额外的选择。



Answer 3:

本OpenAL的引导提出了一种可能的解决方案:

在“流”功能还告诉我们,如果流播放完毕。

...并提供示例源代码来说明使用。



Answer 4:

等一下,你说的是在完成一个样品 (例如,44.1千赫音频四万四千百分之一秒)? 或者是你在谈论知道源通过其缓冲发挥,并没有更多的音频播放?

对于后者,我有很好的效果投票时,我流缓冲区源的AL_BUFFERS_PROCESSED财产的来源; 它可能为单缓冲的情况下工作,以寻找该属性的非零值。



文章来源: Getting notified when a sound is done playing in OpenAL