2006-01-28 12:29:22 +01:00
|
|
|
/******************************************************************************\
|
|
|
|
* Copyright (c) 2004-2006
|
|
|
|
*
|
|
|
|
* Author(s):
|
|
|
|
* Volker Fischer
|
|
|
|
*
|
|
|
|
******************************************************************************
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify it under
|
|
|
|
* the terms of the GNU General Public License as published by the Free Software
|
|
|
|
* Foundation; either version 2 of the License, or (at your option) any later
|
|
|
|
* version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
|
|
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
|
|
|
* details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License along with
|
|
|
|
* this program; if not, write to the Free Software Foundation, Inc.,
|
|
|
|
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
*
|
|
|
|
\******************************************************************************/
|
|
|
|
|
|
|
|
#if !defined(CHANNEL_HOIH9345KJH98_3_4344_BB23945IUHF1912__INCLUDED_)
|
|
|
|
#define CHANNEL_HOIH9345KJH98_3_4344_BB23945IUHF1912__INCLUDED_
|
|
|
|
|
|
|
|
#include <qthread.h>
|
2006-02-12 15:26:46 +01:00
|
|
|
#include <qdatetime.h>
|
2006-01-28 12:29:22 +01:00
|
|
|
#include "global.h"
|
|
|
|
#include "buffer.h"
|
|
|
|
#include "audiocompr.h"
|
|
|
|
#include "util.h"
|
2006-02-20 22:09:36 +01:00
|
|
|
#include "resample.h"
|
|
|
|
#include "protocol.h"
|
2006-01-28 12:29:22 +01:00
|
|
|
|
|
|
|
|
|
|
|
/* Definitions ****************************************************************/
|
|
|
|
/* Set the time-out for the input buffer until the state changes from
|
|
|
|
connected to not-connected (the actual time depends on the way the error
|
2006-02-18 14:36:55 +01:00
|
|
|
correction is implemented) */
|
|
|
|
#define CON_TIME_OUT_SEC_MAX 5 // seconds
|
2006-01-28 12:29:22 +01:00
|
|
|
|
2006-03-07 22:26:40 +01:00
|
|
|
/* maximum number of internet connections (channels) */
|
|
|
|
// if you want to change this paramter, change the connections in this class, too!
|
2006-02-18 14:36:55 +01:00
|
|
|
#define MAX_NUM_CHANNELS 10 /* max number channels for server */
|
2006-01-28 12:29:22 +01:00
|
|
|
|
|
|
|
/* no valid channel number */
|
2006-03-06 18:04:07 +01:00
|
|
|
#define INVALID_CHANNEL_ID (MAX_NUM_CHANNELS + 1)
|
|
|
|
|
|
|
|
enum EPutDataStat
|
|
|
|
{
|
|
|
|
PS_GEN_ERROR,
|
|
|
|
PS_AUDIO_OK,
|
|
|
|
PS_AUDIO_ERR,
|
|
|
|
PS_PROT_OK,
|
|
|
|
PS_PROT_ERR
|
2006-01-28 12:29:22 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2006-03-06 18:04:07 +01:00
|
|
|
/* Classes ********************************************************************/
|
2006-01-28 12:29:22 +01:00
|
|
|
/* CChannel ----------------------------------------------------------------- */
|
2006-02-26 11:50:47 +01:00
|
|
|
class CChannel : public QObject
|
|
|
|
{
|
|
|
|
Q_OBJECT
|
|
|
|
|
2006-01-28 12:29:22 +01:00
|
|
|
public:
|
2006-03-06 18:04:07 +01:00
|
|
|
CChannel();
|
|
|
|
virtual ~CChannel() {}
|
2006-02-26 11:50:47 +01:00
|
|
|
|
2006-03-06 18:04:07 +01:00
|
|
|
EPutDataStat PutData ( const CVector<unsigned char>& vecbyData,
|
|
|
|
int iNumBytes );
|
2006-02-26 11:50:47 +01:00
|
|
|
bool GetData ( CVector<double>& vecdData );
|
|
|
|
|
|
|
|
CVector<unsigned char> PrepSendPacket ( const CVector<short>& vecsNPacket );
|
|
|
|
|
2006-03-06 18:04:07 +01:00
|
|
|
bool IsConnected() const { return iConTimeOut > 0; }
|
2006-02-26 11:50:47 +01:00
|
|
|
|
|
|
|
void SetAddress ( const CHostAddress NAddr ) { InetAddr = NAddr; }
|
|
|
|
bool GetAddress ( CHostAddress& RetAddr );
|
|
|
|
CHostAddress GetAddress () { return InetAddr; }
|
2006-01-28 12:29:22 +01:00
|
|
|
|
2006-03-12 11:02:01 +01:00
|
|
|
void SetSockBufSize ( const int iNumBlocks );
|
2006-03-12 13:24:42 +01:00
|
|
|
int GetSockBufSize() { return iCurSockBufSize; }
|
2006-02-26 11:50:47 +01:00
|
|
|
|
2006-03-12 12:50:35 +01:00
|
|
|
void SetNetwBufSizeFact ( const int iNetNetwBlSiFact );
|
|
|
|
int GetNetwBufSizeFact() { return iCurNetwBlSiFact; }
|
|
|
|
|
2006-02-26 11:50:47 +01:00
|
|
|
// network protocol interface
|
2006-03-08 19:44:21 +01:00
|
|
|
void CreateJitBufMes ( const int iJitBufSize )
|
|
|
|
{
|
|
|
|
if ( IsConnected() )
|
|
|
|
{
|
|
|
|
Protocol.CreateJitBufMes ( iJitBufSize );
|
|
|
|
}
|
|
|
|
}
|
2006-03-07 22:26:40 +01:00
|
|
|
void CreateReqJitBufMes() { Protocol.CreateReqJitBufMes(); }
|
2006-02-26 11:50:47 +01:00
|
|
|
|
2006-03-12 12:50:35 +01:00
|
|
|
void CreateNetwBlSiFactMes ( const int iNetwBlSiFact )
|
|
|
|
{
|
|
|
|
if ( IsConnected() )
|
|
|
|
{
|
|
|
|
Protocol.CreateNetwBlSiFactMes ( iNetwBlSiFact );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2006-03-11 21:35:38 +01:00
|
|
|
protected:
|
|
|
|
void SetNetwInBlSiFact ( const int iNewBlockSizeFactor );
|
|
|
|
void SetNetwOutBlSiFact ( const int iNewBlockSizeFactor );
|
|
|
|
|
2006-01-28 12:29:22 +01:00
|
|
|
/* audio compression */
|
2006-03-11 21:35:38 +01:00
|
|
|
CAudioCompression AudioCompressionIn;
|
|
|
|
int iAudComprSizeIn;
|
|
|
|
CAudioCompression AudioCompressionOut;
|
|
|
|
int iAudComprSizeOut;
|
2006-01-28 12:29:22 +01:00
|
|
|
|
|
|
|
/* resampling */
|
2006-03-04 11:24:40 +01:00
|
|
|
CResample ResampleObj;
|
|
|
|
double dSamRateOffset;
|
|
|
|
CVector<double> vecdResInData;
|
|
|
|
CVector<double> vecdResOutData;
|
2006-01-28 12:29:22 +01:00
|
|
|
|
|
|
|
/* connection parameters */
|
2006-03-04 11:24:40 +01:00
|
|
|
CHostAddress InetAddr;
|
2006-01-28 12:29:22 +01:00
|
|
|
|
|
|
|
/* network jitter-buffer */
|
2006-03-04 11:24:40 +01:00
|
|
|
CNetBuf SockBuf;
|
2006-03-12 13:24:42 +01:00
|
|
|
int iCurSockBufSize;
|
2006-01-28 12:29:22 +01:00
|
|
|
|
|
|
|
/* network output conversion buffer */
|
2006-03-04 11:24:40 +01:00
|
|
|
CConvBuf ConvBuf;
|
2006-02-20 22:09:36 +01:00
|
|
|
|
2006-02-26 11:50:47 +01:00
|
|
|
// network protocol
|
2006-03-04 11:24:40 +01:00
|
|
|
CProtocol Protocol;
|
2006-01-28 12:29:22 +01:00
|
|
|
|
|
|
|
/* time stamp index counter */
|
2006-03-04 11:24:40 +01:00
|
|
|
Q_UINT8 byTimeStampIdxCnt;
|
|
|
|
int iTimeStampActCnt;
|
2006-01-28 12:29:22 +01:00
|
|
|
|
2006-03-11 21:35:38 +01:00
|
|
|
int iConTimeOut;
|
|
|
|
int iConTimeOutStartVal;
|
|
|
|
|
2006-03-12 12:50:35 +01:00
|
|
|
int iCurNetwInBlSiFact;
|
|
|
|
|
|
|
|
int iCurNetwBlSiFact; // TODO, will be replaced by in/out settings
|
2006-01-28 12:29:22 +01:00
|
|
|
|
2006-02-26 11:50:47 +01:00
|
|
|
QMutex Mutex;
|
|
|
|
|
2006-02-27 20:45:27 +01:00
|
|
|
public slots:
|
2006-03-04 11:24:40 +01:00
|
|
|
void OnSendProtMessage ( CVector<uint8_t> vecMessage );
|
2006-02-27 20:45:27 +01:00
|
|
|
void OnJittBufSizeChange ( int iNewJitBufSize );
|
2006-03-12 12:50:35 +01:00
|
|
|
void OnNetwBlSiFactChange ( int iNewNetwBlSiFact );
|
2006-02-27 20:45:27 +01:00
|
|
|
|
2006-02-26 11:50:47 +01:00
|
|
|
signals:
|
2006-03-01 20:46:44 +01:00
|
|
|
void MessReadyForSending ( CVector<uint8_t> vecMessage );
|
2006-03-06 18:04:07 +01:00
|
|
|
void NewConnection();
|
2006-03-07 22:26:40 +01:00
|
|
|
void ReqJittBufSize();
|
2006-01-28 12:29:22 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/* CChannelSet (for server) ------------------------------------------------- */
|
2006-03-04 12:11:26 +01:00
|
|
|
class CChannelSet : public QObject
|
|
|
|
{
|
|
|
|
Q_OBJECT
|
|
|
|
|
2006-01-28 12:29:22 +01:00
|
|
|
public:
|
2006-03-04 12:11:26 +01:00
|
|
|
CChannelSet();
|
2006-01-28 12:29:22 +01:00
|
|
|
virtual ~CChannelSet() {}
|
|
|
|
|
2006-03-06 18:04:07 +01:00
|
|
|
bool PutData ( const CVector<unsigned char>& vecbyRecBuf,
|
|
|
|
const int iNumBytesRead, const CHostAddress& HostAdr );
|
|
|
|
|
|
|
|
int GetFreeChan();
|
|
|
|
|
|
|
|
int CheckAddr ( const CHostAddress& Addr );
|
2006-01-28 12:29:22 +01:00
|
|
|
|
2006-03-06 18:04:07 +01:00
|
|
|
void GetBlockAllConC ( CVector<int>& vecChanID,
|
|
|
|
CVector<CVector<double> >& vecvecdData );
|
2006-01-28 12:29:22 +01:00
|
|
|
|
2006-03-06 18:04:07 +01:00
|
|
|
void GetConCliParam( CVector<CHostAddress>& vecHostAddresses,
|
|
|
|
CVector<int>& veciJitBufSize );
|
2006-01-28 12:29:22 +01:00
|
|
|
|
|
|
|
/* access functions for actual channels */
|
2006-03-06 18:04:07 +01:00
|
|
|
bool IsConnected ( const int iChanNum )
|
|
|
|
{ return vecChannels[iChanNum].IsConnected(); }
|
2006-01-28 12:29:22 +01:00
|
|
|
|
2006-03-06 18:04:07 +01:00
|
|
|
CVector<unsigned char> PrepSendPacket ( const int iChanNum,
|
|
|
|
const CVector<short>& vecsNPacket )
|
|
|
|
{ return vecChannels[iChanNum].PrepSendPacket ( vecsNPacket ); }
|
|
|
|
|
|
|
|
CHostAddress GetAddress ( const int iChanNum )
|
|
|
|
{ return vecChannels[iChanNum].GetAddress(); }
|
2006-01-28 12:29:22 +01:00
|
|
|
|
|
|
|
protected:
|
|
|
|
/* do not use the vector class since CChannel does not have appropriate
|
|
|
|
copy constructor/operator */
|
|
|
|
CChannel vecChannels[MAX_NUM_CHANNELS];
|
2006-03-04 12:11:26 +01:00
|
|
|
QMutex Mutex;
|
|
|
|
|
|
|
|
public slots:
|
2006-03-07 22:26:40 +01:00
|
|
|
// make sure we have MAX_NUM_CHANNELS connections!!!
|
|
|
|
// send message
|
|
|
|
void OnSendProtMessCh0(CVector<uint8_t> mess) {emit MessReadyForSending(0,mess);}
|
|
|
|
void OnSendProtMessCh1(CVector<uint8_t> mess) {emit MessReadyForSending(1,mess);}
|
|
|
|
void OnSendProtMessCh2(CVector<uint8_t> mess) {emit MessReadyForSending(2,mess);}
|
|
|
|
void OnSendProtMessCh3(CVector<uint8_t> mess) {emit MessReadyForSending(3,mess);}
|
|
|
|
void OnSendProtMessCh4(CVector<uint8_t> mess) {emit MessReadyForSending(4,mess);}
|
|
|
|
void OnSendProtMessCh5(CVector<uint8_t> mess) {emit MessReadyForSending(5,mess);}
|
|
|
|
void OnSendProtMessCh6(CVector<uint8_t> mess) {emit MessReadyForSending(6,mess);}
|
|
|
|
void OnSendProtMessCh7(CVector<uint8_t> mess) {emit MessReadyForSending(7,mess);}
|
|
|
|
void OnSendProtMessCh8(CVector<uint8_t> mess) {emit MessReadyForSending(8,mess);}
|
|
|
|
void OnSendProtMessCh9(CVector<uint8_t> mess) {emit MessReadyForSending(9,mess);}
|
|
|
|
|
2006-03-07 22:31:48 +01:00
|
|
|
void OnNewConnectionCh0() {vecChannels[0].CreateReqJitBufMes();}
|
|
|
|
void OnNewConnectionCh1() {vecChannels[1].CreateReqJitBufMes();}
|
|
|
|
void OnNewConnectionCh2() {vecChannels[2].CreateReqJitBufMes();}
|
|
|
|
void OnNewConnectionCh3() {vecChannels[3].CreateReqJitBufMes();}
|
|
|
|
void OnNewConnectionCh4() {vecChannels[4].CreateReqJitBufMes();}
|
|
|
|
void OnNewConnectionCh5() {vecChannels[5].CreateReqJitBufMes();}
|
|
|
|
void OnNewConnectionCh6() {vecChannels[6].CreateReqJitBufMes();}
|
|
|
|
void OnNewConnectionCh7() {vecChannels[7].CreateReqJitBufMes();}
|
|
|
|
void OnNewConnectionCh8() {vecChannels[8].CreateReqJitBufMes();}
|
|
|
|
void OnNewConnectionCh9() {vecChannels[9].CreateReqJitBufMes();}
|
2006-03-04 12:11:26 +01:00
|
|
|
|
|
|
|
signals:
|
|
|
|
void MessReadyForSending ( int iChID, CVector<uint8_t> vecMessage );
|
2006-01-28 12:29:22 +01:00
|
|
|
};
|
2006-03-06 18:04:07 +01:00
|
|
|
|
|
|
|
|
|
|
|
/* Sample rate offset estimation -------------------------------------------- */
|
|
|
|
class CSampleOffsetEst
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
CSampleOffsetEst() { Init(); }
|
|
|
|
virtual ~CSampleOffsetEst() {}
|
|
|
|
|
|
|
|
void Init();
|
|
|
|
void AddTimeStampIdx ( const int iTimeStampIdx );
|
|
|
|
double GetSamRate() { return dSamRateEst; }
|
|
|
|
|
|
|
|
protected:
|
|
|
|
QTime RefTime;
|
|
|
|
int iAccTiStVal;
|
|
|
|
double dSamRateEst;
|
|
|
|
CVector<long int> veciTimeElapsed;
|
|
|
|
CVector<long int> veciTiStIdx;
|
|
|
|
int iInitCnt;
|
|
|
|
};
|
2006-01-28 12:29:22 +01:00
|
|
|
|
|
|
|
|
|
|
|
#endif /* !defined(CHANNEL_HOIH9345KJH98_3_4344_BB23945IUHF1912__INCLUDED_) */
|