确定OpenAL何时使用回调播放音频

时间:2012-08-11 02:42:02

标签: objective-c ios avfoundation openal

我想知道什么等同于在OpenAL中使用AVAudioPlayerDelegate的{​​{1}}方法。例如:

audioPlayerDidFinishPlaying:successfully:

1 个答案:

答案 0 :(得分: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而言,这更多地取决于您的偏好。这个想法几乎是一样的。