6179|7

65

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

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;
}
}

最新回复

音频驱动的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   详情 回复 发表于 2010-5-2 22:18
点赞 关注

回复
举报

71

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
为什么要用DeviceIoControl呢?
建议使用waveOutMessage等函数,在音频驱动中增加相应的消息处理就可以了。
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
    在音频驱动里,是应用程序调用DeviceIoControl,传入的参数IOCTL_WAV_MESSAGE指明了对设备的操作(播放,录音等),然后设备管理器会调用流接口函数WAV_IoConrol()进行消息的处理。
具体调用过程是:应用程序调用DeviceIoControl()-> 设备管理器调用WAV_IoControl()-> HandleWaveMessage()-> HandleWaveMessageInternal()处理WODM_OPEN等消息。
    也就是说我在播放音频时,需要调用DeviceIoControl才会有后面的消息处理。 waveOutMessage之类的函数能和WODM_OPEN消息关联起来吗?
   
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

4
 
deviceIOcontrol你能调用到wave_IOcontrol吗?我没试过。我觉得是不能的。

你要像文件那么的用,先createfile,然后再去deviceIOcontrol我不知道audio这边是不是可以支持的

但是audio的部分。。都是wavinopen。。。waveinstart。。。waveinclose都是间接的通过waveapi.dll这个中间层来翻译成了waveIOcontrol的。。。这个waveapi.dll估计包装了不知道多少东西。。我估计你想直接跳过那一层估计很多东西(像消息一类的东西都不能实现)


要不你先试试能不能调用进去。。以文件的方式。
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

5
 
waveOutMessage之类的函数能和WODM_OPEN消息关联起来吗?

可以的。
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用 3 楼 unsway123 的回复:

deviceIOcontrol你能调用到wave_IOcontrol吗?我没试过。我觉得是不能的。

你要像文件那么的用,先createfile,然后再去deviceIOcontrol我不知道audio这边是不是可以支持的

但是audio的部分。。都是wavinopen。。。waveinstart。。。waveinclose都是间接的通过waveapi.dll这个中间层来翻译成了wav……


我就是先用CreateFile(),然后才DeviceIoControl(),但是在应用程序中找不到IOCTL_WAV_MESSAGE和WODM_OPEN的定义。编译都通不过
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

7
 
我还想问一下,ACM音频驱动和wavedev2驱动有什么区别?是不是在应用层调用时,ACM需要用wave系列API函数(如waveInOpen())来使用,而wavedev2需要用文件的方式来使用?
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

8
 
音频驱动的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
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表