一般的に言えば、OpenAL はオーディオの再生が終了しても通知しないため、AVAudioPlayerDelegate
. 最も簡単な方法は、オーディオの長さだけ関数/ブロックの呼び出しを遅らせることです。例として、libdispatch (別名 Grand Central Dispatch) を使用して、一定時間後にキューにブロックを追加できます。
dispatch_time_t delay;
dispatch_queue_t queue;
dispatch_block_t block;
uint64_t audio_length_ns = 10000000000; // 10 seconds
delay = dispatch_time(DISPATCH_TIME_NOW, audio_length_ns);
queue = dispatch_get_main_queue();
block = ^{
// Do whatever you need to after the delay
// Maybe check to see if the audio has actually
// finished playing and queue up the block again
// if it hasn't.
};
// Queue up the block for the time after
dispatch_after(delay, queue, block);
少し難しい方法は、ブロック内のコメントで述べたように、OpenAL がブロックで終了しているかどうかを確認し、終了していない場合は、ブロックをキューに再度プッシュすることです (特に、より短い遅延で、特にどれくらい長くなるかを概算できます)。ただし、一般的には、正確である必要はなく、サウンドの完成度が適切な範囲にあるだけで十分です。
などの他の方法でこの種のことをスケジュールすることもできますがperformSelector:withObject:afterDelay:
、API に関する限り、それは好みに依存します。考え方はほぼ同じです。