242 lines
4.9 KiB
C++
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;
|
||
|
}
|
||
|
|