Commit 30dbb049 authored by Eric Pouech's avatar Eric Pouech Committed by Alexandre Julliard

- implemented MCI_SOUND command

- fixed MCI command table in resource - added a TODO list on MCI handling
parent 91d63c0c
/* -*- 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"
......@@ -1521,6 +1534,26 @@ static DWORD MCI_Break(UINT wDevID, DWORD dwFlags, LPMCI_BREAK_PARMS lpParms)
}
/**************************************************************************
* 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]
*/
DWORD MCI_SendCommand(UINT wDevID, UINT16 wMsg, DWORD dwParam1,
......@@ -1567,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;
......@@ -1586,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) {
......
......@@ -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:
......
......@@ -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,
......
......@@ -518,6 +518,11 @@ typedef struct {
typedef struct {
DWORD dwCallback;
SEGPTR lpstrSoundName;
} MCI_SOUND_PARMS16, *LPMCI_SOUND_PARMS16;
typedef struct {
DWORD dwCallback;
SEGPTR lpstrCommand;
} MCI_VD_ESCAPE_PARMS16, *LPMCI_VD_ESCAPE_PARMS16;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment