ios - Swift 在 iOS 模拟器中使用 AVAudioEngine 托管 AUv3 崩溃
问题描述
我启动了一个新的 iOS 应用程序,我在其中托管了一个 AUv3 插件,该插件是我通过 AudioUnit 扩展创建的。我基本上使用的是 Apple 提供给我的模板。我的主要应用程序是托管 AUv3。以下代码适用于我的设备( iPad Pro 11 - iOS 14 ),但在模拟器中( iPhone 11 - iOS 14 )我收到以下错误消息:
2020-10-15 21:07:36.786306+0200 MyApp[2132:84039] [plugin] AddInstanceForFactory: 没有为 id <CFUUID 0x600001d074c0> F8BB1C28-BAE8-11D6-9C31-00039315CD46 注册工厂
2020-10-15 21:07:37.124600+0200 MyApp[2132:83972] 例外:os_eventlink_activate 失败 (45)
2020-10-15 21:07:37.125009+0200 MyApp[2132:83972] [i-aa] AUAudioUnit_XPC.mm:665:-[AUAudioUnit_XPC allocateRenderResourcesAndReturnError:]: 渲染管道用户创建失败(错误域=NSOSStatusErrorDomain 代码=-1 “(无效的)”)
2020-10-15 21:07:37.125389+0200 MyApp[2132:83972] [avae]
AVAEInternal.h:109 [AVAudioEngineGraph.mm:1389:Initialize: (err = AUGraphParser::InitializeActiveNodesInOutputChain(ThisGraph, kOutputChainOptimizedTraversal, *GetOutputNode( ), isOutputChainActive)): 错误 -1 错误: 操作无法完成。(com.apple.coreaudio.avfaudio 错误 -1。)
ViewController.swift
import UIKit
import AVFoundation
import CoreAudioKit
class ViewController: UIViewController {
@IBOutlet weak var auView: UIView!
var avUnit:AVAudioUnit?
var engine:AVAudioEngine!
override func viewDidLoad() {
super.viewDidLoad()
self.engine = AVAudioEngine()
do {
try AVAudioSession.sharedInstance().setMode(.default)
try AVAudioSession.sharedInstance().setPreferredSampleRate(44100)
try AVAudioSession.sharedInstance().setCategory(.playback, options: [.allowBluetooth, .allowBluetoothA2DP, .mixWithOthers])
try AVAudioSession.sharedInstance().setActive(true)
}catch let error{
print("error \(error.localizedDescription)")
}
// Retrieve audio unit components by description.
let description = AudioComponentDescription(componentType: kAudioUnitType_MusicDevice,
componentSubType: 0x6775616e,
componentManufacturer: 0x5775616e,
componentFlags: 0,
componentFlagsMask: 0)
AVAudioUnit.instantiate(with: description, options: []) { avAudioUnit, error in
guard error == nil else {
DispatchQueue.main.async { /* Show error message to user. */ }
return
}
guard let aUnit = avAudioUnit else { return }
self.avUnit = aUnit
//let format = AVAudioFormat(commonFormat: .pcmFormatFloat32, sampleRate: 44100, channels: 2, interleaved: false)!
let formatOutput = self.engine.mainMixerNode.outputFormat(forBus: 0)
let formatAU = aUnit.outputFormat(forBus: 0)
self.engine.attach(aUnit)
self.engine.connect(aUnit, to: self.engine.mainMixerNode, format: formatAU)
self.engine.connect(self.engine.mainMixerNode, to: self.engine.outputNode, format: formatOutput)
do {
try self.engine.start()
} catch let error {
print(error.localizedDescription)
}
self.addPluginView()
}
}
private func addPluginView() {
self.avUnit?.auAudioUnit.requestViewController(completionHandler: { plugInViewController in
if plugInViewController != nil{
if let pluginView = plugInViewController!.view{
pluginView.frame = self.auView.bounds
self.auView.addSubview(pluginView)
}
}
})
}
}
是不是 AVAudioEngine 内部的问题..?任何帮助高度赞赏。
解决方案
推荐阅读
- android - 颤振运行命令未按预期工作
- c++ - 错误:无法转换 'std::ifstream {aka std::basic_ifstream
}' 到 'char**' 用于 getline() 函数 - python-3.x - 使用 DynamoDB 加密客户端(项目加密器)解密 DynamoDB 流?
- reactjs - 你如何在 React 事件监听器中处理外部数据?
- scala - 如何在Scala中反映与抽象类型的类型参数对应的具体类型?
- wordpress - 出现在 Woocommerce 中所有产品页面上的自定义按钮
- c# - iOS 14:Apple 拒绝“想查找并连接到本地网络上的设备”
- python - 使用 conda 装饰器告诉 metaflow 使用 pip 安装软件包
- python - 提取字符串列中遇到的第一个月名称
- amazon-web-services - 扩展 websocket 广播服务器