[WDMAUD.DRV]
authorJohannes Anderwald <johannes.anderwald@reactos.org>
Sun, 29 Nov 2009 22:58:33 +0000 (22:58 +0000)
committerJohannes Anderwald <johannes.anderwald@reactos.org>
Sun, 29 Nov 2009 22:58:33 +0000 (22:58 +0000)
- Implement support for resetting a stream (not yet used)
- Don't translate the error again in QueryMixerInfo as SyncOverlappedDeviceIoControl has already translated the error
- Don't touch the cbSize member when opening a wave device, as the caller might have passed a WAVEFORMAT struct instead a WAVEFORMATEX struct. Fixes winmm_winetest wave / mixer crashs
- Query all available events when an mixer event is fired

svn path=/trunk/; revision=44326

reactos/dll/win32/wdmaud.drv/wdmaud.c

index 325df20..9d3922f 100644 (file)
@@ -321,24 +321,27 @@ MixerEventThreadRoutine(
             break;
         }
 
             break;
         }
 
-        Result = SyncOverlappedDeviceIoControl(KernelHandle,
-                                               IOCTL_GET_MIXER_EVENT,
-                                               (LPVOID) &DeviceInfo,
-                                               sizeof(WDMAUD_DEVICE_INFO),
-                                               (LPVOID) &DeviceInfo,
-                                               sizeof(WDMAUD_DEVICE_INFO),
-                                               NULL);
-
-        if (Result == MMSYSERR_NOERROR)
+        do
         {
         {
-            DriverCallback(Instance->WinMM.ClientCallback,
-                           HIWORD(Instance->WinMM.Flags),
-                           Instance->WinMM.Handle,
-                           DeviceInfo.u.MixerEvent.NotificationType,
-                           Instance->WinMM.ClientCallbackInstanceData,
-                           (DWORD_PTR)DeviceInfo.u.MixerEvent.Value,
-                           0);
-        }
+            Result = SyncOverlappedDeviceIoControl(KernelHandle,
+                                                   IOCTL_GET_MIXER_EVENT,
+                                                   (LPVOID) &DeviceInfo,
+                                                   sizeof(WDMAUD_DEVICE_INFO),
+                                                   (LPVOID) &DeviceInfo,
+                                                   sizeof(WDMAUD_DEVICE_INFO),
+                                                   NULL);
+
+            if (Result == MMSYSERR_NOERROR)
+            {
+                DriverCallback(Instance->WinMM.ClientCallback,
+                               HIWORD(Instance->WinMM.Flags),
+                               Instance->WinMM.Handle,
+                               DeviceInfo.u.MixerEvent.NotificationType,
+                               Instance->WinMM.ClientCallbackInstanceData,
+                               (DWORD_PTR)DeviceInfo.u.MixerEvent.Value,
+                               0);
+            }
+        }while(Result == MMSYSERR_NOERROR);
     }while(TRUE);
 
     /* done */
     }while(TRUE);
 
     /* done */
@@ -443,7 +446,7 @@ SetWdmWaveDeviceFormat(
     ZeroMemory(&DeviceInfo, sizeof(WDMAUD_DEVICE_INFO));
     DeviceInfo.DeviceType = DeviceType;
     DeviceInfo.DeviceIndex = DeviceId;
     ZeroMemory(&DeviceInfo, sizeof(WDMAUD_DEVICE_INFO));
     DeviceInfo.DeviceType = DeviceType;
     DeviceInfo.DeviceIndex = DeviceId;
-    DeviceInfo.u.WaveFormatEx.cbSize = WaveFormat->cbSize;
+    DeviceInfo.u.WaveFormatEx.cbSize = sizeof(WAVEFORMATEX); //WaveFormat->cbSize;
     DeviceInfo.u.WaveFormatEx.wFormatTag = WaveFormat->wFormatTag;
 #ifdef USERMODE_MIXER
     DeviceInfo.u.WaveFormatEx.nChannels = 2;
     DeviceInfo.u.WaveFormatEx.wFormatTag = WaveFormat->wFormatTag;
 #ifdef USERMODE_MIXER
     DeviceInfo.u.WaveFormatEx.nChannels = 2;
@@ -746,6 +749,35 @@ GetWdmPosition(
     return MMSYSERR_NOERROR;
 }
 
     return MMSYSERR_NOERROR;
 }
 
+MMRESULT
+ResetStream(
+    IN  struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance,
+    IN  MMDEVICE_TYPE DeviceType,
+    IN  BOOLEAN bStartReset)
+{
+    MMRESULT Result;
+    HANDLE Handle;
+    WDMAUD_DEVICE_INFO DeviceInfo;
+
+    Result = GetSoundDeviceInstanceHandle(SoundDeviceInstance, &Handle);
+    SND_ASSERT( Result == MMSYSERR_NOERROR );
+
+    ZeroMemory(&DeviceInfo, sizeof(WDMAUD_DEVICE_INFO));
+    DeviceInfo.hDevice = Handle;
+    DeviceInfo.DeviceType = DeviceType;
+    DeviceInfo.u.ResetStream = (bStartReset ? KSRESET_BEGIN : KSRESET_END);
+
+    Result = SyncOverlappedDeviceIoControl(KernelHandle,
+                                           IOCTL_RESET_STREAM,
+                                           (LPVOID) &DeviceInfo,
+                                           sizeof(WDMAUD_DEVICE_INFO),
+                                           (LPVOID) &DeviceInfo,
+                                           sizeof(WDMAUD_DEVICE_INFO),
+                                           NULL);
+    return Result;
+}
+
+
 MMRESULT
 QueryMixerInfo(
     IN  struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance,
 MMRESULT
 QueryMixerInfo(
     IN  struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance,
@@ -808,7 +840,7 @@ QueryMixerInfo(
 
     if ( ! MMSUCCESS(Result) )
     {
 
     if ( ! MMSUCCESS(Result) )
     {
-        return TranslateInternalMmResult(Result);
+        return Result;
     }
 
     switch(uMsg)
     }
 
     switch(uMsg)
@@ -876,6 +908,7 @@ PopulateWdmDeviceList(
         if (DeviceType == WAVE_IN_DEVICE_TYPE || DeviceType == WAVE_OUT_DEVICE_TYPE)
         {
             FuncTable.SetState = SetWdmWaveState;
         if (DeviceType == WAVE_IN_DEVICE_TYPE || DeviceType == WAVE_OUT_DEVICE_TYPE)
         {
             FuncTable.SetState = SetWdmWaveState;
+            FuncTable.ResetStream = ResetStream;
         }
 
         FuncTable.Open = OpenWdmSoundDevice;
         }
 
         FuncTable.Open = OpenWdmSoundDevice;