remove the stub of  ThreadCallWaveDevice and implement it there it need it.
Modified: trunk/reactos/lib/mmdrv/wave.c

Modified: trunk/reactos/lib/mmdrv/wave.c
--- trunk/reactos/lib/mmdrv/wave.c	2005-11-20 23:25:16 UTC (rev 19397)
+++ trunk/reactos/lib/mmdrv/wave.c	2005-11-21 00:16:30 UTC (rev 19398)
@@ -85,15 +85,11 @@
 	return MMSYSERR_NOERROR;
 }
 
-//FIXME: Params are MS-specific
-static MMRESULT ThreadCallWaveDevice(WAVETHREADFUNCTION Function, PWAVEALLOC pClient)
-{
-	return MMSYSERR_NOERROR;
-}
 
 //FIXME: Params are MS-specific
 static void CallbackWaveDevice(PWAVEALLOC pWave, DWORD msg, DWORD dw1)
 {
+
 }
 
 //FIXME: Params are MS-specific
@@ -162,6 +158,8 @@
  */
 APIENTRY DWORD wodMessage(DWORD dwId, DWORD dwMessage, DWORD dwUser, DWORD dwParam1, DWORD dwParam2)
 {
+    PWAVEALLOC pTask = (PWAVEALLOC)dwUser;
+
     switch (dwMessage) {
         case WODM_GETNUMDEVS:
             DPRINT("WODM_GETNUMDEVS");
@@ -178,13 +176,16 @@
 
         case WODM_CLOSE:
 			{
-				MMRESULT Result;
-				PWAVEALLOC pTask = (PWAVEALLOC)dwUser;
+				MMRESULT Result;				
 				DPRINT("WODM_CLOSE");
 
 				// 1. Check if the task is ready to complete
-				Result = ThreadCallWaveDevice(WaveThreadClose, pTask);
-				if (Result != MMSYSERR_NOERROR) {
+                pTask->AuxFunction = WaveThreadClose;
+                SetEvent(pTask->AuxEvent1);
+                WaitForSingleObject(pTask->AuxEvent2, INFINITE);
+	            			
+				if ( pTask->AuxReturnCode != MMSYSERR_NOERROR) 
+                {
 				    return Result;
 				}
 				else
@@ -233,36 +234,57 @@
 				return WriteWaveDevice(pWaveHdr, (PWAVEALLOC)dwUser);
 			}
 
+        case WODM_PAUSE:
+            
 
-        case WODM_PAUSE:
             DPRINT("WODM_PAUSE");
-            ((PWAVEALLOC)dwUser)->AuxParam.State = WAVE_DD_STOP;
-            return ThreadCallWaveDevice(WaveThreadSetState, (PWAVEALLOC)dwUser);
+            pTask->AuxParam.State = WAVE_DD_STOP;
+           
+            pTask->AuxFunction = WaveThreadSetState;
+            SetEvent(pTask->AuxEvent1);
+            WaitForSingleObject(pTask->AuxEvent2, INFINITE);
+	        return pTask->AuxReturnCode;
 
         case WODM_RESTART:
             DPRINT("WODM_RESTART");
-            ((PWAVEALLOC)dwUser)->AuxParam.State = WAVE_DD_PLAY;
-            return ThreadCallWaveDevice(WaveThreadSetState, (PWAVEALLOC)dwUser);
+            pTask->AuxParam.State = WAVE_DD_PLAY;
 
+            pTask->AuxFunction = WaveThreadSetState;
+            SetEvent(pTask->AuxEvent1);
+            WaitForSingleObject(pTask->AuxEvent2, INFINITE);
+	        return pTask->AuxReturnCode;            
+
         case WODM_RESET:
             DPRINT("WODM_RESET");
-            ((PWAVEALLOC)dwUser)->AuxParam.State = WAVE_DD_RESET;
-            return ThreadCallWaveDevice(WaveThreadSetState, (PWAVEALLOC)dwUser);
+            pTask->AuxParam.State = WAVE_DD_RESET;
 
+            pTask->AuxFunction = WaveThreadSetState;
+            SetEvent(pTask->AuxEvent1);
+            WaitForSingleObject(pTask->AuxEvent2, INFINITE);
+	        return pTask->AuxReturnCode;
+           
         case WODM_BREAKLOOP:
             DPRINT("WODM_BREAKLOOP");
-            return ThreadCallWaveDevice(WaveThreadBreakLoop, (PWAVEALLOC)dwUser);
 
+            pTask->AuxFunction = WaveThreadBreakLoop;
+            SetEvent(pTask->AuxEvent1);
+            WaitForSingleObject(pTask->AuxEvent2, INFINITE);
+	        return pTask->AuxReturnCode;
+
         case WODM_GETPOS:
             DPRINT("WODM_GETPOS");
-            return GetPositionWaveDevice(((PWAVEALLOC)dwUser), (LPMMTIME)dwParam1, dwParam2);
+            return GetPositionWaveDevice(pTask, (LPMMTIME)dwParam1, dwParam2);
 
         case WODM_SETPITCH:
             DPRINT("WODM_SETPITCH");
-            ((PWAVEALLOC)dwUser)->AuxParam.GetSetData.pData = (PBYTE)&dwParam1;
-            ((PWAVEALLOC)dwUser)->AuxParam.GetSetData.DataLen = sizeof(DWORD);
-            ((PWAVEALLOC)dwUser)->AuxParam.GetSetData.Function = IOCTL_WAVE_SET_PITCH;
-            return ThreadCallWaveDevice(WaveThreadSetData, ((PWAVEALLOC)dwUser));
+            pTask->AuxParam.GetSetData.pData = (PBYTE)&dwParam1;
+            pTask->AuxParam.GetSetData.DataLen = sizeof(DWORD);
+            pTask->AuxParam.GetSetData.Function = IOCTL_WAVE_SET_PITCH;
+            
+            pTask->AuxFunction = WaveThreadSetData;
+            SetEvent(pTask->AuxEvent1);
+            WaitForSingleObject(pTask->AuxEvent2, INFINITE);
+	        return pTask->AuxReturnCode;
 
         case WODM_SETVOLUME:
             DPRINT("WODM_SETVOLUME");
@@ -277,17 +299,26 @@
 
         case WODM_SETPLAYBACKRATE:
             DPRINT("WODM_SETPLAYBACKRATE");
-            ((PWAVEALLOC)dwUser)->AuxParam.GetSetData.pData = (PBYTE)&dwParam1;
-            ((PWAVEALLOC)dwUser)->AuxParam.GetSetData.DataLen = sizeof(DWORD);
-            ((PWAVEALLOC)dwUser)->AuxParam.GetSetData.Function = IOCTL_WAVE_SET_PLAYBACK_RATE;
-            return ThreadCallWaveDevice(WaveThreadSetData, (PWAVEALLOC)dwUser);
+            pTask->AuxParam.GetSetData.pData = (PBYTE)&dwParam1;
+            pTask->AuxParam.GetSetData.DataLen = sizeof(DWORD);
+            pTask->AuxParam.GetSetData.Function = IOCTL_WAVE_SET_PLAYBACK_RATE;
+            
+            pTask->AuxFunction = WaveThreadSetData;
+            SetEvent(pTask->AuxEvent1);
+            WaitForSingleObject(pTask->AuxEvent2, INFINITE);
+	        return pTask->AuxReturnCode;
 
+
         case WODM_GETPITCH:
             DPRINT("WODM_GETPITCH");
-            ((PWAVEALLOC)dwUser)->AuxParam.GetSetData.pData = (PBYTE)dwParam1;
-            ((PWAVEALLOC)dwUser)->AuxParam.GetSetData.DataLen = sizeof(DWORD);
-            ((PWAVEALLOC)dwUser)->AuxParam.GetSetData.Function = IOCTL_WAVE_GET_PITCH;
-            return ThreadCallWaveDevice(WaveThreadGetData, (PWAVEALLOC)dwUser);
+            pTask->AuxParam.GetSetData.pData = (PBYTE)dwParam1;
+            pTask->AuxParam.GetSetData.DataLen = sizeof(DWORD);
+            pTask->AuxParam.GetSetData.Function = IOCTL_WAVE_GET_PITCH;
+            
+            pTask->AuxFunction = WaveThreadGetData;
+            SetEvent(pTask->AuxEvent1);
+            WaitForSingleObject(pTask->AuxEvent2, INFINITE);
+	        return pTask->AuxReturnCode;
 
         case WODM_GETVOLUME:
             DPRINT("WODM_GETVOLUME");
@@ -306,10 +337,14 @@
 
         case WODM_GETPLAYBACKRATE:
             DPRINT("WODM_GETPLAYBACKRATE");
-            ((PWAVEALLOC)dwUser)->AuxParam.GetSetData.pData = (PBYTE)dwParam1;
-            ((PWAVEALLOC)dwUser)->AuxParam.GetSetData.DataLen = sizeof(DWORD);
-            ((PWAVEALLOC)dwUser)->AuxParam.GetSetData.Function = IOCTL_WAVE_GET_PLAYBACK_RATE;
-            return ThreadCallWaveDevice(WaveThreadGetData, (PWAVEALLOC)dwUser);
+            pTask->AuxParam.GetSetData.pData = (PBYTE)dwParam1;
+            pTask->AuxParam.GetSetData.DataLen = sizeof(DWORD);
+            pTask->AuxParam.GetSetData.Function = IOCTL_WAVE_GET_PLAYBACK_RATE;
+                         
+            pTask->AuxFunction = WaveThreadGetData;
+            SetEvent(pTask->AuxEvent1);
+            WaitForSingleObject(pTask->AuxEvent2, INFINITE);
+	        return pTask->AuxReturnCode;
 
         default:
             return MMSYSERR_NOTSUPPORTED;