http://blog.csdn.net/daydayupfromnowon/article/details/6006794
当环境变量CPLMAIN_SOUNDS置位的时候,控制面板中出现音量控制的应用程序Volume&Sounds.exe,如下图所示:
其中,注册表中定义了Volume&Sounds.exe的默认配置值,如下图所示:
; Sound CPL registry values [HKEY_CURRENT_USER/ControlPanel/Volume] "Key"=dword:10002 ; Keyclicks: 1=soft, 0x10002=loud "Screen"=dword:10002 ; ScreenTaps: 1=soft, 0x10002=loud "Mute"=dword:7 ; 7=Enable all sounds (1=Notifications, 2=Apps, 4=Events.) "Volume"=dword:99999999 ; 0=off, 0xFFFFFFFF=maximum |
应用程序Volume&Sounds.exe调整和控制的是设备音量(实际上就是调用waveOutSetVolume去配置设备音量),同时还可以配置各种与用户交互的行为下的声音,比如通过Sounds选项卡去配置用户点击屏幕的声音。
当用户点击OK退出,则保存当前的所有配置,而当选择叉号退出的话,则不保存当前选择的配置。
有关该应用程序更加详细的Stack,可以参照CE下源代码:
/PUBLIC/WCESHELLFE/OAK/CTLPNL/CPLMAIN/Volume.cpp
1. 应用程序中对音量的控制
应用程序中有两种方式对音量控制,即可以来控制设备音量,也可以来控制当前Stream的音量,都通过调用wave api waveOutSetVolume来实现,有关该函数的更加详细介绍,请参照“Wave API waveOutSetVolume”。
一般情况下,调用底层wave api来播放音频的话,遵循如下的流程:waveOutOpenà waveOutPrepareHeaderà waveOutWriteà waveOutResetà waveOutUnprepareHeaderà waveOutClose。
那么,当前流的默认音量是多少呢?
在Wave Driver初始化的时候,将会创建DeviceContext类的实例(驱动中将会去根据具体的Audio Codec来继承该类),其成员m_dwDefaultStreamGain保存了默认的流的音量,该值在用户调用waveoutopen的时候传递给具体的stream实例中保存。如果上层没有给wave driver传递具体的Stream音量的话,驱动中将会去使用该音量做为流默认的音量。
遗憾的是,这种机制没有机会使用了。经过反复测试发现,在应用层中调用waveOutOpen创建Stream的话,系统层会在函数waveOutOpen内部实现中将流的音量配置为0xffff ffff。Debug Info如下:
*******WODM_OPEN, uDeviceId=0x0******* nSamplesPerSec 0x5622, nChannels 0x1, m_dwMultiplier 65536 WODM_SETVOLUME. dwGain 0xffffffff, NumDevs 1, pStreamContext One, sizeof(dwGain) 4 |
在使用播放器播放音频的时候,打开一个音频文件时系统同样会将Stream音量配置为0xffff ffff,然后播放器再去获取用户上次使用播放器的时候配置的Stream的音量,最后将这个值配置给Wave Driver。