我需要为系统音频捕获(基于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内核的工作要困难得多。
那么问题是什么应该激励在用户空间而不是内核空间中开发设备驱动程序?
答案 0 :(得分:3)
“SimpleAudioDriver”示例有点错误。它演示了API的几乎所有功能。如果您确实需要使用这些功能,这可以作为参考。它的结构也可能比必要的复杂一点。
对于虚拟设备,NullAudioDriver可能是一个更好的基础,并且更容易理解(单个源文件,如果我没记错的话)。 SimpleAudioDriver对于处理诸如热插拔,相同设备的多个实例等问题更有用。
如你所说, IOAudioEngine
已被弃用,并且自OS X 10.10以来就已弃用。期待它最终消失,所以如果你用它构建你的驱动程序,你可能需要比你创建一个Core Audio Server插件更快地重写它。
测试和调试音频驱动程序两种方式都很尴尬(由于时间敏感),但我认为用户空间的处理方式稍微不那么令人沮丧。您仍然希望在与开发Mac不同的机器上进行测试,因为如果coreaudiod崩溃或挂起,应用程序通常也会开始锁定,因此只需ssh,删除插件并杀死coreaudiod就很方便了。当然比不得不重新启动更快的周转时间。
(FWIW,我已经发布了内核和用户空间的OS X音频驱动程序,我花了很多时间在kexts上工作。)
答案 1 :(得分:0)
有一本关于这个主题的好书,可以在这里免费在线获取:
http://free-electrons.com/doc/books/ldd3.pdf
有关您可能需要用户空间驱动程序的原因的摘要,请参阅第37页,为方便起见,将其复制到此处:
用户空间驱动程序的优点是:
- 可以链接完整的C库。驱动程序可以执行许多奇特的任务,而无需借助外部程序(实用程序 实施通常分布的使用策略的程序 以及司机本身)。
- 程序员可以在驱动程序代码上运行传统的调试器,而无需通过扭曲来调试正在运行的内核。
- 如果用户空间驱动程序挂起,您可以直接杀死它。除非硬件,驱动程序的问题不太可能挂起整个系统 受到控制真的是行为不端。
- 与内核内存不同,用户内存是可交换的。具有巨大驱动程序的不经常使用的设备将不会占用其他程序可能的RAM 使用,除非它实际上在使用中。
- 精心设计的驱动程序仍然可以像内核空间驱动程序一样,允许并发访问设备。
- 如果您必须编写闭源驱动程序,则用户空间选项可以让您更轻松地避免模糊的许可情况和 更改内核接口的问题。