/*++ 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(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(Pin->Context); ASSERT( pPin); pDevice = reinterpret_cast(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; }