You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
251 lines
8.4 KiB
251 lines
8.4 KiB
|
|
/****************************************************************************
|
|
* @doc INTERNAL VDEVICEP
|
|
*
|
|
* @module VDeviceP.cpp | Source file for the <c CVDeviceProperties>
|
|
* class used to implement a property page to test the <i ITVfwCaptureDialogs>,
|
|
* as well as <i ITAddress> and <ITStream> interfaces to select video
|
|
* capture devices.
|
|
***************************************************************************/
|
|
|
|
#include "Precomp.h"
|
|
|
|
extern HINSTANCE ghInst;
|
|
|
|
/****************************************************************************
|
|
* @doc INTERNAL CVDEVICEPMETHOD
|
|
*
|
|
* @mfunc HPROPSHEETPAGE | CVDeviceProperties | OnCreate | This
|
|
* method creates a new page for a property sheet.
|
|
*
|
|
* @rdesc Returns the handle to the new property sheet if successful, or
|
|
* NULL otherwise.
|
|
***************************************************************************/
|
|
HPROPSHEETPAGE CVDeviceProperties::OnCreate()
|
|
{
|
|
PROPSHEETPAGE psp;
|
|
|
|
psp.dwSize = sizeof(psp);
|
|
psp.dwFlags = PSP_USEREFPARENT;
|
|
psp.hInstance = ghInst;
|
|
psp.pszTemplate = MAKEINTRESOURCE(IDD_CaptureDeviceProperties);
|
|
psp.pfnDlgProc = BaseDlgProc;
|
|
psp.pcRefParent = 0;
|
|
psp.pfnCallback = (LPFNPSPCALLBACK)NULL;
|
|
psp.lParam = (LPARAM)this;
|
|
|
|
return CreatePropertySheetPage(&psp);
|
|
}
|
|
|
|
/****************************************************************************
|
|
* @doc INTERNAL CVDEVICEPMETHOD
|
|
*
|
|
* @mfunc void | CVDeviceProperties | CVDeviceProperties | This
|
|
* method is the constructor for the property page object. It simply
|
|
* calls the constructor of the property page base class.
|
|
*
|
|
* @rdesc Nada.
|
|
***************************************************************************/
|
|
CVDeviceProperties::CVDeviceProperties()
|
|
{
|
|
FX_ENTRY("CVDeviceProperties::CVDeviceProperties")
|
|
|
|
DbgLog((LOG_TRACE, DBG_LEVEL_TRACE_DETAILS, TEXT("%s: begin"), _fx_));
|
|
|
|
#if USE_VFW
|
|
m_pITVfwCaptureDialogs = NULL;
|
|
#endif
|
|
|
|
DbgLog((LOG_TRACE, DBG_LEVEL_TRACE_DETAILS, TEXT("%s: end"), _fx_));
|
|
}
|
|
|
|
/****************************************************************************
|
|
* @doc INTERNAL CVDEVICEPMETHOD
|
|
*
|
|
* @mfunc void | CVDeviceProperties | ~CVDeviceProperties | This
|
|
* method is the destructor for capture device property page. It
|
|
* simply calls the base class destructor.
|
|
*
|
|
* @rdesc Nada.
|
|
***************************************************************************/
|
|
CVDeviceProperties::~CVDeviceProperties()
|
|
{
|
|
FX_ENTRY("CVDeviceProperties::~CVDeviceProperties")
|
|
|
|
DbgLog((LOG_TRACE, DBG_LEVEL_TRACE_DETAILS, TEXT("%s: begin"), _fx_));
|
|
|
|
DbgLog((LOG_TRACE, DBG_LEVEL_TRACE_DETAILS, TEXT("%s: end"), _fx_));
|
|
}
|
|
|
|
/****************************************************************************
|
|
* @doc INTERNAL CVDEVICEPMETHOD
|
|
*
|
|
* @mfunc HRESULT | CVDeviceProperties | OnConnect | This
|
|
* method is called when the property page is connected to a TAPI object.
|
|
*
|
|
* @parm ITTerminal* | pITTerminal | Specifies a pointer to the <i ITTerminal>
|
|
* interface used to identify the capture device.
|
|
*
|
|
* @rdesc This method returns an HRESULT value that depends on the
|
|
* implementation of the interface. HRESULT can include one of the
|
|
* following standard constants, or other values not listed:
|
|
*
|
|
* @flag E_FAIL | Failure
|
|
* @flag E_POINTER | Null pointer argument
|
|
* @flag E_NOTIMPL | Method is not supported
|
|
* @flag NOERROR | No error
|
|
***************************************************************************/
|
|
HRESULT CVDeviceProperties::OnConnect(ITTerminal *pITTerminal)
|
|
{
|
|
HRESULT Hr = NOERROR;
|
|
|
|
FX_ENTRY("CVDeviceProperties::OnConnect")
|
|
|
|
DbgLog((LOG_TRACE, DBG_LEVEL_TRACE_DETAILS, TEXT("%s: begin"), _fx_));
|
|
|
|
// Validate input parameters
|
|
if (!pITTerminal)
|
|
{
|
|
DbgLog((LOG_ERROR, DBG_LEVEL_TRACE_FAILURES, TEXT("%s: ERROR: invalid input parameter"), _fx_));
|
|
Hr = E_POINTER;
|
|
goto MyExit;
|
|
}
|
|
|
|
#if USE_VFW
|
|
// Get the video VfW capture device interface
|
|
if (SUCCEEDED (Hr = pITTerminal->QueryInterface(&m_pITVfwCaptureDialogs)))
|
|
{
|
|
DbgLog((LOG_TRACE, DBG_LEVEL_TRACE_DETAILS, TEXT("%s: SUCCESS: m_pITVfwCaptureDialogs=0x%08lX"), _fx_, m_pITVfwCaptureDialogs));
|
|
}
|
|
else
|
|
{
|
|
m_pITVfwCaptureDialogs = NULL;
|
|
DbgLog((LOG_ERROR, DBG_LEVEL_TRACE_FAILURES, TEXT("%s: ERROR: IOCTL failed Hr=0x%08lX"), _fx_, Hr));
|
|
}
|
|
#endif
|
|
|
|
MyExit:
|
|
DbgLog((LOG_TRACE, DBG_LEVEL_TRACE_DETAILS, TEXT("%s: end"), _fx_));
|
|
return Hr;
|
|
}
|
|
|
|
/****************************************************************************
|
|
* @doc INTERNAL CVDEVICEPMETHOD
|
|
*
|
|
* @mfunc HRESULT | CVDeviceProperties | OnDisconnect | This
|
|
* method is called when the property page is disconnected from the owning
|
|
* filter.
|
|
*
|
|
* @rdesc This method returns an HRESULT value that depends on the
|
|
* implementation of the interface. HRESULT can include one of the
|
|
* following standard constants, or other values not listed:
|
|
*
|
|
* @flag NOERROR | No error
|
|
***************************************************************************/
|
|
HRESULT CVDeviceProperties::OnDisconnect()
|
|
{
|
|
FX_ENTRY("CVDeviceProperties::OnDisconnect")
|
|
|
|
DbgLog((LOG_TRACE, DBG_LEVEL_TRACE_DETAILS, TEXT("%s: begin"), _fx_));
|
|
|
|
#if USE_VFW
|
|
// Make sure the interface pointer is still valid
|
|
if (!m_pITVfwCaptureDialogs)
|
|
{
|
|
DbgLog((LOG_ERROR, DBG_LEVEL_TRACE_FAILURES, TEXT("%s: WARNING: already disconnected!"), _fx_));
|
|
}
|
|
else
|
|
{
|
|
// Release the interface
|
|
m_pITVfwCaptureDialogs->Release();
|
|
m_pITVfwCaptureDialogs = NULL;
|
|
DbgLog((LOG_TRACE, DBG_LEVEL_TRACE_DETAILS, TEXT("%s: SUCCESS: releasing m_pITVfwCaptureDialogs"), _fx_));
|
|
}
|
|
#endif
|
|
|
|
DbgLog((LOG_TRACE, DBG_LEVEL_TRACE_DETAILS, TEXT("%s: end"), _fx_));
|
|
return NOERROR;
|
|
}
|
|
|
|
/****************************************************************************
|
|
* @doc INTERNAL CVDEVICEPMETHOD
|
|
*
|
|
* @mfunc BOOL | CVDeviceProperties | BaseDlgProc | This
|
|
* method is called when a message is sent to the property page dialog box.
|
|
*
|
|
* @rdesc By default, returns the value returned by the Win32 DefWindowProc function.
|
|
***************************************************************************/
|
|
INT_PTR CALLBACK CVDeviceProperties::BaseDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
CVDeviceProperties *pSV = (CVDeviceProperties*)GetWindowLong(hDlg, DWL_USER);
|
|
|
|
int iNotify = HIWORD (wParam);
|
|
int j;
|
|
|
|
switch (uMsg)
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
LPPROPSHEETPAGE psp = (LPPROPSHEETPAGE)lParam;
|
|
pSV = (CVDeviceProperties*)psp->lParam;
|
|
pSV->m_hDlg = hDlg;
|
|
SetWindowLong(hDlg, DWL_USER, (LPARAM)pSV);
|
|
pSV->m_bInit = FALSE;
|
|
#if USE_VFW
|
|
EnableWindow(GetDlgItem(hDlg, IDC_Device_SourceDlg), (BOOL)(pSV->m_pITVfwCaptureDialogs && pSV->m_pITVfwCaptureDialogs->HasDialog(VfwCaptureDialog_Source) == S_OK));
|
|
EnableWindow(GetDlgItem(hDlg, IDC_Device_FormatDlg), (BOOL)(pSV->m_pITVfwCaptureDialogs && pSV->m_pITVfwCaptureDialogs->HasDialog(VfwCaptureDialog_Format) == S_OK));
|
|
EnableWindow(GetDlgItem(hDlg, IDC_Device_DisplayDlg), (BOOL)(pSV->m_pITVfwCaptureDialogs && pSV->m_pITVfwCaptureDialogs->HasDialog(VfwCaptureDialog_Display) == S_OK));
|
|
#endif
|
|
|
|
// Put some code here to enumerate the terminals and populate the dialog box
|
|
|
|
EnableWindow(GetDlgItem(hDlg, IDC_Device_Selection), FALSE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_CONTROL_DEFAULT), FALSE);
|
|
pSV->m_bInit = TRUE;
|
|
return TRUE;
|
|
}
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
if (pSV && pSV->m_bInit)
|
|
{
|
|
switch (LOWORD(wParam))
|
|
{
|
|
#if USE_VFW
|
|
case IDC_Device_SourceDlg:
|
|
if (pSV->m_pITVfwCaptureDialogs)
|
|
pSV->m_pITVfwCaptureDialogs->ShowDialog(VfwCaptureDialog_Source, hDlg);
|
|
break;
|
|
|
|
case IDC_Device_FormatDlg:
|
|
if (pSV->m_pITVfwCaptureDialogs)
|
|
pSV->m_pITVfwCaptureDialogs->ShowDialog(VfwCaptureDialog_Format, hDlg);
|
|
break;
|
|
|
|
case IDC_Device_DisplayDlg:
|
|
if (pSV->m_pITVfwCaptureDialogs)
|
|
pSV->m_pITVfwCaptureDialogs->ShowDialog(VfwCaptureDialog_Display, hDlg);
|
|
break;
|
|
#endif
|
|
|
|
case IDC_Device_Selection:
|
|
if (HIWORD(wParam) == CBN_SELCHANGE)
|
|
{
|
|
// Put some code to select a new terminal on the stream
|
|
|
|
PropSheet_Changed(GetParent(hDlg), hDlg);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
default:
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|