2 * Copyright (c) 2015 Andrew Eikum for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20 * Some versions of XAudio2 add or remove functions to the COM vtables, or
21 * incompatibly change structures. This file provides implementations of the
22 * older XAudio2 versions onto the new XAudio2 APIs.
24 * Below is a list of significant changes to the main XAudio2 interfaces and
25 * API. There may be further changes to effects and other parts that Wine
26 * doesn't currently implement.
32 * Change CLSID_XAudio2
33 * Re-order Error codes
34 * Change XAUDIO2_LOOP_INFINITE
35 * Change struct XAUDIO2_PERFORMANCE_DATA
36 * Change IXAudio2Voice::GetOutputMatrix return value to void
37 * Add parameter to IXAudio2VoiceCallback::OnVoiceProcessingPassStart
38 * Change struct XAPO_REGISTRATION_PROPERTIES. CAREFUL when using! Not all
39 * implementations of IXAPO are Wine implementations.
42 * Change CLSID_XAudio2
46 * Change CLSID_XAudio2
48 * Change struct XAUDIO2_PERFORMANCE_DATA
51 * Change CLSID_XAudio2
53 * Add IXAudio2Voice::SetOutputFilterParameters
54 * Add IXAudio2Voice::GetOutputFilterParameters
55 * Add IXAudio2SourceVoice::SetSourceSampleRate
56 * Change struct XAUDIO2_VOICE_SENDS
59 * Change CLSID_XAudio2
63 * Change CLSID_XAudio2
67 * Change CLSID_XAudio2
71 * Remove CLSID_XAudio2
73 * Add xaudio2_8.XAudio2Create
75 * Remove IXAudio2::GetDeviceCount
76 * Remove IXAudio2::GetDeviceDetails
77 * Remove IXAudio2::Initialize
78 * Change parameter of IXAudio2::CreateMasteringVoice
79 * Add Flags parameter to IXAudio2SourceVoice::GetState
80 * Add IXAudio2MasteringVoice::GetChannelMask
81 * Add DisableLateField member to XAUDIO2FX_REVERB_PARAMETERS
85 * New flags: XAUDIO2_STOP_ENGINE_WHEN_IDLE, XAUDIO2_1024_QUANTUM,
86 * XAUDIO2_NO_VIRTUAL_AUDIO_CLIENT
88 * Add SideDelay member to XAUDIO2FX_REVERB_PARAMETERS
93 #define NONAMELESSUNION
94 #define NONAMELESSSTRUCT
99 #include "xaudio_private.h"
101 #include "wine/debug.h"
103 WINE_DEFAULT_DEBUG_CHANNEL(xaudio2
);
105 /* BEGIN IXAudio2SourceVoice */
107 static XA2SourceImpl
*impl_from_IXAudio20SourceVoice(IXAudio20SourceVoice
*iface
)
109 return CONTAINING_RECORD(iface
, XA2SourceImpl
, IXAudio20SourceVoice_iface
);
112 static void WINAPI
XA20SRC_GetVoiceDetails(IXAudio20SourceVoice
*iface
,
113 XAUDIO2_VOICE_DETAILS
*pVoiceDetails
)
115 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
116 return IXAudio2SourceVoice_GetVoiceDetails(&This
->IXAudio2SourceVoice_iface
, pVoiceDetails
);
119 static HRESULT WINAPI
XA20SRC_SetOutputVoices(IXAudio20SourceVoice
*iface
,
120 const XAUDIO23_VOICE_SENDS
*pSendList
)
122 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
123 XAUDIO2_VOICE_SENDS sends
;
127 TRACE("%p, %p\n", This
, pSendList
);
129 sends
.SendCount
= pSendList
->OutputCount
;
130 sends
.pSends
= HeapAlloc(GetProcessHeap(), 0, sends
.SendCount
* sizeof(*sends
.pSends
));
131 for(i
= 0; i
< sends
.SendCount
; ++i
){
132 sends
.pSends
[i
].Flags
= 0;
133 sends
.pSends
[i
].pOutputVoice
= pSendList
->pOutputVoices
[i
];
136 hr
= IXAudio2SourceVoice_SetOutputVoices(&This
->IXAudio2SourceVoice_iface
, &sends
);
138 HeapFree(GetProcessHeap(), 0, sends
.pSends
);
143 static HRESULT WINAPI
XA20SRC_SetEffectChain(IXAudio20SourceVoice
*iface
,
144 const XAUDIO2_EFFECT_CHAIN
*pEffectChain
)
146 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
147 return IXAudio2SourceVoice_SetEffectChain(&This
->IXAudio2SourceVoice_iface
, pEffectChain
);
150 static HRESULT WINAPI
XA20SRC_EnableEffect(IXAudio20SourceVoice
*iface
,
151 UINT32 EffectIndex
, UINT32 OperationSet
)
153 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
154 return IXAudio2SourceVoice_EnableEffect(&This
->IXAudio2SourceVoice_iface
,
155 EffectIndex
, OperationSet
);
158 static HRESULT WINAPI
XA20SRC_DisableEffect(IXAudio20SourceVoice
*iface
,
159 UINT32 EffectIndex
, UINT32 OperationSet
)
161 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
162 return IXAudio2SourceVoice_DisableEffect(&This
->IXAudio2SourceVoice_iface
,
163 EffectIndex
, OperationSet
);
166 static void WINAPI
XA20SRC_GetEffectState(IXAudio20SourceVoice
*iface
,
167 UINT32 EffectIndex
, BOOL
*pEnabled
)
169 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
170 return IXAudio2SourceVoice_GetEffectState(&This
->IXAudio2SourceVoice_iface
,
171 EffectIndex
, pEnabled
);
174 static HRESULT WINAPI
XA20SRC_SetEffectParameters(IXAudio20SourceVoice
*iface
,
175 UINT32 EffectIndex
, const void *pParameters
, UINT32 ParametersByteSize
,
178 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
179 return IXAudio2SourceVoice_SetEffectParameters(&This
->IXAudio2SourceVoice_iface
,
180 EffectIndex
, pParameters
, ParametersByteSize
, OperationSet
);
183 static HRESULT WINAPI
XA20SRC_GetEffectParameters(IXAudio20SourceVoice
*iface
,
184 UINT32 EffectIndex
, void *pParameters
, UINT32 ParametersByteSize
)
186 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
187 return IXAudio2SourceVoice_GetEffectParameters(&This
->IXAudio2SourceVoice_iface
,
188 EffectIndex
, pParameters
, ParametersByteSize
);
191 static HRESULT WINAPI
XA20SRC_SetFilterParameters(IXAudio20SourceVoice
*iface
,
192 const XAUDIO2_FILTER_PARAMETERS
*pParameters
, UINT32 OperationSet
)
194 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
195 return IXAudio2SourceVoice_SetFilterParameters(&This
->IXAudio2SourceVoice_iface
,
196 pParameters
, OperationSet
);
199 static void WINAPI
XA20SRC_GetFilterParameters(IXAudio20SourceVoice
*iface
,
200 XAUDIO2_FILTER_PARAMETERS
*pParameters
)
202 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
203 return IXAudio2SourceVoice_GetFilterParameters(&This
->IXAudio2SourceVoice_iface
, pParameters
);
206 static HRESULT WINAPI
XA20SRC_SetVolume(IXAudio20SourceVoice
*iface
,
207 float Volume
, UINT32 OperationSet
)
209 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
210 return IXAudio2SourceVoice_SetVolume(&This
->IXAudio2SourceVoice_iface
,
211 Volume
, OperationSet
);
214 static void WINAPI
XA20SRC_GetVolume(IXAudio20SourceVoice
*iface
,
217 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
218 return IXAudio2SourceVoice_GetVolume(&This
->IXAudio2SourceVoice_iface
, pVolume
);
221 static HRESULT WINAPI
XA20SRC_SetChannelVolumes(IXAudio20SourceVoice
*iface
,
222 UINT32 Channels
, const float *pVolumes
, UINT32 OperationSet
)
224 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
225 return IXAudio2SourceVoice_SetChannelVolumes(&This
->IXAudio2SourceVoice_iface
,
226 Channels
, pVolumes
, OperationSet
);
229 static void WINAPI
XA20SRC_GetChannelVolumes(IXAudio20SourceVoice
*iface
,
230 UINT32 Channels
, float *pVolumes
)
232 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
233 return IXAudio2SourceVoice_GetChannelVolumes(&This
->IXAudio2SourceVoice_iface
,
237 static HRESULT WINAPI
XA20SRC_SetOutputMatrix(IXAudio20SourceVoice
*iface
,
238 IXAudio2Voice
*pDestinationVoice
, UINT32 SourceChannels
,
239 UINT32 DestinationChannels
, const float *pLevelMatrix
,
242 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
243 return IXAudio2SourceVoice_SetOutputMatrix(&This
->IXAudio2SourceVoice_iface
,
244 pDestinationVoice
, SourceChannels
, DestinationChannels
,
245 pLevelMatrix
, OperationSet
);
248 static HRESULT WINAPI
XA20SRC_GetOutputMatrix(IXAudio20SourceVoice
*iface
,
249 IXAudio2Voice
*pDestinationVoice
, UINT32 SourceChannels
,
250 UINT32 DestinationChannels
, float *pLevelMatrix
)
252 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
253 IXAudio2SourceVoice_GetOutputMatrix(&This
->IXAudio2SourceVoice_iface
,
254 pDestinationVoice
, SourceChannels
, DestinationChannels
,
259 static void WINAPI
XA20SRC_DestroyVoice(IXAudio20SourceVoice
*iface
)
261 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
262 return IXAudio2SourceVoice_DestroyVoice(&This
->IXAudio2SourceVoice_iface
);
265 static HRESULT WINAPI
XA20SRC_Start(IXAudio20SourceVoice
*iface
, UINT32 Flags
,
268 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
269 return IXAudio2SourceVoice_Start(&This
->IXAudio2SourceVoice_iface
, Flags
, OperationSet
);
272 static HRESULT WINAPI
XA20SRC_Stop(IXAudio20SourceVoice
*iface
, UINT32 Flags
,
275 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
276 return IXAudio2SourceVoice_Stop(&This
->IXAudio2SourceVoice_iface
, Flags
, OperationSet
);
279 static HRESULT WINAPI
XA20SRC_SubmitSourceBuffer(IXAudio20SourceVoice
*iface
,
280 const XAUDIO2_BUFFER
*pBuffer
, const XAUDIO2_BUFFER_WMA
*pBufferWMA
)
282 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
283 return IXAudio2SourceVoice_SubmitSourceBuffer(&This
->IXAudio2SourceVoice_iface
,
284 pBuffer
, pBufferWMA
);
287 static HRESULT WINAPI
XA20SRC_FlushSourceBuffers(IXAudio20SourceVoice
*iface
)
289 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
290 return IXAudio2SourceVoice_FlushSourceBuffers(&This
->IXAudio2SourceVoice_iface
);
293 static HRESULT WINAPI
XA20SRC_Discontinuity(IXAudio20SourceVoice
*iface
)
295 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
296 return IXAudio2SourceVoice_Discontinuity(&This
->IXAudio2SourceVoice_iface
);
299 static HRESULT WINAPI
XA20SRC_ExitLoop(IXAudio20SourceVoice
*iface
,
302 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
303 return IXAudio2SourceVoice_ExitLoop(&This
->IXAudio2SourceVoice_iface
, OperationSet
);
306 static void WINAPI
XA20SRC_GetState(IXAudio20SourceVoice
*iface
,
307 XAUDIO2_VOICE_STATE
*pVoiceState
)
309 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
310 return IXAudio2SourceVoice_GetState(&This
->IXAudio2SourceVoice_iface
, pVoiceState
, 0);
313 static HRESULT WINAPI
XA20SRC_SetFrequencyRatio(IXAudio20SourceVoice
*iface
,
314 float Ratio
, UINT32 OperationSet
)
316 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
317 return IXAudio2SourceVoice_SetFrequencyRatio(&This
->IXAudio2SourceVoice_iface
,
318 Ratio
, OperationSet
);
321 static void WINAPI
XA20SRC_GetFrequencyRatio(IXAudio20SourceVoice
*iface
,
324 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
325 return IXAudio2SourceVoice_GetFrequencyRatio(&This
->IXAudio2SourceVoice_iface
, pRatio
);
328 const IXAudio20SourceVoiceVtbl XAudio20SourceVoice_Vtbl
= {
329 XA20SRC_GetVoiceDetails
,
330 XA20SRC_SetOutputVoices
,
331 XA20SRC_SetEffectChain
,
332 XA20SRC_EnableEffect
,
333 XA20SRC_DisableEffect
,
334 XA20SRC_GetEffectState
,
335 XA20SRC_SetEffectParameters
,
336 XA20SRC_GetEffectParameters
,
337 XA20SRC_SetFilterParameters
,
338 XA20SRC_GetFilterParameters
,
341 XA20SRC_SetChannelVolumes
,
342 XA20SRC_GetChannelVolumes
,
343 XA20SRC_SetOutputMatrix
,
344 XA20SRC_GetOutputMatrix
,
345 XA20SRC_DestroyVoice
,
348 XA20SRC_SubmitSourceBuffer
,
349 XA20SRC_FlushSourceBuffers
,
350 XA20SRC_Discontinuity
,
353 XA20SRC_SetFrequencyRatio
,
354 XA20SRC_GetFrequencyRatio
,
357 #elif XAUDIO2_VER <= 3
359 static XA2SourceImpl
*impl_from_IXAudio23SourceVoice(IXAudio23SourceVoice
*iface
)
361 return CONTAINING_RECORD(iface
, XA2SourceImpl
, IXAudio23SourceVoice_iface
);
364 static void WINAPI
XA23SRC_GetVoiceDetails(IXAudio23SourceVoice
*iface
,
365 XAUDIO2_VOICE_DETAILS
*pVoiceDetails
)
367 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
368 return IXAudio2SourceVoice_GetVoiceDetails(&This
->IXAudio2SourceVoice_iface
, pVoiceDetails
);
371 static HRESULT WINAPI
XA23SRC_SetOutputVoices(IXAudio23SourceVoice
*iface
,
372 const XAUDIO23_VOICE_SENDS
*pSendList
)
374 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
375 XAUDIO2_VOICE_SENDS sends
;
379 TRACE("%p, %p\n", This
, pSendList
);
381 sends
.SendCount
= pSendList
->OutputCount
;
382 sends
.pSends
= HeapAlloc(GetProcessHeap(), 0, sends
.SendCount
* sizeof(*sends
.pSends
));
383 for(i
= 0; i
< sends
.SendCount
; ++i
){
384 sends
.pSends
[i
].Flags
= 0;
385 sends
.pSends
[i
].pOutputVoice
= pSendList
->pOutputVoices
[i
];
388 hr
= IXAudio2SourceVoice_SetOutputVoices(&This
->IXAudio2SourceVoice_iface
, &sends
);
390 HeapFree(GetProcessHeap(), 0, sends
.pSends
);
395 static HRESULT WINAPI
XA23SRC_SetEffectChain(IXAudio23SourceVoice
*iface
,
396 const XAUDIO2_EFFECT_CHAIN
*pEffectChain
)
398 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
399 return IXAudio2SourceVoice_SetEffectChain(&This
->IXAudio2SourceVoice_iface
, pEffectChain
);
402 static HRESULT WINAPI
XA23SRC_EnableEffect(IXAudio23SourceVoice
*iface
,
403 UINT32 EffectIndex
, UINT32 OperationSet
)
405 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
406 return IXAudio2SourceVoice_EnableEffect(&This
->IXAudio2SourceVoice_iface
,
407 EffectIndex
, OperationSet
);
410 static HRESULT WINAPI
XA23SRC_DisableEffect(IXAudio23SourceVoice
*iface
,
411 UINT32 EffectIndex
, UINT32 OperationSet
)
413 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
414 return IXAudio2SourceVoice_DisableEffect(&This
->IXAudio2SourceVoice_iface
,
415 EffectIndex
, OperationSet
);
418 static void WINAPI
XA23SRC_GetEffectState(IXAudio23SourceVoice
*iface
,
419 UINT32 EffectIndex
, BOOL
*pEnabled
)
421 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
422 return IXAudio2SourceVoice_GetEffectState(&This
->IXAudio2SourceVoice_iface
,
423 EffectIndex
, pEnabled
);
426 static HRESULT WINAPI
XA23SRC_SetEffectParameters(IXAudio23SourceVoice
*iface
,
427 UINT32 EffectIndex
, const void *pParameters
, UINT32 ParametersByteSize
,
430 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
431 return IXAudio2SourceVoice_SetEffectParameters(&This
->IXAudio2SourceVoice_iface
,
432 EffectIndex
, pParameters
, ParametersByteSize
, OperationSet
);
435 static HRESULT WINAPI
XA23SRC_GetEffectParameters(IXAudio23SourceVoice
*iface
,
436 UINT32 EffectIndex
, void *pParameters
, UINT32 ParametersByteSize
)
438 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
439 return IXAudio2SourceVoice_GetEffectParameters(&This
->IXAudio2SourceVoice_iface
,
440 EffectIndex
, pParameters
, ParametersByteSize
);
443 static HRESULT WINAPI
XA23SRC_SetFilterParameters(IXAudio23SourceVoice
*iface
,
444 const XAUDIO2_FILTER_PARAMETERS
*pParameters
, UINT32 OperationSet
)
446 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
447 return IXAudio2SourceVoice_SetFilterParameters(&This
->IXAudio2SourceVoice_iface
,
448 pParameters
, OperationSet
);
451 static void WINAPI
XA23SRC_GetFilterParameters(IXAudio23SourceVoice
*iface
,
452 XAUDIO2_FILTER_PARAMETERS
*pParameters
)
454 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
455 return IXAudio2SourceVoice_GetFilterParameters(&This
->IXAudio2SourceVoice_iface
, pParameters
);
458 static HRESULT WINAPI
XA23SRC_SetVolume(IXAudio23SourceVoice
*iface
,
459 float Volume
, UINT32 OperationSet
)
461 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
462 return IXAudio2SourceVoice_SetVolume(&This
->IXAudio2SourceVoice_iface
,
463 Volume
, OperationSet
);
466 static void WINAPI
XA23SRC_GetVolume(IXAudio23SourceVoice
*iface
,
469 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
470 return IXAudio2SourceVoice_GetVolume(&This
->IXAudio2SourceVoice_iface
, pVolume
);
473 static HRESULT WINAPI
XA23SRC_SetChannelVolumes(IXAudio23SourceVoice
*iface
,
474 UINT32 Channels
, const float *pVolumes
, UINT32 OperationSet
)
476 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
477 return IXAudio2SourceVoice_SetChannelVolumes(&This
->IXAudio2SourceVoice_iface
,
478 Channels
, pVolumes
, OperationSet
);
481 static void WINAPI
XA23SRC_GetChannelVolumes(IXAudio23SourceVoice
*iface
,
482 UINT32 Channels
, float *pVolumes
)
484 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
485 return IXAudio2SourceVoice_GetChannelVolumes(&This
->IXAudio2SourceVoice_iface
,
489 static HRESULT WINAPI
XA23SRC_SetOutputMatrix(IXAudio23SourceVoice
*iface
,
490 IXAudio2Voice
*pDestinationVoice
, UINT32 SourceChannels
,
491 UINT32 DestinationChannels
, const float *pLevelMatrix
,
494 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
495 return IXAudio2SourceVoice_SetOutputMatrix(&This
->IXAudio2SourceVoice_iface
,
496 pDestinationVoice
, SourceChannels
, DestinationChannels
,
497 pLevelMatrix
, OperationSet
);
500 static void WINAPI
XA23SRC_GetOutputMatrix(IXAudio23SourceVoice
*iface
,
501 IXAudio2Voice
*pDestinationVoice
, UINT32 SourceChannels
,
502 UINT32 DestinationChannels
, float *pLevelMatrix
)
504 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
505 return IXAudio2SourceVoice_GetOutputMatrix(&This
->IXAudio2SourceVoice_iface
,
506 pDestinationVoice
, SourceChannels
, DestinationChannels
,
510 static void WINAPI
XA23SRC_DestroyVoice(IXAudio23SourceVoice
*iface
)
512 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
513 return IXAudio2SourceVoice_DestroyVoice(&This
->IXAudio2SourceVoice_iface
);
516 static HRESULT WINAPI
XA23SRC_Start(IXAudio23SourceVoice
*iface
, UINT32 Flags
,
519 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
520 return IXAudio2SourceVoice_Start(&This
->IXAudio2SourceVoice_iface
, Flags
, OperationSet
);
523 static HRESULT WINAPI
XA23SRC_Stop(IXAudio23SourceVoice
*iface
, UINT32 Flags
,
526 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
527 return IXAudio2SourceVoice_Stop(&This
->IXAudio2SourceVoice_iface
, Flags
, OperationSet
);
530 static HRESULT WINAPI
XA23SRC_SubmitSourceBuffer(IXAudio23SourceVoice
*iface
,
531 const XAUDIO2_BUFFER
*pBuffer
, const XAUDIO2_BUFFER_WMA
*pBufferWMA
)
533 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
534 return IXAudio2SourceVoice_SubmitSourceBuffer(&This
->IXAudio2SourceVoice_iface
,
535 pBuffer
, pBufferWMA
);
538 static HRESULT WINAPI
XA23SRC_FlushSourceBuffers(IXAudio23SourceVoice
*iface
)
540 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
541 return IXAudio2SourceVoice_FlushSourceBuffers(&This
->IXAudio2SourceVoice_iface
);
544 static HRESULT WINAPI
XA23SRC_Discontinuity(IXAudio23SourceVoice
*iface
)
546 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
547 return IXAudio2SourceVoice_Discontinuity(&This
->IXAudio2SourceVoice_iface
);
550 static HRESULT WINAPI
XA23SRC_ExitLoop(IXAudio23SourceVoice
*iface
,
553 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
554 return IXAudio2SourceVoice_ExitLoop(&This
->IXAudio2SourceVoice_iface
, OperationSet
);
557 static void WINAPI
XA23SRC_GetState(IXAudio23SourceVoice
*iface
,
558 XAUDIO2_VOICE_STATE
*pVoiceState
)
560 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
561 return IXAudio2SourceVoice_GetState(&This
->IXAudio2SourceVoice_iface
, pVoiceState
, 0);
564 static HRESULT WINAPI
XA23SRC_SetFrequencyRatio(IXAudio23SourceVoice
*iface
,
565 float Ratio
, UINT32 OperationSet
)
567 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
568 return IXAudio2SourceVoice_SetFrequencyRatio(&This
->IXAudio2SourceVoice_iface
,
569 Ratio
, OperationSet
);
572 static void WINAPI
XA23SRC_GetFrequencyRatio(IXAudio23SourceVoice
*iface
,
575 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
576 return IXAudio2SourceVoice_GetFrequencyRatio(&This
->IXAudio2SourceVoice_iface
, pRatio
);
579 const IXAudio23SourceVoiceVtbl XAudio23SourceVoice_Vtbl
= {
580 XA23SRC_GetVoiceDetails
,
581 XA23SRC_SetOutputVoices
,
582 XA23SRC_SetEffectChain
,
583 XA23SRC_EnableEffect
,
584 XA23SRC_DisableEffect
,
585 XA23SRC_GetEffectState
,
586 XA23SRC_SetEffectParameters
,
587 XA23SRC_GetEffectParameters
,
588 XA23SRC_SetFilterParameters
,
589 XA23SRC_GetFilterParameters
,
592 XA23SRC_SetChannelVolumes
,
593 XA23SRC_GetChannelVolumes
,
594 XA23SRC_SetOutputMatrix
,
595 XA23SRC_GetOutputMatrix
,
596 XA23SRC_DestroyVoice
,
599 XA23SRC_SubmitSourceBuffer
,
600 XA23SRC_FlushSourceBuffers
,
601 XA23SRC_Discontinuity
,
604 XA23SRC_SetFrequencyRatio
,
605 XA23SRC_GetFrequencyRatio
,
608 #elif XAUDIO2_VER <= 7
610 static XA2SourceImpl
*impl_from_IXAudio27SourceVoice(IXAudio27SourceVoice
*iface
)
612 return CONTAINING_RECORD(iface
, XA2SourceImpl
, IXAudio27SourceVoice_iface
);
615 static void WINAPI
XA27SRC_GetVoiceDetails(IXAudio27SourceVoice
*iface
,
616 XAUDIO2_VOICE_DETAILS
*pVoiceDetails
)
618 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
619 return IXAudio2SourceVoice_GetVoiceDetails(&This
->IXAudio2SourceVoice_iface
, pVoiceDetails
);
622 static HRESULT WINAPI
XA27SRC_SetOutputVoices(IXAudio27SourceVoice
*iface
,
623 const XAUDIO2_VOICE_SENDS
*pSendList
)
625 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
626 return IXAudio2SourceVoice_SetOutputVoices(&This
->IXAudio2SourceVoice_iface
, pSendList
);
629 static HRESULT WINAPI
XA27SRC_SetEffectChain(IXAudio27SourceVoice
*iface
,
630 const XAUDIO2_EFFECT_CHAIN
*pEffectChain
)
632 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
633 return IXAudio2SourceVoice_SetEffectChain(&This
->IXAudio2SourceVoice_iface
, pEffectChain
);
636 static HRESULT WINAPI
XA27SRC_EnableEffect(IXAudio27SourceVoice
*iface
,
637 UINT32 EffectIndex
, UINT32 OperationSet
)
639 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
640 return IXAudio2SourceVoice_EnableEffect(&This
->IXAudio2SourceVoice_iface
, EffectIndex
, OperationSet
);
643 static HRESULT WINAPI
XA27SRC_DisableEffect(IXAudio27SourceVoice
*iface
,
644 UINT32 EffectIndex
, UINT32 OperationSet
)
646 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
647 return IXAudio2SourceVoice_DisableEffect(&This
->IXAudio2SourceVoice_iface
, EffectIndex
, OperationSet
);
650 static void WINAPI
XA27SRC_GetEffectState(IXAudio27SourceVoice
*iface
,
651 UINT32 EffectIndex
, BOOL
*pEnabled
)
653 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
654 IXAudio2SourceVoice_GetEffectState(&This
->IXAudio2SourceVoice_iface
, EffectIndex
, pEnabled
);
657 static HRESULT WINAPI
XA27SRC_SetEffectParameters(IXAudio27SourceVoice
*iface
,
658 UINT32 EffectIndex
, const void *pParameters
, UINT32 ParametersByteSize
,
661 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
662 return IXAudio2SourceVoice_SetEffectParameters(&This
->IXAudio2SourceVoice_iface
,
663 EffectIndex
, pParameters
, ParametersByteSize
, OperationSet
);
666 static HRESULT WINAPI
XA27SRC_GetEffectParameters(IXAudio27SourceVoice
*iface
,
667 UINT32 EffectIndex
, void *pParameters
, UINT32 ParametersByteSize
)
669 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
670 return IXAudio2SourceVoice_GetEffectParameters(&This
->IXAudio2SourceVoice_iface
,
671 EffectIndex
, pParameters
, ParametersByteSize
);
674 static HRESULT WINAPI
XA27SRC_SetFilterParameters(IXAudio27SourceVoice
*iface
,
675 const XAUDIO2_FILTER_PARAMETERS
*pParameters
, UINT32 OperationSet
)
677 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
678 return IXAudio2SourceVoice_SetFilterParameters(&This
->IXAudio2SourceVoice_iface
,
679 pParameters
, OperationSet
);
682 static void WINAPI
XA27SRC_GetFilterParameters(IXAudio27SourceVoice
*iface
,
683 XAUDIO2_FILTER_PARAMETERS
*pParameters
)
685 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
686 IXAudio2SourceVoice_GetFilterParameters(&This
->IXAudio2SourceVoice_iface
, pParameters
);
689 static HRESULT WINAPI
XA27SRC_SetOutputFilterParameters(IXAudio27SourceVoice
*iface
,
690 IXAudio2Voice
*pDestinationVoice
,
691 const XAUDIO2_FILTER_PARAMETERS
*pParameters
, UINT32 OperationSet
)
693 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
694 return IXAudio2SourceVoice_SetOutputFilterParameters(&This
->IXAudio2SourceVoice_iface
,
695 pDestinationVoice
, pParameters
, OperationSet
);
698 static void WINAPI
XA27SRC_GetOutputFilterParameters(IXAudio27SourceVoice
*iface
,
699 IXAudio2Voice
*pDestinationVoice
,
700 XAUDIO2_FILTER_PARAMETERS
*pParameters
)
702 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
703 IXAudio2SourceVoice_GetOutputFilterParameters(&This
->IXAudio2SourceVoice_iface
,
704 pDestinationVoice
, pParameters
);
707 static HRESULT WINAPI
XA27SRC_SetVolume(IXAudio27SourceVoice
*iface
, float Volume
,
710 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
711 return IXAudio2SourceVoice_SetVolume(&This
->IXAudio2SourceVoice_iface
, Volume
,
715 static void WINAPI
XA27SRC_GetVolume(IXAudio27SourceVoice
*iface
, float *pVolume
)
717 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
718 IXAudio2SourceVoice_GetVolume(&This
->IXAudio2SourceVoice_iface
, pVolume
);
721 static HRESULT WINAPI
XA27SRC_SetChannelVolumes(IXAudio27SourceVoice
*iface
,
722 UINT32 Channels
, const float *pVolumes
, UINT32 OperationSet
)
724 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
725 return IXAudio2SourceVoice_SetChannelVolumes(&This
->IXAudio2SourceVoice_iface
, Channels
,
726 pVolumes
, OperationSet
);
729 static void WINAPI
XA27SRC_GetChannelVolumes(IXAudio27SourceVoice
*iface
,
730 UINT32 Channels
, float *pVolumes
)
732 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
733 IXAudio2SourceVoice_GetChannelVolumes(&This
->IXAudio2SourceVoice_iface
, Channels
,
737 static HRESULT WINAPI
XA27SRC_SetOutputMatrix(IXAudio27SourceVoice
*iface
,
738 IXAudio2Voice
*pDestinationVoice
, UINT32 SourceChannels
,
739 UINT32 DestinationChannels
, const float *pLevelMatrix
,
742 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
743 return IXAudio2SourceVoice_SetOutputMatrix(&This
->IXAudio2SourceVoice_iface
,
744 pDestinationVoice
, SourceChannels
, DestinationChannels
,
745 pLevelMatrix
, OperationSet
);
748 static void WINAPI
XA27SRC_GetOutputMatrix(IXAudio27SourceVoice
*iface
,
749 IXAudio2Voice
*pDestinationVoice
, UINT32 SourceChannels
,
750 UINT32 DestinationChannels
, float *pLevelMatrix
)
752 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
753 IXAudio2SourceVoice_GetOutputMatrix(&This
->IXAudio2SourceVoice_iface
, pDestinationVoice
,
754 SourceChannels
, DestinationChannels
, pLevelMatrix
);
757 static void WINAPI
XA27SRC_DestroyVoice(IXAudio27SourceVoice
*iface
)
759 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
760 IXAudio2SourceVoice_DestroyVoice(&This
->IXAudio2SourceVoice_iface
);
763 static HRESULT WINAPI
XA27SRC_Start(IXAudio27SourceVoice
*iface
, UINT32 Flags
,
766 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
767 return IXAudio2SourceVoice_Start(&This
->IXAudio2SourceVoice_iface
, Flags
, OperationSet
);
770 static HRESULT WINAPI
XA27SRC_Stop(IXAudio27SourceVoice
*iface
, UINT32 Flags
,
773 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
774 return IXAudio2SourceVoice_Stop(&This
->IXAudio2SourceVoice_iface
, Flags
, OperationSet
);
777 static HRESULT WINAPI
XA27SRC_SubmitSourceBuffer(IXAudio27SourceVoice
*iface
,
778 const XAUDIO2_BUFFER
*pBuffer
, const XAUDIO2_BUFFER_WMA
*pBufferWMA
)
780 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
781 return IXAudio2SourceVoice_SubmitSourceBuffer(&This
->IXAudio2SourceVoice_iface
, pBuffer
,
785 static HRESULT WINAPI
XA27SRC_FlushSourceBuffers(IXAudio27SourceVoice
*iface
)
787 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
788 return IXAudio2SourceVoice_FlushSourceBuffers(&This
->IXAudio2SourceVoice_iface
);
791 static HRESULT WINAPI
XA27SRC_Discontinuity(IXAudio27SourceVoice
*iface
)
793 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
794 return IXAudio2SourceVoice_Discontinuity(&This
->IXAudio2SourceVoice_iface
);
797 static HRESULT WINAPI
XA27SRC_ExitLoop(IXAudio27SourceVoice
*iface
, UINT32 OperationSet
)
799 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
800 return IXAudio2SourceVoice_ExitLoop(&This
->IXAudio2SourceVoice_iface
, OperationSet
);
803 static void WINAPI
XA27SRC_GetState(IXAudio27SourceVoice
*iface
,
804 XAUDIO2_VOICE_STATE
*pVoiceState
)
806 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
807 return IXAudio2SourceVoice_GetState(&This
->IXAudio2SourceVoice_iface
, pVoiceState
, 0);
810 static HRESULT WINAPI
XA27SRC_SetFrequencyRatio(IXAudio27SourceVoice
*iface
,
811 float Ratio
, UINT32 OperationSet
)
813 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
814 return IXAudio2SourceVoice_SetFrequencyRatio(&This
->IXAudio2SourceVoice_iface
, Ratio
, OperationSet
);
817 static void WINAPI
XA27SRC_GetFrequencyRatio(IXAudio27SourceVoice
*iface
, float *pRatio
)
819 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
820 return IXAudio2SourceVoice_GetFrequencyRatio(&This
->IXAudio2SourceVoice_iface
, pRatio
);
823 static HRESULT WINAPI
XA27SRC_SetSourceSampleRate(
824 IXAudio27SourceVoice
*iface
,
825 UINT32 NewSourceSampleRate
)
827 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
828 return IXAudio2SourceVoice_SetSourceSampleRate(&This
->IXAudio2SourceVoice_iface
, NewSourceSampleRate
);
831 const IXAudio27SourceVoiceVtbl XAudio27SourceVoice_Vtbl
= {
832 XA27SRC_GetVoiceDetails
,
833 XA27SRC_SetOutputVoices
,
834 XA27SRC_SetEffectChain
,
835 XA27SRC_EnableEffect
,
836 XA27SRC_DisableEffect
,
837 XA27SRC_GetEffectState
,
838 XA27SRC_SetEffectParameters
,
839 XA27SRC_GetEffectParameters
,
840 XA27SRC_SetFilterParameters
,
841 XA27SRC_GetFilterParameters
,
842 XA27SRC_SetOutputFilterParameters
,
843 XA27SRC_GetOutputFilterParameters
,
846 XA27SRC_SetChannelVolumes
,
847 XA27SRC_GetChannelVolumes
,
848 XA27SRC_SetOutputMatrix
,
849 XA27SRC_GetOutputMatrix
,
850 XA27SRC_DestroyVoice
,
853 XA27SRC_SubmitSourceBuffer
,
854 XA27SRC_FlushSourceBuffers
,
855 XA27SRC_Discontinuity
,
858 XA27SRC_SetFrequencyRatio
,
859 XA27SRC_GetFrequencyRatio
,
860 XA27SRC_SetSourceSampleRate
863 /* END IXAudio2SourceVoice */
866 /* BEGIN IXAudio2SubmixVoice */
868 static XA2SubmixImpl
*impl_from_IXAudio20SubmixVoice(IXAudio20SubmixVoice
*iface
)
870 return CONTAINING_RECORD(iface
, XA2SubmixImpl
, IXAudio20SubmixVoice_iface
);
873 static void WINAPI
XA20SUB_GetVoiceDetails(IXAudio20SubmixVoice
*iface
,
874 XAUDIO2_VOICE_DETAILS
*pVoiceDetails
)
876 XA2SubmixImpl
*This
= impl_from_IXAudio20SubmixVoice(iface
);
877 return IXAudio2SubmixVoice_GetVoiceDetails(&This
->IXAudio2SubmixVoice_iface
, pVoiceDetails
);
880 static HRESULT WINAPI
XA20SUB_SetOutputVoices(IXAudio20SubmixVoice
*iface
,
881 const XAUDIO23_VOICE_SENDS
*pSendList
)
883 XA2SubmixImpl
*This
= impl_from_IXAudio20SubmixVoice(iface
);
884 XAUDIO2_VOICE_SENDS sends
;
888 TRACE("%p, %p\n", This
, pSendList
);
890 sends
.SendCount
= pSendList
->OutputCount
;
891 sends
.pSends
= HeapAlloc(GetProcessHeap(), 0, sends
.SendCount
* sizeof(*sends
.pSends
));
892 for(i
= 0; i
< sends
.SendCount
; ++i
){
893 sends
.pSends
[i
].Flags
= 0;
894 sends
.pSends
[i
].pOutputVoice
= pSendList
->pOutputVoices
[i
];
897 hr
= IXAudio2SubmixVoice_SetOutputVoices(&This
->IXAudio2SubmixVoice_iface
, &sends
);
899 HeapFree(GetProcessHeap(), 0, sends
.pSends
);
904 static HRESULT WINAPI
XA20SUB_SetEffectChain(IXAudio20SubmixVoice
*iface
,
905 const XAUDIO2_EFFECT_CHAIN
*pEffectChain
)
907 XA2SubmixImpl
*This
= impl_from_IXAudio20SubmixVoice(iface
);
908 return IXAudio2SubmixVoice_SetEffectChain(&This
->IXAudio2SubmixVoice_iface
, pEffectChain
);
911 static HRESULT WINAPI
XA20SUB_EnableEffect(IXAudio20SubmixVoice
*iface
,
912 UINT32 EffectIndex
, UINT32 OperationSet
)
914 XA2SubmixImpl
*This
= impl_from_IXAudio20SubmixVoice(iface
);
915 return IXAudio2SubmixVoice_EnableEffect(&This
->IXAudio2SubmixVoice_iface
,
916 EffectIndex
, OperationSet
);
919 static HRESULT WINAPI
XA20SUB_DisableEffect(IXAudio20SubmixVoice
*iface
,
920 UINT32 EffectIndex
, UINT32 OperationSet
)
922 XA2SubmixImpl
*This
= impl_from_IXAudio20SubmixVoice(iface
);
923 return IXAudio2SubmixVoice_DisableEffect(&This
->IXAudio2SubmixVoice_iface
,
924 EffectIndex
, OperationSet
);
927 static void WINAPI
XA20SUB_GetEffectState(IXAudio20SubmixVoice
*iface
,
928 UINT32 EffectIndex
, BOOL
*pEnabled
)
930 XA2SubmixImpl
*This
= impl_from_IXAudio20SubmixVoice(iface
);
931 return IXAudio2SubmixVoice_GetEffectState(&This
->IXAudio2SubmixVoice_iface
,
932 EffectIndex
, pEnabled
);
935 static HRESULT WINAPI
XA20SUB_SetEffectParameters(IXAudio20SubmixVoice
*iface
,
936 UINT32 EffectIndex
, const void *pParameters
, UINT32 ParametersByteSize
,
939 XA2SubmixImpl
*This
= impl_from_IXAudio20SubmixVoice(iface
);
940 return IXAudio2SubmixVoice_SetEffectParameters(&This
->IXAudio2SubmixVoice_iface
,
941 EffectIndex
, pParameters
, ParametersByteSize
, OperationSet
);
944 static HRESULT WINAPI
XA20SUB_GetEffectParameters(IXAudio20SubmixVoice
*iface
,
945 UINT32 EffectIndex
, void *pParameters
, UINT32 ParametersByteSize
)
947 XA2SubmixImpl
*This
= impl_from_IXAudio20SubmixVoice(iface
);
948 return IXAudio2SubmixVoice_GetEffectParameters(&This
->IXAudio2SubmixVoice_iface
,
949 EffectIndex
, pParameters
, ParametersByteSize
);
952 static HRESULT WINAPI
XA20SUB_SetFilterParameters(IXAudio20SubmixVoice
*iface
,
953 const XAUDIO2_FILTER_PARAMETERS
*pParameters
, UINT32 OperationSet
)
955 XA2SubmixImpl
*This
= impl_from_IXAudio20SubmixVoice(iface
);
956 return IXAudio2SubmixVoice_SetFilterParameters(&This
->IXAudio2SubmixVoice_iface
,
957 pParameters
, OperationSet
);
960 static void WINAPI
XA20SUB_GetFilterParameters(IXAudio20SubmixVoice
*iface
,
961 XAUDIO2_FILTER_PARAMETERS
*pParameters
)
963 XA2SubmixImpl
*This
= impl_from_IXAudio20SubmixVoice(iface
);
964 return IXAudio2SubmixVoice_GetFilterParameters(&This
->IXAudio2SubmixVoice_iface
, pParameters
);
967 static HRESULT WINAPI
XA20SUB_SetVolume(IXAudio20SubmixVoice
*iface
,
968 float Volume
, UINT32 OperationSet
)
970 XA2SubmixImpl
*This
= impl_from_IXAudio20SubmixVoice(iface
);
971 return IXAudio2SubmixVoice_SetVolume(&This
->IXAudio2SubmixVoice_iface
,
972 Volume
, OperationSet
);
975 static void WINAPI
XA20SUB_GetVolume(IXAudio20SubmixVoice
*iface
,
978 XA2SubmixImpl
*This
= impl_from_IXAudio20SubmixVoice(iface
);
979 return IXAudio2SubmixVoice_GetVolume(&This
->IXAudio2SubmixVoice_iface
, pVolume
);
982 static HRESULT WINAPI
XA20SUB_SetChannelVolumes(IXAudio20SubmixVoice
*iface
,
983 UINT32 Channels
, const float *pVolumes
, UINT32 OperationSet
)
985 XA2SubmixImpl
*This
= impl_from_IXAudio20SubmixVoice(iface
);
986 return IXAudio2SubmixVoice_SetChannelVolumes(&This
->IXAudio2SubmixVoice_iface
,
987 Channels
, pVolumes
, OperationSet
);
990 static void WINAPI
XA20SUB_GetChannelVolumes(IXAudio20SubmixVoice
*iface
,
991 UINT32 Channels
, float *pVolumes
)
993 XA2SubmixImpl
*This
= impl_from_IXAudio20SubmixVoice(iface
);
994 return IXAudio2SubmixVoice_GetChannelVolumes(&This
->IXAudio2SubmixVoice_iface
,
998 static HRESULT WINAPI
XA20SUB_SetOutputMatrix(IXAudio20SubmixVoice
*iface
,
999 IXAudio2Voice
*pDestinationVoice
, UINT32 SubmixChannels
,
1000 UINT32 DestinationChannels
, const float *pLevelMatrix
,
1001 UINT32 OperationSet
)
1003 XA2SubmixImpl
*This
= impl_from_IXAudio20SubmixVoice(iface
);
1004 return IXAudio2SubmixVoice_SetOutputMatrix(&This
->IXAudio2SubmixVoice_iface
,
1005 pDestinationVoice
, SubmixChannels
, DestinationChannels
,
1006 pLevelMatrix
, OperationSet
);
1009 static HRESULT WINAPI
XA20SUB_GetOutputMatrix(IXAudio20SubmixVoice
*iface
,
1010 IXAudio2Voice
*pDestinationVoice
, UINT32 SubmixChannels
,
1011 UINT32 DestinationChannels
, float *pLevelMatrix
)
1013 XA2SubmixImpl
*This
= impl_from_IXAudio20SubmixVoice(iface
);
1014 IXAudio2SubmixVoice_GetOutputMatrix(&This
->IXAudio2SubmixVoice_iface
,
1015 pDestinationVoice
, SubmixChannels
, DestinationChannels
,
1020 static void WINAPI
XA20SUB_DestroyVoice(IXAudio20SubmixVoice
*iface
)
1022 XA2SubmixImpl
*This
= impl_from_IXAudio20SubmixVoice(iface
);
1023 return IXAudio2SubmixVoice_DestroyVoice(&This
->IXAudio2SubmixVoice_iface
);
1026 const IXAudio20SubmixVoiceVtbl XAudio20SubmixVoice_Vtbl
= {
1027 XA20SUB_GetVoiceDetails
,
1028 XA20SUB_SetOutputVoices
,
1029 XA20SUB_SetEffectChain
,
1030 XA20SUB_EnableEffect
,
1031 XA20SUB_DisableEffect
,
1032 XA20SUB_GetEffectState
,
1033 XA20SUB_SetEffectParameters
,
1034 XA20SUB_GetEffectParameters
,
1035 XA20SUB_SetFilterParameters
,
1036 XA20SUB_GetFilterParameters
,
1039 XA20SUB_SetChannelVolumes
,
1040 XA20SUB_GetChannelVolumes
,
1041 XA20SUB_SetOutputMatrix
,
1042 XA20SUB_GetOutputMatrix
,
1043 XA20SUB_DestroyVoice
1046 #elif XAUDIO2_VER <= 3
1048 static XA2SubmixImpl
*impl_from_IXAudio23SubmixVoice(IXAudio23SubmixVoice
*iface
)
1050 return CONTAINING_RECORD(iface
, XA2SubmixImpl
, IXAudio23SubmixVoice_iface
);
1053 static void WINAPI
XA23SUB_GetVoiceDetails(IXAudio23SubmixVoice
*iface
,
1054 XAUDIO2_VOICE_DETAILS
*pVoiceDetails
)
1056 XA2SubmixImpl
*This
= impl_from_IXAudio23SubmixVoice(iface
);
1057 return IXAudio2SubmixVoice_GetVoiceDetails(&This
->IXAudio2SubmixVoice_iface
, pVoiceDetails
);
1060 static HRESULT WINAPI
XA23SUB_SetOutputVoices(IXAudio23SubmixVoice
*iface
,
1061 const XAUDIO23_VOICE_SENDS
*pSendList
)
1063 XA2SubmixImpl
*This
= impl_from_IXAudio23SubmixVoice(iface
);
1064 XAUDIO2_VOICE_SENDS sends
;
1068 TRACE("%p, %p\n", This
, pSendList
);
1070 sends
.SendCount
= pSendList
->OutputCount
;
1071 sends
.pSends
= HeapAlloc(GetProcessHeap(), 0, sends
.SendCount
* sizeof(*sends
.pSends
));
1072 for(i
= 0; i
< sends
.SendCount
; ++i
){
1073 sends
.pSends
[i
].Flags
= 0;
1074 sends
.pSends
[i
].pOutputVoice
= pSendList
->pOutputVoices
[i
];
1077 hr
= IXAudio2SubmixVoice_SetOutputVoices(&This
->IXAudio2SubmixVoice_iface
, &sends
);
1079 HeapFree(GetProcessHeap(), 0, sends
.pSends
);
1084 static HRESULT WINAPI
XA23SUB_SetEffectChain(IXAudio23SubmixVoice
*iface
,
1085 const XAUDIO2_EFFECT_CHAIN
*pEffectChain
)
1087 XA2SubmixImpl
*This
= impl_from_IXAudio23SubmixVoice(iface
);
1088 return IXAudio2SubmixVoice_SetEffectChain(&This
->IXAudio2SubmixVoice_iface
, pEffectChain
);
1091 static HRESULT WINAPI
XA23SUB_EnableEffect(IXAudio23SubmixVoice
*iface
,
1092 UINT32 EffectIndex
, UINT32 OperationSet
)
1094 XA2SubmixImpl
*This
= impl_from_IXAudio23SubmixVoice(iface
);
1095 return IXAudio2SubmixVoice_EnableEffect(&This
->IXAudio2SubmixVoice_iface
,
1096 EffectIndex
, OperationSet
);
1099 static HRESULT WINAPI
XA23SUB_DisableEffect(IXAudio23SubmixVoice
*iface
,
1100 UINT32 EffectIndex
, UINT32 OperationSet
)
1102 XA2SubmixImpl
*This
= impl_from_IXAudio23SubmixVoice(iface
);
1103 return IXAudio2SubmixVoice_DisableEffect(&This
->IXAudio2SubmixVoice_iface
,
1104 EffectIndex
, OperationSet
);
1107 static void WINAPI
XA23SUB_GetEffectState(IXAudio23SubmixVoice
*iface
,
1108 UINT32 EffectIndex
, BOOL
*pEnabled
)
1110 XA2SubmixImpl
*This
= impl_from_IXAudio23SubmixVoice(iface
);
1111 return IXAudio2SubmixVoice_GetEffectState(&This
->IXAudio2SubmixVoice_iface
,
1112 EffectIndex
, pEnabled
);
1115 static HRESULT WINAPI
XA23SUB_SetEffectParameters(IXAudio23SubmixVoice
*iface
,
1116 UINT32 EffectIndex
, const void *pParameters
, UINT32 ParametersByteSize
,
1117 UINT32 OperationSet
)
1119 XA2SubmixImpl
*This
= impl_from_IXAudio23SubmixVoice(iface
);
1120 return IXAudio2SubmixVoice_SetEffectParameters(&This
->IXAudio2SubmixVoice_iface
,
1121 EffectIndex
, pParameters
, ParametersByteSize
, OperationSet
);
1124 static HRESULT WINAPI
XA23SUB_GetEffectParameters(IXAudio23SubmixVoice
*iface
,
1125 UINT32 EffectIndex
, void *pParameters
, UINT32 ParametersByteSize
)
1127 XA2SubmixImpl
*This
= impl_from_IXAudio23SubmixVoice(iface
);
1128 return IXAudio2SubmixVoice_GetEffectParameters(&This
->IXAudio2SubmixVoice_iface
,
1129 EffectIndex
, pParameters
, ParametersByteSize
);
1132 static HRESULT WINAPI
XA23SUB_SetFilterParameters(IXAudio23SubmixVoice
*iface
,
1133 const XAUDIO2_FILTER_PARAMETERS
*pParameters
, UINT32 OperationSet
)
1135 XA2SubmixImpl
*This
= impl_from_IXAudio23SubmixVoice(iface
);
1136 return IXAudio2SubmixVoice_SetFilterParameters(&This
->IXAudio2SubmixVoice_iface
,
1137 pParameters
, OperationSet
);
1140 static void WINAPI
XA23SUB_GetFilterParameters(IXAudio23SubmixVoice
*iface
,
1141 XAUDIO2_FILTER_PARAMETERS
*pParameters
)
1143 XA2SubmixImpl
*This
= impl_from_IXAudio23SubmixVoice(iface
);
1144 return IXAudio2SubmixVoice_GetFilterParameters(&This
->IXAudio2SubmixVoice_iface
, pParameters
);
1147 static HRESULT WINAPI
XA23SUB_SetVolume(IXAudio23SubmixVoice
*iface
,
1148 float Volume
, UINT32 OperationSet
)
1150 XA2SubmixImpl
*This
= impl_from_IXAudio23SubmixVoice(iface
);
1151 return IXAudio2SubmixVoice_SetVolume(&This
->IXAudio2SubmixVoice_iface
,
1152 Volume
, OperationSet
);
1155 static void WINAPI
XA23SUB_GetVolume(IXAudio23SubmixVoice
*iface
,
1158 XA2SubmixImpl
*This
= impl_from_IXAudio23SubmixVoice(iface
);
1159 return IXAudio2SubmixVoice_GetVolume(&This
->IXAudio2SubmixVoice_iface
, pVolume
);
1162 static HRESULT WINAPI
XA23SUB_SetChannelVolumes(IXAudio23SubmixVoice
*iface
,
1163 UINT32 Channels
, const float *pVolumes
, UINT32 OperationSet
)
1165 XA2SubmixImpl
*This
= impl_from_IXAudio23SubmixVoice(iface
);
1166 return IXAudio2SubmixVoice_SetChannelVolumes(&This
->IXAudio2SubmixVoice_iface
,
1167 Channels
, pVolumes
, OperationSet
);
1170 static void WINAPI
XA23SUB_GetChannelVolumes(IXAudio23SubmixVoice
*iface
,
1171 UINT32 Channels
, float *pVolumes
)
1173 XA2SubmixImpl
*This
= impl_from_IXAudio23SubmixVoice(iface
);
1174 return IXAudio2SubmixVoice_GetChannelVolumes(&This
->IXAudio2SubmixVoice_iface
,
1175 Channels
, pVolumes
);
1178 static HRESULT WINAPI
XA23SUB_SetOutputMatrix(IXAudio23SubmixVoice
*iface
,
1179 IXAudio2Voice
*pDestinationVoice
, UINT32 SubmixChannels
,
1180 UINT32 DestinationChannels
, const float *pLevelMatrix
,
1181 UINT32 OperationSet
)
1183 XA2SubmixImpl
*This
= impl_from_IXAudio23SubmixVoice(iface
);
1184 return IXAudio2SubmixVoice_SetOutputMatrix(&This
->IXAudio2SubmixVoice_iface
,
1185 pDestinationVoice
, SubmixChannels
, DestinationChannels
,
1186 pLevelMatrix
, OperationSet
);
1189 static void WINAPI
XA23SUB_GetOutputMatrix(IXAudio23SubmixVoice
*iface
,
1190 IXAudio2Voice
*pDestinationVoice
, UINT32 SubmixChannels
,
1191 UINT32 DestinationChannels
, float *pLevelMatrix
)
1193 XA2SubmixImpl
*This
= impl_from_IXAudio23SubmixVoice(iface
);
1194 return IXAudio2SubmixVoice_GetOutputMatrix(&This
->IXAudio2SubmixVoice_iface
,
1195 pDestinationVoice
, SubmixChannels
, DestinationChannels
,
1199 static void WINAPI
XA23SUB_DestroyVoice(IXAudio23SubmixVoice
*iface
)
1201 XA2SubmixImpl
*This
= impl_from_IXAudio23SubmixVoice(iface
);
1202 return IXAudio2SubmixVoice_DestroyVoice(&This
->IXAudio2SubmixVoice_iface
);
1205 const IXAudio23SubmixVoiceVtbl XAudio23SubmixVoice_Vtbl
= {
1206 XA23SUB_GetVoiceDetails
,
1207 XA23SUB_SetOutputVoices
,
1208 XA23SUB_SetEffectChain
,
1209 XA23SUB_EnableEffect
,
1210 XA23SUB_DisableEffect
,
1211 XA23SUB_GetEffectState
,
1212 XA23SUB_SetEffectParameters
,
1213 XA23SUB_GetEffectParameters
,
1214 XA23SUB_SetFilterParameters
,
1215 XA23SUB_GetFilterParameters
,
1218 XA23SUB_SetChannelVolumes
,
1219 XA23SUB_GetChannelVolumes
,
1220 XA23SUB_SetOutputMatrix
,
1221 XA23SUB_GetOutputMatrix
,
1222 XA23SUB_DestroyVoice
1225 /* END IXAudio2SubmixVoice */
1228 /* BEGIN IXAudio2MasteringVoice */
1229 #if XAUDIO2_VER == 0
1230 static IXAudio2Impl
*impl_from_IXAudio20MasteringVoice(IXAudio20MasteringVoice
*iface
)
1232 return CONTAINING_RECORD(iface
, IXAudio2Impl
, IXAudio20MasteringVoice_iface
);
1235 static void WINAPI
XA20M_GetVoiceDetails(IXAudio20MasteringVoice
*iface
,
1236 XAUDIO2_VOICE_DETAILS
*pVoiceDetails
)
1238 IXAudio2Impl
*This
= impl_from_IXAudio20MasteringVoice(iface
);
1239 return IXAudio2MasteringVoice_GetVoiceDetails(&This
->IXAudio2MasteringVoice_iface
, pVoiceDetails
);
1242 static HRESULT WINAPI
XA20M_SetOutputVoices(IXAudio20MasteringVoice
*iface
,
1243 const XAUDIO23_VOICE_SENDS
*pSendList
)
1245 IXAudio2Impl
*This
= impl_from_IXAudio20MasteringVoice(iface
);
1246 XAUDIO2_VOICE_SENDS sends
;
1250 TRACE("%p, %p\n", This
, pSendList
);
1252 sends
.SendCount
= pSendList
->OutputCount
;
1253 sends
.pSends
= HeapAlloc(GetProcessHeap(), 0, sends
.SendCount
* sizeof(*sends
.pSends
));
1254 for(i
= 0; i
< sends
.SendCount
; ++i
){
1255 sends
.pSends
[i
].Flags
= 0;
1256 sends
.pSends
[i
].pOutputVoice
= pSendList
->pOutputVoices
[i
];
1259 hr
= IXAudio2MasteringVoice_SetOutputVoices(&This
->IXAudio2MasteringVoice_iface
, &sends
);
1261 HeapFree(GetProcessHeap(), 0, sends
.pSends
);
1266 static HRESULT WINAPI
XA20M_SetEffectChain(IXAudio20MasteringVoice
*iface
,
1267 const XAUDIO2_EFFECT_CHAIN
*pEffectChain
)
1269 IXAudio2Impl
*This
= impl_from_IXAudio20MasteringVoice(iface
);
1270 return IXAudio2MasteringVoice_SetEffectChain(&This
->IXAudio2MasteringVoice_iface
, pEffectChain
);
1273 static HRESULT WINAPI
XA20M_EnableEffect(IXAudio20MasteringVoice
*iface
,
1274 UINT32 EffectIndex
, UINT32 OperationSet
)
1276 IXAudio2Impl
*This
= impl_from_IXAudio20MasteringVoice(iface
);
1277 return IXAudio2MasteringVoice_EnableEffect(&This
->IXAudio2MasteringVoice_iface
,
1278 EffectIndex
, OperationSet
);
1281 static HRESULT WINAPI
XA20M_DisableEffect(IXAudio20MasteringVoice
*iface
,
1282 UINT32 EffectIndex
, UINT32 OperationSet
)
1284 IXAudio2Impl
*This
= impl_from_IXAudio20MasteringVoice(iface
);
1285 return IXAudio2MasteringVoice_DisableEffect(&This
->IXAudio2MasteringVoice_iface
,
1286 EffectIndex
, OperationSet
);
1289 static void WINAPI
XA20M_GetEffectState(IXAudio20MasteringVoice
*iface
,
1290 UINT32 EffectIndex
, BOOL
*pEnabled
)
1292 IXAudio2Impl
*This
= impl_from_IXAudio20MasteringVoice(iface
);
1293 return IXAudio2MasteringVoice_GetEffectState(&This
->IXAudio2MasteringVoice_iface
,
1294 EffectIndex
, pEnabled
);
1297 static HRESULT WINAPI
XA20M_SetEffectParameters(IXAudio20MasteringVoice
*iface
,
1298 UINT32 EffectIndex
, const void *pParameters
, UINT32 ParametersByteSize
,
1299 UINT32 OperationSet
)
1301 IXAudio2Impl
*This
= impl_from_IXAudio20MasteringVoice(iface
);
1302 return IXAudio2MasteringVoice_SetEffectParameters(&This
->IXAudio2MasteringVoice_iface
,
1303 EffectIndex
, pParameters
, ParametersByteSize
, OperationSet
);
1306 static HRESULT WINAPI
XA20M_GetEffectParameters(IXAudio20MasteringVoice
*iface
,
1307 UINT32 EffectIndex
, void *pParameters
, UINT32 ParametersByteSize
)
1309 IXAudio2Impl
*This
= impl_from_IXAudio20MasteringVoice(iface
);
1310 return IXAudio2MasteringVoice_GetEffectParameters(&This
->IXAudio2MasteringVoice_iface
,
1311 EffectIndex
, pParameters
, ParametersByteSize
);
1314 static HRESULT WINAPI
XA20M_SetFilterParameters(IXAudio20MasteringVoice
*iface
,
1315 const XAUDIO2_FILTER_PARAMETERS
*pParameters
, UINT32 OperationSet
)
1317 IXAudio2Impl
*This
= impl_from_IXAudio20MasteringVoice(iface
);
1318 return IXAudio2MasteringVoice_SetFilterParameters(&This
->IXAudio2MasteringVoice_iface
,
1319 pParameters
, OperationSet
);
1322 static void WINAPI
XA20M_GetFilterParameters(IXAudio20MasteringVoice
*iface
,
1323 XAUDIO2_FILTER_PARAMETERS
*pParameters
)
1325 IXAudio2Impl
*This
= impl_from_IXAudio20MasteringVoice(iface
);
1326 return IXAudio2MasteringVoice_GetFilterParameters(&This
->IXAudio2MasteringVoice_iface
, pParameters
);
1329 static HRESULT WINAPI
XA20M_SetVolume(IXAudio20MasteringVoice
*iface
,
1330 float Volume
, UINT32 OperationSet
)
1332 IXAudio2Impl
*This
= impl_from_IXAudio20MasteringVoice(iface
);
1333 return IXAudio2MasteringVoice_SetVolume(&This
->IXAudio2MasteringVoice_iface
,
1334 Volume
, OperationSet
);
1337 static void WINAPI
XA20M_GetVolume(IXAudio20MasteringVoice
*iface
,
1340 IXAudio2Impl
*This
= impl_from_IXAudio20MasteringVoice(iface
);
1341 return IXAudio2MasteringVoice_GetVolume(&This
->IXAudio2MasteringVoice_iface
, pVolume
);
1344 static HRESULT WINAPI
XA20M_SetChannelVolumes(IXAudio20MasteringVoice
*iface
,
1345 UINT32 Channels
, const float *pVolumes
, UINT32 OperationSet
)
1347 IXAudio2Impl
*This
= impl_from_IXAudio20MasteringVoice(iface
);
1348 return IXAudio2MasteringVoice_SetChannelVolumes(&This
->IXAudio2MasteringVoice_iface
,
1349 Channels
, pVolumes
, OperationSet
);
1352 static void WINAPI
XA20M_GetChannelVolumes(IXAudio20MasteringVoice
*iface
,
1353 UINT32 Channels
, float *pVolumes
)
1355 IXAudio2Impl
*This
= impl_from_IXAudio20MasteringVoice(iface
);
1356 return IXAudio2MasteringVoice_GetChannelVolumes(&This
->IXAudio2MasteringVoice_iface
,
1357 Channels
, pVolumes
);
1360 static HRESULT WINAPI
XA20M_SetOutputMatrix(IXAudio20MasteringVoice
*iface
,
1361 IXAudio2Voice
*pDestinationVoice
, UINT32 MasteringChannels
,
1362 UINT32 DestinationChannels
, const float *pLevelMatrix
,
1363 UINT32 OperationSet
)
1365 IXAudio2Impl
*This
= impl_from_IXAudio20MasteringVoice(iface
);
1366 return IXAudio2MasteringVoice_SetOutputMatrix(&This
->IXAudio2MasteringVoice_iface
,
1367 pDestinationVoice
, MasteringChannels
, DestinationChannels
,
1368 pLevelMatrix
, OperationSet
);
1371 static HRESULT WINAPI
XA20M_GetOutputMatrix(IXAudio20MasteringVoice
*iface
,
1372 IXAudio2Voice
*pDestinationVoice
, UINT32 MasteringChannels
,
1373 UINT32 DestinationChannels
, float *pLevelMatrix
)
1375 IXAudio2Impl
*This
= impl_from_IXAudio20MasteringVoice(iface
);
1376 IXAudio2MasteringVoice_GetOutputMatrix(&This
->IXAudio2MasteringVoice_iface
,
1377 pDestinationVoice
, MasteringChannels
, DestinationChannels
,
1382 static void WINAPI
XA20M_DestroyVoice(IXAudio20MasteringVoice
*iface
)
1384 IXAudio2Impl
*This
= impl_from_IXAudio20MasteringVoice(iface
);
1385 return IXAudio2MasteringVoice_DestroyVoice(&This
->IXAudio2MasteringVoice_iface
);
1388 const IXAudio20MasteringVoiceVtbl XAudio20MasteringVoice_Vtbl
= {
1389 XA20M_GetVoiceDetails
,
1390 XA20M_SetOutputVoices
,
1391 XA20M_SetEffectChain
,
1393 XA20M_DisableEffect
,
1394 XA20M_GetEffectState
,
1395 XA20M_SetEffectParameters
,
1396 XA20M_GetEffectParameters
,
1397 XA20M_SetFilterParameters
,
1398 XA20M_GetFilterParameters
,
1401 XA20M_SetChannelVolumes
,
1402 XA20M_GetChannelVolumes
,
1403 XA20M_SetOutputMatrix
,
1404 XA20M_GetOutputMatrix
,
1408 #elif XAUDIO2_VER <= 3
1410 static IXAudio2Impl
*impl_from_IXAudio23MasteringVoice(IXAudio23MasteringVoice
*iface
)
1412 return CONTAINING_RECORD(iface
, IXAudio2Impl
, IXAudio23MasteringVoice_iface
);
1415 static void WINAPI
XA23M_GetVoiceDetails(IXAudio23MasteringVoice
*iface
,
1416 XAUDIO2_VOICE_DETAILS
*pVoiceDetails
)
1418 IXAudio2Impl
*This
= impl_from_IXAudio23MasteringVoice(iface
);
1419 return IXAudio2MasteringVoice_GetVoiceDetails(&This
->IXAudio2MasteringVoice_iface
, pVoiceDetails
);
1422 static HRESULT WINAPI
XA23M_SetOutputVoices(IXAudio23MasteringVoice
*iface
,
1423 const XAUDIO23_VOICE_SENDS
*pSendList
)
1425 IXAudio2Impl
*This
= impl_from_IXAudio23MasteringVoice(iface
);
1426 XAUDIO2_VOICE_SENDS sends
;
1430 TRACE("%p, %p\n", This
, pSendList
);
1432 sends
.SendCount
= pSendList
->OutputCount
;
1433 sends
.pSends
= HeapAlloc(GetProcessHeap(), 0, sends
.SendCount
* sizeof(*sends
.pSends
));
1434 for(i
= 0; i
< sends
.SendCount
; ++i
){
1435 sends
.pSends
[i
].Flags
= 0;
1436 sends
.pSends
[i
].pOutputVoice
= pSendList
->pOutputVoices
[i
];
1439 hr
= IXAudio2MasteringVoice_SetOutputVoices(&This
->IXAudio2MasteringVoice_iface
, &sends
);
1441 HeapFree(GetProcessHeap(), 0, sends
.pSends
);
1446 static HRESULT WINAPI
XA23M_SetEffectChain(IXAudio23MasteringVoice
*iface
,
1447 const XAUDIO2_EFFECT_CHAIN
*pEffectChain
)
1449 IXAudio2Impl
*This
= impl_from_IXAudio23MasteringVoice(iface
);
1450 return IXAudio2MasteringVoice_SetEffectChain(&This
->IXAudio2MasteringVoice_iface
, pEffectChain
);
1453 static HRESULT WINAPI
XA23M_EnableEffect(IXAudio23MasteringVoice
*iface
,
1454 UINT32 EffectIndex
, UINT32 OperationSet
)
1456 IXAudio2Impl
*This
= impl_from_IXAudio23MasteringVoice(iface
);
1457 return IXAudio2MasteringVoice_EnableEffect(&This
->IXAudio2MasteringVoice_iface
,
1458 EffectIndex
, OperationSet
);
1461 static HRESULT WINAPI
XA23M_DisableEffect(IXAudio23MasteringVoice
*iface
,
1462 UINT32 EffectIndex
, UINT32 OperationSet
)
1464 IXAudio2Impl
*This
= impl_from_IXAudio23MasteringVoice(iface
);
1465 return IXAudio2MasteringVoice_DisableEffect(&This
->IXAudio2MasteringVoice_iface
,
1466 EffectIndex
, OperationSet
);
1469 static void WINAPI
XA23M_GetEffectState(IXAudio23MasteringVoice
*iface
,
1470 UINT32 EffectIndex
, BOOL
*pEnabled
)
1472 IXAudio2Impl
*This
= impl_from_IXAudio23MasteringVoice(iface
);
1473 return IXAudio2MasteringVoice_GetEffectState(&This
->IXAudio2MasteringVoice_iface
,
1474 EffectIndex
, pEnabled
);
1477 static HRESULT WINAPI
XA23M_SetEffectParameters(IXAudio23MasteringVoice
*iface
,
1478 UINT32 EffectIndex
, const void *pParameters
, UINT32 ParametersByteSize
,
1479 UINT32 OperationSet
)
1481 IXAudio2Impl
*This
= impl_from_IXAudio23MasteringVoice(iface
);
1482 return IXAudio2MasteringVoice_SetEffectParameters(&This
->IXAudio2MasteringVoice_iface
,
1483 EffectIndex
, pParameters
, ParametersByteSize
, OperationSet
);
1486 static HRESULT WINAPI
XA23M_GetEffectParameters(IXAudio23MasteringVoice
*iface
,
1487 UINT32 EffectIndex
, void *pParameters
, UINT32 ParametersByteSize
)
1489 IXAudio2Impl
*This
= impl_from_IXAudio23MasteringVoice(iface
);
1490 return IXAudio2MasteringVoice_GetEffectParameters(&This
->IXAudio2MasteringVoice_iface
,
1491 EffectIndex
, pParameters
, ParametersByteSize
);
1494 static HRESULT WINAPI
XA23M_SetFilterParameters(IXAudio23MasteringVoice
*iface
,
1495 const XAUDIO2_FILTER_PARAMETERS
*pParameters
, UINT32 OperationSet
)
1497 IXAudio2Impl
*This
= impl_from_IXAudio23MasteringVoice(iface
);
1498 return IXAudio2MasteringVoice_SetFilterParameters(&This
->IXAudio2MasteringVoice_iface
,
1499 pParameters
, OperationSet
);
1502 static void WINAPI
XA23M_GetFilterParameters(IXAudio23MasteringVoice
*iface
,
1503 XAUDIO2_FILTER_PARAMETERS
*pParameters
)
1505 IXAudio2Impl
*This
= impl_from_IXAudio23MasteringVoice(iface
);
1506 return IXAudio2MasteringVoice_GetFilterParameters(&This
->IXAudio2MasteringVoice_iface
, pParameters
);
1509 static HRESULT WINAPI
XA23M_SetVolume(IXAudio23MasteringVoice
*iface
,
1510 float Volume
, UINT32 OperationSet
)
1512 IXAudio2Impl
*This
= impl_from_IXAudio23MasteringVoice(iface
);
1513 return IXAudio2MasteringVoice_SetVolume(&This
->IXAudio2MasteringVoice_iface
,
1514 Volume
, OperationSet
);
1517 static void WINAPI
XA23M_GetVolume(IXAudio23MasteringVoice
*iface
,
1520 IXAudio2Impl
*This
= impl_from_IXAudio23MasteringVoice(iface
);
1521 return IXAudio2MasteringVoice_GetVolume(&This
->IXAudio2MasteringVoice_iface
, pVolume
);
1524 static HRESULT WINAPI
XA23M_SetChannelVolumes(IXAudio23MasteringVoice
*iface
,
1525 UINT32 Channels
, const float *pVolumes
, UINT32 OperationSet
)
1527 IXAudio2Impl
*This
= impl_from_IXAudio23MasteringVoice(iface
);
1528 return IXAudio2MasteringVoice_SetChannelVolumes(&This
->IXAudio2MasteringVoice_iface
,
1529 Channels
, pVolumes
, OperationSet
);
1532 static void WINAPI
XA23M_GetChannelVolumes(IXAudio23MasteringVoice
*iface
,
1533 UINT32 Channels
, float *pVolumes
)
1535 IXAudio2Impl
*This
= impl_from_IXAudio23MasteringVoice(iface
);
1536 return IXAudio2MasteringVoice_GetChannelVolumes(&This
->IXAudio2MasteringVoice_iface
,
1537 Channels
, pVolumes
);
1540 static HRESULT WINAPI
XA23M_SetOutputMatrix(IXAudio23MasteringVoice
*iface
,
1541 IXAudio2Voice
*pDestinationVoice
, UINT32 MasteringChannels
,
1542 UINT32 DestinationChannels
, const float *pLevelMatrix
,
1543 UINT32 OperationSet
)
1545 IXAudio2Impl
*This
= impl_from_IXAudio23MasteringVoice(iface
);
1546 return IXAudio2MasteringVoice_SetOutputMatrix(&This
->IXAudio2MasteringVoice_iface
,
1547 pDestinationVoice
, MasteringChannels
, DestinationChannels
,
1548 pLevelMatrix
, OperationSet
);
1551 static void WINAPI
XA23M_GetOutputMatrix(IXAudio23MasteringVoice
*iface
,
1552 IXAudio2Voice
*pDestinationVoice
, UINT32 MasteringChannels
,
1553 UINT32 DestinationChannels
, float *pLevelMatrix
)
1555 IXAudio2Impl
*This
= impl_from_IXAudio23MasteringVoice(iface
);
1556 return IXAudio2MasteringVoice_GetOutputMatrix(&This
->IXAudio2MasteringVoice_iface
,
1557 pDestinationVoice
, MasteringChannels
, DestinationChannels
,
1561 static void WINAPI
XA23M_DestroyVoice(IXAudio23MasteringVoice
*iface
)
1563 IXAudio2Impl
*This
= impl_from_IXAudio23MasteringVoice(iface
);
1564 return IXAudio2MasteringVoice_DestroyVoice(&This
->IXAudio2MasteringVoice_iface
);
1567 const IXAudio23MasteringVoiceVtbl XAudio23MasteringVoice_Vtbl
= {
1568 XA23M_GetVoiceDetails
,
1569 XA23M_SetOutputVoices
,
1570 XA23M_SetEffectChain
,
1572 XA23M_DisableEffect
,
1573 XA23M_GetEffectState
,
1574 XA23M_SetEffectParameters
,
1575 XA23M_GetEffectParameters
,
1576 XA23M_SetFilterParameters
,
1577 XA23M_GetFilterParameters
,
1580 XA23M_SetChannelVolumes
,
1581 XA23M_GetChannelVolumes
,
1582 XA23M_SetOutputMatrix
,
1583 XA23M_GetOutputMatrix
,
1587 /* END IXAudio2MasteringVoice */
1590 /* BEGIN IXAudio2 */
1591 #if XAUDIO2_VER == 0
1592 static inline IXAudio2Impl
*impl_from_IXAudio20(IXAudio20
*iface
)
1594 return CONTAINING_RECORD(iface
, IXAudio2Impl
, IXAudio20_iface
);
1597 static HRESULT WINAPI
XA20_QueryInterface(IXAudio20
*iface
, REFIID riid
,
1600 IXAudio2Impl
*This
= impl_from_IXAudio20(iface
);
1601 return IXAudio2_QueryInterface(&This
->IXAudio2_iface
, riid
, ppvObject
);
1604 static ULONG WINAPI
XA20_AddRef(IXAudio20
*iface
)
1606 IXAudio2Impl
*This
= impl_from_IXAudio20(iface
);
1607 return IXAudio2_AddRef(&This
->IXAudio2_iface
);
1610 static ULONG WINAPI
XA20_Release(IXAudio20
*iface
)
1612 IXAudio2Impl
*This
= impl_from_IXAudio20(iface
);
1613 return IXAudio2_Release(&This
->IXAudio2_iface
);
1616 static HRESULT WINAPI
XA20_GetDeviceCount(IXAudio20
*iface
, UINT32
*pCount
)
1618 IXAudio2Impl
*This
= impl_from_IXAudio20(iface
);
1620 TRACE("%p, %p\n", This
, pCount
);
1622 *pCount
= This
->ndevs
;
1627 static HRESULT WINAPI
XA20_GetDeviceDetails(IXAudio20
*iface
, UINT32 index
,
1628 XAUDIO2_DEVICE_DETAILS
*pDeviceDetails
)
1630 IXAudio2Impl
*This
= impl_from_IXAudio20(iface
);
1633 IAudioClient
*client
;
1638 TRACE("%p, %u, %p\n", This
, index
, pDeviceDetails
);
1640 if(index
>= This
->ndevs
)
1641 return E_INVALIDARG
;
1643 hr
= IMMDeviceEnumerator_GetDevice(This
->devenum
, This
->devids
[index
], &dev
);
1645 WARN("GetDevice failed: %08x\n", hr
);
1649 hr
= IMMDevice_Activate(dev
, &IID_IAudioClient
, CLSCTX_INPROC_SERVER
,
1650 NULL
, (void**)&client
);
1652 WARN("Activate failed: %08x\n", hr
);
1653 IMMDevice_Release(dev
);
1657 hr
= IMMDevice_OpenPropertyStore(dev
, STGM_READ
, &ps
);
1659 WARN("OpenPropertyStore failed: %08x\n", hr
);
1660 IAudioClient_Release(client
);
1661 IMMDevice_Release(dev
);
1665 PropVariantInit(&var
);
1667 hr
= IPropertyStore_GetValue(ps
, (PROPERTYKEY
*)&DEVPKEY_Device_FriendlyName
, &var
);
1669 WARN("GetValue failed: %08x\n", hr
);
1673 lstrcpynW(pDeviceDetails
->DisplayName
, var
.u
.pwszVal
, sizeof(pDeviceDetails
->DisplayName
)/sizeof(WCHAR
));
1675 PropVariantClear(&var
);
1677 hr
= IAudioClient_GetMixFormat(client
, &wfx
);
1679 WARN("GetMixFormat failed: %08x\n", hr
);
1683 lstrcpyW(pDeviceDetails
->DeviceID
, This
->devids
[index
]);
1686 pDeviceDetails
->Role
= GlobalDefaultDevice
;
1688 pDeviceDetails
->Role
= NotDefaultDevice
;
1690 if(sizeof(WAVEFORMATEX
) + wfx
->cbSize
> sizeof(pDeviceDetails
->OutputFormat
)){
1691 FIXME("AudioClient format is too large to fit into WAVEFORMATEXTENSIBLE!\n");
1696 memcpy(&pDeviceDetails
->OutputFormat
, wfx
, sizeof(WAVEFORMATEX
) + wfx
->cbSize
);
1701 IPropertyStore_Release(ps
);
1702 IAudioClient_Release(client
);
1703 IMMDevice_Release(dev
);
1708 static HRESULT WINAPI
XA20_Initialize(IXAudio20
*iface
, UINT32 flags
,
1709 XAUDIO2_PROCESSOR processor
)
1711 IXAudio2Impl
*This
= impl_from_IXAudio20(iface
);
1712 TRACE("(%p)->(0x%x, 0x%x)\n", This
, flags
, processor
);
1713 return xaudio2_initialize(This
, flags
, processor
);
1716 static HRESULT WINAPI
XA20_RegisterForCallbacks(IXAudio20
*iface
,
1717 IXAudio2EngineCallback
*pCallback
)
1719 IXAudio2Impl
*This
= impl_from_IXAudio20(iface
);
1720 return IXAudio2_RegisterForCallbacks(&This
->IXAudio2_iface
, pCallback
);
1723 static void WINAPI
XA20_UnregisterForCallbacks(IXAudio20
*iface
,
1724 IXAudio2EngineCallback
*pCallback
)
1726 IXAudio2Impl
*This
= impl_from_IXAudio20(iface
);
1727 return IXAudio2_UnregisterForCallbacks(&This
->IXAudio2_iface
, pCallback
);
1730 static HRESULT WINAPI
XA20_CreateSourceVoice(IXAudio20
*iface
,
1731 IXAudio2SourceVoice
**ppSourceVoice
, const WAVEFORMATEX
*pSourceFormat
,
1732 UINT32 flags
, float maxFrequencyRatio
,
1733 IXAudio2VoiceCallback
*pCallback
, const XAUDIO2_VOICE_SENDS
*pSendList
,
1734 const XAUDIO2_EFFECT_CHAIN
*pEffectChain
)
1736 IXAudio2Impl
*This
= impl_from_IXAudio20(iface
);
1737 return IXAudio2_CreateSourceVoice(&This
->IXAudio2_iface
, ppSourceVoice
,
1738 pSourceFormat
, flags
, maxFrequencyRatio
, pCallback
, pSendList
,
1742 static HRESULT WINAPI
XA20_CreateSubmixVoice(IXAudio20
*iface
,
1743 IXAudio2SubmixVoice
**ppSubmixVoice
, UINT32 inputChannels
,
1744 UINT32 inputSampleRate
, UINT32 flags
, UINT32 processingStage
,
1745 const XAUDIO2_VOICE_SENDS
*pSendList
,
1746 const XAUDIO2_EFFECT_CHAIN
*pEffectChain
)
1748 IXAudio2Impl
*This
= impl_from_IXAudio20(iface
);
1749 return IXAudio2_CreateSubmixVoice(&This
->IXAudio2_iface
, ppSubmixVoice
,
1750 inputChannels
, inputSampleRate
, flags
, processingStage
, pSendList
,
1754 static HRESULT WINAPI
XA20_CreateMasteringVoice(IXAudio20
*iface
,
1755 IXAudio2MasteringVoice
**ppMasteringVoice
, UINT32 inputChannels
,
1756 UINT32 inputSampleRate
, UINT32 flags
, UINT32 deviceIndex
,
1757 const XAUDIO2_EFFECT_CHAIN
*pEffectChain
)
1759 IXAudio2Impl
*This
= impl_from_IXAudio20(iface
);
1761 TRACE("(%p)->(%p, %u, %u, 0x%x, %u, %p)\n", This
, ppMasteringVoice
,
1762 inputChannels
, inputSampleRate
, flags
, deviceIndex
,
1765 if(deviceIndex
>= This
->ndevs
)
1766 return E_INVALIDARG
;
1768 return IXAudio2_CreateMasteringVoice(&This
->IXAudio2_iface
, ppMasteringVoice
,
1769 inputChannels
, inputSampleRate
, flags
, This
->devids
[deviceIndex
],
1770 pEffectChain
, AudioCategory_GameEffects
);
1773 static HRESULT WINAPI
XA20_StartEngine(IXAudio20
*iface
)
1775 IXAudio2Impl
*This
= impl_from_IXAudio20(iface
);
1776 return IXAudio2_StartEngine(&This
->IXAudio2_iface
);
1779 static void WINAPI
XA20_StopEngine(IXAudio20
*iface
)
1781 IXAudio2Impl
*This
= impl_from_IXAudio20(iface
);
1782 return IXAudio2_StopEngine(&This
->IXAudio2_iface
);
1785 static HRESULT WINAPI
XA20_CommitChanges(IXAudio20
*iface
, UINT32 operationSet
)
1787 IXAudio2Impl
*This
= impl_from_IXAudio20(iface
);
1788 return IXAudio2_CommitChanges(&This
->IXAudio2_iface
, operationSet
);
1791 static void WINAPI
XA20_GetPerformanceData(IXAudio20
*iface
,
1792 XAUDIO20_PERFORMANCE_DATA
*pPerfData
)
1794 IXAudio2Impl
*This
= impl_from_IXAudio20(iface
);
1795 XAUDIO2_PERFORMANCE_DATA data
;
1797 IXAudio2_GetPerformanceData(&This
->IXAudio2_iface
, &data
);
1799 pPerfData
->AudioCyclesSinceLastQuery
= data
.AudioCyclesSinceLastQuery
;
1800 pPerfData
->TotalCyclesSinceLastQuery
= data
.TotalCyclesSinceLastQuery
;
1801 pPerfData
->MinimumCyclesPerQuantum
= data
.MinimumCyclesPerQuantum
;
1802 pPerfData
->MaximumCyclesPerQuantum
= data
.MaximumCyclesPerQuantum
;
1803 pPerfData
->MemoryUsageInBytes
= data
.MemoryUsageInBytes
;
1804 pPerfData
->CurrentLatencyInSamples
= data
.CurrentLatencyInSamples
;
1805 pPerfData
->GlitchesSinceLastQuery
= data
.GlitchesSinceEngineStarted
- This
->last_query_glitches
;
1806 This
->last_query_glitches
= data
.GlitchesSinceEngineStarted
;
1807 pPerfData
->ActiveSourceVoiceCount
= data
.ActiveSourceVoiceCount
;
1808 pPerfData
->TotalSourceVoiceCount
= data
.TotalSourceVoiceCount
;
1810 pPerfData
->ActiveSubmixVoiceCount
= data
.ActiveSubmixVoiceCount
;
1811 pPerfData
->TotalSubmixVoiceCount
= data
.ActiveSubmixVoiceCount
;
1813 pPerfData
->ActiveXmaSourceVoices
= data
.ActiveXmaSourceVoices
;
1814 pPerfData
->ActiveXmaStreams
= data
.ActiveXmaStreams
;
1817 static void WINAPI
XA20_SetDebugConfiguration(IXAudio20
*iface
,
1818 const XAUDIO2_DEBUG_CONFIGURATION
*pDebugConfiguration
,
1821 IXAudio2Impl
*This
= impl_from_IXAudio20(iface
);
1822 return IXAudio2_SetDebugConfiguration(&This
->IXAudio2_iface
,
1823 pDebugConfiguration
, pReserved
);
1826 const IXAudio20Vtbl XAudio20_Vtbl
= {
1827 XA20_QueryInterface
,
1830 XA20_GetDeviceCount
,
1831 XA20_GetDeviceDetails
,
1833 XA20_RegisterForCallbacks
,
1834 XA20_UnregisterForCallbacks
,
1835 XA20_CreateSourceVoice
,
1836 XA20_CreateSubmixVoice
,
1837 XA20_CreateMasteringVoice
,
1841 XA20_GetPerformanceData
,
1842 XA20_SetDebugConfiguration
1845 #elif XAUDIO2_VER <= 2
1847 static inline IXAudio2Impl
*impl_from_IXAudio22(IXAudio22
*iface
)
1849 return CONTAINING_RECORD(iface
, IXAudio2Impl
, IXAudio22_iface
);
1852 static HRESULT WINAPI
XA22_QueryInterface(IXAudio22
*iface
, REFIID riid
,
1855 IXAudio2Impl
*This
= impl_from_IXAudio22(iface
);
1856 return IXAudio2_QueryInterface(&This
->IXAudio2_iface
, riid
, ppvObject
);
1859 static ULONG WINAPI
XA22_AddRef(IXAudio22
*iface
)
1861 IXAudio2Impl
*This
= impl_from_IXAudio22(iface
);
1862 return IXAudio2_AddRef(&This
->IXAudio2_iface
);
1865 static ULONG WINAPI
XA22_Release(IXAudio22
*iface
)
1867 IXAudio2Impl
*This
= impl_from_IXAudio22(iface
);
1868 return IXAudio2_Release(&This
->IXAudio2_iface
);
1871 static HRESULT WINAPI
XA22_GetDeviceCount(IXAudio22
*iface
, UINT32
*pCount
)
1873 IXAudio2Impl
*This
= impl_from_IXAudio22(iface
);
1875 TRACE("%p, %p\n", This
, pCount
);
1877 *pCount
= This
->ndevs
;
1882 static HRESULT WINAPI
XA22_GetDeviceDetails(IXAudio22
*iface
, UINT32 index
,
1883 XAUDIO2_DEVICE_DETAILS
*pDeviceDetails
)
1885 IXAudio2Impl
*This
= impl_from_IXAudio22(iface
);
1888 IAudioClient
*client
;
1893 TRACE("%p, %u, %p\n", This
, index
, pDeviceDetails
);
1895 if(index
>= This
->ndevs
)
1896 return E_INVALIDARG
;
1898 hr
= IMMDeviceEnumerator_GetDevice(This
->devenum
, This
->devids
[index
], &dev
);
1900 WARN("GetDevice failed: %08x\n", hr
);
1904 hr
= IMMDevice_Activate(dev
, &IID_IAudioClient
, CLSCTX_INPROC_SERVER
,
1905 NULL
, (void**)&client
);
1907 WARN("Activate failed: %08x\n", hr
);
1908 IMMDevice_Release(dev
);
1912 hr
= IMMDevice_OpenPropertyStore(dev
, STGM_READ
, &ps
);
1914 WARN("OpenPropertyStore failed: %08x\n", hr
);
1915 IAudioClient_Release(client
);
1916 IMMDevice_Release(dev
);
1920 PropVariantInit(&var
);
1922 hr
= IPropertyStore_GetValue(ps
, (PROPERTYKEY
*)&DEVPKEY_Device_FriendlyName
, &var
);
1924 WARN("GetValue failed: %08x\n", hr
);
1928 lstrcpynW(pDeviceDetails
->DisplayName
, var
.u
.pwszVal
, sizeof(pDeviceDetails
->DisplayName
)/sizeof(WCHAR
));
1930 PropVariantClear(&var
);
1932 hr
= IAudioClient_GetMixFormat(client
, &wfx
);
1934 WARN("GetMixFormat failed: %08x\n", hr
);
1938 lstrcpyW(pDeviceDetails
->DeviceID
, This
->devids
[index
]);
1941 pDeviceDetails
->Role
= GlobalDefaultDevice
;
1943 pDeviceDetails
->Role
= NotDefaultDevice
;
1945 if(sizeof(WAVEFORMATEX
) + wfx
->cbSize
> sizeof(pDeviceDetails
->OutputFormat
)){
1946 FIXME("AudioClient format is too large to fit into WAVEFORMATEXTENSIBLE!\n");
1951 memcpy(&pDeviceDetails
->OutputFormat
, wfx
, sizeof(WAVEFORMATEX
) + wfx
->cbSize
);
1956 IPropertyStore_Release(ps
);
1957 IAudioClient_Release(client
);
1958 IMMDevice_Release(dev
);
1963 static HRESULT WINAPI
XA22_Initialize(IXAudio22
*iface
, UINT32 flags
,
1964 XAUDIO2_PROCESSOR processor
)
1966 IXAudio2Impl
*This
= impl_from_IXAudio22(iface
);
1967 TRACE("(%p)->(0x%x, 0x%x)\n", This
, flags
, processor
);
1968 return xaudio2_initialize(This
, flags
, processor
);
1971 static HRESULT WINAPI
XA22_RegisterForCallbacks(IXAudio22
*iface
,
1972 IXAudio2EngineCallback
*pCallback
)
1974 IXAudio2Impl
*This
= impl_from_IXAudio22(iface
);
1975 return IXAudio2_RegisterForCallbacks(&This
->IXAudio2_iface
, pCallback
);
1978 static void WINAPI
XA22_UnregisterForCallbacks(IXAudio22
*iface
,
1979 IXAudio2EngineCallback
*pCallback
)
1981 IXAudio2Impl
*This
= impl_from_IXAudio22(iface
);
1982 IXAudio2_UnregisterForCallbacks(&This
->IXAudio2_iface
, pCallback
);
1985 static HRESULT WINAPI
XA22_CreateSourceVoice(IXAudio22
*iface
,
1986 IXAudio2SourceVoice
**ppSourceVoice
, const WAVEFORMATEX
*pSourceFormat
,
1987 UINT32 flags
, float maxFrequencyRatio
,
1988 IXAudio2VoiceCallback
*pCallback
, const XAUDIO2_VOICE_SENDS
*pSendList
,
1989 const XAUDIO2_EFFECT_CHAIN
*pEffectChain
)
1991 IXAudio2Impl
*This
= impl_from_IXAudio22(iface
);
1992 return IXAudio2_CreateSourceVoice(&This
->IXAudio2_iface
, ppSourceVoice
,
1993 pSourceFormat
, flags
, maxFrequencyRatio
, pCallback
, pSendList
,
1997 static HRESULT WINAPI
XA22_CreateSubmixVoice(IXAudio22
*iface
,
1998 IXAudio2SubmixVoice
**ppSubmixVoice
, UINT32 inputChannels
,
1999 UINT32 inputSampleRate
, UINT32 flags
, UINT32 processingStage
,
2000 const XAUDIO2_VOICE_SENDS
*pSendList
,
2001 const XAUDIO2_EFFECT_CHAIN
*pEffectChain
)
2003 IXAudio2Impl
*This
= impl_from_IXAudio22(iface
);
2004 return IXAudio2_CreateSubmixVoice(&This
->IXAudio2_iface
, ppSubmixVoice
,
2005 inputChannels
, inputSampleRate
, flags
, processingStage
, pSendList
,
2009 static HRESULT WINAPI
XA22_CreateMasteringVoice(IXAudio22
*iface
,
2010 IXAudio2MasteringVoice
**ppMasteringVoice
, UINT32 inputChannels
,
2011 UINT32 inputSampleRate
, UINT32 flags
, UINT32 deviceIndex
,
2012 const XAUDIO2_EFFECT_CHAIN
*pEffectChain
)
2014 IXAudio2Impl
*This
= impl_from_IXAudio22(iface
);
2016 TRACE("(%p)->(%p, %u, %u, 0x%x, %u, %p)\n", This
, ppMasteringVoice
,
2017 inputChannels
, inputSampleRate
, flags
, deviceIndex
,
2020 if(deviceIndex
>= This
->ndevs
)
2021 return E_INVALIDARG
;
2023 return IXAudio2_CreateMasteringVoice(&This
->IXAudio2_iface
, ppMasteringVoice
,
2024 inputChannels
, inputSampleRate
, flags
, This
->devids
[deviceIndex
],
2025 pEffectChain
, AudioCategory_GameEffects
);
2028 static HRESULT WINAPI
XA22_StartEngine(IXAudio22
*iface
)
2030 IXAudio2Impl
*This
= impl_from_IXAudio22(iface
);
2031 return IXAudio2_StartEngine(&This
->IXAudio2_iface
);
2034 static void WINAPI
XA22_StopEngine(IXAudio22
*iface
)
2036 IXAudio2Impl
*This
= impl_from_IXAudio22(iface
);
2037 return IXAudio2_StopEngine(&This
->IXAudio2_iface
);
2040 static HRESULT WINAPI
XA22_CommitChanges(IXAudio22
*iface
, UINT32 operationSet
)
2042 IXAudio2Impl
*This
= impl_from_IXAudio22(iface
);
2043 return IXAudio2_CommitChanges(&This
->IXAudio2_iface
, operationSet
);
2046 static void WINAPI
XA22_GetPerformanceData(IXAudio22
*iface
,
2047 XAUDIO22_PERFORMANCE_DATA
*pPerfData
)
2049 IXAudio2Impl
*This
= impl_from_IXAudio22(iface
);
2050 XAUDIO2_PERFORMANCE_DATA data
;
2052 IXAudio2_GetPerformanceData(&This
->IXAudio2_iface
, &data
);
2054 pPerfData
->AudioCyclesSinceLastQuery
= data
.AudioCyclesSinceLastQuery
;
2055 pPerfData
->TotalCyclesSinceLastQuery
= data
.TotalCyclesSinceLastQuery
;
2056 pPerfData
->MinimumCyclesPerQuantum
= data
.MinimumCyclesPerQuantum
;
2057 pPerfData
->MaximumCyclesPerQuantum
= data
.MaximumCyclesPerQuantum
;
2058 pPerfData
->MemoryUsageInBytes
= data
.MemoryUsageInBytes
;
2059 pPerfData
->CurrentLatencyInSamples
= data
.CurrentLatencyInSamples
;
2060 pPerfData
->GlitchesSinceEngineStarted
= data
.GlitchesSinceEngineStarted
;
2061 pPerfData
->ActiveSourceVoiceCount
= data
.ActiveSourceVoiceCount
;
2062 pPerfData
->TotalSourceVoiceCount
= data
.TotalSourceVoiceCount
;
2064 pPerfData
->ActiveSubmixVoiceCount
= data
.ActiveSubmixVoiceCount
;
2065 pPerfData
->TotalSubmixVoiceCount
= data
.ActiveSubmixVoiceCount
;
2067 pPerfData
->ActiveXmaSourceVoices
= data
.ActiveXmaSourceVoices
;
2068 pPerfData
->ActiveXmaStreams
= data
.ActiveXmaStreams
;
2071 static void WINAPI
XA22_SetDebugConfiguration(IXAudio22
*iface
,
2072 const XAUDIO2_DEBUG_CONFIGURATION
*pDebugConfiguration
,
2075 IXAudio2Impl
*This
= impl_from_IXAudio22(iface
);
2076 return IXAudio2_SetDebugConfiguration(&This
->IXAudio2_iface
,
2077 pDebugConfiguration
, pReserved
);
2080 const IXAudio22Vtbl XAudio22_Vtbl
= {
2081 XA22_QueryInterface
,
2084 XA22_GetDeviceCount
,
2085 XA22_GetDeviceDetails
,
2087 XA22_RegisterForCallbacks
,
2088 XA22_UnregisterForCallbacks
,
2089 XA22_CreateSourceVoice
,
2090 XA22_CreateSubmixVoice
,
2091 XA22_CreateMasteringVoice
,
2095 XA22_GetPerformanceData
,
2096 XA22_SetDebugConfiguration
2099 #elif XAUDIO2_VER <= 7
2101 static inline IXAudio2Impl
*impl_from_IXAudio27(IXAudio27
*iface
)
2103 return CONTAINING_RECORD(iface
, IXAudio2Impl
, IXAudio27_iface
);
2106 static HRESULT WINAPI
XA27_QueryInterface(IXAudio27
*iface
, REFIID riid
,
2109 IXAudio2Impl
*This
= impl_from_IXAudio27(iface
);
2110 return IXAudio2_QueryInterface(&This
->IXAudio2_iface
, riid
, ppvObject
);
2113 static ULONG WINAPI
XA27_AddRef(IXAudio27
*iface
)
2115 IXAudio2Impl
*This
= impl_from_IXAudio27(iface
);
2116 return IXAudio2_AddRef(&This
->IXAudio2_iface
);
2119 static ULONG WINAPI
XA27_Release(IXAudio27
*iface
)
2121 IXAudio2Impl
*This
= impl_from_IXAudio27(iface
);
2122 return IXAudio2_Release(&This
->IXAudio2_iface
);
2125 static HRESULT WINAPI
XA27_GetDeviceCount(IXAudio27
*iface
, UINT32
*pCount
)
2127 IXAudio2Impl
*This
= impl_from_IXAudio27(iface
);
2129 TRACE("%p, %p\n", This
, pCount
);
2131 *pCount
= This
->ndevs
;
2136 static HRESULT WINAPI
XA27_GetDeviceDetails(IXAudio27
*iface
, UINT32 index
,
2137 XAUDIO2_DEVICE_DETAILS
*pDeviceDetails
)
2139 IXAudio2Impl
*This
= impl_from_IXAudio27(iface
);
2142 IAudioClient
*client
;
2147 TRACE("%p, %u, %p\n", This
, index
, pDeviceDetails
);
2149 if(index
>= This
->ndevs
)
2150 return E_INVALIDARG
;
2152 hr
= IMMDeviceEnumerator_GetDevice(This
->devenum
, This
->devids
[index
], &dev
);
2154 WARN("GetDevice failed: %08x\n", hr
);
2158 hr
= IMMDevice_Activate(dev
, &IID_IAudioClient
, CLSCTX_INPROC_SERVER
,
2159 NULL
, (void**)&client
);
2161 WARN("Activate failed: %08x\n", hr
);
2162 IMMDevice_Release(dev
);
2166 hr
= IMMDevice_OpenPropertyStore(dev
, STGM_READ
, &ps
);
2168 WARN("OpenPropertyStore failed: %08x\n", hr
);
2169 IAudioClient_Release(client
);
2170 IMMDevice_Release(dev
);
2174 PropVariantInit(&var
);
2176 hr
= IPropertyStore_GetValue(ps
, (PROPERTYKEY
*)&DEVPKEY_Device_FriendlyName
, &var
);
2178 WARN("GetValue failed: %08x\n", hr
);
2182 lstrcpynW(pDeviceDetails
->DisplayName
, var
.u
.pwszVal
, sizeof(pDeviceDetails
->DisplayName
)/sizeof(WCHAR
));
2184 PropVariantClear(&var
);
2186 hr
= IAudioClient_GetMixFormat(client
, &wfx
);
2188 WARN("GetMixFormat failed: %08x\n", hr
);
2192 lstrcpyW(pDeviceDetails
->DeviceID
, This
->devids
[index
]);
2195 pDeviceDetails
->Role
= GlobalDefaultDevice
;
2197 pDeviceDetails
->Role
= NotDefaultDevice
;
2199 if(sizeof(WAVEFORMATEX
) + wfx
->cbSize
> sizeof(pDeviceDetails
->OutputFormat
)){
2200 FIXME("AudioClient format is too large to fit into WAVEFORMATEXTENSIBLE!\n");
2205 memcpy(&pDeviceDetails
->OutputFormat
, wfx
, sizeof(WAVEFORMATEX
) + wfx
->cbSize
);
2210 IPropertyStore_Release(ps
);
2211 IAudioClient_Release(client
);
2212 IMMDevice_Release(dev
);
2217 static HRESULT WINAPI
XA27_Initialize(IXAudio27
*iface
, UINT32 flags
,
2218 XAUDIO2_PROCESSOR processor
)
2220 IXAudio2Impl
*This
= impl_from_IXAudio27(iface
);
2221 TRACE("(%p)->(0x%x, 0x%x)\n", This
, flags
, processor
);
2222 return xaudio2_initialize(This
, flags
, processor
);
2225 static HRESULT WINAPI
XA27_RegisterForCallbacks(IXAudio27
*iface
,
2226 IXAudio2EngineCallback
*pCallback
)
2228 IXAudio2Impl
*This
= impl_from_IXAudio27(iface
);
2229 return IXAudio2_RegisterForCallbacks(&This
->IXAudio2_iface
, pCallback
);
2232 static void WINAPI
XA27_UnregisterForCallbacks(IXAudio27
*iface
,
2233 IXAudio2EngineCallback
*pCallback
)
2235 IXAudio2Impl
*This
= impl_from_IXAudio27(iface
);
2236 IXAudio2_UnregisterForCallbacks(&This
->IXAudio2_iface
, pCallback
);
2239 static HRESULT WINAPI
XA27_CreateSourceVoice(IXAudio27
*iface
,
2240 IXAudio2SourceVoice
**ppSourceVoice
, const WAVEFORMATEX
*pSourceFormat
,
2241 UINT32 flags
, float maxFrequencyRatio
,
2242 IXAudio2VoiceCallback
*pCallback
, const XAUDIO2_VOICE_SENDS
*pSendList
,
2243 const XAUDIO2_EFFECT_CHAIN
*pEffectChain
)
2245 IXAudio2Impl
*This
= impl_from_IXAudio27(iface
);
2246 return IXAudio2_CreateSourceVoice(&This
->IXAudio2_iface
, ppSourceVoice
,
2247 pSourceFormat
, flags
, maxFrequencyRatio
, pCallback
, pSendList
,
2251 static HRESULT WINAPI
XA27_CreateSubmixVoice(IXAudio27
*iface
,
2252 IXAudio2SubmixVoice
**ppSubmixVoice
, UINT32 inputChannels
,
2253 UINT32 inputSampleRate
, UINT32 flags
, UINT32 processingStage
,
2254 const XAUDIO2_VOICE_SENDS
*pSendList
,
2255 const XAUDIO2_EFFECT_CHAIN
*pEffectChain
)
2257 IXAudio2Impl
*This
= impl_from_IXAudio27(iface
);
2258 return IXAudio2_CreateSubmixVoice(&This
->IXAudio2_iface
, ppSubmixVoice
,
2259 inputChannels
, inputSampleRate
, flags
, processingStage
, pSendList
,
2263 static HRESULT WINAPI
XA27_CreateMasteringVoice(IXAudio27
*iface
,
2264 IXAudio2MasteringVoice
**ppMasteringVoice
, UINT32 inputChannels
,
2265 UINT32 inputSampleRate
, UINT32 flags
, UINT32 deviceIndex
,
2266 const XAUDIO2_EFFECT_CHAIN
*pEffectChain
)
2268 IXAudio2Impl
*This
= impl_from_IXAudio27(iface
);
2270 TRACE("(%p)->(%p, %u, %u, 0x%x, %u, %p)\n", This
, ppMasteringVoice
,
2271 inputChannels
, inputSampleRate
, flags
, deviceIndex
,
2274 if(deviceIndex
>= This
->ndevs
)
2275 return E_INVALIDARG
;
2277 return IXAudio2_CreateMasteringVoice(&This
->IXAudio2_iface
, ppMasteringVoice
,
2278 inputChannels
, inputSampleRate
, flags
, This
->devids
[deviceIndex
],
2279 pEffectChain
, AudioCategory_GameEffects
);
2282 static HRESULT WINAPI
XA27_StartEngine(IXAudio27
*iface
)
2284 IXAudio2Impl
*This
= impl_from_IXAudio27(iface
);
2285 return IXAudio2_StartEngine(&This
->IXAudio2_iface
);
2288 static void WINAPI
XA27_StopEngine(IXAudio27
*iface
)
2290 IXAudio2Impl
*This
= impl_from_IXAudio27(iface
);
2291 return IXAudio2_StopEngine(&This
->IXAudio2_iface
);
2294 static HRESULT WINAPI
XA27_CommitChanges(IXAudio27
*iface
, UINT32 operationSet
)
2296 IXAudio2Impl
*This
= impl_from_IXAudio27(iface
);
2297 return IXAudio2_CommitChanges(&This
->IXAudio2_iface
, operationSet
);
2300 static void WINAPI
XA27_GetPerformanceData(IXAudio27
*iface
,
2301 XAUDIO2_PERFORMANCE_DATA
*pPerfData
)
2303 IXAudio2Impl
*This
= impl_from_IXAudio27(iface
);
2304 return IXAudio2_GetPerformanceData(&This
->IXAudio2_iface
, pPerfData
);
2307 static void WINAPI
XA27_SetDebugConfiguration(IXAudio27
*iface
,
2308 const XAUDIO2_DEBUG_CONFIGURATION
*pDebugConfiguration
,
2311 IXAudio2Impl
*This
= impl_from_IXAudio27(iface
);
2312 return IXAudio2_SetDebugConfiguration(&This
->IXAudio2_iface
,
2313 pDebugConfiguration
, pReserved
);
2316 const IXAudio27Vtbl XAudio27_Vtbl
= {
2317 XA27_QueryInterface
,
2320 XA27_GetDeviceCount
,
2321 XA27_GetDeviceDetails
,
2323 XA27_RegisterForCallbacks
,
2324 XA27_UnregisterForCallbacks
,
2325 XA27_CreateSourceVoice
,
2326 XA27_CreateSubmixVoice
,
2327 XA27_CreateMasteringVoice
,
2331 XA27_GetPerformanceData
,
2332 XA27_SetDebugConfiguration