Windows 7/Vista下最佳音频输出方式-WASAPI

Posted on October 7, 2010

5


Windows 7/Vista下到底该怎么做,才能用最佳品质聆听音乐呢?这取决于如何将原汁原味的数字音频讯号交给声卡后数字输出到DAC/AVR,中间尽可能不要经过其他任何多余的步骤。

在开始之前,不免要扯一下过去的历史。大约在Windows 98/ME末期,使用电脑播放DVD时的AC3与DTS数字讯号已经可以从声卡上的数字同轴/光纤输出,不会有被SRC (Sample Rate Conversion,取样率转换器)干扰的问题,但到了Windows 2000时代却反而送不出去,直到Windows 2000 SP2后才解决这个问题,至此声卡更新驱动程序后就可以搭配播放软体将AC3或DTS数字讯号输出。不过要注意的是,这个格式是48kHz 16bit,对于音乐CD所使用的44.1kHz 16bit,似乎没有一个保证能不经过SRC就输出的方法,仅有一些专业用途的声卡可以做到。近年来,声卡市场萎缩,主板onboard声卡当道,数字输出也几乎都是标准配备,可是要能做到原封不动输出44.1kHz 16bit的数字讯号,还是有困难,于是有些人想的是将声音讯号通过良好的算法进行up-sampling后再来送出 (即Foobar2000+PPHS/SSRC的方案),也拉高声卡的数字输出标准到24bit 96kHz,这个方法虽然不能原汁原味输出44.1kHz 16bit的数字信号,但起码我们可以选择更好的up-sampling算法而避开SRC。

今天我要介绍的主角WASAPI是微软从Vista时代提出的新的音频架构UAA里的应用程序接口,它可以使用户不必去购买昂贵的专业声卡就能获得完美的未经SRC干扰过的不同采样率和精度的数字音频输出。事实上我们除了能够通过WASAPI输出未经污染的44.1kHz 16bit的CD数字信号,我们还可以无损输出其他采样率和精度的音频信号,甚至包括蓝光碟内带的LPCM多声道信号。接下来我们就来看看这个全新的UAA音频架构以及WASAPI。

WASAPI简介

过去声卡厂商例如Creative、Realtek等,为了让使用者透过自家编写的控制台来进行各方面关于音频设备的设定,所以编写驱动程序时,必须在Kernel Mode这个层级撰写相当多的代码来提供调用,使得使用者的操作设定能够直达硬件层。然而这对于系统的稳定度是一个很不好的影响,稍微有一点点意外状况,会因为这些功能跑在Kernel Mode而导致系统死机,所以这也造成Microsoft决定在Windows Server 2003上是预设关闭音频功能,想要使用音频功能必须自行到服务器设定里面去启用。

而这个问题在 Vista 时代有所改善了。Microsoft要求所有音频设备的厂商必须遵循UAA的架构来开发驱动程式,也为了配合UAA架构,Vista可以说是整个翻新了音讯处理流程,许多原本需要写在Kernel Mode的声卡功能,现在需要改写到User Mode去,进而增加了系统稳定度。下图是UAA架构的基本框架:untitled1

由上图我们可以发现,Vista的音效架构起了大幅度的变化,主要的Kernel Mode只剩下音效驱动的部分,而过去微软所制定出来的MME以及DirectSound API便不再直接起作用,取而代之是以WASAPI(Windows Audio Session API)来模拟这些旧有的API。WASAPI可以通过2条路径访问Kernal Mode:

1. Shared Mode

WASAPI这个新的API是以Session为概念,当不同的应用程式调用WASAPI,它们的需求会被各自独立成不同的Session进行音讯处理。从下面的设计图可以发现,每一个应用程式都有一个入口,然后在Audio Engine内,经过Microsoft的APO(Audio Processing Object),再经过第三方厂商编写的sAPO(System Effects Audio Processing Object),声音讯号经一连串的处理,再进入Device Pipe阶段,这里要进行混音操作。有软件混音动作,就可能会经过SRC,也可能产生其他人耳不易发现但数据上确实有变化的操作,再加上声音讯号还要经过APO与sAPO等的调整 (例如低音增益、环绕音效等功能),所以声音讯号要经过层层关卡,不但传递路径长,也无法保证资料的原始性。bb981540sysfxapo_custom-detailsen-usmsdn10

而音频流程处理的改变,最明显的当属每个应用程式有自己的音量控制(见下图),这在Windows XP/2003以前的操作系统,是完全没有见过的操作方式。

untitled

2. Exclusive Mode

可能很多人有注意到,从Vista开始,音频设备中有一个「允许应用程序独占控制该设备」的设置(见下图),但这到底是做什么用的?

Realtek Digital Output 属性_2010-09-23_22-25-55

这个「允许应用程序独占控制该设备」就是上面UAA音频架构说明图中的Exclusive Mode。应用程式在一般情况下都是走Shared Mode那条路径,根据上面关于Shared Mode的介绍,所有的声音讯号都会转送Audio Engine部分,使得或多或少被改变了原始内容。而当应用程序发出使用Exclusive Mode的需求后,系统会切断Shared Mode这一条路径,声音讯号就会直接送达Kernel Mode最后到达底层的音频设备后输出,音频设备在此时也会完全100%配合Exclusive Mode送来的音频格式进行处理。

通过以上的设计我们知道从Vista开始,我们有一个很明确的通道可以来让声卡直接处理最原始的数字讯号,不会再经过诸如SRC或其他转换后造成的讯号失真了,也能保证声卡不论在数字输出还是模拟输出上,都能直接用原始音频信号来处理,而不是使用操作系统层层加料 (即Shared Mode下) 后的污染讯号,这个也就是音乐爱好者和电影爱好者常挂在嘴边的bit-exact或者bit-perfect了。接下来我们来看看如何用我们常用的软件来实现WASAPI无损输出。

Foobar2000设置WASAPI输出

在Foobar2000中设置WASAPI非常简单,我们只需要下载一个叫做foo_out_wasapi的插件。下载下来后接压缩然后把foo_out_wasapi.dll这个文件放在Foobar2000安装目录下的components文件夹下即可。接下来启动Foobar2000然后选择File –> Preference –>Output,顺利的话应该会看到有2个WASAPI开头的输出设备,分别对应数字输出(HDMI或者光纤)和模拟输出(见下图):

foobar2000 v1.0.2.1 - Preferences_2010-10-07_21-50-24

由于不同的声卡在硬件上的设计因素,此法用在模拟输出上不一定能够让您的音乐品质更好,原因是使用此法将讯号送达音效卡后,虽然能保证数字讯号的原始性,但接着声卡在输出到模拟线路上时,可能会经过声卡本身的SRC将44.1kHz转换为48kHz,造成讯号失真,因此这个作法仅能保证当您用数字输出外接 DAC/AVR时会有最原汁原味的体验效果。

ReClock设置WASAPI输出

如果要无损输出蓝光电影中LPCM音轨,我们需要首先安装ReClock这个软件,然后确认我们的播放器使用ReClock作为音频渲染器,这样解码过后的LPCM会交给ReClock输出。接下来按照如下图片设置ReClock :

b1187fe817

然后我们播放一部带有LPCM音轨的电影,确认ReClock工作后打开在线设置,选上下图中红框的选项:

42de24ff98

这个选项是告诉ReClock不要用音频的时钟作为标准时钟(ReClock其实主要是一个是音频视频同步的工具,所以它可能会改变输入音频的速率,具体介绍请大家去官方网站学习)。

其他注意事项

 

当使用WASAPI + Exclusive Mode输出时,你会发现其他所有的系统音效都听不到了。这个自然是因为独占了输出设备而导致其他声音信号无法输出。

除此之外也无法从系统音量那边调整音量大小,这是正常的,请参考上面的UAA架构图,因为已经跳过右边的Audio Engine,此处包括了volume control与mixer,因此跳过此处后,你调整系统音量大小 (即在调整Audio Engine) 当然是没有任何作用的。而且,为了您音质的纯净,也不适宜调整播放软件上的音量控制,应该保持在最大声处,因为一旦调整音量,就是将数字信号用某些算法降低音量后再输出,品质多少会受到影响,对于要外接 DAC/AVR的玩家来说,也等于是因为调整音量而导致输出的不是原始讯号。

Posted in: HTPC