WINCE音量调节的实现
刘启明 2010-5-8
在WINCE平台下,用户可以通过设置控制面板的音量调节按钮,实现系统音量的调节。同时,如果使用一些媒体播放器,如mplayer,则可以对输入的音频流实行单独的调节,而不影响系统其他的音量。我们可以把整个架构理解为WINDOWS平台,用户通过设置右下角的声音按钮,实现整个系统的音量设置,而在播放如千千静听,暴风影音时,可以单独的设置软件的音量,而不影响整个系统的音量。WINCE的音量调节模型正是如此。
在手持机上,会用到专业的音频芯片,比较典型的有UDA1341,WM8976,WM9713等。这些芯片都留有I2C接口,供处理器设置芯片的寄存器,从而达到调节音量等的功能。在底层驱动中,通过留相应接口,实现在调节控制面板里面的音量时,最终调节音频芯片的寄存器,实现音量调节。
这是最常用的一种方法。但是有些OEM厂商为了节约成本,在硬件上大做文章,选择的音频芯片根本没有音量调节的功能,甚至连I2C接口都没有,仅有一个I2S接口用于音频解码。那么这时候,WINCE是否还能像前面的那样,实现音量调节?答案是肯定的。
在Wavemain.cpp中,音量调节程序如下:
case WODM_GETVOLUME://获取喇叭音量
{
PULONG pdwGain = (PULONG)dwParam1;
if (pStreamContext)
{
*pdwGain = pStreamContext->GetGain();
}
else
{
// Handle device gain in hardware
//*pdwGain = g_pHWContext->GetOutputGain();//没有硬件音量调节支持
// Handle device gain in software
DeviceContext *pDeviceContext = g_pHWContext->GetOutputDeviceContext(uDeviceId);//软音量获取
*pdwGain = pDeviceContext->GetGain();
}
dwRet = MMSYSERR_NOERROR;
break;
}
</