From 78b50f23e38f5ee17427949cf20c33b7b955238f Mon Sep 17 00:00:00 2001 From: Eric Pouech Date: Mon, 15 Sep 2003 20:13:30 +0000 Subject: [PATCH] - Moved Wine extension to get DSound interface from a wave device from include/mmsystem.h to include/mmddk.h. - Removed all dependencies on heap.h. - Fixed a few prototypes (mmioRename[AW], mciSendStringW, *Message). --- dlls/winmm/driver.c | 29 +++++++++++++++++++++---- dlls/winmm/mci.c | 11 +++++++++- dlls/winmm/mmio.c | 60 +++++++++++++++++++++++++++++++++++++++------------ dlls/winmm/mmsystem.c | 32 ++++++++++++++++++--------- dlls/winmm/winmm.c | 29 ++++++++++++++----------- dlls/winmm/winmm.spec | 6 +++--- include/mmddk.h | 4 ++++ include/mmsystem.h | 19 +++++++--------- 8 files changed, 135 insertions(+), 55 deletions(-) diff --git a/dlls/winmm/driver.c b/dlls/winmm/driver.c index 9b212ed629b..7e97c1aa27e 100644 --- a/dlls/winmm/driver.c +++ b/dlls/winmm/driver.c @@ -23,10 +23,12 @@ */ #include -#include "heap.h" +#include #include "windef.h" +#include "winbase.h" #include "wingdi.h" #include "winuser.h" +#include "winnls.h" #include "mmddk.h" #include "winemm.h" #include "wine/debug.h" @@ -326,9 +328,28 @@ HDRVR WINAPI OpenDriverA(LPCSTR lpDriverName, LPCSTR lpSectionName, LPARAM lPara */ HDRVR WINAPI OpenDriverW(LPCWSTR lpDriverName, LPCWSTR lpSectionName, LPARAM lParam) { - LPSTR dn = HEAP_strdupWtoA(GetProcessHeap(), 0, lpDriverName); - LPSTR sn = HEAP_strdupWtoA(GetProcessHeap(), 0, lpSectionName); - HDRVR ret = OpenDriverA(dn, sn, 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); diff --git a/dlls/winmm/mci.c b/dlls/winmm/mci.c index 9fb57a1c3ae..0aa8104e81b 100644 --- a/dlls/winmm/mci.c +++ b/dlls/winmm/mci.c @@ -1050,10 +1050,11 @@ errCleanUp: /************************************************************************** * mciSendStringW [WINMM.@] */ -DWORD WINAPI mciSendStringW(LPCWSTR lpwstrCommand, LPSTR lpstrRet, +DWORD WINAPI mciSendStringW(LPCWSTR lpwstrCommand, LPWSTR lpwstrRet, UINT uRetLen, HWND hwndCallback) { LPSTR lpstrCommand; + LPSTR lpstrRet = NULL; UINT ret; INT len; @@ -1061,8 +1062,16 @@ DWORD WINAPI mciSendStringW(LPCWSTR lpwstrCommand, LPSTR lpstrRet, len = WideCharToMultiByte( CP_ACP, 0, lpwstrCommand, -1, NULL, 0, NULL, NULL ); lpstrCommand = HeapAlloc( GetProcessHeap(), 0, len ); WideCharToMultiByte( CP_ACP, 0, lpwstrCommand, -1, lpstrCommand, len, NULL, NULL ); + if (lpwstrRet) + { + lpstrRet = HeapAlloc(GetProcessHeap(), 0, uRetLen * sizeof(WCHAR)); + if (!lpstrRet) return MMSYSERR_NOMEM; + } ret = mciSendStringA(lpstrCommand, lpstrRet, uRetLen, hwndCallback); + if (lpwstrRet) + MultiByteToWideChar( CP_ACP, 0, lpstrRet, -1, lpwstrRet, uRetLen ); HeapFree(GetProcessHeap(), 0, lpstrCommand); + if (lpstrRet) HeapFree(GetProcessHeap(), 0, lpstrRet); return ret; } diff --git a/dlls/winmm/mmio.c b/dlls/winmm/mmio.c index 9ab2125fb8b..b02a174c48d 100644 --- a/dlls/winmm/mmio.c +++ b/dlls/winmm/mmio.c @@ -38,8 +38,8 @@ #include "windef.h" #include "winbase.h" +#include "winnls.h" #include "mmsystem.h" -#include "heap.h" #include "winemm.h" #include "wine/debug.h" @@ -686,7 +686,15 @@ HMMIO WINAPI mmioOpenW(LPWSTR szFileName, MMIOINFO* lpmmioinfo, DWORD dwOpenFlags) { HMMIO ret; - LPSTR szFn = HEAP_strdupWtoA(GetProcessHeap(), 0, szFileName); + LPSTR szFn = NULL; + + if (szFileName) + { + INT len = WideCharToMultiByte( CP_ACP, 0, szFileName, -1, NULL, 0, NULL, NULL ); + szFn = HeapAlloc( GetProcessHeap(), 0, len ); + if (!szFn) return (HMMIO)NULL; + WideCharToMultiByte( CP_ACP, 0, szFileName, -1, szFn, len, NULL, NULL ); + } ret = MMIO_Open(szFn, lpmmioinfo, dwOpenFlags, MMIO_PROC_32W); @@ -1063,11 +1071,10 @@ FOURCC WINAPI mmioStringToFOURCCA(LPCSTR sz, UINT uFlags) */ FOURCC WINAPI mmioStringToFOURCCW(LPCWSTR sz, UINT uFlags) { - LPSTR szA = HEAP_strdupWtoA(GetProcessHeap(),0,sz); - FOURCC ret = mmioStringToFOURCCA(szA,uFlags); + char szA[4]; - HeapFree(GetProcessHeap(), 0, szA); - return ret; + WideCharToMultiByte( CP_ACP, 0, sz, 4, szA, sizeof(szA), NULL, NULL ); + return mmioStringToFOURCCA(szA,uFlags); } /************************************************************************** @@ -1299,20 +1306,24 @@ MMRESULT WINAPI mmioCreateChunk(HMMIO hmmio, MMCKINFO* lpck, UINT uFlags) * mmioRenameA [WINMM.@] */ MMRESULT WINAPI mmioRenameA(LPCSTR szFileName, LPCSTR szNewFileName, - MMIOINFO* lpmmioinfo, DWORD dwFlags) + const MMIOINFO* lpmmioinfo, DWORD dwFlags) { struct IOProcList* ioProc = NULL; struct IOProcList tmp; + FOURCC fcc; TRACE("('%s', '%s', %p, %08lX);\n", debugstr_a(szFileName), debugstr_a(szNewFileName), lpmmioinfo, dwFlags); /* If both params are NULL, then parse the file name */ if (lpmmioinfo && lpmmioinfo->fccIOProc == 0 && lpmmioinfo->pIOProc == NULL) - lpmmioinfo->fccIOProc = MMIO_ParseExtA(szFileName); + { + fcc = MMIO_ParseExtA(szFileName); + if (fcc) ioProc = MMIO_FindProcNode(fcc); + } /* Handle any unhandled/error case from above. Assume DOS file */ - if (!lpmmioinfo || (lpmmioinfo->fccIOProc == 0 && lpmmioinfo->pIOProc == NULL)) + if (!lpmmioinfo || (lpmmioinfo->fccIOProc == 0 && lpmmioinfo->pIOProc == NULL && ioProc == NULL)) ioProc = MMIO_FindProcNode(FOURCC_DOS); /* if just the four character code is present, look up IO proc */ else if (lpmmioinfo->pIOProc == NULL) @@ -1326,7 +1337,10 @@ MMRESULT WINAPI mmioRenameA(LPCSTR szFileName, LPCSTR szNewFileName, tmp.count = 1; } - return send_message(ioProc, lpmmioinfo, MMIOM_RENAME, + /* FIXME: should we actually pass lpmmioinfo down the drain ??? + * or make a copy of it because it's const ??? + */ + return send_message(ioProc, (LPMMIOINFO)lpmmioinfo, MMIOM_RENAME, (LPARAM)szFileName, (LPARAM)szNewFileName, MMIO_PROC_32A); } @@ -1334,11 +1348,29 @@ MMRESULT WINAPI mmioRenameA(LPCSTR szFileName, LPCSTR szNewFileName, * mmioRenameW [WINMM.@] */ MMRESULT WINAPI mmioRenameW(LPCWSTR szFileName, LPCWSTR szNewFileName, - MMIOINFO* lpmmioinfo, DWORD dwFlags) + const MMIOINFO* lpmmioinfo, DWORD dwFlags) { - LPSTR szFn = HEAP_strdupWtoA(GetProcessHeap(), 0, szFileName); - LPSTR sznFn = HEAP_strdupWtoA(GetProcessHeap(), 0, szNewFileName); - UINT ret = mmioRenameA(szFn, sznFn, lpmmioinfo, dwFlags); + LPSTR szFn = NULL; + LPSTR sznFn = NULL; + UINT ret; + INT len; + + if (szFileName) + { + len = WideCharToMultiByte( CP_ACP, 0, szFileName, -1, NULL, 0, NULL, NULL ); + szFn = HeapAlloc( GetProcessHeap(), 0, len ); + if (!szFn) return MMSYSERR_NOMEM; + WideCharToMultiByte( CP_ACP, 0, szFileName, -1, szFn, len, NULL, NULL ); + } + if (szNewFileName) + { + len = WideCharToMultiByte( CP_ACP, 0, szNewFileName, -1, NULL, 0, NULL, NULL ); + sznFn = HeapAlloc( GetProcessHeap(), 0, len ); + if (!sznFn) return MMSYSERR_NOMEM; + WideCharToMultiByte( CP_ACP, 0, szNewFileName, -1, sznFn, len, NULL, NULL ); + } + + ret = mmioRenameA(szFn, sznFn, lpmmioinfo, dwFlags); HeapFree(GetProcessHeap(),0,szFn); HeapFree(GetProcessHeap(),0,sznFn); diff --git a/dlls/winmm/mmsystem.c b/dlls/winmm/mmsystem.c index 0c5102bed72..53d9059c1a7 100644 --- a/dlls/winmm/mmsystem.c +++ b/dlls/winmm/mmsystem.c @@ -38,10 +38,10 @@ #include "ntstatus.h" #include "winternl.h" #include "wownt32.h" +#include "winnls.h" #include "wine/winuser16.h" #include "winemm.h" -#include "heap.h" #include "wine/debug.h" @@ -2237,20 +2237,32 @@ static WINMM_MapType DRIVER_MapMsg32To16(WORD wMsg, DWORD* lParam1, DWORD* lPara if (dci16) { LPSTR str1; - + INT len; dci16->dwDCISize = sizeof(DRVCONFIGINFO16); - if ((str1 = HEAP_strdupWtoA(GetProcessHeap(), 0, dci32->lpszDCISectionName)) != NULL) - { - dci16->lpszDCISectionName = MapLS( str1 ); + if (dci32->lpszDCISectionName) { + len = WideCharToMultiByte( CP_ACP, 0, dci32->lpszDCISectionName, -1, NULL, 0, NULL, NULL ); + str1 = HeapAlloc( GetProcessHeap(), 0, len ); + if (str1) { + WideCharToMultiByte( CP_ACP, 0, dci32->lpszDCISectionName, -1, str1, len, NULL, NULL ); + dci16->lpszDCISectionName = MapLS( str1 ); + } else { + return WINMM_MAP_NOMEM; + } } else { - return WINMM_MAP_NOMEM; + dci16->lpszDCISectionName = 0L; } - if ((str1 = HEAP_strdupWtoA(GetProcessHeap(), 0, dci32->lpszDCIAliasName)) != NULL) - { - dci16->lpszDCIAliasName = MapLS( str1 ); + if (dci32->lpszDCIAliasName) { + len = WideCharToMultiByte( CP_ACP, 0, dci32->lpszDCIAliasName, -1, NULL, 0, NULL, NULL ); + str1 = HeapAlloc( GetProcessHeap(), 0, len ); + if (str1) { + WideCharToMultiByte( CP_ACP, 0, dci32->lpszDCIAliasName, -1, str1, len, NULL, NULL ); + dci16->lpszDCIAliasName = MapLS( str1 ); + } else { + return WINMM_MAP_NOMEM; + } } else { - return WINMM_MAP_NOMEM; + dci16->lpszDCISectionName = 0L; } } else { return WINMM_MAP_NOMEM; diff --git a/dlls/winmm/winmm.c b/dlls/winmm/winmm.c index 3d514ddd6ef..1017509402f 100644 --- a/dlls/winmm/winmm.c +++ b/dlls/winmm/winmm.c @@ -37,8 +37,8 @@ #include "winbase.h" #include "mmsystem.h" #include "winuser.h" +#include "winnls.h" #include "winreg.h" -#include "heap.h" #include "winternl.h" #include "winemm.h" @@ -680,7 +680,7 @@ UINT WINAPI auxSetVolume(UINT uDeviceID, DWORD dwVolume) /************************************************************************** * auxOutMessage [WINMM.@] */ -DWORD WINAPI auxOutMessage(UINT uDeviceID, UINT uMessage, DWORD dw1, DWORD dw2) +UINT WINAPI auxOutMessage(UINT uDeviceID, UINT uMessage, DWORD dw1, DWORD dw2) { LPWINE_MLD wmld; @@ -810,10 +810,15 @@ UINT WINAPI mciGetDeviceIDA(LPCSTR lpstrName) */ UINT WINAPI mciGetDeviceIDW(LPCWSTR lpwstrName) { - LPSTR lpstrName; + LPSTR lpstrName = NULL; UINT ret; + INT len; - lpstrName = HEAP_strdupWtoA(GetProcessHeap(), 0, lpwstrName); + if (lpwstrName) { + len = WideCharToMultiByte( CP_ACP, 0, lpwstrName, -1, NULL, 0, NULL, NULL ); + lpstrName = HeapAlloc( GetProcessHeap(), 0, len ); + if (lpstrName) WideCharToMultiByte( CP_ACP, 0, lpwstrName, -1, lpstrName, len, NULL, NULL ); + } ret = MCI_GetDriverFromString(lpstrName); HeapFree(GetProcessHeap(), 0, lpstrName); return ret; @@ -1273,8 +1278,8 @@ UINT WINAPI midiOutGetID(HMIDIOUT hMidiOut, UINT* lpuDeviceID) /************************************************************************** * midiOutMessage [WINMM.@] */ -DWORD WINAPI midiOutMessage(HMIDIOUT hMidiOut, UINT uMessage, - DWORD dwParam1, DWORD dwParam2) +UINT WINAPI midiOutMessage(HMIDIOUT hMidiOut, UINT uMessage, + DWORD dwParam1, DWORD dwParam2) { LPWINE_MLD wmld; @@ -1545,8 +1550,8 @@ UINT WINAPI midiInGetID(HMIDIIN hMidiIn, UINT* lpuDeviceID) /************************************************************************** * midiInMessage [WINMM.@] */ -DWORD WINAPI midiInMessage(HMIDIIN hMidiIn, UINT uMessage, - DWORD dwParam1, DWORD dwParam2) +UINT WINAPI midiInMessage(HMIDIIN hMidiIn, UINT uMessage, + DWORD dwParam1, DWORD dwParam2) { LPWINE_MLD wmld; @@ -2590,8 +2595,8 @@ UINT WINAPI waveOutGetID(HWAVEOUT hWaveOut, UINT* lpuDeviceID) /************************************************************************** * waveOutMessage [WINMM.@] */ -DWORD WINAPI waveOutMessage(HWAVEOUT hWaveOut, UINT uMessage, - DWORD dwParam1, DWORD dwParam2) +UINT WINAPI waveOutMessage(HWAVEOUT hWaveOut, UINT uMessage, + DWORD dwParam1, DWORD dwParam2) { LPWINE_MLD wmld; @@ -2844,8 +2849,8 @@ UINT WINAPI waveInGetID(HWAVEIN hWaveIn, UINT* lpuDeviceID) /************************************************************************** * waveInMessage [WINMM.@] */ -DWORD WINAPI waveInMessage(HWAVEIN hWaveIn, UINT uMessage, - DWORD dwParam1, DWORD dwParam2) +UINT WINAPI waveInMessage(HWAVEIN hWaveIn, UINT uMessage, + DWORD dwParam1, DWORD dwParam2) { LPWINE_MLD wmld; diff --git a/dlls/winmm/winmm.spec b/dlls/winmm/winmm.spec index 8511bfea188..dc13c46b537 100644 --- a/dlls/winmm/winmm.spec +++ b/dlls/winmm/winmm.spec @@ -52,7 +52,7 @@ @ stdcall mciSendCommandA(long long long long) @ stdcall mciSendCommandW(long long long long) @ stdcall mciSendStringA(str ptr long long) -@ stdcall mciSendStringW(str ptr long long) +@ stdcall mciSendStringW(wstr ptr long long) @ stdcall mciSetDriverData(long long) @ stdcall mciSetYieldProc(long ptr long) @ stub midiConnect @@ -125,8 +125,8 @@ @ stdcall mmioOpenA(str ptr long) @ stdcall mmioOpenW(wstr ptr long) @ stdcall mmioRead(long ptr long) -@ stdcall mmioRenameA(ptr ptr ptr long) -@ stdcall mmioRenameW(ptr ptr ptr long) +@ stdcall mmioRenameA(str str ptr long) +@ stdcall mmioRenameW(wstr wstr ptr long) @ stdcall mmioSeek(long long long) @ stdcall mmioSendMessage(long long long long) @ stdcall mmioSetBuffer(long ptr long long) diff --git a/include/mmddk.h b/include/mmddk.h index 345bb6f4ef0..33768bdce75 100644 --- a/include/mmddk.h +++ b/include/mmddk.h @@ -439,6 +439,10 @@ BOOL WINAPI mciFreeCommandResource(UINT uTable); BOOL WINAPI DriverCallback(DWORD dwCallBack, UINT uFlags, HDRVR hDev, UINT wMsg, DWORD dwUser, DWORD dwParam1, DWORD dwParam2); +#ifdef __WINESRC__ +#define WAVE_DIRECTSOUND 0x0080 +#endif + #include #endif /* __MMDDK_H */ diff --git a/include/mmsystem.h b/include/mmsystem.h index 7d68f286d67..2722b17689a 100644 --- a/include/mmsystem.h +++ b/include/mmsystem.h @@ -297,9 +297,6 @@ typedef LPDRVCALLBACK LPWAVECALLBACK; #define WAVE_MAPPED 0x0004 #define WAVE_FORMAT_DIRECT 0x0008 #define WAVE_FORMAT_DIRECT_QUERY (WAVE_FORMAT_QUERY | WAVE_FORMAT_DIRECT) -#ifdef __WINESRC__ -#define WAVE_DIRECTSOUND 0x0080 -#endif typedef struct wavehdr_tag { LPSTR lpData; /* pointer to locked data buffer */ @@ -449,7 +446,7 @@ UINT WINAPI waveOutSetPitch(HWAVEOUT,DWORD); UINT WINAPI waveOutGetPlaybackRate(HWAVEOUT,DWORD*); UINT WINAPI waveOutSetPlaybackRate(HWAVEOUT,DWORD); UINT WINAPI waveOutGetID(HWAVEOUT,UINT*); -DWORD WINAPI waveOutMessage(HWAVEOUT,UINT,DWORD,DWORD); +UINT WINAPI waveOutMessage(HWAVEOUT,UINT,DWORD,DWORD); UINT WINAPI waveInGetNumDevs(void); UINT WINAPI waveInGetDevCapsA(UINT,LPWAVEINCAPSA,UINT); UINT WINAPI waveInGetDevCapsW(UINT,LPWAVEINCAPSW,UINT); @@ -467,7 +464,7 @@ UINT WINAPI waveInStop(HWAVEIN); UINT WINAPI waveInReset(HWAVEIN); UINT WINAPI waveInGetPosition(HWAVEIN,LPMMTIME,UINT); UINT WINAPI waveInGetID(HWAVEIN,UINT*); -DWORD WINAPI waveInMessage(HWAVEIN,UINT,DWORD,DWORD); +UINT WINAPI waveInMessage(HWAVEIN,UINT,DWORD,DWORD); #define MIDIERR_UNPREPARED (MIDIERR_BASE + 0) /* header not prepared */ #define MIDIERR_STILLPLAYING (MIDIERR_BASE + 1) /* still something playing */ @@ -646,7 +643,7 @@ UINT WINAPI midiOutReset(HMIDIOUT); UINT WINAPI midiOutCachePatches(HMIDIOUT,UINT,WORD*,UINT); UINT WINAPI midiOutCacheDrumPatches(HMIDIOUT,UINT,WORD*,UINT); UINT WINAPI midiOutGetID(HMIDIOUT,UINT*); -DWORD WINAPI midiOutMessage(HMIDIOUT,UINT,DWORD,DWORD); +UINT WINAPI midiOutMessage(HMIDIOUT,UINT,DWORD,DWORD); UINT WINAPI midiInGetNumDevs(void); UINT WINAPI midiInGetDevCapsA(UINT,LPMIDIINCAPSA,UINT); @@ -664,7 +661,7 @@ UINT WINAPI midiInStart(HMIDIIN); UINT WINAPI midiInStop(HMIDIIN); UINT WINAPI midiInReset(HMIDIIN); UINT WINAPI midiInGetID(HMIDIIN,UINT*); -DWORD WINAPI midiInMessage(HMIDIIN,UINT,DWORD,DWORD); +UINT WINAPI midiInMessage(HMIDIIN,UINT,DWORD,DWORD); MMRESULT WINAPI midiStreamClose(HMIDISTRM hms); MMRESULT WINAPI midiStreamOpen(HMIDISTRM* phms, LPUINT uDeviceID, DWORD cMidi, DWORD dwCallback, DWORD dwInstance, DWORD fdwOpen); @@ -712,7 +709,7 @@ UINT WINAPI auxGetDevCapsW(UINT,LPAUXCAPSW,UINT); #define auxGetDevCaps WINELIB_NAME_AW(auxGetDevCaps) UINT WINAPI auxSetVolume(UINT,DWORD); UINT WINAPI auxGetVolume(UINT,LPDWORD); -DWORD WINAPI auxOutMessage(UINT,UINT,DWORD,DWORD); +UINT WINAPI auxOutMessage(UINT,UINT,DWORD,DWORD); #define TIMERR_NOERROR (0) /* no error */ #define TIMERR_NOCANDO (TIMERR_BASE+1) /* request not completed */ @@ -1389,9 +1386,9 @@ HMMIO WINAPI mmioOpenW(LPWSTR,MMIOINFO*,DWORD); #define mmioOpen WINELIB_NAME_AW(mmioOpen) MMRESULT WINAPI mmioRenameA(LPCSTR szFileName, LPCSTR szNewFileName, - MMIOINFO * lpmmioinfo, DWORD dwRenameFlags); + const MMIOINFO * lpmmioinfo, DWORD dwRenameFlags); MMRESULT WINAPI mmioRenameW(LPCWSTR szFileName, LPCWSTR szNewFileName, - MMIOINFO * lpmmioinfo, DWORD dwRenameFlags); + const MMIOINFO * lpmmioinfo, DWORD dwRenameFlags); #define mmioRename WINELIB_NAME_AW(mmioRename) MMRESULT WINAPI mmioClose(HMMIO,UINT); @@ -1414,7 +1411,7 @@ DWORD WINAPI mciSendCommandA(UINT,UINT,DWORD,DWORD); DWORD WINAPI mciSendCommandW(UINT,UINT,DWORD,DWORD); #define mciSendCommand WINELIB_NAME_AW(mciSendCommand) DWORD WINAPI mciSendStringA(LPCSTR,LPSTR,UINT,HWND); -DWORD WINAPI mciSendStringW(LPCWSTR,LPSTR,UINT,HWND); +DWORD WINAPI mciSendStringW(LPCWSTR,LPWSTR,UINT,HWND); #define mciSendString WINELIB_NAME_AW(mciSendString) UINT WINAPI mciGetDeviceIDA(LPCSTR); UINT WINAPI mciGetDeviceIDW(LPCWSTR); -- 2.11.4.GIT