loopelementbuffer.h
来自「这是G.723和G.729的音频编解码的源代码」· C头文件 代码 · 共 96 行
H
96 行
#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 + =
减小字号Ctrl + -
显示快捷键?