1 /// C declarations of WASAPI that libsoundio uses
2 module soundio.headers.wasapiheader;
3 
4 version(Windows):
5 extern(Windows): @nogc: nothrow: __gshared:
6 
7 import core.sys.windows.windows;
8 
9 enum DEVICE_STATE_ACTIVE =      0x00000001;
10 enum DEVICE_STATE_DISABLED =    0x00000002;
11 enum DEVICE_STATE_NOTPRESENT =  0x00000004;
12 enum DEVICE_STATE_UNPLUGGED =   0x00000008;
13 enum DEVICE_STATEMASK_ALL =     0x0000000f;
14 
15 enum AUDCLNT_STREAMFLAGS_CROSSPROCESS             = 0x00010000;
16 enum AUDCLNT_STREAMFLAGS_LOOPBACK                 = 0x00020000;
17 enum AUDCLNT_STREAMFLAGS_EVENTCALLBACK            = 0x00040000;
18 enum AUDCLNT_STREAMFLAGS_NOPERSIST                = 0x00080000;
19 enum AUDCLNT_STREAMFLAGS_RATEADJUST               = 0x00100000;
20 enum AUDCLNT_STREAMFLAGS_PREVENT_LOOPBACK_CAPTURE = 0x01000000;
21 enum AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY      = 0x08000000;
22 enum AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM           = 0x80000000;
23 enum AUDCLNT_SESSIONFLAGS_EXPIREWHENUNOWNED       = 0x10000000;
24 enum AUDCLNT_SESSIONFLAGS_DISPLAY_HIDE            = 0x20000000;
25 enum AUDCLNT_SESSIONFLAGS_DISPLAY_HIDEWHENEXPIRED = 0x40000000;
26 
27 // Error codes
28 enum FACILITY_AUDCLNT = 2185;
29 int AUDCLNT_ERR(int n) {return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_AUDCLNT, n);}
30 int AUDCLNT_SUCCESS(int n) {return MAKE_SCODE(SEVERITY_SUCCESS, FACILITY_AUDCLNT, n);}
31 enum AUDCLNT_E_NOT_INITIALIZED =              AUDCLNT_ERR(0x001);
32 enum AUDCLNT_E_ALREADY_INITIALIZED =          AUDCLNT_ERR(0x002);
33 enum AUDCLNT_E_WRONG_ENDPOINT_TYPE =          AUDCLNT_ERR(0x003);
34 enum AUDCLNT_E_DEVICE_INVALIDATED =           AUDCLNT_ERR(0x004);
35 enum AUDCLNT_E_NOT_STOPPED =                  AUDCLNT_ERR(0x005);
36 enum AUDCLNT_E_BUFFER_TOO_LARGE =             AUDCLNT_ERR(0x006);
37 enum AUDCLNT_E_OUT_OF_ORDER =                 AUDCLNT_ERR(0x007);
38 enum AUDCLNT_E_UNSUPPORTED_FORMAT =           AUDCLNT_ERR(0x008);
39 enum AUDCLNT_E_INVALID_SIZE =                 AUDCLNT_ERR(0x009);
40 enum AUDCLNT_E_DEVICE_IN_USE =                AUDCLNT_ERR(0x00a);
41 enum AUDCLNT_E_BUFFER_OPERATION_PENDING =     AUDCLNT_ERR(0x00b);
42 enum AUDCLNT_E_THREAD_NOT_REGISTERED =        AUDCLNT_ERR(0x00c);
43 enum AUDCLNT_E_EXCLUSIVE_MODE_NOT_ALLOWED =   AUDCLNT_ERR(0x00e);
44 enum AUDCLNT_E_ENDPOINT_CREATE_FAILED =       AUDCLNT_ERR(0x00f);
45 enum AUDCLNT_E_SERVICE_NOT_RUNNING =          AUDCLNT_ERR(0x010);
46 enum AUDCLNT_E_EVENTHANDLE_NOT_EXPECTED =     AUDCLNT_ERR(0x011);
47 enum AUDCLNT_E_EXCLUSIVE_MODE_ONLY =          AUDCLNT_ERR(0x012);
48 enum AUDCLNT_E_BUFDURATION_PERIOD_NOT_EQUAL = AUDCLNT_ERR(0x013);
49 enum AUDCLNT_E_EVENTHANDLE_NOT_SET =          AUDCLNT_ERR(0x014);
50 enum AUDCLNT_E_INCORRECT_BUFFER_SIZE =        AUDCLNT_ERR(0x015);
51 enum AUDCLNT_E_BUFFER_SIZE_ERROR =            AUDCLNT_ERR(0x016);
52 enum AUDCLNT_E_CPUUSAGE_EXCEEDED =            AUDCLNT_ERR(0x017);
53 enum AUDCLNT_E_BUFFER_ERROR =                 AUDCLNT_ERR(0x018);
54 enum AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED =      AUDCLNT_ERR(0x019);
55 enum AUDCLNT_E_INVALID_DEVICE_PERIOD =        AUDCLNT_ERR(0x020);
56 enum AUDCLNT_E_INVALID_STREAM_FLAG =          AUDCLNT_ERR(0x021);
57 enum AUDCLNT_E_ENDPOINT_OFFLOAD_NOT_CAPABLE = AUDCLNT_ERR(0x022);
58 enum AUDCLNT_E_OUT_OF_OFFLOAD_RESOURCES =     AUDCLNT_ERR(0x023);
59 enum AUDCLNT_E_OFFLOAD_MODE_ONLY =            AUDCLNT_ERR(0x024);
60 enum AUDCLNT_E_NONOFFLOAD_MODE_ONLY =         AUDCLNT_ERR(0x025);
61 enum AUDCLNT_E_RESOURCES_INVALIDATED =        AUDCLNT_ERR(0x026);
62 enum AUDCLNT_E_RAW_MODE_UNSUPPORTED =         AUDCLNT_ERR(0x027);
63 enum AUDCLNT_E_ENGINE_PERIODICITY_LOCKED =    AUDCLNT_ERR(0x028);
64 enum AUDCLNT_E_ENGINE_FORMAT_LOCKED =         AUDCLNT_ERR(0x029);
65 enum AUDCLNT_E_HEADTRACKING_ENABLED =         AUDCLNT_ERR(0x030);
66 enum AUDCLNT_E_HEADTRACKING_UNSUPPORTED =     AUDCLNT_ERR(0x040);
67 enum AUDCLNT_S_BUFFER_EMPTY =                 AUDCLNT_SUCCESS(0x001);
68 enum AUDCLNT_S_THREAD_ALREADY_REGISTERED =    AUDCLNT_SUCCESS(0x002);
69 enum AUDCLNT_S_POSITION_STALLED =             AUDCLNT_SUCCESS(0x003);
70 
71 enum AUDCLNT_BUFFERFLAGS_DATA_DISCONTINUITY	= 0x1;
72 enum AUDCLNT_BUFFERFLAGS_SILENT	= 0x2;
73 enum AUDCLNT_BUFFERFLAGS_TIMESTAMP_ERROR	= 0x4;
74 
75 // IUnknown
76 struct IUnknown {
77     IUnknownVtable* lpVtbl;
78 }
79 
80 struct IUnknownVtable {
81     private alias This_ = IUnknown*;
82     extern(Windows): @nogc: nothrow:
83     HRESULT function(This_, REFIID riid, void **ppvObject) QueryInterface;
84     ULONG function(This_, ) AddRef;
85     ULONG function(This_, ) Release;
86 }
87 
88 ULONG IUnknown_AddRef(T)(T* x) {return x.lpVtbl.AddRef(x);}
89 ULONG IUnknown_Release(T)(T* x) {return x.lpVtbl.Release(x);}
90 
91 // MMNotificationClient /////////////////////////////////////////////////////////////
92 struct IMMNotificationClient {
93     IMMNotificationClientVtbl* lpVtbl;
94 }
95 
96 struct IMMNotificationClientVtbl {
97     private alias THIS_ = IMMNotificationClient*;
98     extern(Windows): @nogc: nothrow:
99     HRESULT function(THIS_ client, REFIID riid, void** ppv) QueryInterface;
100     uint function(THIS_ client) AddRef;
101     uint function(THIS_ client) Release;
102     HRESULT function(THIS_ client, LPCWSTR wid, DWORD state) OnDeviceStateChanged;
103     HRESULT function(THIS_ client, LPCWSTR wid) OnDeviceAdded;
104     HRESULT function(THIS_ client, LPCWSTR wid) OnDeviceRemoved;
105     HRESULT function(THIS_ client, EDataFlow flow, ERole role, LPCWSTR wid) OnDefaultDeviceChange;
106     HRESULT function(THIS_ client, LPCWSTR wid, const(PROPERTYKEY) key) OnPropertyValueChanged;
107 }
108 
109 // MMDevice /////////////////////////////////////////////////////////////
110 struct IMMDevice {
111     IMMDeviceVtable* lpVtbl;
112 }
113 
114 struct IMMDeviceVtable {
115     extern(Windows): @nogc: nothrow:
116     alias This_ = IMMDevice*;
117     HRESULT function(This_, REFIID riid, void **ppvObject) QueryInterface;
118     ULONG function(This_, ) AddRef;
119     ULONG function(This_, ) Release;
120     HRESULT function(This_, REFIID iid, DWORD dwClsCtx, PROPVARIANT *pActivationParams, void **ppInterface) Activate;
121     HRESULT function(This_, DWORD stgmAccess, IPropertyStore **ppProperties) OpenPropertyStore;
122     HRESULT function(This_, LPWSTR *ppstrId) GetId;
123     HRESULT function(This_, DWORD *pdwState) GetState;
124 }
125 HRESULT IMMDevice_QueryInterface(T)(T* this_, REFIID riid, void **ppvObject) {return this_.lpVtbl.QueryInterface(this_,riid, ppvObject);}
126 ULONG IMMDevice_AddRef(T)(T* this_, ) {return this_.lpVtbl.AddRef(this_,);}
127 ULONG IMMDevice_Release(T)(T* this_, ) {return this_.lpVtbl.Release(this_,);}
128 HRESULT IMMDevice_Activate(T)(T* this_, REFIID iid, DWORD dwClsCtx, PROPVARIANT *pActivationParams, void **ppInterface) {return this_.lpVtbl.Activate(this_,iid, dwClsCtx, pActivationParams, ppInterface);}
129 HRESULT IMMDevice_OpenPropertyStore(T)(T* this_, DWORD stgmAccess, IPropertyStore **ppProperties) {return this_.lpVtbl.OpenPropertyStore(this_,stgmAccess, ppProperties);}
130 HRESULT IMMDevice_GetId(T)(T* this_, LPWSTR *ppstrId) {return this_.lpVtbl.GetId(this_,ppstrId);}
131 HRESULT IMMDevice_GetState(T)(T* this_, DWORD *pdwState) {return this_.lpVtbl.GetState(this_,pdwState);}
132 
133 // MMDeviceEnumerator /////////////////////////////////////////////////////////////
134 struct IMMDeviceEnumerator {
135     IMMDeviceEnumeratorVtable* lpVtbl;
136 }
137 
138 struct IMMDeviceEnumeratorVtable {
139     extern(Windows): @nogc: nothrow:
140     alias This_ = IMMDeviceEnumerator*;
141     HRESULT function(This_, REFIID riid, void **ppvObject) QueryInterface;
142     ULONG function(This_, ) AddRef;
143     ULONG function(This_, ) Release;
144     HRESULT function(This_, EDataFlow dataFlow, DWORD dwStateMask, IMMDeviceCollection **ppDevices) EnumAudioEndpoints;
145     HRESULT function(This_, EDataFlow dataFlow, ERole role, IMMDevice **ppEndpoint) GetDefaultAudioEndpoint;
146     HRESULT function(This_, LPCWSTR pwstrId, IMMDevice **ppDevice) GetDevice;
147     HRESULT function(This_, IMMNotificationClient *pClient) RegisterEndpointNotificationCallback;
148     HRESULT function(This_, IMMNotificationClient *pClient) UnregisterEndpointNotificationCallback;
149 }
150 HRESULT IMMDeviceEnumerator_QueryInterface(T)(T* this_, REFIID riid, void **ppvObject) {return this_.lpVtbl.QueryInterface(this_,riid, ppvObject);}
151 ULONG IMMDeviceEnumerator_AddRef(T)(T* this_, ) {return this_.lpVtbl.AddRef(this_,);}
152 ULONG IMMDeviceEnumerator_Release(T)(T* this_, ) {return this_.lpVtbl.Release(this_,);}
153 HRESULT IMMDeviceEnumerator_EnumAudioEndpoints(T)(T* this_, EDataFlow dataFlow, DWORD dwStateMask, IMMDeviceCollection **ppDevices) {return this_.lpVtbl.EnumAudioEndpoints(this_,dataFlow, dwStateMask, ppDevices);}
154 HRESULT IMMDeviceEnumerator_GetDefaultAudioEndpoint(T)(T* this_, EDataFlow dataFlow, ERole role, IMMDevice **ppEndpoint) {return this_.lpVtbl.GetDefaultAudioEndpoint(this_,dataFlow, role, ppEndpoint);}
155 HRESULT IMMDeviceEnumerator_GetDevice(T)(T* this_, LPCWSTR pwstrId, IMMDevice **ppDevice) {return this_.lpVtbl.GetDevice(this_,pwstrId, ppDevice);}
156 HRESULT IMMDeviceEnumerator_RegisterEndpointNotificationCallback(T)(T* this_, IMMNotificationClient *pClient) {return this_.lpVtbl.RegisterEndpointNotificationCallback(this_,pClient);}
157 HRESULT IMMDeviceEnumerator_UnregisterEndpointNotificationCallback(T)(T* this_, IMMNotificationClient *pClient) {return this_.lpVtbl.UnregisterEndpointNotificationCallback(this_,pClient);}
158 
159 struct IAudioSessionEvents;
160 struct AudioSessionState;
161 
162 // AudioClockAdjustment //////////////////////////////////
163 struct IAudioClockAdjustment {
164     IAudioClockAdjustmentVtable* lpVtbl;
165 }
166 
167 struct IAudioClockAdjustmentVtable {
168     private alias This_ = IAudioClockAdjustment*;
169     extern(Windows): @nogc: nothrow:
170     HRESULT function(This_, REFIID riid, void **ppvObject) QueryInterface;
171     ULONG function(This_, ) AddRef;
172     ULONG function(This_, ) Release;
173     // there's more, not translated yet
174 }
175 
176 // SimpleAudioVolume /////////////////////////////////////
177 struct ISimpleAudioVolume {
178     ISimpleAudioVolumeVtable* lpVtbl;
179 }
180 
181 struct ISimpleAudioVolumeVtable {
182     extern(Windows): @nogc: nothrow:
183     alias This_ = ISimpleAudioVolume*;
184     HRESULT function(This_, REFIID riid, void **ppvObject) QueryInterface;
185     ULONG function(This_, ) AddRef;
186     ULONG function(This_, ) Release;
187     HRESULT function(This_, float fLevel, LPCGUID EventContext) SetMasterVolume;
188     HRESULT function(This_, float *pfLevel) GetMasterVolume;
189     HRESULT function(This_, BOOL bMute, LPCGUID EventContext) SetMute;
190     HRESULT function(This_, BOOL *pbMute) GetMute;
191 }
192 HRESULT ISimpleAudioVolume_QueryInterface(T)(T* this_, REFIID riid, void **ppvObject) {return this_.lpVtbl.QueryInterface(this_,riid, ppvObject);}
193 ULONG ISimpleAudioVolume_AddRef(T)(T* this_, ) {return this_.lpVtbl.AddRef(this_,);}
194 ULONG ISimpleAudioVolume_Release(T)(T* this_, ) {return this_.lpVtbl.Release(this_,);}
195 HRESULT ISimpleAudioVolume_SetMasterVolume(T)(T* this_, float fLevel, LPCGUID EventContext) {return this_.lpVtbl.SetMasterVolume(this_,fLevel, EventContext);}
196 HRESULT ISimpleAudioVolume_GetMasterVolume(T)(T* this_, float *pfLevel) {return this_.lpVtbl.GetMasterVolume(this_,pfLevel);}
197 HRESULT ISimpleAudioVolume_SetMute(T)(T* this_, BOOL bMute, LPCGUID EventContext) {return this_.lpVtbl.SetMute(this_,bMute, EventContext);}
198 HRESULT ISimpleAudioVolume_GetMute(T)(T* this_, BOOL *pbMute) {return this_.lpVtbl.GetMute(this_,pbMute);}
199 
200 // AudioRenderClient //////////////////////////////////////
201 struct IAudioRenderClient {
202     IAudioRenderClientVtable* lpVtbl;
203 }
204 
205 struct IAudioRenderClientVtable {
206     extern(Windows): @nogc: nothrow:
207     alias This_ = IAudioRenderClient*;
208     HRESULT function(This_, REFIID riid, void **ppvObject) QueryInterface;
209     ULONG function(This_, ) AddRef;
210     ULONG function(This_, ) Release;
211     HRESULT function(This_, UINT32 NumFramesRequested, BYTE **ppData) GetBuffer;
212     HRESULT function(This_, UINT32 NumFramesWritten, DWORD dwFlags) ReleaseBuffer;
213 }
214 HRESULT IAudioRenderClient_QueryInterface(T)(T* this_, REFIID riid, void **ppvObject) {return this_.lpVtbl.QueryInterface(this_,riid, ppvObject);}
215 ULONG IAudioRenderClient_AddRef(T)(T* this_, ) {return this_.lpVtbl.AddRef(this_,);}
216 ULONG IAudioRenderClient_Release(T)(T* this_, ) {return this_.lpVtbl.Release(this_,);}
217 HRESULT IAudioRenderClient_GetBuffer(T)(T* this_, UINT32 NumFramesRequested, BYTE **ppData) {return this_.lpVtbl.GetBuffer(this_,NumFramesRequested, ppData);}
218 HRESULT IAudioRenderClient_ReleaseBuffer(T)(T* this_, UINT32 NumFramesWritten, DWORD dwFlags) {return this_.lpVtbl.ReleaseBuffer(this_,NumFramesWritten, dwFlags);}
219 
220 // MMDeviceCollection //////////////////////////////////////
221 struct IMMDeviceCollection {
222     IMMDeviceCollectionVtable* lpVtbl;
223 }
224 
225 struct IMMDeviceCollectionVtable {
226     extern(Windows): @nogc: nothrow:
227     alias This_ = IMMDeviceCollection*;
228     HRESULT function(This_, REFIID riid, void **ppvObject) QueryInterface;
229     ULONG function(This_, ) AddRef;
230     ULONG function(This_, ) Release;
231     HRESULT function(This_, UINT *pcDevices) GetCount;
232     HRESULT function(This_, UINT nDevice, IMMDevice **ppDevice) Item;
233 }
234 HRESULT IMMDeviceCollection_QueryInterface(T)(T* this_, REFIID riid, void **ppvObject) {return this_.lpVtbl.QueryInterface(this_,riid, ppvObject);}
235 ULONG IMMDeviceCollection_AddRef(T)(T* this_, ) {return this_.lpVtbl.AddRef(this_,);}
236 ULONG IMMDeviceCollection_Release(T)(T* this_, ) {return this_.lpVtbl.Release(this_,);}
237 HRESULT IMMDeviceCollection_GetCount(T)(T* this_, UINT *pcDevices) {return this_.lpVtbl.GetCount(this_,pcDevices);}
238 HRESULT IMMDeviceCollection_Item(T)(T* this_, UINT nDevice, IMMDevice **ppDevice) {return this_.lpVtbl.Item(this_,nDevice, ppDevice);}
239 
240 // AudioCaptureClient ////////////////////////////////
241 struct IAudioCaptureClient {
242     IAudioCaptureClientVtable* lpVtbl;
243 }
244 
245 struct IAudioCaptureClientVtable {
246     extern(Windows): @nogc: nothrow:
247     alias This_ = IAudioCaptureClient*;
248     HRESULT function(This_, REFIID riid, void **ppvObject) QueryInterface;
249     ULONG function(This_, ) AddRef;
250     ULONG function(This_, ) Release;
251     HRESULT function(This_, BYTE **ppData, UINT32 *pNumFramesToRead, DWORD *pdwFlags, UINT64 *pu64DevicePosition, UINT64 *pu64QPCPosition) GetBuffer;
252     HRESULT function(This_, UINT32 NumFramesRead) ReleaseBuffer;
253     HRESULT function(This_, UINT32 *pNumFramesInNextPacket) GetNextPacketSize;
254 }
255 HRESULT IAudioCaptureClient_QueryInterface(T)(T* this_, REFIID riid, void **ppvObject) {return this_.lpVtbl.QueryInterface(this_,riid, ppvObject);}
256 ULONG IAudioCaptureClient_AddRef(T)(T* this_, ) {return this_.lpVtbl.AddRef(this_,);}
257 ULONG IAudioCaptureClient_Release(T)(T* this_, ) {return this_.lpVtbl.Release(this_,);}
258 HRESULT IAudioCaptureClient_GetBuffer(T)(T* this_, BYTE **ppData, UINT32 *pNumFramesToRead, DWORD *pdwFlags, UINT64 *pu64DevicePosition, UINT64 *pu64QPCPosition) {return this_.lpVtbl.GetBuffer(this_,ppData, pNumFramesToRead, pdwFlags, pu64DevicePosition, pu64QPCPosition);}
259 HRESULT IAudioCaptureClient_ReleaseBuffer(T)(T* this_, UINT32 NumFramesRead) {return this_.lpVtbl.ReleaseBuffer(this_,NumFramesRead);}
260 HRESULT IAudioCaptureClient_GetNextPacketSize(T)(T* this_, UINT32 *pNumFramesInNextPacket) {return this_.lpVtbl.GetNextPacketSize(this_,pNumFramesInNextPacket);}
261 
262 // PropertyStore //////////////////////////////
263 struct IPropertyStore {
264     IPropertyStoreVtable* lpVtbl;
265 }
266 
267 struct IPropertyStoreVtable {
268     extern(Windows): @nogc: nothrow:
269     alias This_ = IPropertyStore*;
270     HRESULT function(This_, REFIID riid, void **ppvObject) QueryInterface;
271     ULONG function(This_, ) AddRef;
272     ULONG function(This_, ) Release;
273     HRESULT function(This_, DWORD *cProps) GetCount;
274     HRESULT function(This_, DWORD iProp, PROPERTYKEY *pkey) GetAt;
275     HRESULT function(This_, PROPERTYKEY* key, PROPVARIANT *pv) GetValue;
276     HRESULT function(This_, PROPERTYKEY* key, PROPVARIANT* propvar) SetValue;
277     HRESULT function(This_, ) Commit;
278 }
279 HRESULT IPropertyStore_QueryInterface(T)(T* this_, REFIID riid, void **ppvObject) {return this_.lpVtbl.QueryInterface(this_,riid, ppvObject);}
280 ULONG IPropertyStore_AddRef(T)(T* this_, ) {return this_.lpVtbl.AddRef(this_,);}
281 ULONG IPropertyStore_Release(T)(T* this_, ) {return this_.lpVtbl.Release(this_,);}
282 HRESULT IPropertyStore_GetCount(T)(T* this_, DWORD *cProps) {return this_.lpVtbl.GetCount(this_,cProps);}
283 HRESULT IPropertyStore_GetAt(T)(T* this_, DWORD iProp, PROPERTYKEY *pkey) {return this_.lpVtbl.GetAt(this_,iProp, pkey);}
284 HRESULT IPropertyStore_GetValue(T)(T* this_, PROPERTYKEY* key, PROPVARIANT *pv) {return this_.lpVtbl.GetValue(this_,key, pv);}
285 HRESULT IPropertyStore_SetValue(T)(T* this_, PROPERTYKEY* key, PROPVARIANT* propvar) {return this_.lpVtbl.SetValue(this_,key, propvar);}
286 HRESULT IPropertyStore_Commit(T)(T* this_, ) {return this_.lpVtbl.Commit(this_,);}
287 
288 // MMEndpoint //////////////////////////////
289 struct IMMEndpoint {
290     IMMEndpointVtable* lpVtbl;
291 }
292 
293 struct IMMEndpointVtable {
294     extern(Windows): @nogc: nothrow:
295     alias This_ = IMMEndpoint*;
296     HRESULT function(This_, REFIID riid, void **ppvObject) QueryInterface;
297     ULONG function(This_, ) AddRef;
298     ULONG function(This_, ) Release;
299     HRESULT function(This_, EDataFlow *pDataFlow) GetDataFlow;
300 }
301 HRESULT IMMEndpoint_QueryInterface(T)(T* this_, REFIID riid, void **ppvObject) {return this_.lpVtbl.QueryInterface(this_,riid, ppvObject);}
302 ULONG IMMEndpoint_AddRef(T)(T* this_, ) {return this_.lpVtbl.AddRef(this_,);}
303 ULONG IMMEndpoint_Release(T)(T* this_, ) {return this_.lpVtbl.Release(this_,);}
304 HRESULT IMMEndpoint_GetDataFlow(T)(T* this_, EDataFlow *pDataFlow) {return this_.lpVtbl.GetDataFlow(this_,pDataFlow);}
305 
306 // Audio Client //////////////////////////////
307 struct IAudioClient {
308     IAudioClientVtable* lpVtbl;
309 }
310 
311 struct IAudioClientVtable {
312     extern(Windows): @nogc: nothrow:
313     alias This_ = IAudioClient*;
314     HRESULT function(This_, REFIID riid, void **ppvObject) QueryInterface;
315     ULONG function(This_, ) AddRef;
316     ULONG function(This_, ) Release;
317     HRESULT function(This_, AUDCLNT_SHAREMODE ShareMode, DWORD StreamFlags, REFERENCE_TIME hnsBufferDuration, REFERENCE_TIME hnsPeriodicity, WAVEFORMATEX *pFormat, LPCGUID AudioSessionGuid) Initialize;
318     HRESULT function(This_, UINT32 *pNumBufferFrames) GetBufferSize;
319     HRESULT function(This_, REFERENCE_TIME *phnsLatency) GetStreamLatency;
320     HRESULT function(This_, UINT32 *pNumPaddingFrames) GetCurrentPadding;
321     HRESULT function(This_, AUDCLNT_SHAREMODE ShareMode, WAVEFORMATEX *pFormat, WAVEFORMATEX **ppClosestMatch) IsFormatSupported;
322     HRESULT function(This_, WAVEFORMATEX **ppDeviceFormat) GetMixFormat;
323     HRESULT function(This_, REFERENCE_TIME *phnsDefaultDevicePeriod, REFERENCE_TIME *phnsMinimumDevicePeriod) GetDevicePeriod;
324     HRESULT function(This_, ) Start;
325     HRESULT function(This_, ) Stop;
326     HRESULT function(This_, ) Reset;
327     HRESULT function(This_, HANDLE eventHandle) SetEventHandle;
328     HRESULT function(This_, REFIID riid, void **ppv) GetService;
329 }
330 HRESULT IAudioClient_QueryInterface(T)(T* this_, REFIID riid, void **ppvObject) {return this_.lpVtbl.QueryInterface(this_,riid, ppvObject);}
331 ULONG IAudioClient_AddRef(T)(T* this_, ) {return this_.lpVtbl.AddRef(this_,);}
332 ULONG IAudioClient_Release(T)(T* this_, ) {return this_.lpVtbl.Release(this_,);}
333 HRESULT IAudioClient_Initialize(T)(T* this_, AUDCLNT_SHAREMODE ShareMode, DWORD StreamFlags, REFERENCE_TIME hnsBufferDuration, REFERENCE_TIME hnsPeriodicity, WAVEFORMATEX *pFormat, LPCGUID AudioSessionGuid) {return this_.lpVtbl.Initialize(this_,ShareMode, StreamFlags, hnsBufferDuration, hnsPeriodicity, pFormat, AudioSessionGuid);}
334 HRESULT IAudioClient_GetBufferSize(T)(T* this_, UINT32 *pNumBufferFrames) {return this_.lpVtbl.GetBufferSize(this_,pNumBufferFrames);}
335 HRESULT IAudioClient_GetStreamLatency(T)(T* this_, REFERENCE_TIME *phnsLatency) {return this_.lpVtbl.GetStreamLatency(this_,phnsLatency);}
336 HRESULT IAudioClient_GetCurrentPadding(T)(T* this_, UINT32 *pNumPaddingFrames) {return this_.lpVtbl.GetCurrentPadding(this_,pNumPaddingFrames);}
337 HRESULT IAudioClient_IsFormatSupported(T)(T* this_, AUDCLNT_SHAREMODE ShareMode, WAVEFORMATEX *pFormat, WAVEFORMATEX **ppClosestMatch) {return this_.lpVtbl.IsFormatSupported(this_,ShareMode, pFormat, ppClosestMatch);}
338 HRESULT IAudioClient_GetMixFormat(T)(T* this_, WAVEFORMATEX **ppDeviceFormat) {return this_.lpVtbl.GetMixFormat(this_,ppDeviceFormat);}
339 HRESULT IAudioClient_GetDevicePeriod(T)(T* this_, REFERENCE_TIME *phnsDefaultDevicePeriod, REFERENCE_TIME *phnsMinimumDevicePeriod) {return this_.lpVtbl.GetDevicePeriod(this_,phnsDefaultDevicePeriod, phnsMinimumDevicePeriod);}
340 HRESULT IAudioClient_Start(T)(T* this_, ) {return this_.lpVtbl.Start(this_,);}
341 HRESULT IAudioClient_Stop(T)(T* this_, ) {return this_.lpVtbl.Stop(this_,);}
342 HRESULT IAudioClient_Reset(T)(T* this_, ) {return this_.lpVtbl.Reset(this_,);}
343 HRESULT IAudioClient_SetEventHandle(T)(T* this_, HANDLE eventHandle) {return this_.lpVtbl.SetEventHandle(this_,eventHandle);}
344 HRESULT IAudioClient_GetService(T)(T* this_, REFIID riid, void **ppv) {return this_.lpVtbl.GetService(this_,riid, ppv);}
345 
346 // AudioSessionControl ///////////////////////
347 struct IAudioSessionControl {
348     IAudioSessionControlVtable* lpVtbl;
349 }
350 
351 struct IAudioSessionControlVtable {
352     extern(Windows): @nogc: nothrow:
353     alias This_ = IAudioSessionControl*;
354     HRESULT function(This_, REFIID riid, void **ppvObject) QueryInterface;
355     ULONG function(This_, ) AddRef;
356     ULONG function(This_, ) Release;
357     HRESULT function(This_, AudioSessionState *pRetVal) GetState;
358     HRESULT function(This_, LPWSTR *pRetVal) GetDisplayName;
359     HRESULT function(This_, LPCWSTR Value, LPCGUID EventContext) SetDisplayName;
360     HRESULT function(This_, LPWSTR *pRetVal) GetIconPath;
361     HRESULT function(This_, LPCWSTR Value, LPCGUID EventContext) SetIconPath;
362     HRESULT function(This_, GUID *pRetVal) GetGroupingParam;
363     HRESULT function(This_, LPCGUID Override, LPCGUID EventContext) SetGroupingParam;
364     HRESULT function(This_, IAudioSessionEvents *NewNotifications) RegisterAudioSessionNotification;
365     HRESULT function(This_, IAudioSessionEvents *NewNotifications) UnregisterAudioSessionNotification;
366 }
367 HRESULT IAudioSessionControl_QueryInterface(T)(T* this_, REFIID riid, void **ppvObject) {return this_.lpVtbl.QueryInterface(this_,riid, ppvObject);}
368 ULONG IAudioSessionControl_AddRef(T)(T* this_, ) {return this_.lpVtbl.AddRef(this_,);}
369 ULONG IAudioSessionControl_Release(T)(T* this_, ) {return this_.lpVtbl.Release(this_,);}
370 HRESULT IAudioSessionControl_GetState(T)(T* this_, AudioSessionState *pRetVal) {return this_.lpVtbl.GetState(this_,pRetVal);}
371 HRESULT IAudioSessionControl_GetDisplayName(T)(T* this_, LPWSTR *pRetVal) {return this_.lpVtbl.GetDisplayName(this_,pRetVal);}
372 HRESULT IAudioSessionControl_SetDisplayName(T)(T* this_, LPCWSTR Value, LPCGUID EventContext) {return this_.lpVtbl.SetDisplayName(this_,Value, EventContext);}
373 HRESULT IAudioSessionControl_GetIconPath(T)(T* this_, LPWSTR *pRetVal) {return this_.lpVtbl.GetIconPath(this_,pRetVal);}
374 HRESULT IAudioSessionControl_SetIconPath(T)(T* this_, LPCWSTR Value, LPCGUID EventContext) {return this_.lpVtbl.SetIconPath(this_,Value, EventContext);}
375 HRESULT IAudioSessionControl_GetGroupingParam(T)(T* this_, GUID *pRetVal) {return this_.lpVtbl.GetGroupingParam(this_,pRetVal);}
376 HRESULT IAudioSessionControl_SetGroupingParam(T)(T* this_, LPCGUID Override, LPCGUID EventContext) {return this_.lpVtbl.SetGroupingParam(this_,Override, EventContext);}
377 HRESULT IAudioSessionControl_RegisterAudioSessionNotification(T)(T* this_, IAudioSessionEvents *NewNotifications) {return this_.lpVtbl.RegisterAudioSessionNotification(this_,NewNotifications);}
378 HRESULT IAudioSessionControl_UnregisterAudioSessionNotification(T)(T* this_, IAudioSessionEvents *NewNotifications) {return this_.lpVtbl.UnregisterAudioSessionNotification(this_,NewNotifications);}
379 
380 // PropVariant /////////////////////////
381 HRESULT PropVariantClear(PROPVARIANT* pvar);
382 pragma(inline, true) void PropVariantInit(PROPVARIANT* pvar ) {
383     import core.stdc.string: memset;
384     memset(pvar, 0, PROPVARIANT.sizeof);
385 }
386 
387 struct BLOB {
388     ULONG cbSize;
389     BYTE *pBlobData;
390 }
391 
392 struct PROPVARIANT {
393     ushort vt; // VARTYPE
394     ushort wReserved1;
395     ushort wReserved2;
396     ushort wReserved3;
397     union {
398         CHAR cVal;
399         UCHAR bVal;
400         SHORT iVal;
401         USHORT uiVal;
402         LONG lVal;
403         ULONG ulVal;
404         INT intVal;
405         UINT uintVal;
406         LARGE_INTEGER hVal;
407         ULARGE_INTEGER uhVal;
408         FLOAT fltVal;
409         // ... many more omitted
410         LPWSTR pwszVal;
411         BLOB blob;
412     }
413 }
414 static assert(PROPVARIANT.sizeof == (size_t.sizeof == 4) ? 16 : 24);
415 static assert(PROPVARIANT.pwszVal.offsetof == 8);
416 
417 alias REFERENCE_TIME = long;
418 
419 struct PROPERTYKEY {
420     GUID fmtid;
421     DWORD pid;
422 }
423 
424 PROPERTYKEY PKEY_Device_FriendlyName = PROPERTYKEY(
425     GUID(0xa45c254e, 0xdf1c, 0x4efd, [0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0]),
426     14
427 );
428 
429 PROPERTYKEY PKEY_AudioEngine_DeviceFormat = PROPERTYKEY(
430     GUID(0xf19f064d, 0x82c, 0x4e27, [0xbc, 0x73, 0x68, 0x82, 0xa1, 0xbb, 0x8e, 0x4c]),
431     0
432 );
433 
434 enum WAVE_FORMAT_EXTENSIBLE = 0xFFFE;
435 
436 struct WAVEFORMATEX {
437     align(2):
438     WORD  wFormatTag;
439     WORD  nChannels;
440     DWORD nSamplesPerSec;
441     DWORD nAvgBytesPerSec;
442     WORD  nBlockAlign;
443     WORD  wBitsPerSample;
444     WORD  cbSize;
445 }
446 static assert(WAVEFORMATEX.sizeof == 18);
447 
448 struct WAVEFORMATEXTENSIBLE {
449     WAVEFORMATEX    Format;
450     struct USamples {
451         union {
452             WORD wValidBitsPerSample;
453             WORD wSamplesPerBlock;
454             WORD wReserved;
455         }
456     }
457     USamples Samples;
458     DWORD           dwChannelMask;
459     GUID            SubFormat;
460 }
461 
462 static assert(WAVEFORMATEXTENSIBLE.sizeof == 40);
463 
464 alias AUDCLNT_SHAREMODE = int; // C enum
465 enum {
466     AUDCLNT_SHAREMODE_SHARED,
467     AUDCLNT_SHAREMODE_EXCLUSIVE
468 }
469 
470 alias EDataFlow = int;
471 enum {
472     eRender	= 0,
473     eCapture = ( eRender + 1 ) ,
474     eAll = ( eCapture + 1 ) ,
475     EDataFlow_enum_count	= ( eAll + 1 )
476 }
477 alias ERole = int;
478 enum {
479     eConsole	= 0,
480     eMultimedia	= ( eConsole + 1 ) ,
481     eCommunications	= ( eMultimedia + 1 ) ,
482     ERole_enum_count	= ( eCommunications + 1 )
483 }
484 
485 // ksmedia.h
486 enum SPEAKER_FRONT_LEFT            = 0x1;
487 enum SPEAKER_FRONT_RIGHT           = 0x2;
488 enum SPEAKER_FRONT_CENTER          = 0x4;
489 enum SPEAKER_LOW_FREQUENCY         = 0x8;
490 enum SPEAKER_BACK_LEFT             = 0x10;
491 enum SPEAKER_BACK_RIGHT            = 0x20;
492 enum SPEAKER_FRONT_LEFT_OF_CENTER  = 0x40;
493 enum SPEAKER_FRONT_RIGHT_OF_CENTER = 0x80;
494 enum SPEAKER_BACK_CENTER           = 0x100;
495 enum SPEAKER_SIDE_LEFT             = 0x200;
496 enum SPEAKER_SIDE_RIGHT            = 0x400;
497 enum SPEAKER_TOP_CENTER            = 0x800;
498 enum SPEAKER_TOP_FRONT_LEFT        = 0x1000;
499 enum SPEAKER_TOP_FRONT_CENTER      = 0x2000;
500 enum SPEAKER_TOP_FRONT_RIGHT       = 0x4000;
501 enum SPEAKER_TOP_BACK_LEFT         = 0x8000;
502 enum SPEAKER_TOP_BACK_CENTER       = 0x10000;
503 enum SPEAKER_TOP_BACK_RIGHT        = 0x20000;