首页 > 解决方案 > 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 内部的问题..?任何帮助高度赞赏。

标签: iosswiftxcodeavfoundationaudiounit

解决方案


推荐阅读