WASAPI的全称是Windows Audio Session API(Windows音频会话API),是从
Windows Vista之后引入的
UAA(Universal Audio Architecture)音频架构所属的
API。
定义
WASAPI在Windows Vista、
Windows 7、
Windows Server 2008 R2系统中所使用。WASAPI允许传输未经修改的
比特流到音频设备,从而避开SRC(Sample Rate Conversion,取样率转换器)的干扰。
对于
Windows XP来说,与WASAPI类似的通道为
ASIO。
来历
大约在
Windows 98/ME末期,使用电脑播放
DVD时的AC3与DTS数字讯号已经可以从声卡上的数字同轴/
光纤输出,不会有被SRC(Sample Rate Conversion,取样率转换器)干扰的问题,但到了
Windows 2000时代却反而送不出去,直到Windows 2000 SP2后才解决这个问题,至此声卡更新
驱动程序后就可以搭配播放软体将
AC3或
DTS数字讯号输出。不过要注意的是,这个格式是48kHz 16bit,对于音乐CD所使用的44.1kHz 16bit,所以其中必须有一个
转换过程,但只有一些专业声卡可以做到不经过转换即可传输。声卡市场萎缩,
集成声卡大行其道,数字输出也几乎都是标准配备,可是要能做到原封不动输出44.1kHz 16bit的数字讯号,还是有困难,于是有些人想的是将声音讯号通过良好的算法进行up-sampling后再来送出 (即Foobar2000+PPHS/SSRC的方案),也
拉高声卡的数字输出标准到24bit 96kHz,这个方法虽然不能原汁原味输出44.1kHz 16bit的数字信号,但起码我们可以选择更好的up-sampling算法而避开SRC。
WASAPI是
微软从Vista时代提出的新的音频架构UAA里的API(
应用程序接口),它可以使用户不必去购买昂贵的专业声卡就能获得完美的未经SRC干扰过的不同
采样率和精度的数字音频输出。事实上我们除了能够通过WASAPI输出未经污染的44.1kHz 16bit的CD数字信号,我们还可以无损输出其他采样率和精度的
音频信号,甚至包括
蓝光碟内带的
LPCM多声道信号。接下来我们就来看看这个全新的UAA音频架构以及WASAPI。
关于新音频架构UAA
在过去,声卡厂商例如Creative、
Realtek等,为了让使用者透过自家编写的
控制台来进行各方面关于音频设备的设定,所以编写
驱动程序时,必须在Kernel Mode(内核模式)这个层级撰写相当多的代码来提供调用,使得使用者的操作设定能够直达硬件层。然而这对于系统的
稳定度是一个很不好的影响,稍微有一点点意外状况,会因为这些功能跑在Kernel Mode而导致系统死机,所以这也造成Microsoft决定在
Windows Server 2003上是预设关闭音频功能,想要使用音频功能必须自行到服务器设定里面去启用。
而这个问题在 Vista 时代有所改善了。Microsoft要求所有音频设备的厂商必须遵循UAA的架构来开发驱动程式,也为了配合UAA架构,Vista可以说是整个翻新了音讯
处理流程,许多原本需要写在Kernel Mode的声卡功能,需要改写到User Mode(用户模式)去,进而增加了系统稳定度。
UAA的架构如词条图片所示。
从图1中我们可以看出,Windows Vista的音效架构起了大幅度的变化,主要的Kernel Mode只剩下音效驱动的部分,而过去微软所制定出来的MME以及DirectSound API便不再直接起作用,取而代之是以WASAPI(Windows Audio Session API)来模拟这些旧有的API。
设计思路与原理
WASAPI采用了以“Session”为概念的思路,当不同的
应用程序调用WASAPI,它们的需求会被各自独立成不同的Session进行音讯处理,
处理过程会经过多个不同功能的APO(Audio Processing Objects,音频处理对象),这些APO主要用来处理音量增益、
格式转换及混音等功能,但并不包括SRC的动作,如上文所述,所以可以保持音频不因转换而造成失真。
在WASAPI中,通过2条路径来访问Kernal Mode(
内核模式):
1. Shared Mode(共享模式)
如上文所述,WAS
API这个新的API是以Session为概念,当不同的
应用程式调用WASAPI,它们的需求会被各自独立成不同的Session进行音讯处理。从词条图片中的设计图里可以发现,每一个应用程式都有一个入口,然后在Audio Engine内,经过Microsoft的APO(Audio Processing Object),再经过第三方厂商编写的sAPO(System Effects Audio Processing Object),声音讯号经一连串的处理,再进入Device Pipe阶段,这里要进行混音操作。有软件混音动作,就可能会经过SRC,也可能产生其他人耳不易发现但数据上确实有变化的操作,再加上声音讯号还要经过APO与sAPO等的调整 (例如低音增益、
环绕音效等功能),所以声音讯号要经过层层关卡,不但传递路径长,也无法保证资料的原始性。而音频流程处理的改变,最明显的当属每个应用程式有自己的音量控制,这在Windows XP/2003以前的操作系统,是完全没有见过的操作方式。
2. Exclusive Mode(独占模式)
也许您已经注意到,从
Windows Vista开始,
音频设备中有一个「允许应用程序独占控制该设备」的设置,这到底是做什么用的呢?这个「允许应用程序独占控制该设备」就是上面
UAA音频架构说明图中的Exclusive Mode(独占模式)。应用程式在一般情况下都是走Shared Mode(共享模式)那条路径,这个路径被称作通道,根据上面关于共享模式的介绍,所有的声音讯号都会转送至Audio Engine(音效引擎)部分,使得或多或少被改变了原始内容。而当应用程序发出使用独占模式的需求后,系统会切断共享模式这一条路径,声音讯号就会
直接送达Kernel Mode最后到达底层的音频设备后输出,音频设备在此时也会完全100%配合独占模式送来的
音频格式进行处理。
通过以上的设计我们知道,从Vista开始,我们有一个很明确的通道可以来让声卡直接处理最原始的数字讯号,不会再经过诸如SRC或其他转换后造成的讯号失真了,也能保证声卡不论在
数字输出还是模拟输出上,都能直接用原始
音频信号来处理,而不是使用操作系统层层加料(即Shared Mode下)后的污染信号,这个也就是音乐爱好者和
电影爱好者常挂在嘴边的bit-exact或者bit-perfect了。
功能
在Windows Vista和Windows 7中,您可以使用WASAPI通道欣赏音乐,从而避开系统
音染,避免SRC造成的失真。
在Windows XP中,因为并没有引入UAA,所以并不存在WASAPI,但您仍然可以通过之前提到的
ASIO来欣赏
高保真音乐,详细内容请参见词条ASIO。
注意事项
当使用WAS
API + 独占模式 输出时,您会发现其他所有的系统音效都听不到了。这个自然是因为独占了
输出设备而导致其他声音信号无法输出。
除此之外您也无法从系统音量那边调整音量大小,这是正常的,请参考上面的
UAA架构图,因为已经跳过右边的Audio Engine,此处包括了音量控制与
合成器,因此跳过此处后,您调整系统音量大小(相当于您在调整Audio Engine)当然是没有任何作用的。而且,为了您音质的纯净,也不适宜调整播放软件上的音量控制,应该保持在最大声处,因为一旦调整音量,就是将
数字信号用某些算法降低音量后再输出,品质多少会受到影响,对于要外接
DAC/AVR的玩家来说,也等于是因为调整音量而导致输出的不是原始信号。