windows-nt/Source/XPSP1/NT/drivers/wdm/bda/samples/mauitune/antenna.cpp
2020-09-26 16:20:57 +08:00

242 lines
4.9 KiB
C++

/*++
Copyright (c) 1999 Microsoft Corporation
Module Name:
Antenna.cpp
Abstract:
Antenna pin code.
--*/
#include "PhilTune.h"
#ifdef ALLOC_DATA_PRAGMA
#pragma const_seg("PAGECONST")
#endif // ALLOC_DATA_PRAGMA
#ifdef ALLOC_PRAGMA
#pragma code_seg("PAGE")
#endif // ALLOC_PRAGMA
enum tuner_errors { NO_ERRORS_DEFINED};
NTSTATUS
CAntennaPin::PinCreate(
IN OUT PKSPIN pKSPin,
IN PIRP pIrp
)
{
NTSTATUS Status = STATUS_SUCCESS;
CAntennaPin* pPin;
CFilter* pFilter;
_DbgPrintF(DEBUGLVL_VERBOSE,("CAntennaPin::PinCreate"));
ASSERT( pKSPin);
ASSERT( pIrp);
pFilter = FilterFromIRP( pIrp);
ASSERT( pFilter);
if (!pFilter)
{
Status = STATUS_DEVICE_NOT_CONNECTED;
goto exit;
}
pPin = new(NonPagedPool,'IFsK') CAntennaPin;
if (!pPin)
{
Status = STATUS_INSUFFICIENT_RESOURCES;
goto exit;
}
// Link our pin context to our filter context.
//
pPin->SetFilter( pFilter);
// Link our context to the KSPIN structure.
//
pKSPin->Context = pPin;
exit:
return Status;
}
NTSTATUS
CAntennaPin::PinClose(
IN OUT PKSPIN Pin,
IN PIRP Irp
)
{
_DbgPrintF(DEBUGLVL_VERBOSE,("PinClose"));
ASSERT(Pin);
ASSERT(Irp);
CAntennaPin* pin = reinterpret_cast<CAntennaPin*>(Pin->Context);
ASSERT(pin);
delete pin;
return STATUS_SUCCESS;
}
NTSTATUS
CAntennaPin::PinSetDeviceState(
IN PKSPIN Pin,
IN KSSTATE ToState,
IN KSSTATE FromState
)
{
NTSTATUS Status = STATUS_SUCCESS;
PKSDEVICE pKSDevice;
CAntennaPin * pPin;
CDevice * pDevice;
_DbgPrintF( DEBUGLVL_VERBOSE,
("CAntennaPin::PinSetDeviceState"));
ASSERT(Pin);
pKSDevice = KsPinGetDevice( Pin);
pPin = reinterpret_cast<CAntennaPin*>(Pin->Context);
ASSERT( pPin);
pDevice = reinterpret_cast<CDevice *>(pKSDevice->Context);
ASSERT(pDevice);
if ((ToState == KSSTATE_STOP) && (FromState != KSSTATE_STOP))
{
// Since this driver allocates resources on a filter wide basis,
// we tell the filter to release resources when the last pin,
// most upstream pin, transitions to stop.
//
// The antenna pin is the last one to be transitioned to stop,
// so tell the filter to release its resources.
//
Status = pPin->m_pFilter->ReleaseResources();
pPin->m_KsState = ToState;
}
else if ((ToState == KSSTATE_ACQUIRE) && (FromState == KSSTATE_STOP))
{
// Since this driver allocates resources on a filter wide basis,
// we tell the filter to acquire resources when the last pin,
// most upstream pin, transitions out of stop.
//
// The antenna pin is the last one to be transitioned to stop,
// so tell the filter to acquire its resources.
//
Status = pPin->m_pFilter->AcquireResources();
if (NT_SUCCESS( Status))
{
pPin->m_KsState = ToState;
}
}
else if (ToState > KSSTATE_RUN)
{
_DbgPrintF( DEBUGLVL_TERSE,
("CAntennaPin::PinSetDeviceState - Invalid Device State. ToState 0x%08x. FromState 0x%08x.",
ToState, FromState));
Status = STATUS_INVALID_PARAMETER;
}
else
{
pPin->m_KsState = ToState;
}
pPin->m_pFilter->SetDeviceState( pPin->m_KsState);
return Status;
}
NTSTATUS
CAntennaPin::GetCenterFrequency(
IN PIRP pIrp,
IN PKSPROPERTY pKSProperty,
IN PULONG pulProperty
)
{
CAntennaPin* pPin;
_DbgPrintF(DEBUGLVL_VERBOSE,("PinClose"));
ASSERT(pIrp);
ASSERT(pKSProperty);
ASSERT(pulProperty);
pPin = AntennaPinFromIRP( pIrp);
ASSERT(pPin);
if (!pPin)
{
return STATUS_INVALID_PARAMETER;
}
*pulProperty = pPin->m_ulCurrentFrequency;
return STATUS_SUCCESS;
}
NTSTATUS
CAntennaPin::PutCenterFrequency(
IN PIRP pIrp,
IN PKSPROPERTY pKSProperty,
IN PULONG pulProperty
)
{
NTSTATUS Status = STATUS_SUCCESS;
CAntennaPin* pPin;
CFilter* pFilter;
_DbgPrintF(DEBUGLVL_VERBOSE,("PinClose"));
ASSERT(pIrp);
ASSERT(pKSProperty);
ASSERT(pulProperty);
// Validate that the node type is associated with this pin.
//
Status = BdaValidateNodeProperty( pIrp, pKSProperty);
if (!NT_SUCCESS( Status))
{
goto errExit;
}
// Get a pointer to our object.
//
pPin = AntennaPinFromIRP( pIrp);
ASSERT( pPin);
if (!pPin)
{
Status = STATUS_INVALID_PARAMETER;
goto errExit;
}
pFilter = pPin->GetFilter();
ASSERT( pFilter);
if (!pFilter)
{
Status = STATUS_INVALID_PARAMETER;
goto errExit;
}
Status = pFilter->ChangeFrequency( *pulProperty);
errExit:
return Status;
}