[ros-diffs] [janderwald] 45862: [PORTCLS] - Implement a function to retrieve the current acquired mapping tag range of the miniport driver - Call RevokeMappings when audio pin is stopped

janderwald at svn.reactos.org janderwald at svn.reactos.org
Fri Mar 5 11:11:54 CET 2010


Author: janderwald
Date: Fri Mar  5 11:11:54 2010
New Revision: 45862

URL: http://svn.reactos.org/svn/reactos?rev=45862&view=rev
Log:
[PORTCLS]
- Implement a function to retrieve the current acquired mapping tag range of the miniport driver
- Call RevokeMappings when audio pin is stopped

Modified:
    trunk/reactos/drivers/wdm/audio/backpln/portcls/interfaces.hpp
    trunk/reactos/drivers/wdm/audio/backpln/portcls/irpstream.cpp
    trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.cpp
    trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.cpp

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/interfaces.hpp
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/interfaces.hpp?rev=45862&r1=45861&r2=45862&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/interfaces.hpp [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/interfaces.hpp [iso-8859-1] Fri Mar  5 11:11:54 2010
@@ -351,6 +351,11 @@
 
     STDMETHOD_(BOOLEAN, HasLastMappingFailed)(THIS) PURE;
     STDMETHOD_(ULONG, GetCurrentIrpOffset)(THIS) PURE;
+
+    STDMETHOD_(BOOLEAN, GetAcquiredTagRange)(THIS_
+        IN PVOID * FirstTag,
+        IN PVOID * LastTag);
+
 };
 
 
@@ -387,7 +392,11 @@
         IN PVOID Tag);                                 \
                                                        \
     STDMETHODIMP_(BOOLEAN) HasLastMappingFailed(THIS); \
-    STDMETHODIMP_(ULONG) GetCurrentIrpOffset(THIS);
+    STDMETHODIMP_(ULONG) GetCurrentIrpOffset(THIS);    \
+    STDMETHODIMP_(BOOLEAN) GetAcquiredTagRange(THIS_      \
+        IN PVOID * FirstTag,                           \
+        IN PVOID * LastTag);
+
 
 
 /*****************************************************************************

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/irpstream.cpp
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/irpstream.cpp?rev=45862&r1=45861&r2=45862&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/irpstream.cpp [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/irpstream.cpp [iso-8859-1] Fri Mar  5 11:11:54 2010
@@ -539,6 +539,53 @@
     return m_CurrentOffset;
 }
 
+BOOLEAN
+NTAPI
+CIrpQueue::GetAcquiredTagRange(
+    IN PVOID * FirstTag,
+    IN PVOID * LastTag)
+{
+    KIRQL OldLevel;
+    BOOLEAN Ret = FALSE;
+    PIRP Irp;
+    PLIST_ENTRY CurEntry;
+
+    KeAcquireSpinLock(&m_IrpListLock, &OldLevel);
+
+    if (!IsListEmpty(&m_FreeIrpList))
+    {
+        // get first entry
+        CurEntry = RemoveHeadList(&m_FreeIrpList);
+        // get irp from list entry
+        Irp = (PIRP)CONTAINING_RECORD(CurEntry, IRP, Tail.Overlay.ListEntry);
+
+        // get tag of first acquired buffer
+        *FirstTag = Irp->Tail.Overlay.DriverContext[3];
+
+        // put back irp
+        InsertHeadList(&m_FreeIrpList, &Irp->Tail.Overlay.ListEntry);
+
+        // get last entry
+        CurEntry = RemoveTailList(&m_FreeIrpList);
+        // get irp from list entry
+        Irp = (PIRP)CONTAINING_RECORD(CurEntry, IRP, Tail.Overlay.ListEntry);
+
+        // get tag of first acquired buffer
+        *LastTag = Irp->Tail.Overlay.DriverContext[3];
+
+        // put back irp
+        InsertTailList(&m_FreeIrpList, &Irp->Tail.Overlay.ListEntry);
+
+        // indicate success
+        Ret = TRUE;
+    }
+
+    // release lock
+    KeReleaseSpinLock(&m_IrpListLock, OldLevel);
+    // done
+    return Ret;
+}
+
 NTSTATUS
 NTAPI
 NewIrpQueue(

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.cpp
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.cpp?rev=45862&r1=45861&r2=45862&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.cpp [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.cpp [iso-8859-1] Fri Mar  5 11:11:54 2010
@@ -346,7 +346,6 @@
             Position->WriteOffset = (ULONGLONG)Pin->m_IrpQueue->GetCurrentIrpOffset();
             DPRINT("Play %lu Write %lu\n", Position->PlayOffset, Position->WriteOffset);
         }
-
 
         Irp->IoStatus.Information = sizeof(KSAUDIO_POSITION);
         return STATUS_SUCCESS;

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.cpp
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.cpp?rev=45862&r1=45861&r2=45862&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.cpp [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.cpp [iso-8859-1] Fri Mar  5 11:11:54 2010
@@ -195,6 +195,8 @@
     NTSTATUS Status = STATUS_UNSUCCESSFUL;
     CPortPinWavePci *Pin;
     PSUBDEVICE_DESCRIPTOR Descriptor;
+    PVOID FirstTag, LastTag;
+    ULONG MappingsRevoked;
     PKSSTATE State = (PKSSTATE)Data;
 
     // get sub device descriptor 
@@ -221,6 +223,35 @@
         {
             // store new state
             Pin->m_State = *State;
+            if (Pin->m_ConnectDetails->Interface.Id == KSINTERFACE_STANDARD_LOOPED_STREAMING && Pin->m_State == KSSTATE_STOP)
+            {
+                // FIXME
+                // complete with successful state
+                Pin->m_IrpQueue->CancelBuffers();
+                while(Pin->m_IrpQueue->GetAcquiredTagRange(&FirstTag, &LastTag))
+                {
+                    Status = Pin->m_Stream->RevokeMappings(FirstTag, LastTag, &MappingsRevoked);
+                    DPRINT("RevokeMappings Status %lx MappingsRevoked: %lu\n", Status, MappingsRevoked);
+                    KeStallExecutionProcessor(10);
+                }
+                Pin->m_Position.PlayOffset = 0;
+                Pin->m_Position.WriteOffset = 0;
+            }
+            else if (Pin->m_State == KSSTATE_STOP)
+            {
+                Pin->m_IrpQueue->CancelBuffers();
+                while(Pin->m_IrpQueue->GetAcquiredTagRange(&FirstTag, &LastTag))
+                {
+                    Status = Pin->m_Stream->RevokeMappings(FirstTag, LastTag, &MappingsRevoked);
+                    DPRINT("RevokeMappings Status %lx MappingsRevoked: %lu\n", Status, MappingsRevoked);
+                    KeStallExecutionProcessor(10);
+                }
+                Pin->m_Position.PlayOffset = 0;
+                Pin->m_Position.WriteOffset = 0;
+            }
+            // store result
+            Irp->IoStatus.Information = sizeof(KSSTATE);
+
         }
         // store result
         Irp->IoStatus.Information = sizeof(KSSTATE);




More information about the Ros-diffs mailing list