【问题标题】:AudioKit crash: required condition is false: !destNodeMixerConns.empty() && !isDestNodeConnectedToIONodeAudioKit 崩溃:所需条件为假:!destNodeMixerConns.empty() && !isDestNodeConnectedToIONode
【发布时间】:2019-08-08 17:04:10
【问题描述】:

我们的项目遇到异常:

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

检查common gotchas video 我看到一个类似的异常被抛出,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 更新,我们没有遇到此崩溃。

【问题讨论】:

  • 很久没有人回复这个问题了。我想知道您是否想通了,或者您是否可以在 Github 上提供一个显示此错误的示例项目链接。谢谢。
  • @AureliusProchazka 我在这里创建了一个示例项目:github.com/jordanhbuiltbyhq/SamplePlayer 要重现,pod install 然后运行应用程序并点击下一步按钮。谢谢!!
  • 抱歉,我之前没有注意到这一点,但看起来您正在尝试启动 AudioKit,即使它已经启动了。会不会是这个问题?

标签: ios audiokit


【解决方案1】:

我已经打开了该项目,您似乎对信号链的设置/拆除有点过于放松了。您正在使用局部变量设置 AudioKit 的输出,从不拆除此信号链,然后返回重置 AudioKit 输出并告诉 AudioKit 启动而无需调用 AudioKit.stop()。

【讨论】:

  • 谢谢!在修改output 之前通过AudioKit.stop() 拆除解决了它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-24
  • 2019-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-21
相关资源
最近更新 更多