繁体   English   中英

macOS 上的内核与用户空间音频设备驱动程序

[英]kernel vs user-space audio device driver on macOS

我需要为系统音频捕获(基于 Soundflower)开发音频设备驱动程序。
但很快就出现了一个问题,似乎 IOAudioFamily 堆栈在 OSX 10.10 及更高版本中已被弃用。
查看IOAudioDeviceIOAudioEngine头文件,似乎苹果现在建议使用在用户空间中运行的<CoreAudio/AudioServerPlugIn.h> API。 但是我找不到有关此用户空间设备驱动程序主题的大量信息。 似乎唯一的资源是来自https://developer.apple.com/library/prerelease/content/samplecode/AudioDriverExamples/Introduction/Intro.html的 Apple 提供的示例设备
通过查看示例,我发现开发用户空间驱动程序而不是基于 I/O Kit 内核的驱动程序要困难得多,工作也多得多。
那么问题来了,在用户空间而不是内核空间开发设备驱动程序的动机是什么?

“SimpleAudioDriver”示例的名称有些错误。 它展示了 API 的几乎所有功能。 如果您确实需要使用这些功能,这可以作为参考。 它的结构也可能比必要的复杂一些。

对于虚拟设备,NullAudioDriver 可能是一个更好的基础,并且更容易理解(单个源文件,如果我没记错的话)。 SimpleAudioDriver 在处理诸如热插拔、相同设备的多个实例等问题时更有用。

IOAudioEngine如您所说已被弃用,并且自 OS X 10.10 以来已被弃用。 预计它最终会消失,所以如果你用它构建你的驱动程序,你可能需要比创建一个基于 Core Audio Server Plugin 的驱动程序更早地重写它。

无论哪种方式,测试和调试音频驱动程序都很尴尬(因为对时间很敏感),但我想说用户空间的驱动程序处理起来不那么令人沮丧。 您仍然希望在与您的开发 Mac 不同的机器上进行测试,因为如果 coreaudiod 崩溃或挂起,应用程序通常也会开始锁定,因此能够通过 ssh 进入、删除您的插件并杀死 coreaudiod 很方便。 当然比必须重新启动更快的周转。

(FWIW,我已经发布了内核和用户空间 OS X 音频驱动程序,我花了很多时间在 kexts 上。)

有一本关于这个主题的好书,可在此处免费在线获取:

http://free-electrons.com/doc/books/ldd3.pdf

有关为什么需要用户空间驱动程序的摘要,请参见第 37 页,为方便起见,复制到此处:

用户空间驱动程序的优点是:

  • 可以链接完整的 C 库。驱动程序可以执行许多奇特的任务,而无需求助于外部程序(实现使用策略的实用程序通常与驱动程序本身一起分发)。
  • 程序员可以在驱动程序代码上运行传统的调试器,而无需通过扭曲来调试正在运行的内核。
  • 如果用户空间驱动程序挂起,您可以简单地杀死它。 驱动程序的问题不太可能挂起整个系统,除非被控制的硬件确实行为不端。
  • 与内核内存不同,用户内存是可交换的。 一个不经常使用的带有巨大驱动程序的设备不会占用其他程序可能使用的 RAM,除非它在实际使用中。
  • 设计良好的驱动程序仍然可以像内核空间驱动程序一样允许并发访问设备。
  • 如果您必须编写闭源驱动程序,用户空间选项可以让您更轻松地避免不明确的许可情况和更改内核接口的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM