OpenAL でサウンドの再生が終了したときに通知を受け取る
-
20-08-2019 - |
質問
iPhone で OpenAL を使用して複数のオーディオ サンプルを同時に再生しています。
1 つのサンプルの再生が終了したときに OpenAL に通知してもらうことはできますか?
サンプルの長さをハードコーディングしたり、タイマーを設定したりすることは避けたいと考えています。
解決
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の中のコールバックを持つ多くの運を持っていませんでした。私のステートマシンでは、私は単にソースをポーリングし、それが行われるまでの移行を遅らせます。
- (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つのサンプルの(44.1 kHzオーディオのための、例えば、44100分の1秒)を持っていることについて話している、待って?それとも、ソースがそのバッファを介して再生され、再生するこれ以上のオーディオを持っていないことを知って話しているの?
は、後者の場合、私はソースにバッファをストリームAL_BUFFERS_PROCESSEDプロパティのソース良い結果のポーリングを持っていました。それは、このプロパティの非ゼロ値を探すために、シングルバッファの場合のために働くかもしれません。