簡體   English   中英

在OpenAL中播放聲音時收到通知

[英]Getting notified when a sound is done playing in OpenAL

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

如果這不是你需要的,那么你最好的選擇可能是計時器。 您不需要對任何值進行硬編碼。 您可以在填充緩沖區時確定播放時間。

對問題“原因”的一些了解可能會提供一些額外的選擇。

如果你把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指南提出了一個可能的解決方案:

'stream'函數還告訴我們流是否已完成播放。

...並提供示例源代碼以說明用法。

等等,你在談論完成一個樣本 (例如,44.1 KHz音頻的1/44100秒)? 或者你在談論知道一個源已經通過其緩沖區播放並且沒有更多的音頻播放?

對於后者,當我將緩沖區傳輸到源時,我已經有很好的結果輪詢AL_BUFFERS_PROCESSED屬性的源; 它可能適用於單緩沖區情況,以查找此屬性的非零值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM