Dar*_*ius 5 audio macos objective-c core-audio swift
我试图在 macOS 上点击当前选择的输出音频设备,所以我基本上有一个直通监听器,可以监视当前正在输出的音频流而不影响它。
我想实时将这些数据复制到环形缓冲区,以便我可以单独对其进行操作。
Apple 文档和(过时的?)SO 的组合对于我是否需要编写 hacky 内核扩展、可以为此使用 CoreAudio 还是需要与 HAL 进行接口令人困惑?
如果可能的话,我想在 Swift 中工作。
非常感谢
我不知道内核扩展 - 它们使用特殊的“呼叫我们”签名证书或关闭 SIP 的必要性阻碍了随意探索。
然而你可以结合使用 CoreAudio 和 HAL AudioServer 插件来做你想做的事,你甚至不需要自己编写插件,有几个开源版本可供选择。
CoreAudio 没有为您提供从(或“点击”)输出设备录制的方法 - 您只能从输入设备录制,因此解决此问题的方法是创建一个虚拟的“直通”设备(AudioServerPlugin),而不是与任何硬件相关联,将输出复制到输入,然后将此通过设备设置为默认输出并从其输入记录。我已经使用开源 AudioServer 插件(例如BackgroundMusic和BlackHole [待办事项:添加更多])完成了这项工作。
为了从所得到的器件点击/记录您可以将简单的添加AudioDeviceIOProc
回调,或将设备设置为kAudioOutputUnitProperty_CurrentDevice
的kAudioUnitSubType_HALOutput
AudioUnit
上述虚拟直通设备方式存在两个问题:
如果 1. 是一个问题,那么简单的方法是创建一个包含直通设备和真实输出设备的多输出设备(参见屏幕截图)并将其设置为默认输出设备。音量控制停止工作,但您仍然可以在Audio MIDI Setup.app
.
2.你可以给默认输出设备添加一个监听器,当它改变时更新上面的多输出设备。
您可以在 swift 中完成上述大部分操作,但对于从缓冲区传递回调中进行的环形缓冲区存储,您必须使用 C 或其他一些可以遵守实时音频规则(无锁、无内存分配等)的语言。你也许可以尝试AVAudioEngine
点击,但 IIRC 改变输入设备是一个眼泪的谷。