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;
};
}
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);
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");
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
reinterpret_cast<IBDA_Topology*>(*Output)->AddRef();
return NOERROR;
}
-#if 0
+
if (IsEqualIID(refiid, IID_IDistributorNotify))
{
OutputDebugStringW(L"CBDADeviceControl::QueryInterface: No IDistributorNotify interface\n");
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))
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);
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);
{
HRESULT hr;
IKsObject *pObject = NULL;
+ IBaseFilter *pFilter = NULL;
HANDLE hFile;
// sanity check
// 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);
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);
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);
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);
#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
{
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
IN REFIID refiid,
OUT PVOID* Output)
{
- WCHAR Buffer[MAX_PATH];
- LPOLESTR lpstr;
-
if (IsEqualGUID(refiid, IID_IUnknown))
{
*Output = PVOID(this);
return NOERROR;
}
- StringFromCLSID(refiid, &lpstr);
- swprintf(Buffer, L"CBDADeviceControl::QueryInterface: NoInterface for %s", lpstr);
- OutputDebugStringW(Buffer);
- CoTaskMemFree(lpstr);
return E_NOINTERFACE;
}
//-------------------------------------------------------------------
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");
}
return NOERROR;
-}
\ No newline at end of file
+}
HRESULT
WINAPI
CControlNode_fnConstructor(
- IUnknown * pUnkOuter,
+ HANDLE hFile,
ULONG NodeType,
ULONG PinId,
REFIID riid,
HRESULT
WINAPI
CBDAFrequencyFilter_fnConstructor(
- IUnknown * pUnkOuter,
+ HANDLE hFile,
REFIID riid,
LPVOID * ppv);
HRESULT
WINAPI
CBDASignalStatistics_fnConstructor(
- IUnknown * pUnkOuter,
+ HANDLE hFile,
REFIID riid,
LPVOID * ppv);
HRESULT
WINAPI
CBDALNBInfo_fnConstructor(
- IUnknown * pUnkOuter,
+ HANDLE hFile,
REFIID riid,
LPVOID * ppv);
HRESULT
WINAPI
CBDADigitalDemodulator_fnConstructor(
- IUnknown * pUnkOuter,
+ HANDLE hFile,
REFIID riid,
LPVOID * ppv);
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);