Sync to Wine-20050419:
[reactos.git] / reactos / lib / winmm / winmm.c
index 76e4ef7..17f304e 100644 (file)
@@ -441,7 +441,7 @@ UINT WINAPI mixerGetControlDetailsA(HMIXEROBJ hmix, LPMIXERCONTROLDETAILS lpmcdA
            if (lpmcdA->u.cMultipleItems != 0) {\r
                size *= lpmcdA->u.cMultipleItems;\r
            }\r
-           pDetailsW = (MIXERCONTROLDETAILS_LISTTEXTW *)HeapAlloc(GetProcessHeap(), 0, size);\r
+           pDetailsW = HeapAlloc(GetProcessHeap(), 0, size);\r
             lpmcdA->paDetails = pDetailsW;\r
             lpmcdA->cbDetails = sizeof(MIXERCONTROLDETAILS_LISTTEXTW);\r
            /* set up lpmcd->paDetails */\r
@@ -492,7 +492,15 @@ UINT WINAPI mixerGetLineControlsA(HMIXEROBJ hmix, LPMIXERLINECONTROLSA lpmlcA,
     mlcW.dwLineID = lpmlcA->dwLineID;\r
     mlcW.u.dwControlID = lpmlcA->u.dwControlID;\r
     mlcW.u.dwControlType = lpmlcA->u.dwControlType;\r
-    mlcW.cControls = lpmlcA->cControls;\r
+\r
+    /* Debugging on Windows shows for MIXER_GETLINECONTROLSF_ONEBYTYPE only,\r
+       the control count is assumed to be 1 - This is relied upon by a game,\r
+       "Dynomite Deluze"                                                    */\r
+    if (MIXER_GETLINECONTROLSF_ONEBYTYPE == fdwControls) {\r
+        mlcW.cControls = 1;\r
+    } else {\r
+        mlcW.cControls = lpmlcA->cControls;\r
+    }\r
     mlcW.cbmxctrl = sizeof(MIXERCONTROLW);\r
     mlcW.pamxctrl = HeapAlloc(GetProcessHeap(), 0,\r
                              mlcW.cControls * mlcW.cbmxctrl);\r
@@ -2580,6 +2588,7 @@ UINT WINAPI waveInPrepareHeader(HWAVEIN hWaveIn, WAVEHDR* lpWaveInHdr,
                                UINT uSize)\r
 {\r
     LPWINE_MLD         wmld;\r
+    UINT                result;\r
 \r
     TRACE("(%p, %p, %u);\n", hWaveIn, lpWaveInHdr, uSize);\r
 \r
@@ -2589,9 +2598,18 @@ UINT WINAPI waveInPrepareHeader(HWAVEIN hWaveIn, WAVEHDR* lpWaveInHdr,
     if ((wmld = MMDRV_Get(hWaveIn, MMDRV_WAVEIN, FALSE)) == NULL)\r
        return MMSYSERR_INVALHANDLE;\r
 \r
+    if ((result = MMDRV_Message(wmld, WIDM_PREPARE, (DWORD_PTR)lpWaveInHdr,\r
+                                uSize, TRUE)) != MMSYSERR_NOTSUPPORTED)\r
+        return result;\r
+\r
+    if (lpWaveInHdr->dwFlags & WHDR_INQUEUE)\r
+        return WAVERR_STILLPLAYING;\r
+\r
+    lpWaveInHdr->dwFlags |= WHDR_PREPARED;\r
+    lpWaveInHdr->dwFlags &= ~WHDR_DONE;\r
     lpWaveInHdr->dwBytesRecorded = 0;\r
 \r
-    return MMDRV_Message(wmld, WIDM_PREPARE, (DWORD_PTR)lpWaveInHdr, uSize, TRUE);\r
+    return MMSYSERR_NOERROR;\r
 }\r
 \r
 /**************************************************************************\r
@@ -2601,20 +2619,30 @@ UINT WINAPI waveInUnprepareHeader(HWAVEIN hWaveIn, WAVEHDR* lpWaveInHdr,
                                  UINT uSize)\r
 {\r
     LPWINE_MLD         wmld;\r
+    UINT                result;\r
 \r
     TRACE("(%p, %p, %u);\n", hWaveIn, lpWaveInHdr, uSize);\r
 \r
     if (lpWaveInHdr == NULL || uSize < sizeof (WAVEHDR))\r
        return MMSYSERR_INVALPARAM;\r
 \r
-    if (!(lpWaveInHdr->dwFlags & WHDR_PREPARED)) {\r
+    if (!(lpWaveInHdr->dwFlags & WHDR_PREPARED))\r
        return MMSYSERR_NOERROR;\r
-    }\r
 \r
     if ((wmld = MMDRV_Get(hWaveIn, MMDRV_WAVEIN, FALSE)) == NULL)\r
        return MMSYSERR_INVALHANDLE;\r
 \r
-    return MMDRV_Message(wmld, WIDM_UNPREPARE, (DWORD_PTR)lpWaveInHdr, uSize, TRUE);\r
+    if ((result = MMDRV_Message(wmld, WIDM_UNPREPARE, (DWORD_PTR)lpWaveInHdr,\r
+                                uSize, TRUE)) != MMSYSERR_NOTSUPPORTED)\r
+        return result;\r
+\r
+    if (lpWaveInHdr->dwFlags & WHDR_INQUEUE)\r
+        return WAVERR_STILLPLAYING;\r
+\r
+    lpWaveInHdr->dwFlags &= ~WHDR_PREPARED;\r
+    lpWaveInHdr->dwFlags |= WHDR_DONE;\r
+\r
+    return MMSYSERR_NOERROR;\r
 }\r
 \r
 /**************************************************************************\r