jitter buffer settings only allow settings for buffers larger than the network buffer block size
This commit is contained in:
parent
47f60d317e
commit
24680bbab4
4 changed files with 38 additions and 27 deletions
|
@ -294,11 +294,24 @@ void CChannel::SetSockBufSize ( const int iNumBlocks )
|
||||||
/* this opperation must be done with mutex */
|
/* this opperation must be done with mutex */
|
||||||
Mutex.lock ();
|
Mutex.lock ();
|
||||||
{
|
{
|
||||||
SockBuf.Init ( MIN_BLOCK_SIZE_SAMPLES, iNumBlocks );
|
// the idea of setting the jitter buffer is as follows:
|
||||||
|
// The network block size is a multiple of the internal minimal
|
||||||
|
// block size. Therefore, the minimum jitter buffer size must be
|
||||||
|
// so that it can take one network buffer -> NET_BLOCK_SIZE_FACTOR.
|
||||||
|
// The actual jitter compensation are then the additional blocks of
|
||||||
|
// the internal block size, which is set with SetSockBufSize
|
||||||
|
SockBuf.Init ( MIN_BLOCK_SIZE_SAMPLES,
|
||||||
|
iNumBlocks + NET_BLOCK_SIZE_FACTOR );
|
||||||
}
|
}
|
||||||
Mutex.unlock ();
|
Mutex.unlock ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int CChannel::GetSockBufSize()
|
||||||
|
{
|
||||||
|
// see comment in SetSockBufSize function
|
||||||
|
return SockBuf.GetSize() - NET_BLOCK_SIZE_FACTOR;
|
||||||
|
}
|
||||||
|
|
||||||
void CChannel::OnJittBufSizeChange ( int iNewJitBufSize )
|
void CChannel::OnJittBufSizeChange ( int iNewJitBufSize )
|
||||||
{
|
{
|
||||||
// TEST
|
// TEST
|
||||||
|
@ -325,9 +338,12 @@ EPutDataStat CChannel::PutData ( const CVector<unsigned char>& vecbyData,
|
||||||
int iNumBytes )
|
int iNumBytes )
|
||||||
{
|
{
|
||||||
EPutDataStat eRet = PS_GEN_ERROR;
|
EPutDataStat eRet = PS_GEN_ERROR;
|
||||||
|
bool bNewConnection = false;
|
||||||
|
|
||||||
/* only process if packet has correct size */
|
/* only process if packet has correct size */
|
||||||
if ( iNumBytes == iAudComprSizeIn )
|
if ( iNumBytes == iAudComprSizeIn )
|
||||||
|
{
|
||||||
|
Mutex.lock ();
|
||||||
{
|
{
|
||||||
/* decompress audio */
|
/* decompress audio */
|
||||||
CVector<short> vecsDecomprAudio ( AudioCompressionIn.Decode ( vecbyData ) );
|
CVector<short> vecsDecomprAudio ( AudioCompressionIn.Decode ( vecbyData ) );
|
||||||
|
@ -347,9 +363,6 @@ for ( int i = 0; i < iCurNetwInBlSiFact * MIN_BLOCK_SIZE_SAMPLES; i++ ) {
|
||||||
vecdResOutData[i] = (double) vecsDecomprAudio[i];
|
vecdResOutData[i] = (double) vecsDecomprAudio[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Mutex.lock (); /* put mutex lock */
|
|
||||||
{
|
|
||||||
if ( SockBuf.Put ( vecdResOutData ) )
|
if ( SockBuf.Put ( vecdResOutData ) )
|
||||||
{
|
{
|
||||||
eRet = PS_AUDIO_OK;
|
eRet = PS_AUDIO_OK;
|
||||||
|
@ -358,21 +371,14 @@ for ( int i = 0; i < iCurNetwInBlSiFact * MIN_BLOCK_SIZE_SAMPLES; i++ ) {
|
||||||
{
|
{
|
||||||
eRet = PS_AUDIO_ERR;
|
eRet = PS_AUDIO_ERR;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
Mutex.unlock (); /* put mutex unlock */
|
|
||||||
|
|
||||||
// check if channel was not connected
|
// check if channel was not connected, this is a new connection
|
||||||
const bool bChanWasNotConnected = !IsConnected();
|
bNewConnection = !IsConnected();
|
||||||
|
|
||||||
// reset time-out counter
|
// reset time-out counter
|
||||||
iConTimeOut = iConTimeOutStartVal;
|
iConTimeOut = iConTimeOutStartVal;
|
||||||
|
|
||||||
// if channel was not connected, emit signal to inform that new
|
|
||||||
// connection was established
|
|
||||||
if ( bChanWasNotConnected )
|
|
||||||
{
|
|
||||||
emit NewConnection();
|
|
||||||
}
|
}
|
||||||
|
Mutex.unlock ();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -391,6 +397,12 @@ for ( int i = 0; i < iCurNetwInBlSiFact * MIN_BLOCK_SIZE_SAMPLES; i++ ) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// inform other objects that new connection was established
|
||||||
|
if ( bNewConnection )
|
||||||
|
{
|
||||||
|
emit NewConnection();
|
||||||
|
}
|
||||||
|
|
||||||
return eRet;
|
return eRet;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -81,7 +81,7 @@ public:
|
||||||
CHostAddress GetAddress () { return InetAddr; }
|
CHostAddress GetAddress () { return InetAddr; }
|
||||||
|
|
||||||
void SetSockBufSize ( const int iNumBlocks );
|
void SetSockBufSize ( const int iNumBlocks );
|
||||||
int GetSockBufSize() { return SockBuf.GetSize(); }
|
int GetSockBufSize();
|
||||||
|
|
||||||
// network protocol interface
|
// network protocol interface
|
||||||
void CreateJitBufMes ( const int iJitBufSize )
|
void CreateJitBufMes ( const int iJitBufSize )
|
||||||
|
|
|
@ -72,8 +72,7 @@
|
||||||
#define NET_BLOCK_SIZE_FACTOR_MAX 10
|
#define NET_BLOCK_SIZE_FACTOR_MAX 10
|
||||||
|
|
||||||
/* maximum network buffer size (which can be chosen by slider) */
|
/* maximum network buffer size (which can be chosen by slider) */
|
||||||
#define MAX_NET_BUF_SIZE_NUM_BL 12 /* number of blocks */
|
#define MAX_NET_BUF_SIZE_NUM_BL 10 /* number of blocks */
|
||||||
#define MIN_NET_BUF_SIZE_NUM_BL NET_BLOCK_SIZE_FACTOR
|
|
||||||
|
|
||||||
/* default network buffer size */
|
/* default network buffer size */
|
||||||
#define DEF_NET_BUF_SIZE_NUM_BL 5 /* number of blocks */
|
#define DEF_NET_BUF_SIZE_NUM_BL 5 /* number of blocks */
|
||||||
|
|
|
@ -94,7 +94,7 @@ CLlconClientDlg::CLlconClientDlg ( CClient* pNCliP, QWidget* parent,
|
||||||
TextSndBufOut->setText("Out: " + QString().setNum(iCurNumOutBuf));
|
TextSndBufOut->setText("Out: " + QString().setNum(iCurNumOutBuf));
|
||||||
|
|
||||||
/* network buffer */
|
/* network buffer */
|
||||||
SliderNetBuf->setRange(MIN_NET_BUF_SIZE_NUM_BL, MAX_NET_BUF_SIZE_NUM_BL);
|
SliderNetBuf->setRange(0, MAX_NET_BUF_SIZE_NUM_BL);
|
||||||
const int iCurNumNetBuf = pClient->GetSockBufSize();
|
const int iCurNumNetBuf = pClient->GetSockBufSize();
|
||||||
SliderNetBuf->setValue(iCurNumNetBuf);
|
SliderNetBuf->setValue(iCurNumNetBuf);
|
||||||
TextNetBuf->setText("Size: " + QString().setNum(iCurNumNetBuf));
|
TextNetBuf->setText("Size: " + QString().setNum(iCurNumNetBuf));
|
||||||
|
|
Loading…
Reference in a new issue