/* -*- tab-width: 8; c-basic-offset: 4 -*- */
/*
- * MMSYTEM low level drivers handling functions
+ * MMSYSTEM low level drivers handling functions
*
* Copyright 1999 Eric Pouech
*
*
* 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "config.h"
+#include "wine/port.h"
+
#include <string.h>
#include <stdarg.h>
#include <stdio.h>
#include "windef.h"
#include "winbase.h"
#include "winreg.h"
-#include "winver.h"
#include "winemm.h"
#include "wine/debug.h"
+#include "wine/exception.h"
WINE_DEFAULT_DEBUG_CHANNEL(winmm);
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 */
+ 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;
return MMDrvs[idx].bIs32;
}
-/**************************************************************************
- * MMDRV_GetDescription32 [internal]
- */
-static BOOL MMDRV_GetDescription32(const char* fname, char* buf, int buflen)
-{
- OFSTRUCT ofs;
- DWORD h;
- LPVOID ptr = 0;
- LPVOID val;
- DWORD dw;
- BOOL ret = FALSE;
- UINT u;
- FARPROC pGetFileVersionInfoSizeA;
- FARPROC pGetFileVersionInfoA;
- FARPROC pVerQueryValueA;
- HMODULE hmodule = 0;
- TRACE("(%p, %p, %d)\n", fname, buf, buflen);
-
-#define E(_x) do {TRACE _x;goto theEnd;} while(0)
-
- if (OpenFile(fname, &ofs, OF_EXIST)==HFILE_ERROR) E(("Can't find file %s\n", fname));
-
- if (!(hmodule = LoadLibraryA( "version.dll" ))) goto theEnd;
- if (!(pGetFileVersionInfoSizeA = GetProcAddress( hmodule, "GetFileVersionInfoSizeA" )))
- goto theEnd;
- if (!(pGetFileVersionInfoA = GetProcAddress( hmodule, "GetFileVersionInfoA" )))
- goto theEnd;
- if (!(pVerQueryValueA = GetProcAddress( hmodule, "VerQueryValueA" )))
- goto theEnd;
-
- if (!(dw = pGetFileVersionInfoSizeA(ofs.szPathName, &h))) E(("Can't get FVIS\n"));
- if (!(ptr = HeapAlloc(GetProcessHeap(), 0, dw))) E(("OOM\n"));
- if (!pGetFileVersionInfoA(ofs.szPathName, h, dw, ptr)) E(("Can't get FVI\n"));
-
-#define A(_x) if (pVerQueryValueA(ptr, "\\StringFileInfo\\040904B0\\" #_x, &val, &u)) \
- TRACE(#_x " => %s\n", (LPSTR)val); else TRACE(#_x " @\n")
-
- A(CompanyName);
- A(FileDescription);
- A(FileVersion);
- A(InternalName);
- A(LegalCopyright);
- A(OriginalFilename);
- A(ProductName);
- A(ProductVersion);
- A(Comments);
- A(LegalTrademarks);
- A(PrivateBuild);
- A(SpecialBuild);
-#undef A
-
- if (!pVerQueryValueA(ptr, "\\StringFileInfo\\040904B0\\ProductName", &val, &u)) E(("Can't get product name\n"));
- lstrcpynA(buf, val, buflen);
-
-#undef E
- ret = TRUE;
-theEnd:
- HeapFree(GetProcessHeap(), 0, ptr);
- if (hmodule) FreeLibrary( hmodule );
- return ret;
-}
-
/**************************************************************************
* MMDRV_GetNum [internal]
*/
WINMM_MapType map;
int devID;
- TRACE("(%s %u %u 0x%08lx 0x%08lx 0x%08lx %c)\n",
+ TRACE("(%s %u %u 0x%08x 0x%08lx 0x%08lx %c)\n",
llTypes[mld->type].typestr, mld->uDeviceID, wMsg,
mld->dwDriverInstance, dwParam1, dwParam2, bFrom32?'Y':'N');
assert(part->u.fnMessage32);
if (bFrom32) {
- TRACE("Calling message(dev=%u msg=%u usr=0x%08lx p1=0x%08lx p2=0x%08lx)\n",
+ TRACE("Calling message(dev=%u msg=%u usr=0x%08x p1=0x%08lx p2=0x%08lx)\n",
mld->uDeviceID, wMsg, mld->dwDriverInstance, dwParam1, dwParam2);
ret = part->u.fnMessage32(mld->uDeviceID, wMsg, mld->dwDriverInstance, dwParam1, dwParam2);
TRACE("=> %s\n", WINMM_ErrorToString(ret));
break;
case WINMM_MAP_OK:
case WINMM_MAP_OKMEM:
- TRACE("Calling message(dev=%u msg=%u usr=0x%08lx p1=0x%08lx p2=0x%08lx)\n",
+ TRACE("Calling message(dev=%u msg=%u usr=0x%08x p1=0x%08lx p2=0x%08lx)\n",
mld->uDeviceID, wMsg, mld->dwDriverInstance, dwParam1, dwParam2);
ret = part->u.fnMessage32(mld->uDeviceID, wMsg, mld->dwDriverInstance,
dwParam1, dwParam2);
break;
case WINMM_MAP_OK:
case WINMM_MAP_OKMEM:
- TRACE("Calling message(dev=%u msg=%u usr=0x%08lx p1=0x%08lx p2=0x%08lx)\n",
+ TRACE("Calling message(dev=%u msg=%u usr=0x%08x p1=0x%08lx p2=0x%08lx)\n",
mld->uDeviceID, wMsg, mld->dwDriverInstance, dwParam1, dwParam2);
ret = pFnCallMMDrvFunc16((DWORD)part->u.fnMessage16,
mld->uDeviceID, wMsg, mld->dwDriverInstance,
break;
}
} else {
- TRACE("Calling message(dev=%u msg=%u usr=0x%08lx p1=0x%08lx p2=0x%08lx)\n",
+ TRACE("Calling message(dev=%u msg=%u usr=0x%08x p1=0x%08lx p2=0x%08lx)\n",
mld->uDeviceID, wMsg, mld->dwDriverInstance, dwParam1, dwParam2);
ret = pFnCallMMDrvFunc16((DWORD)part->u.fnMessage16,
mld->uDeviceID, wMsg, mld->dwDriverInstance,
* MMDRV_Alloc [internal]
*/
LPWINE_MLD MMDRV_Alloc(UINT size, UINT type, LPHANDLE hndl, DWORD* dwFlags,
- DWORD* dwCallback, DWORD* dwInstance, BOOL bFrom32)
+ DWORD_PTR* dwCallback, DWORD_PTR* dwInstance, BOOL bFrom32)
{
LPWINE_MLD mld;
UINT i;
if (llTypes[type].Callback)
{
*dwFlags = LOWORD(*dwFlags) | CALLBACK_FUNCTION;
- *dwCallback = (DWORD)llTypes[type].Callback;
- *dwInstance = (DWORD)mld; /* FIXME: wouldn't some 16 bit drivers only use the loword ? */
+ *dwCallback = (DWORD_PTR)llTypes[type].Callback;
+ *dwInstance = (DWORD_PTR)mld; /* FIXME: wouldn't some 16 bit drivers only use the loword ? */
}
return mld;
DWORD dwRet = MMSYSERR_BADDEVICEID;
DWORD dwInstance;
WINE_LLTYPE* llType = &llTypes[mld->type];
- TRACE("(%p, %04x, 0x%08lx, 0x%08lx)\n", mld, wMsg, dwParam1, dwFlags);
+ TRACE("(%p, %04x, 0x%08x, 0x%08x)\n", mld, wMsg, dwParam1, dwFlags);
mld->dwDriverInstance = (DWORD)&dwInstance;
/**************************************************************************
* MMDRV_GetByID [internal]
*/
-LPWINE_MLD MMDRV_GetByID(UINT uDevID, UINT type)
+static LPWINE_MLD MMDRV_GetByID(UINT uDevID, UINT type)
{
TRACE("(%04x, %04x)\n", uDevID, type);
if (uDevID < llTypes[type].wMaxId)
if (hndl >= llTypes[type].wMaxId &&
hndl != (UINT16)-1 && hndl != (UINT)-1) {
if (hndl & 0x8000) {
- hndl = hndl & ~0x8000;
- if (hndl < sizeof(MM_MLDrvs) / sizeof(MM_MLDrvs[0])) {
- mld = MM_MLDrvs[hndl];
- if (!mld || !HeapValidate(GetProcessHeap(), 0, mld) || mld->type != type)
- mld = NULL;
+ UINT idx = hndl & ~0x8000;
+ if (idx < sizeof(MM_MLDrvs) / sizeof(MM_MLDrvs[0])) {
+ __TRY
+ {
+ mld = MM_MLDrvs[idx];
+ if (mld && mld->type != type) mld = NULL;
+ }
+ __EXCEPT_PAGE_FAULT
+ {
+ mld = NULL;
+ }
+ __ENDTRY;
}
- hndl = hndl | 0x8000;
}
}
if (mld == NULL && bCanBeID) {
/**************************************************************************
* MMDRV_PhysicalFeatures [internal]
*/
-UINT MMDRV_PhysicalFeatures(LPWINE_MLD mld, UINT uMsg, DWORD dwParam1,
- DWORD dwParam2)
+UINT MMDRV_PhysicalFeatures(LPWINE_MLD mld, UINT uMsg,
+ DWORD_PTR dwParam1, DWORD_PTR dwParam2)
{
WINE_MM_DRIVER* lpDrv = &MMDrvs[mld->mmdIndex];
if (lpDrv->bIs32) {
WINEMM_msgFunc32 func;
- char buffer[128];
if (d->d.d32.hModule) {
#define A(_x,_y) AA(d->d.d32.hModule,_x,_y,32,GetProcAddress)
A(MMDRV_WAVEOUT, wodMessage);
#undef A
}
- if (TRACE_ON(winmm)) {
- if (MMDRV_GetDescription32(drvFileName, buffer, sizeof(buffer)))
- TRACE("%s => %s\n", drvFileName, buffer);
- else
- TRACE("%s => No description\n", drvFileName);
- }
} else if (WINMM_CheckForMMSystem() && pFnLoadMMDrvFunc16) {
count += pFnLoadMMDrvFunc16(drvFileName, d, lpDrv);
}
char driver_buffer[256];
char mapper_buffer[256];
char midi_buffer[256];
- char* p1;
- char* p2;
+ char* p;
DWORD type, size;
BOOL ret = FALSE;
TRACE("()\n");
strcpy(mapper_buffer, WINE_DEFAULT_WINMM_MAPPER);
strcpy(midi_buffer, WINE_DEFAULT_WINMM_MIDI);
- /* @@ Wine registry key: HKLM\Software\Wine\Wine\Config\WinMM */
- if (! RegCreateKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine\\Wine\\Config\\WinMM", &hKey)) {
+ /* @@ Wine registry key: HKCU\Software\Wine\Drivers */
+ if (!RegOpenKeyA(HKEY_CURRENT_USER, "Software\\Wine\\Drivers", &hKey))
+ {
size = sizeof(driver_buffer);
- if (RegQueryValueExA(hKey, "Drivers", 0, &type, (LPVOID)driver_buffer, &size))
+ if (RegQueryValueExA(hKey, "Audio", 0, &type, (LPVOID)driver_buffer, &size))
strcpy(driver_buffer, WINE_DEFAULT_WINMM_DRIVER);
-
- /* finish with mappers */
- size = sizeof(mapper_buffer);
- if (RegQueryValueExA(hKey, "WaveMapper", 0, &type, (LPVOID)mapper_buffer, &size))
- strcpy(mapper_buffer, WINE_DEFAULT_WINMM_MAPPER);
-
- size = sizeof(midi_buffer);
- if (RegQueryValueExA(hKey, "MidiMapper", 0, &type, (LPVOID)midi_buffer, &size))
- strcpy(midi_buffer, WINE_DEFAULT_WINMM_MIDI);
-
- RegCloseKey(hKey);
}
- p1 = driver_buffer;
- while (p1) {
- p2 = strchr(p1, ';');
- if (p2) *p2++ = '\0';
- ret |= MMDRV_Install(p1, p1, FALSE);
- p1 = p2;
+ p = driver_buffer;
+ while (p)
+ {
+ char filename[sizeof(driver_buffer)+10];
+ char *next = strchr(p, ',');
+ if (next) *next++ = 0;
+ sprintf( filename, "wine%s.drv", p );
+ if ((ret = MMDRV_Install( filename, filename, FALSE ))) break;
+ p = next;
}
- ret |= MMDRV_Install("wavemapper", mapper_buffer, TRUE);
- ret |= MMDRV_Install("midimapper", midi_buffer, TRUE);
+ ret |= MMDRV_Install("wavemapper", WINE_DEFAULT_WINMM_MAPPER, TRUE);
+ ret |= MMDRV_Install("midimapper", WINE_DEFAULT_WINMM_MIDI, TRUE);
return ret;
}
*/
void MMDRV_Exit(void)
{
- int i;
+ unsigned int i;
TRACE("()\n");
for (i = 0; i < sizeof(MM_MLDrvs) / sizeof(MM_MLDrvs[0]); i++)
}
/* unload driver, in reverse order of loading */
- for (i = sizeof(MMDrvs) / sizeof(MMDrvs[0]) - 1; i >= 0; i--)
+ i = sizeof(MMDrvs) / sizeof(MMDrvs[0]);
+ while (i-- > 0)
{
MMDRV_ExitPerType(&MMDrvs[i], MMDRV_AUX);
MMDRV_ExitPerType(&MMDrvs[i], MMDRV_MIXER);
MMDRV_ExitPerType(&MMDrvs[i], MMDRV_WAVEOUT);
CloseDriver(MMDrvs[i].hDriver, 0, 0);
}
+ if (llTypes[MMDRV_AUX].lpMlds)
+ HeapFree(GetProcessHeap(), 0, llTypes[MMDRV_AUX].lpMlds - 1);
+ if (llTypes[MMDRV_MIXER].lpMlds)
+ HeapFree(GetProcessHeap(), 0, llTypes[MMDRV_MIXER].lpMlds - 1);
+ if (llTypes[MMDRV_MIDIIN].lpMlds)
+ HeapFree(GetProcessHeap(), 0, llTypes[MMDRV_MIDIIN].lpMlds - 1);
+ if (llTypes[MMDRV_MIDIOUT].lpMlds)
+ HeapFree(GetProcessHeap(), 0, llTypes[MMDRV_MIDIOUT].lpMlds - 1);
+ if (llTypes[MMDRV_WAVEIN].lpMlds)
+ HeapFree(GetProcessHeap(), 0, llTypes[MMDRV_WAVEIN].lpMlds - 1);
+ if (llTypes[MMDRV_WAVEOUT].lpMlds)
+ HeapFree(GetProcessHeap(), 0, llTypes[MMDRV_WAVEOUT].lpMlds - 1);
}