📄 bdatunerprop.cpp
字号:
/*+++ *******************************************************************\
*
* Copyright and Disclaimer:
*
* ---------------------------------------------------------------
* This software is provided "AS IS" without warranty of any kind,
* either expressed or implied, including but not limited to the
* implied warranties of noninfringement, merchantability and/or
* fitness for a particular purpose.
* ---------------------------------------------------------------
*
* Copyright (c) 2008 Conexant Systems, Inc.
* All rights reserved.
*
\******************************************************************* ---*/
#include "BdaTunerProp.h"
#include "BdaTunerFilter.h"
#include "debug.h"
////////////////////////////////////////////////////////////////////
//BDA frequency filter property set (KSPROPSETID_BdaFrequencyFilter)
////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
//Get the current frequency from the BDA tuner filter
//
NTSTATUS BdaTunerProp::static_GetFrequency(
PIRP p_irp,
PPROPERTY_ULONG p_request,
PULONG p_data)
{
NTSTATUS status = BdaValidateNodeProperty(p_irp, (PKSPROPERTY)p_request);
if(!NT_SUCCESS(status))
{
return status;
}
//Get the BDA tuner filter class
PKSFILTER p_ks_filter = KsGetFilterFromIrp(p_irp);
BdaTunerFilter* p_filter = (BdaTunerFilter*)p_ks_filter->Context;
//Get the current frequency from the filter object.
PBDA_TUNER_FREQ p_frequency = p_filter->getCurrentFrequencySetting();
//Put it in the output buffer
*p_data = p_frequency->frequency;
return STATUS_SUCCESS;
}
/////////////////////////////////////////////////////////////////////////////////////////
//Set the pending frequency in the BDA tuner filter. (It applies when the filter is told
// to 'commit changes'
//
NTSTATUS BdaTunerProp::static_SetFrequency(
PIRP p_irp,
PPROPERTY_ULONG p_request,
PULONG p_data)
{
NTSTATUS status = BdaValidateNodeProperty(p_irp, (PKSPROPERTY)p_request);
if(!NT_SUCCESS(status))
{
return status;
}
//Get the BDA tuner filter class
PKSFILTER p_ks_filter = KsGetFilterFromIrp(p_irp);
BdaTunerFilter* p_filter = (BdaTunerFilter*)p_ks_filter->Context;
//Set the pending frequency
p_filter->setPendingFrequency(*p_data);
return STATUS_SUCCESS;
}
/////////////////////////////////////////////////////////////////////////////////////////
//Get the current frequency multiplier in the BDA tuner filter.
//
NTSTATUS BdaTunerProp::static_GetFrequencyMultiplier(
PIRP p_irp,
PPROPERTY_ULONG p_request,
PULONG p_data)
{
NTSTATUS status = BdaValidateNodeProperty(p_irp, (PKSPROPERTY)p_request);
if(!NT_SUCCESS(status))
{
return status;
}
//Get the BDA tuner filter class
PKSFILTER p_ks_filter = KsGetFilterFromIrp(p_irp);
BdaTunerFilter* p_filter = (BdaTunerFilter*)p_ks_filter->Context;
//Get the current frequency from the filter object.
PBDA_TUNER_FREQ p_frequency = p_filter->getCurrentFrequencySetting();
//Put it in the output buffer
*p_data = p_frequency->frequency_multiplier;
return STATUS_SUCCESS;
}
/////////////////////////////////////////////////////////////////////////////////////////
//Set the pending frequency multiplier in the BDA tuner filter. (It applies when the
// filter is told to 'commit changes')
//
NTSTATUS BdaTunerProp::static_SetFrequencyMultiplier(
PIRP p_irp,
PPROPERTY_ULONG p_request,
PULONG p_data)
{
NTSTATUS status = BdaValidateNodeProperty(p_irp, (PKSPROPERTY)p_request);
if(!NT_SUCCESS(status))
{
return status;
}
//Get the BDA tuner filter class
PKSFILTER p_ks_filter = KsGetFilterFromIrp(p_irp);
BdaTunerFilter* p_filter = (BdaTunerFilter*)p_ks_filter->Context;
//Set the pending frequency mulitplier
p_filter->setPendingFrequencyMultiplier(*p_data);
return STATUS_SUCCESS;
}
/////////////////////////////////////////////////////////////////////////////////////////
//Get the current channel bandwidth in the BDA tuner filter.
//
NTSTATUS BdaTunerProp::static_GetChannelBandwidth(
PIRP p_irp,
PPROPERTY_ULONG p_request,
PULONG p_data)
{
NTSTATUS status = BdaValidateNodeProperty(p_irp, (PKSPROPERTY)p_request);
if(!NT_SUCCESS(status))
{
return status;
}
//Get the BDA tuner filter class
PKSFILTER p_ks_filter = KsGetFilterFromIrp(p_irp);
BdaTunerFilter* p_filter = (BdaTunerFilter*)p_ks_filter->Context;
//Get the current frequency from the filter object.
PBDA_TUNER_FREQ p_frequency = p_filter->getCurrentFrequencySetting();
//Put it in the output buffer
*p_data = p_frequency->channel_bandwidth;
return STATUS_SUCCESS;
}
/////////////////////////////////////////////////////////////////////////////////////////
//Set the pending channel bandwidth in the BDA tuner filter. (It applies when the
// filter is told to 'commit changes')
//
NTSTATUS BdaTunerProp::static_SetChannelBandwidth(
PIRP p_irp,
PPROPERTY_ULONG p_request,
PULONG p_data)
{
NTSTATUS status = BdaValidateNodeProperty(p_irp, (PKSPROPERTY)p_request);
if(!NT_SUCCESS(status))
{
return status;
}
//Get the BDA tuner filter class
PKSFILTER p_ks_filter = KsGetFilterFromIrp(p_irp);
BdaTunerFilter* p_filter = (BdaTunerFilter*)p_ks_filter->Context;
//Set the pending channel bandwidth
p_filter->setPendingChannelBandwidth(*p_data);
return STATUS_SUCCESS;
}
////////////////////////////////////////////////////////////////////
//BDA signal stats property set. (KSPROPSETID_BdaSignalStats)
////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
NTSTATUS BdaTunerProp::static_GetSignalStrength(
PIRP p_irp,
PPROPERTY_LONG p_request,
PLONG p_data)
{
NTSTATUS status = BdaValidateNodeProperty(p_irp, (PKSPROPERTY)p_request);
if(!NT_SUCCESS(status))
{
return status;
}
//Get the BDA tuner filter class
PKSFILTER p_ks_filter = KsGetFilterFromIrp(p_irp);
BdaTunerFilter* p_filter = (BdaTunerFilter*)p_ks_filter->Context;
//Get the signal strength in dB
DWORD signal_strength = p_filter->getSignalStrength();
//Map it to the value Microsoft is expecting. (0 is the nominal value, which
// is 18 dB. Anything higher will return a negative value)
*p_data = (18 - signal_strength)*1000;
DbgLogInfo(("BdaTunerProp::static_GetSignalStrength SignalStrength = %ddB and SignalStrength = %ld\n",
signal_strength, *p_data));
return STATUS_SUCCESS;
}
/////////////////////////////////////////////////////////////////////////////////
NTSTATUS BdaTunerProp::static_GetSignalPresent(
PIRP p_irp,
PPROPERTY_BOOL p_request,
PBOOL p_data)
{
NTSTATUS status = BdaValidateNodeProperty(p_irp, (PKSPROPERTY)p_request);
if(!NT_SUCCESS(status))
{
return status;
}
//Get the BDA tuner filter class
PKSFILTER p_ks_filter = KsGetFilterFromIrp(p_irp);
BdaTunerFilter* p_filter = (BdaTunerFilter*)p_ks_filter->Context;
//Get the signal present status
*p_data = p_filter->isTunerLocked();
return STATUS_SUCCESS;
}
/////////////////////////////////////////////////////////////////////////////////
NTSTATUS BdaTunerProp::static_GetSignalQuality(
PIRP p_irp,
PPROPERTY_LONG p_request,
PLONG p_data)
{
NTSTATUS status = BdaValidateNodeProperty(p_irp, (PKSPROPERTY)p_request);
if(!NT_SUCCESS(status))
{
return status;
}
//Get the BDA tuner filter class
PKSFILTER p_ks_filter = KsGetFilterFromIrp(p_irp);
BdaTunerFilter* p_filter = (BdaTunerFilter*)p_ks_filter->Context;
//Get the signal strength in dB
DWORD signal_strength = p_filter->getSignalStrength();
//
//According to the DDK, the strengths maps to quality as follows:
// 100 - ideal
// 95 - no artifacts noticable
// 90 - very few artifacts
// 80 - weakest signal that can be viewed
// 60 - minimum signal to expect data service
// 20 - minimum signal which can be detected.
DWORD quality = 0;
if(signal_strength > 24)
{
quality = 100;
}
else if(signal_strength > 20)
{
quality = 90;
}
else if(signal_strength > 15)
{
quality = 80;
}
else if(signal_strength > 0)
{
quality = 20;
}
DbgLogInfo(("BdaTunerProp::static_GetSignalQuality SignalStrength = %ddB and Quality = %d\n",
signal_strength, quality));
*p_data = (LONG)quality;
return STATUS_SUCCESS;
}
/////////////////////////////////////////////////////////////////////////////////
NTSTATUS BdaTunerProp::static_GetSignalLocked(
PIRP p_irp,
PPROPERTY_BOOL p_request,
PBOOL p_data)
{
NTSTATUS status = BdaValidateNodeProperty(p_irp, (PKSPROPERTY)p_request);
if(!NT_SUCCESS(status))
{
return status;
}
//Get the BDA tuner filter class
PKSFILTER p_ks_filter = KsGetFilterFromIrp(p_irp);
BdaTunerFilter* p_filter = (BdaTunerFilter*)p_ks_filter->Context;
//Get the signal locked status
*p_data = p_filter->isTunerLocked();
return STATUS_SUCCESS;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -