再谈WINCE音量调节的实现

      目前看到CSDN里有两个版本的CE音量调节方法,一个是norains的控制面板调节方法,一个是mercury的WAV API;我看了都很受启发,在实际运用测试中我使用的是mercury的WAV API来实现的;在其博文中写的很详细,我不做重复介绍了哈!这里主要是接着给出应用层的操作方法。顺便总结下流式驱动的设计开发和底层与应用层的通信方法,供和我一样刚入门的新人做笔记参考。

     说起来,只要了解流式驱动的编写和应用层跟底层的通信方法,这么典型的开发是比较简单的。

 

先看PLATFORM/XXXX/SRC/DRIVERS/WAVEDEV2/dll目录里wavedev2.def

------------------------------------

LIBRARY         WAVEDEV

EXPORTS
    WAV_Init
    WAV_Deinit
    WAV_Open
    WAV_Close
    WAV_IOControl

------------------------------------

有流式驱动典型的API公开接口函数,函数定义在source里,不一一描述了。我们的入口点自然在 WAV_IOControl了。看其定义:

extern "C" BOOL WAV_IOControl(PDWORD  pdwOpenData,
         DWORD  dwCode,       //这里我们选IOCTL_WAV_MESSAGE
         PBYTE  pBufIn,            //字节指针指向我们要给进的音量数据的结构体
         DWORD  dwLenIn,
         PBYTE  pBufOut,
         DWORD  dwLenOut,
         PDWORD pdwActualOut)

从这里转到了

HandleWaveMessage((PMMDRV_MESSAGE_PARAMS)pBufIn, (DWORD *)pBufOut);

(发现在这里CE6里比CE5多了个异常处理,果然是升级了,代码健壮度也加强了!呵呵,题外话哈)

我们注意看PMMDRV_MESSAGE_PARAMS这个结构体,这个在mercury的博文里有比较详细的介绍,这里我也顺便贴出来吧

typedef struct {   
 UINT uDeviceId;
 UINT uMsg;
 DWORD dwUser;
 DWORD dwParam1;
 DWORD dwParam2;
} MMDRV_MESSAGE_PARAMS, *PMMDRV_MESSAGE_PARAMS;

大家看HandleWaveMessage()里的代码,跟着uMsg去找WODM_SETVOLUME,这就是我们设置系统音量的地方了!

我们给值的时候要注意这里是左右声道各占32位(DWORD)的高低16位,所以如果是要求左右声道音量一致的话,我们只要转来16位的音量大小数据,然后变换成32位数据就行了。

                if (pStreamContext)
                {
                    dwRet = pStreamContext->SetGain(dwGain);   //当前有音频流的话就改变当期音频流音量
                }
                else
                {
                    dwRet = SetMasterVolume(dwGain);               //否则改变系统音量,跟改控制面板效果一样
                }

 

说到这都是底层的东西,重复了mercury的一些。到这就大概明白了底层改变音量的思路了吧,应用层就简单了。同样定义一个相同的结构体MMDRV_MESSAGE_PARAMS再定义个结构体变量

MMDRV_MESSAGE_PARAMS WAVctlk;

 

 WAVctlk.uDeviceId = XXX;   //这里的ID设置为0好像是表示整个设备,建议不设0,弄成个比200大的,然后在底层判断一下就行了
 WAVctlk.uMsg = WODM_SETVOLUME;
 WAVctlk.dwUser = NULL;

WAVctlk.dwParam1 = dwVOL;
 WAVctlk.dwParam2 = NULL;

然后再调用

DeviceIoControl(hWAVctrl,
     IOCTL_WAV_MESSAGE,         //这些宏定义的值记得是在pulic下面的某个文件里都有,自己搜索下吧  
     &WAVctlk,                
     sizeof(WAVctlk),                   
     NULL,               
     NULL,                
     NULL,
     NULL);

然后系统或当前音频播放的音量就根据你的设定改变了!

 

 

题外PS:

在实际的项目开发中,我用的飞梭调节音量,会出现音量值溢出的问题,比如到了65536后溢出变零,这需要事先算出但前值和最大值的差,再去和飞梭改变值对比,可以避开溢出的问题。

另外如果外接有音效模块,我们可以在系统音量设置这个代码段进行拦截,转而去调节我们的外接模块,当然最后在init的时候就把系统的音量设成最大。

 

 

鸣谢参考:

norains

http://blog.csdn.net/norains/archive/2007/04/08/1556912.aspx

mercury

http://blog.csdn.net/xumercury/archive/2008/12/05/3454243.aspx

另外网上也参考多处资料,已经无法找到出处,也特此鸣谢! 

 

声明:本文仅供参考,如有错误或疑问,请留言斧正或询问!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值