我想知道什么等效于在OpenAL中使用AVAudioPlayerDelegateaudioPlayerDidFinishPlaying:successfully:方法。例如:

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

最佳答案

一般来说,当音频播放完毕时,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而言,这更多地取决于您的偏好。这个想法几乎是相同的。

关于objective-c - 确定OpenAL使用回调完成播放音频的时间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11911451/

10-13 00:58