如何从音频单元获取 NSView 对象

Posted

技术标签:

【中文标题】如何从音频单元获取 NSView 对象【英文标题】:How to get the NSView object from Audio Unit 【发布时间】:2020-11-29 08:43:39 【问题描述】:

我可能在这里做了一些非常愚蠢的事情,但这让我陷入了困境。 我正在尝试显示音频单元的视图(如果有的话)。我的理解是 AU 工厂类应该返回一个 NSView(我不担心某些 v3 单元返回 ViewController 的选项)。我有这个方法:

func getAUcocoaView(_ audioUnit: AudioUnit ) -> NSView 
    
    var dataSize = UInt32(MemoryLayout<AudioUnitCocoaViewInfo>.size)
    var cocoaViewInfoRawPtr = UnsafeMutableRawPointer.allocate(byteCount: MemoryLayout<AudioUnitCocoaViewInfo>.size, alignment: MemoryLayout<AudioUnitCocoaViewInfo>.alignment)

    defer 
        cocoaViewInfoRawPtr.deallocate()
    

    let result = AudioUnitGetProperty(audioUnit, kAudioUnitProperty_CocoaUI, kAudioUnitScope_Global, 0, cocoaViewInfoRawPtr, &dataSize)
    if result != 0 
        print("Couldn't get AudioUnit property: kAudioUnitProperty_CocoaUI")
    
    let cocoaViewInfo = cocoaViewInfoRawPtr.bindMemory(to: AudioUnitCocoaViewInfo.self, capacity: 1).pointee
    
    let factoryClassNameCF = cocoaViewInfo.mCocoaAUViewClass
    let factoryClassName = factoryClassNameCF.takeUnretainedValue() as String
    let cocoaViewBundlePathCF = cocoaViewInfo.mCocoaAUViewBundleLocation
    let cocoaViewBundlePath = cocoaViewBundlePathCF.takeUnretainedValue()

    let bundle = Bundle(url: cocoaViewBundlePath as URL)
    let factoryClass = bundle!.classNamed(factoryClassName) as! NSObject.Type
    let auView = factoryClass.init()
    return auView as! NSView

在最终尝试强制转换为 NSView 之前,一切似乎都按预期工作。我的理解是 AU 工厂类返回一个 NSView ,但是这种强制转换的尝试导致: “无法将 'JUCE_AUCocoaViewClass_ab7d1f643f11dc89' (0x600000e5a730) 类型的值转换为 'NSView' (0x7fff8ceab778)。” 我可能错过了一些非常愚蠢的东西,但要么: a)如何从中获得 NSView ?或者; b) 如果不是这样,如何调用 AU 视图?

非常感谢任何帮助。

【问题讨论】:

【参考方案1】:

好吧,似乎根本不可能在 Swift 中调用必要的方法。我不知道为什么我花了这么长时间把头撞在墙上试图这样做,而在 Objective C 中这很容易。 所以我只是拿了包和类名等等瞧:

NSView * getAUCocoaView(AudioUnit mAudioUnit, NSSize size, NSBundle *viewBundle, NSString * viewClassName) 类 viewClass = [viewBundle classNamed: viewClassName];

id<AUCocoaUIBase> factory = [[viewClass alloc] init];
NSView * theView = [factory uiViewForAudioUnit: mAudioUnit withSize: size];
return theView;

【讨论】:

以上是关于如何从音频单元获取 NSView 对象的主要内容,如果未能解决你的问题,请参考以下文章

我可以从 MPMusicPlayerController 获取音频会话/应用音频单元播放吗?

如何从 Macbook 麦克风获取音频数据?

如何将音频单元输出的相位移动 180 度

如何保存和恢复作为音频单元主机的音频单元状态

如何从麦克风实时获取原始音频帧或从 iOS 中保存的音频文件获取原始音频帧?

从 Struct 创建的数组中存储的选定表格单元格中播放音频