MM fix
eric pouech
eric.pouech at wanadoo.fr
Tue Nov 13 16:28:32 CST 2001
this patch fixes wave(In|Out)Open when called with WAVE_MAPPED flag...
A+
--
---------------
Eric Pouech (http://perso.wanadoo.fr/eric.pouech/)
"The future will be better tomorrow", Vice President Dan Quayle
-------------- next part --------------
Name: wavemapped
ChangeLog: fixed wave(In|Out)Open when called with WAVE_MAPPED flag; some minor 16/32 API call ordering
GenDate: 2001/11/13 22:27:03 UTC
ModifiedFiles: dlls/winmm/mmsystem.c dlls/winmm/wavemap/wavemap.c
AddedFiles:
===================================================================
RCS file: /usr/share/cvs/cvsroot/wine/wine/dlls/winmm/mmsystem.c,v
retrieving revision 1.45
diff -u -u -r1.45 mmsystem.c
--- dlls/winmm/mmsystem.c 2001/07/24 21:45:23 1.45
+++ dlls/winmm/mmsystem.c 2001/11/13 22:22:43
@@ -619,18 +619,18 @@
/**************************************************************************
- * mmsystemGetVersion [WINMM.@]
+ * mmsystemGetVersion [MMSYSTEM.5]
+ * return value borrowed from Win95 winmm.dll ;)
*/
-UINT WINAPI mmsystemGetVersion(void)
+UINT16 WINAPI mmsystemGetVersion16(void)
{
- return mmsystemGetVersion16();
+ return mmsystemGetVersion();
}
/**************************************************************************
- * mmsystemGetVersion [MMSYSTEM.5]
- * return value borrowed from Win95 winmm.dll ;)
+ * mmsystemGetVersion [WINMM.@]
*/
-UINT16 WINAPI mmsystemGetVersion16(void)
+UINT WINAPI mmsystemGetVersion(void)
{
TRACE("3.10 (Win95?)\n");
return 0x030a;
@@ -654,9 +654,9 @@
break;
case DCB_WINDOW:
TRACE("Window(%04lX) handle=%04X!\n", dwCallBack, hDev);
- if (!IsWindow(dwCallBack))
- return FALSE;
- PostMessageA((HWND16)dwCallBack, wMsg, hDev, dwParam1);
+/* EPP if (!IsWindow(dwCallBack)) */
+/* EPP return FALSE; */
+ PostMessageA((HWND)dwCallBack, wMsg, hDev, dwParam1);
break;
case DCB_TASK: /* aka DCB_THREAD */
TRACE("Task(%04lx) !\n", dwCallBack);
@@ -1538,17 +1538,17 @@
}
/**************************************************************************
- * mciGetErrorStringA [WINMM.@]
+ * mciGetErrorString [MMSYSTEM.706]
*/
-BOOL WINAPI mciGetErrorStringA(DWORD wError, LPSTR lpstrBuffer, UINT uLength)
+BOOL16 WINAPI mciGetErrorString16(DWORD wError, LPSTR lpstrBuffer, UINT16 uLength)
{
- return mciGetErrorString16(wError, lpstrBuffer, uLength);
+ return mciGetErrorStringA(wError, lpstrBuffer, uLength);
}
/**************************************************************************
- * mciGetErrorString [MMSYSTEM.706]
+ * mciGetErrorStringA [WINMM.@]
*/
-BOOL16 WINAPI mciGetErrorString16(DWORD dwError, LPSTR lpstrBuffer, UINT16 uLength)
+BOOL WINAPI mciGetErrorStringA(DWORD dwError, LPSTR lpstrBuffer, UINT uLength)
{
BOOL16 ret = FALSE;
@@ -2460,8 +2460,17 @@
TRACE("(%04X, %04X, %08lX, %08lX)\n", hMidiOut, uMessage, dwParam1, dwParam2);
- if ((wmld = MMDRV_Get(hMidiOut, MMDRV_MIDIOUT, FALSE)) == NULL)
+ if ((wmld = MMDRV_Get(hMidiOut, MMDRV_MIDIOUT, FALSE)) == NULL) {
+ /* HACK... */
+ if (uMessage == 0x0001) {
+ *(LPDWORD)dwParam1 = 1;
+ return 0;
+ }
+ if ((wmld = MMDRV_Get(hMidiOut, MMDRV_MIDIOUT, TRUE)) != NULL) {
+ return MMDRV_PhysicalFeatures(wmld, uMessage, dwParam1, dwParam2);
+ }
return MMSYSERR_INVALHANDLE;
+ }
switch (uMessage) {
case MODM_OPEN:
@@ -3650,6 +3659,8 @@
if (dwFlags & WAVE_FORMAT_QUERY) TRACE("WAVE_FORMAT_QUERY requested !\n");
if (lpFormat == NULL) return WAVERR_BADFORMAT;
+ if ((dwFlags & WAVE_MAPPED) && (uDeviceID == (UINT)-1))
+ return MMSYSERR_INVALPARAM;
TRACE("wFormatTag=%u, nChannels=%u, nSamplesPerSec=%lu, nAvgBytesPerSec=%lu, nBlockAlign=%u, wBitsPerSample=%u, cbSize=%u\n",
lpFormat->wFormatTag, lpFormat->nChannels, lpFormat->nSamplesPerSec,
@@ -3663,19 +3674,22 @@
wod.lpFormat = lpFormat; /* should the struct be copied iso pointer? */
wod.dwCallback = dwCallback;
wod.dwInstance = dwInstance;
- wod.uMappedDeviceID = 0;
wod.dnDevNode = 0L;
- /* when called from 16 bit code, mapper will be 0x0000FFFF instead of 0xFFFFFFFF */
- /* this should fix it */
- wmld->uDeviceID = (uDeviceID == (UINT16)-1 && !bFrom32) ? (UINT)-1 : uDeviceID;
+ if (dwFlags & WAVE_MAPPED) {
+ wod.uMappedDeviceID = uDeviceID;
+ uDeviceID = WAVE_MAPPER;
+ } else {
+ wod.uMappedDeviceID = -1;
+ }
+ wmld->uDeviceID = uDeviceID;
- dwRet = MMDRV_Open(wmld, (uType==MMDRV_WAVEOUT)?WODM_OPEN:WIDM_OPEN, (DWORD)&wod, dwFlags);
+ dwRet = MMDRV_Open(wmld, (uType == MMDRV_WAVEOUT) ? WODM_OPEN : WIDM_OPEN, (DWORD)&wod, dwFlags);
if ((dwFlags & WAVE_FORMAT_QUERY) || dwRet != MMSYSERR_NOERROR) {
MMDRV_Free(handle, wmld);
handle = 0;
- }
+ }
if (lphndl != NULL) *lphndl = handle;
TRACE("=> %ld hWave=%04x\n", dwRet, handle);
@@ -3848,9 +3862,11 @@
/* since layout of WAVEFORMATEX is the same for 16/32 bits, we directly
* call the 32 bit version
+ * however, we need to promote correctly the wave mapper id
+ * (0xFFFFFFFF and not 0x0000FFFF)
*/
- ret = MMSYSTEM_waveOpen(&hWaveOut, uDeviceID, MMDRV_WAVEOUT, lpFormat,
- dwCallback, dwInstance, dwFlags, FALSE);
+ ret = MMSYSTEM_waveOpen(&hWaveOut, (uDeviceID == (UINT16)-1) ? (UINT)-1 : uDeviceID,
+ MMDRV_WAVEOUT, lpFormat, dwCallback, dwInstance, dwFlags, FALSE);
if (lphWaveOut != NULL) *lphWaveOut = hWaveOut;
return ret;
@@ -4489,9 +4505,11 @@
/* since layout of WAVEFORMATEX is the same for 16/32 bits, we directly
* call the 32 bit version
+ * however, we need to promote correctly the wave mapper id
+ * (0xFFFFFFFF and not 0x0000FFFF)
*/
- ret = MMSYSTEM_waveOpen(&hWaveIn, uDeviceID, MMDRV_WAVEIN, lpFormat,
- dwCallback, dwInstance, dwFlags, FALSE);
+ ret = MMSYSTEM_waveOpen(&hWaveIn, (uDeviceID == (UINT16)-1) ? (UINT)-1 : uDeviceID,
+ MMDRV_WAVEIN, lpFormat, dwCallback, dwInstance, dwFlags, FALSE);
if (lphWaveIn != NULL) *lphWaveIn = hWaveIn;
return ret;
Index: dlls/winmm/wavemap/wavemap.c
===================================================================
RCS file: /usr/share/cvs/cvsroot/wine/wine/dlls/winmm/wavemap/wavemap.c,v
retrieving revision 1.15
diff -u -u -r1.15 wavemap.c
--- dlls/winmm/wavemap/wavemap.c 2001/07/11 18:56:44 1.15
+++ dlls/winmm/wavemap/wavemap.c 2001/11/13 22:18:00
@@ -111,7 +111,7 @@
static DWORD wodOpen(LPDWORD lpdwUser, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
{
- UINT nd = waveOutGetNumDevs();
+ UINT ndlo, ndhi;
UINT i;
WAVEMAPDATA* wom = HeapAlloc(GetProcessHeap(), 0, sizeof(WAVEMAPDATA));
WAVEFORMATEX wfx;
@@ -121,13 +121,22 @@
if (!wom)
return MMSYSERR_NOMEM;
+ ndhi = waveOutGetNumDevs();
+ if (dwFlags & WAVE_MAPPED) {
+ if (lpDesc->uMappedDeviceID >= ndhi) return MMSYSERR_INVALPARAM;
+ ndlo = lpDesc->uMappedDeviceID;
+ ndhi = ndlo + 1;
+ dwFlags &= ~WAVE_MAPPED;
+ } else {
+ ndlo = 0;
+ }
wom->self = wom;
wom->dwCallback = lpDesc->dwCallback;
wom->dwFlags = dwFlags;
wom->dwClientInstance = lpDesc->dwInstance;
wom->hOuterWave = lpDesc->hWave;
- for (i = 0; i < nd; i++) {
+ for (i = ndlo; i < ndhi; i++) {
/* if no ACM stuff is involved, no need to handle callbacks at this
* level, this will be done transparently
*/
@@ -145,7 +154,7 @@
#define TRY(sps,bps) wfx.nSamplesPerSec = (sps); wfx.wBitsPerSample = (bps); \
if (wodOpenHelper(wom, i, lpDesc, &wfx, dwFlags) == MMSYSERR_NOERROR) goto found;
- for (i = 0; i < nd; i++) {
+ for (i = ndlo; i < ndhi; i++) {
/* first try with same stereo/mono option as source */
wfx.nChannels = lpDesc->lpFormat->nChannels;
TRY(44100, 16);
@@ -435,7 +444,7 @@
TRACE("(0x%x %u %ld %lx %lx);\n", hWave, uMsg, dwInstance, dwParam1, dwParam2);
if (!WAVEMAP_IsData(wim)) {
- ERR("Bad date\n");
+ ERR("Bad data\n");
return;
}
@@ -502,7 +511,7 @@
static DWORD widOpen(LPDWORD lpdwUser, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
{
- UINT nd = waveInGetNumDevs();
+ UINT ndlo, ndhi;
UINT i;
WAVEMAPDATA* wim = HeapAlloc(GetProcessHeap(), 0, sizeof(WAVEMAPDATA));
WAVEFORMATEX wfx;
@@ -518,7 +527,17 @@
wim->dwClientInstance = lpDesc->dwInstance;
wim->hOuterWave = lpDesc->hWave;
- for (i = 0; i < nd; i++) {
+ ndhi = waveOutGetNumDevs();
+ if (dwFlags & WAVE_MAPPED) {
+ if (lpDesc->uMappedDeviceID >= ndhi) return MMSYSERR_INVALPARAM;
+ ndlo = lpDesc->uMappedDeviceID;
+ ndhi = ndlo + 1;
+ dwFlags &= ~WAVE_MAPPED;
+ } else {
+ ndlo = 0;
+ }
+
+ for (i = ndlo; i < ndhi; i++) {
if (waveInOpen(&wim->hInnerWave, i, lpDesc->lpFormat, (DWORD)widCallback,
(DWORD)wim, (dwFlags & ~CALLBACK_TYPEMASK) | CALLBACK_FUNCTION) == MMSYSERR_NOERROR) {
wim->hAcmStream = 0;
@@ -532,7 +551,7 @@
#define TRY(sps,bps) wfx.nSamplesPerSec = (sps); wfx.wBitsPerSample = (bps); \
if (widOpenHelper(wim, i, lpDesc, &wfx, dwFlags) == MMSYSERR_NOERROR) goto found;
- for (i = 0; i < nd; i++) {
+ for (i = ndlo; i < ndhi; i++) {
/* first try with same stereo/mono option as source */
wfx.nChannels = lpDesc->lpFormat->nChannels;
TRY(44100, 8);
More information about the wine-patches
mailing list