Сбой AudioKit: обязательное условие ложно: !destNodeMixerConns.empty() && !isDestNodeConnectedToIONode

Мы испытываем исключение в нашем проекте:

2019-08-08 10:18:28.703708-0600 AppName[99385:5069475] *** Terminating app due to uncaught exception 'com.apple.coreaudio.avfaudio', reason: 'required condition is false: !destNodeMixerConns.empty() && !isDestNodeConnectedToIONode'
*** First throw call stack:
(
    0   CoreFoundation                      0x000000010ee2e8db __exceptionPreprocess + 331
    1   libobjc.A.dylib                     0x000000010e21bac5 objc_exception_throw + 48
    2   CoreFoundation                      0x000000010ee2e662 +[NSException raise:format:arguments:] + 98
    3   AVFAudio                            0x0000000111b94dbc _Z19AVAE_RaiseExceptionP8NSStringz + 156
    4   AVFAudio                            0x0000000111bf3937 _Z11_AVAE_CheckPKciS0_S0_b + 295
    5   AVFAudio                            0x0000000111b8cb8f _ZN18AVAudioEngineGraph8_ConnectEP19AVAudioNodeImplBaseS1_jjP13AVAudioFormat + 1031
    6   AVFAudio                            0x0000000111bfb598 _ZN17AVAudioEngineImpl7ConnectEP11AVAudioNodeS1_mmP13AVAudioFormat + 194
    7   AVFAudio                            0x0000000111bfb5ff -[AVAudioEngine connect:to:format:] + 83
    8   AppName                             0x000000010a424c10 $s8AudioKitAAC6outputAA6AKNodeCSgvWZTf4dd_n + 2576
    9   AppName                             0x000000010a4230fd $s8AudioKitAAC6outputAA6AKNodeCSgvsZ + 93
    10  AppName                             0x000000010a2ba3a3 $s6AppName7MaestroC17setUpTrackPlayers7fileURLy10Foundation0H0V_tF + 1235

Изучая видео о частых ошибках, я вижу, что возникает похожее исключение, required condition is false: !nodeMixerConns.empty() && !hasDirectConnToIONode, которое вызвано тем, что переменные выходят за пределы области видимости, а не сохраняются в классе.

Итак, это происходит, когда мы создаем AKPlayer, который сохраняется в классе, затем мы создаем AKTimePitch с этим игроком, который также сохраняется в этом классе, и, наконец, назначаем его AudioKit.output, что вызывает исключение. После этого мы сохранили класс, который удерживает игрока и время, в массиве, поэтому я попытался переместить его после его создания в надежде, что это проблема, но я вижу то же исключение.

Интересно, что этот код изначально работает нормально, когда мы загружаем первую песню, но вылетает, когда мы нажимаем кнопку «Далее», чтобы загрузить следующую песню.

final class Maestro : NSObject {
    static let shared = Maestro()

    var audioPlayers = [TrackPlayer]()

    func setUpTrackPlayers(fileURL: URL) {
        let playerOne = TrackPlayer(url: fileURL)
        audioPlayers.append(playerOne)

        AudioKit.output = playerOne.handleMixerChain() //boom

        do {
            try AudioKit.start()
        } catch {
            print("Maestro AudioKit.start error: \(error)")
        }
    }

    func next() {
        for player in audioPlayers {
            player.stop()
        }
        audioPlayers.removeAll()

        setUpTrackPlayers(fileURL: newSong.getFileUrl())
    }
}

final class TrackPlayer {
    let player : AKPlayer
    lazy var timePitch = AKTimePitch()

    init(url: URL) {
        player = AKPlayer(url: url)!
    }

    func handleMixerChain(pitch: Double = 0.0, tempo: Double = 1.0) -> AKTimePitch {
        timePitch = AKTimePitch(player)
        timePitch.pitch = pitch
        timePitch.rate = tempo
        return timePitch
    }
}

Любые идеи? Если вам нужна дополнительная информация, дайте мне знать. Может быть хорошо отметить, что мы обновляем AudioKit 4.5.5, где у нас не было этого сбоя.


person Jordan H    schedule 08.08.2019    source источник
comment
Давно никто не ответил на этот вопрос. Интересно, вы либо поняли это, либо могли бы предоставить ссылку на пример проекта на Github, в которой обнаружена эта ошибка. Спасибо.   -  person Aurelius Prochazka    schedule 28.08.2019
comment
@AureliusProchazka Я создал образец проекта здесь: github.com/jordanhbuiltbyhq/SamplePlayer Чтобы воспроизвести, pod install затем запустите приложение и нажмите кнопку «Далее». Спасибо!!   -  person Jordan H    schedule 29.08.2019
comment
Извините, я не заметил этого раньше, но похоже, что вы пытаетесь запустить AudioKit, хотя он уже запущен. Может ли это быть проблемой?   -  person Aurelius Prochazka    schedule 22.09.2019


Ответы (1)


Я открыл проект, и кажется, что вы слишком расслабленно относитесь к настройке/разборке сигнальной цепи. Вы настраиваете вывод AudioKit, используя локальные переменные, никогда не разрывая эту цепочку сигналов, а затем возвращаетесь, сбрасываете вывод AudioKit и сообщаете AudioKit запуститься, даже не вызывая AudioKit.stop().

person Aurelius Prochazka    schedule 22.09.2019
comment
Благодарю вас! Срыв через AudioKit.stop() перед изменением output решил эту проблему. - person Jordan H; 23.09.2019