更改对AirPods的输入时,AVAudioEngine停止运行

问题描述

切换音频输入源时,我无法理解AVAudioEngine的行为。

预期的行为

切换输入源时,AVAudioEngine的inputNode应该无缝采用新的输入源。

实际行为

AirPods切换到iPhone扬声器时,AVAudioEngine停止工作。不再有音频通过。查询engine.isRunning仍返回true。

随后切换回AirPods时,它仍然不起作用,但是现在engine.isRunning返回false。

在更改路线时停止并启动引擎没有帮助。也不会调用reset()。断开并重新连接输入节点也无济于事。唯一可靠的帮助是丢弃整个引擎并创建一个新引擎。

操作系统

这是在iOS 14 beta 5上。恐怕我无法在以前的版本中进行测试;我只有一个设备。

要复制的代码

这是最小的代码示例。在Xcode中创建一个简单的应用程序项目(无论您选择SwiftUI还是Storyboard都无关紧要),并为其授予访问Info.plist中的麦克风的权限。创建以下文件Conductor.swift

import AVFoundation

class Conductor {
    static let shared: Conductor = Conductor()
    
    private let _engine = AVAudioEngine?
    
    init() {
        // Session
        let session = AVAudioSession.sharedInstance()
        try? session.setActive(false)
        try! session.setCategory(.playAndRecord,options: [.defaultToSpeaker,.allowBluetooth,.allowAirPlay])
        try! session.setActive(true)

        _engine.connect(_engine.inputNode,to: _engine.mainmixerNode,format: nil)
        _engine.prepare()
    }

    func start() { _engine.start() }
}

然后在AppDelegate中,致电:

Conductor.shared.start()

此示例将把输入直接路由到输出。如果您没有耳机,它将触发反馈循环。

问题

在这里想念什么?这是预期的行为吗?如果是这样,它似乎在任何地方都没有记录。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)