@@ -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