Skip to content

Commit d6372fb

Browse files
committed
Optimize MixEncodeTransmitData()
1 parent 4200d38 commit d6372fb

1 file changed

Lines changed: 46 additions & 41 deletions

File tree

src/server.cpp

Lines changed: 46 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -982,7 +982,7 @@ void CServer::MixEncodeTransmitData ( const int iChanCnt, const int iNumClients
982982
// stereo: apply stereo-to-mono attenuation
983983
for ( i = 0, k = 0; i < iServerFrameSizeSamples; i++, k += 2 )
984984
{
985-
vecfIntermProcBuf[i] += ( static_cast<float> ( vecsData[k] ) + vecsData[k + 1] ) / 2;
985+
vecfIntermProcBuf[i] += ( static_cast<float> ( vecsData[k] ) + vecsData[k + 1] ) * 0.5f;
986986
}
987987
}
988988
}
@@ -1001,7 +1001,7 @@ void CServer::MixEncodeTransmitData ( const int iChanCnt, const int iNumClients
10011001
// stereo: apply stereo-to-mono attenuation
10021002
for ( i = 0, k = 0; i < iServerFrameSizeSamples; i++, k += 2 )
10031003
{
1004-
vecfIntermProcBuf[i] += fGain * ( static_cast<float> ( vecsData[k] ) + vecsData[k + 1] ) / 2;
1004+
vecfIntermProcBuf[i] += fGain * ( static_cast<float> ( vecsData[k] ) + vecsData[k + 1] ) * 0.5f;
10051005
}
10061006
}
10071007
}
@@ -1020,7 +1020,7 @@ void CServer::MixEncodeTransmitData ( const int iChanCnt, const int iNumClients
10201020
const int maxPanDelay = MAX_DELAY_PANNING_SAMPLES;
10211021

10221022
int iPanDelL = 0, iPanDelR = 0, iPanDel;
1023-
int iLpan, iRpan, iPan;
1023+
int iLpan, iRpan;
10241024

10251025
for ( j = 0; j < iNumClients; j++ )
10261026
{
@@ -1036,21 +1036,20 @@ void CServer::MixEncodeTransmitData ( const int iChanCnt, const int iNumClients
10361036
const float fGainL = MathUtils::GetLeftPan ( fPan, false ) * fGain;
10371037
const float fGainR = MathUtils::GetRightPan ( fPan, false ) * fGain;
10381038

1039+
const bool isMono = vecNumAudioChannels[j] == 1;
1040+
10391041
if ( bDelayPan )
10401042
{
10411043
iPanDel = lround ( (float) ( 2 * maxPanDelay - 2 ) * ( vecvecfPannings[iChanCnt][j] - 0.5f ) );
10421044
iPanDelL = ( iPanDel > 0 ) ? iPanDel : 0;
10431045
iPanDelR = ( iPanDel < 0 ) ? -iPanDel : 0;
1044-
}
10451046

1046-
if ( vecNumAudioChannels[j] == 1 )
1047-
{
1048-
// mono: copy same mono data in both out stereo audio channels
1049-
for ( i = 0, k = 0; i < iServerFrameSizeSamples; i++, k += 2 )
1047+
if ( isMono )
10501048
{
1051-
// left/right channel
1052-
if ( bDelayPan )
1049+
// mono: copy same mono data in both out stereo audio channels
1050+
for ( i = 0, k = 0; i < iServerFrameSizeSamples; i++, k += 2 )
10531051
{
1052+
// left/right channel
10541053
// pan address shift
10551054

10561055
// left channel
@@ -1079,54 +1078,60 @@ void CServer::MixEncodeTransmitData ( const int iChanCnt, const int iNumClients
10791078
vecfIntermProcBuf[k + 1] += vecsData[iRpan] * fGainR;
10801079
}
10811080
}
1082-
else
1083-
{
1084-
vecfIntermProcBuf[k] += vecsData[i] * fGainL;
1085-
vecfIntermProcBuf[k + 1] += vecsData[i] * fGainR;
1086-
}
10871081
}
1088-
}
1089-
else
1090-
{
1091-
// stereo
1092-
for ( i = 0; i < ( 2 * iServerFrameSizeSamples ); i++ )
1082+
else
10931083
{
1094-
// left/right channel
1095-
if ( bDelayPan )
1084+
// stereo
1085+
for ( i = 0; i < ( 2 * iServerFrameSizeSamples ); i += 2 )
10961086
{
10971087
// pan address shift
1098-
if ( ( i & 1 ) == 0 )
1088+
1089+
iLpan = i - 2 * iPanDelL; // left channel
1090+
iRpan = ( i + 1 ) - 2 * iPanDelR; // right channel
1091+
1092+
// interleaved channels
1093+
if ( iLpan < 0 )
10991094
{
1100-
iPan = i - 2 * iPanDelL; // if even : left channel
1095+
// get from second
1096+
iLpan = iLpan + 2 * iServerFrameSizeSamples;
1097+
vecfIntermProcBuf[i] += vecsData2[iLpan] * fGain;
11011098
}
11021099
else
11031100
{
1104-
iPan = i - 2 * iPanDelR; // if odd : right channel
1101+
vecfIntermProcBuf[i] += vecsData[iLpan] * fGain;
11051102
}
1106-
// interleaved channels
1107-
if ( iPan < 0 )
1103+
1104+
if ( iRpan < 0 )
11081105
{
11091106
// get from second
1110-
iPan = iPan + 2 * iServerFrameSizeSamples;
1111-
vecfIntermProcBuf[i] += vecsData2[iPan] * fGain;
1107+
iRpan = iRpan + 2 * iServerFrameSizeSamples;
1108+
vecfIntermProcBuf[i + 1] += vecsData2[iRpan] * fGain;
11121109
}
11131110
else
11141111
{
1115-
vecfIntermProcBuf[i] += vecsData[iPan] * fGain;
1112+
vecfIntermProcBuf[i + 1] += vecsData[iRpan] * fGain;
11161113
}
11171114
}
1118-
else
1115+
}
1116+
}
1117+
else
1118+
{
1119+
if ( isMono )
1120+
{
1121+
// mono: copy same mono data in both out stereo audio channels
1122+
for ( i = 0, k = 0; i < iServerFrameSizeSamples; i++, k += 2 )
11191123
{
1120-
if ( ( i & 1 ) == 0 )
1121-
{
1122-
// if even : left channel
1123-
vecfIntermProcBuf[i] += vecsData[i] * fGainL;
1124-
}
1125-
else
1126-
{
1127-
// if odd : right channel
1128-
vecfIntermProcBuf[i] += vecsData[i] * fGainR;
1129-
}
1124+
vecfIntermProcBuf[k] += vecsData[i] * fGainL;
1125+
vecfIntermProcBuf[k + 1] += vecsData[i] * fGainR;
1126+
}
1127+
}
1128+
else
1129+
{
1130+
for ( i = 0; i < ( 2 * iServerFrameSizeSamples ); i += 2 )
1131+
{
1132+
// left/right channel
1133+
vecfIntermProcBuf[i] += vecsData[i] * fGainL;
1134+
vecfIntermProcBuf[i + 1] += vecsData[i + 1] * fGainR;
11301135
}
11311136
}
11321137
}

0 commit comments

Comments
 (0)