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
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
UINT uSize)\r
{\r
LPWINE_MLD wmld;\r
+ UINT result;\r
\r
TRACE("(%p, %p, %u);\n", hWaveIn, lpWaveInHdr, uSize);\r
\r
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
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