1 #ifndef __WINE_DSOUND_H
2 #define __WINE_DSOUND_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
;
30 #define MAKE_DSHRESULT(code) MAKE_HRESULT(1,_FACDS,code)
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
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
;
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
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
148 LPWAVEFORMATEX lpwfxFormat
;
149 } DSBUFFERDESC
,*LPDSBUFFERDESC
;
151 typedef struct _DSBPOSITIONNOTIFY
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)
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
;
208 LPDIRECTSOUNDBUFFER
*buffers
;
209 LPDIRECTSOUNDBUFFER primary
;
210 LPDIRECTSOUND3DLISTENER listener
;
211 WAVEFORMATEX wfx
; /* current main waveformat */
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
;
249 LPDIRECTSOUND3DBUFFER ds3db
;
250 DWORD playflags
,playing
;
251 DWORD playpos
,writepos
,buflen
;
252 DWORD nAvgBytesPerSec
;
256 LONG lVolAdjust
,rVolAdjust
;
257 LPDIRECTSOUND dsound
;
259 LPDSBPOSITIONNOTIFY notifies
;
261 CRITICAL_SECTION lock
;
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
;
283 LPDIRECTSOUNDBUFFER dsb
;
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
{
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
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
;
357 LPDIRECTSOUNDBUFFER dsb
;
359 CRITICAL_SECTION lock
;
363 typedef struct _DS3DBUFFER
{
367 DWORD dwInsideConeAngle
;
368 DWORD dwOutsideConeAngle
;
369 D3DVECTOR vConeOrientation
;
370 LONG lConeOutsideVolume
;
371 D3DVALUE flMinDistance
;
372 D3DVALUE flMaxDistance
;
374 } DS3DBUFFER
, *LPDS3DBUFFER
;
376 typedef const DS3DBUFFER
*LPCDS3DBUFFER
;
378 #define THIS LPDIRECTSOUND3DBUFFER this
379 typedef struct IDirectSound3DBuffer_VTable
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
;
410 LPDIRECTSOUNDBUFFER dsb
;
414 CRITICAL_SECTION lock
;