完了ハンドラで参照され、割り込みコードによってトグルされる割り込み状態変数が必要です。ここでは、バッファを介してループしている方法についていくつかの仮定をし、いくつかの速記コードは次のとおりです。
var node: AVAudioPlayerNode!
var loopingBuffers: [AVAudioPCMBuffer] = [buffer1, buffer2, buffer3]
var interruptBuffers = false // state variable to handle the interruption
func scheduleNextBuffer() {
/* code to find the next buffer in the loopingBuffers queue */
// assuming you have instantiated an AVAudioPlayerNode elsewhere
node.scheduleBuffer(nextBuffer, completionHandler: bufferCompletion)
}
func bufferCompletion() {
// check the state variable to make certain the completionHandler isn't being triggered by a scheduling interruption
guard !interruptBuffers else { return }
scheduleNextBuffer()
}
func interruptBuffers() {
let newBuffers: [AVAudioPCMBuffer] = [buffer4, buffer5, buffer6]
interruptBuffers = true
node.scheduleBuffer(buffer4, at: nil, options: .interrupts, completionHandler: bufferCompletion)
// cleanup your state and queue up your new buffers
interruptBuffers = false
loopingBuffers = newBuffers
}
この質問を読んで、誰もがより多くのコンテキストを必要とする場合、私はスケジュール実行されるバッファ機能を実行するために完了ハンドラを使用しています完了ハンドラを実行する関数を実行する補完ハンドラ...大きなループで、ある時点でループを中断する必要があります。現在、私はオーディオノードを停止して再生していますが、この方法は音に目立った隙間を生じさせます。 – MysteryPancake