⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cchannel.h

📁 这是G.723和G.729的音频编解码的源代码
💻 H
字号:

//CChannel.h

#ifndef __CCHANNEL_H__
#define __CCHANNEL_H__

#include "afxmt.h"
#include "afxtempl.h"
#include "CByteBuffer.h"
#include "CPacker.h"

#define FS_VALID		1
#define FS_INVALID		0

typedef void ChannelCallBackFunc(BYTE* pFrame,int nLength,BOOL bFrameState,LPVOID lpUserData);
typedef ChannelCallBackFunc* PChannelCallBackFunc;

class CMultiplex;

//begin of class CPacket
class CPacket
{
	friend class CMultiplex;
	friend class CDemultiplex;

public:

	CPacket(BYTE* pPacket=NULL,int nLength=0);
	CPacket(const CPacket& Packet);
	virtual ~CPacket(){if(m_pPacket)delete m_pPacket;}

	CPacket& operator=(const CPacket& Packet);
	BYTE* m_pPacket;
	int m_nLength;	
};

inline CPacket::CPacket(BYTE* pPacket,int nLength)
{
	m_pPacket=new BYTE[nLength];
	CopyMemory(m_pPacket,pPacket,nLength);
	m_nLength=nLength;
}


//class CChannel
class CChannel
{
	friend class CMultiplex;
	friend class CDemultiplex;

protected:
	int m_nChannelNumber;	
	int m_nPriority;
	CCriticalSection m_LockSection;

public:
	CChannel(int nChannelNumber=0,int nPriority=8);
	//void Lock();//{m_LockSection.Lock();}
	//void Unlock(){m_LockSection.Unlock();}
	int GetChannelNumber(void);
	int GetChannelPriority(void);
};

inline int CChannel::GetChannelNumber(void)
{
//	Lock();
	CSingleLock sLock(&m_LockSection);
	sLock.Lock();
	int rv=m_nChannelNumber;
	//Unlock();
	return rv;
}

inline int CChannel::GetChannelPriority(void)
{
//	Lock();
	CSingleLock sLock(&m_LockSection);
	sLock.Lock();
	int rv=m_nPriority;
	//Unlock();
	return rv;
}
//class CSendChannel
class CSendChannel:public CChannel
{
	friend class CMultiplex;
	friend class CDemultiplex;

private:
	int m_nMaxPacketLength;
	int m_nMaxPackedPacketLength;
	BYTE* m_pbyPackedPacket;

	CList<CPacket,CPacket&> m_PacketList;

public:
	void ClearChannelData();
	CSendChannel(int nChannelNumber=0,int nPriority=8,int nMaxPacketLength=1024);

	virtual ~CSendChannel(){if(m_pbyPackedPacket)delete m_pbyPackedPacket;}

	BOOL SendData(BYTE* pbyFrame,int nFrameLength);
	int GetLength(void);
	int GetCount(void);
	CPacket GetPacket(int nPos);
	CPacket GetHead(void);
	CPacket  RemoveHead(void);
};


//class CReceiveChannel
class CReceiveChannel:public CChannel
{
	friend class CMultiplex;
	friend class CDemultiplex;

private:
	PChannelCallBackFunc m_pChannelCallBackFunc;
	int m_nMaxFrameLength;
	int m_nValidLength;
	BYTE* m_pFrameBuffer;
	LPVOID m_lpUserData;

public:
	CReceiveChannel(int nChannelNumber=0,int nPriority=8,int nMaxFrameLength=4096,
					PChannelCallBackFunc pChannelCallBackFunc=NULL);

	virtual ~CReceiveChannel(){if(m_pFrameBuffer)delete m_pFrameBuffer;}

	void InputPacket(BYTE* pbyData,int nLength,BOOL bIsEndPacket=FALSE);

	void Initialize(LPVOID lpUserData);
};

#endif//__CCHANNEL_H__

//end of CChannel.h

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -