Fixed duplicate sound buffer handling. Updated status.
[wine] / include / dsound.h
1 #ifndef __WINE_DSOUND_H
2 #define __WINE_DSOUND_H
3
4 #include "windows.h"
5 #include "winbase.h"
6 #include "mmsystem.h"
7 #include "d3d.h"                        /*FIXME: Need to break out d3dtypes.h */
8
9 DEFINE_GUID(CLSID_DirectSound,          0x47d4d946, 0x62e8, 0x11cf, 0x93, 0xbc, 0x44, 0x45, 0x53, 0x54, 0x0, 0x0);
10
11 DEFINE_GUID(IID_IDirectSound,           0x279AFA83,0x4981,0x11CE,0xA5,0x21,0x00,0x20,0xAF,0x0B,0xE5,0x60);
12 DEFINE_GUID(IID_IDirectSoundBuffer,     0x279AFA85,0x4981,0x11CE,0xA5,0x21,0x00,0x20,0xAF,0x0B,0xE5,0x60); 
13 DEFINE_GUID(IID_IDirectSoundNotify,     0xB0210783,0x89cd,0x11d0,0xAF,0x08,0x00,0xA0,0xC9,0x25,0xCD,0x16);
14 DEFINE_GUID(IID_IDirectSound3DListener, 0x279AFA84,0x4981,0x11CE,0xA5,0x21,0x00,0x20,0xAF,0x0B,0xE5,0x60);
15 DEFINE_GUID(IID_IDirectSound3DBuffer,   0x279AFA86,0x4981,0x11CE,0xA5,0x21,0x00,0x20,0xAF,0x0B,0xE5,0x60); 
16 DEFINE_GUID(IID_IDirectSoundCapture,    0xB0210781,0x89CD,0x11D0,0xAF,0x08,0x00,0xA0,0xC9,0x25,0xCD,0x16);
17 DEFINE_GUID(IID_IDirectSoundCaptureBuffer,0xB0210782,0x89CD,0x11D0,0xAF,0x08,0x00,0xA0,0xC9,0x25,0xCD,0x16);
18 DEFINE_GUID(IID_IKsPropertySet,         0x31EFAC30,0x515C,0x11D0,0xA9,0xAA,0x00,0xAA,0x00,0x61,0xBE,0x93);
19
20
21
22 typedef struct IDirectSound IDirectSound,*LPDIRECTSOUND;
23 typedef struct IDirectSoundNotify IDirectSoundNotify,*LPDIRECTSOUNDNOTIFY;
24 typedef struct IDirectSoundBuffer IDirectSoundBuffer,*LPDIRECTSOUNDBUFFER,**LPLPDIRECTSOUNDBUFFER;
25 typedef struct IDirectSound3DListener IDirectSound3DListener,*LPDIRECTSOUND3DLISTENER,**LPLPDIRECTSOUND3DLISTENER;
26 typedef struct IDirectSound3DBuffer IDirectSound3DBuffer,*LPDIRECTSOUND3DBUFFER,**LPLPDIRECTSOUND3DBUFFER;
27
28 #define _FACDS          0x878
29 #define MAKE_DSHRESULT(code)            MAKE_HRESULT(1,_FACDS,code)
30
31 #define DS_OK                           0
32 #define DSERR_ALLOCATED                 MAKE_DSHRESULT(10)
33 #define DSERR_CONTROLUNAVAIL            MAKE_DSHRESULT(30)
34 #define DSERR_INVALIDPARAM              E_INVALIDARG
35 #define DSERR_INVALIDCALL               MAKE_DSHRESULT(50)
36 #define DSERR_GENERIC                   E_FAIL
37 #define DSERR_PRIOLEVELNEEDED           MAKE_DSHRESULT(70)
38 #define DSERR_OUTOFMEMORY               E_OUTOFMEMORY
39 #define DSERR_BADFORMAT                 MAKE_DSHRESULT(100)
40 #define DSERR_UNSUPPORTED               E_NOTIMPL
41 #define DSERR_NODRIVER                  MAKE_DSHRESULT(120)
42 #define DSERR_ALREADYINITIALIZED        MAKE_DSHRESULT(130)
43 #define DSERR_NOAGGREGATION             CLASS_E_NOAGGREGATION
44 #define DSERR_BUFFERLOST                MAKE_DSHRESULT(150)
45 #define DSERR_OTHERAPPHASPRIO           MAKE_DSHRESULT(160)
46 #define DSERR_UNINITIALIZED             MAKE_DSHRESULT(170)
47
48 #define DSCAPS_PRIMARYMONO          0x00000001
49 #define DSCAPS_PRIMARYSTEREO        0x00000002
50 #define DSCAPS_PRIMARY8BIT          0x00000004
51 #define DSCAPS_PRIMARY16BIT         0x00000008
52 #define DSCAPS_CONTINUOUSRATE       0x00000010
53 #define DSCAPS_EMULDRIVER           0x00000020
54 #define DSCAPS_CERTIFIED            0x00000040
55 #define DSCAPS_SECONDARYMONO        0x00000100
56 #define DSCAPS_SECONDARYSTEREO      0x00000200
57 #define DSCAPS_SECONDARY8BIT        0x00000400
58 #define DSCAPS_SECONDARY16BIT       0x00000800
59
60 #define DSSCL_NORMAL            1
61 #define DSSCL_PRIORITY          2
62 #define DSSCL_EXCLUSIVE         3
63 #define DSSCL_WRITEPRIMARY      4
64
65 typedef struct _DSCAPS
66 {
67     DWORD       dwSize;
68     DWORD       dwFlags;
69     DWORD       dwMinSecondarySampleRate;
70     DWORD       dwMaxSecondarySampleRate;
71     DWORD       dwPrimaryBuffers;
72     DWORD       dwMaxHwMixingAllBuffers;
73     DWORD       dwMaxHwMixingStaticBuffers;
74     DWORD       dwMaxHwMixingStreamingBuffers;
75     DWORD       dwFreeHwMixingAllBuffers;
76     DWORD       dwFreeHwMixingStaticBuffers;
77     DWORD       dwFreeHwMixingStreamingBuffers;
78     DWORD       dwMaxHw3DAllBuffers;
79     DWORD       dwMaxHw3DStaticBuffers;
80     DWORD       dwMaxHw3DStreamingBuffers;
81     DWORD       dwFreeHw3DAllBuffers;
82     DWORD       dwFreeHw3DStaticBuffers;
83     DWORD       dwFreeHw3DStreamingBuffers;
84     DWORD       dwTotalHwMemBytes;
85     DWORD       dwFreeHwMemBytes;
86     DWORD       dwMaxContigFreeHwMemBytes;
87     DWORD       dwUnlockTransferRateHwBuffers;
88     DWORD       dwPlayCpuOverheadSwBuffers;
89     DWORD       dwReserved1;
90     DWORD       dwReserved2;
91 } DSCAPS,*LPDSCAPS;
92
93 #define DSBPLAY_LOOPING         0x00000001
94
95 #define DSBSTATUS_PLAYING           0x00000001
96 #define DSBSTATUS_BUFFERLOST        0x00000002
97 #define DSBSTATUS_LOOPING           0x00000004
98
99
100 #define DSBLOCK_FROMWRITECURSOR     0x00000001
101 #define DSBLOCK_ENTIREBUFFER        0x00000002
102
103 #define DSBCAPS_PRIMARYBUFFER       0x00000001
104 #define DSBCAPS_STATIC              0x00000002
105 #define DSBCAPS_LOCHARDWARE         0x00000004
106 #define DSBCAPS_LOCSOFTWARE         0x00000008
107 #define DSBCAPS_CTRL3D              0x00000010
108 #define DSBCAPS_CTRLFREQUENCY       0x00000020
109 #define DSBCAPS_CTRLPAN             0x00000040
110 #define DSBCAPS_CTRLVOLUME          0x00000080
111 #define DSBCAPS_CTRLPOSITIONNOTIFY  0x00000100
112 #define DSBCAPS_CTRLDEFAULT         0x000000E0  /* Pan + volume + frequency. */
113 #define DSBCAPS_CTRLALL             0x000001F0  /* All control capabilities */
114 #define DSBCAPS_STICKYFOCUS         0x00004000
115 #define DSBCAPS_GLOBALFOCUS         0x00008000
116 #define DSBCAPS_GETCURRENTPOSITION2 0x00010000  /* More accurate play cursor under emulation*/
117 #define DSBCAPS_MUTE3DATMAXDISTANCE 0x00020000
118
119 #define DSBPAN_LEFT                 -10000
120 #define DSBPAN_RIGHT                 10000
121 #define DSBVOLUME_MAX                    0
122 #define DSBVOLUME_MIN               -10000
123 #define DSBFREQUENCY_MIN            100
124 #define DSBFREQUENCY_MAX            100000
125 #define DSBFREQUENCY_ORIGINAL       0
126
127 typedef struct _DSBCAPS
128 {
129     DWORD       dwSize;
130     DWORD       dwFlags;
131     DWORD       dwBufferBytes;
132     DWORD       dwUnlockTransferRate;
133     DWORD       dwPlayCpuOverhead;
134 } DSBCAPS,*LPDSBCAPS;
135
136 #define DSSCL_NORMAL                1
137 #define DSSCL_PRIORITY              2
138 #define DSSCL_EXCLUSIVE             3
139 #define DSSCL_WRITEPRIMARY          4
140
141 typedef struct _DSBUFFERDESC
142 {
143     DWORD               dwSize;
144     DWORD               dwFlags;
145     DWORD               dwBufferBytes;
146     DWORD               dwReserved;
147     LPWAVEFORMATEX      lpwfxFormat;
148 } DSBUFFERDESC,*LPDSBUFFERDESC;
149
150 typedef struct _DSBPOSITIONNOTIFY
151 {
152         DWORD           dwOffset;
153         HANDLE32        hEventNotify;
154 } DSBPOSITIONNOTIFY,*LPDSBPOSITIONNOTIFY;
155
156 typedef const DSBPOSITIONNOTIFY *LPCDSBPOSITIONNOTIFY;
157
158 #define DSSPEAKER_HEADPHONE     1
159 #define DSSPEAKER_MONO          2
160 #define DSSPEAKER_QUAD          3
161 #define DSSPEAKER_STEREO        4
162 #define DSSPEAKER_SURROUND      5
163
164 #define DSSPEAKER_GEOMETRY_MIN      0x00000005  /* 5 degrees */
165 #define DSSPEAKER_GEOMETRY_NARROW   0x0000000A  /* 10 degrees */
166 #define DSSPEAKER_GEOMETRY_WIDE     0x00000014  /* 20 degrees */
167 #define DSSPEAKER_GEOMETRY_MAX      0x000000B4  /* 180 degrees */
168
169
170 typedef LPVOID* LPLPVOID;
171
172 typedef BOOL32 (CALLBACK *LPDSENUMCALLBACK32W)(LPGUID,LPWSTR,LPWSTR,LPVOID);
173 typedef BOOL32 (CALLBACK *LPDSENUMCALLBACK32A)(LPGUID,LPSTR,LPSTR,LPVOID);
174
175 extern HRESULT WINAPI DirectSoundCreate(LPGUID lpGUID,LPDIRECTSOUND * ppDS,IUnknown *pUnkOuter );
176
177 #define STDMETHOD(xfn) HRESULT (CALLBACK *fn##xfn)
178 #define STDMETHOD_(ret,xfn) ret (CALLBACK *fn##xfn)
179 #define PURE
180 #define FAR
181 #define THIS_ THIS,
182
183 #define THIS LPDIRECTSOUND this
184 typedef struct tagLPDIRECTSOUND_VTABLE
185 {
186     /*** IUnknown methods ***/
187     STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
188     STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
189     STDMETHOD_(ULONG,Release) (THIS) PURE;
190     /*** IDirectSound methods ***/
191
192     STDMETHOD( CreateSoundBuffer)(THIS_ LPDSBUFFERDESC, LPLPDIRECTSOUNDBUFFER, IUnknown FAR *) PURE;
193     STDMETHOD( GetCaps)(THIS_ LPDSCAPS ) PURE;
194     STDMETHOD( DuplicateSoundBuffer)(THIS_ LPDIRECTSOUNDBUFFER, LPLPDIRECTSOUNDBUFFER ) PURE;
195     STDMETHOD( SetCooperativeLevel)(THIS_ HWND32, DWORD ) PURE;
196     STDMETHOD( Compact)(THIS ) PURE;
197     STDMETHOD( GetSpeakerConfig)(THIS_ LPDWORD ) PURE;
198     STDMETHOD( SetSpeakerConfig)(THIS_ DWORD ) PURE;
199     STDMETHOD( Initialize)(THIS_ LPGUID ) PURE;
200 } *LPDIRECTSOUND_VTABLE;
201
202 struct IDirectSound {
203         LPDIRECTSOUND_VTABLE    lpvtbl;
204         DWORD                   ref;
205         DWORD                   priolevel;
206         int                     nrofbuffers;
207         LPDIRECTSOUNDBUFFER     *buffers;
208         LPDIRECTSOUNDBUFFER     primary;
209         LPDIRECTSOUND3DLISTENER listener;
210         WAVEFORMATEX            wfx; /* current main waveformat */
211 };
212 #undef THIS
213
214 #define THIS LPDIRECTSOUNDBUFFER this
215 typedef struct tagLPDIRECTSOUNDBUFFER_VTABLE
216 {
217     /*** IUnknown methods ***/
218     STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
219     STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
220     STDMETHOD_(ULONG,Release) (THIS) PURE;
221     /*** IDirectSoundBuffer methods ***/
222
223     STDMETHOD(           GetCaps)(THIS_ LPDSBCAPS ) PURE;
224     STDMETHOD(GetCurrentPosition)(THIS_ LPDWORD,LPDWORD ) PURE;
225     STDMETHOD(         GetFormat)(THIS_ LPWAVEFORMATEX, DWORD, LPDWORD ) PURE;
226     STDMETHOD(         GetVolume)(THIS_ LPLONG ) PURE;
227     STDMETHOD(            GetPan)(THIS_ LPLONG ) PURE;
228     STDMETHOD(      GetFrequency)(THIS_ LPDWORD ) PURE;
229     STDMETHOD(         GetStatus)(THIS_ LPDWORD ) PURE;
230     STDMETHOD(        Initialize)(THIS_ LPDIRECTSOUND, LPDSBUFFERDESC ) PURE;
231     STDMETHOD(              Lock)(THIS_ DWORD,DWORD,LPVOID,LPDWORD,LPVOID,LPDWORD,DWORD ) PURE;
232     STDMETHOD(              Play)(THIS_ DWORD,DWORD,DWORD ) PURE;
233     STDMETHOD(SetCurrentPosition)(THIS_ DWORD ) PURE;
234     STDMETHOD(         SetFormat)(THIS_ LPWAVEFORMATEX ) PURE;
235     STDMETHOD(         SetVolume)(THIS_ LONG ) PURE;
236     STDMETHOD(            SetPan)(THIS_ LONG ) PURE;
237     STDMETHOD(      SetFrequency)(THIS_ DWORD ) PURE;
238     STDMETHOD(              Stop)(THIS  ) PURE;
239     STDMETHOD(            Unlock)(THIS_ LPVOID,DWORD,LPVOID,DWORD ) PURE;
240     STDMETHOD(           Restore)(THIS  ) PURE;
241 } *LPDIRECTSOUNDBUFFER_VTABLE;
242
243 struct IDirectSoundBuffer {
244         LPDIRECTSOUNDBUFFER_VTABLE      lpvtbl;
245         WAVEFORMATEX                    wfx;
246         DWORD                           ref;
247         LPBYTE                          buffer;
248         LPDIRECTSOUND3DBUFFER           ds3db;
249         DWORD                           playflags,playing;
250         DWORD                           playpos,writepos,buflen;
251         DWORD                           nAvgBytesPerSec;
252         DWORD                           freq;
253         ULONG                           freqAdjust;
254         LONG                            volume,pan;
255         LONG                            lVolAdjust,rVolAdjust;
256         LPDIRECTSOUNDBUFFER             parent;         /* for duplicates */
257         LPDIRECTSOUND                   dsound;
258         DSBUFFERDESC                    dsbd;
259         LPDSBPOSITIONNOTIFY             notifies;
260         int                             nrofnotifies;
261         CRITICAL_SECTION                lock;
262 };
263 #undef THIS
264
265 #define WINE_NOBUFFER                   0x80000000
266
267 #define DSBPN_OFFSETSTOP                -1
268
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;
275
276         /* IDirectSoundNotify methods */
277         STDMETHOD(SetNotificationPositions) (THIS_ DWORD, LPCDSBPOSITIONNOTIFY) PURE;
278 } *LPDIRECTSOUNDNOTIFY_VTABLE,IDirectSoundNotify_VTable;
279
280 struct IDirectSoundNotify {
281         LPDIRECTSOUNDNOTIFY_VTABLE      lpvtbl;
282         DWORD                           ref;
283         LPDIRECTSOUNDBUFFER             dsb;
284 };
285 #undef THIS
286
287 #define DS3DMODE_NORMAL             0x00000000
288 #define DS3DMODE_HEADRELATIVE       0x00000001
289 #define DS3DMODE_DISABLE            0x00000002
290
291 #define DS3D_IMMEDIATE              0x00000000
292 #define DS3D_DEFERRED               0x00000001
293
294 #define DS3D_MINDISTANCEFACTOR      0.0f
295 #define DS3D_MAXDISTANCEFACTOR      10.0f
296 #define DS3D_DEFAULTDISTANCEFACTOR  1.0f
297
298 #define DS3D_MINROLLOFFFACTOR       0.0f
299 #define DS3D_MAXROLLOFFFACTOR       10.0f
300 #define DS3D_DEFAULTROLLOFFFACTOR   1.0f
301
302 #define DS3D_MINDOPPLERFACTOR       0.0f
303 #define DS3D_MAXDOPPLERFACTOR       10.0f
304 #define DS3D_DEFAULTDOPPLERFACTOR   1.0f
305
306 #define DS3D_DEFAULTMINDISTANCE     1.0f
307 #define DS3D_DEFAULTMAXDISTANCE     1000000000.0f
308
309 #define DS3D_MINCONEANGLE           0
310 #define DS3D_MAXCONEANGLE           360
311 #define DS3D_DEFAULTCONEANGLE       360
312
313 #define DS3D_DEFAULTCONEOUTSIDEVOLUME   0
314
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;
325
326 typedef const DS3DLISTENER *LPCDS3DLISTENER;
327         
328 #define THIS LPDIRECTSOUND3DLISTENER this
329 typedef struct IDirectSound3DListener_VTable
330 {
331         /* IUnknown methods */
332         STDMETHOD(QueryInterface)           (THIS_ REFIID, LPVOID FAR *) PURE;
333         STDMETHOD_(ULONG,AddRef)            (THIS) PURE;
334         STDMETHOD_(ULONG,Release)           (THIS) PURE;
335
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;
353
354 struct IDirectSound3DListener {
355         LPDIRECTSOUND3DLISTENER_VTABLE  lpvtbl;
356         DWORD                           ref;
357         LPDIRECTSOUNDBUFFER             dsb;
358         DS3DLISTENER                    ds3dl;
359         CRITICAL_SECTION                lock;   
360 };
361 #undef THIS
362
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;
375
376 typedef const DS3DBUFFER *LPCDS3DBUFFER;
377
378 #define THIS LPDIRECTSOUND3DBUFFER this
379 typedef struct IDirectSound3DBuffer_VTable
380 {
381         /* IUnknown methods */
382         STDMETHOD(QueryInterface)           (THIS_ REFIID, LPVOID FAR *) PURE;
383         STDMETHOD_(ULONG,AddRef)            (THIS) PURE;
384         STDMETHOD_(ULONG,Release)           (THIS) PURE;
385
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;
406
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;
415 };
416 #undef THIS
417 #undef STDMETHOD
418 #undef STDMETHOD_
419 #undef PURE
420 #undef FAR
421 #undef THIS_
422 #endif