写点什么

Windows 音频引擎架构汇总

作者:grolier
  • 2021 年 11 月 18 日
  • 本文字数:4055 字

    阅读完需:约 13 分钟

Windows 操作系统在经历 Win3.x、Win95、Win98、WinMe、WinXP、Vista、Win7、Win8、Win10 的近 30 年中,其相关的技术框架也在不断地演进。本文汇总整理了不同 Windows 版本的对应的音频引擎架构和相关的 API 的演进过程,以方便有需要的同学查阅。内容来源网络搜到的文章,以及 MSDN 里的介绍。

专有词汇

首先看一下这个领域常见的名字或缩写的都是什么东西:(http://blog.sina.com.cn/s/blog_751a81520102y7cy.html


MME(WaveIn/WaveOut)

MME 是最常见的 Windows 音频 API,全称为 MutiMedia Extensions,即多媒体扩展技术。它历史悠久,被 Win 98, Win ME, Win 2K and Win XP 支持,兼容性好,市面上基本所有设备都能良好支持。它属于高级的 API,并不直接和硬件交流,需要通过层层接口才能访问音频硬件,这也为它带来了高延迟。虽说这种延迟在回放音频的时候并不会造成音质的劣化,但对音频的处理和录制却有着较大的负面影响。

MME 使用 waveIn****/waveOut****系列 API 来完成对音频的处理。程序启动后用 waveIn****系列函数打开声卡输入功能,同时将缓冲区设定到足够小的值,然后开始将音频数据录制到设定的缓冲区,当缓冲区满后再将缓冲区(WAVHDR)直接加入到 waveOut****系列函数的输出队列中即可。此方法实现较简单,缺点是 MME 为高级 API,因此在整个过程中需要走过很多系统处理阶段,导致延迟较大。若缓冲区太小会导致声音断断续续。一般最小延迟可到 120 毫秒左右。

WaveOut 是微软最早提出的音频流输出方式,所以它的兼容性也就好,几乎所有的微软操作系统和声卡都支持;但它无法支持“混和多重音频流”的功能,没有使用任何的硬件加速,所有的混音动作都是用软件来执行的。


DirectSound(DS)

Windows95 发布后,微软发现游戏商还是乐意用 DOS 作为游戏平台,原因是游戏开发商发现 Windows95 并不适合执行视频和音频任务,因为 WinAPI32 包含的多媒体函数响应太慢了。微软于是推出了著名的 DirectX,DirectX 是一套视频音频 API 以及视频音频的 DSP(效果器)API。DirectSound 是其中的一部分,DirectSound 有 2D/3D 之分,DirectSound 有效果器函数,因此在输出的时候还可以加入回声等效果,用来仿真真实的声效环境。 DirectSound 主要为游戏提供服务,在一些播放器以及音频编辑器上,DirectSound 也被作为实时效果 API 使用。DirectSound 注重输出,输入方面并没有特色。只要硬件支持,DirectSound 能够明显加速输出响应。Windows 的音频输出响应速度提高到了一个新的档次。除了古老的某些声卡之外,几乎所有声卡都支持 DirectSound,至少支持 DirectSound 2D。

2006 年 11 月,微软发布 Windows Vista,Vista 出人意料的放弃了对 DirectSound 3D 硬件层(HAL)的支持,也就是说,那些支持 DirectSound 3D 硬件加速的声卡,通通失去了加速能力。最新发布的 Windows 7 继承了 Vista 的这个特性,DirectSound 3D 硬件加速退出历史舞台。

DirectX Sound 侧重于音频输出,能直接访问硬件,响应速度得到了极大的提升。设置 DirectSound 的工作模式为最高级别,一般最小延迟可到 60 毫秒左右。


WDM

WDM 是 Windows Driver Module 的缩写,拥有低延迟、支持多个音频流等特性。这是 Windows 98 SE/ME/2000 的一个新特征,WDM 驱动推出后,人们发现以前不支持多音频流的声卡都能播放多个音频流了。WDM 也可以算是一套 API,通讯的对象是驱动程序而不是普通的应用程序,只要驱动支持 WDM,会增加不少功能,例如通用的软波表等。在输入输出方面,WDM 比 MultiMedia Extensions 和 DirectSound 都要好点,现在几乎所有没有被淘汰的声卡都支持 WDM。WDM 可以让声卡的延时大大降低,某些时候甚至可以媲美 ASIO,在一些专业的音频编辑创作软件中,已经对 WDM 提供了支持。

MME 延迟高,而 Direct Sound 并非为专业音频设计,WDM 的出现很好地弥补了这些缺点。WDM 直接和音频芯片的驱动程序交流,减少了大量中间环节,把延迟降低到一个新的层次,目前不少专业音频软件都提供了 WDM 接口。

所谓 WDM 技术就是应用程序直接调用底层系统服务。总流程也是先接受一个缓冲区的数据,然后输出。在 WinXP 下,音频 WDM 也就是常说的 Kernel Streaming(内核音频流)。此方案的优势在于可将延迟做到极低的状态,一般最小延迟可以到 1 毫秒~10 毫秒,且在一定情况下可以使用非分页内存、直接硬件 IRP 和 RT,独占声卡的所有资源。


WaveRT(Wave Real-Time 实时波形)

WaveRT 是 vista 为专业音频软件设计的全新低延迟、实时的驱动,用来替代 ASIO 和 XP 以前的 WDM 和 DirectKS 驱动。WaveRT 可以直接与音频接口的缓冲区和采样位置计数器通讯,所以说使用 WaveRT 驱动的音频软件就可以按照最直接的方式与音频接口进行通讯,而不必像 ASIO 那样中间再次进行用户模式到核心模式的转换。所以理论上说 WaveRT 会比 ASIO 和 WDM 都要更高效。WaveRT 需要宿主、插件、硬件三方均支持才有效,否则会回到 WDM 的状态。


Kernel Streaming(KS)

Kernel Streaming 中文意思就是内核流,这是一种直接访问底层数据的方式,它可以绕开系统的混音器(Windows kernel mixer),直接与声卡通讯,这使得输出效率得到提高,输出延时降低。Kernel Streaming 不经过 Kmixer,直接对音频数据进行内核模式(kernel-mode)处理,这样一来,我们就可以听到原汁原味的声音。

但 Kernel Streaming 也有其局限性,首先使用这个 API 会直接霸占音频硬件,你听歌的时候就没法听到 QQ 响;其次这个 API 没有音频输入功能,也没法使用麦克风。

需要注意的是由于 Vista 和 Win7 开始弃用了 kmixer 和依赖 dma 的 audio IO,所以 Kernel streaming 不适用于 Vista 和 Win7。


UAA(WASAPI)

UAA 是最新的 Windows 音频架构,在 Vista 推出之时面世。UAA 全称为 Universal Audio Architecture,即通用音频架构,其中用于管理音频对话的 API 为 WASAPI(Windows Audio Session API)。WASAPI 可以对每组音频对话单独处理,这显得意义重大。

举个例子,使用 WASAPI 的时候,如果正在用 44.1kHz 的采样率播放音乐,但此时音频采样率为 48kHz 的 QQ 又响了,就不必以混响解决,不会产生采样率转换(SRC)劣化音质的情况。事实上,WASAPI 这个音频 API 是很多音乐发烧友的标配。

WASAPI (Windows Audio Session API) 是从 Windows Vista 开始加入的 UAA(Universal Audio Architecture)音频架构所属的 API。WASAPI 允许传输未经修改的比特流到音频设备,从而避开 SRC(Sample Rate Conversion,取样率转换器)的干扰。对于 Windows XP 来说,与 WASAPI 类似的通道就是上面所说的 Kernel streaming,WASAPI 只能使用在 Vista 和 Win7 以上的系统。

微软宣称,vista/7 已经开始弃用了 kmixer 和依赖 dma 的 audio IO,而开发了他们所说的 WaveRT (Wave RealTime),他们的 WASAPI、MMCSS 等就是使用 WaveRT 做核心,而 WaveRT 都有一个属于自己的 mixer,但只要开动独占摸式就可以 bypass 这个 mixer,mute 掉所有其他程序的声音,MMCSS 是让你提高 audio 出入 IO 到最高时脉优先权,微软想做的其实就是使用实时 clock timer 控制 audio 流,而不经 dma,直接和 UAA audio devices hareware 沟通,甚至让 sound card or audio interface 的 hareware clock 直接来控制 audio data,这样的作用就是想做到和 ASIO 很相近,就算是 WASAPI 共享模式,都已经没有 SRC 了,而是在控制台中可以自由让你设定共享混音后的共同目的 sampling rate, bit size 及 channels,所以的可以保留原来的 44100Hz 讯号,不会再被 SRC,而且现在所有 intel motherboard 或 intel chips 都已经有了 HPET (High Precision Event Timer),可以令 video 和 audio 的处理更实时精确处理高 sampling rates,低 bus latency,让每秒钟内可以回应资料流事件的次数大幅增加,但不知 AMD 的有没有。


音频引擎架构


XP 时代的 Audio 架构图





Win7 的音频架构



下图显示了简化的布局的音频引擎的内部结构



Windows 8 的音频引擎架构



Windows 10 音频引擎架构



Audio Processing Objects Architecture

Stream Effect (SFX)

A stream effect APO has an instance of the effect for every stream. Stream effects are before the mix (render) or after the tee (capture) for a given mode and can be used for changing channel count before the mixer. Stream effects are not used for raw streams.

Some versions of Windows, as an optimization, do not load SFX or MFX APOs in RAW mode.

  • Windows 8.1 does not load RAW SFX or RAW MFX

  • Windows 10 loads RAW MFX but not RAW SFX

Mode Effect (MFX)

Mode effects (MFX) are applied to all streams that are mapped to the same mode. Mode effects are applied after the mix (render) or before the tee (capture) for a given mode, but before the mix (render) or after the tee (capture) of all modes. Any scenario specific effect or effect that doesn’t need the specifics of the stream effect should be placed here. It is more power efficient to use a mode effect since there is one instance for multiple streams that share the same characteristics like periodicity and format.

Endpoint Effect (EFX)

Endpoint Effect (EFX) are applied to all streams that use the same endpoint. An endpoint effect is always applied, even to raw streams. That is, it is after the mix (render) or before the tee (capture) of all modes. The endpoint effects should be used with care and when in doubt an effect should be place in the Mode area. Some effects that should be placed in the endpoint area are speaker protection and speaker compensation.

This diagram shows the possible locations for stream (SFX), mode (MFX) and endpoint (EFX) effects for Windows 10.



Audio Signal Processing Modes

https://docs.microsoft.com/en-us/windows-hardware/drivers/audio/audio-signal-processing-modes



新的 Win10 Componentized 音频驱动组件 (DCHU)

(https://docs.microsoft.com/en-us/windows-hardware/drivers/develop/getting-started-with-universal-drivers)



DirectShow 应用框架



MediaFoundation 应用框架



发布于: 刚刚阅读数: 7
用户头像

grolier

关注

良逸 2021.11.17 加入

还未添加个人简介

评论

发布
暂无评论
Windows音频引擎架构汇总