6
A
回答
3
如果您的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的給你回電話。你想要什麼回調?有些東西可以在沒有回調的情況下更好地解決。
1
1
等一等,你說的是完成了一個樣本(例如44.1KHz音頻的1/44100秒)?或者你是否在談論知道某個源已經播放了緩衝區並且沒有更多音頻播放?
對於後者,我有很好的結果輪詢AL_BUFFERS_PROCESSED屬性的來源,當我流緩衝區到源;它可能適用於單緩衝區情況來查找此屬性的非零值。
4
我在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];
如果這不是你所需要的,那麼你最好打賭可能是一個計時器。你不應該需要硬編碼任何值。您可以在填充緩衝區時確定播放時間。
對問題「爲什麼」的一點洞察可能會提供一些額外的選擇。
相關問題
- 1. iOS中的FCM通知在收到時無法播放聲音
- 2. 播放流聲音OpenAL
- 3. 播放聲音的OpenAL
- 4. 使用OpenAL播放聲音
- 5. 如何在openAL或Finch中播放特定聲音時控制播放音量?
- 6. 聲音不在UILocal通知中播放
- 7. 在J2ME中未播放通知聲音
- 8. 實時播放接收到的聲音時的聲音回聲
- 9. 從後臺線程播放OpenAL聲音
- 10. 基本OpenAL代碼播放聲音
- 11. 聲音播放通知在iPhone上
- 12. 在iPhone上實現OpenAL時的聲音播放延遲(打嗝)
- 13. 在需要時通過默認通知聲音播放我的聲音
- 14. 播放通知聲音的選項iOS
- 15. Android通知播放聲音一次
- 16. 防止WhatsApp播放通知聲音
- 17. 播放通知聲音用JavaScript
- 18. 使用URL播放通知聲音
- 19. android無法從通知播放聲音
- 20. iphone不播放通知聲音
- 21. 停止播放聲音推送通知
- 22. 自定義通知聲音未播放
- 23. 只有播放聲音的Android通知
- 24. Android:播放音頻時接到通知
- 25. 如何在用戶通話時播放通知聲音?
- 26. 當我收到Parse的推送通知時,如何播放聲音?
- 27. 推送通知到達時未播放自定義聲音
- 28. 如何讓聲音在OpenAL中停止播放
- 29. 播放聲音當接收到消息
- 30. Xcode - OpenAL - 獲取播放聲音的當前時間
這個問題已經有5年的歷史了,但是對於像我這樣的OpenAL的新手來說,現在有一個OpenAL的Objective-C API以及演示項目(`SourceNotificationsDemo`)中的一個類來演示這個功能。 – livingtech 2014-10-30 21:52:28
@livingtech能否提供鏈接? – Zorayr 2015-06-17 18:55:35
項目在這裏:https://github.com/kstenerud/ObjectAL-for-iPhone – livingtech 2015-06-17 20:57:43