📄 crossbarprop.cpp
字号:
// 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 + -