⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wdmtuner.cpp

📁 传说中的 视频抓取驱动源码 啊啊啊啊啊啊啊啊啊啊啊啊啊
💻 CPP
📖 第 1 页 / 共 2 页
字号:
        {
            // there is unsupported hardware was found
            uiError = WDMMINI_UNKNOWNHARDWARE;
            FAIL;
        }

        m_pTVTunerPinsMediumInfo = ( PKSPIN_MEDIUM) \
            ::ExAllocatePool( NonPagedPool, sizeof( KSPIN_MEDIUM) * m_ulNumberOfPins);
        if( m_pTVTunerPinsMediumInfo == NULL)
        {
            uiError = WDMMINI_ERROR_MEMORYALLOCATION;
            FAIL;
        }
        
        m_pTVTunerPinsDirectionInfo = ( PBOOL) \
            ::ExAllocatePool( NonPagedPool, sizeof( BOOL) * m_ulNumberOfPins);
        if( m_pTVTunerPinsDirectionInfo == NULL)
        {
            uiError = WDMMINI_ERROR_MEMORYALLOCATION;
            FAIL;
        }

        m_pI2CScript = pCScript;

        SetWDMTunerKSProperties();
        SetWDMTunerKSTopology();

        // Set run-time WDM properties at the last
        m_ulVideoStandard = ( m_ulNumberOfStandards == 1) ?
            // unknown standard or the only one
            m_wdmTunerCaps.ulStandardsSupported : 0x0L;
        m_ulTunerInput = 0L;                // unknown input or the only one
        m_ulTuningFrequency = 0L;           // unknown tuning frequency

#ifndef ATI_TVAUDIO_SUPPORT
        {
            // this code is needed to initilaize TVAudio path off the tuner
            // if there is no separate MiniDriver for TVAudio is assumed
            UINT    uiAudioConfiguration;
            UCHAR   uchAudioI2CAddress;

            if( m_CATIConfiguration.GetAudioConfiguration( &uiAudioConfiguration,
                                                           &uchAudioI2CAddress))
            {
                m_CATIConfiguration.InitializeAudioConfiguration( pCScript,
                                                                  uiAudioConfiguration,
                                                                  uchAudioI2CAddress);
            }
        }
#endif  // ATI_TVAUDIO_SUPPORT

        * puiErrorCode = WDMMINI_NOERROR;

        OutputDebugTrace(( "CATIWDMTuner:CATIWDMTuner() exit\n"));

        return;

    } END_ENSURE;

    * puiErrorCode = uiError;

    OutputDebugError(( "CATIWDMTuner:CATIWDMTuner() Error = %x\n", uiError));
}



/*^^*
 *      SetTunerCapabilities()
 * Purpose  :  Sets the capabilities ( RO properties) based upon the Tuner Id
 *
 * Inputs   :   UINT puiTunerId : Tuner Id
 *
 * Outputs  : returns TRUE, if there is a supported Tuner Id specified;
 *              also sets the following WDM Tuner properities:
 * Author   : IKLEBANOV
 *^^*/
BOOL CATIWDMTuner::SetTunerWDMCapabilities( UINT uiTunerId)
{
    
    ::RtlZeroMemory( &m_wdmTunerCaps, sizeof( ATI_KSPROPERTY_TUNER_CAPS));
    m_ulIntermediateFrequency = 0x0L;

    switch( uiTunerId)
    {
        case 0x01:      // FI1236 NTSC M/N North America
            m_ulNumberOfStandards = 3;
            m_wdmTunerCaps.ulStandardsSupported = KS_AnalogVideo_NTSC_M |
                                                  KS_AnalogVideo_PAL_M |
                                                  KS_AnalogVideo_PAL_N;
            m_wdmTunerCaps.ulNumberOfInputs = 1;
            m_wdmTunerCaps.ulMinFrequency =  54000000L;
            m_wdmTunerCaps.ulMaxFrequency = 801250000L;
            m_ulIntermediateFrequency = 45750000L;
            m_ulSupportedModes = KSPROPERTY_TUNER_MODE_TV;
            m_ulNumberOfPins = 2;
                break;

        case 0x02:      // FI1236J NTSC M/N Japan
            m_ulNumberOfStandards = 1;
            m_wdmTunerCaps.ulStandardsSupported = KS_AnalogVideo_NTSC_M_J;
            m_wdmTunerCaps.ulNumberOfInputs = 1;
            m_wdmTunerCaps.ulMinFrequency =  54000000L;
            m_wdmTunerCaps.ulMaxFrequency = 765250000L;
            m_ulIntermediateFrequency = 45750000L; 
            m_ulSupportedModes = KSPROPERTY_TUNER_MODE_TV;
            m_ulNumberOfPins = 2;
            break;

        case 0x03:      // FI1216 PAL B/G
            m_ulNumberOfStandards = 2;
            m_wdmTunerCaps.ulStandardsSupported = KS_AnalogVideo_PAL_B  |
                                                  KS_AnalogVideo_PAL_G;
            m_wdmTunerCaps.ulNumberOfInputs = 1;
            m_wdmTunerCaps.ulMinFrequency =  54000000L;
            m_wdmTunerCaps.ulMaxFrequency = 855250000L;
            m_ulIntermediateFrequency = 38900000L; 
            m_ulSupportedModes = KSPROPERTY_TUNER_MODE_TV;
            m_ulNumberOfPins = 2;
            break;

        case 0x04:      // FI1246 MK2 PAL I
            m_ulNumberOfStandards = 1;
            m_wdmTunerCaps.ulStandardsSupported = KS_AnalogVideo_PAL_I;
            m_wdmTunerCaps.ulNumberOfInputs = 1;
            m_wdmTunerCaps.ulMinFrequency =  45750000L;
            m_wdmTunerCaps.ulMaxFrequency = 855250000L;
            m_ulIntermediateFrequency = 38900000L; 
            m_ulSupportedModes = KSPROPERTY_TUNER_MODE_TV;
            m_ulNumberOfPins = 2;
            break;

        case 0x05:      // FI1216 PAL B/G, SECAM L/L'
            m_ulNumberOfStandards = 3;
            m_wdmTunerCaps.ulStandardsSupported =   KS_AnalogVideo_PAL_B |
                                                    KS_AnalogVideo_PAL_G |
                                                    KS_AnalogVideo_SECAM_L;
            m_wdmTunerCaps.ulNumberOfInputs = 1;
            m_wdmTunerCaps.ulMinFrequency =  54000000L;
            m_wdmTunerCaps.ulMaxFrequency = 855250000L;
            m_ulIntermediateFrequency = 38900000L; 
            m_ulSupportedModes = KSPROPERTY_TUNER_MODE_TV;
            m_ulNumberOfPins = 2;
            break;

        case 0x06:      // FR1236MK2 NTSC M/N North America + Japan
            m_ulNumberOfStandards = 4;
            m_wdmTunerCaps.ulStandardsSupported = KS_AnalogVideo_NTSC_M |
                                                  KS_AnalogVideo_PAL_M  |
                                                  KS_AnalogVideo_NTSC_M_J |
                                                  KS_AnalogVideo_PAL_N;
            m_wdmTunerCaps.ulNumberOfInputs = 1;
            m_wdmTunerCaps.ulMinFrequency =  54000000L;
            m_wdmTunerCaps.ulMaxFrequency = 801250000L;
            m_ulIntermediateFrequency = 45750000L; 
            m_ulSupportedModes = KSPROPERTY_TUNER_MODE_TV;
            m_ulNumberOfPins = 2;
            break;

        case 0x07:      // FI1256 PAL D/K China
            m_ulNumberOfStandards = 1;
            m_wdmTunerCaps.ulStandardsSupported =   KS_AnalogVideo_PAL_D |
                                                    KS_AnalogVideo_SECAM_D;
            m_wdmTunerCaps.ulNumberOfInputs = 1;
            m_wdmTunerCaps.ulMinFrequency =  48250000L;
            m_wdmTunerCaps.ulMaxFrequency = 855250000L;
            m_ulIntermediateFrequency = 38000000L; 
            m_ulSupportedModes = KSPROPERTY_TUNER_MODE_TV;
            m_ulNumberOfPins = 2;
            break;

        case 0x08:      // NTSC North America NEC FM Tuner
            m_ulNumberOfStandards = 3;
            m_wdmTunerCaps.ulStandardsSupported = KS_AnalogVideo_NTSC_M |
                                                  KS_AnalogVideo_PAL_M |
                                                  KS_AnalogVideo_PAL_N;
            m_wdmTunerCaps.ulNumberOfInputs = 2;
            m_wdmTunerCaps.ulMinFrequency =  54000000L;
            m_wdmTunerCaps.ulMaxFrequency = 801250000L;
            m_ulIntermediateFrequency = 45750000L; 
            m_ulSupportedModes = KSPROPERTY_TUNER_MODE_TV |
                                 KSPROPERTY_TUNER_MODE_FM_RADIO;
            m_ulNumberOfPins = 2;
            break;

        case 0x10:      // NTSC North America Alps Tuner
        case 0x11:      // NTSC North America Alps Tuner
            m_ulNumberOfStandards = 3;
            m_wdmTunerCaps.ulStandardsSupported = KS_AnalogVideo_NTSC_M |
                                                  KS_AnalogVideo_PAL_M |
                                                  KS_AnalogVideo_PAL_N;
            m_wdmTunerCaps.ulNumberOfInputs = 1;
            m_wdmTunerCaps.ulMinFrequency =  54000000L;
            m_wdmTunerCaps.ulMaxFrequency = 801250000L;
            m_ulIntermediateFrequency = 45750000L; 
            m_ulSupportedModes = KSPROPERTY_TUNER_MODE_TV;
            m_ulNumberOfPins = 2;
            break;

        case 0x12:      // NTSC North America Alps Tuner with FM
            m_ulNumberOfStandards = 3;
            m_wdmTunerCaps.ulStandardsSupported = KS_AnalogVideo_NTSC_M |
                                                  KS_AnalogVideo_PAL_M |
                                                  KS_AnalogVideo_PAL_N;
            m_wdmTunerCaps.ulNumberOfInputs = 1;
            m_wdmTunerCaps.ulMinFrequency =  54000000L;
            m_wdmTunerCaps.ulMaxFrequency = 801250000L;
            m_ulIntermediateFrequency = 45750000L; 
            m_ulSupportedModes = KSPROPERTY_TUNER_MODE_TV |
                                 KSPROPERTY_TUNER_MODE_FM_RADIO;
            m_ulNumberOfPins = 2;
            break;

        case 0x0D:      // Temic 4006 FN5 PAL B/G + PAL/I + PAL D + SECAM D/K
            m_ulNumberOfStandards = 6;
            m_wdmTunerCaps.ulStandardsSupported =   KS_AnalogVideo_PAL_B    |
                                                    KS_AnalogVideo_PAL_G    |
                                                    KS_AnalogVideo_PAL_I    |
                                                    KS_AnalogVideo_PAL_D    |
                                                    KS_AnalogVideo_SECAM_D  |
                                                    KS_AnalogVideo_SECAM_K;
            m_wdmTunerCaps.ulNumberOfInputs = 1;
            m_wdmTunerCaps.ulMinFrequency =  45000000L;
            m_wdmTunerCaps.ulMaxFrequency = 868000000L;
            m_ulIntermediateFrequency = 38900000L; 
            m_ulSupportedModes = KSPROPERTY_TUNER_MODE_TV;
            m_ulNumberOfPins = 2;
            break;


        default:
            return( FALSE);
    }

    m_ulTunerMode = KSPROPERTY_TUNER_MODE_TV;

    m_wdmTunerCaps.ulTuningGranularity = 62500L;
    m_wdmTunerCaps.ulSettlingTime = 150;
    m_wdmTunerCaps.ulStrategy = KS_TUNER_STRATEGY_PLL;

    return( TRUE);
}



/*^^*
 *      AdapterSetPowerState()
 * Purpose  :   Sets Power Managemeny mode
 *
 * Inputs   :   PHW_STREAM_REQUEST_BLOCK pSrb   : pointer to the current Srb
 *
 * Outputs  :   NTSTATUS as the result of operation
 * Author   :   TOM
 *^^*/
NTSTATUS CATIWDMTuner::AdapterSetPowerState( PHW_STREAM_REQUEST_BLOCK pSrb)
{
    PADAPTER_DATA_EXTENSION pPrivateData = 
        ( PADAPTER_DATA_EXTENSION)(( PHW_STREAM_REQUEST_BLOCK)pSrb)->HwDeviceExtension;
    CI2CScript *        pCScript    = &pPrivateData->CScript;
    DEVICE_POWER_STATE  nDeviceState = pSrb->CommandData.DeviceState;
    LARGE_INTEGER       liWakeUpTime;
    NTSTATUS            ntStatus;

    m_pPendingDeviceSrb = pSrb;
    ntStatus = STATUS_ADAPTER_HARDWARE_ERROR;

    switch( nDeviceState)
    {
        case PowerDeviceD0:
        case PowerDeviceD3:
            if( nDeviceState != m_ulPowerState)
            {
                m_CATIConfiguration.SetTunerPowerState( m_pI2CScript,
                                        ( nDeviceState == PowerDeviceD0 ? TRUE : FALSE));

                // if transition form D3 to D0 we have to restore frequency
                if(( nDeviceState == PowerDeviceD0) && ( m_ulPowerState == PowerDeviceD3))
                {
                    // we have to wait approx. 10ms for tuner to power up
                    liWakeUpTime.QuadPart = ATIHARDWARE_TUNER_WAKEUP_DELAY;
                    KeDelayExecutionThread( KernelMode, FALSE, &liWakeUpTime);

                    // now we have to restore frequency
                    if( SetTunerFrequency( m_ulTuningFrequency))
                        ntStatus = STATUS_SUCCESS;
                    else
                        ntStatus = STATUS_ADAPTER_HARDWARE_ERROR;
                }
                else
                    ntStatus = STATUS_SUCCESS;

                m_ulPowerState = nDeviceState;
            }
            else
                ntStatus = STATUS_SUCCESS;
            break;

        case PowerDeviceD1:
        case PowerDeviceD2:
            ntStatus = STATUS_SUCCESS;
            break;

        default:
            ntStatus = STATUS_INVALID_PARAMETER;
            break;
    }

    return( ntStatus);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -