certain bug fixes and code cleanup
This commit is contained in:
parent
bfbda9eb73
commit
84f0a31a20
6 changed files with 136 additions and 130 deletions
13
src/buffer.h
13
src/buffer.h
|
@ -61,7 +61,7 @@ protected:
|
|||
template<class TData> class CConvBuf
|
||||
{
|
||||
public:
|
||||
CConvBuf() {}
|
||||
CConvBuf() { Init ( 0 ); }
|
||||
virtual ~CConvBuf() {}
|
||||
|
||||
void Init ( const int iNewMemSize )
|
||||
|
@ -84,6 +84,11 @@ public:
|
|||
// copy new data in internal buffer
|
||||
int iCurPos = 0;
|
||||
const int iEnd = iPutPos + iVecSize;
|
||||
|
||||
// first check for buffer overrun
|
||||
if ( iEnd <= iMemSize )
|
||||
{
|
||||
// actual copy operation
|
||||
while ( iPutPos < iEnd )
|
||||
{
|
||||
vecsMemory[iPutPos++] = vecsData[iCurPos++];
|
||||
|
@ -92,6 +97,12 @@ public:
|
|||
// return "buffer is ready for readout" flag
|
||||
return ( iEnd == iMemSize );
|
||||
}
|
||||
else
|
||||
{
|
||||
// buffer overrun or not initialized, return "not ready"
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
CVector<TData> Get()
|
||||
{
|
||||
|
|
|
@ -31,7 +31,7 @@ CChannel::CChannel ( const bool bNIsServer ) :
|
|||
sName ( "" ),
|
||||
vecdGains ( USED_NUM_CHANNELS, (double) 1.0 ),
|
||||
bIsEnabled ( false ),
|
||||
iNetwFrameSizeFact ( 0 ),
|
||||
iNetwFrameSizeFact ( FRAME_SIZE_FACTOR_DEFAULT ),
|
||||
iNetwFrameSize ( 0 )
|
||||
{
|
||||
// initial value for connection time out counter, we calculate the total
|
||||
|
@ -45,6 +45,10 @@ CChannel::CChannel ( const bool bNIsServer ) :
|
|||
// init the socket buffer
|
||||
SetSockBufNumFrames ( DEF_NET_BUF_SIZE_NUM_BL );
|
||||
|
||||
// initialize cycle time variance measurement with defaults
|
||||
CycleTimeVariance.Init ( SYSTEM_BLOCK_FRAME_SAMPLES,
|
||||
SYSTEM_SAMPLE_RATE, TIME_MOV_AV_RESPONSE );
|
||||
|
||||
|
||||
// connections -------------------------------------------------------------
|
||||
QObject::connect ( &Protocol,
|
||||
|
@ -286,6 +290,9 @@ void CChannel::OnNetTranspPropsReceived ( CNetworkTransportProps NetworkTranspor
|
|||
// update socket buffer (the network block size is a multiple of the
|
||||
// minimum network frame size
|
||||
SockBuf.Init ( iNetwFrameSize, iCurSockBufNumFrames );
|
||||
|
||||
// init conversion buffer
|
||||
ConvBuf.Init ( iNetwFrameSize * iNetwFrameSizeFact );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -368,7 +375,10 @@ EPutDataStat CChannel::PutData ( const CVector<uint8_t>& vecbyData,
|
|||
eRet = PS_AUDIO_ERR;
|
||||
}
|
||||
|
||||
// update cycle time variance measurement
|
||||
// update cycle time variance measurement (this is only
|
||||
// used by the client so do not update for server channel)
|
||||
if ( !bIsServer )
|
||||
{
|
||||
|
||||
// TODO only update if time difference of received packets is below
|
||||
// a limit to avoid having short network troubles incorporated in the
|
||||
|
@ -376,6 +386,7 @@ EPutDataStat CChannel::PutData ( const CVector<uint8_t>& vecbyData,
|
|||
|
||||
CycleTimeVariance.Update();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// the protocol parsing failed and this was no audio block,
|
||||
|
|
|
@ -395,7 +395,10 @@ void CClient::ProcessAudioData ( CVector<int16_t>& vecsStereoSndCrd )
|
|||
|
||||
|
||||
// receive a new block
|
||||
if ( Channel.GetData ( vecbyNetwData ) == GS_BUFFER_OK )
|
||||
const bool bReceiveDataOk =
|
||||
( Channel.GetData ( vecbyNetwData ) == GS_BUFFER_OK );
|
||||
|
||||
if ( bReceiveDataOk )
|
||||
{
|
||||
PostWinMessage ( MS_JIT_BUF_GET, MUL_COL_LED_GREEN );
|
||||
}
|
||||
|
@ -404,48 +407,34 @@ void CClient::ProcessAudioData ( CVector<int16_t>& vecsStereoSndCrd )
|
|||
PostWinMessage ( MS_JIT_BUF_GET, MUL_COL_LED_RED );
|
||||
}
|
||||
|
||||
/*
|
||||
// TEST
|
||||
// fid=fopen('v.dat','r');x=fread(fid,'int16');fclose(fid);
|
||||
static FILE* pFileDelay = fopen("v.dat", "wb");
|
||||
short sData[2];
|
||||
for (i = 0; i < iMonoBlockSizeSam; i++)
|
||||
{
|
||||
sData[0] = (short) vecdNetwData[i];
|
||||
fwrite(&sData, size_t(2), size_t(1), pFileDelay);
|
||||
}
|
||||
fflush(pFileDelay);
|
||||
*/
|
||||
|
||||
// check if channel is connected
|
||||
if ( Channel.IsConnected() )
|
||||
{
|
||||
/*
|
||||
// convert data from double to short type and copy mono
|
||||
// received data in both sound card channels
|
||||
for ( i = 0, j = 0; i < iSndCrdMonoBlockSizeSam; i++, j += 2 )
|
||||
{
|
||||
vecsStereoSndCrd[j] = vecsStereoSndCrd[j + 1] =
|
||||
Double2Short ( vecdNetwData[i] );
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
// TEST CELT
|
||||
CVector<short> vecsAudioSndCrdMono ( iMonoBlockSizeSam );
|
||||
|
||||
// CELT decoding
|
||||
if ( bReceiveDataOk )
|
||||
{
|
||||
celt_decode ( CeltDecoder,
|
||||
&vecbyNetwData[0],
|
||||
iCeltNumCodedBytes,
|
||||
&vecsAudioSndCrdMono[0] );
|
||||
}
|
||||
else
|
||||
{
|
||||
// lost packet
|
||||
celt_decode ( CeltDecoder,
|
||||
NULL,
|
||||
iCeltNumCodedBytes,
|
||||
&vecsAudioSndCrdMono[0] );
|
||||
}
|
||||
|
||||
// copy mono data in stereo sound card buffer
|
||||
for ( i = 0, j = 0; i < iMonoBlockSizeSam; i++, j += 2 )
|
||||
{
|
||||
vecsStereoSndCrd[j] = vecsStereoSndCrd[j + 1] =
|
||||
vecsAudioSndCrdMono[i];
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
130
src/server.cpp
130
src/server.cpp
|
@ -187,11 +187,6 @@ CServer::CServer ( const QString& strLoggingFileName,
|
|||
CeltDecoder[i] = celt_decoder_create ( CeltMode[i] );
|
||||
}
|
||||
|
||||
// TODO init these variables:
|
||||
// iCeltNumCodedBytes[MAX_NUM_CHANNELS];
|
||||
// vecCeltData[MAX_NUM_CHANNELS];
|
||||
|
||||
|
||||
|
||||
// connections -------------------------------------------------------------
|
||||
// connect timer timeout signal
|
||||
|
@ -277,7 +272,7 @@ void CServer::OnSendProtMessage ( int iChID, CVector<uint8_t> vecMessage )
|
|||
{
|
||||
// the protocol queries me to call the function to send the message
|
||||
// send it through the network
|
||||
Socket.SendPacket ( vecMessage, GetAddress ( iChID ) );
|
||||
Socket.SendPacket ( vecMessage, vecChannels[iChID].GetAddress() );
|
||||
}
|
||||
|
||||
void CServer::Start()
|
||||
|
@ -322,26 +317,24 @@ void CServer::OnTimer()
|
|||
// actual processing of audio data -> mix
|
||||
vecsSendData = ProcessData ( vecvecsData, vecvecdGains[i] );
|
||||
|
||||
// send separate mix to current clients
|
||||
// Socket.SendPacket (
|
||||
// PrepSendPacket ( vecChanID[i], vecsSendData ),
|
||||
// GetAddress ( vecChanID[i] ) );
|
||||
|
||||
/*
|
||||
// get current number of CELT coded bytes
|
||||
const int iCeltNumCodedBytes =
|
||||
vecChannels[i].GetNetwFrameSize() /
|
||||
vecChannels[i].GetNetwFrameSizeFact();
|
||||
vecChannels[vecChanID[i]].GetNetwFrameSize() /
|
||||
vecChannels[vecChanID[i]].GetNetwFrameSizeFact();
|
||||
|
||||
celt_encode ( CeltEncoder,
|
||||
&vecsNetwork[0],
|
||||
// CELT encoding
|
||||
CVector<unsigned char> vecCeltData ( iCeltNumCodedBytes );
|
||||
|
||||
celt_encode ( CeltEncoder[vecChanID[i]],
|
||||
&vecsSendData[0],
|
||||
NULL,
|
||||
&vecCeltData[0],
|
||||
iCeltNumCodedBytes );
|
||||
|
||||
Socket.SendPacket ( vecCeltData, Channel.GetAddress() );
|
||||
*/
|
||||
|
||||
// send separate mix to current clients
|
||||
Socket.SendPacket (
|
||||
vecChannels[vecChanID[i]].PrepSendPacket ( vecCeltData ),
|
||||
vecChannels[vecChanID[i]].GetAddress() );
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -355,6 +348,42 @@ Socket.SendPacket ( vecCeltData, Channel.GetAddress() );
|
|||
CycleTimeVariance.Update();
|
||||
}
|
||||
|
||||
CVector<int16_t> CServer::ProcessData ( CVector<CVector<int16_t> >& vecvecsData,
|
||||
CVector<double>& vecdGains )
|
||||
{
|
||||
int i;
|
||||
|
||||
// init return vector with zeros since we mix all channels on that vector
|
||||
CVector<int16_t> vecsOutData ( SYSTEM_BLOCK_FRAME_SAMPLES, 0 );
|
||||
|
||||
const int iNumClients = vecvecsData.Size();
|
||||
|
||||
// mix all audio data from all clients together
|
||||
for ( int j = 0; j < iNumClients; j++ )
|
||||
{
|
||||
// if channel gain is 1, avoid multiplication for speed optimization
|
||||
if ( vecdGains[j] == static_cast<double> ( 1.0 ) )
|
||||
{
|
||||
for ( i = 0; i < SYSTEM_BLOCK_FRAME_SAMPLES; i++ )
|
||||
{
|
||||
vecsOutData[i] =
|
||||
Double2Short ( vecsOutData[i] + vecvecsData[j][i] );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for ( i = 0; i < SYSTEM_BLOCK_FRAME_SAMPLES; i++ )
|
||||
{
|
||||
vecsOutData[i] =
|
||||
Double2Short ( vecsOutData[i] +
|
||||
vecvecsData[j][i] * vecdGains[j] );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return vecsOutData;
|
||||
}
|
||||
|
||||
void CServer::GetBlockAllConC ( CVector<int>& vecChanID,
|
||||
CVector<CVector<int16_t> >& vecvecsData,
|
||||
CVector<CVector<double> >& vecvecdGains )
|
||||
|
@ -385,14 +414,6 @@ void CServer::GetBlockAllConC ( CVector<int>& vecChanID,
|
|||
// disconnected channels
|
||||
const EGetDataStat eGetStat = vecChannels[i].GetData ( vecbyData );
|
||||
|
||||
// CELT decode received data stream
|
||||
CVector<int16_t> vecsAudioMono ( SYSTEM_BLOCK_FRAME_SAMPLES );
|
||||
|
||||
celt_decode ( CeltDecoder[i],
|
||||
&vecbyData[0],
|
||||
iCeltNumCodedBytes,
|
||||
&vecsAudioMono[0] );
|
||||
|
||||
// if channel was just disconnected, set flag that connected
|
||||
// client list is sent to all other clients
|
||||
if ( eGetStat == GS_CHAN_NOW_DISCONNECTED )
|
||||
|
@ -402,6 +423,25 @@ void CServer::GetBlockAllConC ( CVector<int>& vecChanID,
|
|||
|
||||
if ( vecChannels[i].IsConnected() )
|
||||
{
|
||||
// CELT decode received data stream
|
||||
CVector<int16_t> vecsAudioMono ( SYSTEM_BLOCK_FRAME_SAMPLES );
|
||||
|
||||
if ( eGetStat == GS_BUFFER_OK )
|
||||
{
|
||||
celt_decode ( CeltDecoder[i],
|
||||
&vecbyData[0],
|
||||
iCeltNumCodedBytes,
|
||||
&vecsAudioMono[0] );
|
||||
}
|
||||
else
|
||||
{
|
||||
// lost packet
|
||||
celt_decode ( CeltDecoder[i],
|
||||
NULL,
|
||||
iCeltNumCodedBytes,
|
||||
&vecsAudioMono[0] );
|
||||
}
|
||||
|
||||
// add ID and data
|
||||
vecChanID.Add ( i );
|
||||
|
||||
|
@ -797,42 +837,6 @@ void CServer::WriteHTMLChannelList()
|
|||
streamFileOut << "</ul>" << endl;
|
||||
}
|
||||
|
||||
CVector<int16_t> CServer::ProcessData ( CVector<CVector<int16_t> >& vecvecsData,
|
||||
CVector<double>& vecdGains )
|
||||
{
|
||||
int i;
|
||||
|
||||
// init return vector with zeros since we mix all channels on that vector
|
||||
CVector<int16_t> vecsOutData ( SYSTEM_BLOCK_FRAME_SAMPLES, 0 );
|
||||
|
||||
const int iNumClients = vecvecsData.Size();
|
||||
|
||||
// mix all audio data from all clients together
|
||||
for ( int j = 0; j < iNumClients; j++ )
|
||||
{
|
||||
// if channel gain is 1, avoid multiplication for speed optimization
|
||||
if ( vecdGains[j] == static_cast<double> ( 1.0 ) )
|
||||
{
|
||||
for ( i = 0; i < SYSTEM_BLOCK_FRAME_SAMPLES; i++ )
|
||||
{
|
||||
vecsOutData[i] =
|
||||
Double2Short ( vecsOutData[i] + vecvecsData[j][i] );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for ( i = 0; i < SYSTEM_BLOCK_FRAME_SAMPLES; i++ )
|
||||
{
|
||||
vecsOutData[i] =
|
||||
Double2Short ( vecsOutData[i] +
|
||||
vecvecsData[j][i] * vecdGains[j] );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return vecsOutData;
|
||||
}
|
||||
|
||||
bool CServer::GetTimingStdDev ( double& dCurTiStdDev )
|
||||
{
|
||||
dCurTiStdDev = 0.0; // init return value
|
||||
|
|
|
@ -102,13 +102,6 @@ protected:
|
|||
bool IsConnected ( const int iChanNum )
|
||||
{ return vecChannels[iChanNum].IsConnected(); }
|
||||
|
||||
CVector<uint8_t> PrepSendPacket ( const int iChanNum,
|
||||
const CVector<uint8_t>& vecbyNPacket )
|
||||
{ return vecChannels[iChanNum].PrepSendPacket ( vecbyNPacket ); }
|
||||
|
||||
CHostAddress GetAddress ( const int iChanNum )
|
||||
{ return vecChannels[iChanNum].GetAddress(); }
|
||||
|
||||
void StartStatusHTMLFileWriting ( const QString& strNewFileName,
|
||||
const QString& strNewServerNameWithPort );
|
||||
|
||||
|
@ -139,8 +132,6 @@ protected:
|
|||
CELTMode* CeltMode[MAX_NUM_CHANNELS];
|
||||
CELTEncoder* CeltEncoder[MAX_NUM_CHANNELS];
|
||||
CELTDecoder* CeltDecoder[MAX_NUM_CHANNELS];
|
||||
int iCeltNumCodedBytes[MAX_NUM_CHANNELS];
|
||||
CVector<unsigned char> vecCeltData[MAX_NUM_CHANNELS];
|
||||
|
||||
CVector<QString> vstrChatColors;
|
||||
|
||||
|
|
Loading…
Reference in a new issue