java+pcm+double_关于两路PCM音频流混音问题

#define CHECK_MAX_VALUE(value) ((value > 32767) ? 32767 : value)

#define CHECK_MIN_VALUE(value) ((value < -32767) ? -32767 : value)

#define PCM_MAX_SIZE (8192*2)

int MixAudio(int iChannelNum, short* sourceData1, short* sourceData2,

float fBackgroundGain, float fWordsGain, short *outputData) {

int const MAX = 32767;

int const MIN = -32767;

double f = 1.0;

if (iChannelNum <= 0) {

return -1;

}

if (iChannelNum > 2) {

return -2;

}

if (iChannelNum == 2) {

float fLeftValue1 = 0;

float fRightValue1 = 0;

float fLeftValue2 = 0;

float fRightValue2 = 0;

float fLeftValue = 0;

float fRightValue = 0;

int output = 0;

int iIndex = 0;

fLeftValue1 = (float)(sourceData1[0]);

fRightValue1 = (float)(sourceData1[1]);

fLeftValue2 = (float)(sourceData2[0]);

fRightValue2 = (float)(sourceData2[1]);

fLeftValue1 = fLeftValue1*fBackgroundGain;

fRightValue1 = fRightValue1*fBackgroundGain;

fLeftValue2 = fLeftValue2*fWordsGain;

fRightValue2 = fRightValue2*fWordsGain;

fLeftValue1 = CHECK_MAX_VALUE(fLeftValue1);

fLeftValue1 = CHECK_MIN_VALUE(fLeftValue1);

fRightValue1 = CHECK_MAX_VALUE(fRightValue1);

fRightValue1 = CHECK_MIN_VALUE(fRightValue1);

fLeftValue2 = CHECK_MAX_VALUE(fLeftValue2);

fLeftValue2 = CHECK_MIN_VALUE(fLeftValue2);

fRightValue2 = CHECK_MAX_VALUE(fRightValue2);

fRightValue2 = CHECK_MIN_VALUE(fRightValue2);

fLeftValue = fLeftValue1 + fLeftValue2;

fRightValue = fRightValue1 + fRightValue2;

for (iIndex = 0; iIndex < 2; iIndex++) {

if (iIndex == 0) {

output = (int)(fLeftValue*f);

}

else {

output = (int)(fRightValue*f);

}

if (output>MAX)

{

f = (double)MAX / (double)(output);

output = MAX;

}

if (output

{

f = (double)MIN / (double)(output);

output = MIN;

}

if (f<1)

{

f += ((double)1 - f) / (double)32;

}

outputData[iIndex] = (short)output;

}

}

else {

float fValue1 = 0;

float fValue2 = 0;

float fValue = 0;

fValue1 = (float)(*(short*)(sourceData1));

fValue2 = (float)(*(short*)(sourceData2));

fValue1 = fValue1*fBackgroundGain;

fValue2 = fValue2*fWordsGain;

fValue = fValue1 + fValue2;

fValue = CHECK_MAX_VALUE(fValue);

fValue = CHECK_MIN_VALUE(fValue);

*outputData = (short)fValue;

}

return 1;

}

我找到这么一个算法,但是不清楚这两个参数应该传什么进去

floatfBackgroundGain,floatfWordsGain

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值