[ros-diffs] [janderwald] 40250: - Remove dead code - Silence a few debug prints - Implement Dispatch_FastRead, Dispatch_fnFastDeviceIoControl - Change _InterlockedXXX to InterlockedXXX - Store IPortPinWaveCyclic pins in an array and close pin on a new create request (fixes a memory leak) - Complete the close irp when the stream has really been closed

janderwald at svn.reactos.org janderwald at svn.reactos.org
Thu Mar 26 10:59:46 CET 2009


Author: janderwald
Date: Thu Mar 26 12:59:45 2009
New Revision: 40250

URL: http://svn.reactos.org/svn/reactos?rev=40250&view=rev
Log:
- Remove dead code
- Silence a few debug prints
- Implement Dispatch_FastRead, Dispatch_fnFastDeviceIoControl
- Change _InterlockedXXX to InterlockedXXX
- Store IPortPinWaveCyclic pins in an array and close pin on a new create request (fixes a memory leak)
- Complete the close irp when the stream has really been closed


Modified:
    trunk/reactos/drivers/wdm/audio/backpln/portcls/adapter.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/api.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/connection.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/dispatcher.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/dma_slave.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/drm_port.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/filter_wavecyclic.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/irpstream.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/port_topology.c

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/adapter.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/adapter.c?rev=40250&r1=40249&r2=40250&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/adapter.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/adapter.c [iso-8859-1] Thu Mar 26 12:59:45 2009
@@ -50,15 +50,6 @@
 
     DPRINT1("PcInitializeAdapterDriver\n");
 
-#if 0
-    /* Set default stub - is this a good idea? */
-    DPRINT1("Setting IRP stub\n");
-    for ( i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i ++ )
-    {
-        DriverObject->MajorFunction[i] = IrpStub;
-    }
-#endif
-
     /* Our IRP handlers */
     DPRINT1("Setting IRP handlers\n");
     DriverObject->MajorFunction[IRP_MJ_CREATE] = PcDispatchIrp;
@@ -195,8 +186,6 @@
         return STATUS_UNSUCCESSFUL;
     }
 
-
-
     return status;
 }
 
@@ -241,6 +230,17 @@
         /* the provided port driver doesnt support ISubdevice */
         return STATUS_INVALID_PARAMETER;
     }
+
+    /* get the subdevice descriptor */
+    Status = SubDevice->lpVtbl->GetDescriptor(SubDevice, &SubDeviceDescriptor);
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT1("Failed to get subdevice descriptor %x\n", Status);
+        SubDevice->lpVtbl->Release(SubDevice);
+        return STATUS_UNSUCCESSFUL;
+    }
+
+    /* add an create item to the device header */
     Status = KsAddObjectCreateItemToDeviceHeader(DeviceExt->KsDeviceHeader, PcCreateItemDispatch, (PVOID)SubDevice, Name, NULL);
     if (!NT_SUCCESS(Status))
     {
@@ -249,17 +249,16 @@
         DPRINT1("KsAddObjectCreateItemToDeviceHeader failed with %x\n", Status);
         return Status;
     }
+
+    /* increment reference count */
     SubDevice->lpVtbl->AddRef(SubDevice);
 
-    Status = SubDevice->lpVtbl->GetDescriptor(SubDevice, &SubDeviceDescriptor);
-    if (!NT_SUCCESS(Status))
-    {
-        DPRINT1("Failed to get subdevice descriptor %x\n", Status);
-        SubDevice->lpVtbl->Release(SubDevice);
-    }
-
     for(Index = 0; Index < SubDeviceDescriptor->InterfaceCount; Index++)
     {
+        //FIXME
+        // Use a reference string such as Wave0001 / Topology0001
+        //
+
         Status = IoRegisterDeviceInterface(DeviceExt->PhysicalDeviceObject,
                                            &SubDeviceDescriptor->Interfaces[Index],
                                            NULL,

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/api.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/api.c?rev=40250&r1=40249&r2=40250&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/api.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/api.c [iso-8859-1] Thu Mar 26 12:59:45 2009
@@ -49,7 +49,7 @@
     Status = IoInitializeTimer(pDeviceObject, pTimerRoutine, pContext);
     if (!NT_SUCCESS(Status))
     {
-        DPRINT("IoInitializeTimer failed with %x\n", Status);
+        DPRINT1("IoInitializeTimer failed with %x\n", Status);
         return Status;
     }
 

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/connection.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/connection.c?rev=40250&r1=40249&r2=40250&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/connection.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/connection.c [iso-8859-1] Thu Mar 26 12:59:45 2009
@@ -94,8 +94,6 @@
     return Status;
 }
 
-
-
 /*
  * @implemented
  */

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/dispatcher.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/dispatcher.c?rev=40250&r1=40249&r2=40250&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/dispatcher.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/dispatcher.c [iso-8859-1] Thu Mar 26 12:59:45 2009
@@ -6,20 +6,14 @@
     PDEVICE_OBJECT DeviceObject,
     PIRP Irp)
 {
-    PIO_STACK_LOCATION IoStack;
-    IIrpTarget * IrpTarget;
-    PKSOBJECT_CREATE_ITEM CreateItem;
-
-    //DPRINT1("Dispatch_fnDeviceIoControl called DeviceObject %p Irp %p\n", DeviceObject);
-
-    /* access the create item */
-    CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
-
-    IoStack = IoGetCurrentIrpStackLocation(Irp);
-    ASSERT(IoStack->FileObject);
-
-    IrpTarget = (IIrpTarget*)CreateItem->Context;
-
+    IIrpTarget * IrpTarget;
+    PKSOBJECT_CREATE_ITEM CreateItem;
+
+    /* access the create item */
+    CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
+    /* get the IrpTarget */
+    IrpTarget = (IIrpTarget*)CreateItem->Context;
+    /* let IrpTarget handle request */
     return IrpTarget->lpVtbl->DeviceIoControl(IrpTarget, DeviceObject, Irp);
 }
 
@@ -29,20 +23,14 @@
     PDEVICE_OBJECT DeviceObject,
     PIRP Irp)
 {
-    PIO_STACK_LOCATION IoStack;
-    IIrpTarget * IrpTarget;
-    PKSOBJECT_CREATE_ITEM CreateItem;
-
-    DPRINT1("Dispatch_fnRead called DeviceObject %p Irp %p\n", DeviceObject);
-
-    /* access the create item */
-    CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
-
-    IoStack = IoGetCurrentIrpStackLocation(Irp);
-    ASSERT(IoStack->FileObject);
-
-    IrpTarget = (IIrpTarget*)CreateItem->Context;
-
+    IIrpTarget * IrpTarget;
+    PKSOBJECT_CREATE_ITEM CreateItem;
+
+    /* access the create item */
+    CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
+    /* get the IrpTarget */
+    IrpTarget = (IIrpTarget*)CreateItem->Context;
+    /* let IrpTarget handle request */
     return IrpTarget->lpVtbl->Read(IrpTarget, DeviceObject, Irp);
 }
 
@@ -52,20 +40,14 @@
     PDEVICE_OBJECT DeviceObject,
     PIRP Irp)
 {
-    PIO_STACK_LOCATION IoStack;
-    IIrpTarget * IrpTarget;
-    PKSOBJECT_CREATE_ITEM CreateItem;
-
-    DPRINT1("Dispatch_fnWrite called DeviceObject %p Irp %p\n", DeviceObject);
-
-    /* access the create item */
-    CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
-
-    IoStack = IoGetCurrentIrpStackLocation(Irp);
-    ASSERT(IoStack->FileObject);
-
-    IrpTarget = (IIrpTarget*)CreateItem->Context;
-
+    IIrpTarget * IrpTarget;
+    PKSOBJECT_CREATE_ITEM CreateItem;
+
+    /* access the create item */
+    CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
+    /* get the IrpTarget */
+    IrpTarget = (IIrpTarget*)CreateItem->Context;
+    /* let IrpTarget handle request */
     return IrpTarget->lpVtbl->Write(IrpTarget, DeviceObject, Irp);
 }
 
@@ -75,20 +57,14 @@
     PDEVICE_OBJECT DeviceObject,
     PIRP Irp)
 {
-    PIO_STACK_LOCATION IoStack;
-    IIrpTarget * IrpTarget;
-    PKSOBJECT_CREATE_ITEM CreateItem;
-
-    DPRINT1("Dispatch_fnFlush called DeviceObject %p Irp %p\n", DeviceObject);
-
-    /* access the create item */
-    CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
-
-    IoStack = IoGetCurrentIrpStackLocation(Irp);
-    ASSERT(IoStack->FileObject);
-
-    IrpTarget = (IIrpTarget*)CreateItem->Context;
-
+    IIrpTarget * IrpTarget;
+    PKSOBJECT_CREATE_ITEM CreateItem;
+
+    /* access the create item */
+    CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
+    /* get the IrpTarget */
+    IrpTarget = (IIrpTarget*)CreateItem->Context;
+    /* let IrpTarget handle request */
     return IrpTarget->lpVtbl->Flush(IrpTarget, DeviceObject, Irp);
 }
 
@@ -98,24 +74,14 @@
     PDEVICE_OBJECT DeviceObject,
     PIRP Irp)
 {
-    PIO_STACK_LOCATION IoStack;
-    IIrpTarget * IrpTarget;
-    PKSOBJECT_CREATE_ITEM CreateItem;
-
-    DPRINT1("Dispatch_fnClose called DeviceObject %p Irp %p\n", DeviceObject);
-
-    /* access the create item */
-    CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
-    ASSERT(CreateItem != NULL);
-
-    IoStack = IoGetCurrentIrpStackLocation(Irp);
-    ASSERT(IoStack != NULL);
-    ASSERT(IoStack->FileObject != NULL);
-
-    IrpTarget = (IIrpTarget*)CreateItem->Context;
-
-    //DPRINT1("IrpTarget %p\n", IrpTarget);
-
+    IIrpTarget * IrpTarget;
+    PKSOBJECT_CREATE_ITEM CreateItem;
+
+    /* access the create item */
+    CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
+    /* get the IrpTarget */
+    IrpTarget = (IIrpTarget*)CreateItem->Context;
+    /* let IrpTarget handle request */
     return IrpTarget->lpVtbl->Close(IrpTarget, DeviceObject, Irp);
 }
 
@@ -125,20 +91,14 @@
     PDEVICE_OBJECT DeviceObject,
     PIRP Irp)
 {
-    PIO_STACK_LOCATION IoStack;
-    IIrpTarget * IrpTarget;
-    PKSOBJECT_CREATE_ITEM CreateItem;
-
-    DPRINT1("Dispatch_fnQuerySecurity called DeviceObject %p Irp %p\n", DeviceObject);
-
-    /* access the create item */
-    CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
-
-    IoStack = IoGetCurrentIrpStackLocation(Irp);
-    ASSERT(IoStack->FileObject);
-
-    IrpTarget = (IIrpTarget*)CreateItem->Context;
-
+    IIrpTarget * IrpTarget;
+    PKSOBJECT_CREATE_ITEM CreateItem;
+
+    /* access the create item */
+    CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
+    /* get the IrpTarget */
+    IrpTarget = (IIrpTarget*)CreateItem->Context;
+    /* let IrpTarget handle request */
     return IrpTarget->lpVtbl->QuerySecurity(IrpTarget, DeviceObject, Irp);
 }
 
@@ -148,20 +108,14 @@
     PDEVICE_OBJECT DeviceObject,
     PIRP Irp)
 {
-    PIO_STACK_LOCATION IoStack;
-    IIrpTarget * IrpTarget;
-    PKSOBJECT_CREATE_ITEM CreateItem;
-
-    DPRINT1("Dispatch_fnSetSecurity called DeviceObject %p Irp %p\n", DeviceObject);
-
-    /* access the create item */
-    CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
-
-    IoStack = IoGetCurrentIrpStackLocation(Irp);
-    ASSERT(IoStack->FileObject);
-
-    IrpTarget = (IIrpTarget*)CreateItem->Context;
-
+    IIrpTarget * IrpTarget;
+    PKSOBJECT_CREATE_ITEM CreateItem;
+
+    /* access the create item */
+    CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
+    /* get the IrpTarget */
+    IrpTarget = (IIrpTarget*)CreateItem->Context;
+    /* let IrpTarget handle request */
     return IrpTarget->lpVtbl->SetSecurity(IrpTarget, DeviceObject, Irp);
 }
 
@@ -178,10 +132,13 @@
     PIO_STATUS_BLOCK IoStatus,
     PDEVICE_OBJECT DeviceObject)
 {
-    DPRINT1("Dispatch_fnFastDeviceIoControl called DeviceObject %p Irp %p\n", DeviceObject);
-
-
-    return FALSE;
+    IIrpTarget * IrpTarget;
+
+    /* access IrpTarget */
+    IrpTarget = (IIrpTarget *)FileObject->FsContext2;
+
+    /* let IrpTarget handle request */
+    return IrpTarget->lpVtbl->FastDeviceIoControl(IrpTarget, FileObject, Wait, InputBuffer, InputBufferLength, OutputBuffer, OutputBufferLength, IoControlCode, IoStatus, DeviceObject);
 }
 
 
@@ -197,10 +154,13 @@
     PIO_STATUS_BLOCK IoStatus,
     PDEVICE_OBJECT DeviceObject)
 {
-    DPRINT1("Dispatch_fnFastRead called DeviceObject %p Irp %p\n", DeviceObject);
-
-    return FALSE;
-
+    IIrpTarget * IrpTarget;
+
+    /* access IrpTarget */
+    IrpTarget = (IIrpTarget *)FileObject->FsContext2;
+
+    /* let IrpTarget handle request */
+    return IrpTarget->lpVtbl->FastRead(IrpTarget, FileObject, FileOffset, Length, Wait, LockKey, Buffer, IoStatus, DeviceObject);
 }
 
 BOOLEAN
@@ -216,10 +176,10 @@
     PDEVICE_OBJECT DeviceObject)
 {
     IIrpTarget * IrpTarget;
-    //DPRINT1("Dispatch_fnFastWrite called DeviceObject %p Irp %p\n", DeviceObject);
-
+
+    /* access IrpTarget */
     IrpTarget = (IIrpTarget *)FileObject->FsContext2;
-
+    /* let IrpTarget handle request */
     return IrpTarget->lpVtbl->FastWrite(IrpTarget, FileObject, FileOffset, Length, Wait, LockKey, Buffer, IoStatus, DeviceObject);
 }
 

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/dma_slave.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/dma_slave.c?rev=40250&r1=40249&r2=40250&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/dma_slave.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/dma_slave.c [iso-8859-1] Thu Mar 26 12:59:45 2009
@@ -112,9 +112,6 @@
         DPRINT1("IDmaChannelSlave_AllocateBuffer free common buffer first \n");
         return STATUS_UNSUCCESSFUL;
     }
-
-    //FIXME
-    // retry with different size on failure
 
     This->Buffer = This->pAdapter->DmaOperations->AllocateCommonBuffer(This->pAdapter, BufferSize, &This->Address, FALSE);
     if (!This->Buffer)
@@ -400,7 +397,7 @@
 
     This->DmaStarted = FALSE;
 
-    return 0;
+    return STATUS_SUCCESS;
 }
 
 NTSTATUS
@@ -493,7 +490,7 @@
 
     IDmaChannelSlaveImpl * This;
 
-    DPRINT1("OutDmaChannel %p OuterUnknown %p PoolType %p DeviceDescription %p DeviceObject %p\n",
+    DPRINT("OutDmaChannel %p OuterUnknown %p PoolType %p DeviceDescription %p DeviceObject %p\n",
             OutDmaChannel, OuterUnknown, PoolType, DeviceDescription, DeviceObject);
 
     This = AllocateItem(PoolType, sizeof(IDmaChannelSlaveImpl), TAG_PORTCLASS);
@@ -509,8 +506,6 @@
     {
         DeviceDescription->InterfaceType = BusType;
     }
-
-    DPRINT1("Calling IoGetDmaAdapter\n");
 
     Adapter = IoGetDmaAdapter(DeviceExt->PhysicalDeviceObject, DeviceDescription, &MapRegisters);
     if (!Adapter)

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/drm_port.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/drm_port.c?rev=40250&r1=40249&r2=40250&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/drm_port.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/drm_port.c [iso-8859-1] Thu Mar 26 12:59:45 2009
@@ -15,7 +15,7 @@
 
     DPRINT("IDrmPort2_AddRef: This %p\n", This);
 
-    return _InterlockedIncrement(&This->ref);
+    return InterlockedIncrement(&This->ref);
 }
 
 ULONG
@@ -25,7 +25,7 @@
 {
     IDrmPort2Impl * This = (IDrmPort2Impl*)iface;
 
-    _InterlockedDecrement(&This->ref);
+    InterlockedDecrement(&This->ref);
 
     if (This->ref == 0)
     {
@@ -51,13 +51,12 @@
         IsEqualGUIDAligned(refiid, &IID_IUnknown))
     {
         *Output = (PVOID)&This->lpVtbl;
-        _InterlockedIncrement(&This->ref);
+        InterlockedIncrement(&This->ref);
         return STATUS_SUCCESS;
     }
 
     StringFromCLSID(refiid, Buffer);
     DPRINT1("IDrmPort2_QueryInterface no interface!!! iface %S\n", Buffer);
-    KeBugCheckEx(0, 0, 0, 0, 0);
     return STATUS_UNSUCCESSFUL;
 }
 

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/filter_wavecyclic.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/filter_wavecyclic.c?rev=40250&r1=40249&r2=40250&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/filter_wavecyclic.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/filter_wavecyclic.c [iso-8859-1] Thu Mar 26 12:59:45 2009
@@ -7,7 +7,8 @@
     LONG ref;
 
     IPortWaveCyclic* Port;
-    IPortPinWaveCyclic * Pin;
+    IPortPinWaveCyclic ** Pins;
+    SUBDEVICE_DESCRIPTOR * Descriptor;
 
 }IPortFilterWaveCyclicImpl;
 
@@ -69,7 +70,7 @@
 }
 
 /*
- * @unimplemented
+ * @implemented
  */
 NTSTATUS
 NTAPI
@@ -83,55 +84,58 @@
     IN PIRP Irp,
     IN KSOBJECT_CREATE *CreateObject)
 {
-    ISubdevice * ISubDevice;
     NTSTATUS Status;
     IPortPinWaveCyclic * Pin;
-    SUBDEVICE_DESCRIPTOR * Descriptor;
     PKSPIN_CONNECT ConnectDetails;
     IPortFilterWaveCyclicImpl * This = (IPortFilterWaveCyclicImpl *)iface;
 
     ASSERT(This->Port);
+    ASSERT(This->Descriptor);
+    ASSERT(This->Pins);
 
     DPRINT("IPortFilterWaveCyclic_fnNewIrpTarget entered\n");
 
-    Status = This->Port->lpVtbl->QueryInterface(This->Port, &IID_ISubdevice, (PVOID*)&ISubDevice);
+    /* let's verify the connection request */
+    Status = PcValidateConnectRequest(Irp, &This->Descriptor->Factory, &ConnectDetails);
     if (!NT_SUCCESS(Status))
+    {
         return STATUS_UNSUCCESSFUL;
-
-    Status = ISubDevice->lpVtbl->GetDescriptor(ISubDevice, &Descriptor);
-    if (!NT_SUCCESS(Status))
-        return STATUS_UNSUCCESSFUL;
-
-    Status = PcValidateConnectRequest(Irp, &Descriptor->Factory, &ConnectDetails);
-    if (!NT_SUCCESS(Status))
-    {
-        ISubDevice->lpVtbl->Release(ISubDevice);
-        return STATUS_UNSUCCESSFUL;
-    }
-
-    ISubDevice->lpVtbl->Release(ISubDevice);
-
+    }
+
+    if (This->Pins[ConnectDetails->PinId] && This->Descriptor->Factory.Instances[ConnectDetails->PinId].CurrentPinInstanceCount)
+    {
+        /* release existing instance */
+        This->Pins[ConnectDetails->PinId]->lpVtbl->Close(This->Pins[ConnectDetails->PinId], DeviceObject, NULL);
+    }
+
+    /* now create the pin */
     Status = NewPortPinWaveCyclic(&Pin);
     if (!NT_SUCCESS(Status))
     {
         return Status;
     }
 
-    Status = Pin->lpVtbl->Init(Pin, This->Port, iface, ConnectDetails, &Descriptor->Factory.KsPinDescriptor[ConnectDetails->PinId]);
+    /* initialize the pin */
+    Status = Pin->lpVtbl->Init(Pin, This->Port, iface, ConnectDetails, &This->Descriptor->Factory.KsPinDescriptor[ConnectDetails->PinId]);
     if (!NT_SUCCESS(Status))
     {
         Pin->lpVtbl->Release(Pin);
         return Status;
     }
 
-    /* store pin handle */
-    This->Pin = Pin;
+    /* release existing pin */
+    if (This->Pins[ConnectDetails->PinId])
+    {
+        This->Pins[ConnectDetails->PinId]->lpVtbl->Release(This->Pins[ConnectDetails->PinId]);
+    }
+    /* store pin */
+    This->Pins[ConnectDetails->PinId] = Pin;
 
     /* store result */
     *OutTarget = (IIrpTarget*)Pin;
 
     /* increment current instance count */
-    Descriptor->Factory.Instances[ConnectDetails->PinId].CurrentPinInstanceCount++;
+    This->Descriptor->Factory.Instances[ConnectDetails->PinId].CurrentPinInstanceCount++;
 
     return Status;
 }
@@ -207,7 +211,7 @@
 }
 
 /*
- * @unimplemented
+ * @implemented
  */
 NTSTATUS
 NTAPI
@@ -216,10 +220,18 @@
     IN PDEVICE_OBJECT DeviceObject,
     IN PIRP Irp)
 {
-    DPRINT1("IPortFilterWaveCyclic_fnClose entered\n");
-
-    //FIXME
-    //close all pin instances
+    ULONG Index;
+    IPortFilterWaveCyclicImpl * This = (IPortFilterWaveCyclicImpl *)iface;
+
+    for(Index = 0; Index < This->Descriptor->Factory.PinDescriptorCount; Index++)
+    {
+        if (This->Pins[Index])
+        {
+            This->Pins[Index]->lpVtbl->Close(This->Pins[Index], DeviceObject, NULL);
+        }
+
+    }
+
 
     Irp->IoStatus.Status = STATUS_SUCCESS;
     Irp->IoStatus.Information = 0;
@@ -271,7 +283,7 @@
     OUT PIO_STATUS_BLOCK StatusBlock,
     IN PDEVICE_OBJECT DeviceObject)
 {
-
+    UNIMPLEMENTED
     return STATUS_SUCCESS;
 }
 
@@ -291,6 +303,7 @@
     OUT PIO_STATUS_BLOCK StatusBlock,
     IN PDEVICE_OBJECT DeviceObject)
 {
+    UNIMPLEMENTED
     return STATUS_SUCCESS;
 }
 
@@ -310,6 +323,7 @@
     OUT PIO_STATUS_BLOCK StatusBlock,
     IN PDEVICE_OBJECT DeviceObject)
 {
+    UNIMPLEMENTED
     return STATUS_SUCCESS;
 }
 
@@ -323,12 +337,38 @@
     IN IPortFilterWaveCyclic* iface,
     IN IPortWaveCyclic* Port)
 {
+    ISubdevice * ISubDevice;
+    SUBDEVICE_DESCRIPTOR * Descriptor;
+    NTSTATUS Status;
     IPortFilterWaveCyclicImpl * This = (IPortFilterWaveCyclicImpl*)iface;
 
     This->Port = Port;
 
+    /* get our private interface */
+    Status = This->Port->lpVtbl->QueryInterface(This->Port, &IID_ISubdevice, (PVOID*)&ISubDevice);
+    if (!NT_SUCCESS(Status))
+        return STATUS_UNSUCCESSFUL;
+
+    /* get the subdevice descriptor */
+    Status = ISubDevice->lpVtbl->GetDescriptor(ISubDevice, &Descriptor);
+
+    /* release subdevice interface */
+    ISubDevice->lpVtbl->Release(ISubDevice);
+
+    if (!NT_SUCCESS(Status))
+        return STATUS_UNSUCCESSFUL;
+
+    /* save descriptor */
+    This->Descriptor = Descriptor;
+
+    /* allocate pin array */
+    This->Pins = AllocateItem(NonPagedPool, Descriptor->Factory.PinDescriptorCount * sizeof(IPortPinWaveCyclic*), TAG_PORTCLASS);
+
+    if (!This->Pins)
+        return STATUS_UNSUCCESSFUL;
+
     /* increment reference count */
-    iface->lpVtbl->AddRef(iface);
+    Port->lpVtbl->AddRef(Port);
 
     return STATUS_SUCCESS;
 }

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/irpstream.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/irpstream.c?rev=40250&r1=40249&r2=40250&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/irpstream.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/irpstream.c [iso-8859-1] Thu Mar 26 12:59:45 2009
@@ -178,8 +178,6 @@
         ExInterlockedInsertTailList(&This->ListHead, &Mapping->Entry, &This->Lock);
 
     (void)InterlockedIncrement((volatile long*)&This->NumMappings);
-
-
 
     if (Irp)
     {

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.c?rev=40250&r1=40249&r2=40250&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.c [iso-8859-1] Thu Mar 26 12:59:45 2009
@@ -30,6 +30,7 @@
     ULONG DelayedRequestInProgress;
     ULONG FrameSize;
     BOOL Capture;
+    PIRP CloseIrp;
 
 }IPortPinWaveCyclicImpl;
 
@@ -242,7 +243,7 @@
 
 
     Status = This->Stream->lpVtbl->GetPosition(This->Stream, &Position);
-    DPRINT1("Position %u Buffer %p BufferSize %u ActiveIrpOffset %u\n", Position, Buffer, This->CommonBufferSize, BufferSize);
+    DPRINT("Position %u Buffer %p BufferSize %u ActiveIrpOffset %u\n", Position, Buffer, This->CommonBufferSize, BufferSize);
 
     if (Position < This->CommonBufferOffset)
     {
@@ -616,29 +617,25 @@
     IN PDEVICE_OBJECT  DeviceObject,
     IN PVOID  Context)
 {
-    PMINIPORTWAVECYCLICSTREAM Stream = (PMINIPORTWAVECYCLICSTREAM)Context;
-
-    DPRINT("CloseStreamRoutine %p\n", Stream);
-    Stream->lpVtbl->Release(Stream);
-}
-
-/*
- * @implemented
- */
-NTSTATUS
-NTAPI
-IPortPinWaveCyclic_fnClose(
-    IN IPortPinWaveCyclic* iface,
-    IN PDEVICE_OBJECT DeviceObject,
-    IN PIRP Irp)
-{
+    PMINIPORTWAVECYCLICSTREAM Stream;
+    NTSTATUS Status;
     ISubdevice *ISubDevice;
-    NTSTATUS Status;
-    SUBDEVICE_DESCRIPTOR * Descriptor;
-    PIO_WORKITEM WorkItem;
-
-    IPortPinWaveCyclicImpl * This = (IPortPinWaveCyclicImpl*)iface;
-    DPRINT1("IPortPinWaveCyclic_fnClose\n");
+    PSUBDEVICE_DESCRIPTOR Descriptor;
+
+    IPortPinWaveCyclicImpl * This = (IPortPinWaveCyclicImpl*)Context;
+
+    if (This->Stream)
+    {
+        if (This->State != KSSTATE_STOP)
+        {
+            This->Stream->lpVtbl->SetState(This->Stream, KSSTATE_STOP);
+            KeStallExecutionProcessor(10);
+        }
+    }
+
+    This->ServiceGroup->lpVtbl->RemoveMember(This->ServiceGroup, (PSERVICESINK)&This->lpVtblServiceSink);
+    This->ServiceGroup->lpVtbl->Release(This->ServiceGroup);
+    This->DmaChannel->lpVtbl->Release(This->DmaChannel);
 
     Status = This->Port->lpVtbl->QueryInterface(This->Port, &IID_ISubdevice, (PVOID*)&ISubDevice);
     if (NT_SUCCESS(Status))
@@ -648,39 +645,73 @@
         {
             ISubDevice->lpVtbl->Release(ISubDevice);
             Descriptor->Factory.Instances[This->ConnectDetails->PinId].CurrentPinInstanceCount--;
-            DPRINT1("InstanceCount %u\n", Descriptor->Factory.Instances[This->ConnectDetails->PinId].CurrentPinInstanceCount);
         }
     }
 
+    if (This->Format)
+    {
+        ExFreePool(This->Format);
+        This->Format = NULL;
+    }
+
+    if (This->IrpQueue)
+    {
+        This->IrpQueue->lpVtbl->Release(This->IrpQueue);
+    }
 
     if (This->Stream)
     {
-        This->Stream->lpVtbl->SetState(This->Stream, KSSTATE_STOP);
-    }
-
-    This->ServiceGroup->lpVtbl->RemoveMember(This->ServiceGroup, (PSERVICESINK)&This->lpVtblServiceSink);
-    This->ServiceGroup->lpVtbl->Release(This->ServiceGroup);
-    This->DmaChannel->lpVtbl->Release(This->DmaChannel);
-
-    if (This->Format)
-        ExFreePool(This->Format);
-
-    This->IrpQueue->lpVtbl->Release(This->IrpQueue);
-
+        Stream = This->Stream;
+        This->Stream = NULL;
+
+        if (This->CloseIrp)
+        {
+            This->CloseIrp->IoStatus.Information = 0;
+            This->CloseIrp->IoStatus.Status = STATUS_SUCCESS;
+            IoCompleteRequest(This->CloseIrp, IO_NO_INCREMENT);
+        }
+        Stream->lpVtbl->Release(Stream);
+        /* this line is never reached */
+    }
+}
+
+/*
+ * @implemented
+ */
+NTSTATUS
+NTAPI
+IPortPinWaveCyclic_fnClose(
+    IN IPortPinWaveCyclic* iface,
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp)
+{
+    PIO_WORKITEM WorkItem;
+
+    IPortPinWaveCyclicImpl * This = (IPortPinWaveCyclicImpl*)iface;
 
     if (This->Stream)
     {
         WorkItem = IoAllocateWorkItem(DeviceObject);
         if (WorkItem)
         {
-            IoQueueWorkItem(WorkItem, CloseStreamRoutine, DelayedWorkQueue, (PVOID)This->Stream);
+            if (Irp)
+            {
+                This->CloseIrp = Irp;
+                IoMarkIrpPending(Irp);
+                Irp->IoStatus.Information = 0;
+                Irp->IoStatus.Status = STATUS_PENDING;
+            }
+            IoQueueWorkItem(WorkItem, CloseStreamRoutine, DelayedWorkQueue, (PVOID)This);
+            return STATUS_PENDING;
         }
     }
 
-    Irp->IoStatus.Information = 0;
-    Irp->IoStatus.Status = STATUS_SUCCESS;
-    IoCompleteRequest(Irp, IO_NO_INCREMENT);
-
+    if (Irp)
+    {
+        Irp->IoStatus.Information = 0;
+        Irp->IoStatus.Status = STATUS_SUCCESS;
+        IoCompleteRequest(Irp, IO_NO_INCREMENT);
+    }
     return STATUS_SUCCESS;
 }
 

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/port_topology.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/port_topology.c?rev=40250&r1=40249&r2=40250&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/port_topology.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/port_topology.c [iso-8859-1] Thu Mar 26 12:59:45 2009
@@ -598,7 +598,7 @@
                 IoCompleteRequest(Irp, IO_NO_INCREMENT);
                 return STATUS_INSUFFICIENT_RESOURCES;
             }
-            DPRINT1("Queueing IRP %p\n", Irp);
+            DPRINT1("Queueing IRP %p Irql %u\n", Irp, KeGetCurrentIrql());
             Irp->IoStatus.Information = 0;
             Irp->IoStatus.Status = STATUS_PENDING;
             IoMarkIrpPending(Irp);



More information about the Ros-diffs mailing list