1

OpenALでAVAudioPlayerDelegateのメソッドを使用するのと同じことを知りたいです。audioPlayerDidFinishPlaying:successfully:例えば:

-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
    // (code or conditions for when the audio has finished playing...)
}
4

1 に答える 1

2

一般的に言えば、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 に関する限り、それは好みに依存します。考え方はほぼ同じです。

于 2012-08-11T04:31:42.593 に答える