AVAudioEngine connect-代码退出功能,不会抛出错误

问题描述 投票:1回答:1

这很可能是我对敏捷一无所知,但我感到困惑。

我有以下(简化)代码-请注意,由于它(通常)按预期运行,因此我从中抽了很多东西:

engine = AVAudioEngine() //engine being a class variable

AVAudioUnit.instantiate(with: mixerDesc, options: [.loadOutOfProcess], completionHandler: {(audioUnit, auError) in
    //configure matrix mixer
    self.matrixMixer = au
    engine.attach(au)

    print("make connections")
    engine.connect(engine.inputNode, to: au, format: inputFormat)
    engine.connect(au, to: engine.mainMixerNode, format: inputFormat)
    print("connections done")

    try! engine.start()
} 

此代码在99%的时间内有效,但是在某些情况下(主要是在默认输入/输出设备更改时),在建立连接时会产生错误。我不明白的是,该错误导致函数在发生错误时(建立连接时)退出,但不会导致应用程序终止-我假设这是因为错误是只是杀死那个线程。

有什么方法可以捕获该错误?我尝试将defer {}添加到该函数的开头,但这也不被调用。这令人沮丧,因为这意味着应用程序不同步,我不清楚如何捕获它。

仅供参考,抛出的错误是:

2020-05-31 22:33:22.219189+0100 StageSound[20887:289670] [General] required condition is false: IsFormatSampleRateAndChannelCountValid(hwFormat)
2020-05-31 22:33:22.221812+0100 StageSound[20887:289670] [General] (
    0   CoreFoundation                      0x00007fff332f1be7 __exceptionPreprocess + 250
    1   libobjc.A.dylib                     0x00007fff6c0c95bf objc_exception_throw + 48
    2   CoreFoundation                      0x00007fff3331ad98

并且崩溃日志继续。.>

这很可能使我对快速不了解,但是我感到困惑。我有以下(简化)代码-请注意,由于它(通常)按预期运行,因此我从中抽了很多东西:engine = ...] >

似乎从Objective-C代码中抛出了NSException。您不能直接从Swift捕获NSExceptions,但是有一种方法可以在Objective-C和Swift之间建立桥梁。这样,您可以将NSException转换为Swift可以理解的内容(例如,NSError)。

有关此桥接的详细信息,请参阅:https://stackoverflow.com/a/36454808

swift macos cocoa core-audio
1个回答
0
投票

似乎从Objective-C代码中抛出了NSException。您不能直接从Swift捕获NSExceptions,但是有一种方法可以在Objective-C和Swift之间建立桥梁。这样,您可以将NSException转换为Swift可以理解的内容(例如,NSError)。

© www.soinside.com 2019 - 2024. All rights reserved.