Audiokit - случайные сбои приложения из фона - PullRequest
0 голосов
/ 26 мая 2018

Я начал экспериментировать с AudioKit - прекрасным фреймворком, однако у меня возникают некоторые сбои, которые я не могу отследить.

Для начала я хотел построить секвенсор и последовал примеру в этом посте: https://medium.com/@oleary.audio/building-a-midi-sequence-in-swift-bed5f5c2bb7d, а также добавил некоторый код, чтобы помочь визуализировать текущий шаг, воспроизводимый в секвенсоре, используяинструмент обратного вызова (как описано здесь: AudioKit ios AKSamplerMetronome ).

Все работает нормально, когда я нахожусь в приложении, однако, если я выхожу из приложения, оставляю приложение в фоновом режиме и снова захожу, это случайно (один раз каждые 4-5 попыток) падает с трассировкой стека, которую я не понимаю (см. ниже) enter image description here

Я не уверен, что может быть причинойэто или то, что может вызывать функцию AKMIDIInstrument.enableMIDI, которую я вижу в отладчике.Любые советы по этому вопросу с благодарностью.

РЕДАКТИРОВАТЬ: Я должен добавить, что это происходит только на физическом устройстве, я не смог воспроизвести его в симуляторе.

EDIT2: я также попытался переместить функцию обратного вызова инструмента обратного вызова за пределы контроллера представления и настроить делегата для изменения представления, полагая, что жизненный цикл контроллера представления может каким-то образом повлиять на него, но проблемавсе еще сохраняется.

Вот упрощенная версия моего кода для справки:

class AudioCore {
    static let sharedInstance = AudioCore()
    let osc = AKOscillatorBank()
    let sequencer = AKSequencer()
    let callbackTrack:AKMusicTrack?
    let soundTrack:AKMusicTrack?
    let callbackInstrument = AKCallbackInstrument()
    let midi = AKMIDI()

    init() {
        let midiNode = AKMIDINode(node: osc)
        AudioKit.output = midiNode
        do {
            try AudioKit.start()
        }
        catch {
            AKLog("Audio kit failed to start")
        }

        if let track = sequencer.newTrack(){
            callbackTrack = track
            callbackTrack?.setMIDIOutput(callbackInstrument.midiIn)
        } else {
            callbackTrack = nil
        }

        if let sound = sequencer.newTrack(){
            soundTrack = sound
            soundTrack?.setMIDIOutput(midiNode.midiIn)
        } else {
            soundTrack = nil
        }
    }
}

class ViewController: UIViewController {
    override func viewDidLoad() {
         super.viewDidLoad()
         for i in 0...10 {
            AudioCore.sharedInstance.soundTrack?.add(noteNumber: MIDINoteNumber(pitch), velocity: 127, position: AKDuration(beats: pos), duration: AKDuration(beats: dur))
            AudioCore.sharedInstance.callbackTrack?.add(noteNumber: MIDINoteNumber(i), velocity: 127, position: AKDuration(beats: pos), duration: AKDuration(beats: dur))
         }
         AudioCore.sharedInstance.callbackInstrument.callback = { status, note, vel in
             guard status == .noteOn else { return }
             DispatchQueue.main.async {
                if(note < self.buttons.count) {
                    self.buttons[note].backgroundColor = UIColor.red
                 }
             }

             let dispatchDelay = 1.0 / tempo * 60.0 * noteLength
             DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + dispatchDelay, execute: {
                 if(note < self.buttons.count) {
                    self.buttons[note].backgroundColor = oldColor
                 }
             })
         }
    }
}
...