Wave Driver介绍-6(控制面板中的音量调整工具)

来源:互联网 发布:网络机顶盒vip破解软件 编辑:程序博客网 时间:2024/05/18 12:40

当环境变量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 ffffDebug 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

原创粉丝点击