Author: janderwald
Date: Mon Feb 21 04:22:45 2011
New Revision: 50851

URL: http://svn.reactos.org/svn/reactos?rev=50851&view=rev
Log:
[MMEBUDDY]
- Check if there is a reset request in progress while the wave thread is 
active. In that case exit the wave buffer commiting activity
- In the reset routine, perform an alertable wait in order to make the apc io 
completion complete
[PORTCLS]
- Only perform copying audio bytes to dma buffer while the adapter is reset 
state is KSREST_END
- Set the reset state indicator before canceling the audio buffers
- Should fix the audio hang experienced in Winamp when skipping audio bytes

Modified:
    trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.cpp
    trunk/reactos/lib/drivers/sound/mmebuddy/wave/streaming.c

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=50851&r1=50850&r2=50851&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] Mon Feb 21 04:22:45 2011
@@ -823,7 +823,7 @@
 
     PC_ASSERT_IRQL(DISPATCH_LEVEL);
 
-    if (m_State == KSSTATE_RUN)
+    if (m_State == KSSTATE_RUN && m_ResetState == KSRESET_END)
     {
         Status = m_Stream->GetPosition(&Position);
 
@@ -904,13 +904,19 @@
         /* check for success */
         if (NT_SUCCESS(Status))
         {
+            //determine state of reset request
             if (ResetValue == KSRESET_BEGIN)
             {
+                // start reset procress
+                // incoming read/write requests will be rejected
+                m_ResetState = KSRESET_BEGIN;
+
+                // cancel existing buffers
                 m_IrpQueue->CancelBuffers();
-                m_ResetState = KSRESET_BEGIN;
             }
             else if (ResetValue == KSRESET_END)
             {
+                // end of reset process
                 m_ResetState = KSRESET_END;
             }
         }

Modified: trunk/reactos/lib/drivers/sound/mmebuddy/wave/streaming.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/drivers/sound/mmebuddy/wave/streaming.c?rev=50851&r1=50850&r2=50851&view=diff
==============================================================================
--- trunk/reactos/lib/drivers/sound/mmebuddy/wave/streaming.c [iso-8859-1] 
(original)
+++ trunk/reactos/lib/drivers/sound/mmebuddy/wave/streaming.c [iso-8859-1] Mon 
Feb 21 04:22:45 2011
@@ -60,7 +60,7 @@
     }
 
     while ( ( SoundDeviceInstance->OutstandingBuffers < 
SoundDeviceInstance->BufferCount ) &&
-            ( Header ) )
+            ( Header ) && SoundDeviceInstance->ResetInProgress == FALSE)
     {
         HeaderExtension = (PWAVEHDR_EXTENSION) Header->reserved;
         SND_ASSERT( HeaderExtension );
@@ -176,8 +176,6 @@
     WaveHdr = (PWAVEHDR) SoundOverlapped->Header;
     SND_ASSERT( WaveHdr );
 
-    SND_ASSERT( ERROR_SUCCESS == dwErrorCode );
-
     HdrExtension = (PWAVEHDR_EXTENSION) WaveHdr->reserved;
     SND_ASSERT( HdrExtension );
 
@@ -305,6 +303,12 @@
          /* cancel all current audio buffers */
          FunctionTable->ResetStream(SoundDeviceInstance, DeviceType, TRUE);
     }
+    while(SoundDeviceInstance->OutstandingBuffers)
+    {
+        SND_TRACE(L"StopStreamingInSoundThread OutStandingBufferCount %lu\n", 
SoundDeviceInstance->OutstandingBuffers);
+        /* wait until pending i/o has completed */
+        SleepEx(10, TRUE);
+    }
 
     /* complete all current headers */
     while( SoundDeviceInstance->HeadWaveHeader )
@@ -316,12 +320,6 @@
     /* there should be no oustanding buffers now */
     SND_ASSERT(SoundDeviceInstance->OutstandingBuffers == 0);
 
-    while(SoundDeviceInstance->OutstandingBuffers)
-    {
-        SND_ERR("StopStreamingInSoundThread OutStandingBufferCount %lu\n", 
SoundDeviceInstance->OutstandingBuffers);
-        /* my hack of doom */
-        Sleep(10);
-    }
 
     /* Check if reset function is supported */
     if (FunctionTable->ResetStream)


Reply via email to