m_lpCurrData = pCurrData;
m_CurrT = CurrT;
m_PrevSamp[0] = PrevSamp0;
m_PrevSamp[1] = PrevSamp1;

m_CurrSamp[0] = CurrSamp0;
m_CurrSamp[1] = CurrSamp1;
return pBuffer;
知道了左右声道增益设定方式,哪么我们就去找m_fxpGain这个参数,这是原文件中的参数,当然我们可以给他添加一个后缀,比如m_fxpGainR、m_fxpGainL。这样在阅读的之后也要便于一些,我这里就直接使用我实验时更改的代码。我看到m_fxGain参数是在StreamContext这个类里边定义的!在PLATFORM\SMDK2410\DRIVERS\WAVEDEV\Strmctxt.h文件中可以找到,在这个类里边我们可以看见这样两个函数:
DWORD SetGain(DWORD dwGain)
{
m_dwGain = dwGain&0xFFFFFFFF;
GainChange();
return MMSYSERR_NOERROR;
}
这个是设定音量调用的变量。在原文件中m_dwGain = dwGain&0xFFFF;这样一来就把WaveOutSetVolume传过来的32位音量参数与成16位有效了,哪么我们传过来的高16位的音量就没有作用了,我们要做的就是把高16位的功能开启起来!
virtual void GainChange()
{
DWORD m_dwGainL = (m_dwGain >> 16) & 0xffff;
DWORD m_dwGainR = m_dwGain & 0xffff;
m_fxpGain = MapGain(m_dwGainR);
m_fxpGain1 = MapGain(m_dwGainL);
}
在这个变量中读取MapGain将我们传送进来的数据转化成音量增益,这里我们可以不管他,因为音量增益是一个指数型增长的数据,所以在这里需要转化,这样在设定音量的之后我们就能感觉到他是直线型增长的!
在这个变量中就已经可以看出,已经将两个声道的音量分离开了,也就是在后面讲到的Render中所使用的亮度增益。
这个参数是在PLATFORM\SMDK2410\DRIVERS\WAVEDEV\WaveMain.cpp里面的WAV_IOControl传进来的,
case WODM_SETVOLUME:
{ UINT NumDevs = g_pHWContext->GetNumOutputDevices();
LONG dwGain = dwParam1;
if (pStreamContext)
{
dwRet = pStreamContext->SetGain(dwGain);
}
else
{
DeviceContext *pDeviceContext= _pHWContext->GetOutputDeviceContext(uDeviceId);
dwRet = pDeviceContext->SetGain(dwGain);
}
break;
}
在这上面有两种状况,一个是设定整个平台的音量,一个是更改流的音量,这样我们后面所说的联系上去,就能很容易的了解到系统音量设定的整个步骤了!
设置过后当然是没有改变注册表中音量的值的。
在实现左右声道音量设定的之后我发觉了一个奇怪的现象,那就我们显然能设定左右声道音量增益,但是没有办法稳定的实现在一个声道播放声音,例如:我们播放一个音频,声音设定为单声道,就是说将32位参数中的高16位或者低16设为0,连续播放多次这个音频,理论上来说是一个喇叭有声音,一个喇叭没有声音!
在测试中我发觉,两个声道的音量交换,就好像是我们起初设定的是0xFFFF0000,播放几次之后,就变成了0xFFFF了,左右声道的音量交换了。
我用示波器看了一下数据和左右声道选择线的波形wince6.0 音乐播放器,在s3c2410中,是使用的IIS总线,左右声道选择线是LRCLK,我看到他开启几个周期过后,才有数据的传送,但是详细开启了几个周期过后才开始传送数据的是不确定的,所有就会有左右声道交换的状况!恰好2410的LRCLK又是不能控制的!
如果有人解决了也碰到了同样的状况,欢迎与我探讨。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/bofangqi/article-120036-2.html
这不是黑人吗