From: Johannes Anderwald Date: Thu, 25 Feb 2010 16:14:54 +0000 (+0000) Subject: [BDAPLGIN] X-Git-Tag: ReactOS-0.3.11-CLT2010~8^2~79 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=2896cc1cf3c63f5bf828417c8f0638aeb48a7a36;hp=04cd460d8006d3ab41bd9e684c4b0c6868202f5e [BDAPLGIN] - Simply construction of CBDAFrequencyFilter, CBDALNBInfo, CBDASignalStatistics - Find IBDA_NetworkProvider in filter graph - Check for IBaseFilter interface when constructing the CBDADeviceControl object svn path=/trunk/; revision=45681 --- diff --git a/reactos/dll/directx/bdaplgin/controlnode.cpp b/reactos/dll/directx/bdaplgin/controlnode.cpp index 53d36491d24..fb371d00eba 100644 --- a/reactos/dll/directx/bdaplgin/controlnode.cpp +++ b/reactos/dll/directx/bdaplgin/controlnode.cpp @@ -31,12 +31,12 @@ public: return m_Ref; } - CControlNode(IUnknown * pUnkOuter, ULONG NodeType, ULONG PinId) : m_Ref(0), m_pUnkOuter(pUnkOuter), m_NodeType(NodeType), m_PinId(PinId){}; + CControlNode(HANDLE hFile, ULONG NodeType, ULONG PinId) : m_Ref(0), m_hFile(hFile), m_NodeType(NodeType), m_PinId(PinId){}; virtual ~CControlNode(){}; protected: LONG m_Ref; - IUnknown * m_pUnkOuter; + HANDLE m_hFile; ULONG m_NodeType; ULONG m_PinId; }; @@ -60,24 +60,21 @@ CControlNode::QueryInterface( } else if(IsEqualGUID(refiid, IID_IBDA_FrequencyFilter)) { - return CBDAFrequencyFilter_fnConstructor(m_pUnkOuter, refiid, Output); + return CBDAFrequencyFilter_fnConstructor(m_hFile, refiid, Output); } else if(IsEqualGUID(refiid, IID_IBDA_SignalStatistics)) { - return CBDASignalStatistics_fnConstructor(m_pUnkOuter, refiid, Output); + return CBDASignalStatistics_fnConstructor(m_hFile, refiid, Output); } else if(IsEqualGUID(refiid, IID_IBDA_LNBInfo)) { - return CBDALNBInfo_fnConstructor(m_pUnkOuter, refiid, Output); + return CBDALNBInfo_fnConstructor(m_hFile, refiid, Output); } else if(IsEqualGUID(refiid, IID_IBDA_DigitalDemodulator)) { - return CBDADigitalDemodulator_fnConstructor(m_pUnkOuter, refiid, Output); + return CBDADigitalDemodulator_fnConstructor(m_hFile, refiid, Output); } - - - StringFromCLSID(refiid, &lpstr); swprintf(Buffer, L"CControlNode::QueryInterface: NoInterface for %s", lpstr); OutputDebugStringW(Buffer); @@ -90,17 +87,14 @@ CControlNode::QueryInterface( HRESULT WINAPI CControlNode_fnConstructor( - IUnknown * pUnkOuter, + HANDLE hFile, ULONG NodeType, ULONG PinId, REFIID riid, LPVOID * ppv) { - // sanity check - assert(pUnkOuter); - // construct device control - CControlNode * handler = new CControlNode(pUnkOuter, NodeType, PinId); + CControlNode * handler = new CControlNode(hFile, NodeType, PinId); OutputDebugStringW(L"CControlNode_fnConstructor\n"); diff --git a/reactos/dll/directx/bdaplgin/devicecontrol.cpp b/reactos/dll/directx/bdaplgin/devicecontrol.cpp index 8b224c3a936..e64b83268c6 100644 --- a/reactos/dll/directx/bdaplgin/devicecontrol.cpp +++ b/reactos/dll/directx/bdaplgin/devicecontrol.cpp @@ -21,6 +21,8 @@ const GUID IID_IBDA_Topology = {0x79B56888, 0x7FEA, 0x4690, {0xB4, 0x5D, 0x const GUID IID_IKsObject = {0x423c13a2, 0x2070, 0x11d0, {0x9e, 0xf7, 0x00, 0xaa, 0x00, 0xa2, 0x16, 0xa1}}; const GUID KSPROPSETID_BdaTopology = {0xa14ee835, 0x0a23, 0x11d3, {0x9c, 0xc7, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0}}; const GUID KSMETHODSETID_BdaDeviceConfiguration = {0x71985f45, 0x1ca1, 0x11d3, {0x9c, 0xc8, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0}}; +const GUID IID_IBaseFilter = {0x56a86895, 0x0ad4, 0x11ce, {0xb0,0x3a, 0x00,0x20,0xaf,0x0b,0xa7,0x70}}; + class CBDADeviceControl : public IBDA_DeviceControl, public IBDA_Topology @@ -103,7 +105,7 @@ CBDADeviceControl::QueryInterface( reinterpret_cast(*Output)->AddRef(); return NOERROR; } -#if 0 + if (IsEqualIID(refiid, IID_IDistributorNotify)) { OutputDebugStringW(L"CBDADeviceControl::QueryInterface: No IDistributorNotify interface\n"); @@ -118,10 +120,8 @@ CBDADeviceControl::QueryInterface( if (IsEqualGUID(refiid, IID_IBDA_NetworkProvider)) { - HRESULT hr = CoCreateInstance(CLSID_DVBTNetworkProvider, 0, CLSCTX_INPROC, IID_IBDA_NetworkProvider, (void**)Output); - swprintf(Buffer, L"CBDADeviceControl::QueryInterface: failed to construct IID_IBDA_NetworkProvider interface with %lx", hr); - OutputDebugStringW(Buffer); - return hr; + OutputDebugStringW(L"CBDADeviceControl::QueryInterface: No IID_IBDA_NetworkProvider interface\n"); + return E_NOINTERFACE; } if (IsEqualGUID(refiid, IID_IMatrixMixer)) @@ -141,7 +141,6 @@ CBDADeviceControl::QueryInterface( OutputDebugStringW(L"CBDADeviceControl::QueryInterface: No IID_IAC3Filter interface\n"); return E_NOINTERFACE; } -#endif StringFromCLSID(refiid, &lpstr); swprintf(Buffer, L"CBDADeviceControl::QueryInterface: NoInterface for %s", lpstr); @@ -385,7 +384,7 @@ CBDADeviceControl::GetControlNode(ULONG ulInputPinId, ULONG ulOutputPinId, ULONG if (FAILED(hr)) return hr; - hr = CControlNode_fnConstructor(m_pUnkOuter, ulNodeType, PinId, IID_IUnknown, (LPVOID*)ppControlNode); + hr = CControlNode_fnConstructor(m_Handle, ulNodeType, PinId, IID_IUnknown, (LPVOID*)ppControlNode); swprintf(Buffer, L"CBDADeviceControl::GetControlNode: hr %lx\n", hr); OutputDebugStringW(Buffer); @@ -401,6 +400,7 @@ CBDADeviceControl_fnConstructor( { HRESULT hr; IKsObject *pObject = NULL; + IBaseFilter *pFilter = NULL; HANDLE hFile; // sanity check @@ -409,9 +409,22 @@ CBDADeviceControl_fnConstructor( // query for IKsObject hr = pUnkOuter->QueryInterface(IID_IKsObject, (void**)&pObject); + if (FAILED(hr)) + return E_NOINTERFACE; + // sanity check assert(hr == NOERROR); + // query for IBaseFilter interface support + hr = pUnkOuter->QueryInterface(IID_IBaseFilter, (void**)&pFilter); + + if (FAILED(hr)) + { + // release + pObject->Release(); + return E_NOINTERFACE; + } + // another sanity check assert(pObject != NULL); diff --git a/reactos/dll/directx/bdaplgin/digitaldemo.cpp b/reactos/dll/directx/bdaplgin/digitaldemo.cpp index e8b54975827..f70bd1c9e1f 100644 --- a/reactos/dll/directx/bdaplgin/digitaldemo.cpp +++ b/reactos/dll/directx/bdaplgin/digitaldemo.cpp @@ -206,35 +206,10 @@ CBDADigitalDemodulator::get_SpectralInversion(SpectralInversion *pSpectralInvers HRESULT WINAPI CBDADigitalDemodulator_fnConstructor( - IUnknown * pUnkOuter, + HANDLE hFile, REFIID riid, LPVOID * ppv) { - HRESULT hr; - IKsObject *pObject = NULL; - HANDLE hFile; - - // sanity check - assert(pUnkOuter); - - // query for IKsObject - hr = pUnkOuter->QueryInterface(IID_IKsObject, (void**)&pObject); - - // sanity check - assert(hr == NOERROR); - - // another sanity check - assert(pObject != NULL); - - // get file handle - hFile = pObject->KsGetObjectHandle(); - - // one more sanity check - assert(hFile != NULL && hFile != INVALID_HANDLE_VALUE); - - // release IKsObject interface - pObject->Release(); - // construct device control CBDADigitalDemodulator * handler = new CBDADigitalDemodulator(hFile); diff --git a/reactos/dll/directx/bdaplgin/frequencyfilter.cpp b/reactos/dll/directx/bdaplgin/frequencyfilter.cpp index f0fe1b9c183..8ccb5f72513 100644 --- a/reactos/dll/directx/bdaplgin/frequencyfilter.cpp +++ b/reactos/dll/directx/bdaplgin/frequencyfilter.cpp @@ -185,35 +185,10 @@ CBDAFrequencyFilter::get_FrequencyMultiplier(ULONG *pulMultiplier) HRESULT WINAPI CBDAFrequencyFilter_fnConstructor( - IUnknown * pUnkOuter, + HANDLE hFile, REFIID riid, LPVOID * ppv) { - HRESULT hr; - IKsObject *pObject = NULL; - HANDLE hFile; - - // sanity check - assert(pUnkOuter); - - // query for IKsObject - hr = pUnkOuter->QueryInterface(IID_IKsObject, (void**)&pObject); - - // sanity check - assert(hr == NOERROR); - - // another sanity check - assert(pObject != NULL); - - // get file handle - hFile = pObject->KsGetObjectHandle(); - - // one more sanity check - assert(hFile != NULL && hFile != INVALID_HANDLE_VALUE); - - // release IKsObject interface - pObject->Release(); - // construct device control CBDAFrequencyFilter * handler = new CBDAFrequencyFilter(hFile); diff --git a/reactos/dll/directx/bdaplgin/lnbinfo.cpp b/reactos/dll/directx/bdaplgin/lnbinfo.cpp index 0d17f4fb210..575619876f2 100644 --- a/reactos/dll/directx/bdaplgin/lnbinfo.cpp +++ b/reactos/dll/directx/bdaplgin/lnbinfo.cpp @@ -133,35 +133,10 @@ CBDALNBInfo::get_HighLowSwitchFrequency(ULONG *pulSwitchFrequency) HRESULT WINAPI CBDALNBInfo_fnConstructor( - IUnknown * pUnkOuter, + HANDLE hFile, REFIID riid, LPVOID * ppv) { - HRESULT hr; - IKsObject *pObject = NULL; - HANDLE hFile; - - // sanity check - assert(pUnkOuter); - - // query for IKsObject - hr = pUnkOuter->QueryInterface(IID_IKsObject, (void**)&pObject); - - // sanity check - assert(hr == NOERROR); - - // another sanity check - assert(pObject != NULL); - - // get file handle - hFile = pObject->KsGetObjectHandle(); - - // one more sanity check - assert(hFile != NULL && hFile != INVALID_HANDLE_VALUE); - - // release IKsObject interface - pObject->Release(); - // construct device control CBDALNBInfo * handler = new CBDALNBInfo(hFile); diff --git a/reactos/dll/directx/bdaplgin/pincontrol.cpp b/reactos/dll/directx/bdaplgin/pincontrol.cpp index 8117fe78c2b..68114208a01 100644 --- a/reactos/dll/directx/bdaplgin/pincontrol.cpp +++ b/reactos/dll/directx/bdaplgin/pincontrol.cpp @@ -10,6 +10,7 @@ #include "precomp.h" const GUID IID_IBDA_PinControl = {0x0DED49D5, 0xA8B7, 0x4d5d, {0x97, 0xA1, 0x12, 0xB0, 0xC1, 0x95, 0x87, 0x4D}}; +const GUID IID_IPin = {0x56a86891, 0x0ad4, 0x11ce, {0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70}}; class CBDAPinControl : public IBDA_PinControl { @@ -38,13 +39,14 @@ public: HRESULT STDMETHODCALLTYPE RegistrationContext(ULONG *pulRegistrationCtx); - CBDAPinControl(HANDLE hFile) : m_Ref(0), m_Handle(hFile){}; + CBDAPinControl(HANDLE hFile, IBDA_NetworkProvider * pProvider, IPin * pConnectedPin) : m_Ref(0), m_Handle(hFile), m_pProvider(pProvider), m_pConnectedPin(pConnectedPin){}; virtual ~CBDAPinControl(){}; protected: LONG m_Ref; HANDLE m_Handle; - + IBDA_NetworkProvider * m_pProvider; + IPin * m_pConnectedPin; }; HRESULT @@ -53,9 +55,6 @@ CBDAPinControl::QueryInterface( IN REFIID refiid, OUT PVOID* Output) { - WCHAR Buffer[MAX_PATH]; - LPOLESTR lpstr; - if (IsEqualGUID(refiid, IID_IUnknown)) { *Output = PVOID(this); @@ -69,10 +68,6 @@ CBDAPinControl::QueryInterface( return NOERROR; } - StringFromCLSID(refiid, &lpstr); - swprintf(Buffer, L"CBDADeviceControl::QueryInterface: NoInterface for %s", lpstr); - OutputDebugStringW(Buffer); - CoTaskMemFree(lpstr); return E_NOINTERFACE; } //------------------------------------------------------------------- @@ -109,7 +104,121 @@ CBDAPinControl_fnConstructor( REFIID riid, LPVOID * ppv) { - CBDAPinControl * handler = new CBDAPinControl(NULL); + HRESULT hr; + IKsObject * pObject = NULL; + IPin * pPin = NULL, * pConnectedPin = NULL; + IEnumFilters *pEnumFilters = NULL; + IBDA_NetworkProvider * pNetworkProvider = NULL; + IBaseFilter * ppFilter[1]; + PIN_INFO PinInfo; + FILTER_INFO FilterInfo; + HANDLE hFile = INVALID_HANDLE_VALUE; + + if (!pUnkOuter) + return E_POINTER; + + // query for IKsObject interface + hr = pUnkOuter->QueryInterface(IID_IKsObject, (void**)&pObject); + + if (FAILED(hr)) + return hr; + + // query for IPin interface + hr = pObject->QueryInterface(IID_IPin, (void**)&pPin); + + if (FAILED(hr)) + { + //clean up + pObject->Release(); + return hr; + } + + // get pin info + hr = pPin->QueryPinInfo(&PinInfo); + + if (FAILED(hr)) + { + //clean up + pObject->Release(); + pPin->Release(); + return hr; + } + + // sanity checks + assert(PinInfo.dir == PINDIR_OUTPUT); + assert(PinInfo.pFilter != NULL); + + // query filter info + hr = PinInfo.pFilter->QueryFilterInfo(&FilterInfo); + + // sanity check + assert(FilterInfo.pGraph != NULL); + + // get IEnumFilters interface + hr = FilterInfo.pGraph->EnumFilters(&pEnumFilters); + + if (FAILED(hr)) + { + //clean up + FilterInfo.pGraph->Release(); + PinInfo.pFilter->Release(); + pObject->Release(); + pPin->Release(); + return hr; + } + + while(pEnumFilters->Next(1, ppFilter, NULL) == S_OK) + { + // check if that filter supports the IBDA_NetworkProvider interface + hr = ppFilter[0]->QueryInterface(IID_IBDA_NetworkProvider, (void**)&pNetworkProvider); + + // release IBaseFilter + ppFilter[0]->Release(); + + if (SUCCEEDED(hr)) + break; + } + + // release IEnumFilters interface + pEnumFilters->Release(); + + // release IFilterGraph interface + FilterInfo.pGraph->Release(); + + // release IBaseFilter interface + PinInfo.pFilter->Release(); + + if (pNetworkProvider) + { + // get connected pin handle + hr = pPin->ConnectedTo(&pConnectedPin); + + // get file handle + hFile = pObject->KsGetObjectHandle(); + + if (FAILED(hr) || hFile == INVALID_HANDLE_VALUE) + { + // pin not connected + pNetworkProvider->Release(); + // set zero + pNetworkProvider = NULL; + } + } + + // release IPin + pPin->Release(); + + // release IKsObject + pObject->Release(); + + + if (pNetworkProvider == NULL) + { + // no network provider interface in graph + return E_NOINTERFACE; + } + + CBDAPinControl * handler = new CBDAPinControl(hFile, pNetworkProvider, pConnectedPin); OutputDebugStringW(L"CBDAPinControl_fnConstructor"); @@ -124,4 +233,4 @@ CBDAPinControl_fnConstructor( } return NOERROR; -} \ No newline at end of file +} diff --git a/reactos/dll/directx/bdaplgin/precomp.h b/reactos/dll/directx/bdaplgin/precomp.h index 1fd67caae04..109fd85fb4d 100644 --- a/reactos/dll/directx/bdaplgin/precomp.h +++ b/reactos/dll/directx/bdaplgin/precomp.h @@ -54,7 +54,7 @@ CBDAPinControl_fnConstructor( HRESULT WINAPI CControlNode_fnConstructor( - IUnknown * pUnkOuter, + HANDLE hFile, ULONG NodeType, ULONG PinId, REFIID riid, @@ -65,7 +65,7 @@ CControlNode_fnConstructor( HRESULT WINAPI CBDAFrequencyFilter_fnConstructor( - IUnknown * pUnkOuter, + HANDLE hFile, REFIID riid, LPVOID * ppv); @@ -74,7 +74,7 @@ CBDAFrequencyFilter_fnConstructor( HRESULT WINAPI CBDASignalStatistics_fnConstructor( - IUnknown * pUnkOuter, + HANDLE hFile, REFIID riid, LPVOID * ppv); @@ -83,7 +83,7 @@ CBDASignalStatistics_fnConstructor( HRESULT WINAPI CBDALNBInfo_fnConstructor( - IUnknown * pUnkOuter, + HANDLE hFile, REFIID riid, LPVOID * ppv); @@ -91,7 +91,7 @@ CBDALNBInfo_fnConstructor( HRESULT WINAPI CBDADigitalDemodulator_fnConstructor( - IUnknown * pUnkOuter, + HANDLE hFile, REFIID riid, LPVOID * ppv); diff --git a/reactos/dll/directx/bdaplgin/signalstatistics.cpp b/reactos/dll/directx/bdaplgin/signalstatistics.cpp index 62f80b6ede1..c4602924041 100644 --- a/reactos/dll/directx/bdaplgin/signalstatistics.cpp +++ b/reactos/dll/directx/bdaplgin/signalstatistics.cpp @@ -169,35 +169,10 @@ CBDASignalStatistics::get_SampleTime(LONG *plmsSampleTime) HRESULT WINAPI CBDASignalStatistics_fnConstructor( - IUnknown * pUnkOuter, + HANDLE hFile, REFIID riid, LPVOID * ppv) { - HRESULT hr; - IKsObject *pObject = NULL; - HANDLE hFile; - - // sanity check - assert(pUnkOuter); - - // query for IKsObject - hr = pUnkOuter->QueryInterface(IID_IKsObject, (void**)&pObject); - - // sanity check - assert(hr == NOERROR); - - // another sanity check - assert(pObject != NULL); - - // get file handle - hFile = pObject->KsGetObjectHandle(); - - // one more sanity check - assert(hFile != NULL && hFile != INVALID_HANDLE_VALUE); - - // release IKsObject interface - pObject->Release(); - // construct device control CBDASignalStatistics * handler = new CBDASignalStatistics(hFile);