From ee4f08ad85b361340a956326ec2cd54217b85fcc Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Tue, 7 Dec 2010 17:23:09 +0000 Subject: [PATCH] [PORTCLS] - Merge from the audio branch - Fix node property handler - Take advantage of IPinCount interface svn path=/trunk/; revision=49974 --- .../audio/backpln/portcls/propertyhandler.cpp | 59 +++++++++++++++---- .../wdm/audio/backpln/portcls/undoc.cpp | 20 +++---- 2 files changed, 57 insertions(+), 22 deletions(-) diff --git a/reactos/drivers/wdm/audio/backpln/portcls/propertyhandler.cpp b/reactos/drivers/wdm/audio/backpln/portcls/propertyhandler.cpp index 730cd059a13..212826c713c 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/propertyhandler.cpp +++ b/reactos/drivers/wdm/audio/backpln/portcls/propertyhandler.cpp @@ -14,10 +14,13 @@ HandlePropertyInstances( IN PKSIDENTIFIER Request, IN OUT PVOID Data, IN PSUBDEVICE_DESCRIPTOR Descriptor, - IN BOOL Global) + IN BOOL Global, + IN ISubdevice *SubDevice) { KSPIN_CINSTANCES * Instances; KSP_PIN * Pin = (KSP_PIN*)Request; + ULONG FilterNecessary, FilterCurrent, FilterPossible, GlobalCurrent, GlobalPossible; + NTSTATUS Status; if (Pin->PinId >= Descriptor->Factory.PinDescriptorCount) { @@ -28,12 +31,31 @@ HandlePropertyInstances( Instances = (KSPIN_CINSTANCES*)Data; - if (Global) - Instances->PossibleCount = Descriptor->Factory.Instances[Pin->PinId].MaxGlobalInstanceCount; - else - Instances->PossibleCount = Descriptor->Factory.Instances[Pin->PinId].MaxFilterInstanceCount; + // check if the miniport supports the IPinCount interface + Status = SubDevice->PinCount(Pin->PinId, &FilterNecessary, &FilterCurrent, &FilterPossible, &GlobalCurrent, &GlobalPossible); - Instances->CurrentCount = Descriptor->Factory.Instances[Pin->PinId].CurrentPinInstanceCount; + if (NT_SUCCESS(Status)) + { + if (Global) + { + Instances->PossibleCount = GlobalPossible; + Instances->CurrentCount = GlobalCurrent; + } + else + { + Instances->PossibleCount = FilterPossible; + Instances->CurrentCount = FilterCurrent; + } + } + else + { + if (Global) + Instances->PossibleCount = Descriptor->Factory.Instances[Pin->PinId].MaxGlobalInstanceCount; + else + Instances->PossibleCount = Descriptor->Factory.Instances[Pin->PinId].MaxFilterInstanceCount; + + Instances->CurrentCount = Descriptor->Factory.Instances[Pin->PinId].CurrentPinInstanceCount; + } IoStatus->Information = sizeof(KSPIN_CINSTANCES); IoStatus->Status = STATUS_SUCCESS; @@ -45,10 +67,13 @@ HandleNecessaryPropertyInstances( IN PIO_STATUS_BLOCK IoStatus, IN PKSIDENTIFIER Request, IN OUT PVOID Data, - IN PSUBDEVICE_DESCRIPTOR Descriptor) + IN PSUBDEVICE_DESCRIPTOR Descriptor, + IN ISubdevice *SubDevice) { PULONG Result; KSP_PIN * Pin = (KSP_PIN*)Request; + ULONG FilterNecessary, FilterCurrent, FilterPossible, GlobalCurrent, GlobalPossible; + NTSTATUS Status; if (Pin->PinId >= Descriptor->Factory.PinDescriptorCount) { @@ -58,7 +83,19 @@ HandleNecessaryPropertyInstances( } Result = (PULONG)Data; - *Result = Descriptor->Factory.Instances[Pin->PinId].MinFilterInstanceCount; + + + // check if the miniport supports the IPinCount interface + Status = SubDevice->PinCount(Pin->PinId, &FilterNecessary, &FilterCurrent, &FilterPossible, &GlobalCurrent, &GlobalPossible); + + if (NT_SUCCESS(Status)) + { + *Result = FilterNecessary; + } + else + { + *Result = Descriptor->Factory.Instances[Pin->PinId].MinFilterInstanceCount; + } IoStatus->Information = sizeof(ULONG); IoStatus->Status = STATUS_SUCCESS; @@ -236,13 +273,13 @@ PinPropertyHandler( Status = KsPinPropertyHandler(Irp, Request, Data, Descriptor->Factory.PinDescriptorCount, Descriptor->Factory.KsPinDescriptor); break; case KSPROPERTY_PIN_GLOBALCINSTANCES: - Status = HandlePropertyInstances(&Irp->IoStatus, Request, Data, Descriptor, TRUE); + Status = HandlePropertyInstances(&Irp->IoStatus, Request, Data, Descriptor, TRUE, SubDevice); break; case KSPROPERTY_PIN_CINSTANCES: - Status = HandlePropertyInstances(&Irp->IoStatus, Request, Data, Descriptor, FALSE); + Status = HandlePropertyInstances(&Irp->IoStatus, Request, Data, Descriptor, FALSE, SubDevice); break; case KSPROPERTY_PIN_NECESSARYINSTANCES: - Status = HandleNecessaryPropertyInstances(&Irp->IoStatus, Request, Data, Descriptor); + Status = HandleNecessaryPropertyInstances(&Irp->IoStatus, Request, Data, Descriptor, SubDevice); break; case KSPROPERTY_PIN_DATAINTERSECTION: diff --git a/reactos/drivers/wdm/audio/backpln/portcls/undoc.cpp b/reactos/drivers/wdm/audio/backpln/portcls/undoc.cpp index 08970a8564a..56946f2d212 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/undoc.cpp +++ b/reactos/drivers/wdm/audio/backpln/portcls/undoc.cpp @@ -165,7 +165,7 @@ PropertyItemDispatch( // get instance / value size InstanceSize = IoStack->Parameters.DeviceIoControl.InputBufferLength; - Instance = Data; + Instance = Request; ValueSize = IoStack->Parameters.DeviceIoControl.OutputBufferLength; // initialize property request @@ -273,17 +273,15 @@ PropertyItemDispatch( if (PropertyRequest->PropertyItem && PropertyRequest->PropertyItem->Handler) { // now call the handler - UNICODE_STRING GuidBuffer; - RtlStringFromGUID(Property->Set, &GuidBuffer); - DPRINT1("Calling Node %lu MajorTarget %p MinorTarget %p PropertySet %S PropertyId %lu PropertyFlags %lx InstanceSize %lu ValueSize %lu Handler %p PropertyRequest %p\n", - PropertyRequest->Node, PropertyRequest->MajorTarget, PropertyRequest->MinorTarget, GuidBuffer.Buffer, Property->Id, Property->Flags, PropertyRequest->InstanceSize, PropertyRequest->ValueSize, - PropertyRequest->PropertyItem->Handler, PropertyRequest); -#if 0 + //UNICODE_STRING GuidBuffer; + //RtlStringFromGUID(Property->Set, &GuidBuffer); + //DPRINT("Calling Node %lu MajorTarget %p MinorTarget %p PropertySet %S PropertyId %lu PropertyFlags %lx InstanceSize %lu ValueSize %lu Handler %p PropertyRequest %p PropertyItemFlags %lx PropertyItemId %lu\n", + // PropertyRequest->Node, PropertyRequest->MajorTarget, PropertyRequest->MinorTarget, GuidBuffer.Buffer, Property->Id, Property->Flags, PropertyRequest->InstanceSize, PropertyRequest->ValueSize, + // PropertyRequest->PropertyItem->Handler, PropertyRequest, PropertyRequest->PropertyItem->Flags, PropertyRequest->PropertyItem->Id); + Status = PropertyRequest->PropertyItem->Handler(PropertyRequest); -#else - Status = STATUS_NOT_FOUND; -#endif - Irp->IoStatus.Information = PropertyRequest->ValueSize; + //DPRINT("Status %lx ValueSize %lu Information %lu\n", Status, PropertyRequest->ValueSize, Irp->IoStatus.Information); + Irp->IoStatus.Information = PropertyRequest->ValueSize; if (Status != STATUS_PENDING) {