WASAPI is one of several native audio libraries in Windows. PortAudio actually supports five of them: Windows Multimedia (MME), the first built-in audio API for Windows 3.1x; DirectSound, the audio subsystem of DirectX for Windows 95; Windows Driver Model / Kernel Streaming (WDM/KS), the improved audio system for Windows 98; ASIO, a third-party API developed by Steinberg to make pro audio possible on Windows; and finally, Windows Audio Session API (WASAPI), introduced in Windows Vista to bring a modern audio API to Windows.
MME -> DIRECTSOUND -> WDM ->WASAPI 很多人喜欢用DIRECT SOURND, 其实DIRECT SOUND也不是什么好鸟,只不过可以兼容WINDOWS XP,网上又有很多学习资源而已,其实这些学习资源也很乱,各有各的问题。
所以,目前音频播放,我用的是SDL这个库,简单,几行代码就能播出声音了。
WASAPI
WASAPI的全称是Windows Audio Session API(Windows音频会话API),是从Windows Vista之后引入的UAA(Universal Audio Architecture)音频架构所属的API。
Windows Audio Session API
简介
编辑
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的架构如词条图片所示。
UAA架构框架图
从图中我们可以看出,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(共享模式)
如上文所述,WASAPI这个新的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。
注意事项
当使用WASAPI+ 独占模式 输出时,您会发现其他所有的系统音效都听不到了。这个自然是因为独占了输出设备而导致其他声音信号无法输出。
除此之外您也无法从系统音量那边调整音量大小,这是正常的,请参考上面的UAA架构图,因为已经跳过右边的Audio Engine,此处包括了音量控制与合成器,因此跳过此处后,您调整系统音量大小(相当于您在调整Audio Engine)当然是没有任何作用的。而且,为了您音质的纯净,也不适宜调整播放软件上的音量控制,应该保持在最大声处,因为一旦调整音量,就是将数字信号用某些算法降低音量后再输出,品质多少会受到影响,对于要外接 DAC/AVR的
loopback-recording
https://docs.microsoft.com/zh-cn/windows/win32/coreaudio/loopback-recording