www.gusucode.com > VC++远程视频监控系统源代码-源码程序 > VC++远程视频监控系统源代码-源码程序/code/发送端/发送端/AV8Buffer.cpp

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// AV8Buffer.cpp

#include "stdafx.h"
#include "AV8Buffer.h"
#include "PlayView.h"
#include "winsock2.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

extern WSABUF stWSABuf;
extern HWND hWnd;



//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// CAV8Buffer()

CAV8Buffer::CAV8Buffer(DWORD dwBlock, DWORD dwByte)
{
	m_dwBlock = dwBlock;
	m_dwByte  = dwByte;

	m_pdwIndex  = (DWORD *)malloc(dwBlock * sizeof(DWORD));
	m_pdwLength = (DWORD *)malloc(dwBlock * sizeof(DWORD));
	m_pbFull    = (BOOL  *)malloc(dwBlock * sizeof(BOOL ));
	m_plpArray  = (LPSTR *)malloc(dwBlock * sizeof(LPSTR));

	for (DWORD dwIndex = 0; dwIndex < dwBlock; dwIndex++)
	{
		m_pdwIndex [dwIndex] = dwIndex;
		m_pdwLength[dwIndex] = 0;
		m_pbFull   [dwIndex] = FALSE;
		m_plpArray [dwIndex] = (LPSTR)malloc(dwByte * sizeof(char));
	}

	m_lEmptyBlock = -1;
	Flag = true;
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// ~CAV8Buffer()

CAV8Buffer::~CAV8Buffer()
{
	for (DWORD dwIndex = 0; dwIndex < m_dwBlock; dwIndex++)
		free(m_plpArray[dwIndex]);
	free(m_pdwIndex);
	free(m_pdwLength);
	free(m_pbFull);
	free(m_plpArray);
}


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// PushIn()

DWORD CAV8Buffer::PushIn(LPSTR lpData, DWORD dwLength)
{

	//查询缓冲队列中空块的位置
	if (m_lEmptyBlock < 0)
		m_lEmptyBlock = QueryEmpty(); 
	//空块的长度
    DWORD dwOldLength = m_pdwLength[m_lEmptyBlock];

	if (m_lEmptyBlock >= 0 && m_plpArray[m_lEmptyBlock])
	{
		memcpy((void *)(m_plpArray[m_lEmptyBlock] + dwOldLength), (const void *)lpData, min(dwLength, m_dwByte - dwOldLength));
		m_pdwLength[m_lEmptyBlock] += min(dwLength, m_dwByte - dwOldLength);

		if (m_pdwLength[m_lEmptyBlock] == m_dwByte)
		{
			m_pbFull[m_lEmptyBlock] = TRUE;
			OrderAll(m_lEmptyBlock);
			//缓冲区满,发送WM_READYSEND消息,启动数据发送线程
			if(Flag)
			  ::PostMessage(hWnd,WM_READYSEND,0,0);

			m_lEmptyBlock = -1;
		}

		if (dwLength > m_dwByte - dwOldLength)
			PushIn(lpData + (m_dwByte - dwOldLength), dwLength - (m_dwByte - dwOldLength));
	
		return min(dwLength, m_dwByte - dwOldLength);
	}

	return 0;
}			

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// PopOut()

DWORD CAV8Buffer::PopOut(LPSTR lpData, DWORD dwLength)
{
	for (DWORD dwIndex = 0; dwIndex < m_dwBlock; dwIndex++)
	{
		DWORD dwPopBlock = m_pdwIndex[dwIndex];
		DWORD dwOldLength = m_pdwLength[dwPopBlock];

		if (m_pbFull[dwPopBlock])
		{
			memcpy((void *)lpData, (const void *)m_plpArray[dwPopBlock], min(dwOldLength, dwLength));
			
			m_pdwLength[dwPopBlock] = 0;
			m_pbFull[dwPopBlock] = FALSE;
			
			return min(dwOldLength, dwLength);
		}
	}
			
	return 0;
}
	
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// ClearAll()

void CAV8Buffer::ClearAll()
{
	for (DWORD dwIndex = 0; dwIndex < m_dwBlock; dwIndex++)
	{
		m_pdwIndex [dwIndex] = dwIndex;
		m_pdwLength[dwIndex] = 0;
		m_pbFull   [dwIndex] = FALSE;
	}
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// QueryEmpty()

LONG CAV8Buffer::QueryEmpty()
{
	for (DWORD dwIndex = 0; dwIndex < m_dwBlock; dwIndex++)
		if (! m_pbFull[dwIndex])
			return (LONG)dwIndex;

	return -1;
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// OrderAll()

void CAV8Buffer::OrderAll(DWORD dwTheLast)
{
	for (DWORD dwIndex = 0; dwIndex < m_dwBlock; dwIndex++)
		if (m_pdwIndex[dwIndex] == dwTheLast)
				break;

	for (; dwIndex < m_dwBlock - 1; dwIndex++)
		m_pdwIndex[dwIndex] = m_pdwIndex[dwIndex + 1];
			
	m_pdwIndex[dwIndex] = dwTheLast;
}

// The End ///////////////////////////////////////////////////////////////////////////////////////////////////////////////