目前看到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
另外网上也参考多处资料,已经无法找到出处,也特此鸣谢!
声明:本文仅供参考,如有错误或疑问,请留言斧正或询问!