mirror of
https://github.com/reactos/reactos.git
synced 2025-04-25 16:10:29 +00:00
- Implement KSPROPERTY_PIN_PROPOSEDATAFORMAT
- Add KSPROPERTY_PIN_PROPOSEDATAFORMAT handler to IPortWaveCyclic svn path=/trunk/; revision=39926
This commit is contained in:
parent
115377a581
commit
0533a9d290
4 changed files with 81 additions and 9 deletions
|
@ -114,17 +114,12 @@ KsPinPropertyHandler(
|
|||
PIO_STACK_LOCATION IoStack;
|
||||
ULONG Size, Index;
|
||||
PVOID Buffer;
|
||||
PKSDATARANGE_AUDIO *WaveFormatOut;
|
||||
PKSDATAFORMAT_WAVEFORMATEX WaveFormatIn;
|
||||
|
||||
IoStack = IoGetCurrentIrpStackLocation(Irp);
|
||||
Buffer = Irp->UserBuffer;
|
||||
|
||||
if (Property->Flags != KSPROPERTY_TYPE_GET)
|
||||
{
|
||||
Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
|
||||
Irp->IoStatus.Information = 0;
|
||||
return STATUS_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
switch(Property->Id)
|
||||
{
|
||||
case KSPROPERTY_PIN_CTYPES:
|
||||
|
@ -306,6 +301,65 @@ KsPinPropertyHandler(
|
|||
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||
Irp->IoStatus.Information = Size;
|
||||
break;
|
||||
case KSPROPERTY_PIN_PROPOSEDATAFORMAT:
|
||||
Pin = (KSP_PIN*)Property;
|
||||
if (Pin->PinId >= DescriptorsCount)
|
||||
{
|
||||
Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
|
||||
Irp->IoStatus.Information = 0;
|
||||
break;
|
||||
}
|
||||
Size = sizeof(KSDATAFORMAT);
|
||||
if (IoStack->Parameters.DeviceIoControl.OutputBufferLength < Size)
|
||||
{
|
||||
Irp->IoStatus.Information = Size;
|
||||
Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL;
|
||||
break;
|
||||
}
|
||||
if (IoStack->Parameters.DeviceIoControl.OutputBufferLength != sizeof(KSDATAFORMAT_WAVEFORMATEX))
|
||||
{
|
||||
UNIMPLEMENTED
|
||||
Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
|
||||
Irp->IoStatus.Information = 0;
|
||||
return STATUS_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
WaveFormatIn = (PKSDATAFORMAT_WAVEFORMATEX)Buffer;
|
||||
if (!Descriptor[Pin->PinId].DataRanges || !Descriptor[Pin->PinId].DataRangesCount)
|
||||
{
|
||||
Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
|
||||
Irp->IoStatus.Information = 0;
|
||||
return STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
WaveFormatOut = (PKSDATARANGE_AUDIO*)Descriptor[Pin->PinId].DataRanges;
|
||||
for(Index = 0; Index < Descriptor[Pin->PinId].DataRangesCount; Index++)
|
||||
{
|
||||
if (WaveFormatOut[Index]->DataRange.FormatSize != sizeof(KSDATARANGE_AUDIO))
|
||||
{
|
||||
UNIMPLEMENTED
|
||||
continue;
|
||||
}
|
||||
|
||||
if (WaveFormatOut[Index]->MinimumSampleFrequency > WaveFormatIn->WaveFormatEx.nSamplesPerSec ||
|
||||
WaveFormatOut[Index]->MaximumSampleFrequency < WaveFormatIn->WaveFormatEx.nSamplesPerSec ||
|
||||
WaveFormatOut[Index]->MinimumBitsPerSample > WaveFormatIn->WaveFormatEx.wBitsPerSample ||
|
||||
WaveFormatOut[Index]->MaximumBitsPerSample < WaveFormatIn->WaveFormatEx.wBitsPerSample ||
|
||||
WaveFormatOut[Index]->MaximumChannels < WaveFormatIn->WaveFormatEx.nChannels)
|
||||
{
|
||||
Irp->IoStatus.Status = STATUS_NO_MATCH;
|
||||
Irp->IoStatus.Information = 0;
|
||||
return STATUS_NO_MATCH;
|
||||
}
|
||||
else
|
||||
{
|
||||
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||
Irp->IoStatus.Information = 0;
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
}
|
||||
Irp->IoStatus.Status = STATUS_NO_MATCH;
|
||||
Irp->IoStatus.Information = 0;
|
||||
return STATUS_NO_MATCH;
|
||||
default:
|
||||
DPRINT1("Unhandled property request %x\n", Property->Id);
|
||||
Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
|
||||
|
|
|
@ -41,7 +41,7 @@ static GUID InterfaceGuids[3] =
|
|||
};
|
||||
|
||||
DEFINE_KSPROPERTY_TOPOLOGYSET(PortFilterWaveCyclicTopologySet, TopologyPropertyHandler);
|
||||
DEFINE_KSPROPERTY_PINSETCONSTRAINED(PortFilterWaveCyclicPinSet, PinPropertyHandler, PinPropertyHandler, PinPropertyHandler);
|
||||
DEFINE_KSPROPERTY_PINPROPOSEDATAFORMAT(PortFilterWaveCyclicPinSet, PinPropertyHandler, PinPropertyHandler, PinPropertyHandler);
|
||||
|
||||
KSPROPERTY_SET WaveCyclicPropertySet[] =
|
||||
{
|
||||
|
|
|
@ -241,4 +241,22 @@ PDEVICE_OBJECT
|
|||
GetDeviceObject(
|
||||
IPortWaveCyclic* iface);
|
||||
|
||||
|
||||
#define DEFINE_KSPROPERTY_PINPROPOSEDATAFORMAT(PinSet,\
|
||||
PropGeneral, PropInstances, PropIntersection)\
|
||||
DEFINE_KSPROPERTY_TABLE(PinSet) {\
|
||||
DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(PropInstances),\
|
||||
DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(PropGeneral),\
|
||||
DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(PropGeneral),\
|
||||
DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(PropGeneral),\
|
||||
DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(PropIntersection),\
|
||||
DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(PropGeneral),\
|
||||
DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(PropGeneral),\
|
||||
DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(PropGeneral),\
|
||||
DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(PropGeneral),\
|
||||
DEFINE_KSPROPERTY_ITEM_PIN_NAME(PropGeneral),\
|
||||
DEFINE_KSPROPERTY_ITEM_PIN_CONSTRAINEDDATARANGES(PropGeneral),\
|
||||
DEFINE_KSPROPERTY_ITEM_PIN_PROPOSEDATAFORMAT(PropGeneral)\
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -81,6 +81,7 @@ PinPropertyHandler(
|
|||
case KSPROPERTY_PIN_COMMUNICATION:
|
||||
case KSPROPERTY_PIN_CATEGORY:
|
||||
case KSPROPERTY_PIN_NAME:
|
||||
case KSPROPERTY_PIN_PROPOSEDATAFORMAT:
|
||||
Status = KsPinPropertyHandler(Irp, Request, Data, Descriptor->Factory.PinDescriptorCount, Descriptor->Factory.KsPinDescriptor);
|
||||
break;
|
||||
case KSPROPERTY_PIN_GLOBALCINSTANCES:
|
||||
|
@ -103,7 +104,6 @@ PinPropertyHandler(
|
|||
Status = STATUS_NOT_FOUND;
|
||||
}
|
||||
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue