2016-10-31 13 views
2

Итак, у меня есть AVAudioPlayerNode Я планирование много буферов на использование следующих действий:Swift: Как остановить расписание выполнения буфера для буфера при прерывании?

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