接下来我们谈音频输出API方面,音频输出API可以说是音质提升的关键,在这里和大家简单介绍下常见的音频输出API(这部分摘抄自乔大海先生的博客,根据自己所了解的信息有所增删)。
常见的音频API有MME、DS、WDM、KS、WASAPI、ASIO等。
MME(WaveIn/WaveOut)
MME是最常见的Windows音频API,全称为MutiMedia Extensions,即多媒体扩展技术。它历史悠久,兼容性好,市面上基本所有设备都能良好支持。它属于高级的API,并不直接和硬件交流,需要通过层层接口才能访问音频硬件,这也为它带来了高延迟。这种延迟在回放音频的时候可能造成音质的劣化,且对音频的处理和录制却有着较大的负面影响。
MME使用waveIn/waveOut系列API来完成对音频的处理。程序启动后用waveIn系列函数打开声卡输入功能,同时将缓冲区设定到足够小的值,然后开始将音频数据录制到设定的缓冲区,当缓冲区满后再将缓冲区(WAVHDR)直接加入到waveOut系列函数的输出队列中即可。此方法实现较简单,缺点是MME为高级API,因此在整个过程中需要走过很多系统处理阶段,导致延迟较大。若缓冲区太小会导致声音断断续续。一般最小延迟可到120毫秒左右。
WaveOut是微软最早提出的音频流输出方式,所以它的兼容性也就好,几乎所有的微软操作系统和声卡都支持;但它无法支持“混和多重音频流”的功能,没有使用任何的硬件加速,所有的混音动作都是用软件来执行的。
winamp中“输出”选项卡的“WaveOut”插件便是使用此api。
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毫秒左右。
winamp中的“输出”选项卡的“DirectSound输出”插件便是使用此api。
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 的有没有。
ASIO
ASIO的全称是“Audio Stream Input Output”,是由德国Steinberg公司所提出的一种音频技术规范,为音频API标准之一。ASIO的主要特点是低延迟和多轨多通道传输。ASIO完全摆脱了Windows操作系统对硬件的集中控制,它能实现在音频处理软件与硬件之间进行多通道传输的同时,将系统对音频流的响应时间降至最短。
Windows自有的MME驱动程式其延迟时间为200~500毫秒,DirectSound为50~100毫秒,Mac OS的Sound Manager则为20~50毫秒,使用ASIO的情况下,缓冲器依照设定的不同可至10毫秒以下,也有因环境较佳而到1毫秒以下的情况产生。 因此,在录音作业与音乐制作上,可达到实时处理的效果。
低延迟对声音录制和后期制作有着重大的意义,但是在声音回放上的效果却有争议。有的发烧友认为,ASIO的低延迟可以极大程度地减少音频Jitter(抖动),从而提高音质;但有另一种说法称ASIO对软硬件的环境要求都比较苛刻,如果音频驱动编写水平一般,很容易产生爆音、声音生冷等问题。
OpenAL
OpenAL是一个免费的跨平台的音频3D API,由Loki Software开发,但Loki Software没多久就倒闭了,自由软件社区接手进一步的开发,现在的实际主导者就是Creative。由于Vista放弃对DirectSound 3D硬件加速的支持,Creative也陷入尴尬境地,要让EAX继续发展下去,只能加强对OpenAL的支持。Creative希望在OpenAL的基础上重构EAX,要实现这一步并不难,但真正要广泛应用,还需游戏厂商的大力支持。时至今日,OpenAL的被支持力度仍旧比不上当年的DirectSound 3D,Creative要重现辉煌,尚需时日。但如果努力获得成功,可能获得极大的收益,因为OpenAL是唯一一个跨平台的API。并且需要注意的是,由于DirectSound在nt6中已经失去了3d音频加速能力,openal成为nt6系统中唯一一个能从底层支持3d音频加速的API,这也是很多游戏加入Opanal音效的原因。Foobar和winamp有openal输出插件。Winamp版本试用了遗憾的发现不支持24位音频流输出。
Xp-2003音频输出架构图:

Vista-win10音频输出架构图

openal音频输出架构图

我们看上面几个api图示,从技术分析和高保真的角度来讲,ASIO、Openal、Kernel Streaming(xp-2003系统)、WASAPI(vista-win10系列系统)由于可以直接访问底层硬件驱动,是更好的音乐输出API。然而可惜的是ASIO插件在winamp上一直不甚完善,会导致播放不了某些音频文件,因此个人不建议使用;openal输出插件在winamp上也有,但可惜的是不支持24位音频流输出,因此在24位声卡和音频文件普及的现在也并不适用。所以winamp最好的音质方案是在xp-2003系统下使用Kernel Streaming输出插件播放音频文件,在win7、win8、win10等vista以上系统使用wasapi输出插件播放音频文件。