📄 bdatuner.h
字号:
#include "common.h"
#include "bdadebug.h"
#define IsEqualGUID(rguid1, rguid2) (!memcmp(rguid1, rguid2, sizeof(GUID)))
/**************************************************************/
/* Driver Name - Change the driver name to reflect your executable name! */
/**************************************************************/
#define MODULENAME "BDA Generic Tuner Sample"
#define MODULENAMEUNICODE L"BDA Generic Tuner Sample"
#define STR_MODULENAME MODULENAME
// This defines the name of the WMI device that manages service IOCTLS
#define DEVICENAME (L"\\\\.\\" MODULENAMEUNICODE)
#define SYMBOLICNAME (L"\\DosDevices\\" MODULENAMEUNICODE)
#define ATSC_RECEIVER 1
//#define DVBS_RECEIVER 1
// #define DVBT_RECEIVER 1
// #define CABLE_RECEIVER 1
// Must define exactly one of the 4 above
# if !(defined(ATSC_RECEIVER) || defined(DVBT_RECEIVER) || defined(DVBS_RECEIVER) || defined (CABLE_RECEIVER))
#error "Must define exactly one of ATSC, DVBT, DVBS or CABLE"
#endif
# if defined(ATSC_RECEIVER) && (defined(DVBT_RECEIVER) || defined(DVBS_RECEIVER) || defined (CABLE_RECEIVER))
#error 揗ultiple tranport definitions"
# elif defined(DVBT_RECEIVER) && (defined(ATSC_RECEIVER) || defined(DVBS_RECEIVER) || defined (CABLE_RECEIVER))
#error 揗ultiple tranport definitions"
# elif defined(DVBS_RECEIVER) && (defined(ATSC_RECEIVER) || defined(DVBT_RECEIVER) || defined (CABLE_RECEIVER))
#error 揗ultiple tranport definitions"
# elif defined(CABLE_RECEIVER) && (defined(ATSC_RECEIVER) || defined(DVBS_RECEIVER) || defined (DVBT_RECEIVER))
#error 揗ultiple tranport definitions"
#endif
#define MS_SAMPLE_TUNER_POOL_TAG 'TadB'
// Define a structure that represents what the underlying device can do.
//
// Note - It is possible to set conflicting settings. In this case, the
// CFilter::CheckChanges method should return an error. Only a
// self-consistent resource should be submitted to the underlying device.
//
typedef struct _BDATUNER_DEVICE_RESOURCE
{
// Tuner Resources
//
ULONG ulCarrierFrequency;
ULONG ulFrequencyMultiplier;
GUID guidDemodulator;
// Demodulator Resources
//
ULONG ulDemodProperty1;
ULONG ulDemodProperty2;
ULONG ulDemodProperty3;
} BDATUNER_DEVICE_RESOURCE, * PBDATUNER_DEVICE_RESOURCE;
// Define a structure that represents the underlying device status.
//
typedef struct _BDATUNER_DEVICE_STATUS
{
// Tuner Status
//
BOOLEAN fCarrierPresent;
// Demodulator Status
//
BOOLEAN fSignalLocked;
} BDATUNER_DEVICE_STATUS, * PBDATUNER_DEVICE_STATUS;
extern const KSDEVICE_DESCRIPTOR DeviceDescriptor;
//
// Define the filter class.
//
class CFilter {
public:
//
// Define the AVStream Filter Dispatch Functions
// Network provider and AVStream use these functions
// to create or remove a filter instance
//
static
STDMETHODIMP_(NTSTATUS)
Create(
IN OUT PKSFILTER Filter,
IN PIRP Irp
);
static
STDMETHODIMP_(NTSTATUS)
FilterClose(
IN OUT PKSFILTER Filter,
IN PIRP Irp
);
/**************************************************************/
/* Only used to process frames.
* Filters that transport data do not implement this dispatch function.
static
STDMETHODIMP
Process(
IN PKSFILTER Filter,
IN PKSPROCESSPIN_INDEXENTRY ProcessPinsIndex
);*/
/**************************************************************/
//
// KSMETHODSETID_BdaChangeSync
// Filter change sync methods
//
static
STDMETHODIMP_(NTSTATUS)
StartChanges(
IN PIRP pIrp,
IN PKSMETHOD pKSMethod,
OPTIONAL PVOID pvIgnored
);
static
STDMETHODIMP_(NTSTATUS)
CheckChanges(
IN PIRP pIrp,
IN PKSMETHOD pKSMethod,
OPTIONAL PVOID pvIgnored
);
static
STDMETHODIMP_(NTSTATUS)
CommitChanges(
IN PIRP pIrp,
IN PKSMETHOD pKSMethod,
OPTIONAL PVOID pvIgnored
);
static
STDMETHODIMP_(NTSTATUS)
GetChangeState(
IN PIRP pIrp,
IN PKSMETHOD pKSMethod,
OUT PULONG pulChangeState
);
static
STDMETHODIMP_(NTSTATUS)
GetMedium(
IN PIRP pIrp,
IN PKSPROPERTY pKSProperty,
IN KSPIN_MEDIUM * pulProperty
);
//
// KSMETHODSETID_BdaDeviceConfiguration
// Methods to modify filter topology.
//
static
STDMETHODIMP_(NTSTATUS)
CreateTopology(
IN PIRP pIrp,
IN PKSMETHOD pKSMethod,
OPTIONAL PVOID pvIgnored
);
//
// Filter Implementation Methods
//
STDMETHODIMP_(class CDevice *)
GetDevice() { return m_pDevice;};
STDMETHODIMP_(NTSTATUS)
PutFrequency(
IN ULONG ulBdaParameter
)
{
m_NewResource.ulCarrierFrequency = ulBdaParameter;
m_BdaChangeState = BDA_CHANGES_PENDING;
return STATUS_SUCCESS;
};
STDMETHODIMP_(NTSTATUS)
GetFrequency(
IN PULONG pulBdaParameter
)
{
*pulBdaParameter = m_CurResource.ulCarrierFrequency;
return STATUS_SUCCESS;
};
STDMETHODIMP_(NTSTATUS)
SetDemodulator(
IN const GUID * pguidDemodulator
);
STDMETHODIMP_(NTSTATUS)
SetDemodProperty1(
IN ULONG ulDemodProperty1
)
{
m_NewResource.ulDemodProperty1 = ulDemodProperty1;
m_BdaChangeState = BDA_CHANGES_PENDING;
return STATUS_SUCCESS;
}
STDMETHODIMP_(NTSTATUS)
GetDemodProperty1(
IN PULONG pulDemodProperty1
)
{
if (pulDemodProperty1)
{
*pulDemodProperty1 = m_CurResource.ulDemodProperty1;
return STATUS_SUCCESS;
}
else
{
return STATUS_INVALID_PARAMETER;
}
}
STDMETHODIMP_(NTSTATUS)
SetDemodProperty2(
IN ULONG ulDemodProperty2
)
{
m_NewResource.ulDemodProperty2 = ulDemodProperty2;
m_BdaChangeState = BDA_CHANGES_PENDING;
return STATUS_SUCCESS;
}
STDMETHODIMP_(NTSTATUS)
GetDemodProperty3(
IN PULONG pulDemodProperty3
)
{
if (pulDemodProperty3)
{
*pulDemodProperty3 = m_CurResource.ulDemodProperty3;
return STATUS_SUCCESS;
}
else
{
return STATUS_INVALID_PARAMETER;
}
}
STDMETHODIMP_(NTSTATUS)
GetStatus(
PBDATUNER_DEVICE_STATUS pDeviceStatus
);
STDMETHODIMP_(NTSTATUS)
SetDeviceState(
KSSTATE newKsState
)
{
m_KsState = newKsState;
return STATUS_SUCCESS;
};
STDMETHODIMP_(NTSTATUS)
AcquireResources();
STDMETHODIMP_(NTSTATUS)
ReleaseResources();
private:
class CDevice * m_pDevice;
// Filter Properties
//
// Filter Resources
//
KSSTATE m_KsState;
BDA_CHANGE_STATE m_BdaChangeState;
BDATUNER_DEVICE_RESOURCE m_CurResource;
BDATUNER_DEVICE_RESOURCE m_NewResource;
ULONG m_ulResourceID;
BOOLEAN m_fResourceAcquired;
};
//
// Define the device class.
//
class CDevice {
public:
//
// Define the AVStream Device Dispatch Functions
// AVStream uses these functions to create and start the device
//
static
STDMETHODIMP_(NTSTATUS)
Create(
IN PKSDEVICE pKSDevice
);
static
STDMETHODIMP_(NTSTATUS)
Start(
IN PKSDEVICE pKSDevice,
IN PIRP pIrp,
IN PCM_RESOURCE_LIST pTranslatedResourceList OPTIONAL,
IN PCM_RESOURCE_LIST pUntranslatedResourceList OPTIONAL
);
//
// Utility functions for the device
// An instance of the filter uses these functions
// to manage resources on the device.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -