[MMIXER] Fix additional data size initialization for different audio formats (#6753)
[reactos.git] / dll / win32 / winmm / winemm.h
1 /*
2 * Copyright 1998, Luiz Otavio L. Zorzella
3 * 1999, Eric Pouech
4 *
5 * Purpose: multimedia declarations (internal to WINMM & MMSYSTEM DLLs)
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20 */
21
22 #ifndef _WINEMM_H_
23 #define _WINEMM_H_
24
25 #include <wine/config.h>
26
27 #include <assert.h>
28 #include <stdio.h>
29
30 #define _INC_WINDOWS
31 #define COM_NO_WINDOWS_H
32
33 #define NONAMELESSUNION
34 #define NONAMELESSSTRUCT
35
36 #include <windef.h>
37 #include <winbase.h>
38 #include <winuser.h>
39 #include <winreg.h>
40 #include <mmddk.h>
41
42 #include <wine/debug.h>
43 #include <wine/exception.h>
44 #include <wine/unicode.h>
45
46 #define WINE_DEFAULT_WINMM_DRIVER "alsa,oss,coreaudio,esd"
47 #define WINE_DEFAULT_WINMM_MAPPER "msacm32.drv"
48 #define WINE_DEFAULT_WINMM_MIDI "midimap.dll"
49
50 /* Who said goofy boy ? */
51 #define WINE_DI_MAGIC 0x900F1B01
52
53 typedef struct tagWINE_DRIVER
54 {
55 DWORD dwMagic;
56 /* as usual LPWINE_DRIVER == hDriver32 */
57 DWORD dwFlags;
58 HMODULE hModule;
59 DRIVERPROC lpDrvProc;
60 DWORD_PTR dwDriverID;
61 struct tagWINE_DRIVER* lpPrevItem;
62 struct tagWINE_DRIVER* lpNextItem;
63 } WINE_DRIVER, *LPWINE_DRIVER;
64
65 typedef DWORD (CALLBACK *WINEMM_msgFunc32)(UINT, UINT, DWORD_PTR, DWORD_PTR, DWORD_PTR);
66
67 /* for each loaded driver and each known type of driver, this structure contains
68 * the information needed to access it
69 */
70 typedef struct tagWINE_MM_DRIVER_PART {
71 int nIDMin; /* lower bound of global indexes for this type */
72 int nIDMax; /* hhigher bound of global indexes for this type */
73 WINEMM_msgFunc32 fnMessage32; /* pointer to function */
74 } WINE_MM_DRIVER_PART;
75
76 #define MMDRV_AUX 0
77 #define MMDRV_MIXER 1
78 #define MMDRV_MIDIIN 2
79 #define MMDRV_MIDIOUT 3
80 #define MMDRV_WAVEIN 4
81 #define MMDRV_WAVEOUT 5
82 #define MMDRV_MAX 6
83
84 /* each low-level .drv will be associated with an instance of this structure */
85 typedef struct tagWINE_MM_DRIVER {
86 HDRVR hDriver;
87 LPSTR drvname; /* name of the driver */
88 unsigned bIsMapper : 1; /* TRUE if mapper */
89 WINE_MM_DRIVER_PART parts[MMDRV_MAX];/* Information for all known types */
90 } WINE_MM_DRIVER, *LPWINE_MM_DRIVER;
91
92 typedef struct tagWINE_MLD {
93 /* EPP struct tagWINE_MLD* lpNext; */ /* not used so far */
94 UINT uDeviceID;
95 UINT type;
96 UINT mmdIndex; /* index to low-level driver in MMDrvs table */
97 DWORD_PTR dwDriverInstance; /* this value is driver related, as opposed to
98 * opendesc.dwInstance which is client (callback) related */
99 WORD dwFlags;
100 DWORD_PTR dwCallback;
101 DWORD_PTR dwClientInstance;
102 } WINE_MLD, *LPWINE_MLD;
103
104 typedef struct {
105 WINE_MLD mld;
106 } WINE_WAVE, *LPWINE_WAVE;
107
108 typedef struct {
109 WINE_MLD mld;
110 MIDIOPENDESC mod; /* FIXME: should be removed */
111 } WINE_MIDI, *LPWINE_MIDI;
112
113 typedef struct {
114 WINE_MLD mld;
115 } WINE_MIXER, *LPWINE_MIXER;
116
117 typedef struct tagWINE_MCIDRIVER {
118 UINT wDeviceID;
119 UINT wType;
120 LPWSTR lpstrElementName;
121 LPWSTR lpstrDeviceType;
122 LPWSTR lpstrAlias;
123 HDRVR hDriver;
124 DWORD_PTR dwPrivate;
125 YIELDPROC lpfnYieldProc;
126 DWORD dwYieldData;
127 DWORD CreatorThread;
128 UINT uTypeCmdTable;
129 UINT uSpecificCmdTable;
130 struct tagWINE_MCIDRIVER*lpNext;
131 } WINE_MCIDRIVER, *LPWINE_MCIDRIVER;
132
133 struct IOProcList
134 {
135 struct IOProcList*pNext; /* Next item in linked list */
136 FOURCC fourCC; /* four-character code identifying IOProc */
137 LPMMIOPROC pIOProc; /* pointer to IProc */
138 BOOL is_unicode; /* 32A or 32W */
139 int count; /* number of objects linked to it */
140 };
141
142 typedef struct tagWINE_MMIO {
143 MMIOINFO info;
144 struct tagWINE_MMIO* lpNext;
145 struct IOProcList* ioProc;
146 unsigned bTmpIOProc : 1,
147 bBufferLoaded : 1;
148 DWORD dwFileSize;
149 } WINE_MMIO, *LPWINE_MMIO;
150
151 /* function prototypes */
152 BOOL WINMM_CheckForMMSystem(void);
153 LPWINE_DRIVER DRIVER_FindFromHDrvr(HDRVR hDrvr);
154 BOOL DRIVER_GetLibName(LPCWSTR keyName, LPCWSTR sectName, LPWSTR buf, int sz);
155 LPWINE_DRIVER DRIVER_TryOpenDriver32(LPCWSTR fn, LPARAM lParam2);
156 void DRIVER_UnloadAll(void);
157 HDRVR WINAPI OpenDriverA(LPCSTR lpDriverName, LPCSTR lpSectionName, LPARAM lParam);
158 BOOL MMDRV_Install(LPCSTR drvRegName, LPCSTR drvFileName, BOOL bIsMapper);
159 BOOL LoadRegistryMMEDrivers(char* key);
160 BOOL MMDRV_Init(void);
161 void MMDRV_Exit(void);
162 UINT MMDRV_GetNum(UINT);
163 LPWINE_MLD MMDRV_Alloc(UINT size, UINT type, LPHANDLE hndl, DWORD* dwFlags,
164 DWORD_PTR* dwCallback, DWORD_PTR* dwInstance);
165 void MMDRV_Free(HANDLE hndl, LPWINE_MLD mld);
166 DWORD MMDRV_Open(LPWINE_MLD mld, UINT wMsg, DWORD_PTR dwParam1, DWORD dwParam2);
167 DWORD MMDRV_Close(LPWINE_MLD mld, UINT wMsg);
168 LPWINE_MLD MMDRV_Get(HANDLE hndl, UINT type, BOOL bCanBeID);
169 LPWINE_MLD MMDRV_GetRelated(HANDLE hndl, UINT srcType, BOOL bSrcCanBeID, UINT dstTyped);
170 DWORD MMDRV_Message(LPWINE_MLD mld, UINT wMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2);
171 UINT MMDRV_PhysicalFeatures(LPWINE_MLD mld, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2);
172
173 const char* MCI_MessageToString(UINT wMsg);
174 DWORD MCI_SendCommand(UINT wDevID, UINT16 wMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2);
175 LPWSTR MCI_strdupAtoW(LPCSTR str);
176 LPSTR MCI_strdupWtoA(LPCWSTR str);
177
178 const char* WINMM_ErrorToString(MMRESULT error);
179
180 void TIME_MMTimeStop(void);
181
182 MMRESULT WINMM_CheckCallback(DWORD_PTR dwCallback, DWORD fdwOpen, BOOL mixer) DECLSPEC_HIDDEN;
183
184 /* Global variables */
185 extern CRITICAL_SECTION WINMM_cs;
186 extern HINSTANCE hWinMM32Instance;
187 extern HANDLE psLastEvent;
188 extern HANDLE psStopEvent;
189
190 /* GetDriverFlags() returned bits is not documented (nor the call itself)
191 * Here are Wine only definitions of the bits
192 */
193 #define WINE_GDF_EXIST 0x80000000
194 #define WINE_GDF_EXTERNAL_MASK 0xF0000000
195 #define WINE_GDF_SESSION 0x00000001
196
197
198 /* Modification to take into account Windows NT's registry format */
199
200 #define NT_MME_DRIVERS32_KEY \
201 "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32"
202
203 #define NT_MME_DRIVERS_KEY \
204 "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers"
205
206 INT LoadRegistryMMEDrivers(char* key);
207
208 #endif /* _WINEMM_H_ */