Fixed crash with mapper loading.
Got rid of hack on WAVEHDR's reserved field for 16/32 bit
discrimination.
diff --git a/multimedia/lolvldrv.c b/multimedia/lolvldrv.c
index b9b954d..1942870 100644
--- a/multimedia/lolvldrv.c
+++ b/multimedia/lolvldrv.c
@@ -657,8 +657,6 @@
/* FIXME: nothing on wh32->lpNext */
/* could link the wh32->lpNext at this level for memory house keeping */
wh16->lpNext = wh32; /* for reuse in unprepare and write */
- wh32->reserved = (DWORD)wh32; /* hack in audio.c */
-
*lpParam1 = (DWORD)wh32;
*lpParam2 = sizeof(WAVEHDR);
@@ -837,8 +835,6 @@
/* FIXME: nothing on wh32->lpNext */
/* could link the wh32->lpNext at this level for memory house keeping */
wh32->lpNext = wh16; /* for reuse in unprepare and write */
- wh16->reserved = (DWORD)SEGPTR_GET(ptr) + sizeof(LPWAVEHDR); /* hack in audio.c */
-
TRACE("wh16=%08lx wh16->lpData=%08lx wh32->buflen=%lu wh32->lpData=%08lx\n",
(DWORD)SEGPTR_GET(ptr) + sizeof(LPWAVEHDR), (DWORD)wh16->lpData,
wh32->dwBufferLength, (DWORD)wh32->lpData);
@@ -1128,8 +1124,6 @@
/* FIXME: nothing on wh32->lpNext */
/* could link the wh32->lpNext at this level for memory house keeping */
wh16->lpNext = wh32; /* for reuse in unprepare and write */
- wh32->reserved = (DWORD)wh32; /* hack in audio.c */
-
*lpParam1 = (DWORD)wh32;
*lpParam2 = sizeof(WAVEHDR);
@@ -1368,8 +1362,6 @@
/* FIXME: nothing on wh32->lpNext */
/* could link the wh32->lpNext at this level for memory house keeping */
wh32->lpNext = wh16; /* for reuse in unprepare and write */
- wh16->reserved = (DWORD)SEGPTR_GET(ptr) + sizeof(LPWAVEHDR); /* hack in audio.c */
-
TRACE("wh16=%08lx wh16->lpData=%08lx wh32->buflen=%lu wh32->lpData=%08lx\n",
(DWORD)SEGPTR_GET(ptr) + sizeof(LPWAVEHDR), (DWORD)wh16->lpData,
wh32->dwBufferLength, (DWORD)wh32->lpData);
@@ -1882,12 +1874,13 @@
/**************************************************************************
* MMDRV_InitPerType [internal]
*/
-static void MMDRV_InitPerType(LPWINE_MM_DRIVER lpDrv, UINT num,
+static BOOL MMDRV_InitPerType(LPWINE_MM_DRIVER lpDrv, UINT num,
UINT type, UINT wMsg)
{
WINE_MM_DRIVER_PART* part = &lpDrv->parts[type];
- DWORD ret;
- UINT count = 0;
+ DWORD ret;
+ UINT count = 0;
+ int i, k;
part->nIDMin = part->nIDMax = 0;
@@ -1918,24 +1911,48 @@
}
TRACE("Got %u dev for (%s:%s)\n", count, lpDrv->name, llTypes[type].name);
- if (count != 0) {
- /* got some drivers */
- if (lpDrv->bIsMapper) {
- if (llTypes[type].nMapper != -1)
- ERR("Two mappers for type %s (%d, %s)\n",
- llTypes[type].name, llTypes[type].nMapper, lpDrv->name);
- if (count > 1)
- ERR("Strange: mapper with %d > 1 devices\n", count);
- llTypes[type].nMapper = num;
- } else {
- part->nIDMin = llTypes[type].wMaxId;
- llTypes[type].wMaxId += count;
- part->nIDMax = llTypes[type].wMaxId;
- }
- TRACE("Setting min=%d max=%d (ttop=%d) for (%s:%s)\n",
- part->nIDMin, part->nIDMax, llTypes[type].wMaxId,
- lpDrv->name, llTypes[type].name);
+ if (count == 0)
+ return FALSE;
+
+ /* got some drivers */
+ if (lpDrv->bIsMapper) {
+ if (llTypes[type].nMapper != -1)
+ ERR("Two mappers for type %s (%d, %s)\n",
+ llTypes[type].name, llTypes[type].nMapper, lpDrv->name);
+ if (count > 1)
+ ERR("Strange: mapper with %d > 1 devices\n", count);
+ llTypes[type].nMapper = num;
+ } else {
+ part->nIDMin = llTypes[type].wMaxId;
+ llTypes[type].wMaxId += count;
+ part->nIDMax = llTypes[type].wMaxId;
}
+ TRACE("Setting min=%d max=%d (ttop=%d) for (%s:%s)\n",
+ part->nIDMin, part->nIDMax, llTypes[type].wMaxId,
+ lpDrv->name, llTypes[type].name);
+ /* realloc translation table */
+ llTypes[type].lpMlds = (LPWINE_MLD)
+ HeapReAlloc(SystemHeap, 0, (llTypes[type].lpMlds) ? llTypes[type].lpMlds - 1 : NULL,
+ sizeof(WINE_MLD) * (llTypes[type].wMaxId + 1)) + 1;
+ /* re-build the translation table */
+ if (llTypes[type].nMapper != -1) {
+ TRACE("%s:Trans[%d] -> %s\n", llTypes[type].name, -1, MMDrvs[llTypes[type].nMapper].name);
+ llTypes[type].lpMlds[-1].uDeviceID = -1;
+ llTypes[type].lpMlds[-1].type = type;
+ llTypes[type].lpMlds[-1].mmdIndex = llTypes[type].nMapper;
+ llTypes[type].lpMlds[-1].dwDriverInstance = 0;
+ }
+ for (i = k = 0; i <= num; i++) {
+ while (MMDrvs[i].parts[type].nIDMin <= k && k < MMDrvs[i].parts[type].nIDMax) {
+ TRACE("%s:Trans[%d] -> %s\n", llTypes[type].name, k, MMDrvs[i].name);
+ llTypes[type].lpMlds[k].uDeviceID = k;
+ llTypes[type].lpMlds[k].type = type;
+ llTypes[type].lpMlds[k].mmdIndex = i;
+ llTypes[type].lpMlds[k].dwDriverInstance = 0;
+ k++;
+ }
+ }
+ return TRUE;
}
/**************************************************************************
@@ -1947,7 +1964,6 @@
char buffer[128];
HMODULE hModule;
LPWINE_MM_DRIVER lpDrv = &MMDrvs[num];
- int i, j, k;
TRACE("('%s');\n", name);
@@ -2043,36 +2059,7 @@
MMDRV_InitPerType(lpDrv, num, MMDRV_MIDIOUT, MODM_GETNUMDEVS);
MMDRV_InitPerType(lpDrv, num, MMDRV_WAVEIN, WIDM_GETNUMDEVS);
MMDRV_InitPerType(lpDrv, num, MMDRV_WAVEOUT, WODM_GETNUMDEVS);
-
- /* re-build the translation tables */
- for (j = 0; j < MMDRV_MAX; j++) {
- if (llTypes[j].nMapper != -1) {
- llTypes[j].lpMlds = (LPWINE_MLD)
- HeapReAlloc(SystemHeap, 0, llTypes[j].lpMlds,
- sizeof(WINE_MLD) * (llTypes[j].wMaxId + 1)) + 1;
- TRACE("%s:Trans[%d] -> %s\n", llTypes[j].name, -1, MMDrvs[llTypes[j].nMapper].name);
- llTypes[j].lpMlds[-1].uDeviceID = -1;
- llTypes[j].lpMlds[-1].type = j;
- llTypes[j].lpMlds[-1].mmdIndex = llTypes[j].nMapper;
- llTypes[j].lpMlds[-1].dwDriverInstance = 0;
-
- } else {
- llTypes[j].lpMlds = (LPWINE_MLD)
- HeapReAlloc(SystemHeap, 0, llTypes[j].lpMlds,
- sizeof(WINE_MLD) * llTypes[j].wMaxId);
- }
- for (i = k = 0; i <= num; i++) {
- while (MMDrvs[i].parts[j].nIDMin <= k && k < MMDrvs[i].parts[j].nIDMax) {
- TRACE("%s:Trans[%d] -> %s\n", llTypes[j].name, k, MMDrvs[i].name);
- llTypes[j].lpMlds[k].uDeviceID = k;
- llTypes[j].lpMlds[k].type = j;
- llTypes[j].lpMlds[k].mmdIndex = i;
- llTypes[j].lpMlds[k].dwDriverInstance = 0;
- k++;
- }
- }
- }
-
+ /* FIXME: if all those func calls return FALSE, then the driver must be unloaded */
return TRUE;
}