some more work for 64 samples support in the server
This commit is contained in:
parent
5824855252
commit
a0934ee8b8
4 changed files with 36 additions and 28 deletions
|
@ -284,7 +284,7 @@ void CConnectDlg::SetServerList ( const CHostAddress& InetAddr,
|
||||||
// in case of all servers shown, add the registration number at the beginning
|
// in case of all servers shown, add the registration number at the beginning
|
||||||
if ( bShowCompleteRegList )
|
if ( bShowCompleteRegList )
|
||||||
{
|
{
|
||||||
pNewListViewItem->setText ( 0, QString ( "%1: " ).arg ( iIdx ) + pNewListViewItem->text ( 0 ) );
|
pNewListViewItem->setText ( 0, QString ( "%1: " ).arg ( 1 + iIdx ) + pNewListViewItem->text ( 0 ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
// show server name in bold font if it is a permanent server
|
// show server name in bold font if it is a permanent server
|
||||||
|
@ -310,14 +310,6 @@ void CConnectDlg::SetServerList ( const CHostAddress& InetAddr,
|
||||||
strLocation += QLocale::countryToString ( vecServerInfo[iIdx].eCountry );
|
strLocation += QLocale::countryToString ( vecServerInfo[iIdx].eCountry );
|
||||||
}
|
}
|
||||||
|
|
||||||
// for debugging, plot address infos in connect dialog
|
|
||||||
// Do not enable this for official versions!
|
|
||||||
#if 0
|
|
||||||
strLocation += ", " + vecServerInfo[iIdx].HostAddr.InetAddr.toString() +
|
|
||||||
":" + QString().setNum ( vecServerInfo[iIdx].HostAddr.iPort ) +
|
|
||||||
", perm: " + QString().setNum ( vecServerInfo[iIdx].bPermanentOnline );
|
|
||||||
#endif
|
|
||||||
|
|
||||||
pNewListViewItem->setText ( 3, strLocation );
|
pNewListViewItem->setText ( 3, strLocation );
|
||||||
|
|
||||||
// init the minimum ping time with a large number (note that this number
|
// init the minimum ping time with a large number (note that this number
|
||||||
|
|
|
@ -200,7 +200,7 @@ LED bar: lbr
|
||||||
#define PING_UPDATE_TIME_SERVER_LIST_MS 2000 // ms
|
#define PING_UPDATE_TIME_SERVER_LIST_MS 2000 // ms
|
||||||
|
|
||||||
// defines the interval between Channel Level updates from the server
|
// defines the interval between Channel Level updates from the server
|
||||||
#define CHANNEL_LEVEL_UPDATE_INTERVAL 100 // number of frames
|
#define CHANNEL_LEVEL_UPDATE_INTERVAL 200 // number of frames at 64 samples frame size
|
||||||
|
|
||||||
// time-out until a registered server is deleted from the server list if no
|
// time-out until a registered server is deleted from the server list if no
|
||||||
// new registering was made in minutes
|
// new registering was made in minutes
|
||||||
|
|
|
@ -306,6 +306,16 @@ CServer::CServer ( const int iNewMaxNumChan,
|
||||||
vstrChatColors[4] = "maroon";
|
vstrChatColors[4] = "maroon";
|
||||||
vstrChatColors[5] = "coral";
|
vstrChatColors[5] = "coral";
|
||||||
|
|
||||||
|
// set the server frame size
|
||||||
|
if ( bUseDoubleSystemFrameSize )
|
||||||
|
{
|
||||||
|
iServerFrameSizeSamples = DOUBLE_SYSTEM_FRAME_SIZE_SAMPLES;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
iServerFrameSizeSamples = SYSTEM_FRAME_SIZE_SAMPLES_SMALL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// To avoid audio clitches, in the entire realtime timer audio processing
|
// To avoid audio clitches, in the entire realtime timer audio processing
|
||||||
// routine including the ProcessData no memory must be allocated. Since we
|
// routine including the ProcessData no memory must be allocated. Since we
|
||||||
|
@ -851,7 +861,7 @@ void CServer::Stop()
|
||||||
void CServer::OnTimer()
|
void CServer::OnTimer()
|
||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
int iCurRawDataLen;
|
int iClientFrameSizeSamples;
|
||||||
OpusCustomDecoder* CurOpusDecoder;
|
OpusCustomDecoder* CurOpusDecoder;
|
||||||
OpusCustomEncoder* CurOpusEncoder;
|
OpusCustomEncoder* CurOpusEncoder;
|
||||||
unsigned char* pCurCodedData;
|
unsigned char* pCurCodedData;
|
||||||
|
@ -909,7 +919,7 @@ JitterMeas.Measure();
|
||||||
// select the opus decoder and raw audio frame length
|
// select the opus decoder and raw audio frame length
|
||||||
if ( vecAudioComprType[i] == CT_OPUS )
|
if ( vecAudioComprType[i] == CT_OPUS )
|
||||||
{
|
{
|
||||||
iCurRawDataLen = DOUBLE_SYSTEM_FRAME_SIZE_SAMPLES;
|
iClientFrameSizeSamples = DOUBLE_SYSTEM_FRAME_SIZE_SAMPLES;
|
||||||
|
|
||||||
if ( vecNumAudioChannels[i] == 1 )
|
if ( vecNumAudioChannels[i] == 1 )
|
||||||
{
|
{
|
||||||
|
@ -922,7 +932,7 @@ JitterMeas.Measure();
|
||||||
}
|
}
|
||||||
else if ( vecAudioComprType[i] == CT_OPUS64 )
|
else if ( vecAudioComprType[i] == CT_OPUS64 )
|
||||||
{
|
{
|
||||||
iCurRawDataLen = SYSTEM_FRAME_SIZE_SAMPLES_SMALL;
|
iClientFrameSizeSamples = SYSTEM_FRAME_SIZE_SAMPLES_SMALL;
|
||||||
|
|
||||||
if ( vecNumAudioChannels[i] == 1 )
|
if ( vecNumAudioChannels[i] == 1 )
|
||||||
{
|
{
|
||||||
|
@ -990,7 +1000,7 @@ JitterMeas.Measure();
|
||||||
pCurCodedData,
|
pCurCodedData,
|
||||||
iCeltNumCodedBytes,
|
iCeltNumCodedBytes,
|
||||||
&vecvecsData[i][iB * SYSTEM_FRAME_SIZE_SAMPLES_SMALL * vecNumAudioChannels[i]],
|
&vecvecsData[i][iB * SYSTEM_FRAME_SIZE_SAMPLES_SMALL * vecNumAudioChannels[i]],
|
||||||
iCurRawDataLen );
|
iClientFrameSizeSamples );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1031,6 +1041,11 @@ JitterMeas.Measure();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
iFrameCount++;
|
iFrameCount++;
|
||||||
|
if ( bUseDoubleSystemFrameSize )
|
||||||
|
{
|
||||||
|
// additional increment needed for double frame size to get to the same time interval
|
||||||
|
iFrameCount++;
|
||||||
|
}
|
||||||
|
|
||||||
for ( int i = 0; i < iNumClients; i++ )
|
for ( int i = 0; i < iNumClients; i++ )
|
||||||
{
|
{
|
||||||
|
@ -1065,7 +1080,7 @@ JitterMeas.Measure();
|
||||||
// select the opus encoder and raw audio frame length
|
// select the opus encoder and raw audio frame length
|
||||||
if ( vecAudioComprType[i] == CT_OPUS )
|
if ( vecAudioComprType[i] == CT_OPUS )
|
||||||
{
|
{
|
||||||
iCurRawDataLen = DOUBLE_SYSTEM_FRAME_SIZE_SAMPLES;
|
iClientFrameSizeSamples = DOUBLE_SYSTEM_FRAME_SIZE_SAMPLES;
|
||||||
|
|
||||||
if ( vecNumAudioChannels[i] == 1 )
|
if ( vecNumAudioChannels[i] == 1 )
|
||||||
{
|
{
|
||||||
|
@ -1078,7 +1093,7 @@ JitterMeas.Measure();
|
||||||
}
|
}
|
||||||
else if ( vecAudioComprType[i] == CT_OPUS64 )
|
else if ( vecAudioComprType[i] == CT_OPUS64 )
|
||||||
{
|
{
|
||||||
iCurRawDataLen = SYSTEM_FRAME_SIZE_SAMPLES_SMALL;
|
iClientFrameSizeSamples = SYSTEM_FRAME_SIZE_SAMPLES_SMALL;
|
||||||
|
|
||||||
if ( vecNumAudioChannels[i] == 1 )
|
if ( vecNumAudioChannels[i] == 1 )
|
||||||
{
|
{
|
||||||
|
@ -1103,11 +1118,11 @@ JitterMeas.Measure();
|
||||||
// so for speed optimization it would be better to set it only if the network
|
// so for speed optimization it would be better to set it only if the network
|
||||||
// frame size is changed
|
// frame size is changed
|
||||||
opus_custom_encoder_ctl ( CurOpusEncoder,
|
opus_custom_encoder_ctl ( CurOpusEncoder,
|
||||||
OPUS_SET_BITRATE ( CalcBitRateBitsPerSecFromCodedBytes ( iCeltNumCodedBytes, iCurRawDataLen ) ) );
|
OPUS_SET_BITRATE ( CalcBitRateBitsPerSecFromCodedBytes ( iCeltNumCodedBytes, iClientFrameSizeSamples ) ) );
|
||||||
|
|
||||||
opus_custom_encode ( CurOpusEncoder,
|
opus_custom_encode ( CurOpusEncoder,
|
||||||
&vecsSendData[iB * SYSTEM_FRAME_SIZE_SAMPLES_SMALL * vecNumAudioChannels[i]],
|
&vecsSendData[iB * SYSTEM_FRAME_SIZE_SAMPLES_SMALL * vecNumAudioChannels[i]],
|
||||||
iCurRawDataLen,
|
iClientFrameSizeSamples,
|
||||||
&vecbyCodedData[0],
|
&vecbyCodedData[0],
|
||||||
iCeltNumCodedBytes );
|
iCeltNumCodedBytes );
|
||||||
}
|
}
|
||||||
|
@ -1165,7 +1180,7 @@ void CServer::ProcessData ( const CVector<CVector<int16_t> >& vecvecsData,
|
||||||
if ( vecNumAudioChannels[j] == 1 )
|
if ( vecNumAudioChannels[j] == 1 )
|
||||||
{
|
{
|
||||||
// mono
|
// mono
|
||||||
for ( i = 0; i < SYSTEM_FRAME_SIZE_SAMPLES; i++ )
|
for ( i = 0; i < iServerFrameSizeSamples; i++ )
|
||||||
{
|
{
|
||||||
vecsOutData[i] = Double2Short (
|
vecsOutData[i] = Double2Short (
|
||||||
static_cast<double> ( vecsOutData[i] ) + vecsData[i] );
|
static_cast<double> ( vecsOutData[i] ) + vecsData[i] );
|
||||||
|
@ -1174,7 +1189,7 @@ void CServer::ProcessData ( const CVector<CVector<int16_t> >& vecvecsData,
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// stereo: apply stereo-to-mono attenuation
|
// stereo: apply stereo-to-mono attenuation
|
||||||
for ( i = 0, k = 0; i < SYSTEM_FRAME_SIZE_SAMPLES; i++, k += 2 )
|
for ( i = 0, k = 0; i < iServerFrameSizeSamples; i++, k += 2 )
|
||||||
{
|
{
|
||||||
vecsOutData[i] =
|
vecsOutData[i] =
|
||||||
Double2Short ( vecsOutData[i] +
|
Double2Short ( vecsOutData[i] +
|
||||||
|
@ -1187,7 +1202,7 @@ void CServer::ProcessData ( const CVector<CVector<int16_t> >& vecvecsData,
|
||||||
if ( vecNumAudioChannels[j] == 1 )
|
if ( vecNumAudioChannels[j] == 1 )
|
||||||
{
|
{
|
||||||
// mono
|
// mono
|
||||||
for ( i = 0; i < SYSTEM_FRAME_SIZE_SAMPLES; i++ )
|
for ( i = 0; i < iServerFrameSizeSamples; i++ )
|
||||||
{
|
{
|
||||||
vecsOutData[i] = Double2Short (
|
vecsOutData[i] = Double2Short (
|
||||||
vecsOutData[i] + vecsData[i] * dGain );
|
vecsOutData[i] + vecsData[i] * dGain );
|
||||||
|
@ -1196,7 +1211,7 @@ void CServer::ProcessData ( const CVector<CVector<int16_t> >& vecvecsData,
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// stereo: apply stereo-to-mono attenuation
|
// stereo: apply stereo-to-mono attenuation
|
||||||
for ( i = 0, k = 0; i < SYSTEM_FRAME_SIZE_SAMPLES; i++, k += 2 )
|
for ( i = 0, k = 0; i < iServerFrameSizeSamples; i++, k += 2 )
|
||||||
{
|
{
|
||||||
vecsOutData[i] =
|
vecsOutData[i] =
|
||||||
Double2Short ( vecsOutData[i] + dGain *
|
Double2Short ( vecsOutData[i] + dGain *
|
||||||
|
@ -1221,7 +1236,7 @@ void CServer::ProcessData ( const CVector<CVector<int16_t> >& vecvecsData,
|
||||||
if ( vecNumAudioChannels[j] == 1 )
|
if ( vecNumAudioChannels[j] == 1 )
|
||||||
{
|
{
|
||||||
// mono: copy same mono data in both out stereo audio channels
|
// mono: copy same mono data in both out stereo audio channels
|
||||||
for ( i = 0, k = 0; i < SYSTEM_FRAME_SIZE_SAMPLES; i++, k += 2 )
|
for ( i = 0, k = 0; i < iServerFrameSizeSamples; i++, k += 2 )
|
||||||
{
|
{
|
||||||
// left channel
|
// left channel
|
||||||
vecsOutData[k] = Double2Short (
|
vecsOutData[k] = Double2Short (
|
||||||
|
@ -1235,7 +1250,7 @@ void CServer::ProcessData ( const CVector<CVector<int16_t> >& vecvecsData,
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// stereo
|
// stereo
|
||||||
for ( i = 0; i < ( 2 * SYSTEM_FRAME_SIZE_SAMPLES ); i++ )
|
for ( i = 0; i < ( 2 * iServerFrameSizeSamples ); i++ )
|
||||||
{
|
{
|
||||||
vecsOutData[i] = Double2Short (
|
vecsOutData[i] = Double2Short (
|
||||||
static_cast<double> ( vecsOutData[i] ) + vecsData[i] );
|
static_cast<double> ( vecsOutData[i] ) + vecsData[i] );
|
||||||
|
@ -1247,7 +1262,7 @@ void CServer::ProcessData ( const CVector<CVector<int16_t> >& vecvecsData,
|
||||||
if ( vecNumAudioChannels[j] == 1 )
|
if ( vecNumAudioChannels[j] == 1 )
|
||||||
{
|
{
|
||||||
// mono: copy same mono data in both out stereo audio channels
|
// mono: copy same mono data in both out stereo audio channels
|
||||||
for ( i = 0, k = 0; i < SYSTEM_FRAME_SIZE_SAMPLES; i++, k += 2 )
|
for ( i = 0, k = 0; i < iServerFrameSizeSamples; i++, k += 2 )
|
||||||
{
|
{
|
||||||
// left channel
|
// left channel
|
||||||
vecsOutData[k] = Double2Short (
|
vecsOutData[k] = Double2Short (
|
||||||
|
@ -1261,7 +1276,7 @@ void CServer::ProcessData ( const CVector<CVector<int16_t> >& vecvecsData,
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// stereo
|
// stereo
|
||||||
for ( i = 0; i < ( 2 * SYSTEM_FRAME_SIZE_SAMPLES ); i++ )
|
for ( i = 0; i < ( 2 * iServerFrameSizeSamples ); i++ )
|
||||||
{
|
{
|
||||||
vecsOutData[i] = Double2Short (
|
vecsOutData[i] = Double2Short (
|
||||||
vecsOutData[i] + vecsData[i] * dGain );
|
vecsOutData[i] + vecsData[i] * dGain );
|
||||||
|
@ -1626,7 +1641,7 @@ void CServer::CreateLevelsForAllConChannels ( const int i
|
||||||
if ( vecNumAudioChannels[j] == 1 )
|
if ( vecNumAudioChannels[j] == 1 )
|
||||||
{
|
{
|
||||||
// mono
|
// mono
|
||||||
for ( i = 0; i < SYSTEM_FRAME_SIZE_SAMPLES; i += 3 )
|
for ( i = 0; i < iServerFrameSizeSamples; i += 3 )
|
||||||
{
|
{
|
||||||
dCurLevel = std::max ( dCurLevel, fabs ( static_cast<double> ( vecsData[i] ) ) );
|
dCurLevel = std::max ( dCurLevel, fabs ( static_cast<double> ( vecsData[i] ) ) );
|
||||||
}
|
}
|
||||||
|
@ -1634,7 +1649,7 @@ void CServer::CreateLevelsForAllConChannels ( const int i
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// stereo: apply stereo-to-mono attenuation
|
// stereo: apply stereo-to-mono attenuation
|
||||||
for ( i = 0, k = 0; i < SYSTEM_FRAME_SIZE_SAMPLES; i += 3, k += 6 )
|
for ( i = 0, k = 0; i < iServerFrameSizeSamples; i += 3, k += 6 )
|
||||||
{
|
{
|
||||||
double sMix = ( static_cast<double> ( vecsData[k] ) + vecsData[k + 1] ) / 2;
|
double sMix = ( static_cast<double> ( vecsData[k] ) + vecsData[k + 1] ) / 2;
|
||||||
dCurLevel = std::max ( dCurLevel, fabs ( sMix ) );
|
dCurLevel = std::max ( dCurLevel, fabs ( sMix ) );
|
||||||
|
|
|
@ -226,6 +226,7 @@ protected:
|
||||||
|
|
||||||
// if server mode is normal or double system frame size
|
// if server mode is normal or double system frame size
|
||||||
bool bUseDoubleSystemFrameSize;
|
bool bUseDoubleSystemFrameSize;
|
||||||
|
int iServerFrameSizeSamples;
|
||||||
|
|
||||||
void CreateLevelsForAllConChannels ( const int iNumClients,
|
void CreateLevelsForAllConChannels ( const int iNumClients,
|
||||||
const CVector<int>& vecNumAudioChannels,
|
const CVector<int>& vecNumAudioChannels,
|
||||||
|
|
Loading…
Reference in a new issue