刘品
学以致用---博主简介:专注语音、视频数字信号处理方面的研究以及算法在手机平台上面的移植和优化。涉及语音/音频编解码,语音增强,语音识别,语音音质客观评估,VOIP语音引擎 Qos算法模块和声音变速不变调和变调不变速等功能实现。熟悉ARM 各个系列的CPU,用ARMv4,ARMv5,ARMv6 and Cortex Neon 汇编优化相关算法代码,争取perforamance 最优。目前主要Windows mobile and Android platform上做相关speech/audio算法以及应用开发, HEVC 编解码器PC 和手机上的开发与应用。(交流Email:liupin.2008@gmail.com)

转自:http://www.rtrash.net/win7-under-ds-ks-asio-wasapi-output-compare.html

以下先利用图表做个最简单的比较

win7下DS、KS、ASIO、WASAPI输出比较

win7下DS、KS、ASIO、WASAPI输出比较

接下来主要介绍WASAPI的来历已经微软对声音处理的发展历程:

winxp 以前的windows 一直都是使用一般DMA 来处理声音, DMA = direct memory access, 即是一般harddisk, lan card, drives 等一切取存设备的IO 机制, i386 年代的电脑大多数都是使用PIO 来处理hdd data 出入, 即是hdd 所读所写入的任何data 都要直接经由cpu 所控制, 才能让ram 和hdd 互传data, 但这样做便会占用大量CPU 的loading, hdd volume 越大越快, 情况便越糟.
所以到了大概intel pentium mmx 的年代, drive controllers 便开始转用DMA, 让晶片能简单的控制或导向hdd/drives 直接能和ram 连接, 而不需要把传送内容资料全都要经过cpu 处理, 这样cpu 便可以完全免除对hdd 资料的负担, 即使由以前IDE/SCSI 到今天SATA 都是使用高效能的DMA, 但是DMA 的作法是要互动等待, 所有资料不只是以ram 作为buffer 中转站, 而且是base on ram clock timer 控制传送时机, 虽然节省电脑效能, 但相对于audio IO 来说, 这是既不稳定, 又慢又大latency, 很难还原原音的做法, 因为声音是一种需求时间性的一种能量, 有时间构成才有声音, 而且PCM 讯号是一种要求每一个sample 都要实时平均的到达, 才能保持原音
而DMA audio 所使用的就是一般人所说的kmixer

但是微软宣称, 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 的有没有
http://www1.uwants.com/viewthread.php?tid=8157140&page=1#pid116989187

about Wasapi by microsoft
http://msdn.microsoft.com/en-us/library/dd371455(VS.85).aspx

接下来介绍如何WIN7+FOOBAR获得完美音效,没有爆音,以原音源来输出:

注:来自dearhoney音效工作室

看了一些国内外的讨论文章,然后自己实做,确认了以下 的方式是可以保证输出16bit 44.1kHz 的数位讯号,完全原汁原味。

1. 播放软体请使用foobar2000,下载:http://www.foobar2000.org/?page=Download,然后安装起来。
2. 除此之外,请在上述同一页下载WASAPI output,解开来的foo_out_wasapi.dll 这个档案请放到foobar2000 安装目录的components 资料夹下。例如在本例中因为是安装在x64 环境,且一切按照系统预设,所以是放在C:\Program Files (x86)\foobar2000\components 这个路径下。
3. 启动foobar2000,然后到Files → Preferences 下调整Playback 下的Output 这个页面,顺利的话应该会看到有两个WASAPI 开头的音效装置。您如果使用数位输出/HDMI 输出,就选数位输出;如果你没有外接的解码设备,想要用HDAV 1.3 的类比输出,就选喇叭那一项:(下图中有三个WASAPI 装置,其中一个不是HDAV 1.3,那是主机板M3A78-EM 的HDMI 输出)

 

win7_foobar_wasapi

win7_foobar_wasapi

你会发现这样已经可以播放音乐,且有几个特性:

1. 不能从系统的音量控制台去调整声音大小了。
2. 其他所有系统音效都听不到了。
3. 如果您的设备够好,或您有金耳朵,将发现这样子经由您环绕扩大机解码出来的声音品质有更好了一点。

但这样如何确保是原汁原味的16bit 44.1kHz 数位讯号?我是这么验证的:我手边有一些wave 档,其本质是DTS 编码过的讯号,经由此法从foobar2000 播放出去,环绕扩大机立即亮起DTS 灯号,就是最好的证明。为什么?因为如果是一般的音乐档,亦即最终将是立体声 16bit 44.1kHz 的数位讯号,如果有经过SRC 势必会被改变内容,但人耳并不一定听得出来;然而我现在播放的是DTS 编码后的wave 档,如果被SRC 当成两声道的音乐来处理过,将会完全变成杂音后丢出去,但经过这样的设定后并没有听到杂音,而是正确的内容并且让环绕扩大机亮起DTS灯号,足见这样的设定已经完全摆脱SRC 及Windows 混音器的控制,顺利输出原汁原味的数位讯号了。

小结一下:

在我的本子上,只测试过DS和WASAPI,DS配合Y460的杜比音效效果不错;但是音高的时候会有破音,MS低音在太大,不好控制;加入wasapi后,输出的声音变的很细腻,高音通亮,但是低音没有DS那么低沉浑厚,但毕竟高音听不清楚不亮低音再好也不行。毕竟在本子上不是外接音响,JBJ的音响够用了;

相反外接入耳麦的时候,自动启用DS(启用的Y460的杜比音效),玩游戏的时候效果很好;但是DS在foobar听音乐效果不行,在WMP上听就更加一般了。比起foobar的WASAPI输出效果差远了。

posted on 2011-02-10 17:43  liupin  阅读(52934)  评论(0编辑  收藏  举报

-->