Mac OS X虚拟音频驱动程序

UpL*_*1nK 26 audio macos kernel driver

我想创建一个虚拟音频设备,从默认输出(输出IOAudioStream)获取音频数据,并将其转换为输入IOAudioStream.

我查看了我能找到的大多数示例,但是它们只实现了一个功能,可以将输出IOAudioStream最多复制到输入端.这意味着如果选择音频设备作为输出,它仅将音频转换为输入流.

这应该是可能的,因为ScreenFlow允许通过安装创建虚拟驱动程序的kext来记录计算机音频.

如何从默认输出访问音频数据并将其发送到我的虚拟驱动程序?

Big*_*ack 48

看一下开源WavTap,它是开源SoundFlower虚拟声卡驱动程序的简化分支.这是一个.kext,我相信它实质上是你想要的.

作为参考,以下是一些流行的商业闭源选项如何工作:
Rogue Amoeba的Audio Hijack Pro -
通过基于开源SoundFlower .kext的代码捕获系统
音频 - 通过替换"补丁"框架来捕获应用程序的音频启动应用程序时正常的CoreAudio.framework - 在
来自Unsanity的haxie"Application Enhancer"(APE)的帮助下捕获已经运行的应用程序的音频

这些功能被标记为"Instant On"功能(InstantOn.kext).

Ambrosia Software的WireTap Studio
通过内部开发的.kext来捕获系统音频和应用程序音频

Telestream的ScreenFlow
通过内部开发的.kext来捕获系统音频.(版本2.x使用varaudio.kext;版本3.x使用TelestreamAudio.kext)

Macsome的Audio Recorder
-Unknown方法

Araelium Group的Screenflick
使用SoundFlower .kext捕获系统音频

更新#1
在阅读作者的评论之后,基本目标似乎是能够捕获系统声音而不将虚拟音频驱动程序发布为设备(将出现在系统首选项列表中)并且更改当前的默认输出设备(或者至少是设备已经改变的外观).

SoundFlower:安装时将声音设备添加到列表中
WavTap:安装时将声音设备添加到列表中; 启动WavTap应用程序时自动选择设备; 应用程序关闭时自动取消选择设备并重新选择以前的设备
Audio Hijack Pro:仅在选择默认系统声音的音频捕获时添加声音设备; 不再选择音频捕获时删除声音设备并重新选择以前的设备
WireTap Studio: Unknown
ScreenFlow:捕获系统声音而不更改当前的默认输出设备,也不将虚拟音频驱动程序发布为设备

更新#2
CoreAudio Apple工程师Jeff Moore引用WireTap和Audio Hijack Pro等应用程序的话:
"系统上没有API可以为您提供任何特定应用程序或整个组合的输出系统不支持硬件...... [捕获系统声音]并且那些人必须聪明.没有什么能阻止你做同样的事情,除非你愿意弄脏自己.事实是,Mac OS X的音频系统首先是针对性能而设计的.这使我们的设计难以支持您想要的功能而不会造成性能损失.因此,我们选择了更好的性能,代价是无法实现提供此功能."

如果您想了解有关该主题的更多信息,请查看CoreAudio API邮件列表中的这些主题:
"WireTap,CoreAudio的API,系统捕获和kexts ......"
"关于捕获由软件播放的音频的另一个问题"
"捕获当前使用CoreAudio在Mac上播放的音频"
"'音频劫持'"
"监听系统音频输出,如线控"
"捕获音频输出到文件"
"镜像音频输出"
"录制系统音频"

相关SO问题:
使用无代码kext隐藏音频设备

长话短说,你不太可能找到苹果公司实现这一目标的例子,你也不可能找到能够实现这一目标的开源代码,除非有人感到非常慷慨.它看起来太有价值了.


Big*_*ack 8

经过进一步研究,我提出了一些理论技巧,可以帮助您实现目标:

  1. 与Prosoft Engineering的Hear产品类似,您可以创建HAL插件(用户模式虚拟驱动程序)而不是.kext(内核模式虚拟驱动程序).Apple有一个名为"SampleHardwarePlugIn"的示例HAL插件,而PulseAudio也有一个.但是,根据他的方法,我认为您无法访问预混合系统声音流.您必须从各种应用程序(必须使用CoreAudio播放声音)收集所有流并将它们混合在一起以进行伪系统声音捕获.

  2. 创建一个隐藏[1] [2]用户交互的虚拟音频设备.当用户希望捕获默认声音时,以编程方式创建包含隐藏虚拟设备和当前默认声音设备的聚合设备.暂时将此聚合设备设置为默认输出.通过这种方式,您可以捕获默认声音并听到它.
    附注:如果Mac OS X允许将隐藏设备也设置为默认输出设备,那么系统偏好设备将显示为所选设备?如果它将辅助输出设备显示为已选中,那么您会添加一些暗示,即没有任何更改.