1 /* 2 Simple DirectMedia Layer 3 Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> 4 5 This software is provided 'as-is', without any express or implied 6 warranty. In no event will the authors be held liable for any damages 7 arising from the use of this software. 8 9 Permission is granted to anyone to use this software for any purpose, 10 including commercial applications, and to alter it and redistribute it 11 freely, subject to the following restrictions: 12 13 1. The origin of this software must not be misrepresented; you must not 14 claim that you wrote the original software. If you use this software 15 in a product, an acknowledgment in the product documentation would be 16 appreciated but is not required. 17 2. Altered source versions must be plainly marked as such, and must not be 18 misrepresented as being the original software. 19 3. This notice may not be removed or altered from any source distribution. 20 */ 21 22 #ifndef _SDL_XAUDIO2_H 23 #define _SDL_XAUDIO2_H 24 25 #include <windows.h> 26 #include <mmreg.h> 27 #include <objbase.h> 28 29 /* XAudio2 packs its structure members together as tightly as possible. 30 This pragma is needed to ensure compatibility with XAudio2 on 64-bit 31 platforms. 32 */ 33 #pragma pack(push, 1) 34 35 typedef interface IXAudio2 IXAudio2; 36 typedef interface IXAudio2SourceVoice IXAudio2SourceVoice; 37 typedef interface IXAudio2MasteringVoice IXAudio2MasteringVoice; 38 typedef interface IXAudio2EngineCallback IXAudio2EngineCallback; 39 typedef interface IXAudio2VoiceCallback IXAudio2VoiceCallback; 40 typedef interface IXAudio2Voice IXAudio2Voice; 41 typedef interface IXAudio2SubmixVoice IXAudio2SubmixVoice; 42 43 typedef enum _AUDIO_STREAM_CATEGORY { 44 AudioCategory_Other = 0, 45 AudioCategory_ForegroundOnlyMedia, 46 AudioCategory_BackgroundCapableMedia, 47 AudioCategory_Communications, 48 AudioCategory_Alerts, 49 AudioCategory_SoundEffects, 50 AudioCategory_GameEffects, 51 AudioCategory_GameMedia, 52 AudioCategory_GameChat, 53 AudioCategory_Movie, 54 AudioCategory_Media 55 } AUDIO_STREAM_CATEGORY; 56 57 typedef struct XAUDIO2_BUFFER { 58 UINT32 Flags; 59 UINT32 AudioBytes; 60 const BYTE *pAudioData; 61 UINT32 PlayBegin; 62 UINT32 PlayLength; 63 UINT32 LoopBegin; 64 UINT32 LoopLength; 65 UINT32 LoopCount; 66 void *pContext; 67 } XAUDIO2_BUFFER; 68 69 typedef struct XAUDIO2_BUFFER_WMA { 70 const UINT32 *pDecodedPacketCumulativeBytes; 71 UINT32 PacketCount; 72 } XAUDIO2_BUFFER_WMA; 73 74 typedef struct XAUDIO2_SEND_DESCRIPTOR { 75 UINT32 Flags; 76 IXAudio2Voice *pOutputVoice; 77 } XAUDIO2_SEND_DESCRIPTOR; 78 79 typedef struct XAUDIO2_VOICE_SENDS { 80 UINT32 SendCount; 81 XAUDIO2_SEND_DESCRIPTOR *pSends; 82 } XAUDIO2_VOICE_SENDS; 83 84 typedef struct XAUDIO2_EFFECT_DESCRIPTOR { 85 IUnknown *pEffect; 86 BOOL InitialState; 87 UINT32 OutputChannels; 88 } XAUDIO2_EFFECT_DESCRIPTOR; 89 90 typedef struct XAUDIO2_EFFECT_CHAIN { 91 UINT32 EffectCount; 92 XAUDIO2_EFFECT_DESCRIPTOR *pEffectDescriptors; 93 } XAUDIO2_EFFECT_CHAIN; 94 95 typedef struct XAUDIO2_PERFORMANCE_DATA { 96 UINT64 AudioCyclesSinceLastQuery; 97 UINT64 TotalCyclesSinceLastQuery; 98 UINT32 MinimumCyclesPerQuantum; 99 UINT32 MaximumCyclesPerQuantum; 100 UINT32 MemoryUsageInBytes; 101 UINT32 CurrentLatencyInSamples; 102 UINT32 GlitchesSinceEngineStarted; 103 UINT32 ActiveSourceVoiceCount; 104 UINT32 TotalSourceVoiceCount; 105 UINT32 ActiveSubmixVoiceCount; 106 UINT32 ActiveResamplerCount; 107 UINT32 ActiveMatrixMixCount; 108 UINT32 ActiveXmaSourceVoices; 109 UINT32 ActiveXmaStreams; 110 } XAUDIO2_PERFORMANCE_DATA; 111 112 typedef struct XAUDIO2_DEBUG_CONFIGURATION { 113 UINT32 TraceMask; 114 UINT32 BreakMask; 115 BOOL LogThreadID; 116 BOOL LogFileline; 117 BOOL LogFunctionName; 118 BOOL LogTiming; 119 } XAUDIO2_DEBUG_CONFIGURATION; 120 121 typedef struct XAUDIO2_VOICE_DETAILS { 122 UINT32 CreationFlags; 123 UINT32 ActiveFlags; 124 UINT32 InputChannels; 125 UINT32 InputSampleRate; 126 } XAUDIO2_VOICE_DETAILS; 127 128 typedef enum XAUDIO2_FILTER_TYPE { 129 LowPassFilter = 0, 130 BandPassFilter = 1, 131 HighPassFilter = 2, 132 NotchFilter = 3, 133 LowPassOnePoleFilter = 4, 134 HighPassOnePoleFilter = 5 135 } XAUDIO2_FILTER_TYPE; 136 137 typedef struct XAUDIO2_FILTER_PARAMETERS { 138 XAUDIO2_FILTER_TYPE Type; 139 float Frequency; 140 float OneOverQ; 141 } XAUDIO2_FILTER_PARAMETERS; 142 143 typedef struct XAUDIO2_VOICE_STATE { 144 void *pCurrentBufferContext; 145 UINT32 BuffersQueued; 146 UINT64 SamplesPlayed; 147 } XAUDIO2_VOICE_STATE; 148 149 150 typedef UINT32 XAUDIO2_PROCESSOR; 151 #define Processor1 0x00000001 152 #define XAUDIO2_DEFAULT_PROCESSOR Processor1 153 154 #define XAUDIO2_E_DEVICE_INVALIDATED 0x88960004 155 #define XAUDIO2_COMMIT_NOW 0 156 #define XAUDIO2_VOICE_NOSAMPLESPLAYED 0x0100 157 #define XAUDIO2_DEFAULT_CHANNELS 0 158 159 extern HRESULT __stdcall XAudio2Create( 160 _Out_ IXAudio2 **ppXAudio2, 161 _In_ UINT32 Flags, 162 _In_ XAUDIO2_PROCESSOR XAudio2Processor 163 ); 164 165 #undef INTERFACE 166 #define INTERFACE IXAudio2 167 typedef interface IXAudio2 { 168 const struct IXAudio2Vtbl FAR* lpVtbl; 169 } IXAudio2; 170 typedef const struct IXAudio2Vtbl IXAudio2Vtbl; 171 const struct IXAudio2Vtbl 172 { 173 /* IUnknown */ 174 STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE; 175 STDMETHOD_(ULONG, AddRef)(THIS) PURE; 176 STDMETHOD_(ULONG, Release)(THIS) PURE; 177 178 /* IXAudio2 */ 179 STDMETHOD_(HRESULT, RegisterForCallbacks)(THIS, IXAudio2EngineCallback *pCallback) PURE; 180 STDMETHOD_(VOID, UnregisterForCallbacks)(THIS, IXAudio2EngineCallback *pCallback) PURE; 181 STDMETHOD_(HRESULT, CreateSourceVoice)(THIS, IXAudio2SourceVoice **ppSourceVoice, 182 const WAVEFORMATEX *pSourceFormat, 183 UINT32 Flags, 184 float MaxFrequencyRatio, 185 IXAudio2VoiceCallback *pCallback, 186 const XAUDIO2_VOICE_SENDS *pSendList, 187 const XAUDIO2_EFFECT_CHAIN *pEffectChain) PURE; 188 STDMETHOD_(HRESULT, CreateSubmixVoice)(THIS, IXAudio2SubmixVoice **ppSubmixVoice, 189 UINT32 InputChannels, 190 UINT32 InputSampleRate, 191 UINT32 Flags, 192 UINT32 ProcessingStage, 193 const XAUDIO2_VOICE_SENDS *pSendList, 194 const XAUDIO2_EFFECT_CHAIN *pEffectChain) PURE; 195 STDMETHOD_(HRESULT, CreateMasteringVoice)(THIS, IXAudio2MasteringVoice **ppMasteringVoice, 196 UINT32 InputChannels, 197 UINT32 InputSampleRate, 198 UINT32 Flags, 199 LPCWSTR szDeviceId, 200 const XAUDIO2_EFFECT_CHAIN *pEffectChain, 201 AUDIO_STREAM_CATEGORY StreamCategory) PURE; 202 STDMETHOD_(HRESULT, StartEngine)(THIS) PURE; 203 STDMETHOD_(VOID, StopEngine)(THIS) PURE; 204 STDMETHOD_(HRESULT, CommitChanges)(THIS, UINT32 OperationSet) PURE; 205 STDMETHOD_(HRESULT, GetPerformanceData)(THIS, XAUDIO2_PERFORMANCE_DATA *pPerfData) PURE; 206 STDMETHOD_(HRESULT, SetDebugConfiguration)(THIS, XAUDIO2_DEBUG_CONFIGURATION *pDebugConfiguration, 207 VOID *pReserved) PURE; 208 }; 209 210 #define IXAudio2_Release(A) ((A)->lpVtbl->Release(A)) 211 #define IXAudio2_CreateSourceVoice(A,B,C,D,E,F,G,H) ((A)->lpVtbl->CreateSourceVoice(A,B,C,D,E,F,G,H)) 212 #define IXAudio2_CreateMasteringVoice(A,B,C,D,E,F,G,H) ((A)->lpVtbl->CreateMasteringVoice(A,B,C,D,E,F,G,H)) 213 #define IXAudio2_StartEngine(A) ((A)->lpVtbl->StartEngine(A)) 214 #define IXAudio2_StopEngine(A) ((A)->lpVtbl->StopEngine(A)) 215 216 217 #undef INTERFACE 218 #define INTERFACE IXAudio2SourceVoice 219 typedef interface IXAudio2SourceVoice { 220 const struct IXAudio2SourceVoiceVtbl FAR* lpVtbl; 221 } IXAudio2SourceVoice; 222 typedef const struct IXAudio2SourceVoiceVtbl IXAudio2SourceVoiceVtbl; 223 const struct IXAudio2SourceVoiceVtbl 224 { 225 /* MSDN says that IXAudio2Voice inherits from IXAudio2, but MSVC's debugger 226 * says otherwise, and that IXAudio2Voice doesn't inherit from any other 227 * interface! 228 */ 229 230 /* IXAudio2Voice */ 231 STDMETHOD_(VOID, GetVoiceDetails)(THIS, XAUDIO2_VOICE_DETAILS *pVoiceDetails) PURE; 232 STDMETHOD_(HRESULT, SetOutputVoices)(THIS, const XAUDIO2_VOICE_SENDS *pSendList) PURE; 233 STDMETHOD_(HRESULT, SetEffectChain)(THIS, const XAUDIO2_EFFECT_CHAIN *pEffectChain) PURE; 234 STDMETHOD_(HRESULT, EnableEffect)(THIS, UINT32 EffectIndex, UINT32 OperationSet) PURE; 235 STDMETHOD_(HRESULT, DisableEffect)(THIS, UINT32 EffectIndex, UINT32 OperationSet) PURE; 236 STDMETHOD_(VOID, GetEffectState)(THIS, UINT32 EffectIndex, BOOL *pEnabled) PURE; 237 STDMETHOD_(HRESULT, SetEffectParameters)(THIS, UINT32 EffectIndex, 238 const void *pParameters, 239 UINT32 ParametersByteSize, 240 UINT32 OperationSet) PURE; 241 STDMETHOD_(VOID, GetEffectParameters)(THIS, UINT32 EffectIndex, 242 void *pParameters, 243 UINT32 ParametersByteSize) PURE; 244 STDMETHOD_(HRESULT, SetFilterParameters)(THIS, const XAUDIO2_FILTER_PARAMETERS *pParameters, 245 UINT32 OperationSet) PURE; 246 STDMETHOD_(VOID, GetFilterParameters)(THIS, XAUDIO2_FILTER_PARAMETERS *pParameters) PURE; 247 STDMETHOD_(HRESULT, SetOutputFilterParameters)(THIS, IXAudio2Voice *pDestinationVoice, 248 XAUDIO2_FILTER_PARAMETERS *pParameters, 249 UINT32 OperationSet) PURE; 250 STDMETHOD_(VOID, GetOutputFilterParameters)(THIS, IXAudio2Voice *pDestinationVoice, 251 XAUDIO2_FILTER_PARAMETERS *pParameters) PURE; 252 STDMETHOD_(HRESULT, SetVolume)(THIS, float Volume, 253 UINT32 OperationSet) PURE; 254 STDMETHOD_(VOID, GetVolume)(THIS, float *pVolume) PURE; 255 STDMETHOD_(HRESULT, SetChannelVolumes)(THIS, UINT32 Channels, 256 const float *pVolumes, 257 UINT32 OperationSet) PURE; 258 STDMETHOD_(VOID, GetChannelVolumes)(THIS, UINT32 Channels, 259 float *pVolumes) PURE; 260 STDMETHOD_(HRESULT, SetOutputMatrix)(THIS, IXAudio2Voice *pDestinationVoice, 261 UINT32 SourceChannels, 262 UINT32 DestinationChannels, 263 const float *pLevelMatrix, 264 UINT32 OperationSet) PURE; 265 STDMETHOD_(VOID, GetOutputMatrix)(THIS, IXAudio2Voice *pDestinationVoice, 266 UINT32 SourceChannels, 267 UINT32 DestinationChannels, 268 float *pLevelMatrix) PURE; 269 STDMETHOD_(VOID, DestroyVoice)(THIS) PURE; 270 271 /* IXAudio2SourceVoice */ 272 STDMETHOD_(HRESULT, Start)(THIS, UINT32 Flags, 273 UINT32 OperationSet) PURE; 274 STDMETHOD_(HRESULT, Stop)(THIS, UINT32 Flags, 275 UINT32 OperationSet) PURE; 276 STDMETHOD_(HRESULT, SubmitSourceBuffer)(THIS, const XAUDIO2_BUFFER *pBuffer, 277 const XAUDIO2_BUFFER_WMA *pBufferWMA) PURE; 278 STDMETHOD_(HRESULT, FlushSourceBuffers)(THIS) PURE; 279 STDMETHOD_(HRESULT, Discontinuity)(THIS) PURE; 280 STDMETHOD_(HRESULT, ExitLoop)(THIS, UINT32 OperationSet) PURE; 281 STDMETHOD_(VOID, GetState)(THIS, XAUDIO2_VOICE_STATE *pVoiceState, 282 UINT32 Flags) PURE; 283 STDMETHOD_(HRESULT, SetFrequencyRatio)(THIS, float Ratio, 284 UINT32 OperationSet) PURE; 285 STDMETHOD_(VOID, GetFrequencyRatio)(THIS, float *pRatio) PURE; 286 STDMETHOD_(HRESULT, SetSourceSampleRate)(THIS, UINT32 NewSourceSampleRate) PURE; 287 }; 288 289 #define IXAudio2SourceVoice_DestroyVoice(A) ((A)->lpVtbl->DestroyVoice(A)) 290 #define IXAudio2SourceVoice_Start(A,B,C) ((A)->lpVtbl->Start(A,B,C)) 291 #define IXAudio2SourceVoice_Stop(A,B,C) ((A)->lpVtbl->Stop(A,B,C)) 292 #define IXAudio2SourceVoice_SubmitSourceBuffer(A,B,C) ((A)->lpVtbl->SubmitSourceBuffer(A,B,C)) 293 #define IXAudio2SourceVoice_FlushSourceBuffers(A) ((A)->lpVtbl->FlushSourceBuffers(A)) 294 #define IXAudio2SourceVoice_Discontinuity(A) ((A)->lpVtbl->Discontinuity(A)) 295 #define IXAudio2SourceVoice_GetState(A,B,C) ((A)->lpVtbl->GetState(A,B,C)) 296 297 298 #undef INTERFACE 299 #define INTERFACE IXAudio2MasteringVoice 300 typedef interface IXAudio2MasteringVoice { 301 const struct IXAudio2MasteringVoiceVtbl FAR* lpVtbl; 302 } IXAudio2MasteringVoice; 303 typedef const struct IXAudio2MasteringVoiceVtbl IXAudio2MasteringVoiceVtbl; 304 const struct IXAudio2MasteringVoiceVtbl 305 { 306 /* MSDN says that IXAudio2Voice inherits from IXAudio2, but MSVC's debugger 307 * says otherwise, and that IXAudio2Voice doesn't inherit from any other 308 * interface! 309 */ 310 311 /* IXAudio2Voice */ 312 STDMETHOD_(VOID, GetVoiceDetails)(THIS, XAUDIO2_VOICE_DETAILS *pVoiceDetails) PURE; 313 STDMETHOD_(HRESULT, SetOutputVoices)(THIS, const XAUDIO2_VOICE_SENDS *pSendList) PURE; 314 STDMETHOD_(HRESULT, SetEffectChain)(THIS, const XAUDIO2_EFFECT_CHAIN *pEffectChain) PURE; 315 STDMETHOD_(HRESULT, EnableEffect)(THIS, UINT32 EffectIndex, UINT32 OperationSet) PURE; 316 STDMETHOD_(HRESULT, DisableEffect)(THIS, UINT32 EffectIndex, UINT32 OperationSet) PURE; 317 STDMETHOD_(VOID, GetEffectState)(THIS, UINT32 EffectIndex, BOOL *pEnabled) PURE; 318 STDMETHOD_(HRESULT, SetEffectParameters)(THIS, UINT32 EffectIndex, 319 const void *pParameters, 320 UINT32 ParametersByteSize, 321 UINT32 OperationSet) PURE; 322 STDMETHOD_(VOID, GetEffectParameters)(THIS, UINT32 EffectIndex, 323 void *pParameters, 324 UINT32 ParametersByteSize) PURE; 325 STDMETHOD_(HRESULT, SetFilterParameters)(THIS, const XAUDIO2_FILTER_PARAMETERS *pParameters, 326 UINT32 OperationSet) PURE; 327 STDMETHOD_(VOID, GetFilterParameters)(THIS, XAUDIO2_FILTER_PARAMETERS *pParameters) PURE; 328 STDMETHOD_(HRESULT, SetOutputFilterParameters)(THIS, IXAudio2Voice *pDestinationVoice, 329 XAUDIO2_FILTER_PARAMETERS *pParameters, 330 UINT32 OperationSet) PURE; 331 STDMETHOD_(VOID, GetOutputFilterParameters)(THIS, IXAudio2Voice *pDestinationVoice, 332 XAUDIO2_FILTER_PARAMETERS *pParameters) PURE; 333 STDMETHOD_(HRESULT, SetVolume)(THIS, float Volume, 334 UINT32 OperationSet) PURE; 335 STDMETHOD_(VOID, GetVolume)(THIS, float *pVolume) PURE; 336 STDMETHOD_(HRESULT, SetChannelVolumes)(THIS, UINT32 Channels, 337 const float *pVolumes, 338 UINT32 OperationSet) PURE; 339 STDMETHOD_(VOID, GetChannelVolumes)(THIS, UINT32 Channels, 340 float *pVolumes) PURE; 341 STDMETHOD_(HRESULT, SetOutputMatrix)(THIS, IXAudio2Voice *pDestinationVoice, 342 UINT32 SourceChannels, 343 UINT32 DestinationChannels, 344 const float *pLevelMatrix, 345 UINT32 OperationSet) PURE; 346 STDMETHOD_(VOID, GetOutputMatrix)(THIS, IXAudio2Voice *pDestinationVoice, 347 UINT32 SourceChannels, 348 UINT32 DestinationChannels, 349 float *pLevelMatrix) PURE; 350 STDMETHOD_(VOID, DestroyVoice)(THIS) PURE; 351 352 /* IXAudio2SourceVoice */ 353 STDMETHOD_(VOID, GetChannelMask)(THIS, DWORD *pChannelMask) PURE; 354 }; 355 356 #define IXAudio2MasteringVoice_DestroyVoice(A) ((A)->lpVtbl->DestroyVoice(A)) 357 358 359 #undef INTERFACE 360 #define INTERFACE IXAudio2VoiceCallback 361 typedef interface IXAudio2VoiceCallback { 362 const struct IXAudio2VoiceCallbackVtbl FAR* lpVtbl; 363 } IXAudio2VoiceCallback; 364 typedef const struct IXAudio2VoiceCallbackVtbl IXAudio2VoiceCallbackVtbl; 365 const struct IXAudio2VoiceCallbackVtbl 366 { 367 /* MSDN says that IXAudio2VoiceCallback inherits from IXAudio2, but SDL's 368 * own code says otherwise, and that IXAudio2VoiceCallback doesn't inherit 369 * from any other interface! 370 */ 371 372 /* IXAudio2VoiceCallback */ 373 STDMETHOD_(VOID, OnVoiceProcessingPassStart)(THIS, UINT32 BytesRequired) PURE; 374 STDMETHOD_(VOID, OnVoiceProcessingPassEnd)(THIS) PURE; 375 STDMETHOD_(VOID, OnStreamEnd)(THIS) PURE; 376 STDMETHOD_(VOID, OnBufferStart)(THIS, void *pBufferContext) PURE; 377 STDMETHOD_(VOID, OnBufferEnd)(THIS, void *pBufferContext) PURE; 378 STDMETHOD_(VOID, OnLoopEnd)(THIS, void *pBufferContext) PURE; 379 STDMETHOD_(VOID, OnVoiceError)(THIS, void *pBufferContext, HRESULT Error) PURE; 380 }; 381 382 #pragma pack(pop) /* Undo pragma push */ 383 384 #endif /* _SDL_XAUDIO2_H */ 385 386 /* vi: set ts=4 sw=4 expandtab: */ 387