File: xaudio2.hpp

package info (click to toggle)
ares 134%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 34,680 kB
  • sloc: cpp: 338,717; ansic: 89,036; sh: 52; makefile: 27
file content (292 lines) | stat: -rw-r--r-- 11,373 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
#pragma once

//ruby-specific header to provide mingw-friendly xaudio2 interfaces

//64-bit GCC fix
#define GUID_EXT EXTERN_C
#define GUID_SECT

#include <audioclient.h>
#include <basetyps.h>

#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}}
#define DEFINE_CLSID_X(className, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
  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)
#define DEFINE_IID_X(interfaceName, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
  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)
#define X2DEFAULT(x) = x

DEFINE_CLSID_X(XAudio2, e21a7345, eb21, 468e, be, 50, 80, 4d, b9, 7c, f7, 08);
DEFINE_CLSID_X(XAudio2_Debug, f7a76c21, 53d4, 46bb, ac, 53, 8b, 45, 9c, ae, 46, bd);
DEFINE_IID_X(IXAudio2, 8bcf1f58, 9fe7, 4583, 8a, c6, e2, ad, c4, 65, c8, bb);

DECLARE_INTERFACE(IXAudio2Voice);

#define XAUDIO2_COMMIT_NOW          0
#define XAUDIO2_DEFAULT_CHANNELS    0
#define XAUDIO2_DEFAULT_SAMPLERATE  0
#define XAUDIO2_DEFAULT_FREQ_RATIO  4.0f
#define XAUDIO2_DEBUG_ENGINE        0x0001
#define XAUDIO2_VOICE_NOSRC         0x0004

typedef enum XAUDIO2_DEVICE_ROLE {
  NotDefaultDevice            = 0x0,
  DefaultConsoleDevice        = 0x1,
  DefaultMultimediaDevice     = 0x2,
  DefaultCommunicationsDevice = 0x4,
  DefaultGameDevice           = 0x8,
  GlobalDefaultDevice         = 0xf,
  InvalidDeviceRole = ~GlobalDefaultDevice,
} XAUDIO2_DEVICE_ROLE;

typedef struct XAUDIO2_DEVICE_DETAILS {
  WCHAR DeviceID[256];
  WCHAR DisplayName[256];
  XAUDIO2_DEVICE_ROLE Role;
  WAVEFORMATEXTENSIBLE OutputFormat;
} XAUDIO2_DEVICE_DETAILS;

typedef struct XAUDIO2_VOICE_DETAILS {
  UINT32 CreationFlags;
  UINT32 InputChannels;
  UINT32 InputSampleRate;
} XAUDIO2_VOICE_DETAILS;

typedef enum XAUDIO2_WINDOWS_PROCESSOR_SPECIFIER {
  Processor1  = 0x00000001,
  Processor2  = 0x00000002,
  Processor3  = 0x00000004,
  Processor4  = 0x00000008,
  Processor5  = 0x00000010,
  Processor6  = 0x00000020,
  Processor7  = 0x00000040,
  Processor8  = 0x00000080,
  Processor9  = 0x00000100,
  Processor10 = 0x00000200,
  Processor11 = 0x00000400,
  Processor12 = 0x00000800,
  Processor13 = 0x00001000,
  Processor14 = 0x00002000,
  Processor15 = 0x00004000,
  Processor16 = 0x00008000,
  Processor17 = 0x00010000,
  Processor18 = 0x00020000,
  Processor19 = 0x00040000,
  Processor20 = 0x00080000,
  Processor21 = 0x00100000,
  Processor22 = 0x00200000,
  Processor23 = 0x00400000,
  Processor24 = 0x00800000,
  Processor25 = 0x01000000,
  Processor26 = 0x02000000,
  Processor27 = 0x04000000,
  Processor28 = 0x08000000,
  Processor29 = 0x10000000,
  Processor30 = 0x20000000,
  Processor31 = 0x40000000,
  Processor32 = 0x80000000,
  XAUDIO2_ANY_PROCESSOR = 0xffffffff,
  XAUDIO2_DEFAULT_PROCESSOR = XAUDIO2_ANY_PROCESSOR,
} XAUDIO2_WINDOWS_PROCESSOR_SPECIFIER, XAUDIO2_PROCESSOR;

typedef struct XAUDIO2_VOICE_SENDS {
  UINT32 OutputCount;
  IXAudio2Voice** pOutputVoices;
} XAUDIO2_VOICE_SENDS;

typedef struct XAUDIO2_EFFECT_DESCRIPTOR {
  IUnknown* pEffect;
  BOOL InitialState;
  UINT32 OutputChannels;
} XAUDIO2_EFFECT_DESCRIPTOR;

typedef struct XAUDIO2_EFFECT_CHAIN {
  UINT32 EffectCount;
  const XAUDIO2_EFFECT_DESCRIPTOR* pEffectDescriptors;
} XAUDIO2_EFFECT_CHAIN;

typedef enum XAUDIO2_FILTER_TYPE {
  LowPassFilter,
  BandPassFilter,
  HighPassFilter,
} XAUDIO2_FILTER_TYPE;

typedef struct XAUDIO2_FILTER_PARAMETERS {
  XAUDIO2_FILTER_TYPE Type;
  float Frequency;
  float OneOverQ;
} XAUDIO2_FILTER_PARAMETERS;

typedef struct XAUDIO2_BUFFER {
  UINT32 Flags;
  UINT32 AudioBytes;
  const BYTE* pAudioData;
  UINT32 PlayBegin;
  UINT32 PlayLength;
  UINT32 LoopBegin;
  UINT32 LoopLength;
  UINT32 LoopCount;
  void* pContext;
} XAUDIO2_BUFFER;

typedef struct XAUDIO2_BUFFER_WMA {
  const UINT32* pDecodedPacketCumulativeBytes;
  UINT32 PacketCount;
} XAUDIO2_BUFFER_WMA;

typedef struct XAUDIO2_VOICE_STATE {
  void* pCurrentBufferContext;
  UINT32 BuffersQueued;
  UINT64 SamplesPlayed;
} XAUDIO2_VOICE_STATE;

typedef struct XAUDIO2_PERFORMANCE_DATA {
  UINT64 AudioCyclesSinceLastQuery;
  UINT64 TotalCyclesSinceLastQuery;
  UINT32 MinimumCyclesPerQuantum;
  UINT32 MaximumCyclesPerQuantum;
  UINT32 MemoryUsageInBytes;
  UINT32 CurrentLatencyInSamples;
  UINT32 GlitchesSinceEngineStarted;
  UINT32 ActiveSourceVoiceCount;
  UINT32 TotalSourceVoiceCount;
  UINT32 ActiveSubmixVoiceCount;
  UINT32 TotalSubmixVoiceCount;
  UINT32 ActiveXmaSourceVoices;
  UINT32 ActiveXmaStreams;
} XAUDIO2_PERFORMANCE_DATA;

typedef struct XAUDIO2_DEBUG_CONFIGURATION {
  UINT32 TraceMask;
  UINT32 BreakMask;
  BOOL LogThreadID;
  BOOL LogFileline;
  BOOL LogFunctionName;
  BOOL LogTiming;
} XAUDIO2_DEBUG_CONFIGURATION;

DECLARE_INTERFACE(IXAudio2EngineCallback) {
  STDMETHOD_(void, OnProcessingPassStart) (THIS) PURE;
  STDMETHOD_(void, OnProcessingPassEnd) (THIS) PURE;
  STDMETHOD_(void, OnCriticalError) (THIS_ HRESULT Error) PURE;
};

DECLARE_INTERFACE(IXAudio2VoiceCallback) {
  STDMETHOD_(void, OnVoiceProcessingPassStart) (THIS_ UINT32 BytesRequired) PURE;
  STDMETHOD_(void, OnVoiceProcessingPassEnd) (THIS) PURE;
  STDMETHOD_(void, OnStreamEnd) (THIS) PURE;
  STDMETHOD_(void, OnBufferStart) (THIS_ void* pBufferContext) PURE;
  STDMETHOD_(void, OnBufferEnd) (THIS_ void* pBufferContext) PURE;
  STDMETHOD_(void, OnLoopEnd) (THIS_ void* pBufferContext) PURE;
  STDMETHOD_(void, OnVoiceError) (THIS_ void* pBufferContext, HRESULT Error) PURE;
};

DECLARE_INTERFACE(IXAudio2Voice) {
  #define Declare_IXAudio2Voice_Methods() \
  STDMETHOD_(void, GetVoiceDetails) (THIS_ XAUDIO2_VOICE_DETAILS* pVoiceDetails) PURE; \
  STDMETHOD(SetOutputVoices) (THIS_ const XAUDIO2_VOICE_SENDS* pSendList) PURE; \
  STDMETHOD(SetEffectChain) (THIS_ const XAUDIO2_EFFECT_CHAIN* pEffectChain) PURE; \
  STDMETHOD(EnableEffect) (THIS_ UINT32 EffectIndex, \
    UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \
  STDMETHOD(DisableEffect) (THIS_ UINT32 EffectIndex, \
    UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \
  STDMETHOD_(void, GetEffectState) (THIS_ UINT32 EffectIndex, BOOL* pEnabled) PURE; \
  STDMETHOD(SetEffectParameters) (THIS_ UINT32 EffectIndex, \
    const void* pParameters, \
    UINT32 ParametersByteSize, \
    UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \
  STDMETHOD(GetEffectParameters) (THIS_ UINT32 EffectIndex, void* pParameters, \
    UINT32 ParametersByteSize) PURE; \
  STDMETHOD(SetFilterParameters) (THIS_ const XAUDIO2_FILTER_PARAMETERS* pParameters, \
    UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \
  STDMETHOD_(void, GetFilterParameters) (THIS_ XAUDIO2_FILTER_PARAMETERS* pParameters) PURE; \
  STDMETHOD(SetVolume) (THIS_ float Volume, \
    UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \
  STDMETHOD_(void, GetVolume) (THIS_ float* pVolume) PURE; \
  STDMETHOD(SetChannelVolumes) (THIS_ UINT32 Channels, const float* pVolumes, \
    UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \
  STDMETHOD_(void, GetChannelVolumes) (THIS_ UINT32 Channels, float* pVolumes) PURE; \
  STDMETHOD(SetOutputMatrix) (THIS_ IXAudio2Voice* pDestinationVoice, \
    UINT32 SourceChannels, UINT32 DestinationChannels, \
    const float* pLevelMatrix, \
    UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \
  STDMETHOD_(void, GetOutputMatrix) (THIS_ IXAudio2Voice* pDestinationVoice, \
    UINT32 SourceChannels, UINT32 DestinationChannels, \
    float* pLevelMatrix) PURE; \
  STDMETHOD_(void, DestroyVoice) (THIS) PURE

  Declare_IXAudio2Voice_Methods();
};

DECLARE_INTERFACE_(IXAudio2MasteringVoice, IXAudio2Voice) {
  Declare_IXAudio2Voice_Methods();
};

DECLARE_INTERFACE_(IXAudio2SubmixVoice, IXAudio2Voice) {
  Declare_IXAudio2Voice_Methods();
};

DECLARE_INTERFACE_(IXAudio2SourceVoice, IXAudio2Voice) {
  Declare_IXAudio2Voice_Methods();
  STDMETHOD(Start) (THIS_ UINT32 Flags, UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE;
  STDMETHOD(Stop) (THIS_ UINT32 Flags, UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE;
  STDMETHOD(SubmitSourceBuffer) (THIS_ const XAUDIO2_BUFFER* pBuffer, const XAUDIO2_BUFFER_WMA* pBufferWMA X2DEFAULT(NULL)) PURE;
  STDMETHOD(FlushSourceBuffers) (THIS) PURE;
  STDMETHOD(Discontinuity) (THIS) PURE;
  STDMETHOD(ExitLoop) (THIS_ UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE;
  STDMETHOD_(void, GetState) (THIS_ XAUDIO2_VOICE_STATE* pVoiceState) PURE;
  STDMETHOD(SetFrequencyRatio) (THIS_ float Ratio,
    UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE;
  STDMETHOD_(void, GetFrequencyRatio) (THIS_ float* pRatio) PURE;
};

DECLARE_INTERFACE_(IXAudio2, IUnknown) {
  STDMETHOD(QueryInterface) (THIS_ REFIID riid, void** ppvInterface) PURE;
  STDMETHOD_(ULONG, AddRef) (THIS) PURE;
  STDMETHOD_(ULONG, Release) (THIS) PURE;
  STDMETHOD(GetDeviceCount) (THIS_ UINT32* pCount) PURE;
  STDMETHOD(GetDeviceDetails) (THIS_ UINT32 Index, XAUDIO2_DEVICE_DETAILS* pDeviceDetails) PURE;
  STDMETHOD(Initialize) (THIS_ UINT32 Flags X2DEFAULT(0),
    XAUDIO2_PROCESSOR XAudio2Processor X2DEFAULT(XAUDIO2_DEFAULT_PROCESSOR)) PURE;
  STDMETHOD(RegisterForCallbacks) (IXAudio2EngineCallback* pCallback) PURE;
  STDMETHOD_(void, UnregisterForCallbacks) (IXAudio2EngineCallback* pCallback) PURE;
  STDMETHOD(CreateSourceVoice) (THIS_ IXAudio2SourceVoice** ppSourceVoice,
    const WAVEFORMATEX* pSourceFormat,
    UINT32 Flags X2DEFAULT(0),
    float MaxFrequencyRatio X2DEFAULT(XAUDIO2_DEFAULT_FREQ_RATIO),
    IXAudio2VoiceCallback* pCallback X2DEFAULT(NULL),
    const XAUDIO2_VOICE_SENDS* pSendList X2DEFAULT(NULL),
    const XAUDIO2_EFFECT_CHAIN* pEffectChain X2DEFAULT(NULL)) PURE;
  STDMETHOD(CreateSubmixVoice) (THIS_ IXAudio2SubmixVoice** ppSubmixVoice,
    UINT32 InputChannels, UINT32 InputSampleRate,
    UINT32 Flags X2DEFAULT(0), UINT32 ProcessingStage X2DEFAULT(0),
    const XAUDIO2_VOICE_SENDS* pSendList X2DEFAULT(NULL),
    const XAUDIO2_EFFECT_CHAIN* pEffectChain X2DEFAULT(NULL)) PURE;
  STDMETHOD(CreateMasteringVoice) (THIS_ IXAudio2MasteringVoice** ppMasteringVoice,
    UINT32 InputChannels X2DEFAULT(XAUDIO2_DEFAULT_CHANNELS),
    UINT32 InputSampleRate X2DEFAULT(XAUDIO2_DEFAULT_SAMPLERATE),
    UINT32 Flags X2DEFAULT(0), UINT32 DeviceIndex X2DEFAULT(0),
    const XAUDIO2_EFFECT_CHAIN* pEffectChain X2DEFAULT(NULL)) PURE;
  STDMETHOD(StartEngine) (THIS) PURE;
  STDMETHOD_(void, StopEngine) (THIS) PURE;
  STDMETHOD(CommitChanges) (THIS_ UINT32 OperationSet) PURE;
  STDMETHOD_(void, GetPerformanceData) (THIS_ XAUDIO2_PERFORMANCE_DATA* pPerfData) PURE;
  STDMETHOD_(void, SetDebugConfiguration) (THIS_ const XAUDIO2_DEBUG_CONFIGURATION* pDebugConfiguration,
    void* pReserved X2DEFAULT(NULL)) PURE;
};

__inline HRESULT XAudio2Create(IXAudio2** ppXAudio2, UINT32 Flags X2DEFAULT(0),
XAUDIO2_PROCESSOR XAudio2Processor X2DEFAULT(XAUDIO2_DEFAULT_PROCESSOR)) {
  IXAudio2* pXAudio2;
  HRESULT hr = CoCreateInstance((Flags & XAUDIO2_DEBUG_ENGINE) ? CLSID_XAudio2_Debug : CLSID_XAudio2,
    NULL, CLSCTX_INPROC_SERVER, IID_IXAudio2, (void**)&pXAudio2);
  if(SUCCEEDED(hr)) {
    hr = pXAudio2->Initialize(Flags, XAudio2Processor);
    if(SUCCEEDED(hr)) {
      *ppXAudio2 = pXAudio2;
    } else {
      pXAudio2->Release();
    }
  }
  return hr;
}