在声音物理学中,音量的变化是对数关系,在代码里,暂时我没有这样处理,简单的用线性关系表示,在主进程进行设置,解码时设置进pcm数据,再用声卡播放。
这段代码的实现也是参考了别人的,代码如下:
/*
* @Func : SetVolume
* @brief : 音量调节
* @author : linghuzhangmen
* @[in] : buf 为需要调节音量的音频数据块首地址指针
* @[in] : size为长度
* @[in] : uRepeat为重复次数,通常设为1
* @[in] : vol为增益倍数,可以小于1
*/
void MyFFmpeg::SetVolume(char* buf, UINT32 size, UINT32 uRepeat, double vol)
{
if (!size)
{
return;
}
for (int i = 0; i < size; i += 2)
{
short wData;
wData = MAKEWORD(buf[i], buf[i + 1]);
long dwData = wData;
for (int j = 0; j < uRepeat; j++)
{
dwData = dwData * vol;
if (dwData < -0x8000)
{
dwData = -0x8000;
}
else if (dwData > 0x7FFF)
{
dwData = 0x7FFF;
}
}
wData = LOWORD(dwData);
buf[i] = LOBYTE(wData);
buf[i + 1]