xaudio2.hpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. #pragma once
  2. //ruby-specific header to provide mingw-friendly xaudio2 interfaces
  3. //64-bit GCC fix
  4. #define GUID_EXT EXTERN_C
  5. #define GUID_SECT
  6. #include <audioclient.h>
  7. #include <basetyps.h>
  8. #define DEFINE_GUID_X(n,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) GUID_EXT const GUID n GUID_SECT = {l, w1, w2, {b1, b2, b3, b4, b5, b6, b7, b8}}
  9. #define DEFINE_CLSID_X(className, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
  10. DEFINE_GUID_X(CLSID_##className, 0x##l, 0x##w1, 0x##w2, 0x##b1, 0x##b2, 0x##b3, 0x##b4, 0x##b5, 0x##b6, 0x##b7, 0x##b8)
  11. #define DEFINE_IID_X(interfaceName, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
  12. DEFINE_GUID_X(IID_##interfaceName, 0x##l, 0x##w1, 0x##w2, 0x##b1, 0x##b2, 0x##b3, 0x##b4, 0x##b5, 0x##b6, 0x##b7, 0x##b8)
  13. #define X2DEFAULT(x) = x
  14. DEFINE_CLSID_X(XAudio2, e21a7345, eb21, 468e, be, 50, 80, 4d, b9, 7c, f7, 08);
  15. DEFINE_CLSID_X(XAudio2_Debug, f7a76c21, 53d4, 46bb, ac, 53, 8b, 45, 9c, ae, 46, bd);
  16. DEFINE_IID_X(IXAudio2, 8bcf1f58, 9fe7, 4583, 8a, c6, e2, ad, c4, 65, c8, bb);
  17. DECLARE_INTERFACE(IXAudio2Voice);
  18. #define XAUDIO2_COMMIT_NOW 0
  19. #define XAUDIO2_DEFAULT_CHANNELS 0
  20. #define XAUDIO2_DEFAULT_SAMPLERATE 0
  21. #define XAUDIO2_DEFAULT_FREQ_RATIO 4.0f
  22. #define XAUDIO2_DEBUG_ENGINE 0x0001
  23. #define XAUDIO2_VOICE_NOSRC 0x0004
  24. typedef enum XAUDIO2_DEVICE_ROLE {
  25. NotDefaultDevice = 0x0,
  26. DefaultConsoleDevice = 0x1,
  27. DefaultMultimediaDevice = 0x2,
  28. DefaultCommunicationsDevice = 0x4,
  29. DefaultGameDevice = 0x8,
  30. GlobalDefaultDevice = 0xf,
  31. InvalidDeviceRole = ~GlobalDefaultDevice,
  32. } XAUDIO2_DEVICE_ROLE;
  33. typedef struct XAUDIO2_DEVICE_DETAILS {
  34. WCHAR DeviceID[256];
  35. WCHAR DisplayName[256];
  36. XAUDIO2_DEVICE_ROLE Role;
  37. WAVEFORMATEXTENSIBLE OutputFormat;
  38. } XAUDIO2_DEVICE_DETAILS;
  39. typedef struct XAUDIO2_VOICE_DETAILS {
  40. UINT32 CreationFlags;
  41. UINT32 InputChannels;
  42. UINT32 InputSampleRate;
  43. } XAUDIO2_VOICE_DETAILS;
  44. typedef enum XAUDIO2_WINDOWS_PROCESSOR_SPECIFIER {
  45. Processor1 = 0x00000001,
  46. Processor2 = 0x00000002,
  47. Processor3 = 0x00000004,
  48. Processor4 = 0x00000008,
  49. Processor5 = 0x00000010,
  50. Processor6 = 0x00000020,
  51. Processor7 = 0x00000040,
  52. Processor8 = 0x00000080,
  53. Processor9 = 0x00000100,
  54. Processor10 = 0x00000200,
  55. Processor11 = 0x00000400,
  56. Processor12 = 0x00000800,
  57. Processor13 = 0x00001000,
  58. Processor14 = 0x00002000,
  59. Processor15 = 0x00004000,
  60. Processor16 = 0x00008000,
  61. Processor17 = 0x00010000,
  62. Processor18 = 0x00020000,
  63. Processor19 = 0x00040000,
  64. Processor20 = 0x00080000,
  65. Processor21 = 0x00100000,
  66. Processor22 = 0x00200000,
  67. Processor23 = 0x00400000,
  68. Processor24 = 0x00800000,
  69. Processor25 = 0x01000000,
  70. Processor26 = 0x02000000,
  71. Processor27 = 0x04000000,
  72. Processor28 = 0x08000000,
  73. Processor29 = 0x10000000,
  74. Processor30 = 0x20000000,
  75. Processor31 = 0x40000000,
  76. Processor32 = 0x80000000,
  77. XAUDIO2_ANY_PROCESSOR = 0xffffffff,
  78. XAUDIO2_DEFAULT_PROCESSOR = XAUDIO2_ANY_PROCESSOR,
  79. } XAUDIO2_WINDOWS_PROCESSOR_SPECIFIER, XAUDIO2_PROCESSOR;
  80. typedef struct XAUDIO2_VOICE_SENDS {
  81. UINT32 OutputCount;
  82. IXAudio2Voice** pOutputVoices;
  83. } XAUDIO2_VOICE_SENDS;
  84. typedef struct XAUDIO2_EFFECT_DESCRIPTOR {
  85. IUnknown* pEffect;
  86. BOOL InitialState;
  87. UINT32 OutputChannels;
  88. } XAUDIO2_EFFECT_DESCRIPTOR;
  89. typedef struct XAUDIO2_EFFECT_CHAIN {
  90. UINT32 EffectCount;
  91. const XAUDIO2_EFFECT_DESCRIPTOR* pEffectDescriptors;
  92. } XAUDIO2_EFFECT_CHAIN;
  93. typedef enum XAUDIO2_FILTER_TYPE {
  94. LowPassFilter,
  95. BandPassFilter,
  96. HighPassFilter,
  97. } XAUDIO2_FILTER_TYPE;
  98. typedef struct XAUDIO2_FILTER_PARAMETERS {
  99. XAUDIO2_FILTER_TYPE Type;
  100. float Frequency;
  101. float OneOverQ;
  102. } XAUDIO2_FILTER_PARAMETERS;
  103. typedef struct XAUDIO2_BUFFER {
  104. UINT32 Flags;
  105. UINT32 AudioBytes;
  106. const BYTE* pAudioData;
  107. UINT32 PlayBegin;
  108. UINT32 PlayLength;
  109. UINT32 LoopBegin;
  110. UINT32 LoopLength;
  111. UINT32 LoopCount;
  112. void* pContext;
  113. } XAUDIO2_BUFFER;
  114. typedef struct XAUDIO2_BUFFER_WMA {
  115. const UINT32* pDecodedPacketCumulativeBytes;
  116. UINT32 PacketCount;
  117. } XAUDIO2_BUFFER_WMA;
  118. typedef struct XAUDIO2_VOICE_STATE {
  119. void* pCurrentBufferContext;
  120. UINT32 BuffersQueued;
  121. UINT64 SamplesPlayed;
  122. } XAUDIO2_VOICE_STATE;
  123. typedef struct XAUDIO2_PERFORMANCE_DATA {
  124. UINT64 AudioCyclesSinceLastQuery;
  125. UINT64 TotalCyclesSinceLastQuery;
  126. UINT32 MinimumCyclesPerQuantum;
  127. UINT32 MaximumCyclesPerQuantum;
  128. UINT32 MemoryUsageInBytes;
  129. UINT32 CurrentLatencyInSamples;
  130. UINT32 GlitchesSinceEngineStarted;
  131. UINT32 ActiveSourceVoiceCount;
  132. UINT32 TotalSourceVoiceCount;
  133. UINT32 ActiveSubmixVoiceCount;
  134. UINT32 TotalSubmixVoiceCount;
  135. UINT32 ActiveXmaSourceVoices;
  136. UINT32 ActiveXmaStreams;
  137. } XAUDIO2_PERFORMANCE_DATA;
  138. typedef struct XAUDIO2_DEBUG_CONFIGURATION {
  139. UINT32 TraceMask;
  140. UINT32 BreakMask;
  141. BOOL LogThreadID;
  142. BOOL LogFileline;
  143. BOOL LogFunctionName;
  144. BOOL LogTiming;
  145. } XAUDIO2_DEBUG_CONFIGURATION;
  146. DECLARE_INTERFACE(IXAudio2EngineCallback) {
  147. STDMETHOD_(void, OnProcessingPassStart) (THIS) PURE;
  148. STDMETHOD_(void, OnProcessingPassEnd) (THIS) PURE;
  149. STDMETHOD_(void, OnCriticalError) (THIS_ HRESULT Error) PURE;
  150. };
  151. DECLARE_INTERFACE(IXAudio2VoiceCallback) {
  152. STDMETHOD_(void, OnVoiceProcessingPassStart) (THIS_ UINT32 BytesRequired) PURE;
  153. STDMETHOD_(void, OnVoiceProcessingPassEnd) (THIS) PURE;
  154. STDMETHOD_(void, OnStreamEnd) (THIS) PURE;
  155. STDMETHOD_(void, OnBufferStart) (THIS_ void* pBufferContext) PURE;
  156. STDMETHOD_(void, OnBufferEnd) (THIS_ void* pBufferContext) PURE;
  157. STDMETHOD_(void, OnLoopEnd) (THIS_ void* pBufferContext) PURE;
  158. STDMETHOD_(void, OnVoiceError) (THIS_ void* pBufferContext, HRESULT Error) PURE;
  159. };
  160. DECLARE_INTERFACE(IXAudio2Voice) {
  161. #define Declare_IXAudio2Voice_Methods() \
  162. STDMETHOD_(void, GetVoiceDetails) (THIS_ XAUDIO2_VOICE_DETAILS* pVoiceDetails) PURE; \
  163. STDMETHOD(SetOutputVoices) (THIS_ const XAUDIO2_VOICE_SENDS* pSendList) PURE; \
  164. STDMETHOD(SetEffectChain) (THIS_ const XAUDIO2_EFFECT_CHAIN* pEffectChain) PURE; \
  165. STDMETHOD(EnableEffect) (THIS_ UINT32 EffectIndex, \
  166. UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \
  167. STDMETHOD(DisableEffect) (THIS_ UINT32 EffectIndex, \
  168. UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \
  169. STDMETHOD_(void, GetEffectState) (THIS_ UINT32 EffectIndex, BOOL* pEnabled) PURE; \
  170. STDMETHOD(SetEffectParameters) (THIS_ UINT32 EffectIndex, \
  171. const void* pParameters, \
  172. UINT32 ParametersByteSize, \
  173. UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \
  174. STDMETHOD(GetEffectParameters) (THIS_ UINT32 EffectIndex, void* pParameters, \
  175. UINT32 ParametersByteSize) PURE; \
  176. STDMETHOD(SetFilterParameters) (THIS_ const XAUDIO2_FILTER_PARAMETERS* pParameters, \
  177. UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \
  178. STDMETHOD_(void, GetFilterParameters) (THIS_ XAUDIO2_FILTER_PARAMETERS* pParameters) PURE; \
  179. STDMETHOD(SetVolume) (THIS_ float Volume, \
  180. UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \
  181. STDMETHOD_(void, GetVolume) (THIS_ float* pVolume) PURE; \
  182. STDMETHOD(SetChannelVolumes) (THIS_ UINT32 Channels, const float* pVolumes, \
  183. UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \
  184. STDMETHOD_(void, GetChannelVolumes) (THIS_ UINT32 Channels, float* pVolumes) PURE; \
  185. STDMETHOD(SetOutputMatrix) (THIS_ IXAudio2Voice* pDestinationVoice, \
  186. UINT32 SourceChannels, UINT32 DestinationChannels, \
  187. const float* pLevelMatrix, \
  188. UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \
  189. STDMETHOD_(void, GetOutputMatrix) (THIS_ IXAudio2Voice* pDestinationVoice, \
  190. UINT32 SourceChannels, UINT32 DestinationChannels, \
  191. float* pLevelMatrix) PURE; \
  192. STDMETHOD_(void, DestroyVoice) (THIS) PURE
  193. Declare_IXAudio2Voice_Methods();
  194. };
  195. DECLARE_INTERFACE_(IXAudio2MasteringVoice, IXAudio2Voice) {
  196. Declare_IXAudio2Voice_Methods();
  197. };
  198. DECLARE_INTERFACE_(IXAudio2SubmixVoice, IXAudio2Voice) {
  199. Declare_IXAudio2Voice_Methods();
  200. };
  201. DECLARE_INTERFACE_(IXAudio2SourceVoice, IXAudio2Voice) {
  202. Declare_IXAudio2Voice_Methods();
  203. STDMETHOD(Start) (THIS_ UINT32 Flags, UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE;
  204. STDMETHOD(Stop) (THIS_ UINT32 Flags, UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE;
  205. STDMETHOD(SubmitSourceBuffer) (THIS_ const XAUDIO2_BUFFER* pBuffer, const XAUDIO2_BUFFER_WMA* pBufferWMA X2DEFAULT(NULL)) PURE;
  206. STDMETHOD(FlushSourceBuffers) (THIS) PURE;
  207. STDMETHOD(Discontinuity) (THIS) PURE;
  208. STDMETHOD(ExitLoop) (THIS_ UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE;
  209. STDMETHOD_(void, GetState) (THIS_ XAUDIO2_VOICE_STATE* pVoiceState) PURE;
  210. STDMETHOD(SetFrequencyRatio) (THIS_ float Ratio,
  211. UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE;
  212. STDMETHOD_(void, GetFrequencyRatio) (THIS_ float* pRatio) PURE;
  213. };
  214. DECLARE_INTERFACE_(IXAudio2, IUnknown) {
  215. STDMETHOD(QueryInterface) (THIS_ REFIID riid, void** ppvInterface) PURE;
  216. STDMETHOD_(ULONG, AddRef) (THIS) PURE;
  217. STDMETHOD_(ULONG, Release) (THIS) PURE;
  218. STDMETHOD(GetDeviceCount) (THIS_ UINT32* pCount) PURE;
  219. STDMETHOD(GetDeviceDetails) (THIS_ UINT32 Index, XAUDIO2_DEVICE_DETAILS* pDeviceDetails) PURE;
  220. STDMETHOD(Initialize) (THIS_ UINT32 Flags X2DEFAULT(0),
  221. XAUDIO2_PROCESSOR XAudio2Processor X2DEFAULT(XAUDIO2_DEFAULT_PROCESSOR)) PURE;
  222. STDMETHOD(RegisterForCallbacks) (IXAudio2EngineCallback* pCallback) PURE;
  223. STDMETHOD_(void, UnregisterForCallbacks) (IXAudio2EngineCallback* pCallback) PURE;
  224. STDMETHOD(CreateSourceVoice) (THIS_ IXAudio2SourceVoice** ppSourceVoice,
  225. const WAVEFORMATEX* pSourceFormat,
  226. UINT32 Flags X2DEFAULT(0),
  227. float MaxFrequencyRatio X2DEFAULT(XAUDIO2_DEFAULT_FREQ_RATIO),
  228. IXAudio2VoiceCallback* pCallback X2DEFAULT(NULL),
  229. const XAUDIO2_VOICE_SENDS* pSendList X2DEFAULT(NULL),
  230. const XAUDIO2_EFFECT_CHAIN* pEffectChain X2DEFAULT(NULL)) PURE;
  231. STDMETHOD(CreateSubmixVoice) (THIS_ IXAudio2SubmixVoice** ppSubmixVoice,
  232. UINT32 InputChannels, UINT32 InputSampleRate,
  233. UINT32 Flags X2DEFAULT(0), UINT32 ProcessingStage X2DEFAULT(0),
  234. const XAUDIO2_VOICE_SENDS* pSendList X2DEFAULT(NULL),
  235. const XAUDIO2_EFFECT_CHAIN* pEffectChain X2DEFAULT(NULL)) PURE;
  236. STDMETHOD(CreateMasteringVoice) (THIS_ IXAudio2MasteringVoice** ppMasteringVoice,
  237. UINT32 InputChannels X2DEFAULT(XAUDIO2_DEFAULT_CHANNELS),
  238. UINT32 InputSampleRate X2DEFAULT(XAUDIO2_DEFAULT_SAMPLERATE),
  239. UINT32 Flags X2DEFAULT(0), UINT32 DeviceIndex X2DEFAULT(0),
  240. const XAUDIO2_EFFECT_CHAIN* pEffectChain X2DEFAULT(NULL)) PURE;
  241. STDMETHOD(StartEngine) (THIS) PURE;
  242. STDMETHOD_(void, StopEngine) (THIS) PURE;
  243. STDMETHOD(CommitChanges) (THIS_ UINT32 OperationSet) PURE;
  244. STDMETHOD_(void, GetPerformanceData) (THIS_ XAUDIO2_PERFORMANCE_DATA* pPerfData) PURE;
  245. STDMETHOD_(void, SetDebugConfiguration) (THIS_ const XAUDIO2_DEBUG_CONFIGURATION* pDebugConfiguration,
  246. void* pReserved X2DEFAULT(NULL)) PURE;
  247. };
  248. __inline HRESULT XAudio2Create(IXAudio2** ppXAudio2, UINT32 Flags X2DEFAULT(0),
  249. XAUDIO2_PROCESSOR XAudio2Processor X2DEFAULT(XAUDIO2_DEFAULT_PROCESSOR)) {
  250. IXAudio2* pXAudio2;
  251. HRESULT hr = CoCreateInstance((Flags & XAUDIO2_DEBUG_ENGINE) ? CLSID_XAudio2_Debug : CLSID_XAudio2,
  252. NULL, CLSCTX_INPROC_SERVER, IID_IXAudio2, (void**)&pXAudio2);
  253. if(SUCCEEDED(hr)) {
  254. hr = pXAudio2->Initialize(Flags, XAudio2Processor);
  255. if(SUCCEEDED(hr)) {
  256. *ppXAudio2 = pXAudio2;
  257. } else {
  258. pXAudio2->Release();
  259. }
  260. }
  261. return hr;
  262. }