我想知道什么等效于在OpenAL中使用AVAudioPlayerDelegate
的audioPlayerDidFinishPlaying: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/