音频驱动


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函数来通知音频驱动,停止录音
 

你可能感兴趣的:(数据结构,manager,Microsoft,header,audio,compression)