Jan 092007
 

小白我自从Vista放出第一个公开测试版就一直持续着安装-试用-不好用-卸载的痛苦历程,如今Vista RTM已经发布月有余了,眼见Retail就要开卖了,可以说大的架构方面肯定已经稳定有余了,于是小白我又把目标投向了明年下半年将要发布的Longhorn Server,sorry已经是今年了。前两天是在捣腾Build 6001,这个版本从Build号码来看是属于大于Vista RTM Build 6000的一个版本,假定如果微软一直宣扬的Vista和Longhorn Server共享代码库的新闻是真的得话,可以认为这个版本是已经包含了Vista RTM绝大多数要素的版本。
然而无论是Vista还是Longhorn,据我个人测试来看,一直有一个到现在还没法解决的大问题—-声音系统,在我的PC的表现是出现暴音和扭曲现象,确切一些说是dropouts & distortions,在Vista Build 5600以后此现象发生了变化,变成了更有趣的现象,系统刚启动时一切正常,然而播放音乐过一段时间之后(不定时间),声音变慢,失真到最后爆掉至完全听不出来,而在Longhorn Server至今为止都还是老现象,这也是目前我一直无法抛弃Win2003的原因,毕竟我也要听音乐看RMVB的。

一开始我个人把问题归于硬件兼容性上,因为从现象来看,非常类似当年PCI声卡刚流行时的IRQ争用问题,最形象的表现是一旦浏览网页时拖动滚动条,则此时后台播放的音乐必然爆音。在经过多次调整BIOS设置,更新BIOS版本之后,发现貌似不象是此类问题,但又无解决方案,只能作罢。

偶然某一天在MSDN上逛的时候发现有些文章描述了在Vista中声音子系统模型发生了变化,仔细研究了一下,看到某些老外在Creative的论坛上为此变化导致的一系列后果已经是争得不亦乐乎了,有兴趣的可以去看一下

如果不喜欢看英文长篇大论的我这里就结合我自己碰到的问题简单总结一下:
1,Vista的声音子系统模型与XP以及以往的系统有了很大的改变,其主要方面是将以往在内核部分的一些模块放到了用户层来处理,但原先基于WDM的驱动还是可以使用的。
2,MS这样做的好处在于简化内核层次的代码,便于Bug的查找和驱动底层的稳定性加强,其次可以通过抽象出来的APO来针对用户模式的声音流处理来增加新的特效和功能。
3,这种新的模型带来的显著变化使得原先的Kmixer等内核抽象模块不再存在,内核中只剩下驱动程序自己。而原先与Kmixer通讯的MME以及DirectSound现在通过WASAPI模拟出来的声音Session服务起作用。这样每个应用程序都可以通过单独的Session实现单独的声音处理过程(还记得Vista可以针对单个程序调节音量了么,这就是好处^_^)
4,有好处自然就有坏处,这种新模型使得原先DirectSound的硬件加速现在没办法实现了,只能通过CPU运算进行,而原来通过DirectSound实现的一些声音特效API(例如Creative的EAX)同样失效,这就是创新论坛上一群人头大的原因。
5,同时,从内核到用户层的迁移还带来其他的一些问题,例如原先在内核中对于声音缓冲区的处理函数现在可能要考虑用户层的任务调度带来的影响,例如声音缓冲区的同步问题,我的系统上出现的问题即是由此而起。打开Vista的声音调节可以看到一些关于程序独占声音的选项即可印证这方面可能存在问题以及微软的考量,然而对于我的问题,这些选项没有任何帮助。
6,坏就坏在,MS为大家考虑的好好的,然而硬件厂商可不这么认为,他们是懒惰的,他们是这样想的:老的驱动能用那就凑合用吧,新的驱动开发我们慢慢来就是了,于是问题来了,小白我不得不面对我的音箱发出来的刺耳的“音乐”。

由此看来,我的声音问题要解决只能等Nvidia大发慈悲尽快推出基于新的声音子系统模型的驱动,并修整老驱动与新系统带来的这些问题才能够解决了。这就是当小白的后果。然而本小白亦非平常小白,难道就一点办法也没有吗,答案是:非也

从前面链接的框图可以看出来,从XP的模型到Vista的模型中,有一点是没有变化的,就是ASIO!这个东西是什么我也懒得解释,想知道的自己放狗找。总之这个模块无论是老模型还是新模型都是直接与声卡驱动连接并读写声音缓冲区来工作的,所以我不妨假设,通过ASIO来驱动声音系统应该可以暂时避过这个问题。

剩下就是验证。方法很简单,试试看使用Kernel Stream(与ASIO类似的直接读取声音缓冲区的技术)或者ASIO输出设备的播放器有没有问题即可,很自然得想到foobar。安装了foobar并加装ks插件,将音频输出改为KS,播放音乐测试,一切如预想的结果:完美,流畅!
由此得知支持KS或ASIO的音乐播放器都可以用这个方法,这样可用的列表就多了,象winamp,千千什么听的都可以用了。
放音乐解决,我要求不高,再找找看有没看rmvb的解决方案,找了半天似乎没什么播放器可以支持KS或ASIO,然而又不小心让我找到这样一个东西:reclock。这个工具本是为了解决声音视频同步的,然而其高版本也加入了Kernel Stream功能,可以生成一个支持KS的reclock声音输出通道,因此只要你的播放器能修改输出设备,改成recolck就实现了KS功能了。
照旧下载下来试验,安装正常,配置时出现点小错误提示,无视之,发现我的KMplayer中多出一个设备了,就选它,放rmvb测试,又OK!哈哈,我果然是小白天才。

游戏之类的东西按道理说如果能选择输出设备一般都可以解决,但貌似没有多少游戏有此类选项的。何况现在我也没什么需求,有时间再研究吧,至少我现在能在我的LH 6001上一边上网,一边听音乐再加上工作了。

另外补充一下缺陷:使用KS因为直接写声音缓冲区,如果程序处于高负载环境下可能会导致声音跳桢,还有就是通过KS就无法使用各大播放器的音量调节了,只能调节总音量,还有就是WMP没办法修改输出设备,这玩艺就不能用了。

托光缆坏掉的福,如果老外的讨论页无法打开的话,我还找到一位大虾转载在其自己Blog的相同文章,感兴趣可以看看 http://www.cppblog.com/lai3d/archive/2006/12/03/15948.aspx#Post

Update:刚才又想起来这样搞还有一个副作用,就是KS不支持多音频流,也就是你一旦在使用KS的播放器放音乐的话,系统其他途径进来的声音都会哑掉,简直是Dos时代了,呵呵.

  3 Responses to “了解Vista/Longhorn Server中的声音子系统的变化,以及某些声音问题的临时解决方案”

  1. [...] 早从Vista还叫Longhorn的那段时间,不少和我一样喜欢倒腾测试版操作系统的小白们就发现了Vista/Longhorn Server的声音跑得不是那么顺畅,容易出现暴音和跳音。当初我个人就写了一篇文章大致推断了一下问题并给出了个临时可用但不怎么好用的解决方案,见这篇:http://dawnh.net/windows/127/windows-vista-sound-issue/ [...]

  2. 想到KDE的arts接管声音系统的时候,优先级也是最高的 .不过可调的项目比这个多 :D

  3. Linux的声音系统现在可以说是一塌糊涂,基本上还只是”能用”的程度.没出问题只不过是X本身也是用户态在跑,出声的都是直接复制音频到内核缓冲区,不过这之间如果有问题那各个音频客户端都只能干瞪眼.ARTS只不过让这些音频使用者们能排排队消停消停来避免出问题.更多的功能就不用谈了.
    现在Vista出的问题其实是MS自找的,不过垄断性商业软件就是有优势,人家改架构你硬件设计商就得跟着改驱动架构,没得选择.

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>