/**************************************************************************** * @doc INTERNAL VDEVICEP * * @module VDeviceP.cpp | Source file for the * class used to implement a property page to test the , * as well as and 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 * 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; }