Windows CE中的音频驱动接口分为三个种类。
1.UAM驱动:Unified Audio Model统一音频模型。这是一种新的音频驱动模型,它将Wave audio和Microsoft® DirectSound® audio整合到了一起;
2.Waveform驱动:作为UAM驱动的一种替代方案。沿用传统的MDD和PDD架构;
3.ACM音频压缩管理驱动:Audio Compression Manager Drivers,是一种流接口驱动程序,其中包含了不同的音频压缩管理驱动类型并且提供开发ACM驱动的必要信息。
在本书中将针对kaola开发板中使用的普通音频MDD和PDD驱动进行分析。
作为UAM驱动或者流驱动的替代方案,开发者可以使用由微软公司提供的MDD库Wavemdd.lib。在这个库中,通过音频设备驱动服务提供接口(DDSI)实现了所有的流接口。如果要使用Wavemdd.lib库,则必须自己实现平台相关的PDD库,DDSI函数将使用到PDD库中的接口PDD库通常被命名为Wavepdd.lib。然后,这两个库可以被链接到音频驱动程序中,这种类型的音频驱动通常被命名为Wavedev.dll。
音频硬件通常支持比文件操作更多的接口。例如文件不需要音量控制而声卡需要。文件操作中的DeviceIOControl操作,在音频操作中同样可以由WAV_IOControl函数来实现,程序可以通过WAV_IOControl向声卡发送不同的命令。
图10-8显示了应用程序如何通过驱动和音频硬件进行数据交互。
图10-8 驱动和音频
硬件进行数据交互
如图10-8所示,在应用程序进行音频操作之前,首先向内核产生一个调用。内核将这个调用传递给驱动程序的WAV_IOControl进行处理。内核传递这个调用的模块被称为Wave API管理器。然后驱动程序对硬件进行操作。和普通的流接口驱动程序一样,音频驱动也使用注册表来存储信息并且向系统注册自身。如果音频驱动在Platform.reg中没有被列出,则在注册表中添加如下键:HKEY_LOCAL_MACH-
INE/Drivers/Builtin/Audio用于存储信息。在系统启动时,设备管理器将加载音频驱动,并且创建HKEY_LOCAL_MAC-
HINE/Drivers/Active键。
流接口驱动程序需要实现下列接口:
n WAV_Close
n WAV_Deinit
n WAV_Init
n WAV_IOControl
n WAV_Open
n WAV_PowerDown
n WAV_PowerUp
n WAV_Read
n WAV_Seek
n WAV_Write
DDSI的接口罗列如下:
n PDD_AudioDeinitialize
n PDD_AudioGetInterruptType
n PDD_AudioInitialize
n PDD_AudioMessage
n PDD_AudioPowerHandler
n PDD_WaveProc
10.6.1 主要数据结构
主要数据结构如表10-5所示。
表10-5 主要用到的数据结构
结 构 体
描 述
MMDRV_MESSAGE_PARAMS
这个结构体代表了要传输给WAV_IOControl的数据
WAVEOPENDESC
包含了waveform输入输出必要的信息
WAVEOUTEXTCAPS
包含额外的设备功能信息
10.6.2 主要接口函数
表10-6是wave驱动程序的流接口。
表10-6 Wave驱动程序的流接口
接 口
描 述
WAV_IOControl
I/O控制例程
WAV_Init
初始化WAV I/O设备
WAV_Deinit
初始化WAV I/O设备的反操作
WAV_Open
打开WAV I/O设备
WAV_Close
关闭WAV I/O设备
WAV_Read
WAV I/O设备的读操作
WAV_Write
WAV I/O设备的写操作
WAV_Seek
WAV I/O设备的寻址操作
WAV_PowerUp
通知WAV I/O设备,系统已经离开suspend状态
WAV_PowerDown
关闭(停止供电)WAV I/O
10.6.3 输入消息
wave驱动程序的输入消息如表10-7。
表10-7 Wave驱动程序的输入消息
消 息
描 述
WIDM_ADDBUFFER
请求waveform输入驱动在输入队列中添加一个buffer
WIDM_CLOSE
请求waveform输入驱动关闭一个指定的设备实例,这个设备实例由先前的WIDM_OPEN创建并且打开
WIDM_GETDEVCAPS
请求waveform输入驱动返回指定设备的功能
WIDM_GETNUMDEVS
请求waveform输入驱动返回其支持的设备数量
WIDM_GETPOS
请求输入流接口输入,驱动返回当前输入位置,位置值是相对于第一个采样的waveform样本
续表
消 息
描 述
WIDM_OPEN
请求waveform输入驱动打开一个设备对应的流接口
WIDM_PREPARE
请求waveform输入驱动为输入准备一个系统中唯一的数据缓冲
WIDM_RESET
请求waveform输入驱动停止录音并且将所有的缓冲数据返回给调用者
WIDM_START
请求waveform输入驱动开始录音
WIDM_STOP
请求waveform输入驱动停止录音
WIDM_UNPREPARE
WIDM_PREPARE的逆操作
10.6.4 输出消息
wave驱动程序的输出消息如表10-8。
表10-8 Wave驱动程序的输出消息
消 息
描 述
WODM_BREAKLOOP
请求waveform输出驱动停止由WODM_WRIT建立的输出循环
WODM_CLOSE
请求waveform输出驱动关闭由WODM_OPEN建立的流接口
WODM_GETDEVCAPS
请求waveform输出驱动返回特定设备的功能
WODM_GETNUMDEVS
请求waveform输出驱动返回其支持的设备实例数量
WODM_GETPLAYBACKRATE
请求waveform输出驱动返回特定设备当前的播放率放大值
WODM_GETPOS
请求返回当前数据流中相对于waveform起始的相对位置
WODM_GETVOLUME
请求waveform输出驱动返回指定设备的音量水平
WODM_OPEN
请求waveform输出驱动打开指定设备上的流接口
WODM_PAUSE
请求waveform输出驱动暂停waveform的播放
WODM_RESET
请求waveform输出驱动停止发送输出数据并且返回所有的输出缓冲到列表
WODM_RESTART
请求waveform输出驱动继续播放被暂停的waveform
WODM_SETPLAYBACKRATE
请求waveform输出驱动设置特定设备当前的播放率放大值
WODM_SETVOLUME
请求waveform输出驱动设置指定设备的音量水平
10.6.5 PDD函数
PDD函数如表10-9所示。
表10-9 PDD函数描述
函 数
描 述
PDD_AudioDeinitialize
关闭并且断开和声卡的连接
PDD_AudioGetInterruptType
判断音频中断的原因,并且返回当前设备的状态
PDD_AudioInitialize
初始化音频设备
续表
函 数
描 述
PDD_AudioMessage
将应用程序的消息发送到PDD
PDD_AudioPowerHandler
负责在POWER_UP和POWER_DOWN时管理硬件
PDD_WaveProc
将消息发送到驱动的PDD层
10.6.6 WPDM消息
WPDM消息如表10-10所示。
表10-10 WPDM消息描述
消 息
描 述
WPDM_CLOSE
这个消息被传递到PDD_WaveProc函数来通知音频驱动PDD,驱动程序的waveXXXClose函数已经被调用
WPDM_CONTINUE
这个消息被传递到PDD_WaveProc函数来通知音频驱动PDD,从wave header指向的数据开始继续处理
WPDM_ENDOFDATA
这个消息被传递到PDD_WaveProc函数来通知音频驱动PDD,已经没有输出数据需要处理
WPDM_GETDEVCAPS
这个消息被传递到PDD_WaveProc函数来通知音频驱动PDD查询硬件的功能
WPDM_GETVOLUME
这个消息被传递到PDD_WaveProc函数来通知音频驱动PDD查询当前音频设备的音量水平
WPDM_OPEN
这个消息被传递到PDD_WaveProc函数来通知音频驱动PDD,将有特定格式的数据被发送到waveform设备
WPDM_PAUSE
这个消息被传递到PDD_WaveProc函数来通知音频驱动PDD,暂停播放
WPDM_RESTART
这个消息被传递到PDD_WaveProc函数来通知音频驱动继续播放被暂停的数据
WPDM_SETVOLUME
这个消息被传递到PDD_WaveProc函数来通知音频驱动调整音频设备的音量
WPDM_STANDBY
这个消息被传递到PDD_WaveProc函数来通知音频驱动将设备设置为standby状态
WPDM_START
这个消息被传递到PDD_WaveProc函数来通知音频驱动,从wave header指向的数据开始处理
WPDM_STOP
这个消息被传递到PDD_WaveProc函数来通知音频驱动,停止录音