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

📄 loopelementbuffer.h

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

#ifndef __LOOPELEMENTBUFFER_H__
#define __LOOPELEMENTBUFFER_H__
#include <afxmt.h>

template <int nElementMaxSize,int nElementNum> 
class CLoopElementBuffer
{
	private:
		int m_nHeader;
		int m_nTail;
		int m_nValidNum;

		int m_nValidLength[nElementNum];
		char m_Buffer[nElementNum][nElementMaxSize];

		CCriticalSection m_Cri;

	public:
		CLoopElementBuffer();
		BOOL AppendTail(LPVOID pAElement,int nElementLength);
		BOOL DetachHeader(LPVOID pAElement,int * npLength);
		void Clear(){m_nTail=0;m_nTail=0;m_nValidNum=0;}
		int GetElementNum(void){return m_nValidNum;}
		BYTE* GetHeader(int * npLength);
		void  RemoveHeader();
		void Lock(void){m_Cri.Lock();}
		void Unlock(void){m_Cri.Unlock();}
};

template <int nElementMaxSize,int nElementNum> 
CLoopElementBuffer<nElementMaxSize,nElementNum>::
CLoopElementBuffer()
{
	m_nHeader=0;
	m_nTail=0;
	m_nValidNum=0;
}

template <int nElementMaxSize,int nElementNum> 
BOOL CLoopElementBuffer<nElementMaxSize,nElementNum>::
AppendTail(LPVOID pAElement,int nElementLength)
{
	CSingleLock sLock(&m_Cri);
	sLock.Lock();
	if(m_nValidNum>=nElementNum)
		return FALSE;

	m_nValidLength[m_nTail]=min(nElementLength,nElementMaxSize);
	CopyMemory(m_Buffer[m_nTail],pAElement,m_nValidLength[m_nTail]);
	m_nTail++;
	m_nValidNum++;
	m_nTail%=nElementNum;	
	return TRUE;
}

template <int nElementMaxSize,int nElementNum>
BOOL CLoopElementBuffer<nElementMaxSize,nElementNum>::
DetachHeader(LPVOID pAElement,int* pLength)
{
	CSingleLock sLock(&m_Cri);
	sLock.Lock();
	if(m_nValidNum==0)
		return FALSE;
	*pLength=m_nValidLength[m_nHeader];
	CopyMemory(pAElement,m_Buffer[m_nHeader],*pLength);
	m_nHeader++;
	m_nValidNum--;
	m_nHeader%=nElementNum;
	return TRUE;
}

template <int nElementMaxSize,int nElementNum>
BYTE* CLoopElementBuffer<nElementMaxSize,nElementNum>::
GetHeader(int * npLength)
{
	if(m_nValidNum==0)
		return FALSE;
	*pLength=m_nValidLength[m_nHeader];
	return m_Buffer[m_nHeader];
}

template <int nElementMaxSize,int nElementNum>
void CLoopElementBuffer<nElementMaxSize,nElementNum>::
RemoveHeader()
{
	CSingleLock sLock(&m_Cri);
	sLock.Lock();
	if(m_nValidNum==0)	return ;	
	m_nHeader++;
	m_nValidNum--;
	m_nHeader%=nElementNum;
	return ;
}

#endif// __LOOPELEMENTBUFFER_H__

⌨️ 快捷键说明

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