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

📄 cmultiplex.cpp

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



//CMultiplex.cpp

#include "stdafx.h"
#include <afxmt.h>
#include <afxtempl.h>
#include "CByteBuffer.h"
#include "CPacker.h"
#include "CChannel.h" 
#include "CMultiplex.h"

//begin of class CMultiplex

CMultiplex::CMultiplex()
{
	m_nTotalChannel=6;	
	pbValidChannel=new BOOL [m_nTotalChannel];
	m_nChannel=m_nTotalChannel;
	for(int i=0;i<m_nTotalChannel;i++)
		pChannelArray[i]=NULL;
}

CMultiplex::~CMultiplex()
{
	if(pbValidChannel)
		delete pbValidChannel;
}

BOOL CMultiplex::AddAChannel(CSendChannel* pSendChannel)
{
	if(!pSendChannel)return FALSE;

	int nNumber=pSendChannel->GetChannelNumber();

	if(nNumber>=0&&nNumber<m_nTotalChannel)
	{
		pChannelArray[nNumber]=pSendChannel;
		return TRUE;
	}
	return FALSE;
}

BOOL CMultiplex::DeleteAChannel(int nChannelNumber)
{
	if(nChannelNumber>=0&&nChannelNumber<=m_nTotalChannel)
	{
		pChannelArray[nChannelNumber]=NULL;
		return TRUE;
	}
	return FALSE;
}
/*
int CMultiplex::WhichChannel()
{
	static int nChannel=15;
	int rv=nChannel;

	nChannel--;
	if(nChannel<0)
		nChannel=15;

	return rv;
}
*/
/*
int CMultiplex::DetachStream(BYTE* pbyPacket,int nLength)
{	
	int nValidLength=0;

	for(int i=0;i<m_nTotalChannel;i++)
	{
		m_nChannel--;
		if(pChannelArray[m_nChannel]&&pChannelArray[m_nChannel]->GetCount())
		{		
			if(pChannelArray[m_nChannel]->GetHead().m_nLength+nValidLength>nLength)
			{
				if(nValidLength==0)
					pChannelArray[m_nChannel]->RemoveHead();
				
				if(m_nChannel==0)
					m_nChannel=m_nTotalChannel;

				return nValidLength;
			}
							
			CPacket Packet=pChannelArray[m_nChannel]->RemoveHead();
			CopyMemory(pbyPacket+nValidLength,Packet.m_pPacket,Packet.m_nLength);
			nValidLength+=Packet.m_nLength;
		}
		if(m_nChannel==0)
			m_nChannel=m_nTotalChannel;
	}
	return nValidLength;
}
*/
int CMultiplex::DetachStream(BYTE* pbyPacket,int nLength)
{	
	int nValidLength=0;
	for(int i=m_nTotalChannel-1;i>=0;i--)//from 1-4
	{
		//如果该通道有效且该通道中的packet的个数不为0
		if(pChannelArray[i]&&pChannelArray[i]->GetCount())
		{
			//发送pChannelArray[i]->m_nPriority个packet
			for(int j=0;j<=pChannelArray[i]->m_nPriority;j++)
			{					
				//pChannelArray[i]->GetHead().m_nLength----为第i个通道中某一个packet的长度
				//如果已经发送的BYTE数目超过所能发送的长度,则退出
				if(pChannelArray[i]->GetHead().m_nLength+nValidLength>nLength)
				{
					if(nValidLength==0)//无效packet
						pChannelArray[i]->RemoveHead();
					return nValidLength;
				}
			
				//将通道中的packet写入复接缓冲,最终pbyPacket中的内容将被写入硬件以发送出去
				CopyMemory(pbyPacket+nValidLength,pChannelArray[i]->GetHead().m_pPacket,pChannelArray[i]->GetHead().m_nLength);
				nValidLength+=pChannelArray[i]->GetHead().m_nLength;
				pChannelArray[i]->RemoveHead();//将通道中的packet删除,以准备发送下一个
			}
		}
	}
	return nValidLength;
}

int CMultiplex::GetLength(void)
{
	int nLength=0;
	for(int i=0;i<m_nTotalChannel;i++)
	{
		if(pChannelArray[i]!=NULL)
			nLength+=pChannelArray[i]->GetLength();	
	}
	return nLength;
}

⌨️ 快捷键说明

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