WinCE6.0音频驱动中DeviceIoControl传参问题
我使用的是LPC3250自带的BSP中的音频驱动,在应用程序中调用DeviceIoControl打开音频设备时,编译时出现了错误,说IOCTL_WAV_MESSAGE和WODM_OPEN未定义。这两个参数在WinCE6.0里不是定义好了吗?在应用层不能直接使用吗?要使用这两个参数,我该包含哪些头文件?
我的部分程序如下(VS2005下MFC):
MMDRV_MESSAGE_PARAMS BufIn={0,WODM_OPEN,0,0,0};
static DWORD pBufOut;
void CwavDriverTestDlg::OnBnClickedPlay()
{
BOOL ret;
ret=::DeviceIoControl(hFile,IOCTL_WAV_MESSAGE,&BufIn,sizeof(MMDRV_MESSAGE_PARAMS),
&pBufOut,sizeof(DWORD),NULL,NULL);
if(ret==FALSE)
{
OnBnClickedClose();
return;
}
}
[解决办法]
为什么要用DeviceIoControl呢?
建议使用waveOutMessage等函数,在音频驱动中增加相应的消息处理就可以了。
[解决办法]
deviceIOcontrol你能调用到wave_IOcontrol吗?我没试过。我觉得是不能的。
你要像文件那么的用,先createfile,然后再去deviceIOcontrol我不知道audio这边是不是可以支持的
但是audio的部分。。都是wavinopen。。。waveinstart。。。waveinclose都是间接的通过waveapi.dll这个中间层来翻译成了waveIOcontrol的。。。这个waveapi.dll估计包装了不知道多少东西。。我估计你想直接跳过那一层估计很多东西(像消息一类的东西都不能实现)
要不你先试试能不能调用进去。。以文件的方式。
[解决办法]
waveOutMessage之类的函数能和WODM_OPEN消息关联起来吗?
可以的。
[解决办法]
音频驱动的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