Wine-20041201 vendor drop Added: vendor/wine/dlls/winmm/ Added: vendor/wine/dlls/winmm/current/ Added: vendor/wine/dlls/winmm/current/Makefile.in Added: vendor/wine/dlls/winmm/current/driver.c Added: vendor/wine/dlls/winmm/current/joystick.c Added: vendor/wine/dlls/winmm/current/lolvldrv.c Added: vendor/wine/dlls/winmm/current/mci.c Added: vendor/wine/dlls/winmm/current/message16.c Added: vendor/wine/dlls/winmm/current/midimap/ Added: vendor/wine/dlls/winmm/current/midimap/.cvsignore Added: vendor/wine/dlls/winmm/current/midimap/Makefile.in Added: vendor/wine/dlls/winmm/current/midimap/midimap.c Added: vendor/wine/dlls/winmm/current/midimap/midimap.drv.spec Added: vendor/wine/dlls/winmm/current/mmio.c Added: vendor/wine/dlls/winmm/current/mmsystem.c Added: vendor/wine/dlls/winmm/current/mmsystem.spec Added: vendor/wine/dlls/winmm/current/playsound.c Added: vendor/wine/dlls/winmm/current/sound.spec Added: vendor/wine/dlls/winmm/current/sound16.c Added: vendor/wine/dlls/winmm/current/time.c Added: vendor/wine/dlls/winmm/current/wavemap/ Added: vendor/wine/dlls/winmm/current/wavemap/.cvsignore Added: vendor/wine/dlls/winmm/current/wavemap/Makefile.in Added: vendor/wine/dlls/winmm/current/wavemap/msacm.drv.spec Added: vendor/wine/dlls/winmm/current/wavemap/wavemap.c Added: vendor/wine/dlls/winmm/current/winemm.h Added: vendor/wine/dlls/winmm/current/winemm16.h Added: vendor/wine/dlls/winmm/current/winmm.c Added: vendor/wine/dlls/winmm/current/winmm.spec Added: vendor/wine/dlls/winmm/current/winmm_Cs.rc Added: vendor/wine/dlls/winmm/current/winmm_De.rc Added: vendor/wine/dlls/winmm/current/winmm_En.rc Added: vendor/wine/dlls/winmm/current/winmm_Es.rc Added: vendor/wine/dlls/winmm/current/winmm_Fr.rc Added: vendor/wine/dlls/winmm/current/winmm_It.rc Added: vendor/wine/dlls/winmm/current/winmm_Ja.rc Added: vendor/wine/dlls/winmm/current/winmm_Nl.rc Added: vendor/wine/dlls/winmm/current/winmm_Pt.rc Added: vendor/wine/dlls/winmm/current/winmm_Ru.rc Added: vendor/wine/dlls/winmm/current/winmm_Si.rc Added: vendor/wine/dlls/winmm/current/winmm_Sk.rc Added: vendor/wine/dlls/winmm/current/winmm_res.rc _____
Added: vendor/wine/dlls/winmm/current/Makefile.in --- vendor/wine/dlls/winmm/current/Makefile.in 2004-12-31 16:30:04 UTC (rev 12637) +++ vendor/wine/dlls/winmm/current/Makefile.in 2004-12-31 16:34:31 UTC (rev 12638) @@ -0,0 +1,34 @@
+EXTRADEFS = -D_WINMM_ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +MODULE = winmm.dll +IMPORTS = user32 advapi32 kernel32 ntdll + +C_SRCS = \ + driver.c \ + joystick.c \ + lolvldrv.c \ + mci.c \ + mmio.c \ + playsound.c \ + time.c \ + winmm.c + +C_SRCS16 = \ + message16.c \ + mmsystem.c \ + sound16.c + +SPEC_SRCS16 = \ + mmsystem.spec \ + sound.spec + +RC_SRCS = winmm_res.rc + +SUBDIRS = tests + +@MAKE_DLL_RULES@ + +### Dependencies: _____
Added: vendor/wine/dlls/winmm/current/driver.c --- vendor/wine/dlls/winmm/current/driver.c 2004-12-31 16:30:04 UTC (rev 12637) +++ vendor/wine/dlls/winmm/current/driver.c 2004-12-31 16:34:31 UTC (rev 12638) @@ -0,0 +1,567 @@
+/* -*- tab-width: 8; c-basic-offset: 4 -*- */ + +/* + * WINE Drivers functions + * + * Copyright 1994 Martin Ayotte + * Copyright 1998 Marcus Meissner + * Copyright 1999 Eric Pouech + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include <string.h> +#include <stdarg.h> +#include "windef.h" +#include "winbase.h" +#include "wingdi.h" +#include "winuser.h" +#include "winnls.h" +#include "winreg.h" +#include "mmddk.h" +#include "winemm.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(driver); + +#define HKLM_BASE "Software\Microsoft\Windows NT\CurrentVersion" + +static LPWINE_DRIVER lpDrvItemList /* = NULL */; + +WINE_MMTHREAD* (*pFnGetMMThread16)(UINT16 h) /* = NULL */; +LPWINE_DRIVER (*pFnOpenDriver16)(LPCSTR,LPCSTR,LPARAM) /* = NULL */; +LRESULT (*pFnCloseDriver16)(UINT16,LPARAM,LPARAM) /* = NULL */; +LRESULT (*pFnSendMessage16)(UINT16,UINT,LPARAM,LPARAM) /* = NULL */; + +/********************************************************************** **** + * DRIVER_GetNumberOfModuleRefs [internal] + * + * Returns the number of open drivers which share the same module. + */ +static unsigned DRIVER_GetNumberOfModuleRefs(HMODULE hModule, WINE_DRIVER** found) +{ + LPWINE_DRIVER lpDrv; + unsigned count = 0; + + if (found) *found = NULL; + for (lpDrv = lpDrvItemList; lpDrv; lpDrv = lpDrv->lpNextItem) + { + if (!(lpDrv->dwFlags & WINE_GDF_16BIT) && lpDrv->d.d32.hModule == hModule) + { + if (found && !*found) *found = lpDrv; + count++; + } + } + return count; +} + +/********************************************************************** **** + * DRIVER_FindFromHDrvr [internal] + * + * From a hDrvr being 32 bits, returns the WINE internal structure. + */ +LPWINE_DRIVER DRIVER_FindFromHDrvr(HDRVR hDrvr) +{ + LPWINE_DRIVER d = (LPWINE_DRIVER)hDrvr; + + if (hDrvr && HeapValidate(GetProcessHeap(), 0, d) && d->dwMagic == WINE_DI_MAGIC) { + return d; + } + return NULL; +} + +/********************************************************************** **** + * DRIVER_SendMessage [internal] + */ +static LRESULT inline DRIVER_SendMessage(LPWINE_DRIVER lpDrv, UINT msg, + LPARAM lParam1, LPARAM lParam2) +{ + LRESULT ret = 0; + + if (lpDrv->dwFlags & WINE_GDF_16BIT) { + /* no need to check mmsystem presence: the driver must have been opened as a 16 bit one, + */ + if (pFnSendMessage16) + ret = pFnSendMessage16(lpDrv->d.d16.hDriver16, msg, lParam1, lParam2); + } else { + TRACE("Before call32 proc=%p drvrID=%08lx hDrv=%p wMsg=%04x p1=%08lx p2=%08lx\n", + lpDrv->d.d32.lpDrvProc, lpDrv->d.d32.dwDriverID, (HDRVR)lpDrv, msg, lParam1, lParam2); + ret = lpDrv->d.d32.lpDrvProc(lpDrv->d.d32.dwDriverID, (HDRVR)lpDrv, msg, lParam1, lParam2); + TRACE("After call32 proc=%p drvrID=%08lx hDrv=%p wMsg=%04x p1=%08lx p2=%08lx => %08lx\n", + lpDrv->d.d32.lpDrvProc, lpDrv->d.d32.dwDriverID, (HDRVR)lpDrv, msg, lParam1, lParam2, ret); + } + return ret; +} + +/********************************************************************** **** + * SendDriverMessage [WINMM.@] + * DrvSendMessage [WINMM.@] + */ +LRESULT WINAPI SendDriverMessage(HDRVR hDriver, UINT msg, LPARAM lParam1, + LPARAM lParam2) +{ + LPWINE_DRIVER lpDrv; + LRESULT retval = 0; + + TRACE("(%p, %04X, %08lX, %08lX)\n", hDriver, msg, lParam1, lParam2); + + if ((lpDrv = DRIVER_FindFromHDrvr(hDriver)) != NULL) { + retval = DRIVER_SendMessage(lpDrv, msg, lParam1, lParam2); + } else { + WARN("Bad driver handle %p\n", hDriver); + } + TRACE("retval = %ld\n", retval); + + return retval; +} + +/********************************************************************** **** + * DRIVER_RemoveFromList [internal] + * + * Generates all the logic to handle driver closure / deletion + * Removes a driver struct to the list of open drivers. + */ +static BOOL DRIVER_RemoveFromList(LPWINE_DRIVER lpDrv) +{ + if (!(lpDrv->dwFlags & WINE_GDF_16BIT)) { + /* last of this driver in list ? */ + if (DRIVER_GetNumberOfModuleRefs(lpDrv->d.d32.hModule, NULL) == 1) { + DRIVER_SendMessage(lpDrv, DRV_DISABLE, 0L, 0L); + DRIVER_SendMessage(lpDrv, DRV_FREE, 0L, 0L); + } + } + + if (lpDrv->lpPrevItem) + lpDrv->lpPrevItem->lpNextItem = lpDrv->lpNextItem; + else + lpDrvItemList = lpDrv->lpNextItem; + if (lpDrv->lpNextItem) + lpDrv->lpNextItem->lpPrevItem = lpDrv->lpPrevItem; + /* trash magic number */ + lpDrv->dwMagic ^= 0xa5a5a5a5; + + return TRUE; +} + +/********************************************************************** **** + * DRIVER_AddToList [internal] + * + * Adds a driver struct to the list of open drivers. + * Generates all the logic to handle driver creation / open. + */ +static BOOL DRIVER_AddToList(LPWINE_DRIVER lpNewDrv, LPARAM lParam1, LPARAM lParam2) +{ + lpNewDrv->dwMagic = WINE_DI_MAGIC; + /* First driver to be loaded for this module, need to load correctly the module */ + if (!(lpNewDrv->dwFlags & WINE_GDF_16BIT)) { + /* first of this driver in list ? */ + if (DRIVER_GetNumberOfModuleRefs(lpNewDrv->d.d32.hModule, NULL) == 0) { + if (DRIVER_SendMessage(lpNewDrv, DRV_LOAD, 0L, 0L) != DRV_SUCCESS) { + TRACE("DRV_LOAD failed on driver 0x%08lx\n", (DWORD)lpNewDrv); + return FALSE; + } + /* returned value is not checked */ + DRIVER_SendMessage(lpNewDrv, DRV_ENABLE, 0L, 0L); + } + } + + lpNewDrv->lpNextItem = NULL; + if (lpDrvItemList == NULL) { + lpDrvItemList = lpNewDrv; + lpNewDrv->lpPrevItem = NULL; + } else { + LPWINE_DRIVER lpDrv = lpDrvItemList; /* find end of list */ + while (lpDrv->lpNextItem != NULL) + lpDrv = lpDrv->lpNextItem; + + lpDrv->lpNextItem = lpNewDrv; + lpNewDrv->lpPrevItem = lpDrv; + } + + if (!(lpNewDrv->dwFlags & WINE_GDF_16BIT)) { + /* Now just open a new instance of a driver on this module */ + lpNewDrv->d.d32.dwDriverID = DRIVER_SendMessage(lpNewDrv, DRV_OPEN, lParam1, lParam2); + + if (lpNewDrv->d.d32.dwDriverID == 0) { + TRACE("DRV_OPEN failed on driver 0x%08lx\n", (DWORD)lpNewDrv); + DRIVER_RemoveFromList(lpNewDrv); + return FALSE; + } + } + return TRUE; +} + +/********************************************************************** **** + * DRIVER_GetLibName [internal] + * + */ +BOOL DRIVER_GetLibName(LPCSTR keyName, LPCSTR sectName, LPSTR buf, int sz) +{ + HKEY hKey, hSecKey; + DWORD bufLen, lRet; + + lRet = RegOpenKeyExA(HKEY_LOCAL_MACHINE, HKLM_BASE, 0, KEY_QUERY_VALUE, &hKey); + if (lRet == ERROR_SUCCESS) { + lRet = RegOpenKeyExA(hKey, sectName, 0, KEY_QUERY_VALUE, &hSecKey); + if (lRet == ERROR_SUCCESS) { + lRet = RegQueryValueExA(hSecKey, keyName, 0, 0, buf, &bufLen); + RegCloseKey( hSecKey ); + } + RegCloseKey( hKey ); + } + if (lRet == ERROR_SUCCESS) return TRUE; + /* default to system.ini if we can't find it in the registry, + * to support native installations where system.ini is still used */ + return GetPrivateProfileStringA(sectName, keyName, "", buf, sz, "SYSTEM.INI"); +} + +/********************************************************************** **** + * DRIVER_TryOpenDriver32 [internal] + * + * Tries to load a 32 bit driver whose DLL's (module) name is fn + */ +LPWINE_DRIVER DRIVER_TryOpenDriver32(LPCSTR fn, LPARAM lParam2) +{ + LPWINE_DRIVER lpDrv = NULL; + HMODULE hModule = 0; + LPSTR ptr; + LPCSTR cause = 0; + + TRACE("(%s, %08lX);\n", debugstr_a(fn), lParam2); + + if ((ptr = strchr(fn, ' ')) != NULL) { + *ptr++ = '\0'; + while (*ptr == ' ') ptr++; + if (*ptr == '\0') ptr = NULL; + } + + lpDrv = HeapAlloc(GetProcessHeap(), 0, sizeof(WINE_DRIVER)); + if (lpDrv == NULL) {cause = "OOM"; goto exit;} + + if ((hModule = LoadLibraryA(fn)) == 0) {cause = "Not a 32 bit lib"; goto exit;} + + lpDrv->d.d32.lpDrvProc = (DRIVERPROC)GetProcAddress(hModule, "DriverProc"); + if (lpDrv->d.d32.lpDrvProc == NULL) {cause = "no DriverProc"; goto exit;} + + lpDrv->dwFlags = 0; + lpDrv->d.d32.hModule = hModule; + lpDrv->d.d32.dwDriverID = 0; + + /* Win32 installable drivers must support a two phase opening scheme: + * + first open with NULL as lParam2 (session instance), + * + then do a second open with the real non null lParam2) + */ + if (DRIVER_GetNumberOfModuleRefs(lpDrv->d.d32.hModule, NULL) == 0 && lParam2) + { + LPWINE_DRIVER ret; + + if (!DRIVER_AddToList(lpDrv, (LPARAM)ptr, 0L)) + { + cause = "load0 failed"; + goto exit; + } + ret = DRIVER_TryOpenDriver32(fn, lParam2); + if (!ret) + { + CloseDriver((HDRVR)lpDrv, 0L, 0L); + cause = "load1 failed"; + goto exit; + } + return ret; + } + + if (!DRIVER_AddToList(lpDrv, (LPARAM)ptr, lParam2)) + {cause = "load failed"; goto exit;} + + TRACE("=> %p\n", lpDrv); + return lpDrv; + exit: + FreeLibrary(hModule); + HeapFree(GetProcessHeap(), 0, lpDrv); + TRACE("Unable to load 32 bit module %s: %s\n", debugstr_a(fn), cause); + return NULL; +} + +/********************************************************************** **** + * OpenDriverA [WINMM.@] + * DrvOpenA [WINMM.@] + * (0,1,DRV_LOAD ,0 ,0) + * (0,1,DRV_ENABLE,0 ,0) + * (0,1,DRV_OPEN ,buf[256],0) + */ +HDRVR WINAPI OpenDriverA(LPCSTR lpDriverName, LPCSTR lpSectionName, LPARAM lParam2) +{ + LPWINE_DRIVER lpDrv = NULL; + char libName[128]; + LPCSTR lsn = lpSectionName; + + TRACE("(%s, %s, 0x%08lx);\n", debugstr_a(lpDriverName), debugstr_a(lpSectionName), lParam2); + + if (lsn == NULL) { + lstrcpynA(libName, lpDriverName, sizeof(libName)); + + if ((lpDrv = DRIVER_TryOpenDriver32(libName, lParam2))) + goto the_end; + lsn = "Drivers32"; + } + if (DRIVER_GetLibName(lpDriverName, lsn, libName, sizeof(libName)) && + (lpDrv = DRIVER_TryOpenDriver32(libName, lParam2))) + goto the_end; + + /* now we will try a 16 bit driver (and add all the glue to make it work... which + * is located in our mmsystem implementation) + * so ensure, we can load our mmsystem, otherwise just fail + */ + WINMM_CheckForMMSystem(); + if (pFnOpenDriver16 && + (lpDrv = pFnOpenDriver16(lpDriverName, lpSectionName, lParam2))) + { + if (DRIVER_AddToList(lpDrv, 0, lParam2)) goto the_end; + HeapFree(GetProcessHeap(), 0, lpDrv); + } + TRACE("Failed to open driver %s from system.ini file, section %s\n", debugstr_a(lpDriverName), debugstr_a(lpSectionName)); + return 0; + + the_end: + if (lpDrv) TRACE("=> %08lx\n", (DWORD)lpDrv); + return (HDRVR)lpDrv; +} + +/********************************************************************** **** + * OpenDriver [WINMM.@] + * DrvOpen [WINMM.@] + */ +HDRVR WINAPI OpenDriverW(LPCWSTR lpDriverName, LPCWSTR lpSectionName, LPARAM lParam) +{ + INT len; + LPSTR dn = NULL; + LPSTR sn = NULL; + HDRVR ret; + + if (lpDriverName) + { + len = WideCharToMultiByte( CP_ACP, 0, lpDriverName, -1, NULL, 0, NULL, NULL ); + dn = HeapAlloc( GetProcessHeap(), 0, len ); + if (!dn) return 0; + WideCharToMultiByte( CP_ACP, 0, lpDriverName, -1, dn, len, NULL, NULL ); + } + + if (lpSectionName) + { + len = WideCharToMultiByte( CP_ACP, 0, lpSectionName, -1, NULL, 0, NULL, NULL ); + sn = HeapAlloc( GetProcessHeap(), 0, len ); + if (!sn) return 0; + WideCharToMultiByte( CP_ACP, 0, lpSectionName, -1, sn, len, NULL, NULL ); + } + + ret = OpenDriverA(dn, sn, lParam); + + if (dn) HeapFree(GetProcessHeap(), 0, dn); + if (sn) HeapFree(GetProcessHeap(), 0, sn); + return ret; +} + +/********************************************************************** **** + * CloseDriver [WINMM.@] + * DrvClose [WINMM.@] + */ +LRESULT WINAPI CloseDriver(HDRVR hDrvr, LPARAM lParam1, LPARAM lParam2) +{ + LPWINE_DRIVER lpDrv; + + TRACE("(%p, %08lX, %08lX);\n", hDrvr, lParam1, lParam2); + + if ((lpDrv = DRIVER_FindFromHDrvr(hDrvr)) != NULL) + { + if (lpDrv->dwFlags & WINE_GDF_16BIT) + { + if (pFnCloseDriver16) + pFnCloseDriver16(lpDrv->d.d16.hDriver16, lParam1, lParam2); + } + else + { + DRIVER_SendMessage(lpDrv, DRV_CLOSE, lParam1, lParam2); + lpDrv->d.d32.dwDriverID = 0; + } + if (DRIVER_RemoveFromList(lpDrv)) { + if (!(lpDrv->dwFlags & WINE_GDF_16BIT)) + { + LPWINE_DRIVER lpDrv0; + + /* if driver has an opened session instance, we have to close it too */ + if (DRIVER_GetNumberOfModuleRefs(lpDrv->d.d32.hModule, &lpDrv0) == 1) + { + DRIVER_SendMessage(lpDrv0, DRV_CLOSE, 0L, 0L); + lpDrv0->d.d32.dwDriverID = 0; + DRIVER_RemoveFromList(lpDrv0); + FreeLibrary(lpDrv0->d.d32.hModule); + HeapFree(GetProcessHeap(), 0, lpDrv0); + } + FreeLibrary(lpDrv->d.d32.hModule); + } + HeapFree(GetProcessHeap(), 0, lpDrv); + return TRUE; + } + } + WARN("Failed to close driver\n"); + return FALSE; +} + +/********************************************************************** **** + * GetDriverFlags [WINMM.@] + * [in] hDrvr handle to the driver + * + * Returns: + * 0x00000000 if hDrvr is an invalid handle + * 0x80000000 if hDrvr is a valid 32 bit driver + * 0x90000000 if hDrvr is a valid 16 bit driver + * + * native WINMM doesn't return those flags + * 0x80000000 for a valid 32 bit driver and that's it + * (I may have mixed up the two flags :-( + */ +DWORD WINAPI GetDriverFlags(HDRVR hDrvr) +{ + LPWINE_DRIVER lpDrv; + DWORD ret = 0; + + TRACE("(%p)\n", hDrvr); + + if ((lpDrv = DRIVER_FindFromHDrvr(hDrvr)) != NULL) { + ret = WINE_GDF_EXIST | lpDrv->dwFlags; + } + return ret; +} + +/********************************************************************** **** + * GetDriverModuleHandle [WINMM.@] + * DrvGetModuleHandle [WINMM.@] + */ +HMODULE WINAPI GetDriverModuleHandle(HDRVR hDrvr) +{ + LPWINE_DRIVER lpDrv; + HMODULE hModule = 0; + + TRACE("(%p);\n", hDrvr); + + if ((lpDrv = DRIVER_FindFromHDrvr(hDrvr)) != NULL) { + if (!(lpDrv->dwFlags & WINE_GDF_16BIT)) + hModule = lpDrv->d.d32.hModule; + } + TRACE("=> %p\n", hModule); + return hModule; +} + +/********************************************************************** **** + * DefDriverProc [WINMM.@] + * DrvDefDriverProc [WINMM.@] + */ +LRESULT WINAPI DefDriverProc(DWORD_PTR dwDriverIdentifier, HDRVR hDrv, + UINT Msg, LPARAM lParam1, LPARAM lParam2) +{ + switch (Msg) { + case DRV_LOAD: + case DRV_FREE: + case DRV_ENABLE: + case DRV_DISABLE: + return 1; + case DRV_INSTALL: + case DRV_REMOVE: + return DRV_SUCCESS; + default: + return 0; + } +} + +/********************************************************************** **** + * DriverCallback [WINMM.@] + */ +BOOL WINAPI DriverCallback(DWORD dwCallBack, UINT uFlags, HDRVR hDev, + UINT wMsg, DWORD dwUser, DWORD dwParam1, + DWORD dwParam2) +{ + TRACE("(%08lX, %04X, %p, %04X, %08lX, %08lX, %08lX); !\n", + dwCallBack, uFlags, hDev, wMsg, dwUser, dwParam1, dwParam2); + + switch (uFlags & DCB_TYPEMASK) { + case DCB_NULL: + TRACE("Null !\n"); + if (dwCallBack) + WARN("uFlags=%04X has null DCB value, but dwCallBack=%08lX is not null !\n", uFlags, dwCallBack); + break; + case DCB_WINDOW: + TRACE("Window(%04lX) handle=%p!\n", dwCallBack, hDev); + PostMessageA((HWND)dwCallBack, wMsg, (WPARAM)hDev, dwParam1); + break; + case DCB_TASK: /* aka DCB_THREAD */ + TRACE("Task(%04lx) !\n", dwCallBack); + PostThreadMessageA(dwCallBack, wMsg, (WPARAM)hDev, dwParam1); + break; + case DCB_FUNCTION: + TRACE("Function (32 bit) !\n"); + ((LPDRVCALLBACK)dwCallBack)(hDev, wMsg, dwUser, dwParam1, dwParam2); + break; + case DCB_EVENT: + TRACE("Event(%08lx) !\n", dwCallBack); + SetEvent((HANDLE)dwCallBack); + break; + case 6: /* I would dub it DCB_MMTHREADSIGNAL */ + /* this is an undocumented DCB_ value used for mmThreads + * loword of dwCallBack contains the handle of the lpMMThd block + * which dwSignalCount has to be incremented + */ + if (pFnGetMMThread16) + { + WINE_MMTHREAD* lpMMThd = pFnGetMMThread16(LOWORD(dwCallBack)); + + TRACE("mmThread (%04x, %p) !\n", LOWORD(dwCallBack), lpMMThd); + /* same as mmThreadSignal16 */ + InterlockedIncrement(&lpMMThd->dwSignalCount); + SetEvent(lpMMThd->hEvent); + /* some other stuff on lpMMThd->hVxD */ + } + break; +#if 0 + case 4: + /* this is an undocumented DCB_ value for... I don't know */ + break; +#endif + default: + WARN("Unknown callback type %d\n", uFlags & DCB_TYPEMASK); + return FALSE; + } + TRACE("Done\n"); + return TRUE; +} + +/****************************************************************** + * DRIVER_UnloadAll + * + * + */ +void DRIVER_UnloadAll(void) +{ + LPWINE_DRIVER lpDrv; + LPWINE_DRIVER lpNextDrv = NULL; + unsigned count = 0; + + for (lpDrv = lpDrvItemList; lpDrv != NULL; lpDrv = lpNextDrv) + { + lpNextDrv = lpDrv->lpNextItem; + CloseDriver((HDRVR)lpDrv, 0, 0); + count++; + } + TRACE("Unloaded %u drivers\n", count); +} _____
Added: vendor/wine/dlls/winmm/current/joystick.c --- vendor/wine/dlls/winmm/current/joystick.c 2004-12-31 16:30:04 UTC (rev 12637) +++ vendor/wine/dlls/winmm/current/joystick.c 2004-12-31 16:34:31 UTC (rev 12638) @@ -0,0 +1,308 @@
+/* -*- tab-width: 8; c-basic-offset: 4 -*- */ +/* + * joystick functions + * + * Copyright 1997 Andreas Mohr + * 2000 Wolfgang Schwotzer + * Eric Pouech + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "config.h" + +#ifdef HAVE_UNISTD_H +# include <unistd.h> +#endif +#include <stdarg.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <fcntl.h> +#ifdef HAVE_SYS_IOCTL_H +#include <sys/ioctl.h> +#endif + +#include "windef.h" +#include "winbase.h" +#include "mmsystem.h" +#include "wingdi.h" +#include "winuser.h" +#include "winnls.h" + +#include "mmddk.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(winmm); + +#define MAXJOYSTICK (JOYSTICKID2 + 1) +#define JOY_PERIOD_MIN (10) /* min Capture time period */ +#define JOY_PERIOD_MAX (1000) /* max Capture time period */ + +typedef struct tagWINE_JOYSTICK { + JOYINFO ji; + HWND hCapture; + UINT wTimer; + DWORD threshold; + BOOL bChanged; + HDRVR hDriver; +} WINE_JOYSTICK; + +static WINE_JOYSTICK JOY_Sticks[MAXJOYSTICK]; + +/********************************************************************** **** + * JOY_LoadDriver [internal] + */ +static BOOL JOY_LoadDriver(DWORD dwJoyID) +{ + if (dwJoyID >= MAXJOYSTICK) + return FALSE; + if (JOY_Sticks[dwJoyID].hDriver) + return TRUE; + + JOY_Sticks[dwJoyID].hDriver = OpenDriverA("joystick.drv", 0, dwJoyID); + return (JOY_Sticks[dwJoyID].hDriver != 0); +} + +/********************************************************************** **** + * JOY_Timer [internal] + */ +static void CALLBACK JOY_Timer(HWND hWnd, UINT wMsg, UINT wTimer, DWORD dwTime) +{ + int i; + WINE_JOYSTICK* joy; + JOYINFO ji; + LONG pos; + unsigned buttonChange; + + for (i = 0; i < MAXJOYSTICK; i++) { + joy = &JOY_Sticks[i]; + + if (joy->hCapture != hWnd) continue; + + joyGetPos(i, &ji); + pos = MAKELONG(ji.wXpos, ji.wYpos); + + if (!joy->bChanged || + abs(joy->ji.wXpos - ji.wXpos) > joy->threshold || + abs(joy->ji.wYpos - ji.wYpos) > joy->threshold) { + SendMessageA(joy->hCapture, MM_JOY1MOVE + i, ji.wButtons, pos); + joy->ji.wXpos = ji.wXpos; + joy->ji.wYpos = ji.wYpos; + } + if (!joy->bChanged || + abs(joy->ji.wZpos - ji.wZpos) > joy->threshold) { + SendMessageA(joy->hCapture, MM_JOY1ZMOVE + i, ji.wButtons, pos); + joy->ji.wZpos = ji.wZpos; + } + if ((buttonChange = joy->ji.wButtons ^ ji.wButtons) != 0) { + if (ji.wButtons & buttonChange) + SendMessageA(joy->hCapture, MM_JOY1BUTTONDOWN + i, + (buttonChange << 8) | (ji.wButtons & buttonChange), pos); + if (joy->ji.wButtons & buttonChange) + SendMessageA(joy->hCapture, MM_JOY1BUTTONUP + i, + (buttonChange << 8) | (joy->ji.wButtons & buttonChange), pos); + joy->ji.wButtons = ji.wButtons; + } + } +} + +/********************************************************************** **** + * joyGetNumDevs [WINMM.@] + */ +UINT WINAPI joyGetNumDevs(void) +{ + UINT ret = 0; + int i; + + for (i = 0; i < MAXJOYSTICK; i++) { + if (JOY_LoadDriver(i)) { + ret += SendDriverMessage(JOY_Sticks[i].hDriver, JDD_GETNUMDEVS, 0L, 0L); + } + } + return ret; +} + +/********************************************************************** **** + * joyGetDevCapsA [WINMM.@] + */ +MMRESULT WINAPI joyGetDevCapsA(UINT_PTR wID, LPJOYCAPSA lpCaps, UINT wSize) +{ + if (wID >= MAXJOYSTICK) return JOYERR_PARMS; + if (!JOY_LoadDriver(wID)) return MMSYSERR_NODRIVER; + + lpCaps->wPeriodMin = JOY_PERIOD_MIN; /* FIXME */ + lpCaps->wPeriodMax = JOY_PERIOD_MAX; /* FIXME (same as MS Joystick Driver) */ + + return SendDriverMessage(JOY_Sticks[wID].hDriver, JDD_GETDEVCAPS, (DWORD)lpCaps, wSize); +} + +/********************************************************************** **** + * joyGetDevCapsW [WINMM.@] + */ +MMRESULT WINAPI joyGetDevCapsW(UINT_PTR wID, LPJOYCAPSW lpCaps, UINT wSize) +{ + JOYCAPSA jca; + MMRESULT ret = joyGetDevCapsA(wID, &jca, sizeof(jca)); + + if (ret != JOYERR_NOERROR) return ret; + lpCaps->wMid = jca.wMid; + lpCaps->wPid = jca.wPid; + MultiByteToWideChar( CP_ACP, 0, jca.szPname, -1, lpCaps->szPname, + sizeof(lpCaps->szPname)/sizeof(WCHAR) ); + lpCaps->wXmin = jca.wXmin; + lpCaps->wXmax = jca.wXmax; + lpCaps->wYmin = jca.wYmin; + lpCaps->wYmax = jca.wYmax; + lpCaps->wZmin = jca.wZmin; + lpCaps->wZmax = jca.wZmax; + lpCaps->wNumButtons = jca.wNumButtons; + lpCaps->wPeriodMin = jca.wPeriodMin; + lpCaps->wPeriodMax = jca.wPeriodMax; + + if (wSize >= sizeof(JOYCAPSW)) { /* Win95 extensions ? */ + lpCaps->wRmin = jca.wRmin; + lpCaps->wRmax = jca.wRmax; + lpCaps->wUmin = jca.wUmin; + lpCaps->wUmax = jca.wUmax; + lpCaps->wVmin = jca.wVmin; + lpCaps->wVmax = jca.wVmax; + lpCaps->wCaps = jca.wCaps; + lpCaps->wMaxAxes = jca.wMaxAxes; + lpCaps->wNumAxes = jca.wNumAxes; + lpCaps->wMaxButtons = jca.wMaxButtons; + MultiByteToWideChar( CP_ACP, 0, jca.szRegKey, -1, lpCaps->szRegKey, + sizeof(lpCaps->szRegKey)/sizeof(WCHAR) ); + MultiByteToWideChar( CP_ACP, 0, jca.szOEMVxD, -1, lpCaps->szOEMVxD, + sizeof(lpCaps->szOEMVxD)/sizeof(WCHAR) ); + } + + return ret; +} + +/********************************************************************** **** + * joyGetPosEx [WINMM.@] + */ +MMRESULT WINAPI joyGetPosEx(UINT wID, LPJOYINFOEX lpInfo) +{ + TRACE("(%d, %p);\n", wID, lpInfo); + + if (wID >= MAXJOYSTICK) return JOYERR_PARMS; + if (!JOY_LoadDriver(wID)) return MMSYSERR_NODRIVER; + + lpInfo->dwXpos = 0; + lpInfo->dwYpos = 0; + lpInfo->dwZpos = 0; + lpInfo->dwRpos = 0; + lpInfo->dwUpos = 0; + lpInfo->dwVpos = 0; + lpInfo->dwButtons = 0; + lpInfo->dwButtonNumber = 0; + lpInfo->dwPOV = 0; + lpInfo->dwReserved1 = 0; + lpInfo->dwReserved2 = 0; + + return SendDriverMessage(JOY_Sticks[wID].hDriver, JDD_GETPOSEX, (DWORD)lpInfo, 0L); +} + +/********************************************************************** **** + * joyGetPos [WINMM.@] + */ +MMRESULT WINAPI joyGetPos(UINT wID, LPJOYINFO lpInfo) +{ + TRACE("(%d, %p);\n", wID, lpInfo); + + if (wID >= MAXJOYSTICK) return JOYERR_PARMS; + if (!JOY_LoadDriver(wID)) return MMSYSERR_NODRIVER; + + lpInfo->wXpos = 0; + lpInfo->wYpos = 0; + lpInfo->wZpos = 0; + lpInfo->wButtons = 0; + + return SendDriverMessage(JOY_Sticks[wID].hDriver, JDD_GETPOS, (DWORD)lpInfo, 0L); +} + +/********************************************************************** **** + * joyGetThreshold [WINMM.@] + */ +MMRESULT WINAPI joyGetThreshold(UINT wID, LPUINT lpThreshold) +{ + TRACE("(%04X, %p);\n", wID, lpThreshold); + + if (wID >= MAXJOYSTICK) return JOYERR_PARMS; + + *lpThreshold = JOY_Sticks[wID].threshold; + return JOYERR_NOERROR; +} + +/********************************************************************** **** + * joyReleaseCapture [WINMM.@] + */ +MMRESULT WINAPI joyReleaseCapture(UINT wID) +{ + TRACE("(%04X);\n", wID); + + if (wID >= MAXJOYSTICK) return JOYERR_PARMS; + if (!JOY_LoadDriver(wID)) return MMSYSERR_NODRIVER; + if (!JOY_Sticks[wID].hCapture) return JOYERR_NOCANDO; + + KillTimer(JOY_Sticks[wID].hCapture, JOY_Sticks[wID].wTimer); + JOY_Sticks[wID].hCapture = 0; + JOY_Sticks[wID].wTimer = 0; + + return JOYERR_NOERROR; +} + +/********************************************************************** **** + * joySetCapture [WINMM.@] + */ +MMRESULT WINAPI joySetCapture(HWND hWnd, UINT wID, UINT wPeriod, BOOL bChanged) +{ + TRACE("(%p, %04X, %d, %d);\n", hWnd, wID, wPeriod, bChanged); + + if (wID >= MAXJOYSTICK || hWnd == 0) return JOYERR_PARMS; + if (wPeriod<JOY_PERIOD_MIN || wPeriod>JOY_PERIOD_MAX) return JOYERR_PARMS; + if (!JOY_LoadDriver(wID)) return MMSYSERR_NODRIVER; + + if (JOY_Sticks[wID].hCapture || !IsWindow(hWnd)) + return JOYERR_NOCANDO; /* FIXME: what should be returned ? */ + + if (joyGetPos(wID, &JOY_Sticks[wID].ji) != JOYERR_NOERROR) + return JOYERR_UNPLUGGED; + + if ((JOY_Sticks[wID].wTimer = SetTimer(hWnd, 0, wPeriod, JOY_Timer)) == 0) + return JOYERR_NOCANDO; + + JOY_Sticks[wID].hCapture = hWnd; + JOY_Sticks[wID].bChanged = bChanged; + + return JOYERR_NOERROR; +} + +/********************************************************************** **** + * joySetThreshold [WINMM.@] + */ +MMRESULT WINAPI joySetThreshold(UINT wID, UINT wThreshold) +{ + TRACE("(%04X, %d);\n", wID, wThreshold); + + if (wID >= MAXJOYSTICK) return MMSYSERR_INVALPARAM; + + JOY_Sticks[wID].threshold = wThreshold; + + return JOYERR_NOERROR; +} _____
Added: vendor/wine/dlls/winmm/current/lolvldrv.c --- vendor/wine/dlls/winmm/current/lolvldrv.c 2004-12-31 16:30:04 UTC (rev 12637) +++ vendor/wine/dlls/winmm/current/lolvldrv.c 2004-12-31 16:34:31 UTC (rev 12638) @@ -0,0 +1,850 @@
+/* -*- tab-width: 8; c-basic-offset: 4 -*- */ + +/* + * MMSYTEM low level drivers handling functions + * + * Copyright 1999 Eric Pouech + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include <string.h> +#include <stdarg.h> +#include <stdio.h> +#include <assert.h> +#include "windef.h" +#include "winbase.h" +#include "winreg.h" +#include "winver.h" +#include "winemm.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(winmm); + +LRESULT (*pFnCallMMDrvFunc16)(DWORD,WORD,WORD,LONG,LONG,LONG) /* = NULL */; +unsigned (*pFnLoadMMDrvFunc16)(LPCSTR,LPWINE_DRIVER, LPWINE_MM_DRIVER) /* = NULL */; + +/* each known type of driver has an instance of this structure */ +typedef struct tagWINE_LLTYPE { + /* those attributes depend on the specification of the type */ + LPCSTR typestr; /* name (for debugging) */ + BOOL bSupportMapper; /* if type is allowed to support mapper */ + MMDRV_MAPFUNC Map16To32A; /* those are function pointers to handle */ + MMDRV_UNMAPFUNC UnMap16To32A; /* the parameter conversion (16 vs 32 bit) */ + MMDRV_MAPFUNC Map32ATo16; /* when hi-func (in mmsystem or winmm) and */ + MMDRV_UNMAPFUNC UnMap32ATo16; /* low-func (in .drv) do not match */ + LPDRVCALLBACK Callback; /* handles callback for a specified type */ + /* those attributes reflect the loaded/current situation for the type */ + UINT wMaxId; /* number of loaded devices (sum across all loaded drivers */ + LPWINE_MLD lpMlds; /* "static" mlds to access the part though device IDs */ + int nMapper; /* index to mapper */ +} WINE_LLTYPE; + +static int MMDrvsHi /* = 0 */; +static WINE_MM_DRIVER MMDrvs[8]; +static LPWINE_MLD MM_MLDrvs[40]; +#define MAX_MM_MLDRVS (sizeof(MM_MLDrvs) / sizeof(MM_MLDrvs[0])) + +#define A(_x,_y) {#_y, _x, NULL, NULL, NULL, NULL, NULL, 0, NULL, -1} +/* Note: the indices of this array must match the definitions + * of the MMDRV_???? manifest constants + */ +static WINE_LLTYPE llTypes[MMDRV_MAX] = { + A(TRUE, Aux), + A(FALSE, Mixer), + A(TRUE, MidiIn), + A(TRUE, MidiOut), + A(TRUE, WaveIn), + A(TRUE, WaveOut), +}; [truncated at 1000 lines; 19399 more skipped]