【问题标题】:Getting notified when a sound is done playing in OpenAL在 OpenAL 中播放完声音时收到通知
【发布时间】:2010-11-05 23:43:34
【问题描述】:

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

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

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

【问题讨论】:

  • 这个问题现在已经 5 年了,但是对于像我这样的 OpenAL 新手来说,现在有一个用于 OpenAL 的 Objective-C APi,以及演示项目 (SourceNotificationsDemo) 中的一个类演示此功能。
  • @livingtech 你能提供一个链接吗?

标签: iphone audio core-audio openal


【解决方案1】:

我对 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];

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

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

【讨论】:

    【解决方案2】:

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

    - (void) play
    {
        [delegate performSelector:@selector(soundHasFinishedPlaying)
            afterDelay:self.length];
        …
    }
    

    (如果同时手动停止声音,可以取消回调,见NSObject Class Reference。)也可以轮询AL_SOURCE_STATE

    - (void) checkStatus
    {
        ALint state;
        alGetSourcei(source, AL_SOURCE_STATE, &state);
        if (state == AL_PLAYING)
            return;
        [timer invalidate];
        [delegate soundHasFinishedPlaying];
    }
    

    我不知道如何让 OpenAL 给您回电。你到底想要回调什么?有些事情不用回调就可以更好的解决。

    【讨论】:

      【解决方案3】:

      This OpenAL guide 提出了一个可能的解决方案:

      “流”功能还告诉我们流是否已播放完毕。

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

      【讨论】:

      • (链接的解决方案是使用 alGetSourcei(source, AL_SOURCE_STATE, &result) 进行轮询,这也是我推荐的。+1
      【解决方案4】:

      等等,你是说完成了一个样本(例如,44.1 KHz 音频的 1/44100 秒)?或者您是在谈论知道源已通过其缓冲区播放并且没有更多音频可播放?

      对于后者,当我将缓冲区流式传输到源时,轮询 AL_BUFFERS_PROCESSED 属性的源获得了很好的结果;它可能适用于单缓冲区情况来查找此属性的非零值。

      【讨论】:

      • 一旦你将缓冲区排队到一个源,AL_BUFFERS_RPOCESSED 将永远不会返回 0。即使你停止或暂停源,或者它完成了它的缓冲区。仅当您倒回源缓冲区或取消队列缓冲区时,该值才会减小。非零值仅表示至少一个缓冲区已在某个时间点播放完毕。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多