(1)MDD/PDD:
CE的旧驱动模型,MDD/PDD把驱动分成2块,sort-of hardware independent的MDD层和really hardware dependent的PDD层。MDD部分是通用的、公开出来的,生成wavemdd.lib的库;PDD必须是OEM自己编写的。这2部分静态的链接起来,才形成一个完整的驱动。
Waveapi驱动已经把硬件依赖关系给分割开来。MDD和PDD把驱动分成硬件相关的和硬件无关的。为了把驱动分割成硬件无关的,MDD层要设想好硬件的工作流程和功能。下面是MDD和PDD需要设定的内容:
A,只有一个设备
B,设备只有1个流(1个输入流和1个输出流)。Waveapi包含了软件混音器(software mixer),在应用层把多个流合并成一个流。
C,输入输出DMA共享一个中断
由此,此模式把PDD层大大简化了,使得音频设备比较容易的被移植和更改。但如果你的设备是比较特殊的,或者需要添加特别的功能,那就需要自己修改MDD的代码。这可能需要做的比较复杂。
(2)WaveDev2:
2000年开始smartphone开发时候,增添了对音频的许多需求,而MDD/PDD模式不能不做改动。在CE 3.0时候,还没有waveapi的软件混音提供,不可以同时播放多个音乐。那就需要一个新的设计,WaveDev2诞生了。
WaveDev2的所有文件都在一个目录下。移植WaveDev2驱动,只需要把样例的所有文件复制过来,再进行修改就可以了。主要修改hwctxt.h和hwctxt.cpp。CE6发布时候带有WaveDev2的样例(public/common/oak/drivers/wavedev/wavedev2/ensoniq),
WaveDev2驱动有以下新特性:
A,MIDI合成器。手机上需要播放MIDI音乐。
B,输入输出流的采样率转换。驱动可以把多个不同采样率的输出流,合并成一个流。也可以把一个输入流,分成多个应用程序需要的采样率输出流(这个应用比较特殊,很少见)。
C,Gain class接口。每个输出流都有自己的class(音量),当应用创建一个新的流时候,它的class是0。系统可以通过不同的waveOutMessage来控制每个class的音量等级。如电话进来时候,后台播放的音乐要静音。
D,Forcespeaker,主要是电话进来时候,让speaker播放铃声。
E,支持S/PDIF接口,让WMAPro流通过S/PDIF进行压缩。
如果是开发一个电话设备,最好使用WaveDev2的模式,系统需要依赖WaveDev2的扩展功能。
(3)UAM:
CE 4.2开始,需要为新增的DirectSound提供驱动。新的设计会利用WaveDev2的一部分改变,增加了使用硬件来混合2个音频流。UAM和WaveDev2看起来差不多,实际内部设计上还是有许多差别的。
真正使用硬件做混音的需求,实在太少。所以在CE5上,DirectSound才被加入。这个设计并不是很有价值,因此许多OEM还是使用以前的音频驱动设计。