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;