www.pudn.com > AudioVideoCapture.rar > CVideoDevices.cpp
//
// CVideoDevices.cpp
//
/*-----------------------------------------------------*\
HQ Tech, Make Technology Easy!
More information, please go to http://hqtech.nease.net.
/*-----------------------------------------------------*/
#include "stdafx.h"
#include <streams.h>
#include "CVideoDevices.h"
#include "UDsUtils.h"
#include "CDeviceObserver.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
CVideoDevices * CVideoDevices::sDevices = NULL;
/////////////////////////////////////////////////////////////////////////
CVideoDevices::CVideoDevices()
{
mWindow = new CDeviceObserver();
mWindow->AddMsgReceiver(this);
mWindow->Create(0, "Devices", WS_POPUPWINDOW, CRect(0, 0, 2, 2), 0, 0);
Populate();
}
CVideoDevices::~CVideoDevices()
{
mWindow->DestroyWindow();
mList.RemoveAll();
}
CVideoDevices * CVideoDevices::Instance(void)
{
if (sDevices == NULL)
{
sDevices = new CVideoDevices();
}
return sDevices;
}
void CVideoDevices::Release(void)
{
if (sDevices)
{
delete sDevices;
sDevices = NULL;
}
}
void CVideoDevices::Populate(void)
{
mList.RemoveAll();
UDsUtils::QueryVideoCaptureDevices(mList);
}
BOOL CVideoDevices::FindDevice(const char * inDeviceName,
CDSDevice&amt; outDevice)
{
POSITION pos = mList.GetHeadPosition();
while (pos)
{
CDSDevice device = mList.GetNext(pos);
if (device.GetDeviceFriendlyName().Compare(inDeviceName) == 0)
{
outDevice = device;
return TRUE;
}
}
return FALSE;
}
// Given the display name of the device
BOOL CVideoDevices::AddDevice(const char * inDeviceName)
{
char friendlyName[1024];
IBaseFilter * pFilter = UDsUtils::CreateDevice(TRUE,
inDeviceName, friendlyName);
if (pFilter)
{
CDSDevice device;
device.SetDeviceDisplayName(inDeviceName);
device.SetDeviceFriendlyName(friendlyName);
device.SetDevideType(UDsUtils::DecideDeviceType(pFilter));
mList.AddTail(device);
pFilter->Release();
return TRUE;
}
return FALSE;
}
// Given the display name of the device
void CVideoDevices::RemoveDevice(const char * inDeviceName)
{
POSITION pos = mList.GetHeadPosition();
POSITION previousPos;
while (pos)
{
previousPos = pos; // Save for later use
CDSDevice device = mList.GetNext(pos);
if (UDsUtils::IsSameDevice(device.GetDeviceDisplayName(), inDeviceName))
{
mList.RemoveAt(previousPos);
break;
}
}
}
bool CVideoDevices::ReceiveMessage(MessageT inMessage,
void * ioParam,
void * ioParam2)
{
BOOL pass = TRUE;
switch (inMessage)
{
case msg_PnPDeviceAdded:
pass = AddDevice((const char *)ioParam);
break;
case msg_PnPDeviceRemoved:
// Wait for DirectShow processing...
Sleep(100);
RemoveDevice((const char *) ioParam);
break;
}
if (pass)
{
// Broadcast to the upper receiver to do sth. else
return Broadcast(inMessage, ioParam, ioParam2);
}
return true;
}