kod*_*r16 8 c++ macos operating-system kernel core-audio
我需要为系统音频捕获(基于 Soundflower)开发音频设备驱动程序。
但很快就出现了一个问题,似乎 IOAudioFamily 堆栈在 OSX 10.10 及更高版本中已被弃用。
查看IOAudioDevice
和IOAudioEngine
头文件,似乎苹果现在建议使用<CoreAudio/AudioServerPlugIn.h>
在用户空间中运行的API。但是我找不到有关此用户空间设备驱动程序主题的大量信息。似乎唯一的资源是 Apple 提供的来自https://developer.apple.com/library/prerelease/content/samplecode/AudioDriverExamples/Introduction/Intro.html 的示例设备
查看示例我发现它更难开发用户空间驱动程序而不是基于 I/O Kit 内核的更多工作。
那么问题来了,在用户空间而不是内核空间开发设备驱动程序的动机是什么?
“SimpleAudioDriver”示例的名称有些错误。它展示了 API 的几乎所有功能。如果您确实需要使用这些功能,这可以作为参考。它的结构也可能比必要的复杂一些。
对于虚拟设备,NullAudioDriver 可能是一个更好的基础,并且更容易理解(单个源文件,如果我没记错的话)。SimpleAudioDriver 在处理诸如热插拔、相同设备的多个实例等问题时更有用。
IOAudioEngine
如您所说,已被弃用,并且自 OS X 10.10 以来已被弃用。预计它最终会消失,所以如果你用它构建你的驱动程序,你可能需要比创建一个基于 Core Audio Server Plugin 的驱动程序更早地重写它。
无论哪种方式,测试和调试音频驱动程序都很尴尬(因为对时间很敏感),但我想说用户空间的驱动程序处理起来不那么令人沮丧。您仍然希望在与您的开发 Mac 不同的机器上进行测试,因为如果 coreaudiod 崩溃或挂起,应用程序通常也会开始锁定,因此能够通过 ssh 进入、删除您的插件并杀死 coreaudiod 很方便。当然比必须重新启动更快的周转。
(FWIW,我已经发布了内核和用户空间 OS X 音频驱动程序,我花了很多时间在 kexts 上。)
sho*_*ave -2
有一本关于这个主题的好书,可以在此处免费在线获取:
\n\nhttp://free-electrons.com/doc/books/ldd3.pdf
\n\n请参阅第 37 页,了解您可能需要用户空间驱动程序的原因的摘要,为方便起见,将其复制到此处:
\n\n\n\n用户空间驱动程序的优点是:
\n\n\n
\n- 可以链接完整的 C 库。驱动程序可以执行许多特殊任务,而无需借助外部程序(实现使用策略的实用程序,通常与驱动程序本身一起分发)。
\n- 程序员可以在驱动程序代码上运行传统的调试器,而无需通过扭曲来调试正在运行的内核。
\n- 如果用户空间驱动程序挂起,您可以简单地终止它。驱动程序的问题不太可能导致整个系统挂起,除非受控制的硬件确实出现异常。
\n- 与内核内存不同,用户内存是可交换的。具有巨大驱动程序的不常用设备\xe2\x80\x99不会占用其他程序可能\n使用的RAM,除非它实际在使用时。
\n- 设计良好的驱动程序仍然可以像内核空间驱动程序一样允许并发访问设备。
\n- 如果您必须编写闭源驱动程序,则用户空间选项可以让您更轻松地避免不明确的许可情况以及更改内核接口时出现的问题。
\n