gpt4 book ai didi

ios - AVAudioEngine.connect 上的 CoreAudio 错误和崩溃

转载 作者:搜寻专家 更新时间:2023-10-31 19:26:37 31 4
gpt4 key购买 nike

我正在尝试将 AVAudioUnitEffect 连接到 AVAudioEngine 的实例,如下所示:

required init(inputFormat: AVAudioFormat, outputFormat: AVAudioFormat, andAVAudioEngine avAudioEngine:AVAudioEngine) {
self.inputFormat = inputFormat
self.outputFormat = outputFormat

self.avAudioEngine = avAudioEngine
self.myAudioUnit = MyAVAudioUnit()

super.init()

avAudioEngine.attach(myAudioUnit)
avAudioEngine.connect(myAudioUnit, to: avAudioEngine.outputNode, format: self.inputFormat)
}

总体类只是 NSObject 的子类,MyAudioUnitAVAudioUnitEffect 的子类。

在看似随机的时间,此初始化程序的最后一行(调用 connect)将抛出一个 SIGABRT 并出现以下错误:com.apple.coreaudio.avfaudio: error -10875

相当于 kAudioUnitErr_FailedInitialization

任何人都可以阐明这个错误以及这里可能发生的事情吗?我想也许 MyAVAudioUnit 的初始化器失败了,但它的内部初始化器 (init(audioComponentDescription: AudioComponentDescription)) 没有抛出任何错误并且有一个非可选的返回类型.有没有其他人遇到过这个特定错误?

更新

下面是inputFormat的初始化:

guard let stereoFormat = AVAudioFormat(commonFormat: .pcmFormatFloat32,
sampleRate: 44100,
channels: 2,
interleaved: false) else {
return
}

let numChannels = UInt32(10)
guard let multiChannelLayout = AVAudioChannelLayout(layoutTag: kAudioChannelLayoutTag_Unknown | numChannels) else {
return
}

inputFormat = AVAudioFormat(commonFormat: stereoFormat.commonFormat,
sampleRate: stereoFormat.sampleRate,
interleaved: stereoFormat.isInterleaved,
channelLayout: multiChannelLayout)

MyAVAudioUnit 包含一个额外的自定义参数 (volumeParameter) 并按如下方式初始化:

required override init() {
var componentDescription = AudioComponentDescription()
componentDescription.componentType = kAudioUnitType_Effect
componentDescription.componentSubType = xxxxx
componentDescription.componentManufacturer = xxxxx
componentDescription.componentFlags = 0
componentDescription.componentFlagsMask = 0

AUAudioUnit.registerSubclass(MyAVAudioUnit.self,
as: componentDescription,
name:"MyAVAudioUnit",
version: UInt32.max)

super.init(audioComponentDescription: componentDescription)

guard let paramTree = self.auAudioUnit.parameterTree else { return }
volumeParameter = paramTree.value(forKey: "volumeParameter") as? AUParameter
}

最佳答案

以下是最终解决此问题的方法。我从崩溃日志中注意到,在尝试连接音频单元之前打印出的音频图显示如下:

“________ GraphDescription ________ AVAudioEngineGraph 0x101538ba0: initialized = 1, running = 0, number of nodes = 23”

有趣的是,running 为 false,initializedtrue。关于这条initialized 信息的含义的文档并不多,但我发现它在 AVAudioEngine 之前已启动但暂停 时显示为 true。现在,我没有明确地从任何地方调用 avAudioEngine.pause(),但我认为系统可能会启动暂停作为 AVAudioSessionRouteChangeNotification 的一部分(这就是我我在这一系列事件中做出回应)。

很多都是推测,但很明显,调用 avAudioEngine.connect() 而引擎的打印输出显示 initialized = 1(或通过推断, 引擎暂停) 将导致此崩溃。

在尝试连接音频单元之前,音频引擎必须完全停止。我的问题是我尝试调用 avAudioEngine.stop() 时被包裹在 if 语句中,如下所示:

if avAudioEngine.isRunning {
avAudioEngine.stop()
}

当然,这个 if 语句被跳过了,因为音频引擎实际上并没有运行。所以 stop() 从未被调用过。删除 if 语句并调用 stop() 无疑会在引擎上设置 initialized = 0 并允许连接而不会发生此崩溃。

希望这对其他人有帮助。我花了很长时间才弄明白。

关于ios - AVAudioEngine.connect 上的 CoreAudio 错误和崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57379376/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com