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 回答