mirror of
https://github.com/reactos/reactos.git
synced 2025-04-26 08:30:21 +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;
|
PIO_STACK_LOCATION IoStack;
|
||||||
ULONG Size, Index;
|
ULONG Size, Index;
|
||||||
PVOID Buffer;
|
PVOID Buffer;
|
||||||
|
PKSDATARANGE_AUDIO *WaveFormatOut;
|
||||||
|
PKSDATAFORMAT_WAVEFORMATEX WaveFormatIn;
|
||||||
|
|
||||||
IoStack = IoGetCurrentIrpStackLocation(Irp);
|
IoStack = IoGetCurrentIrpStackLocation(Irp);
|
||||||
Buffer = Irp->UserBuffer;
|
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)
|
switch(Property->Id)
|
||||||
{
|
{
|
||||||
case KSPROPERTY_PIN_CTYPES:
|
case KSPROPERTY_PIN_CTYPES:
|
||||||
|
@ -306,6 +301,65 @@ KsPinPropertyHandler(
|
||||||
Irp->IoStatus.Status = STATUS_SUCCESS;
|
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||||
Irp->IoStatus.Information = Size;
|
Irp->IoStatus.Information = Size;
|
||||||
break;
|
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:
|
default:
|
||||||
DPRINT1("Unhandled property request %x\n", Property->Id);
|
DPRINT1("Unhandled property request %x\n", Property->Id);
|
||||||
Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
|
Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
|
||||||
|
|
|
@ -41,7 +41,7 @@ static GUID InterfaceGuids[3] =
|
||||||
};
|
};
|
||||||
|
|
||||||
DEFINE_KSPROPERTY_TOPOLOGYSET(PortFilterWaveCyclicTopologySet, TopologyPropertyHandler);
|
DEFINE_KSPROPERTY_TOPOLOGYSET(PortFilterWaveCyclicTopologySet, TopologyPropertyHandler);
|
||||||
DEFINE_KSPROPERTY_PINSETCONSTRAINED(PortFilterWaveCyclicPinSet, PinPropertyHandler, PinPropertyHandler, PinPropertyHandler);
|
DEFINE_KSPROPERTY_PINPROPOSEDATAFORMAT(PortFilterWaveCyclicPinSet, PinPropertyHandler, PinPropertyHandler, PinPropertyHandler);
|
||||||
|
|
||||||
KSPROPERTY_SET WaveCyclicPropertySet[] =
|
KSPROPERTY_SET WaveCyclicPropertySet[] =
|
||||||
{
|
{
|
||||||
|
|
|
@ -241,4 +241,22 @@ PDEVICE_OBJECT
|
||||||
GetDeviceObject(
|
GetDeviceObject(
|
||||||
IPortWaveCyclic* iface);
|
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
|
#endif
|
||||||
|
|
|
@ -81,6 +81,7 @@ PinPropertyHandler(
|
||||||
case KSPROPERTY_PIN_COMMUNICATION:
|
case KSPROPERTY_PIN_COMMUNICATION:
|
||||||
case KSPROPERTY_PIN_CATEGORY:
|
case KSPROPERTY_PIN_CATEGORY:
|
||||||
case KSPROPERTY_PIN_NAME:
|
case KSPROPERTY_PIN_NAME:
|
||||||
|
case KSPROPERTY_PIN_PROPOSEDATAFORMAT:
|
||||||
Status = KsPinPropertyHandler(Irp, Request, Data, Descriptor->Factory.PinDescriptorCount, Descriptor->Factory.KsPinDescriptor);
|
Status = KsPinPropertyHandler(Irp, Request, Data, Descriptor->Factory.PinDescriptorCount, Descriptor->Factory.KsPinDescriptor);
|
||||||
break;
|
break;
|
||||||
case KSPROPERTY_PIN_GLOBALCINSTANCES:
|
case KSPROPERTY_PIN_GLOBALCINSTANCES:
|
||||||
|
@ -103,7 +104,6 @@ PinPropertyHandler(
|
||||||
Status = STATUS_NOT_FOUND;
|
Status = STATUS_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue