当使用 AVAudioPlayerNode 播放片段时,我可以注册两个不同的回调:“调度完成”和“播放完成”吗?

dma*_*200 5 ios swift avaudioplayernode

我正在使用 AVAudioPlayerNode 在 Swift 中构建多轨音频播放器。当安排音频片段播放时,我希望在安排完成时以及文件播放完成时/如果完成时收到通知。从 Swift API 的编写方式看来,您只能注册其中之一。如果调用短函数:

func scheduleSegment(_ file: AVAudioFile, 
       startingFrame startFrame: AVAudioFramePosition, 
          frameCount numberFrames: AVAudioFrameCount, 
                  at when: AVAudioTime?, 
   completionHandler: AVAudioNodeCompletionHandler? = nil)
Run Code Online (Sandbox Code Playgroud)

一旦文件被安排(不播放,只是安排播放),回调就会被调用,并且您不能传递任何特殊参数,只能传递一个基本的闭包。

当调用更高级的函数时,您可以指定您想要的回调类型,但是您必须选择一个且只能选择一个:

func scheduleSegment(_ file: AVAudioFile, 
       startingFrame startFrame: AVAudioFramePosition, 
          frameCount numberFrames: AVAudioFrameCount, 
                  at when: AVAudioTime?, 
completionCallbackType callbackType: AVAudioPlayerNodeCompletionCallbackType, 
   completionHandler: AVAudioPlayerNodeCompletionHandler? = nil)
Run Code Online (Sandbox Code Playgroud)

枚举 AVAudioPlayerNodeCompletionCallbackType 可以是以下之一:dataConsumed、dataRendered 或 dataPlayedBack

不幸的是我必须选择一个,但实际上我需要两个。当安排完成并且数据播放时我需要收到通知。

有没有办法做到这一点?