certain bug fixes and code cleanup

This commit is contained in:
Volker Fischer 2009-08-11 09:10:23 +00:00
parent bfbda9eb73
commit 84f0a31a20
6 changed files with 136 additions and 130 deletions

View file

@ -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()
{

View file

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

View file

@ -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 )
CVector<short> vecsAudioSndCrdMono ( iMonoBlockSizeSam );
// CELT decoding
if ( bReceiveDataOk )
{
vecsStereoSndCrd[j] = vecsStereoSndCrd[j + 1] =
Double2Short ( vecdNetwData[i] );
}
*/
// TEST CELT
CVector<short> vecsAudioSndCrdMono ( iMonoBlockSizeSam );
celt_decode ( CeltDecoder,
celt_decode ( CeltDecoder,
&vecbyNetwData[0],
iCeltNumCodedBytes,
&vecsAudioSndCrdMono[0] );
}
else
{
// lost packet
celt_decode ( CeltDecoder,
NULL,
iCeltNumCodedBytes,
&vecsAudioSndCrdMono[0] );
}
for ( i = 0, j = 0; i < iMonoBlockSizeSam; i++, j += 2 )
{
// 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
{

View file

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

View file

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