2

だから、私は次のように使用して、バッファの多くをスケジュールしていAVAudioPlayerNodeありますSwift:中断されたときにscheduleBuffer補完ハンドラが呼び出されるのを止めるには?

node.scheduleBuffer(buffer, at: nil, options: .interrupts, completionHandler: completeFunc) 

をしかし、私は少し問題を抱えています。現在再生中のバッファを中断する別のバッファを再生すると、中断しているバッファの補完ハンドラがまだ呼び出されています。私はこれが理にかなっていると思いますが、ファイルが実際に再生されたかどうか、または中断されたかどうかを確認する方法を見つけることができないようです。私はこれを行う方法がありますか?

すべての回答が役に立ちます。

+0

この質問を読んで、誰もがより多くのコンテキストを必要とする場合、私はスケジュール実行されるバッファ機能を実行するために完了ハンドラを使用しています完了ハンドラを実行する関数を実行する補完ハンドラ...大きなループで、ある時点でループを中断する必要があります。現在、私はオーディオノードを停止して再生していますが、この方法は音に目立った隙間を生じさせます。 – MysteryPancake

答えて

1

完了ハンドラで参照され、割り込みコードによってトグルされる割り込み状態変数が必要です。ここでは、バッファを介してループしている方法についていくつかの仮定をし、いくつかの速記コードは次のとおりです。

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 
} 
+0

なぜ、私は完了ハンドラを使って変数を設定することを考えなかったのか分かりません。アイデアありがとう! – MysteryPancake

関連する問題