-/* -*- tab-width: 8; c-basic-offset: 4 -*- */
-
-/*****************************************************************************
+/*
* Copyright 1998, Luiz Otavio L. Zorzella
* 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 <stdarg.h>
#include "winbase.h"
#include "mmddk.h"
-#define WINE_DEFAULT_WINMM_DRIVER "wineoss.drv"
-#define WINE_DEFAULT_WINMM_MAPPER "msacm.drv"
-#define WINE_DEFAULT_WINMM_MIDI "midimap.drv"
-
-typedef DWORD (WINAPI *MessageProc16)(UINT16 wDevID, UINT16 wMsg, DWORD dwUser, DWORD dwParam1, DWORD dwParam2);
-typedef DWORD (WINAPI *MessageProc32)(UINT wDevID, UINT wMsg, DWORD dwUser, DWORD dwParam1, DWORD dwParam2);
-
-typedef enum {
- WINMM_MAP_NOMEM, /* ko, memory problem */
- WINMM_MAP_MSGERROR, /* ko, unknown message */
- WINMM_MAP_OK, /* ok, no memory allocated. to be sent to the proc. */
- WINMM_MAP_OKMEM, /* ok, some memory allocated, need to call UnMapMsg. to be sent to the proc. */
-} WINMM_MapType;
-
/* Who said goofy boy ? */
#define WINE_DI_MAGIC 0x900F1B01
DWORD dwMagic;
/* as usual LPWINE_DRIVER == hDriver32 */
DWORD dwFlags;
- union {
- struct {
- HMODULE hModule;
- DRIVERPROC lpDrvProc;
- DWORD dwDriverID;
- } d32;
- struct {
- UINT16 hDriver16;
- } d16;
- } d;
+ HMODULE hModule;
+ DRIVERPROC lpDrvProc;
+ DWORD_PTR dwDriverID;
struct tagWINE_DRIVER* lpPrevItem;
struct tagWINE_DRIVER* lpNextItem;
} WINE_DRIVER, *LPWINE_DRIVER;
-typedef DWORD (CALLBACK *WINEMM_msgFunc16)(UINT16, WORD, DWORD, DWORD, DWORD);
-typedef DWORD (CALLBACK *WINEMM_msgFunc32)(UINT , UINT, DWORD, DWORD, DWORD);
+typedef DWORD (CALLBACK *WINEMM_msgFunc32)(UINT, UINT, DWORD_PTR, DWORD_PTR, DWORD_PTR);
/* for each loaded driver and each known type of driver, this structure contains
* the information needed to access it
typedef struct tagWINE_MM_DRIVER_PART {
int nIDMin; /* lower bound of global indexes for this type */
int nIDMax; /* hhigher bound of global indexes for this type */
- union {
- WINEMM_msgFunc32 fnMessage32; /* pointer to function */
- WINEMM_msgFunc16 fnMessage16;
- } u;
+ WINEMM_msgFunc32 fnMessage32; /* pointer to function */
} WINE_MM_DRIVER_PART;
#define MMDRV_AUX 0
typedef struct tagWINE_MM_DRIVER {
HDRVR hDriver;
LPSTR drvname; /* name of the driver */
- unsigned bIs32 : 1, /* TRUE if 32 bit driver, FALSE for 16 */
- bIsMapper : 1; /* TRUE if mapper */
+ unsigned bIsMapper : 1; /* TRUE if mapper */
WINE_MM_DRIVER_PART parts[MMDRV_MAX];/* Information for all known types */
} WINE_MM_DRIVER, *LPWINE_MM_DRIVER;
UINT uDeviceID;
UINT type;
UINT mmdIndex; /* index to low-level driver in MMDrvs table */
- DWORD dwDriverInstance; /* this value is driver related, as opposed to
+ DWORD_PTR dwDriverInstance; /* this value is driver related, as opposed to
* opendesc.dwInstance which is client (callback) related */
- WORD bFrom32;
WORD dwFlags;
- DWORD dwCallback;
- DWORD dwClientInstance;
+ DWORD_PTR dwCallback;
+ DWORD_PTR dwClientInstance;
} WINE_MLD, *LPWINE_MLD;
typedef struct {
WINE_MLD mld;
} WINE_MIXER, *LPWINE_MIXER;
-#define WINE_MMTHREAD_CREATED 0x4153494C /* "BSIL" */
-#define WINE_MMTHREAD_DELETED 0xDEADDEAD
-
-typedef struct {
- DWORD dwSignature; /* 00 "BSIL" when ok, 0xDEADDEAD when being deleted */
- DWORD dwCounter; /* 04 > 1 when in mmThread functions */
- HANDLE hThread; /* 08 hThread */
- DWORD dwThreadID; /* 0C */
- DWORD fpThread; /* 10 address of thread proc (segptr or lin depending on dwFlags) */
- DWORD dwThreadPmt; /* 14 parameter to be passed upon thread creation to fpThread */
- DWORD dwSignalCount; /* 18 counter used for signaling */
- HANDLE hEvent; /* 1C event */
- HANDLE hVxD; /* 20 return from OpenVxDHandle */
- DWORD dwStatus; /* 24 0x00, 0x10, 0x20, 0x30 */
- DWORD dwFlags; /* 28 dwFlags upon creation */
- UINT16 hTask; /* 2C handle to created task */
-} WINE_MMTHREAD;
-
typedef struct tagWINE_MCIDRIVER {
UINT wDeviceID;
UINT wType;
- LPWSTR lpstrElementName;
LPWSTR lpstrDeviceType;
LPWSTR lpstrAlias;
HDRVR hDriver;
- DWORD dwPrivate;
+ DWORD_PTR dwPrivate;
YIELDPROC lpfnYieldProc;
DWORD dwYieldData;
- BOOL bIs32;
DWORD CreatorThread;
UINT uTypeCmdTable;
UINT uSpecificCmdTable;
struct tagWINE_MCIDRIVER*lpNext;
} WINE_MCIDRIVER, *LPWINE_MCIDRIVER;
-#define WINE_TIMER_IS32 0x80
-
-typedef struct tagWINE_TIMERENTRY {
- UINT wDelay;
- UINT wResol;
- LPTIMECALLBACK lpFunc; /* can be lots of things */
- DWORD dwUser;
- UINT16 wFlags;
- UINT16 wTimerID;
- DWORD dwTriggerTime;
- struct tagWINE_TIMERENTRY* lpNext;
-} WINE_TIMERENTRY, *LPWINE_TIMERENTRY;
-
-enum mmioProcType {MMIO_PROC_16,MMIO_PROC_32A,MMIO_PROC_32W};
-
struct IOProcList
{
struct IOProcList*pNext; /* Next item in linked list */
FOURCC fourCC; /* four-character code identifying IOProc */
LPMMIOPROC pIOProc; /* pointer to IProc */
- enum mmioProcType type; /* 16, 32A or 32W */
+ BOOL is_unicode; /* 32A or 32W */
int count; /* number of objects linked to it */
};
struct IOProcList* ioProc;
unsigned bTmpIOProc : 1,
bBufferLoaded : 1;
- DWORD segBuffer16;
DWORD dwFileSize;
} WINE_MMIO, *LPWINE_MMIO;
-typedef struct tagWINE_PLAYSOUND {
- unsigned bLoop : 1,
- bAlloc : 1;
- LPCWSTR pszSound;
- HMODULE hMod;
- DWORD fdwSound;
- HANDLE hThread;
- struct tagWINE_PLAYSOUND* lpNext;
-} WINE_PLAYSOUND, *LPWINE_PLAYSOUND;
-
-typedef struct tagWINE_MM_IDATA {
- /* winmm part */
- HANDLE hWinMM32Instance;
- HANDLE hWinMM16Instance;
- CRITICAL_SECTION cs;
- /* mci part */
- LPWINE_MCIDRIVER lpMciDrvs;
- /* low level drivers (unused yet) */
- /* LPWINE_WAVE lpWave; */
- /* LPWINE_MIDI lpMidi; */
- /* LPWINE_MIXER lpMixer; */
- /* mmio part */
- LPWINE_MMIO lpMMIO;
- /* playsound and sndPlaySound */
- WINE_PLAYSOUND* lpPlaySound;
- HANDLE psLastEvent;
- HANDLE psStopEvent;
-} WINE_MM_IDATA, *LPWINE_MM_IDATA;
-
/* function prototypes */
-typedef LONG (*MCIPROC)(DWORD, HDRVR, DWORD, DWORD, DWORD);
-typedef WINMM_MapType (*MMDRV_MAPFUNC)(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2);
-typedef WINMM_MapType (*MMDRV_UNMAPFUNC)(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT ret);
+LPWINE_DRIVER DRIVER_FindFromHDrvr(HDRVR hDrvr) DECLSPEC_HIDDEN;
+BOOL DRIVER_GetLibName(LPCWSTR keyName, LPCWSTR sectName, LPWSTR buf, int sz) DECLSPEC_HIDDEN;
+LPWINE_DRIVER DRIVER_TryOpenDriver32(LPCWSTR fn, LPARAM lParam2) DECLSPEC_HIDDEN;
+void DRIVER_UnloadAll(void) DECLSPEC_HIDDEN;
-LPWINE_DRIVER DRIVER_FindFromHDrvr(HDRVR hDrvr);
-BOOL DRIVER_GetLibName(LPCWSTR keyName, LPCWSTR sectName, LPWSTR buf, int sz);
-LPWINE_DRIVER DRIVER_TryOpenDriver32(LPCWSTR fn, LPARAM lParam2);
-void DRIVER_UnloadAll(void);
-
-BOOL MMDRV_Init(void);
-void MMDRV_Exit(void);
-UINT MMDRV_GetNum(UINT);
+void MMDRV_Exit(void) DECLSPEC_HIDDEN;
+UINT MMDRV_GetNum(UINT) DECLSPEC_HIDDEN;
LPWINE_MLD MMDRV_Alloc(UINT size, UINT type, LPHANDLE hndl, DWORD* dwFlags,
- DWORD* dwCallback, DWORD* dwInstance, BOOL bFrom32);
-void MMDRV_Free(HANDLE hndl, LPWINE_MLD mld);
-DWORD MMDRV_Open(LPWINE_MLD mld, UINT wMsg, DWORD dwParam1, DWORD dwParam2);
-DWORD MMDRV_Close(LPWINE_MLD mld, UINT wMsg);
-LPWINE_MLD MMDRV_Get(HANDLE hndl, UINT type, BOOL bCanBeID);
-LPWINE_MLD MMDRV_GetRelated(HANDLE hndl, UINT srcType, BOOL bSrcCanBeID, UINT dstTyped);
-DWORD MMDRV_Message(LPWINE_MLD mld, UINT wMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2, BOOL bFrom32);
-UINT MMDRV_PhysicalFeatures(LPWINE_MLD mld, UINT uMsg, DWORD dwParam1, DWORD dwParam2);
-BOOL MMDRV_Is32(unsigned int);
-void MMDRV_InstallMap(unsigned int, MMDRV_MAPFUNC, MMDRV_UNMAPFUNC,
- MMDRV_MAPFUNC, MMDRV_UNMAPFUNC, LPDRVCALLBACK);
-
-WINE_MCIDRIVER* MCI_GetDriver(UINT16 uDevID);
-UINT MCI_GetDriverFromString(LPCWSTR str);
-DWORD MCI_WriteString(LPWSTR lpDstStr, DWORD dstSize, LPCWSTR lpSrcStr);
-const char* MCI_MessageToString(UINT wMsg);
-UINT WINAPI MCI_DefYieldProc(MCIDEVICEID wDevID, DWORD data);
-LRESULT MCI_CleanUp(LRESULT dwRet, UINT wMsg, DWORD dwParam2);
-DWORD MCI_SendCommand(UINT wDevID, UINT16 wMsg, DWORD dwParam1, DWORD dwParam2, BOOL bFrom32);
-DWORD MCI_SendCommandFrom32(UINT wDevID, UINT16 wMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2);
-DWORD MCI_SendCommandFrom16(UINT wDevID, UINT16 wMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2);
-UINT MCI_SetCommandTable(void *table, UINT uDevType);
-BOOL MCI_DeleteCommandTable(UINT uTbl, BOOL delete);
-LPWSTR MCI_strdupAtoW(LPCSTR str);
-LPSTR MCI_strdupWtoA(LPCWSTR str);
+ DWORD_PTR* dwCallback, DWORD_PTR* dwInstance) DECLSPEC_HIDDEN;
+void MMDRV_Free(HANDLE hndl, LPWINE_MLD mld) DECLSPEC_HIDDEN;
+DWORD MMDRV_Open(LPWINE_MLD mld, UINT wMsg, DWORD_PTR dwParam1, DWORD dwParam2) DECLSPEC_HIDDEN;
+DWORD MMDRV_Close(LPWINE_MLD mld, UINT wMsg) DECLSPEC_HIDDEN;
+LPWINE_MLD MMDRV_Get(HANDLE hndl, UINT type, BOOL bCanBeID) DECLSPEC_HIDDEN;
+LPWINE_MLD MMDRV_GetRelated(HANDLE hndl, UINT srcType, BOOL bSrcCanBeID, UINT dstTyped) DECLSPEC_HIDDEN;
+DWORD MMDRV_Message(LPWINE_MLD mld, UINT wMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2) DECLSPEC_HIDDEN;
+UINT MMDRV_PhysicalFeatures(LPWINE_MLD mld, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2) DECLSPEC_HIDDEN;
-BOOL WINMM_CheckForMMSystem(void);
-const char* WINMM_ErrorToString(MMRESULT error);
+DWORD MCI_SendCommand(UINT wDevID, UINT16 wMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2) DECLSPEC_HIDDEN;
-UINT MIXER_Open(LPHMIXER lphMix, UINT uDeviceID, DWORD_PTR dwCallback,
- DWORD_PTR dwInstance, DWORD fdwOpen, BOOL bFrom32);
-UINT MIDI_OutOpen(HMIDIOUT* lphMidiOut, UINT uDeviceID, DWORD_PTR dwCallback,
- DWORD_PTR dwInstance, DWORD dwFlags, BOOL bFrom32);
-UINT MIDI_InOpen(HMIDIIN* lphMidiIn, UINT uDeviceID, DWORD_PTR dwCallback,
- DWORD_PTR dwInstance, DWORD dwFlags, BOOL bFrom32);
-MMRESULT MIDI_StreamOpen(HMIDISTRM* lphMidiStrm, LPUINT lpuDeviceID,
- DWORD cMidi, DWORD_PTR dwCallback,
- DWORD_PTR dwInstance, DWORD fdwOpen, BOOL bFrom32);
-UINT WAVE_Open(HANDLE* lphndl, UINT uDeviceID, UINT uType,
- LPCWAVEFORMATEX lpFormat, DWORD_PTR dwCallback,
- DWORD_PTR dwInstance, DWORD dwFlags, BOOL bFrom32);
+const char* WINMM_ErrorToString(MMRESULT error) DECLSPEC_HIDDEN;
-HMMIO MMIO_Open(LPSTR szFileName, MMIOINFO* refmminfo,
- DWORD dwOpenFlags, enum mmioProcType type);
-LPMMIOPROC MMIO_InstallIOProc(FOURCC fccIOProc, LPMMIOPROC pIOProc,
- DWORD dwFlags, enum mmioProcType type);
-LRESULT MMIO_SendMessage(HMMIO hmmio, UINT uMessage, LPARAM lParam1,
- LPARAM lParam2, enum mmioProcType type);
-LPWINE_MMIO MMIO_Get(HMMIO h);
-
-WORD TIME_SetEventInternal(UINT wDelay, UINT wResol, LPTIMECALLBACK lpFunc,
- DWORD dwUser, UINT wFlags);
-void TIME_MMTimeStart(void);
-void TIME_MMTimeStop(void);
+void TIME_MMTimeStop(void) DECLSPEC_HIDDEN;
/* Global variables */
-extern LPWINE_MM_IDATA WINMM_IData;
+extern CRITICAL_SECTION WINMM_cs DECLSPEC_HIDDEN;
+extern HINSTANCE hWinMM32Instance DECLSPEC_HIDDEN;
+extern HANDLE psLastEvent DECLSPEC_HIDDEN;
+extern HANDLE psStopEvent DECLSPEC_HIDDEN;
-/* pointers to 16 bit functions (if sibling MMSYSTEM.DLL is loaded
- * NULL otherwise
- */
-extern WINE_MMTHREAD* (*pFnGetMMThread16)(UINT16);
-extern LPWINE_DRIVER (*pFnOpenDriver16)(LPCWSTR,LPCWSTR,LPARAM);
-extern LRESULT (*pFnCloseDriver16)(UINT16,LPARAM,LPARAM);
-extern LRESULT (*pFnSendMessage16)(UINT16,UINT,LPARAM,LPARAM);
-extern WINMM_MapType (*pFnMciMapMsg16To32W)(WORD,WORD,DWORD*);
-extern WINMM_MapType (*pFnMciUnMapMsg16To32W)(WORD,WORD,DWORD);
-extern WINMM_MapType (*pFnMciMapMsg32WTo16)(WORD,WORD,DWORD,DWORD*);
-extern WINMM_MapType (*pFnMciUnMapMsg32WTo16)(WORD,WORD,DWORD,DWORD);
-extern LRESULT (*pFnCallMMDrvFunc16)(DWORD /* in fact FARPROC16 */,WORD,WORD,LONG,LONG,LONG);
-extern unsigned (*pFnLoadMMDrvFunc16)(LPCSTR,LPWINE_DRIVER, LPWINE_MM_DRIVER);
-extern LRESULT (*pFnMmioCallback16)(DWORD,LPMMIOINFO,UINT,LPARAM,LPARAM);
-extern void (WINAPI *pFnReleaseThunkLock)(DWORD*);
-extern void (WINAPI *pFnRestoreThunkLock)(DWORD);
/* GetDriverFlags() returned bits is not documented (nor the call itself)
* Here are Wine only definitions of the bits
*/
-#define WINE_GDF_EXIST 0x80000000
-#define WINE_GDF_16BIT 0x10000000
+#define WINE_GDF_EXIST 0x80000000
+#define WINE_GDF_EXTERNAL_MASK 0xF0000000
+#define WINE_GDF_SESSION 0x00000001