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

📄 crossbarprop.cpp

📁 完整的基于Conxant平台的USB电视棒的WIN驱动程序。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
        // to complete the request
        if(p_request->Index >= XBAR_NUM_OUTPINS)
        {
            status = STATUS_INVALID_PARAMETER;
        }

        RtlCopyMemory(
            &pin_info, 
            &_output_pin_info[p_request->Index], 
            sizeof(CROSSBAR_PIN_PROPERTIES));
    }
    else
    {
        //It's an input pin.  Call this virtual function to query the child class
        // for the information.
        status = p_properties->getInputPinInfo(
            p_request->Index,
            &pin_info);
    }

    if(!NT_SUCCESS(status))
    {
        return status;
    }

    //Fill in the return structure
    p_data->Index = p_request->Index;
    p_data->Direction = p_request->Direction;
    p_data->PinType = pin_info.type;
    p_data->RelatedPinIndex = pin_info.related_pin_index;
    RtlCopyMemory(&p_data->Medium, &pin_info.medium, sizeof(KSPIN_MEDIUM));

    p_data->Medium.Id = p_device->getMediumId();

    return STATUS_SUCCESS;
}

/////////////////////////////////////////////////////////////////////////////////////////
//CrossbarProperties::static_canRoute
//
// This is the handler for KSPROPERTY_CROSSBAR_CAN_ROUTE
//
// Fills in TRUE or FALSE depending on rather or not we can do the route.
// 
// Currently, we can route if both input and output pins are audio or if 
// both input and output pins are video.
//
// Calls non-static member canRoute() to do the actual work.
// 
// Parameters:
// p_irp - IRP making the request
// p_request - input buffer
// p_data - output buffer
//
NTSTATUS CrossbarProperties::static_canRoute(
        PIRP p_irp,
        PKSPROPERTY_CROSSBAR_ROUTE_S p_request,
        PKSPROPERTY_CROSSBAR_ROUTE_S p_data)
{
        //Get the filter
    PKSFILTER p_filter = KsGetFilterFromIrp(p_irp);
    
    if(!p_filter)
    {
        return STATUS_UNSUCCESSFUL;
    }

    PKSDEVICE p_ks_device = KsFilterGetDevice(p_filter);
    if(!p_ks_device)
    {
        return STATUS_UNSUCCESSFUL;
    }

    Device* p_device = (Device*)p_ks_device->Context;

    if(!p_device)
    {
        return STATUS_UNSUCCESSFUL;
    }

    //Get the TunerProperties object from the filter
    CrossbarProperties* p_properties = p_device->getCrossbarProperties();
    
    if(!p_properties)
    {
        return STATUS_UNSUCCESSFUL;
    }

    //Check if we can route
    p_data->CanRoute = p_properties->canRoute(
        p_request->IndexInputPin, 
        p_request->IndexOutputPin);

    return STATUS_SUCCESS;
}


/////////////////////////////////////////////////////////////////////////////////////////
//CrossbarProperties::static_getRoute
//
// This is the "get" handler for KSPROPERTY_CROSSBAR_ROUTE
//
// Fills in the current route by calling non-static getRoute()
// 
// Parameters:
// p_irp - IRP making the request
// p_request - input buffer
// p_data - output buffer
//

NTSTATUS CrossbarProperties::static_getRoute(
        PIRP p_irp,
        PKSPROPERTY_CROSSBAR_ROUTE_S p_request,
        PKSPROPERTY_CROSSBAR_ROUTE_S p_data)
{
        //Get the filter
    PKSFILTER p_filter = KsGetFilterFromIrp(p_irp);
    
    if(!p_filter)
    {
        return STATUS_UNSUCCESSFUL;
    }

    PKSDEVICE p_ks_device = KsFilterGetDevice(p_filter);
    if(!p_ks_device)
    {
        return STATUS_UNSUCCESSFUL;
    }

    Device* p_device = (Device*)p_ks_device->Context;

    if(!p_device)
    {
        return STATUS_UNSUCCESSFUL;
    }

    //Get the TunerProperties object from the filter
    CrossbarProperties* p_properties = p_device->getCrossbarProperties();
    
    if(!p_properties)
    {
        return STATUS_UNSUCCESSFUL;
    }

    //Get the route
    p_data->IndexOutputPin = p_request->IndexOutputPin;
    return p_properties->getRoute(
        p_request->IndexOutputPin, 
        &p_data->IndexInputPin);
}


/////////////////////////////////////////////////////////////////////////////////////////
//CrossbarProperties::static_setRoute
//
// This is the "set" handler for KSPROPERTY_CROSSBAR_ROUTE
//
// calls the child class' setRoute() handler to set up the route.
// 
// Parameters:
// p_irp - IRP making the request
// p_request - input buffer
// p_data - output buffer
//

NTSTATUS CrossbarProperties::static_setRoute(
        PIRP p_irp,
        PKSPROPERTY_CROSSBAR_ROUTE_S p_request,
        PKSPROPERTY_CROSSBAR_ROUTE_S p_data)
{
        //Get the filter
    PKSFILTER p_filter = KsGetFilterFromIrp(p_irp);
    
    if(!p_filter)
    {
        return STATUS_UNSUCCESSFUL;
    }

    PKSDEVICE p_ks_device = KsFilterGetDevice(p_filter);
    if(!p_ks_device)
    {
        return STATUS_UNSUCCESSFUL;
    }

    Device* p_device = (Device*)p_ks_device->Context;

    if(!p_device)
    {
        return STATUS_UNSUCCESSFUL;
    }

    //Get the TunerProperties object from the filter
    CrossbarProperties* p_properties = p_device->getCrossbarProperties();
    
    if(!p_properties)
    {
        return STATUS_UNSUCCESSFUL;
    }

    if(!p_properties->canRoute(p_request->IndexInputPin, p_request->IndexOutputPin))
    {
        return STATUS_UNSUCCESSFUL;
    }

    //Set the route
    NTSTATUS status = p_properties->setRoute(p_request->IndexInputPin, p_request->IndexOutputPin);

    RegistryAccess registry_access(p_properties->_pdo);
    //Save the new value to the registry
    if(NT_SUCCESS(status))
    {
        if(p_request->IndexOutputPin==XBAR_OUTPIN_VIDEO_DECODER)
        {
            //Save the current video input for next time.        
            registry_access.writeDword("VideoInputPin", p_properties->selectedVideoInput());
        }
        else
        {
            //Save the current audio input for next time.
            registry_access.writeDword("AudioInputPin", p_properties->selectedAudioInput());
        }
    }

    return status;
}


/////////////////////////////////////////////////////////////////////////////////////////
//CrossbarProperties::canRoute()
//
// This is called to see if it is valid to route the given input pin to the given output
// pin.  
//
// We allow the route if both are video pins or both are audio pins.
// 
// Note that isAudioPin() must take the mute input pin (0xFFFFFFFF) into account
//
BOOLEAN CrossbarProperties::canRoute(ULONG input_pin_index, 
                                     ULONG output_pin_index)
{
    if(
        //If input and output are audio pins, route is ok.
        (isAudioPin(input_pin_index) &&
            (output_pin_index == XBAR_OUTPIN_AUDIO_DECODER)) 
        
        ||
        
        //If input and output are video pins, route is ok.
        (isVideoPin(input_pin_index) &&
        (output_pin_index == XBAR_OUTPIN_VIDEO_DECODER))
        ) 
    {
        return TRUE;    
    }

    return FALSE;
}

/////////////////////////////////////////////////////////////////////////////////////////
//CrossbarProperties::getRoute
//
// This is called to get the current route.  It's handled in the base class.
//
NTSTATUS CrossbarProperties::getRoute(ULONG  output_pin_index, 
                                      PULONG p_input_pin_index)
{
    switch(output_pin_index)
    {
    case XBAR_OUTPIN_VIDEO_DECODER:
        *p_input_pin_index = _selected_video_input;
        return STATUS_SUCCESS;
    case XBAR_OUTPIN_AUDIO_DECODER:
        *p_input_pin_index = _selected_audio_input;
        return STATUS_SUCCESS;
    default:
        return STATUS_INVALID_PARAMETER;
    }
}

⌨️ 快捷键说明

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