Author: janderwald
Date: Fri Feb 25 14:10:31 2011
New Revision: 50897

URL: http://svn.reactos.org/svn/reactos?rev=50897&view=rev
Log:
[MMEBUDDY]
- Store the internal state if an audio stream has been stopped
- Construct a thread when WODM_RESTART is received. This thread then triggers 
performs a callback to the wave thread, which finally restarts playback
- Only start the wave thread when playback is active (not paused by WODM_PAUSE)
- Fixes playback in Winamp 5.601 despite graphical issues
- Tested in Vbox 4.0 + 512MB RAM + Winamp 5.601

Modified:
    trunk/reactos/include/reactos/libs/sound/mmebuddy.h
    trunk/reactos/lib/drivers/sound/mmebuddy/mmewrap.c
    trunk/reactos/lib/drivers/sound/mmebuddy/wave/header.c
    trunk/reactos/lib/drivers/sound/mmebuddy/wave/streaming.c

Modified: trunk/reactos/include/reactos/libs/sound/mmebuddy.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/include/reactos/libs/sound/mmebuddy.h?rev=50897&r1=50896&r2=50897&view=diff
==============================================================================
--- trunk/reactos/include/reactos/libs/sound/mmebuddy.h [iso-8859-1] (original)
+++ trunk/reactos/include/reactos/libs/sound/mmebuddy.h [iso-8859-1] Fri Feb 25 
14:10:31 2011
@@ -366,6 +366,7 @@
     HANDLE hStopEvent;
     HANDLE hResetEvent;
     BOOL ResetInProgress;
+    BOOL bPaused;
 } SOUND_DEVICE_INSTANCE, *PSOUND_DEVICE_INSTANCE;
 
 /* This lives in WAVEHDR.reserved */
@@ -702,6 +703,9 @@
 StopStreaming(
     IN  PSOUND_DEVICE_INSTANCE SoundDeviceInstance);
 
+VOID
+InitiateSoundStreaming(
+    IN  PSOUND_DEVICE_INSTANCE SoundDeviceInstance);
 
 /*
     kernel.c

Modified: trunk/reactos/lib/drivers/sound/mmebuddy/mmewrap.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/drivers/sound/mmebuddy/mmewrap.c?rev=50897&r1=50896&r2=50897&view=diff
==============================================================================
--- trunk/reactos/lib/drivers/sound/mmebuddy/mmewrap.c [iso-8859-1] (original)
+++ trunk/reactos/lib/drivers/sound/mmebuddy/mmewrap.c [iso-8859-1] Fri Feb 25 
14:10:31 2011
@@ -29,6 +29,7 @@
     PMMFUNCTION_TABLE FunctionTable;
     PSOUND_DEVICE SoundDevice;
     PSOUND_DEVICE_INSTANCE SoundDeviceInstance;
+    BOOL OldState;
 
     VALIDATE_MMSYS_PARAMETER( PrivateHandle );
     SoundDeviceInstance = (PSOUND_DEVICE_INSTANCE) PrivateHandle;
@@ -52,6 +53,20 @@
     }
     /* Try change state */
     Result = FunctionTable->SetState(SoundDeviceInstance, bStart);
+
+    if ( MMSUCCESS(Result) )
+    {
+        /* Get old audio stream state */
+        OldState = SoundDeviceInstance->bPaused;
+
+        /* Store audio stream pause state */
+        SoundDeviceInstance->bPaused = !bStart;
+
+        if (SoundDeviceInstance->bPaused == FALSE && OldState == TRUE)
+        {
+            InitiateSoundStreaming(SoundDeviceInstance);
+        }
+    }
 
     return Result;
 }

Modified: trunk/reactos/lib/drivers/sound/mmebuddy/wave/header.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/drivers/sound/mmebuddy/wave/header.c?rev=50897&r1=50896&r2=50897&view=diff
==============================================================================
--- trunk/reactos/lib/drivers/sound/mmebuddy/wave/header.c [iso-8859-1] 
(original)
+++ trunk/reactos/lib/drivers/sound/mmebuddy/wave/header.c [iso-8859-1] Fri Feb 
25 14:10:31 2011
@@ -242,7 +242,11 @@
         SoundDeviceInstance->HeadWaveHeader = WaveHeader;
         SoundDeviceInstance->TailWaveHeader = WaveHeader;
 
-        DoWaveStreaming(SoundDeviceInstance);
+        /* Only do wave streaming when the stream has not been paused */
+        if (SoundDeviceInstance->bPaused == FALSE)
+        {
+            DoWaveStreaming(SoundDeviceInstance);
+        }
     }
     else
     {
@@ -258,7 +262,11 @@
             SoundDeviceInstance->TailWaveHeader = WaveHeader;
             DUMP_WAVEHDR_QUEUE(SoundDeviceInstance);
 
-            DoWaveStreaming(SoundDeviceInstance);
+            /* Only do wave streaming when the stream has not been paused */
+            if ( SoundDeviceInstance->bPaused == FALSE )
+            {
+                DoWaveStreaming(SoundDeviceInstance);
+            }
         }
     }
 

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=50897&r1=50896&r2=50897&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] Fri 
Feb 25 14:10:31 2011
@@ -361,3 +361,37 @@
                            StopStreamingInSoundThread,
                            NULL);
 }
+
+MMRESULT
+PerformWaveStreaming(
+    IN  PSOUND_DEVICE_INSTANCE SoundDeviceInstance,
+    IN  PVOID Parameter)
+{
+    DoWaveStreaming(SoundDeviceInstance);
+
+    return MMSYSERR_NOERROR;
+}
+
+DWORD
+WINAPI
+WaveActivateSoundStreaming(
+    IN PVOID lpParameter)
+{
+    CallSoundThread((PSOUND_DEVICE_INSTANCE)lpParameter,
+                    PerformWaveStreaming,
+                    NULL);
+
+    ExitThread(0);
+}
+
+VOID
+InitiateSoundStreaming(
+    IN  PSOUND_DEVICE_INSTANCE SoundDeviceInstance)
+{
+    HANDLE hThread;
+
+    hThread = CreateThread(NULL, 0, WaveActivateSoundStreaming, 
(PVOID)SoundDeviceInstance, 0, NULL);
+
+    if (hThread != NULL)
+        CloseHandle(hThread);
+}


Reply via email to