From 9b5d49226d7a86cd2dd0ce3de776d80043801e23 Mon Sep 17 00:00:00 2001 From: Eric Pouech Date: Mon, 22 Mar 1999 14:51:24 +0000 Subject: [PATCH] Started calling mixer as a 32 bit low level driver (no longer 16 bit) Added support for yield proc in mci struct Added mmTaskXXX16 and mmThreadXXX16 functions Refreshed implementation of 16 bit native & asynchronous MCI driver command (through mmtask.tsk). --- multimedia/mmsystem.c | 544 +++++++++++++++++++++++++++--------------- 1 file changed, 349 insertions(+), 195 deletions(-) diff --git a/multimedia/mmsystem.c b/multimedia/mmsystem.c index d76723f647..4945c5ed50 100644 --- a/multimedia/mmsystem.c +++ b/multimedia/mmsystem.c @@ -410,7 +410,7 @@ UINT16 WINAPI mmsystemGetVersion16() } /************************************************************************** - * DriverProc [MMSYSTEM.6] + * DriverProc [MMSYSTEM.6] */ LRESULT WINAPI DriverProc16(DWORD dwDevID, HDRVR16 hDrv, WORD wMsg, DWORD dwParam1, DWORD dwParam2) @@ -419,7 +419,7 @@ LRESULT WINAPI DriverProc16(DWORD dwDevID, HDRVR16 hDrv, WORD wMsg, } /************************************************************************** - * DriverCallback [MMSYSTEM.31] + * DriverCallback [MMSYSTEM.31] */ BOOL16 WINAPI DriverCallback16(DWORD dwCallBack, UINT16 uFlags, HANDLE16 hDev, WORD wMsg, DWORD dwUser, DWORD dwParam1, DWORD dwParam2) @@ -463,30 +463,23 @@ BOOL16 WINAPI DriverCallback16(DWORD dwCallBack, UINT16 uFlags, HANDLE16 hDev, /************************************************************************** * Mixer devices. New to Win95 */ + /************************************************************************** * find out the real mixer ID depending on hmix (depends on dwFlags) * FIXME: also fix dwInstance passing to mixMessage */ -static UINT _get_mixerID_from_handle(HMIXEROBJ hmix, DWORD dwFlags) +static UINT MIXER_GetDevID(HMIXEROBJ hmix, DWORD dwFlags) { - /* FIXME: Check dwFlags for MIXER_OBJECTF_xxxx entries and modify hmix + /* FIXME: Check dwFlags for MIXER_OBJSECTF_xxxx entries and modify hmix * accordingly. For now we always use mixerdevice 0. */ return 0; } /************************************************************************** - * mixerGetNumDevs [WINMM.108] + * mixerGetNumDevs [WINMM.108] */ -UINT WINAPI mixerGetNumDevs() -{ - return mixerGetNumDevs16(); -} - -/************************************************************************** - * mixerGetNumDevs - */ -UINT16 WINAPI mixerGetNumDevs16() +UINT WINAPI mixerGetNumDevs(void) { UINT16 count = mixMessage(0, MXDM_GETNUMDEVS, 0L, 0L, 0L); @@ -495,53 +488,64 @@ UINT16 WINAPI mixerGetNumDevs16() } /************************************************************************** - * mixerGetDevCapsW [WINMM.102] + * mixerGetNumDevs [MMSYSTEM.800] */ -UINT WINAPI mixerGetDevCapsW(UINT devid, LPMIXERCAPSW mixcaps, UINT size) +UINT16 WINAPI mixerGetNumDevs16() { - MIXERCAPS16 mic16; - UINT ret = mixerGetDevCaps16(devid, &mic16, sizeof(mic16)); - - mixcaps->wMid = mic16.wMid; - mixcaps->wPid = mic16.wPid; - mixcaps->vDriverVersion = mic16.vDriverVersion; - lstrcpyAtoW(mixcaps->szPname, mic16.szPname); - mixcaps->fdwSupport = mic16.fdwSupport; - mixcaps->cDestinations = mic16.cDestinations; - return ret; + return mixerGetNumDevs(); } /************************************************************************** - * mixerGetDevCaps [WINMM.101] + * mixerGetDevCapsA [WINMM.101] */ UINT WINAPI mixerGetDevCapsA(UINT devid, LPMIXERCAPSA mixcaps, UINT size) { - MIXERCAPS16 mic16; - UINT ret = mixerGetDevCaps16(devid, &mic16, sizeof(mic16)); - - mixcaps->wMid = mic16.wMid; - mixcaps->wPid = mic16.wPid; - mixcaps->vDriverVersion = mic16.vDriverVersion; - strcpy(mixcaps->szPname, mic16.szPname); - mixcaps->fdwSupport = mic16.fdwSupport; - mixcaps->cDestinations = mic16.cDestinations; - return ret; -} - -/************************************************************************** - * mixerGetDevCaps - */ -UINT16 WINAPI mixerGetDevCaps16(UINT16 devid, LPMIXERCAPS16 mixcaps, UINT16 size) -{ - FIXME(mmsys,"should this be a fixme?\n"); return mixMessage(devid, MXDM_GETDEVCAPS, 0L, (DWORD)mixcaps, (DWORD)size); } /************************************************************************** - * mixerOpen [WINMM.110] + * mixerGetDevCapsW [WINMM.102] + */ +UINT WINAPI mixerGetDevCapsW(UINT devid, LPMIXERCAPSW mixcaps, UINT size) +{ + MIXERCAPSA micA; + UINT ret = mixerGetDevCapsA(devid, &micA, sizeof(micA)); + + if (ret == MMSYSERR_NOERROR) { + mixcaps->wMid = micA.wMid; + mixcaps->wPid = micA.wPid; + mixcaps->vDriverVersion = micA.vDriverVersion; + lstrcpyAtoW(mixcaps->szPname, micA.szPname); + mixcaps->fdwSupport = micA.fdwSupport; + mixcaps->cDestinations = micA.cDestinations; + } + return ret; +} + +/************************************************************************** + * mixerGetDevCaps [MMSYSTEM.801] + */ +UINT16 WINAPI mixerGetDevCaps16(UINT16 devid, LPMIXERCAPS16 mixcaps, UINT16 size) +{ + MIXERCAPSA micA; + UINT ret = mixerGetDevCapsA(devid, &micA, sizeof(micA)); + + if (ret == MMSYSERR_NOERROR) { + mixcaps->wMid = micA.wMid; + mixcaps->wPid = micA.wPid; + mixcaps->vDriverVersion = micA.vDriverVersion; + strcpy(PTR_SEG_TO_LIN(mixcaps->szPname), micA.szPname); + mixcaps->fdwSupport = micA.fdwSupport; + mixcaps->cDestinations = micA.cDestinations; + } + return ret; +} + +/************************************************************************** + * mixerOpen [WINMM.110] */ UINT WINAPI mixerOpen(LPHMIXER lphmix, UINT uDeviceID, DWORD dwCallback, - DWORD dwInstance, DWORD fdwOpen) + DWORD dwInstance, DWORD fdwOpen) { HMIXER16 hmix16; UINT ret; @@ -554,7 +558,7 @@ UINT WINAPI mixerOpen(LPHMIXER lphmix, UINT uDeviceID, DWORD dwCallback, } /************************************************************************** - * mixerOpen + * mixerOpen [MMSYSTEM.803] */ UINT16 WINAPI mixerOpen16(LPHMIXER16 lphmix, UINT16 uDeviceID, DWORD dwCallback, DWORD dwInstance, DWORD fdwOpen) @@ -575,7 +579,7 @@ UINT16 WINAPI mixerOpen16(LPHMIXER16 lphmix, UINT16 uDeviceID, DWORD dwCallback, if (uDeviceID >= MAXMIXERDRIVERS) uDeviceID = 0; while (uDeviceID < MAXMIXERDRIVERS) { - dwRet=mixMessage(uDeviceID, MXDM_OPEN, dwInstance, (DWORD)lpmod, fdwOpen); + dwRet = mixMessage(uDeviceID, MXDM_OPEN, dwInstance, (DWORD)lpmod, fdwOpen); if (dwRet == MMSYSERR_NOERROR) break; if (!mapperflag) break; uDeviceID++; @@ -585,35 +589,37 @@ UINT16 WINAPI mixerOpen16(LPHMIXER16 lphmix, UINT16 uDeviceID, DWORD dwCallback, } /************************************************************************** - * mixerClose [WINMM.98] + * mixerClose [WINMM.98] */ UINT WINAPI mixerClose(HMIXER hmix) -{ - return mixerClose16(hmix); -} - -/************************************************************************** - * mixerClose - */ -UINT16 WINAPI mixerClose16(HMIXER16 hmix) { LPMIXEROPENDESC lpmod; FIXME(mmsys,"(%04x): semi-stub?\n", hmix); + lpmod = (LPMIXEROPENDESC)USER_HEAP_LIN_ADDR(hmix); return mixMessage(lpmod->uDeviceID, MXDM_CLOSE, lpmod->dwInstance, 0L, 0L); } /************************************************************************** - * mixerGetID [WINMM.103] + * mixerClose [MMSYSTEM.803] + */ +UINT16 WINAPI mixerClose16(HMIXER16 hmix) +{ + return mixerClose(hmix); +} + +/************************************************************************** + * mixerGetID [WINMM.103] */ UINT WINAPI mixerGetID(HMIXEROBJ hmix, LPUINT lpid, DWORD fdwID) { - UINT16 xid; - UINT ret = mixerGetID16(hmix, &xid, fdwID); + FIXME(mmsys,"(%04x %p %08lx): semi-stub\n", hmix, lpid, fdwID); - if (lpid) *lpid = xid; - return ret; + if (lpid) + *lpid = MIXER_GetDevID(hmix, fdwID); + + return MMSYSERR_NOERROR; /* FIXME: many error possibilities */ } /************************************************************************** @@ -621,10 +627,12 @@ UINT WINAPI mixerGetID(HMIXEROBJ hmix, LPUINT lpid, DWORD fdwID) */ UINT16 WINAPI mixerGetID16(HMIXEROBJ16 hmix, LPUINT16 lpid, DWORD fdwID) { - FIXME(mmsys,"(%04x): semi-stub\n",hmix); - if (lpid) - *lpid = _get_mixerID_from_handle(hmix,fdwID); - return MMSYSERR_NOERROR; /* FIXME: many error possibilities */ + UINT xid; + UINT ret = mixerGetID(hmix, &xid, fdwID); + + if (lpid) + *lpid = xid; + return ret; } /************************************************************************** @@ -641,7 +649,7 @@ UINT WINAPI mixerGetControlDetailsA(HMIXEROBJ hmix, LPMIXERCONTROLDETAILS lpmcd, */ UINT WINAPI mixerGetControlDetailsW(HMIXEROBJ hmix, LPMIXERCONTROLDETAILS lpmcd, DWORD fdwDetails) { - FIXME(mmsys,"(%04x,%p,%08lx): stub!\n", hmix, lpmcd, fdwDetails); + FIXME(mmsys,"(%04x,%p,%08lx): stub!\n", hmix, lpmcd, fdwDetails); return MMSYSERR_NOTENABLED; } @@ -659,12 +667,17 @@ UINT16 WINAPI mixerGetControlDetails16(HMIXEROBJ16 hmix, LPMIXERCONTROLDETAILS16 */ UINT WINAPI mixerGetLineControlsA(HMIXEROBJ hmix, LPMIXERLINECONTROLSA lpmlc, DWORD fdwControls) { + UINT uDevID; + FIXME(mmsys,"(%04x,%p,%08lx): stub!\n", hmix, lpmlc, fdwControls); - return MMSYSERR_NOTENABLED; + + uDevID = MIXER_GetDevID(hmix, 0); + + return mixMessage(uDevID, MXDM_GETLINECONTROLS, 0, (DWORD)lpmlc, fdwControls); } /************************************************************************** - * mixerGetLineControlsW [WINMM.105] + * mixerGetLineControlsW [WINMM.105] */ UINT WINAPI mixerGetLineControlsW(HMIXEROBJ hmix, LPMIXERLINECONTROLSW lpmlc, DWORD fdwControls) { @@ -673,7 +686,7 @@ UINT WINAPI mixerGetLineControlsW(HMIXEROBJ hmix, LPMIXERLINECONTROLSW lpmlc, DW } /************************************************************************** - * mixerGetLineControls [MMSYSTEM.807] + * mixerGetLineControls [MMSYSTEM.807] */ UINT16 WINAPI mixerGetLineControls16(HMIXEROBJ16 hmix, LPMIXERLINECONTROLS16 lpmlc, DWORD fdwControls) { @@ -682,55 +695,25 @@ UINT16 WINAPI mixerGetLineControls16(HMIXEROBJ16 hmix, LPMIXERLINECONTROLS16 lpm } /************************************************************************** - * mixerGetLineInfoA [WINMM.106] + * mixerGetLineInfoA [WINMM.106] */ UINT WINAPI mixerGetLineInfoA(HMIXEROBJ hmix, LPMIXERLINEA lpml, DWORD fdwInfo) { - MIXERLINE16 ml16; - UINT ret; + UINT16 devid; - TRACE(mmsys, "(%04x,%p,%08lx)\n", hmix, lpml, fdwInfo); - - if (lpml == NULL || lpml->cbStruct != sizeof(*lpml)) - return MMSYSERR_INVALPARAM; - - ml16.cbStruct = sizeof(ml16); - ml16.dwDestination = lpml->dwDestination; - ml16.dwSource = lpml->dwSource; - ml16.dwLineID = lpml->dwLineID; - ml16.dwUser = lpml->dwUser; - ml16.dwComponentType = lpml->dwComponentType; - ml16.cChannels = lpml->cChannels; - ml16.cConnections = lpml->cConnections; - ml16.cControls = lpml->cControls; - - ret = mixerGetLineInfo16(hmix, &ml16, fdwInfo); - - lpml->dwSource = ml16.dwSource; - lpml->dwLineID = ml16.dwLineID; - lpml->fdwLine = ml16.fdwLine; - lpml->dwUser = ml16.dwUser; - lpml->dwComponentType = ml16.dwComponentType; - lpml->cChannels = ml16.cChannels; - lpml->cConnections = ml16.cConnections; - lpml->cControls = ml16.cControls; - strcpy(lpml->szShortName, ml16.szShortName); - strcpy(lpml->szName, ml16.szName); - lpml->Target.dwType = ml16.Target.dwType; - lpml->Target.dwDeviceID = ml16.Target.dwDeviceID; - lpml->Target.wMid = ml16.Target.wMid; - lpml->Target.wPid = ml16.Target.wPid; - lpml->Target.vDriverVersion = ml16.Target.vDriverVersion; - strcpy(lpml->Target.szPname, ml16.Target.szPname); - return ret; + TRACE(mmsys, "(%04x, %p, %08lx)\n", hmix, lpml, fdwInfo); + + /* FIXME: I'm not sure of the flags */ + devid = MIXER_GetDevID(hmix, fdwInfo); + return mixMessage(devid, MXDM_GETLINEINFO, 0, (DWORD)lpml, fdwInfo); } /************************************************************************** - * mixerGetLineInfoW [WINMM.107] + * mixerGetLineInfoW [WINMM.107] */ UINT WINAPI mixerGetLineInfoW(HMIXEROBJ hmix, LPMIXERLINEW lpml, DWORD fdwInfo) { - MIXERLINE16 ml16; + MIXERLINEA mlA; UINT ret; TRACE(mmsys,"(%04x,%p,%08lx)\n", hmix, lpml, fdwInfo); @@ -738,34 +721,36 @@ UINT WINAPI mixerGetLineInfoW(HMIXEROBJ hmix, LPMIXERLINEW lpml, DWORD fdwInfo) if (lpml == NULL || lpml->cbStruct != sizeof(*lpml)) return MMSYSERR_INVALPARAM; - ml16.cbStruct = sizeof(ml16); - ml16.dwDestination = lpml->dwDestination; - ml16.dwSource = lpml->dwSource; - ml16.dwLineID = lpml->dwLineID; - ml16.dwUser = lpml->dwUser; - ml16.dwComponentType = lpml->dwComponentType; - ml16.cChannels = lpml->cChannels; - ml16.cConnections = lpml->cConnections; - ml16.cControls = lpml->cControls; + mlA.cbStruct = sizeof(mlA); + mlA.dwDestination = lpml->dwDestination; + mlA.dwSource = lpml->dwSource; + mlA.dwLineID = lpml->dwLineID; + mlA.dwUser = lpml->dwUser; + mlA.dwComponentType = lpml->dwComponentType; + mlA.cChannels = lpml->cChannels; + mlA.cConnections = lpml->cConnections; + mlA.cControls = lpml->cControls; - ret = mixerGetLineInfo16(hmix, &ml16, fdwInfo); + ret = mixerGetLineInfoA(hmix, &mlA, fdwInfo); + + lpml->dwDestination = mlA.dwDestination; + lpml->dwSource = mlA.dwSource; + lpml->dwLineID = mlA.dwLineID; + lpml->fdwLine = mlA.fdwLine; + lpml->dwUser = mlA.dwUser; + lpml->dwComponentType = mlA.dwComponentType; + lpml->cChannels = mlA.cChannels; + lpml->cConnections = mlA.cConnections; + lpml->cControls = mlA.cControls; + lstrcpyAtoW(lpml->szShortName, mlA.szShortName); + lstrcpyAtoW(lpml->szName, mlA.szName); + lpml->Target.dwType = mlA.Target.dwType; + lpml->Target.dwDeviceID = mlA.Target.dwDeviceID; + lpml->Target.wMid = mlA.Target.wMid; + lpml->Target.wPid = mlA.Target.wPid; + lpml->Target.vDriverVersion = mlA.Target.vDriverVersion; + lstrcpyAtoW(lpml->Target.szPname, mlA.Target.szPname); - lpml->dwSource = ml16.dwSource; - lpml->dwLineID = ml16.dwLineID; - lpml->fdwLine = ml16.fdwLine; - lpml->dwUser = ml16.dwUser; - lpml->dwComponentType = ml16.dwComponentType; - lpml->cChannels = ml16.cChannels; - lpml->cConnections = ml16.cConnections; - lpml->cControls = ml16.cControls; - lstrcpyAtoW(lpml->szShortName, ml16.szShortName); - lstrcpyAtoW(lpml->szName, ml16.szName); - lpml->Target.dwType = ml16.Target.dwType; - lpml->Target.dwDeviceID = ml16.Target.dwDeviceID; - lpml->Target.wMid = ml16.Target.wMid; - lpml->Target.wPid = ml16.Target.wPid; - lpml->Target.vDriverVersion = ml16.Target.vDriverVersion; - /*lstrcpyAtoW(lpml->Target.szPname, ml16.Target.szPname);*/ return ret; } @@ -774,11 +759,44 @@ UINT WINAPI mixerGetLineInfoW(HMIXEROBJ hmix, LPMIXERLINEW lpml, DWORD fdwInfo) */ UINT16 WINAPI mixerGetLineInfo16(HMIXEROBJ16 hmix, LPMIXERLINE16 lpml, DWORD fdwInfo) { - UINT16 devid = _get_mixerID_from_handle(hmix, fdwInfo); + MIXERLINEA mlA; + UINT ret; - FIXME(mmsys, "(%04x, %p[line %08lx], %08lx)\n", - hmix, lpml, lpml->dwDestination, fdwInfo); - return mixMessage(devid, MXDM_GETLINEINFO, 0, (DWORD)lpml, fdwInfo); + TRACE(mmsys, "(%04x,%p,%08lx)\n", hmix, lpml, fdwInfo); + + if (lpml == NULL || lpml->cbStruct != sizeof(*lpml)) + return MMSYSERR_INVALPARAM; + + mlA.cbStruct = sizeof(mlA); + mlA.dwDestination = lpml->dwDestination; + mlA.dwSource = lpml->dwSource; + mlA.dwLineID = lpml->dwLineID; + mlA.dwUser = lpml->dwUser; + mlA.dwComponentType = lpml->dwComponentType; + mlA.cChannels = lpml->cChannels; + mlA.cConnections = lpml->cConnections; + mlA.cControls = lpml->cControls; + + ret = mixerGetLineInfoA(hmix, &mlA, fdwInfo); + + lpml->dwDestination = mlA.dwDestination; + lpml->dwSource = mlA.dwSource; + lpml->dwLineID = mlA.dwLineID; + lpml->fdwLine = mlA.fdwLine; + lpml->dwUser = mlA.dwUser; + lpml->dwComponentType = mlA.dwComponentType; + lpml->cChannels = mlA.cChannels; + lpml->cConnections = mlA.cConnections; + lpml->cControls = mlA.cControls; + strcpy(PTR_SEG_TO_LIN(lpml->szShortName), mlA.szShortName); + strcpy(PTR_SEG_TO_LIN(lpml->szName), mlA.szName); + lpml->Target.dwType = mlA.Target.dwType; + lpml->Target.dwDeviceID = mlA.Target.dwDeviceID; + lpml->Target.wMid = mlA.Target.wMid; + lpml->Target.wPid = mlA.Target.wPid; + lpml->Target.vDriverVersion = mlA.Target.vDriverVersion; + strcpy(PTR_SEG_TO_LIN(lpml->Target.szPname), mlA.Target.szPname); + return ret; } /************************************************************************** @@ -1006,11 +1024,13 @@ BOOL WINAPI mciGetErrorStringA(DWORD wError, LPSTR lpstrBuffer, UINT uLength) BOOL16 WINAPI mciGetErrorString16(DWORD wError, LPSTR lpstrBuffer, UINT16 uLength) { LPSTR msgptr; + BOOL16 ret = TRUE; TRACE(mmsys, "(%08lX, %p, %d);\n", wError, lpstrBuffer, uLength); if ((lpstrBuffer == NULL) || (uLength < 1)) - return(FALSE); + return FALSE; + lpstrBuffer[0] = '\0'; switch (wError) { @@ -1275,11 +1295,12 @@ BOOL16 WINAPI mciGetErrorString16(DWORD wError, LPSTR lpstrBuffer, UINT16 uLengt */ default: msgptr = "Unknown MCI Error !\n"; + ret = FALSE; break; } lstrcpynA(lpstrBuffer, msgptr, uLength); TRACE(mmsys, "msg = %s;\n", msgptr); - return TRUE; + return ret; } /************************************************************************** @@ -1317,45 +1338,45 @@ BOOL WINAPI mciDriverNotify(HWND hWndCallBack, UINT wDevID, UINT wStatus) /************************************************************************** * mciGetDriverData [MMSYSTEM.708] */ -DWORD WINAPI mciGetDriverData16(HDRVR16 hDrv) +DWORD WINAPI mciGetDriverData16(UINT16 uDeviceID) { - return mciGetDriverData(hDrv); + return mciGetDriverData(uDeviceID); } /************************************************************************** * mciGetDriverData [WINMM.44] */ -DWORD WINAPI mciGetDriverData(HDRVR hDrv) +DWORD WINAPI mciGetDriverData(UINT uDeviceID) { - TRACE(mmsys,"(%04x)\n", hDrv); - if (!MCI_DevIDValid(hDrv) || MCI_GetDrv(hDrv)->modp.wType == 0) { - WARN(mmsys, "Bad hDrv\n"); + TRACE(mmsys,"(%04x)\n", uDeviceID); + if (!MCI_DevIDValid(uDeviceID) || MCI_GetDrv(uDeviceID)->modp.wType == 0) { + WARN(mmsys, "Bad uDeviceID\n"); return 0L; } - return MCI_GetDrv(hDrv)->dwPrivate; + return MCI_GetDrv(uDeviceID)->dwPrivate; } /************************************************************************** * mciSetDriverData [MMSYSTEM.707] */ -BOOL16 WINAPI mciSetDriverData16(HDRVR16 hDrv, DWORD data) +BOOL16 WINAPI mciSetDriverData16(UINT16 uDeviceID, DWORD data) { - return mciSetDriverData(hDrv, data); + return mciSetDriverData(uDeviceID, data); } /************************************************************************** * mciSetDriverData [WINMM.53] */ -BOOL WINAPI mciSetDriverData(HDRVR hDrv, DWORD data) +BOOL WINAPI mciSetDriverData(UINT uDeviceID, DWORD data) { - TRACE(mmsys,"(%04x,%08lx)\n", hDrv, data); - if (!MCI_DevIDValid(hDrv) || MCI_GetDrv(hDrv)->modp.wType == 0) { - WARN(mmsys, "Bad hDrv\n"); + TRACE(mmsys, "(%04x,%08lx)\n", uDeviceID, data); + if (!MCI_DevIDValid(uDeviceID) || MCI_GetDrv(uDeviceID)->modp.wType == 0) { + WARN(mmsys, "Bad uDeviceID\n"); return FALSE; } - MCI_GetDrv(hDrv)->dwPrivate = data; + MCI_GetDrv(uDeviceID)->dwPrivate = data; return TRUE; } @@ -1375,10 +1396,11 @@ UINT16 WINAPI mciLoadCommandResource16(HANDLE16 hinst, LPCSTR resname, UINT16 ty static UINT16 mcidevtype = 0; FIXME(mmsys,"(%04x,%s,%d): stub!\n", hinst, resname, type); - if (!lstrcmpiA(resname,"core")) { + if (!lstrcmpiA(resname, "core")) { FIXME(mmsys, "(...,\"core\",...), have to use internal tables... (not there yet)\n"); return 0; } + return ++mcidevtype; /* if file exists "resname.mci", then load resource "resname" from it * otherwise directly from driver */ @@ -1393,17 +1415,17 @@ UINT16 WINAPI mciLoadCommandResource16(HANDLE16 hinst, LPCSTR resname, UINT16 ty hrsrc = FindResource16(hinst, SEGPTR_GET(segstr), type); SEGPTR_FREE(segstr); if (!hrsrc) { - WARN(mmsys,"no special commandlist found in resource\n"); + WARN(mmsys, "no special commandlist found in resource\n"); return MCI_NO_COMMAND_TABLE; } hmem = LoadResource16(hinst, hrsrc); if (!hmem) { - WARN(mmsys,"couldn't load resource??\n"); + WARN(mmsys, "couldn't load resource??\n"); return MCI_NO_COMMAND_TABLE; } xmem = WIN16_LockResource16(hmem); if (!xmem) { - WARN(mmsys,"couldn't lock resource??\n"); + WARN(mmsys, "couldn't lock resource??\n"); FreeResource16(hmem); return MCI_NO_COMMAND_TABLE; } @@ -1616,21 +1638,37 @@ UINT WINAPI mciGetDeviceIDW(LPCWSTR lpwstrName) /************************************************************************** * mciSetYieldProc [MMSYSTEM.714] */ -BOOL16 WINAPI mciSetYieldProc16(UINT16 uDeviceID, - YIELDPROC fpYieldProc, DWORD dwYieldData) +BOOL16 WINAPI mciSetYieldProc16(UINT16 uDeviceID, YIELDPROC fpYieldProc, DWORD dwYieldData) { - FIXME(mci, "(%u, %p, %08lx) stub\n", uDeviceID, fpYieldProc, dwYieldData); - return FALSE; + TRACE(mmsys, "(%u, %p, %08lx)\n", uDeviceID, fpYieldProc, dwYieldData); + if (!MCI_DevIDValid(uDeviceID) || MCI_GetDrv(uDeviceID)->modp.wType == 0) { + WARN(mmsys, "Bad uDeviceID\n"); + return FALSE; + } + + MCI_GetDrv(uDeviceID)->lpfnYieldProc = fpYieldProc; + MCI_GetDrv(uDeviceID)->dwYieldData = dwYieldData; + MCI_GetDrv(uDeviceID)->bIs32 = FALSE; + + return TRUE; } /************************************************************************** * mciSetYieldProc [WINMM.54] */ -BOOL WINAPI mciSetYieldProc(UINT uDeviceID, - YIELDPROC fpYieldProc, DWORD dwYieldData) +BOOL WINAPI mciSetYieldProc(UINT uDeviceID, YIELDPROC fpYieldProc, DWORD dwYieldData) { - FIXME(mci, "(%u, %p, %08lx) stub\n", uDeviceID, fpYieldProc, dwYieldData); - return FALSE; + TRACE(mmsys, "(%u, %p, %08lx)\n", uDeviceID, fpYieldProc, dwYieldData); + if (!MCI_DevIDValid(uDeviceID) || MCI_GetDrv(uDeviceID)->modp.wType == 0) { + WARN(mmsys, "Bad uDeviceID\n"); + return FALSE; + } + + MCI_GetDrv(uDeviceID)->lpfnYieldProc = fpYieldProc; + MCI_GetDrv(uDeviceID)->dwYieldData = dwYieldData; + MCI_GetDrv(uDeviceID)->bIs32 = TRUE; + + return TRUE; } /************************************************************************** @@ -1659,8 +1697,20 @@ UINT WINAPI mciGetDeviceIDFromElementIDW(DWORD dwElementID, LPCWSTR lpstrType) */ YIELDPROC WINAPI mciGetYieldProc16(UINT16 uDeviceID, DWORD* lpdwYieldData) { - FIXME(mci, "(%u, %p) stub\n", uDeviceID, lpdwYieldData); - return NULL; + TRACE(mmsys, "(%u, %p)\n", uDeviceID, lpdwYieldData); + if (!MCI_DevIDValid(uDeviceID) || MCI_GetDrv(uDeviceID)->modp.wType == 0) { + WARN(mmsys, "Bad uDeviceID\n"); + return NULL; + } + if (!MCI_GetDrv(uDeviceID)->lpfnYieldProc) { + WARN(mmsys, "No proc set\n"); + return NULL; + } + if (MCI_GetDrv(uDeviceID)->bIs32) { + WARN(mmsys, "Proc is 32 bit\n"); + return NULL; + } + return MCI_GetDrv(uDeviceID)->lpfnYieldProc; } /************************************************************************** @@ -1668,8 +1718,20 @@ YIELDPROC WINAPI mciGetYieldProc16(UINT16 uDeviceID, DWORD* lpdwYieldData) */ YIELDPROC WINAPI mciGetYieldProc(UINT uDeviceID, DWORD* lpdwYieldData) { - FIXME(mci, "(%u, %p) stub\n", uDeviceID, lpdwYieldData); - return NULL; + TRACE(mmsys, "(%u, %p)\n", uDeviceID, lpdwYieldData); + if (!MCI_DevIDValid(uDeviceID) || MCI_GetDrv(uDeviceID)->modp.wType == 0) { + WARN(mmsys, "Bad uDeviceID\n"); + return NULL; + } + if (!MCI_GetDrv(uDeviceID)->lpfnYieldProc) { + WARN(mmsys, "No proc set\n"); + return NULL; + } + if (!MCI_GetDrv(uDeviceID)->bIs32) { + WARN(mmsys, "Proc is 32 bit\n"); + return NULL; + } + return MCI_GetDrv(uDeviceID)->lpfnYieldProc; } /************************************************************************** @@ -1693,19 +1755,37 @@ HTASK WINAPI mciGetCreatorTask(UINT uDeviceID) /************************************************************************** * mciDriverYield [MMSYSTEM.710] */ -UINT16 WINAPI mciDriverYield16(HANDLE16 hnd) +UINT16 WINAPI mciDriverYield16(UINT16 uDeviceID) { - FIXME(mmsys,"(%04x): stub!\n", hnd); - return 0; + UINT16 ret = 0; + + TRACE(mmsys,"(%04x)\n", uDeviceID); + if (!MCI_DevIDValid(uDeviceID) || MCI_GetDrv(uDeviceID)->modp.wType == 0 || + !MCI_GetDrv(uDeviceID)->lpfnYieldProc || MCI_GetDrv(uDeviceID)->bIs32) { + OldYield16(); + } else { + ret = MCI_GetDrv(uDeviceID)->lpfnYieldProc(uDeviceID, MCI_GetDrv(uDeviceID)->dwYieldData); + } + + return ret; } /************************************************************************** * mciDriverYield [WINMM.37] */ -UINT WINAPI mciDriverYield(HANDLE hnd) +UINT WINAPI mciDriverYield(UINT uDeviceID) { - FIXME(mmsys,"(%04x): stub!\n", hnd); - return 0; + UINT ret = 0; + + TRACE(mmsys,"(%04x)\n", uDeviceID); + if (!MCI_DevIDValid(uDeviceID) || MCI_GetDrv(uDeviceID)->modp.wType == 0 || + !MCI_GetDrv(uDeviceID)->lpfnYieldProc || !MCI_GetDrv(uDeviceID)->bIs32) { + OldYield16(); + } else { + ret = MCI_GetDrv(uDeviceID)->lpfnYieldProc(uDeviceID, MCI_GetDrv(uDeviceID)->dwYieldData); + } + + return ret; } /************************************************************************** @@ -4193,13 +4273,13 @@ LRESULT WINAPI DefDriverProc(DWORD dwDriverIdentifier, HDRVR hDrv, { switch (Msg) { case DRV_LOAD: - case DRV_DISABLE: - case DRV_INSTALL: - return 0; - case DRV_ENABLE: case DRV_FREE: - case DRV_REMOVE: + case DRV_ENABLE: + case DRV_DISABLE: return 1; + case DRV_INSTALL: + case DRV_REMOVE: + return DRV_SUCCESS; default: return 0; } @@ -4210,45 +4290,75 @@ LRESULT WINAPI DefDriverProc(DWORD dwDriverIdentifier, HDRVR hDrv, */ LRESULT WINAPI mmThreadCreate16(LPVOID x1, LPWORD x2, DWORD x3, DWORD x4) { - FIXME(mmsys,"(%p,%p,%08lx,%08lx): stub!\n",x1,x2,x3,x4); + FIXME(mmsys, "(%p,%p,%08lx,%08lx): stub!\n",x1,x2,x3,x4); *x2 = 0xbabe; return 0; } +/************************************************************************** + * mmThreadSignal [MMSYSTEM.1121] + */ +LRESULT WINAPI mmThreadSignal16(HANDLE16 hnd) +{ + FIXME(mmsys,"(%04x): stub!\n", hnd); + return 0; +} + +/************************************************************************** + * mmThreadBlock [MMSYSTEM.1122] + */ +void WINAPI mmThreadBlock16(HANDLE16 hnd) +{ + FIXME(mmsys,"(%04x): stub!\n", hnd); +} + +/************************************************************************** + * mmThreadIsCurrent [MMSYSTEM.1123] + */ +BOOL16 WINAPI mmThreadIsCurrent16(HANDLE16 hnd) +{ + FIXME(mmsys,"(%04x): stub!\n", hnd); + return FALSE; +} + /************************************************************************** * mmThreadGetTask [MMSYSTEM.1125] */ -LRESULT WINAPI mmThreadGetTask16(WORD hnd) +LRESULT WINAPI mmThreadGetTask16(HANDLE16 hnd) { FIXME(mmsys,"(%04x): stub!\n", hnd); return GetCurrentTask(); } /************************************************************************** - * mmThreadSignal [MMSYSTEM.1121] + * mmThreadIsValid [MMSYSTEM.1124] */ -LRESULT WINAPI mmThreadSignal16(WORD hnd) +BOOL16 WINAPI mmThreadIsValid16(HANDLE16 handle) { - FIXME(mmsys,"(%04x): stub!\n", hnd); + FIXME(mmsys, "(%04x): stub!\n", handle); return 0; } /************************************************************************** * mmTaskCreate [MMSYSTEM.900] + * + * Creates a 16 bit MM task. It's entry point is lpFunc, and it should be + * called upon creation with dwPmt as parameter. */ -HINSTANCE16 WINAPI mmTaskCreate16(LPWORD lphnd,HINSTANCE16 *hMmTask, DWORD x2) +HINSTANCE16 WINAPI mmTaskCreate16(SEGPTR lphnd, HINSTANCE16 *hMmTask, DWORD dwPmt) { +#if 1 DWORD showCmd = 0x40002; LPSTR cmdline; WORD sel1, sel2; LOADPARAMS16 *lp; HINSTANCE16 ret, handle; - TRACE(mmsys,"(%p,%p,%08lx);\n", lphnd, hMmTask,x2); + TRACE(mmsys, "(%08lx,%p,%08lx);\n", lphnd, hMmTask, dwPmt); cmdline = (LPSTR)HeapAlloc(GetProcessHeap(), 0, 0x0d); cmdline[0] = 0x0d; (DWORD)cmdline[1] = (DWORD)lphnd; - (DWORD)cmdline[5] = x2; + (DWORD)cmdline[5] = dwPmt; (DWORD)cmdline[9] = 0; sel1 = SELECTOR_AllocBlock(cmdline, 0x0d, SEGMENT_DATA, FALSE, FALSE); @@ -4261,20 +4371,20 @@ HINSTANCE16 WINAPI mmTaskCreate16(LPWORD lphnd,HINSTANCE16 *hMmTask, DWORD x2) lp->showCmd = PTR_SEG_OFF_TO_SEGPTR(sel2, 0); lp->reserved = 0; - ret = LoadModule16("c:\\windows\\mmtask.tsk", lp); + ret = LoadModule16("c:\\windows\\system\\mmtask.tsk", lp); + TRACE(mmsys, "MMtask's handle = 0x%04x\n", ret); if (ret < 32) { if (ret) ret = 1; else ret = 2; handle = 0; - } - else { + } else { handle = ret; ret = 0; } if (hMmTask) - *(HINSTANCE16 *)PTR_SEG_TO_LIN(hMmTask) = handle; + *hMmTask = handle; UnMapLS(PTR_SEG_OFF_TO_SEGPTR(sel2, 0)); UnMapLS(PTR_SEG_OFF_TO_SEGPTR(sel1, 0)); @@ -4282,7 +4392,30 @@ HINSTANCE16 WINAPI mmTaskCreate16(LPWORD lphnd,HINSTANCE16 *hMmTask, DWORD x2) HeapFree(GetProcessHeap(), 0, lp); HeapFree(GetProcessHeap(), 0, cmdline); + TRACE(mmsys, "=> 0x%04x/%d %04x\n", handle, ret, *(LPWORD)PTR_SEG_TO_LIN(lphnd)); return ret; +#else + TRACE(mmsys, "(%p,%p,%08lx);\n", lphnd, hMmTask, x2); + if (hMmTask) + *hMmTask = 0xfade; + return 0; +#endif +} + +/************************************************************************** + * mmTaskBlock [MMSYSTEM.902] + */ +void WINAPI mmTaskBlock16(HINSTANCE16 WINE_UNUSED hInst) +{ + MSG msg; + + do { + GetMessageA(&msg, 0, 0, 0); + if (msg.hwnd) { + TranslateMessage(&msg); + DispatchMessageA(&msg); + } + } while (msg.message < 0x3A0); } /************************************************************************** @@ -4293,3 +4426,24 @@ LRESULT WINAPI mmTaskSignal16(HTASK16 ht) TRACE(mmsys,"(%04x);\n", ht); return PostAppMessageA(ht, WM_USER, 0, 0); } + +/************************************************************************** + * mmTaskYield16 [MMSYSTEM.905] + */ +void WINAPI mmTaskYield16(void) +{ + MSG msg; + + if (PeekMessageA(&msg, 0, 0, 0, 0)) { + Yield16(); + } +} + +/************************************************************************** + * mmShowMMCPLPropertySheet [MMSYSTEM.1150] + */ +BOOL16 WINAPI mmShowMMCPLPropertySheet16(WORD w1, WORD w2, WORD w3, WORD w4, WORD w5, WORD w6, WORD w7) +{ + FIXME(mmsys, "%04x %04x %04x %04x %04x %04x %04x\n", w1, w2, w3, w4, w5, w6, w7); + return TRUE; +}