Fixed 8-bit WAV format handling (it is unsigned data).
[wine/multimedia.git] / include / dsound.h
blob999ed7db3bb0e813dc605c9c9fdb6407ca623286
1 #ifndef __WINE_DSOUND_H
2 #define __WINE_DSOUND_H
4 #include "windows.h"
5 #include "winbase.h"
6 #include "compobj.h"
7 #include "mmsystem.h"
8 #include "d3d.h" //FIXME: Need to break out d3dtypes.h
10 DEFINE_GUID(CLSID_DirectSound, 0x47d4d946, 0x62e8, 0x11cf, 0x93, 0xbc, 0x44, 0x45, 0x53, 0x54, 0x0, 0x0);
12 DEFINE_GUID(IID_IDirectSound, 0x279AFA83,0x4981,0x11CE,0xA5,0x21,0x00,0x20,0xAF,0x0B,0xE5,0x60);
13 DEFINE_GUID(IID_IDirectSoundBuffer, 0x279AFA85,0x4981,0x11CE,0xA5,0x21,0x00,0x20,0xAF,0x0B,0xE5,0x60);
14 DEFINE_GUID(IID_IDirectSoundNotify, 0xB0210783,0x89cd,0x11d0,0xAF,0x08,0x00,0xA0,0xC9,0x25,0xCD,0x16);
15 DEFINE_GUID(IID_IDirectSound3DListener, 0x279AFA84,0x4981,0x11CE,0xA5,0x21,0x00,0x20,0xAF,0x0B,0xE5,0x60);
16 DEFINE_GUID(IID_IDirectSound3DBuffer, 0x279AFA86,0x4981,0x11CE,0xA5,0x21,0x00,0x20,0xAF,0x0B,0xE5,0x60);
17 DEFINE_GUID(IID_IDirectSoundCapture, 0xB0210781,0x89CD,0x11D0,0xAF,0x08,0x00,0xA0,0xC9,0x25,0xCD,0x16);
18 DEFINE_GUID(IID_IDirectSoundCaptureBuffer,0xB0210782,0x89CD,0x11D0,0xAF,0x08,0x00,0xA0,0xC9,0x25,0xCD,0x16);
19 DEFINE_GUID(IID_IKsPropertySet, 0x31EFAC30,0x515C,0x11D0,0xA9,0xAA,0x00,0xAA,0x00,0x61,0xBE,0x93);
23 typedef struct IDirectSound IDirectSound,*LPDIRECTSOUND;
24 typedef struct IDirectSoundNotify IDirectSoundNotify,*LPDIRECTSOUNDNOTIFY;
25 typedef struct IDirectSoundBuffer IDirectSoundBuffer,*LPDIRECTSOUNDBUFFER,**LPLPDIRECTSOUNDBUFFER;
26 typedef struct IDirectSound3DListener IDirectSound3DListener,*LPDIRECTSOUND3DLISTENER,**LPLPDIRECTSOUND3DLISTENER;
27 typedef struct IDirectSound3DBuffer IDirectSound3DBuffer,*LPDIRECTSOUND3DBUFFER,**LPLPDIRECTSOUND3DBUFFER;
29 #define _FACDS 0x878
30 #define MAKE_DSHRESULT(code) MAKE_HRESULT(1,_FACDS,code)
32 #define DS_OK 0
33 #define DSERR_ALLOCATED MAKE_DSHRESULT(10)
34 #define DSERR_CONTROLUNAVAIL MAKE_DSHRESULT(30)
35 #define DSERR_INVALIDPARAM E_INVALIDARG
36 #define DSERR_INVALIDCALL MAKE_DSHRESULT(50)
37 #define DSERR_GENERIC E_FAIL
38 #define DSERR_PRIOLEVELNEEDED MAKE_DSHRESULT(70)
39 #define DSERR_OUTOFMEMORY E_OUTOFMEMORY
40 #define DSERR_BADFORMAT MAKE_DSHRESULT(100)
41 #define DSERR_UNSUPPORTED E_NOTIMPL
42 #define DSERR_NODRIVER MAKE_DSHRESULT(120)
43 #define DSERR_ALREADYINITIALIZED MAKE_DSHRESULT(130)
44 #define DSERR_NOAGGREGATION CLASS_E_NOAGGREGATION
45 #define DSERR_BUFFERLOST MAKE_DSHRESULT(150)
46 #define DSERR_OTHERAPPHASPRIO MAKE_DSHRESULT(160)
47 #define DSERR_UNINITIALIZED MAKE_DSHRESULT(170)
49 #define DSCAPS_PRIMARYMONO 0x00000001
50 #define DSCAPS_PRIMARYSTEREO 0x00000002
51 #define DSCAPS_PRIMARY8BIT 0x00000004
52 #define DSCAPS_PRIMARY16BIT 0x00000008
53 #define DSCAPS_CONTINUOUSRATE 0x00000010
54 #define DSCAPS_EMULDRIVER 0x00000020
55 #define DSCAPS_CERTIFIED 0x00000040
56 #define DSCAPS_SECONDARYMONO 0x00000100
57 #define DSCAPS_SECONDARYSTEREO 0x00000200
58 #define DSCAPS_SECONDARY8BIT 0x00000400
59 #define DSCAPS_SECONDARY16BIT 0x00000800
61 #define DSSCL_NORMAL 1
62 #define DSSCL_PRIORITY 2
63 #define DSSCL_EXCLUSIVE 3
64 #define DSSCL_WRITEPRIMARY 4
66 typedef struct _DSCAPS
68 DWORD dwSize;
69 DWORD dwFlags;
70 DWORD dwMinSecondarySampleRate;
71 DWORD dwMaxSecondarySampleRate;
72 DWORD dwPrimaryBuffers;
73 DWORD dwMaxHwMixingAllBuffers;
74 DWORD dwMaxHwMixingStaticBuffers;
75 DWORD dwMaxHwMixingStreamingBuffers;
76 DWORD dwFreeHwMixingAllBuffers;
77 DWORD dwFreeHwMixingStaticBuffers;
78 DWORD dwFreeHwMixingStreamingBuffers;
79 DWORD dwMaxHw3DAllBuffers;
80 DWORD dwMaxHw3DStaticBuffers;
81 DWORD dwMaxHw3DStreamingBuffers;
82 DWORD dwFreeHw3DAllBuffers;
83 DWORD dwFreeHw3DStaticBuffers;
84 DWORD dwFreeHw3DStreamingBuffers;
85 DWORD dwTotalHwMemBytes;
86 DWORD dwFreeHwMemBytes;
87 DWORD dwMaxContigFreeHwMemBytes;
88 DWORD dwUnlockTransferRateHwBuffers;
89 DWORD dwPlayCpuOverheadSwBuffers;
90 DWORD dwReserved1;
91 DWORD dwReserved2;
92 } DSCAPS,*LPDSCAPS;
94 #define DSBPLAY_LOOPING 0x00000001
96 #define DSBSTATUS_PLAYING 0x00000001
97 #define DSBSTATUS_BUFFERLOST 0x00000002
98 #define DSBSTATUS_LOOPING 0x00000004
101 #define DSBLOCK_FROMWRITECURSOR 0x00000001
102 #define DSBLOCK_ENTIREBUFFER 0x00000002
104 #define DSBCAPS_PRIMARYBUFFER 0x00000001
105 #define DSBCAPS_STATIC 0x00000002
106 #define DSBCAPS_LOCHARDWARE 0x00000004
107 #define DSBCAPS_LOCSOFTWARE 0x00000008
108 #define DSBCAPS_CTRL3D 0x00000010
109 #define DSBCAPS_CTRLFREQUENCY 0x00000020
110 #define DSBCAPS_CTRLPAN 0x00000040
111 #define DSBCAPS_CTRLVOLUME 0x00000080
112 #define DSBCAPS_CTRLPOSITIONNOTIFY 0x00000100
113 #define DSBCAPS_CTRLDEFAULT 0x000000E0 /* Pan + volume + frequency. */
114 #define DSBCAPS_CTRLALL 0x000001F0 /* All control capabilities */
115 #define DSBCAPS_STICKYFOCUS 0x00004000
116 #define DSBCAPS_GLOBALFOCUS 0x00008000
117 #define DSBCAPS_GETCURRENTPOSITION2 0x00010000 /* More accurate play cursor under emulation*/
118 #define DSBCAPS_MUTE3DATMAXDISTANCE 0x00020000
120 #define DSBPAN_LEFT -10000
121 #define DSBPAN_RIGHT 10000
122 #define DSBVOLUME_MAX 0
123 #define DSBVOLUME_MIN -10000
124 #define DSBFREQUENCY_MIN 100
125 #define DSBFREQUENCY_MAX 100000
126 #define DSBFREQUENCY_ORIGINAL 0
128 typedef struct _DSBCAPS
130 DWORD dwSize;
131 DWORD dwFlags;
132 DWORD dwBufferBytes;
133 DWORD dwUnlockTransferRate;
134 DWORD dwPlayCpuOverhead;
135 } DSBCAPS,*LPDSBCAPS;
137 #define DSSCL_NORMAL 1
138 #define DSSCL_PRIORITY 2
139 #define DSSCL_EXCLUSIVE 3
140 #define DSSCL_WRITEPRIMARY 4
142 typedef struct _DSBUFFERDESC
144 DWORD dwSize;
145 DWORD dwFlags;
146 DWORD dwBufferBytes;
147 DWORD dwReserved;
148 LPWAVEFORMATEX lpwfxFormat;
149 } DSBUFFERDESC,*LPDSBUFFERDESC;
151 typedef struct _DSBPOSITIONNOTIFY
153 DWORD dwOffset;
154 HANDLE32 hEventNotify;
155 } DSBPOSITIONNOTIFY,*LPDSBPOSITIONNOTIFY;
157 typedef const DSBPOSITIONNOTIFY *LPCDSBPOSITIONNOTIFY;
159 #define DSSPEAKER_HEADPHONE 1
160 #define DSSPEAKER_MONO 2
161 #define DSSPEAKER_QUAD 3
162 #define DSSPEAKER_STEREO 4
163 #define DSSPEAKER_SURROUND 5
165 #define DSSPEAKER_GEOMETRY_MIN 0x00000005 // 5 degrees
166 #define DSSPEAKER_GEOMETRY_NARROW 0x0000000A // 10 degrees
167 #define DSSPEAKER_GEOMETRY_WIDE 0x00000014 // 20 degrees
168 #define DSSPEAKER_GEOMETRY_MAX 0x000000B4 // 180 degrees
171 typedef LPVOID* LPLPVOID;
173 typedef BOOL32 (CALLBACK *LPDSENUMCALLBACK32W)(LPGUID,LPWSTR,LPWSTR,LPVOID);
174 typedef BOOL32 (CALLBACK *LPDSENUMCALLBACK32A)(LPGUID,LPSTR,LPSTR,LPVOID);
176 extern HRESULT WINAPI DirectSoundCreate(LPGUID lpGUID,LPDIRECTSOUND * ppDS,IUnknown *pUnkOuter );
178 #define STDMETHOD(xfn) HRESULT (CALLBACK *fn##xfn)
179 #define STDMETHOD_(ret,xfn) ret (CALLBACK *fn##xfn)
180 #define PURE
181 #define FAR
182 #define THIS_ THIS,
184 #define THIS LPDIRECTSOUND this
185 typedef struct tagLPDIRECTSOUND_VTABLE
187 /*** IUnknown methods ***/
188 STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
189 STDMETHOD_(ULONG,AddRef) (THIS) PURE;
190 STDMETHOD_(ULONG,Release) (THIS) PURE;
191 /*** IDirectSound methods ***/
193 STDMETHOD( CreateSoundBuffer)(THIS_ LPDSBUFFERDESC, LPLPDIRECTSOUNDBUFFER, IUnknown FAR *) PURE;
194 STDMETHOD( GetCaps)(THIS_ LPDSCAPS ) PURE;
195 STDMETHOD( DuplicateSoundBuffer)(THIS_ LPDIRECTSOUNDBUFFER, LPLPDIRECTSOUNDBUFFER ) PURE;
196 STDMETHOD( SetCooperativeLevel)(THIS_ HWND32, DWORD ) PURE;
197 STDMETHOD( Compact)(THIS ) PURE;
198 STDMETHOD( GetSpeakerConfig)(THIS_ LPDWORD ) PURE;
199 STDMETHOD( SetSpeakerConfig)(THIS_ DWORD ) PURE;
200 STDMETHOD( Initialize)(THIS_ LPGUID ) PURE;
201 } *LPDIRECTSOUND_VTABLE;
203 struct IDirectSound {
204 LPDIRECTSOUND_VTABLE lpvtbl;
205 DWORD ref;
206 DWORD priolevel;
207 int nrofbuffers;
208 LPDIRECTSOUNDBUFFER *buffers;
209 LPDIRECTSOUNDBUFFER primary;
210 LPDIRECTSOUND3DLISTENER listener;
211 WAVEFORMATEX wfx; /* current main waveformat */
213 #undef THIS
215 #define THIS LPDIRECTSOUNDBUFFER this
216 typedef struct tagLPDIRECTSOUNDBUFFER_VTABLE
218 /*** IUnknown methods ***/
219 STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
220 STDMETHOD_(ULONG,AddRef) (THIS) PURE;
221 STDMETHOD_(ULONG,Release) (THIS) PURE;
222 /*** IDirectSoundBuffer methods ***/
224 STDMETHOD( GetCaps)(THIS_ LPDSBCAPS ) PURE;
225 STDMETHOD(GetCurrentPosition)(THIS_ LPDWORD,LPDWORD ) PURE;
226 STDMETHOD( GetFormat)(THIS_ LPWAVEFORMATEX, DWORD, LPDWORD ) PURE;
227 STDMETHOD( GetVolume)(THIS_ LPLONG ) PURE;
228 STDMETHOD( GetPan)(THIS_ LPLONG ) PURE;
229 STDMETHOD( GetFrequency)(THIS_ LPDWORD ) PURE;
230 STDMETHOD( GetStatus)(THIS_ LPDWORD ) PURE;
231 STDMETHOD( Initialize)(THIS_ LPDIRECTSOUND, LPDSBUFFERDESC ) PURE;
232 STDMETHOD( Lock)(THIS_ DWORD,DWORD,LPVOID,LPDWORD,LPVOID,LPDWORD,DWORD ) PURE;
233 STDMETHOD( Play)(THIS_ DWORD,DWORD,DWORD ) PURE;
234 STDMETHOD(SetCurrentPosition)(THIS_ DWORD ) PURE;
235 STDMETHOD( SetFormat)(THIS_ LPWAVEFORMATEX ) PURE;
236 STDMETHOD( SetVolume)(THIS_ LONG ) PURE;
237 STDMETHOD( SetPan)(THIS_ LONG ) PURE;
238 STDMETHOD( SetFrequency)(THIS_ DWORD ) PURE;
239 STDMETHOD( Stop)(THIS ) PURE;
240 STDMETHOD( Unlock)(THIS_ LPVOID,DWORD,LPVOID,DWORD ) PURE;
241 STDMETHOD( Restore)(THIS ) PURE;
242 } *LPDIRECTSOUNDBUFFER_VTABLE;
244 struct IDirectSoundBuffer {
245 LPDIRECTSOUNDBUFFER_VTABLE lpvtbl;
246 WAVEFORMATEX wfx;
247 DWORD ref;
248 LPBYTE buffer;
249 LPDIRECTSOUND3DBUFFER ds3db;
250 DWORD playflags,playing;
251 DWORD playpos,writepos,buflen;
252 DWORD nAvgBytesPerSec;
253 DWORD freq;
254 ULONG freqAdjust;
255 LONG volume,pan;
256 LONG lVolAdjust,rVolAdjust;
257 LPDIRECTSOUND dsound;
258 DSBUFFERDESC dsbd;
259 LPDSBPOSITIONNOTIFY notifies;
260 int nrofnotifies;
261 CRITICAL_SECTION lock;
263 #undef THIS
265 #define WINE_NOBUFFER 0x80000000
267 #define DSBPN_OFFSETSTOP -1
269 #define THIS LPDIRECTSOUNDNOTIFY this
270 typedef struct IDirectSoundNotify_VTable {
271 /* IUnknown methods */
272 STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE;
273 STDMETHOD_(ULONG,AddRef) (THIS) PURE;
274 STDMETHOD_(ULONG,Release) (THIS) PURE;
276 /* IDirectSoundNotify methods */
277 STDMETHOD(SetNotificationPositions) (THIS_ DWORD, LPCDSBPOSITIONNOTIFY) PURE;
278 } *LPDIRECTSOUNDNOTIFY_VTABLE,IDirectSoundNotify_VTable;
280 struct IDirectSoundNotify {
281 LPDIRECTSOUNDNOTIFY_VTABLE lpvtbl;
282 DWORD ref;
283 LPDIRECTSOUNDBUFFER dsb;
285 #undef THIS
287 #define DS3DMODE_NORMAL 0x00000000
288 #define DS3DMODE_HEADRELATIVE 0x00000001
289 #define DS3DMODE_DISABLE 0x00000002
291 #define DS3D_IMMEDIATE 0x00000000
292 #define DS3D_DEFERRED 0x00000001
294 #define DS3D_MINDISTANCEFACTOR 0.0f
295 #define DS3D_MAXDISTANCEFACTOR 10.0f
296 #define DS3D_DEFAULTDISTANCEFACTOR 1.0f
298 #define DS3D_MINROLLOFFFACTOR 0.0f
299 #define DS3D_MAXROLLOFFFACTOR 10.0f
300 #define DS3D_DEFAULTROLLOFFFACTOR 1.0f
302 #define DS3D_MINDOPPLERFACTOR 0.0f
303 #define DS3D_MAXDOPPLERFACTOR 10.0f
304 #define DS3D_DEFAULTDOPPLERFACTOR 1.0f
306 #define DS3D_DEFAULTMINDISTANCE 1.0f
307 #define DS3D_DEFAULTMAXDISTANCE 1000000000.0f
309 #define DS3D_MINCONEANGLE 0
310 #define DS3D_MAXCONEANGLE 360
311 #define DS3D_DEFAULTCONEANGLE 360
313 #define DS3D_DEFAULTCONEOUTSIDEVOLUME 0
315 typedef struct _DS3DLISTENER {
316 DWORD dwSize;
317 D3DVECTOR vPosition;
318 D3DVECTOR vVelocity;
319 D3DVECTOR vOrientFront;
320 D3DVECTOR vOrientTop;
321 D3DVALUE flDistanceFactor;
322 D3DVALUE flRolloffFactor;
323 D3DVALUE flDopplerFactor;
324 } DS3DLISTENER, *LPDS3DLISTENER;
326 typedef const DS3DLISTENER *LPCDS3DLISTENER;
328 #define THIS LPDIRECTSOUND3DLISTENER this
329 typedef struct IDirectSound3DListener_VTable
331 // IUnknown methods
332 STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE;
333 STDMETHOD_(ULONG,AddRef) (THIS) PURE;
334 STDMETHOD_(ULONG,Release) (THIS) PURE;
336 // IDirectSound3DListener methods
337 STDMETHOD(GetAllParameters) (THIS_ LPDS3DLISTENER) PURE;
338 STDMETHOD(GetDistanceFactor) (THIS_ LPD3DVALUE) PURE;
339 STDMETHOD(GetDopplerFactor) (THIS_ LPD3DVALUE) PURE;
340 STDMETHOD(GetOrientation) (THIS_ LPD3DVECTOR, LPD3DVECTOR) PURE;
341 STDMETHOD(GetPosition) (THIS_ LPD3DVECTOR) PURE;
342 STDMETHOD(GetRolloffFactor) (THIS_ LPD3DVALUE) PURE;
343 STDMETHOD(GetVelocity) (THIS_ LPD3DVECTOR) PURE;
344 STDMETHOD(SetAllParameters) (THIS_ LPCDS3DLISTENER, DWORD) PURE;
345 STDMETHOD(SetDistanceFactor) (THIS_ D3DVALUE, DWORD) PURE;
346 STDMETHOD(SetDopplerFactor) (THIS_ D3DVALUE, DWORD) PURE;
347 STDMETHOD(SetOrientation) (THIS_ D3DVALUE, D3DVALUE, D3DVALUE, D3DVALUE, D3DVALUE, D3DVALUE, DWORD) PURE;
348 STDMETHOD(SetPosition) (THIS_ D3DVALUE, D3DVALUE, D3DVALUE, DWORD) PURE;
349 STDMETHOD(SetRolloffFactor) (THIS_ D3DVALUE, DWORD) PURE;
350 STDMETHOD(SetVelocity) (THIS_ D3DVALUE, D3DVALUE, D3DVALUE, DWORD) PURE;
351 STDMETHOD(CommitDeferredSettings) (THIS) PURE;
352 } *LPDIRECTSOUND3DLISTENER_VTABLE, IDirectSound3DListener_VTable;
354 struct IDirectSound3DListener {
355 LPDIRECTSOUND3DLISTENER_VTABLE lpvtbl;
356 DWORD ref;
357 LPDIRECTSOUNDBUFFER dsb;
358 DS3DLISTENER ds3dl;
359 CRITICAL_SECTION lock;
361 #undef THIS
363 typedef struct _DS3DBUFFER {
364 DWORD dwSize;
365 D3DVECTOR vPosition;
366 D3DVECTOR vVelocity;
367 DWORD dwInsideConeAngle;
368 DWORD dwOutsideConeAngle;
369 D3DVECTOR vConeOrientation;
370 LONG lConeOutsideVolume;
371 D3DVALUE flMinDistance;
372 D3DVALUE flMaxDistance;
373 DWORD dwMode;
374 } DS3DBUFFER, *LPDS3DBUFFER;
376 typedef const DS3DBUFFER *LPCDS3DBUFFER;
378 #define THIS LPDIRECTSOUND3DBUFFER this
379 typedef struct IDirectSound3DBuffer_VTable
381 // IUnknown methods
382 STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE;
383 STDMETHOD_(ULONG,AddRef) (THIS) PURE;
384 STDMETHOD_(ULONG,Release) (THIS) PURE;
386 // IDirectSound3DBuffer methods
387 STDMETHOD(GetAllParameters) (THIS_ LPDS3DBUFFER) PURE;
388 STDMETHOD(GetConeAngles) (THIS_ LPDWORD, LPDWORD) PURE;
389 STDMETHOD(GetConeOrientation) (THIS_ LPD3DVECTOR) PURE;
390 STDMETHOD(GetConeOutsideVolume) (THIS_ LPLONG) PURE;
391 STDMETHOD(GetMaxDistance) (THIS_ LPD3DVALUE) PURE;
392 STDMETHOD(GetMinDistance) (THIS_ LPD3DVALUE) PURE;
393 STDMETHOD(GetMode) (THIS_ LPDWORD) PURE;
394 STDMETHOD(GetPosition) (THIS_ LPD3DVECTOR) PURE;
395 STDMETHOD(GetVelocity) (THIS_ LPD3DVECTOR) PURE;
396 STDMETHOD(SetAllParameters) (THIS_ LPCDS3DBUFFER, DWORD) PURE;
397 STDMETHOD(SetConeAngles) (THIS_ DWORD, DWORD, DWORD) PURE;
398 STDMETHOD(SetConeOrientation) (THIS_ D3DVALUE, D3DVALUE, D3DVALUE, DWORD) PURE;
399 STDMETHOD(SetConeOutsideVolume) (THIS_ LONG, DWORD) PURE;
400 STDMETHOD(SetMaxDistance) (THIS_ D3DVALUE, DWORD) PURE;
401 STDMETHOD(SetMinDistance) (THIS_ D3DVALUE, DWORD) PURE;
402 STDMETHOD(SetMode) (THIS_ DWORD, DWORD) PURE;
403 STDMETHOD(SetPosition) (THIS_ D3DVALUE, D3DVALUE, D3DVALUE, DWORD) PURE;
404 STDMETHOD(SetVelocity) (THIS_ D3DVALUE, D3DVALUE, D3DVALUE, DWORD) PURE;
405 } *LPDIRECTSOUND3DBUFFER_VTABLE, IDirectSound3DBuffer_VTable;
407 struct IDirectSound3DBuffer {
408 LPDIRECTSOUND3DBUFFER_VTABLE lpvtbl;
409 DWORD ref;
410 LPDIRECTSOUNDBUFFER dsb;
411 DS3DBUFFER ds3db;
412 LPBYTE buffer;
413 DWORD buflen;
414 CRITICAL_SECTION lock;
416 #undef THIS
417 #undef STDMETHOD
418 #undef STDMETHOD_
419 #undef PURE
420 #undef FAR
421 #undef THIS_
422 #endif