diff --git a/reactos/lib/winmm/mci.c b/reactos/lib/winmm/mci.c index b22a00a9f00..978eb8e0a18 100644 --- a/reactos/lib/winmm/mci.c +++ b/reactos/lib/winmm/mci.c @@ -1,5 +1,3 @@ -/* -*- tab-width: 8; c-basic-offset: 4 -*- */ - /* * MCI internal functions * @@ -20,6 +18,21 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +/* TODO: + * - implement WINMM (32bit) multitasking and use it in all MCI drivers + * instead of the home grown one + * - 16bit mmTaskXXX functions are currently broken because the 16 + * loader does not support binary command lines => provide Wine's + * own mmtask.tsk not using binary command line. + * - correctly handle the MCI_ALL_DEVICE_ID in functions. + * - finish mapping 16 <=> 32 of MCI structures and commands + * - implement auto-open feature (ie, when a string command is issued + * for a not yet opened device, MCI automatically opens it) + * - use a default registry setting to replace the [mci] section in + * configuration file (layout of info in registry should be compatible + * with all Windows' version - which use different layouts of course) + */ + #include "config.h" #include "wine/port.h" @@ -593,7 +606,7 @@ static LPCSTR MCI_FindCommand(UINT uTbl, LPCSTR verb) * array look up */ for (idx = 0; idx < S_MciCmdTable[uTbl].nVerbs; idx++) { - if (strcmp(S_MciCmdTable[uTbl].aVerbs[idx], verb) == 0) + if (strcasecmp(S_MciCmdTable[uTbl].aVerbs[idx], verb) == 0) return S_MciCmdTable[uTbl].aVerbs[idx]; } @@ -885,6 +898,7 @@ DWORD WINAPI mciSendStringA(LPCSTR lpstrCommand, LPSTR lpstrRet, if (!(verb = HeapAlloc(GetProcessHeap(), 0, strlen(lpstrCommand)+1))) return MCIERR_OUT_OF_MEMORY; strcpy( verb, lpstrCommand ); + CharLowerA(verb); memset(data, 0, sizeof(data)); @@ -898,7 +912,7 @@ DWORD WINAPI mciSendStringA(LPCSTR lpstrCommand, LPSTR lpstrRet, } /* case dev == 'new' has to be handled */ - if (!strcasecmp(dev, "new")) { + if (!strcmp(dev, "new")) { FIXME("'new': NIY as device name\n"); dwRet = MCIERR_MISSING_DEVICE_NAME; goto errCleanUp; @@ -956,6 +970,8 @@ DWORD WINAPI mciSendStringA(LPCSTR lpstrCommand, LPSTR lpstrRet, } dwRet = MCI_LoadMciDriver(devType, &wmd); + if (dwRet == MCIERR_DEVICE_NOT_INSTALLED) + dwRet = MCIERR_INVALID_DEVICE_NAME; HeapFree(GetProcessHeap(), 0, devType); if (dwRet) { MCI_UnLoadMciDriver(wmd); @@ -1517,6 +1533,26 @@ static DWORD MCI_Break(UINT wDevID, DWORD dwFlags, LPMCI_BREAK_PARMS lpParms) return dwRet; } +/************************************************************************** + * MCI_Sound [internal] + */ +static DWORD MCI_Sound(UINT wDevID, DWORD dwFlags, LPMCI_SOUND_PARMS lpParms) +{ + DWORD dwRet = 0; + + if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK; + + if (dwFlags & MCI_SOUND_NAME) + dwRet = sndPlaySoundA(lpParms->lpstrSoundName, SND_SYNC) ? MMSYSERR_NOERROR : MMSYSERR_ERROR; + else + dwRet = MMSYSERR_ERROR; /* what should be done ??? */ + if (dwFlags & MCI_NOTIFY) + mciDriverNotify((HWND)lpParms->dwCallback, wDevID, + (dwRet == 0) ? MCI_NOTIFY_SUCCESSFUL : MCI_NOTIFY_FAILURE); + + return dwRet; +} + /************************************************************************** * MCI_SendCommand [internal] */ @@ -1564,7 +1600,7 @@ DWORD MCI_SendCommand(UINT wDevID, UINT16 wMsg, DWORD dwParam1, dwRet = MCI_SysInfo(wDevID, dwParam1, (LPMCI_SYSINFO_PARMSA)dwParam2); pFnMciUnMapMsg16To32A(0, wMsg, dwParam2); break; - default: break; /* so that gcc doesnot bark */ + default: break; /* so that gcc does not bark */ } } break; @@ -1583,9 +1619,18 @@ DWORD MCI_SendCommand(UINT wDevID, UINT16 wMsg, DWORD dwParam1, } break; case MCI_SOUND: - /* FIXME: it seems that MCI_SOUND needs the same handling as MCI_BREAK - * but I couldn't get any doc on this MCI message - */ + if (bFrom32) { + dwRet = MCI_Sound(wDevID, dwParam1, (LPMCI_SOUND_PARMS)dwParam2); + } else if (pFnMciMapMsg16To32A) { + switch (pFnMciMapMsg16To32A(0, wMsg, &dwParam2)) { + case WINMM_MAP_OK: + case WINMM_MAP_OKMEM: + dwRet = MCI_Sound(wDevID, dwParam1, (LPMCI_SOUND_PARMS)dwParam2); + pFnMciUnMapMsg16To32A(0, wMsg, dwParam2); + break; + default: break; /* so that gcc does not bark */ + } + } break; default: if (wDevID == MCI_ALL_DEVICE_ID) { diff --git a/reactos/lib/winmm/message16.c b/reactos/lib/winmm/message16.c index 475c988d18a..faaca59a850 100644 --- a/reactos/lib/winmm/message16.c +++ b/reactos/lib/winmm/message16.c @@ -1995,6 +1995,20 @@ static WINMM_MapType MCI_MapMsg16To32A(WORD uDevType, WORD wMsg, DWORD* lParam) *lParam = (DWORD)msip32a; } return WINMM_MAP_OKMEM; + case MCI_SOUND: + { + LPMCI_SOUND_PARMS mbp32 = HeapAlloc(GetProcessHeap(), 0, sizeof(MCI_SOUND_PARMS)); + LPMCI_SOUND_PARMS16 mbp16 = MapSL(*lParam); + + if (mbp32) { + mbp32->dwCallback = mbp16->dwCallback; + mbp32->lpstrSoundName = MapSL(mbp16->lpstrSoundName); + } else { + return WINMM_MAP_NOMEM; + } + *lParam = (DWORD)mbp32; + } + return WINMM_MAP_OKMEM; case DRV_LOAD: case DRV_ENABLE: case DRV_OPEN: @@ -2065,6 +2079,7 @@ static WINMM_MapType MCI_UnMapMsg16To32A(WORD uDevType, WORD wMsg, DWORD lParam case MCI_ESCAPE: case MCI_INFO: case MCI_SYSINFO: + case MCI_SOUND: HeapFree(GetProcessHeap(), 0, (LPVOID)lParam); return WINMM_MAP_OK; case MCI_OPEN: @@ -2454,6 +2469,7 @@ static WINMM_MapType MCI_MapMsg32ATo16(WORD uDevType, WORD wMsg, DWORD dwFlags, break; /* case MCI_SETTIMECODE:*/ /* case MCI_SIGNAL:*/ + /* case MCI_SOUND:*/ case MCI_SPIN: size = sizeof(MCI_SET_PARMS); break; @@ -2653,6 +2669,7 @@ static WINMM_MapType MCI_UnMapMsg32ATo16(WORD uDevType, WORD wMsg, DWORD dwFlag break; /* case MCI_SETTIMECODE:*/ /* case MCI_SIGNAL:*/ + /* case MCI_SOUND:*/ case MCI_SPIN: break; case MCI_STATUS: diff --git a/reactos/lib/winmm/mmio.c b/reactos/lib/winmm/mmio.c index f588690e527..d6736dd53fa 100644 --- a/reactos/lib/winmm/mmio.c +++ b/reactos/lib/winmm/mmio.c @@ -633,7 +633,12 @@ HMMIO MMIO_Open(LPSTR szFileName, MMIOINFO* refmminfo, DWORD dwOpenFlags, /* Handle any unhandled/error case. Assume DOS file */ if (wm->info.fccIOProc == 0) wm->info.fccIOProc = FOURCC_DOS; - if (!(wm->ioProc = MMIO_FindProcNode(wm->info.fccIOProc))) goto error2; + if (!(wm->ioProc = MMIO_FindProcNode(wm->info.fccIOProc))) { + /* If not found, retry with FOURCC_DOS */ + wm->info.fccIOProc = FOURCC_DOS; + if (!(wm->ioProc = MMIO_FindProcNode(wm->info.fccIOProc))) + goto error2; + } wm->bTmpIOProc = FALSE; } /* if just the four character code is present, look up IO proc */ diff --git a/reactos/lib/winmm/winmm_res.rc b/reactos/lib/winmm/winmm_res.rc index a6a4fca1af0..dc30d98fd05 100644 --- a/reactos/lib/winmm/winmm_res.rc +++ b/reactos/lib/winmm/winmm_res.rc @@ -405,7 +405,7 @@ END CDAUDIO RCDATA BEGIN -"atus\0", 0x00000814L, MCI_COMMAND_HEAD, +"status\0", 0x00000814L, MCI_COMMAND_HEAD, "\0", 0x00000002L, MCI_RETURN, "notify\0", 0x00000001L, MCI_FLAG, "wait\0", 0x00000002L, MCI_FLAG, @@ -456,7 +456,7 @@ END SEQUENCER RCDATA BEGIN -"atus\0", 0x00000814L, MCI_COMMAND_HEAD, +"status\0", 0x00000814L, MCI_COMMAND_HEAD, "\0", 0x00000002L, MCI_RETURN, "notify\0", 0x00000001L, MCI_FLAG, "wait\0", 0x00000002L, MCI_FLAG,