WINCE WAVE接口模型详解
1、标准的WAVE流式驱动程序接口
WAVE的驱动程序提供标准的流式接口给高层,但真正产生关键作用的是
WAV_IOControl这个函数。该函数的以下两个参数最重要:
dwCode
具体的IO控制命令,包括:
IOCTL_WAV_MESSAGE (处理放音和录音相关的所有操作)
IOCTL_DSDVR_MESSAGE (DirectSound 动作处理)
IOCTL_MIX_MESSAGE. (MIXER的操作)
pBufIn
指向了MMDRV_MESSAGE_PARAMS结构,该结构如下:
Struct {
UINT uDeviceId;
UINT uMsg;
DWORD dwUser;
DWORD dwParam1;
DWORD dwParam2;
}MMDRV_MESSAGE_PARAMS;
uDeviceId: 0,1,2 。。。 如果是0代表全局或者缺省的设备
uMsg :用作(WIDM_*),(WODM_*), (MXDM_*)三种消息
dwUser:实例的具体标识
通过这个函数传递的高层命令,最终导致驱动的具体动作,放音、录音或者混音。
2、关键的数据结构
WAVE OPEN时候使用的数据结构:
WAVEFORMATEX{
WORD wFormatTag;
WORD wChannels;
DWORD nSamplesPerSec;
DWORD nAvgBytesPerSec;
WORD nBlockAlign;
WORD nBitsPerSample;
WORD cbSize;
}
该数据结构定义了一个Audio Stream所需要的大部分信息,当做WAVE OPEN的时候可能应用可能会首先尝试打开,这个时候WAVE_IO_CONTROL 就会传递一个WAVE_FORMAT_QUERY 给驱动,而驱动只是简单的检查是否真正的支持请求的格式,而不真正打开设备。
每次应用添加声音数据的时候会使用如下数据结构:
Struct {
LPSTR lpData;
DWORD dwBufferLength;
DWORD dwBytesRecorded;
DWORD dwUser;
DWORD dwFlags;
DWORD dwLoops;
Struct wavehdr_tag *lpNext;
DWORD Reserved;
}
其中dwFlags定义了几个标志:
WHDR_BEGINLOOP :指明这个BUFFER是否要求被自动重放 (APP设)
WHDR_DONE :指明这个BUFFER已经处理完毕(驱动设)
WHDR_ENDLOOP :指明这个BUFFER是否结束重放(APP设)
WHDR_INQUEUE :指明这个BUFFER入队列(驱动设)
WHDR_PREPARED:指明这个BUFFER的确准备好(APP或驱动设)
这几个标志是应用和驱动通信的关键,也是对队列操作的关键。应用和驱动通过设定这些标志位,让数据不断在驱动和应用之间流动,从而完成录放的各种操作。当然,这个过程还要配合一些WAVE 消息。