音频驱动的IOCTL是可以调用的,但一般不推荐,一般都采用waveapi.dll这个中间层(直接调用这些函数wavinopen。。。waveinstart。。。waveinclose就可以了),waveapi自动发出下面的消息到WAVE_IOCTL.
但自己加的IOCTL可以直接用deviceIOcontrol调用。
驱动会作如下处理:
typedef struct {
UINT uDeviceId;
UINT uMsg;
DWORD dwUser;
DWORD dwParam1;
DWORD dwParam2;
} MMDRV_MESSAGE_PARAMS, *PMMDRV_MESSAGE_PARAMS;
(在..\public\common\sdk\inc\wavedev.h定义)
这个是传输给WAV_IOControlr的数据结构。
(1)其中dwUser 参数在使用时为被强制转换成StreamContext,
例如:StreamContext *pStreamContext = (StreamContext *)dwUser;
(2)uMsg参数表示驱动要执行什么样的操作。具体对应如下:
// messages sent to wodMessage() entry-point function
#define WODM_GETNUMDEVS 3 //请求WAVEFORM输出驱动返回其支持的设备实例数量。
#define WODM_GETDEVCAPS 4 //请求WAVEFORM输出驱动返回特定设备的功能。
#define WODM_OPEN 5 //请求WAVEFORM输出驱动打开一个设备对应的流接口。
#define WODM_CLOSE 6 //请求WAVEFORM输出驱动关闭由WODM_OPEN建立的流接口。
#define WODM_PREPARE 7 // 请求WAVEFORM输出驱动为输出准备一个系统中唯一的数据缓冲。
#define WODM_UNPREPARE 8 // WODM_PREPARE的逆操作。
。。。
(3)dwParam1参数在执行具体功能是需要强制转换成不同的结构体。
例如: 在 WODM_OPEN:
dwRet = pDeviceContext->OpenStream((LPWAVEOPENDESC)dwParam1, dwParam2, (StreamContext **)dwUser);
(4)dwParam1参数主要作为一些标志位。
..\public\common\sdk\inc\mmsystem.h
/* flags for dwFlags parameter in waveOutOpen() and waveInOpen() */
#define WAVE_FORMAT_QUERY 0x00000001
#define WAVE_ALLOWSYNC 0x00000002
#define WAVE_MAPPED 0x00000004
#define WAVE_FORMAT_DIRECT 0x00000008
#define WAVE_FORMAT_DIRECT_QUERY (WAVE_FORMAT_QUERY | WAVE_FORMAT_DIRECT)
#define WAVE_NOMIXER 0x00000080 /* Windows CE only - bypass software m
|