www.pudn.com > AVChat0926.rar > CFilterNetReceiver.cpp


// 
// CFilterNetReceiver.cpp 
// 
 
#include "stdafx.h" 
#include "GlobalDefs.h" 
#include  
#include "CFilterNetReceiver.h" 
 
#include  
 
// {58E6FA74-AEEA-4129-A1C3-79107B535C6F} 
DEFINE_GUID(CLSID_NetReceiver,  
0x58e6fa74, 0xaeea, 0x4129, 0xa1, 0xc3, 0x79, 0x10, 0x7b, 0x53, 0x5c, 0x6f); 
 
//////////////////////////////////////////////////////////////////////////// 
CFilterNetReceiver::CFilterNetReceiver(LPUNKNOWN punk, HRESULT *phr) :  
CBaseFilter(NAME("Reciever"), punk, &mFilterLock, CLSID_NetReceiver) 
{ 
	mOutPin  = new CNetOutPin(this, phr, L"Out"); 
	mIsVideo = TRUE; 
	mSample  = NULL; 
 
	mAudioBytesPerSecond = 0; 
	mLastSampleTime      = 0; 
 
	mReceiver.SetOwnerFilter(this); 
} 
 
CFilterNetReceiver::~CFilterNetReceiver() 
{ 
	mReceiver.StopReceiving(); 
	if (mSample) 
	{ 
		mSample->Release(); 
		mSample = NULL; 
	} 
 
	delete mOutPin; 
} 
 
int CFilterNetReceiver::GetPinCount() 
{ 
	return 1; 
} 
 
CBasePin * CFilterNetReceiver::GetPin(int n) 
{ 
	if (n == 0)  
	{ 
		return mOutPin; 
	} 
	else  
	{ 
		return NULL; 
	} 
} 
 
STDMETHODIMP CFilterNetReceiver::Stop() 
{ 
	CAutoLock lck(&mFilterLock); 
	// Stop receiving to exit blocking 
	mReceiver.StopReceiving(); 
	if (mSample) 
	{ 
		mSample->Release(); 
		mSample = NULL; 
	} 
 
	return CBaseFilter::Stop(); 
} 
 
void CFilterNetReceiver::SetAudioBytesPerSecond(long inBytes) 
{ 
	mAudioBytesPerSecond = inBytes; 
} 
 
BOOL CFilterNetReceiver::GetSampleBuffer(PBYTE * outBuffer) 
{ 
	if (mSample) 
	{ 
		mSample->Release(); 
		mSample = NULL; 
	} 
 
	HRESULT hr = mOutPin->GetDeliveryBuffer(&mSample,NULL,NULL,0); 
	if (mSample) 
	{ 
		mSample->GetPointer(outBuffer); 
	} 
	return SUCCEEDED(hr); 
} 
 
BOOL CFilterNetReceiver::DeliverHoldingSample(long inSampleSize) 
{ 
	if (mSample) 
	{ 
		mSample->SetActualDataLength(inSampleSize); 
		mSample->SetSyncPoint(TRUE); 
		if (mIsVideo) 
		{ 
			// Do not use time stamp for video 
			mSample->SetTime(NULL, NULL); 
		} 
		else 
		{ 
			REFERENCE_TIME rtStart = mLastSampleTime; 
			mLastSampleTime += (UNITS * inSampleSize / mAudioBytesPerSecond); 
			REFERENCE_TIME rtEnd   = mLastSampleTime; 
			mSample->SetTime(&rtStart, &rtEnd); 
		} 
 
		HRESULT hr = mOutPin->Deliver(mSample); 
		mSample->Release(); 
		mSample = NULL; 
		return SUCCEEDED(hr); 
	} 
	return TRUE; 
} 
 
// --- public methods --- 
void CFilterNetReceiver::SetupMediaType(long inType, char * inFormat, long inLength) 
{	 
	mIsVideo = FALSE; 
	mOutPin->SetupMediaType(inType, inFormat, inLength);	 
	// At last, notify the controller to build filter graph and running 
	//Broadcast(msg_MediaTypeReceived, &mIsVideo); 
} 
 
void CFilterNetReceiver::SetStreamSocket(SOCKET inSocket) 
{ 
	//mReceiver.Attach(inSocket); 
} 
 
void CFilterNetReceiver::SetReceivePort(WORD inPort) 
{ 
	mReceiver.SetLocalPort(inPort); 
} 
// If no data to receive, receiving will block 
void CFilterNetReceiver::StartReceiving() 
{ 
	mReceiver.StartReceiving(); 
}