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
85 #define NONAMELESSUNION
86 #define NONAMELESSSTRUCT
91 #include "xaudio_private.h"
93 #include "wine/debug.h"
95 WINE_DEFAULT_DEBUG_CHANNEL(xaudio2
);
97 static XA2SourceImpl
*impl_from_IXAudio27SourceVoice(IXAudio27SourceVoice
*iface
)
99 return CONTAINING_RECORD(iface
, XA2SourceImpl
, IXAudio27SourceVoice_iface
);
102 static void WINAPI
XA27SRC_GetVoiceDetails(IXAudio27SourceVoice
*iface
,
103 XAUDIO2_VOICE_DETAILS
*pVoiceDetails
)
105 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
106 return IXAudio2SourceVoice_GetVoiceDetails(&This
->IXAudio2SourceVoice_iface
, pVoiceDetails
);
109 static HRESULT WINAPI
XA27SRC_SetOutputVoices(IXAudio27SourceVoice
*iface
,
110 const XAUDIO2_VOICE_SENDS
*pSendList
)
112 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
113 return IXAudio2SourceVoice_SetOutputVoices(&This
->IXAudio2SourceVoice_iface
, pSendList
);
116 static HRESULT WINAPI
XA27SRC_SetEffectChain(IXAudio27SourceVoice
*iface
,
117 const XAUDIO2_EFFECT_CHAIN
*pEffectChain
)
119 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
120 return IXAudio2SourceVoice_SetEffectChain(&This
->IXAudio2SourceVoice_iface
, pEffectChain
);
123 static HRESULT WINAPI
XA27SRC_EnableEffect(IXAudio27SourceVoice
*iface
,
124 UINT32 EffectIndex
, UINT32 OperationSet
)
126 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
127 return IXAudio2SourceVoice_EnableEffect(&This
->IXAudio2SourceVoice_iface
, EffectIndex
, OperationSet
);
130 static HRESULT WINAPI
XA27SRC_DisableEffect(IXAudio27SourceVoice
*iface
,
131 UINT32 EffectIndex
, UINT32 OperationSet
)
133 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
134 return IXAudio2SourceVoice_DisableEffect(&This
->IXAudio2SourceVoice_iface
, EffectIndex
, OperationSet
);
137 static void WINAPI
XA27SRC_GetEffectState(IXAudio27SourceVoice
*iface
,
138 UINT32 EffectIndex
, BOOL
*pEnabled
)
140 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
141 IXAudio2SourceVoice_GetEffectState(&This
->IXAudio2SourceVoice_iface
, EffectIndex
, pEnabled
);
144 static HRESULT WINAPI
XA27SRC_SetEffectParameters(IXAudio27SourceVoice
*iface
,
145 UINT32 EffectIndex
, const void *pParameters
, UINT32 ParametersByteSize
,
148 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
149 return IXAudio2SourceVoice_SetEffectParameters(&This
->IXAudio2SourceVoice_iface
,
150 EffectIndex
, pParameters
, ParametersByteSize
, OperationSet
);
153 static HRESULT WINAPI
XA27SRC_GetEffectParameters(IXAudio27SourceVoice
*iface
,
154 UINT32 EffectIndex
, void *pParameters
, UINT32 ParametersByteSize
)
156 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
157 return IXAudio2SourceVoice_GetEffectParameters(&This
->IXAudio2SourceVoice_iface
,
158 EffectIndex
, pParameters
, ParametersByteSize
);
161 static HRESULT WINAPI
XA27SRC_SetFilterParameters(IXAudio27SourceVoice
*iface
,
162 const XAUDIO2_FILTER_PARAMETERS
*pParameters
, UINT32 OperationSet
)
164 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
165 return IXAudio2SourceVoice_SetFilterParameters(&This
->IXAudio2SourceVoice_iface
,
166 pParameters
, OperationSet
);
169 static void WINAPI
XA27SRC_GetFilterParameters(IXAudio27SourceVoice
*iface
,
170 XAUDIO2_FILTER_PARAMETERS
*pParameters
)
172 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
173 IXAudio2SourceVoice_GetFilterParameters(&This
->IXAudio2SourceVoice_iface
, pParameters
);
176 static HRESULT WINAPI
XA27SRC_SetOutputFilterParameters(IXAudio27SourceVoice
*iface
,
177 IXAudio2Voice
*pDestinationVoice
,
178 const XAUDIO2_FILTER_PARAMETERS
*pParameters
, UINT32 OperationSet
)
180 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
181 return IXAudio2SourceVoice_SetOutputFilterParameters(&This
->IXAudio2SourceVoice_iface
,
182 pDestinationVoice
, pParameters
, OperationSet
);
185 static void WINAPI
XA27SRC_GetOutputFilterParameters(IXAudio27SourceVoice
*iface
,
186 IXAudio2Voice
*pDestinationVoice
,
187 XAUDIO2_FILTER_PARAMETERS
*pParameters
)
189 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
190 IXAudio2SourceVoice_GetOutputFilterParameters(&This
->IXAudio2SourceVoice_iface
,
191 pDestinationVoice
, pParameters
);
194 static HRESULT WINAPI
XA27SRC_SetVolume(IXAudio27SourceVoice
*iface
, float Volume
,
197 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
198 return IXAudio2SourceVoice_SetVolume(&This
->IXAudio2SourceVoice_iface
, Volume
,
202 static void WINAPI
XA27SRC_GetVolume(IXAudio27SourceVoice
*iface
, float *pVolume
)
204 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
205 IXAudio2SourceVoice_GetVolume(&This
->IXAudio2SourceVoice_iface
, pVolume
);
208 static HRESULT WINAPI
XA27SRC_SetChannelVolumes(IXAudio27SourceVoice
*iface
,
209 UINT32 Channels
, const float *pVolumes
, UINT32 OperationSet
)
211 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
212 return IXAudio2SourceVoice_SetChannelVolumes(&This
->IXAudio2SourceVoice_iface
, Channels
,
213 pVolumes
, OperationSet
);
216 static void WINAPI
XA27SRC_GetChannelVolumes(IXAudio27SourceVoice
*iface
,
217 UINT32 Channels
, float *pVolumes
)
219 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
220 IXAudio2SourceVoice_GetChannelVolumes(&This
->IXAudio2SourceVoice_iface
, Channels
,
224 static HRESULT WINAPI
XA27SRC_SetOutputMatrix(IXAudio27SourceVoice
*iface
,
225 IXAudio2Voice
*pDestinationVoice
, UINT32 SourceChannels
,
226 UINT32 DestinationChannels
, const float *pLevelMatrix
,
229 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
230 return IXAudio2SourceVoice_SetOutputMatrix(&This
->IXAudio2SourceVoice_iface
,
231 pDestinationVoice
, SourceChannels
, DestinationChannels
,
232 pLevelMatrix
, OperationSet
);
235 static void WINAPI
XA27SRC_GetOutputMatrix(IXAudio27SourceVoice
*iface
,
236 IXAudio2Voice
*pDestinationVoice
, UINT32 SourceChannels
,
237 UINT32 DestinationChannels
, float *pLevelMatrix
)
239 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
240 IXAudio2SourceVoice_GetOutputMatrix(&This
->IXAudio2SourceVoice_iface
, pDestinationVoice
,
241 SourceChannels
, DestinationChannels
, pLevelMatrix
);
244 static void WINAPI
XA27SRC_DestroyVoice(IXAudio27SourceVoice
*iface
)
246 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
247 IXAudio2SourceVoice_DestroyVoice(&This
->IXAudio2SourceVoice_iface
);
250 static HRESULT WINAPI
XA27SRC_Start(IXAudio27SourceVoice
*iface
, UINT32 Flags
,
253 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
254 return IXAudio2SourceVoice_Start(&This
->IXAudio2SourceVoice_iface
, Flags
, OperationSet
);
257 static HRESULT WINAPI
XA27SRC_Stop(IXAudio27SourceVoice
*iface
, UINT32 Flags
,
260 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
261 return IXAudio2SourceVoice_Stop(&This
->IXAudio2SourceVoice_iface
, Flags
, OperationSet
);
264 static HRESULT WINAPI
XA27SRC_SubmitSourceBuffer(IXAudio27SourceVoice
*iface
,
265 const XAUDIO2_BUFFER
*pBuffer
, const XAUDIO2_BUFFER_WMA
*pBufferWMA
)
267 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
268 return IXAudio2SourceVoice_SubmitSourceBuffer(&This
->IXAudio2SourceVoice_iface
, pBuffer
,
272 static HRESULT WINAPI
XA27SRC_FlushSourceBuffers(IXAudio27SourceVoice
*iface
)
274 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
275 return IXAudio2SourceVoice_FlushSourceBuffers(&This
->IXAudio2SourceVoice_iface
);
278 static HRESULT WINAPI
XA27SRC_Discontinuity(IXAudio27SourceVoice
*iface
)
280 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
281 return IXAudio2SourceVoice_Discontinuity(&This
->IXAudio2SourceVoice_iface
);
284 static HRESULT WINAPI
XA27SRC_ExitLoop(IXAudio27SourceVoice
*iface
, UINT32 OperationSet
)
286 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
287 return IXAudio2SourceVoice_ExitLoop(&This
->IXAudio2SourceVoice_iface
, OperationSet
);
290 static void WINAPI
XA27SRC_GetState(IXAudio27SourceVoice
*iface
,
291 XAUDIO2_VOICE_STATE
*pVoiceState
)
293 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
294 return IXAudio2SourceVoice_GetState(&This
->IXAudio2SourceVoice_iface
, pVoiceState
, 0);
297 static HRESULT WINAPI
XA27SRC_SetFrequencyRatio(IXAudio27SourceVoice
*iface
,
298 float Ratio
, UINT32 OperationSet
)
300 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
301 return IXAudio2SourceVoice_SetFrequencyRatio(&This
->IXAudio2SourceVoice_iface
, Ratio
, OperationSet
);
304 static void WINAPI
XA27SRC_GetFrequencyRatio(IXAudio27SourceVoice
*iface
, float *pRatio
)
306 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
307 return IXAudio2SourceVoice_GetFrequencyRatio(&This
->IXAudio2SourceVoice_iface
, pRatio
);
310 static HRESULT WINAPI
XA27SRC_SetSourceSampleRate(
311 IXAudio27SourceVoice
*iface
,
312 UINT32 NewSourceSampleRate
)
314 XA2SourceImpl
*This
= impl_from_IXAudio27SourceVoice(iface
);
315 return IXAudio2SourceVoice_SetSourceSampleRate(&This
->IXAudio2SourceVoice_iface
, NewSourceSampleRate
);
318 const IXAudio27SourceVoiceVtbl XAudio27SourceVoice_Vtbl
= {
319 XA27SRC_GetVoiceDetails
,
320 XA27SRC_SetOutputVoices
,
321 XA27SRC_SetEffectChain
,
322 XA27SRC_EnableEffect
,
323 XA27SRC_DisableEffect
,
324 XA27SRC_GetEffectState
,
325 XA27SRC_SetEffectParameters
,
326 XA27SRC_GetEffectParameters
,
327 XA27SRC_SetFilterParameters
,
328 XA27SRC_GetFilterParameters
,
329 XA27SRC_SetOutputFilterParameters
,
330 XA27SRC_GetOutputFilterParameters
,
333 XA27SRC_SetChannelVolumes
,
334 XA27SRC_GetChannelVolumes
,
335 XA27SRC_SetOutputMatrix
,
336 XA27SRC_GetOutputMatrix
,
337 XA27SRC_DestroyVoice
,
340 XA27SRC_SubmitSourceBuffer
,
341 XA27SRC_FlushSourceBuffers
,
342 XA27SRC_Discontinuity
,
345 XA27SRC_SetFrequencyRatio
,
346 XA27SRC_GetFrequencyRatio
,
347 XA27SRC_SetSourceSampleRate
350 static inline IXAudio2Impl
*impl_from_IXAudio27(IXAudio27
*iface
)
352 return CONTAINING_RECORD(iface
, IXAudio2Impl
, IXAudio27_iface
);
355 static HRESULT WINAPI
XA27_QueryInterface(IXAudio27
*iface
, REFIID riid
,
358 IXAudio2Impl
*This
= impl_from_IXAudio27(iface
);
359 return IXAudio2_QueryInterface(&This
->IXAudio2_iface
, riid
, ppvObject
);
362 static ULONG WINAPI
XA27_AddRef(IXAudio27
*iface
)
364 IXAudio2Impl
*This
= impl_from_IXAudio27(iface
);
365 return IXAudio2_AddRef(&This
->IXAudio2_iface
);
368 static ULONG WINAPI
XA27_Release(IXAudio27
*iface
)
370 IXAudio2Impl
*This
= impl_from_IXAudio27(iface
);
371 return IXAudio2_Release(&This
->IXAudio2_iface
);
374 static HRESULT WINAPI
XA27_GetDeviceCount(IXAudio27
*iface
, UINT32
*pCount
)
376 IXAudio2Impl
*This
= impl_from_IXAudio27(iface
);
378 TRACE("%p, %p\n", This
, pCount
);
380 *pCount
= This
->ndevs
;
385 static HRESULT WINAPI
XA27_GetDeviceDetails(IXAudio27
*iface
, UINT32 index
,
386 XAUDIO2_DEVICE_DETAILS
*pDeviceDetails
)
388 IXAudio2Impl
*This
= impl_from_IXAudio27(iface
);
391 IAudioClient
*client
;
396 TRACE("%p, %u, %p\n", This
, index
, pDeviceDetails
);
398 if(index
>= This
->ndevs
)
401 hr
= IMMDeviceEnumerator_GetDevice(This
->devenum
, This
->devids
[index
], &dev
);
403 WARN("GetDevice failed: %08x\n", hr
);
407 hr
= IMMDevice_Activate(dev
, &IID_IAudioClient
, CLSCTX_INPROC_SERVER
,
408 NULL
, (void**)&client
);
410 WARN("Activate failed: %08x\n", hr
);
411 IMMDevice_Release(dev
);
415 hr
= IMMDevice_OpenPropertyStore(dev
, STGM_READ
, &ps
);
417 WARN("OpenPropertyStore failed: %08x\n", hr
);
418 IAudioClient_Release(client
);
419 IMMDevice_Release(dev
);
423 PropVariantInit(&var
);
425 hr
= IPropertyStore_GetValue(ps
, (PROPERTYKEY
*)&DEVPKEY_Device_FriendlyName
, &var
);
427 WARN("GetValue failed: %08x\n", hr
);
431 lstrcpynW(pDeviceDetails
->DisplayName
, var
.u
.pwszVal
, sizeof(pDeviceDetails
->DisplayName
)/sizeof(WCHAR
));
433 PropVariantClear(&var
);
435 hr
= IAudioClient_GetMixFormat(client
, &wfx
);
437 WARN("GetMixFormat failed: %08x\n", hr
);
441 lstrcpyW(pDeviceDetails
->DeviceID
, This
->devids
[index
]);
444 pDeviceDetails
->Role
= GlobalDefaultDevice
;
446 pDeviceDetails
->Role
= NotDefaultDevice
;
448 if(sizeof(WAVEFORMATEX
) + wfx
->cbSize
> sizeof(pDeviceDetails
->OutputFormat
)){
449 FIXME("AudioClient format is too large to fit into WAVEFORMATEXTENSIBLE!\n");
454 memcpy(&pDeviceDetails
->OutputFormat
, wfx
, sizeof(WAVEFORMATEX
) + wfx
->cbSize
);
459 IPropertyStore_Release(ps
);
460 IAudioClient_Release(client
);
461 IMMDevice_Release(dev
);
466 static HRESULT WINAPI
XA27_Initialize(IXAudio27
*iface
, UINT32 flags
,
467 XAUDIO2_PROCESSOR processor
)
469 IXAudio2Impl
*This
= impl_from_IXAudio27(iface
);
470 TRACE("(%p)->(0x%x, 0x%x)\n", This
, flags
, processor
);
474 static HRESULT WINAPI
XA27_RegisterForCallbacks(IXAudio27
*iface
,
475 IXAudio2EngineCallback
*pCallback
)
477 IXAudio2Impl
*This
= impl_from_IXAudio27(iface
);
478 return IXAudio2_RegisterForCallbacks(&This
->IXAudio2_iface
, pCallback
);
481 static void WINAPI
XA27_UnregisterForCallbacks(IXAudio27
*iface
,
482 IXAudio2EngineCallback
*pCallback
)
484 IXAudio2Impl
*This
= impl_from_IXAudio27(iface
);
485 IXAudio2_UnregisterForCallbacks(&This
->IXAudio2_iface
, pCallback
);
488 static HRESULT WINAPI
XA27_CreateSourceVoice(IXAudio27
*iface
,
489 IXAudio2SourceVoice
**ppSourceVoice
, const WAVEFORMATEX
*pSourceFormat
,
490 UINT32 flags
, float maxFrequencyRatio
,
491 IXAudio2VoiceCallback
*pCallback
, const XAUDIO2_VOICE_SENDS
*pSendList
,
492 const XAUDIO2_EFFECT_CHAIN
*pEffectChain
)
494 IXAudio2Impl
*This
= impl_from_IXAudio27(iface
);
495 return IXAudio2_CreateSourceVoice(&This
->IXAudio2_iface
, ppSourceVoice
,
496 pSourceFormat
, flags
, maxFrequencyRatio
, pCallback
, pSendList
,
500 static HRESULT WINAPI
XA27_CreateSubmixVoice(IXAudio27
*iface
,
501 IXAudio2SubmixVoice
**ppSubmixVoice
, UINT32 inputChannels
,
502 UINT32 inputSampleRate
, UINT32 flags
, UINT32 processingStage
,
503 const XAUDIO2_VOICE_SENDS
*pSendList
,
504 const XAUDIO2_EFFECT_CHAIN
*pEffectChain
)
506 IXAudio2Impl
*This
= impl_from_IXAudio27(iface
);
507 return IXAudio2_CreateSubmixVoice(&This
->IXAudio2_iface
, ppSubmixVoice
,
508 inputChannels
, inputSampleRate
, flags
, processingStage
, pSendList
,
512 static HRESULT WINAPI
XA27_CreateMasteringVoice(IXAudio27
*iface
,
513 IXAudio2MasteringVoice
**ppMasteringVoice
, UINT32 inputChannels
,
514 UINT32 inputSampleRate
, UINT32 flags
, UINT32 deviceIndex
,
515 const XAUDIO2_EFFECT_CHAIN
*pEffectChain
)
517 IXAudio2Impl
*This
= impl_from_IXAudio27(iface
);
519 TRACE("(%p)->(%p, %u, %u, 0x%x, %u, %p)\n", This
, ppMasteringVoice
,
520 inputChannels
, inputSampleRate
, flags
, deviceIndex
,
523 if(deviceIndex
>= This
->ndevs
)
526 return IXAudio2_CreateMasteringVoice(&This
->IXAudio2_iface
, ppMasteringVoice
,
527 inputChannels
, inputSampleRate
, flags
, This
->devids
[deviceIndex
],
528 pEffectChain
, AudioCategory_GameEffects
);
531 static HRESULT WINAPI
XA27_StartEngine(IXAudio27
*iface
)
533 IXAudio2Impl
*This
= impl_from_IXAudio27(iface
);
534 return IXAudio2_StartEngine(&This
->IXAudio2_iface
);
537 static void WINAPI
XA27_StopEngine(IXAudio27
*iface
)
539 IXAudio2Impl
*This
= impl_from_IXAudio27(iface
);
540 return IXAudio2_StopEngine(&This
->IXAudio2_iface
);
543 static HRESULT WINAPI
XA27_CommitChanges(IXAudio27
*iface
, UINT32 operationSet
)
545 IXAudio2Impl
*This
= impl_from_IXAudio27(iface
);
546 return IXAudio2_CommitChanges(&This
->IXAudio2_iface
, operationSet
);
549 static void WINAPI
XA27_GetPerformanceData(IXAudio27
*iface
,
550 XAUDIO2_PERFORMANCE_DATA
*pPerfData
)
552 IXAudio2Impl
*This
= impl_from_IXAudio27(iface
);
553 return IXAudio2_GetPerformanceData(&This
->IXAudio2_iface
, pPerfData
);
556 static void WINAPI
XA27_SetDebugConfiguration(IXAudio27
*iface
,
557 const XAUDIO2_DEBUG_CONFIGURATION
*pDebugConfiguration
,
560 IXAudio2Impl
*This
= impl_from_IXAudio27(iface
);
561 return IXAudio2_SetDebugConfiguration(&This
->IXAudio2_iface
,
562 pDebugConfiguration
, pReserved
);
565 const IXAudio27Vtbl XAudio27_Vtbl
= {
570 XA27_GetDeviceDetails
,
572 XA27_RegisterForCallbacks
,
573 XA27_UnregisterForCallbacks
,
574 XA27_CreateSourceVoice
,
575 XA27_CreateSubmixVoice
,
576 XA27_CreateMasteringVoice
,
580 XA27_GetPerformanceData
,
581 XA27_SetDebugConfiguration
584 static XA2SourceImpl
*impl_from_IXAudio23SourceVoice(IXAudio23SourceVoice
*iface
)
586 return CONTAINING_RECORD(iface
, XA2SourceImpl
, IXAudio23SourceVoice_iface
);
589 static void WINAPI
XA23SRC_GetVoiceDetails(IXAudio23SourceVoice
*iface
,
590 XAUDIO2_VOICE_DETAILS
*pVoiceDetails
)
592 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
593 return IXAudio2SourceVoice_GetVoiceDetails(&This
->IXAudio2SourceVoice_iface
, pVoiceDetails
);
596 static HRESULT WINAPI
XA23SRC_SetOutputVoices(IXAudio23SourceVoice
*iface
,
597 const XAUDIO23_VOICE_SENDS
*pSendList
)
599 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
600 XAUDIO2_VOICE_SENDS sends
;
604 TRACE("%p, %p\n", This
, pSendList
);
606 sends
.SendCount
= pSendList
->OutputCount
;
607 sends
.pSends
= HeapAlloc(GetProcessHeap(), 0, sends
.SendCount
* sizeof(*sends
.pSends
));
608 for(i
= 0; i
< sends
.SendCount
; ++i
){
609 sends
.pSends
[i
].Flags
= 0;
610 sends
.pSends
[i
].pOutputVoice
= pSendList
->pOutputVoices
[i
];
613 hr
= IXAudio2SourceVoice_SetOutputVoices(&This
->IXAudio2SourceVoice_iface
, &sends
);
615 HeapFree(GetProcessHeap(), 0, sends
.pSends
);
620 static HRESULT WINAPI
XA23SRC_SetEffectChain(IXAudio23SourceVoice
*iface
,
621 const XAUDIO2_EFFECT_CHAIN
*pEffectChain
)
623 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
624 return IXAudio2SourceVoice_SetEffectChain(&This
->IXAudio2SourceVoice_iface
, pEffectChain
);
627 static HRESULT WINAPI
XA23SRC_EnableEffect(IXAudio23SourceVoice
*iface
,
628 UINT32 EffectIndex
, UINT32 OperationSet
)
630 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
631 return IXAudio2SourceVoice_EnableEffect(&This
->IXAudio2SourceVoice_iface
,
632 EffectIndex
, OperationSet
);
635 static HRESULT WINAPI
XA23SRC_DisableEffect(IXAudio23SourceVoice
*iface
,
636 UINT32 EffectIndex
, UINT32 OperationSet
)
638 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
639 return IXAudio2SourceVoice_DisableEffect(&This
->IXAudio2SourceVoice_iface
,
640 EffectIndex
, OperationSet
);
643 static void WINAPI
XA23SRC_GetEffectState(IXAudio23SourceVoice
*iface
,
644 UINT32 EffectIndex
, BOOL
*pEnabled
)
646 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
647 return IXAudio2SourceVoice_GetEffectState(&This
->IXAudio2SourceVoice_iface
,
648 EffectIndex
, pEnabled
);
651 static HRESULT WINAPI
XA23SRC_SetEffectParameters(IXAudio23SourceVoice
*iface
,
652 UINT32 EffectIndex
, const void *pParameters
, UINT32 ParametersByteSize
,
655 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
656 return IXAudio2SourceVoice_SetEffectParameters(&This
->IXAudio2SourceVoice_iface
,
657 EffectIndex
, pParameters
, ParametersByteSize
, OperationSet
);
660 static HRESULT WINAPI
XA23SRC_GetEffectParameters(IXAudio23SourceVoice
*iface
,
661 UINT32 EffectIndex
, void *pParameters
, UINT32 ParametersByteSize
)
663 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
664 return IXAudio2SourceVoice_GetEffectParameters(&This
->IXAudio2SourceVoice_iface
,
665 EffectIndex
, pParameters
, ParametersByteSize
);
668 static HRESULT WINAPI
XA23SRC_SetFilterParameters(IXAudio23SourceVoice
*iface
,
669 const XAUDIO2_FILTER_PARAMETERS
*pParameters
, UINT32 OperationSet
)
671 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
672 return IXAudio2SourceVoice_SetFilterParameters(&This
->IXAudio2SourceVoice_iface
,
673 pParameters
, OperationSet
);
676 static void WINAPI
XA23SRC_GetFilterParameters(IXAudio23SourceVoice
*iface
,
677 XAUDIO2_FILTER_PARAMETERS
*pParameters
)
679 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
680 return IXAudio2SourceVoice_GetFilterParameters(&This
->IXAudio2SourceVoice_iface
, pParameters
);
683 static HRESULT WINAPI
XA23SRC_SetVolume(IXAudio23SourceVoice
*iface
,
684 float Volume
, UINT32 OperationSet
)
686 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
687 return IXAudio2SourceVoice_SetVolume(&This
->IXAudio2SourceVoice_iface
,
688 Volume
, OperationSet
);
691 static void WINAPI
XA23SRC_GetVolume(IXAudio23SourceVoice
*iface
,
694 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
695 return IXAudio2SourceVoice_GetVolume(&This
->IXAudio2SourceVoice_iface
, pVolume
);
698 static HRESULT WINAPI
XA23SRC_SetChannelVolumes(IXAudio23SourceVoice
*iface
,
699 UINT32 Channels
, const float *pVolumes
, UINT32 OperationSet
)
701 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
702 return IXAudio2SourceVoice_SetChannelVolumes(&This
->IXAudio2SourceVoice_iface
,
703 Channels
, pVolumes
, OperationSet
);
706 static void WINAPI
XA23SRC_GetChannelVolumes(IXAudio23SourceVoice
*iface
,
707 UINT32 Channels
, float *pVolumes
)
709 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
710 return IXAudio2SourceVoice_GetChannelVolumes(&This
->IXAudio2SourceVoice_iface
,
714 static HRESULT WINAPI
XA23SRC_SetOutputMatrix(IXAudio23SourceVoice
*iface
,
715 IXAudio2Voice
*pDestinationVoice
, UINT32 SourceChannels
,
716 UINT32 DestinationChannels
, const float *pLevelMatrix
,
719 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
720 return IXAudio2SourceVoice_SetOutputMatrix(&This
->IXAudio2SourceVoice_iface
,
721 pDestinationVoice
, SourceChannels
, DestinationChannels
,
722 pLevelMatrix
, OperationSet
);
725 static void WINAPI
XA23SRC_GetOutputMatrix(IXAudio23SourceVoice
*iface
,
726 IXAudio2Voice
*pDestinationVoice
, UINT32 SourceChannels
,
727 UINT32 DestinationChannels
, float *pLevelMatrix
)
729 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
730 return IXAudio2SourceVoice_GetOutputMatrix(&This
->IXAudio2SourceVoice_iface
,
731 pDestinationVoice
, SourceChannels
, DestinationChannels
,
735 static void WINAPI
XA23SRC_DestroyVoice(IXAudio23SourceVoice
*iface
)
737 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
738 return IXAudio2SourceVoice_DestroyVoice(&This
->IXAudio2SourceVoice_iface
);
741 static HRESULT WINAPI
XA23SRC_Start(IXAudio23SourceVoice
*iface
, UINT32 Flags
,
744 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
745 return IXAudio2SourceVoice_Start(&This
->IXAudio2SourceVoice_iface
, Flags
, OperationSet
);
748 static HRESULT WINAPI
XA23SRC_Stop(IXAudio23SourceVoice
*iface
, UINT32 Flags
,
751 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
752 return IXAudio2SourceVoice_Stop(&This
->IXAudio2SourceVoice_iface
, Flags
, OperationSet
);
755 static HRESULT WINAPI
XA23SRC_SubmitSourceBuffer(IXAudio23SourceVoice
*iface
,
756 const XAUDIO2_BUFFER
*pBuffer
, const XAUDIO2_BUFFER_WMA
*pBufferWMA
)
758 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
759 return IXAudio2SourceVoice_SubmitSourceBuffer(&This
->IXAudio2SourceVoice_iface
,
760 pBuffer
, pBufferWMA
);
763 static HRESULT WINAPI
XA23SRC_FlushSourceBuffers(IXAudio23SourceVoice
*iface
)
765 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
766 return IXAudio2SourceVoice_FlushSourceBuffers(&This
->IXAudio2SourceVoice_iface
);
769 static HRESULT WINAPI
XA23SRC_Discontinuity(IXAudio23SourceVoice
*iface
)
771 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
772 return IXAudio2SourceVoice_Discontinuity(&This
->IXAudio2SourceVoice_iface
);
775 static HRESULT WINAPI
XA23SRC_ExitLoop(IXAudio23SourceVoice
*iface
,
778 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
779 return IXAudio2SourceVoice_ExitLoop(&This
->IXAudio2SourceVoice_iface
, OperationSet
);
782 static void WINAPI
XA23SRC_GetState(IXAudio23SourceVoice
*iface
,
783 XAUDIO2_VOICE_STATE
*pVoiceState
)
785 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
786 return IXAudio2SourceVoice_GetState(&This
->IXAudio2SourceVoice_iface
, pVoiceState
, 0);
789 static HRESULT WINAPI
XA23SRC_SetFrequencyRatio(IXAudio23SourceVoice
*iface
,
790 float Ratio
, UINT32 OperationSet
)
792 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
793 return IXAudio2SourceVoice_SetFrequencyRatio(&This
->IXAudio2SourceVoice_iface
,
794 Ratio
, OperationSet
);
797 static void WINAPI
XA23SRC_GetFrequencyRatio(IXAudio23SourceVoice
*iface
,
800 XA2SourceImpl
*This
= impl_from_IXAudio23SourceVoice(iface
);
801 return IXAudio2SourceVoice_GetFrequencyRatio(&This
->IXAudio2SourceVoice_iface
, pRatio
);
804 const IXAudio23SourceVoiceVtbl XAudio23SourceVoice_Vtbl
= {
805 XA23SRC_GetVoiceDetails
,
806 XA23SRC_SetOutputVoices
,
807 XA23SRC_SetEffectChain
,
808 XA23SRC_EnableEffect
,
809 XA23SRC_DisableEffect
,
810 XA23SRC_GetEffectState
,
811 XA23SRC_SetEffectParameters
,
812 XA23SRC_GetEffectParameters
,
813 XA23SRC_SetFilterParameters
,
814 XA23SRC_GetFilterParameters
,
817 XA23SRC_SetChannelVolumes
,
818 XA23SRC_GetChannelVolumes
,
819 XA23SRC_SetOutputMatrix
,
820 XA23SRC_GetOutputMatrix
,
821 XA23SRC_DestroyVoice
,
824 XA23SRC_SubmitSourceBuffer
,
825 XA23SRC_FlushSourceBuffers
,
826 XA23SRC_Discontinuity
,
829 XA23SRC_SetFrequencyRatio
,
830 XA23SRC_GetFrequencyRatio
,
833 static XA2SubmixImpl
*impl_from_IXAudio23SubmixVoice(IXAudio23SubmixVoice
*iface
)
835 return CONTAINING_RECORD(iface
, XA2SubmixImpl
, IXAudio23SubmixVoice_iface
);
838 static void WINAPI
XA23SUB_GetVoiceDetails(IXAudio23SubmixVoice
*iface
,
839 XAUDIO2_VOICE_DETAILS
*pVoiceDetails
)
841 XA2SubmixImpl
*This
= impl_from_IXAudio23SubmixVoice(iface
);
842 return IXAudio2SubmixVoice_GetVoiceDetails(&This
->IXAudio2SubmixVoice_iface
, pVoiceDetails
);
845 static HRESULT WINAPI
XA23SUB_SetOutputVoices(IXAudio23SubmixVoice
*iface
,
846 const XAUDIO23_VOICE_SENDS
*pSendList
)
848 XA2SubmixImpl
*This
= impl_from_IXAudio23SubmixVoice(iface
);
849 XAUDIO2_VOICE_SENDS sends
;
853 TRACE("%p, %p\n", This
, pSendList
);
855 sends
.SendCount
= pSendList
->OutputCount
;
856 sends
.pSends
= HeapAlloc(GetProcessHeap(), 0, sends
.SendCount
* sizeof(*sends
.pSends
));
857 for(i
= 0; i
< sends
.SendCount
; ++i
){
858 sends
.pSends
[i
].Flags
= 0;
859 sends
.pSends
[i
].pOutputVoice
= pSendList
->pOutputVoices
[i
];
862 hr
= IXAudio2SubmixVoice_SetOutputVoices(&This
->IXAudio2SubmixVoice_iface
, &sends
);
864 HeapFree(GetProcessHeap(), 0, sends
.pSends
);
869 static HRESULT WINAPI
XA23SUB_SetEffectChain(IXAudio23SubmixVoice
*iface
,
870 const XAUDIO2_EFFECT_CHAIN
*pEffectChain
)
872 XA2SubmixImpl
*This
= impl_from_IXAudio23SubmixVoice(iface
);
873 return IXAudio2SubmixVoice_SetEffectChain(&This
->IXAudio2SubmixVoice_iface
, pEffectChain
);
876 static HRESULT WINAPI
XA23SUB_EnableEffect(IXAudio23SubmixVoice
*iface
,
877 UINT32 EffectIndex
, UINT32 OperationSet
)
879 XA2SubmixImpl
*This
= impl_from_IXAudio23SubmixVoice(iface
);
880 return IXAudio2SubmixVoice_EnableEffect(&This
->IXAudio2SubmixVoice_iface
,
881 EffectIndex
, OperationSet
);
884 static HRESULT WINAPI
XA23SUB_DisableEffect(IXAudio23SubmixVoice
*iface
,
885 UINT32 EffectIndex
, UINT32 OperationSet
)
887 XA2SubmixImpl
*This
= impl_from_IXAudio23SubmixVoice(iface
);
888 return IXAudio2SubmixVoice_DisableEffect(&This
->IXAudio2SubmixVoice_iface
,
889 EffectIndex
, OperationSet
);
892 static void WINAPI
XA23SUB_GetEffectState(IXAudio23SubmixVoice
*iface
,
893 UINT32 EffectIndex
, BOOL
*pEnabled
)
895 XA2SubmixImpl
*This
= impl_from_IXAudio23SubmixVoice(iface
);
896 return IXAudio2SubmixVoice_GetEffectState(&This
->IXAudio2SubmixVoice_iface
,
897 EffectIndex
, pEnabled
);
900 static HRESULT WINAPI
XA23SUB_SetEffectParameters(IXAudio23SubmixVoice
*iface
,
901 UINT32 EffectIndex
, const void *pParameters
, UINT32 ParametersByteSize
,
904 XA2SubmixImpl
*This
= impl_from_IXAudio23SubmixVoice(iface
);
905 return IXAudio2SubmixVoice_SetEffectParameters(&This
->IXAudio2SubmixVoice_iface
,
906 EffectIndex
, pParameters
, ParametersByteSize
, OperationSet
);
909 static HRESULT WINAPI
XA23SUB_GetEffectParameters(IXAudio23SubmixVoice
*iface
,
910 UINT32 EffectIndex
, void *pParameters
, UINT32 ParametersByteSize
)
912 XA2SubmixImpl
*This
= impl_from_IXAudio23SubmixVoice(iface
);
913 return IXAudio2SubmixVoice_GetEffectParameters(&This
->IXAudio2SubmixVoice_iface
,
914 EffectIndex
, pParameters
, ParametersByteSize
);
917 static HRESULT WINAPI
XA23SUB_SetFilterParameters(IXAudio23SubmixVoice
*iface
,
918 const XAUDIO2_FILTER_PARAMETERS
*pParameters
, UINT32 OperationSet
)
920 XA2SubmixImpl
*This
= impl_from_IXAudio23SubmixVoice(iface
);
921 return IXAudio2SubmixVoice_SetFilterParameters(&This
->IXAudio2SubmixVoice_iface
,
922 pParameters
, OperationSet
);
925 static void WINAPI
XA23SUB_GetFilterParameters(IXAudio23SubmixVoice
*iface
,
926 XAUDIO2_FILTER_PARAMETERS
*pParameters
)
928 XA2SubmixImpl
*This
= impl_from_IXAudio23SubmixVoice(iface
);
929 return IXAudio2SubmixVoice_GetFilterParameters(&This
->IXAudio2SubmixVoice_iface
, pParameters
);
932 static HRESULT WINAPI
XA23SUB_SetVolume(IXAudio23SubmixVoice
*iface
,
933 float Volume
, UINT32 OperationSet
)
935 XA2SubmixImpl
*This
= impl_from_IXAudio23SubmixVoice(iface
);
936 return IXAudio2SubmixVoice_SetVolume(&This
->IXAudio2SubmixVoice_iface
,
937 Volume
, OperationSet
);
940 static void WINAPI
XA23SUB_GetVolume(IXAudio23SubmixVoice
*iface
,
943 XA2SubmixImpl
*This
= impl_from_IXAudio23SubmixVoice(iface
);
944 return IXAudio2SubmixVoice_GetVolume(&This
->IXAudio2SubmixVoice_iface
, pVolume
);
947 static HRESULT WINAPI
XA23SUB_SetChannelVolumes(IXAudio23SubmixVoice
*iface
,
948 UINT32 Channels
, const float *pVolumes
, UINT32 OperationSet
)
950 XA2SubmixImpl
*This
= impl_from_IXAudio23SubmixVoice(iface
);
951 return IXAudio2SubmixVoice_SetChannelVolumes(&This
->IXAudio2SubmixVoice_iface
,
952 Channels
, pVolumes
, OperationSet
);
955 static void WINAPI
XA23SUB_GetChannelVolumes(IXAudio23SubmixVoice
*iface
,
956 UINT32 Channels
, float *pVolumes
)
958 XA2SubmixImpl
*This
= impl_from_IXAudio23SubmixVoice(iface
);
959 return IXAudio2SubmixVoice_GetChannelVolumes(&This
->IXAudio2SubmixVoice_iface
,
963 static HRESULT WINAPI
XA23SUB_SetOutputMatrix(IXAudio23SubmixVoice
*iface
,
964 IXAudio2Voice
*pDestinationVoice
, UINT32 SubmixChannels
,
965 UINT32 DestinationChannels
, const float *pLevelMatrix
,
968 XA2SubmixImpl
*This
= impl_from_IXAudio23SubmixVoice(iface
);
969 return IXAudio2SubmixVoice_SetOutputMatrix(&This
->IXAudio2SubmixVoice_iface
,
970 pDestinationVoice
, SubmixChannels
, DestinationChannels
,
971 pLevelMatrix
, OperationSet
);
974 static void WINAPI
XA23SUB_GetOutputMatrix(IXAudio23SubmixVoice
*iface
,
975 IXAudio2Voice
*pDestinationVoice
, UINT32 SubmixChannels
,
976 UINT32 DestinationChannels
, float *pLevelMatrix
)
978 XA2SubmixImpl
*This
= impl_from_IXAudio23SubmixVoice(iface
);
979 return IXAudio2SubmixVoice_GetOutputMatrix(&This
->IXAudio2SubmixVoice_iface
,
980 pDestinationVoice
, SubmixChannels
, DestinationChannels
,
984 static void WINAPI
XA23SUB_DestroyVoice(IXAudio23SubmixVoice
*iface
)
986 XA2SubmixImpl
*This
= impl_from_IXAudio23SubmixVoice(iface
);
987 return IXAudio2SubmixVoice_DestroyVoice(&This
->IXAudio2SubmixVoice_iface
);
990 const IXAudio23SubmixVoiceVtbl XAudio23SubmixVoice_Vtbl
= {
991 XA23SUB_GetVoiceDetails
,
992 XA23SUB_SetOutputVoices
,
993 XA23SUB_SetEffectChain
,
994 XA23SUB_EnableEffect
,
995 XA23SUB_DisableEffect
,
996 XA23SUB_GetEffectState
,
997 XA23SUB_SetEffectParameters
,
998 XA23SUB_GetEffectParameters
,
999 XA23SUB_SetFilterParameters
,
1000 XA23SUB_GetFilterParameters
,
1003 XA23SUB_SetChannelVolumes
,
1004 XA23SUB_GetChannelVolumes
,
1005 XA23SUB_SetOutputMatrix
,
1006 XA23SUB_GetOutputMatrix
,
1007 XA23SUB_DestroyVoice
1010 static IXAudio2Impl
*impl_from_IXAudio23MasteringVoice(IXAudio23MasteringVoice
*iface
)
1012 return CONTAINING_RECORD(iface
, IXAudio2Impl
, IXAudio23MasteringVoice_iface
);
1015 static void WINAPI
XA23M_GetVoiceDetails(IXAudio23MasteringVoice
*iface
,
1016 XAUDIO2_VOICE_DETAILS
*pVoiceDetails
)
1018 IXAudio2Impl
*This
= impl_from_IXAudio23MasteringVoice(iface
);
1019 return IXAudio2MasteringVoice_GetVoiceDetails(&This
->IXAudio2MasteringVoice_iface
, pVoiceDetails
);
1022 static HRESULT WINAPI
XA23M_SetOutputVoices(IXAudio23MasteringVoice
*iface
,
1023 const XAUDIO23_VOICE_SENDS
*pSendList
)
1025 IXAudio2Impl
*This
= impl_from_IXAudio23MasteringVoice(iface
);
1026 XAUDIO2_VOICE_SENDS sends
;
1030 TRACE("%p, %p\n", This
, pSendList
);
1032 sends
.SendCount
= pSendList
->OutputCount
;
1033 sends
.pSends
= HeapAlloc(GetProcessHeap(), 0, sends
.SendCount
* sizeof(*sends
.pSends
));
1034 for(i
= 0; i
< sends
.SendCount
; ++i
){
1035 sends
.pSends
[i
].Flags
= 0;
1036 sends
.pSends
[i
].pOutputVoice
= pSendList
->pOutputVoices
[i
];
1039 hr
= IXAudio2MasteringVoice_SetOutputVoices(&This
->IXAudio2MasteringVoice_iface
, &sends
);
1041 HeapFree(GetProcessHeap(), 0, sends
.pSends
);
1046 static HRESULT WINAPI
XA23M_SetEffectChain(IXAudio23MasteringVoice
*iface
,
1047 const XAUDIO2_EFFECT_CHAIN
*pEffectChain
)
1049 IXAudio2Impl
*This
= impl_from_IXAudio23MasteringVoice(iface
);
1050 return IXAudio2MasteringVoice_SetEffectChain(&This
->IXAudio2MasteringVoice_iface
, pEffectChain
);
1053 static HRESULT WINAPI
XA23M_EnableEffect(IXAudio23MasteringVoice
*iface
,
1054 UINT32 EffectIndex
, UINT32 OperationSet
)
1056 IXAudio2Impl
*This
= impl_from_IXAudio23MasteringVoice(iface
);
1057 return IXAudio2MasteringVoice_EnableEffect(&This
->IXAudio2MasteringVoice_iface
,
1058 EffectIndex
, OperationSet
);
1061 static HRESULT WINAPI
XA23M_DisableEffect(IXAudio23MasteringVoice
*iface
,
1062 UINT32 EffectIndex
, UINT32 OperationSet
)
1064 IXAudio2Impl
*This
= impl_from_IXAudio23MasteringVoice(iface
);
1065 return IXAudio2MasteringVoice_DisableEffect(&This
->IXAudio2MasteringVoice_iface
,
1066 EffectIndex
, OperationSet
);
1069 static void WINAPI
XA23M_GetEffectState(IXAudio23MasteringVoice
*iface
,
1070 UINT32 EffectIndex
, BOOL
*pEnabled
)
1072 IXAudio2Impl
*This
= impl_from_IXAudio23MasteringVoice(iface
);
1073 return IXAudio2MasteringVoice_GetEffectState(&This
->IXAudio2MasteringVoice_iface
,
1074 EffectIndex
, pEnabled
);
1077 static HRESULT WINAPI
XA23M_SetEffectParameters(IXAudio23MasteringVoice
*iface
,
1078 UINT32 EffectIndex
, const void *pParameters
, UINT32 ParametersByteSize
,
1079 UINT32 OperationSet
)
1081 IXAudio2Impl
*This
= impl_from_IXAudio23MasteringVoice(iface
);
1082 return IXAudio2MasteringVoice_SetEffectParameters(&This
->IXAudio2MasteringVoice_iface
,
1083 EffectIndex
, pParameters
, ParametersByteSize
, OperationSet
);
1086 static HRESULT WINAPI
XA23M_GetEffectParameters(IXAudio23MasteringVoice
*iface
,
1087 UINT32 EffectIndex
, void *pParameters
, UINT32 ParametersByteSize
)
1089 IXAudio2Impl
*This
= impl_from_IXAudio23MasteringVoice(iface
);
1090 return IXAudio2MasteringVoice_GetEffectParameters(&This
->IXAudio2MasteringVoice_iface
,
1091 EffectIndex
, pParameters
, ParametersByteSize
);
1094 static HRESULT WINAPI
XA23M_SetFilterParameters(IXAudio23MasteringVoice
*iface
,
1095 const XAUDIO2_FILTER_PARAMETERS
*pParameters
, UINT32 OperationSet
)
1097 IXAudio2Impl
*This
= impl_from_IXAudio23MasteringVoice(iface
);
1098 return IXAudio2MasteringVoice_SetFilterParameters(&This
->IXAudio2MasteringVoice_iface
,
1099 pParameters
, OperationSet
);
1102 static void WINAPI
XA23M_GetFilterParameters(IXAudio23MasteringVoice
*iface
,
1103 XAUDIO2_FILTER_PARAMETERS
*pParameters
)
1105 IXAudio2Impl
*This
= impl_from_IXAudio23MasteringVoice(iface
);
1106 return IXAudio2MasteringVoice_GetFilterParameters(&This
->IXAudio2MasteringVoice_iface
, pParameters
);
1109 static HRESULT WINAPI
XA23M_SetVolume(IXAudio23MasteringVoice
*iface
,
1110 float Volume
, UINT32 OperationSet
)
1112 IXAudio2Impl
*This
= impl_from_IXAudio23MasteringVoice(iface
);
1113 return IXAudio2MasteringVoice_SetVolume(&This
->IXAudio2MasteringVoice_iface
,
1114 Volume
, OperationSet
);
1117 static void WINAPI
XA23M_GetVolume(IXAudio23MasteringVoice
*iface
,
1120 IXAudio2Impl
*This
= impl_from_IXAudio23MasteringVoice(iface
);
1121 return IXAudio2MasteringVoice_GetVolume(&This
->IXAudio2MasteringVoice_iface
, pVolume
);
1124 static HRESULT WINAPI
XA23M_SetChannelVolumes(IXAudio23MasteringVoice
*iface
,
1125 UINT32 Channels
, const float *pVolumes
, UINT32 OperationSet
)
1127 IXAudio2Impl
*This
= impl_from_IXAudio23MasteringVoice(iface
);
1128 return IXAudio2MasteringVoice_SetChannelVolumes(&This
->IXAudio2MasteringVoice_iface
,
1129 Channels
, pVolumes
, OperationSet
);
1132 static void WINAPI
XA23M_GetChannelVolumes(IXAudio23MasteringVoice
*iface
,
1133 UINT32 Channels
, float *pVolumes
)
1135 IXAudio2Impl
*This
= impl_from_IXAudio23MasteringVoice(iface
);
1136 return IXAudio2MasteringVoice_GetChannelVolumes(&This
->IXAudio2MasteringVoice_iface
,
1137 Channels
, pVolumes
);
1140 static HRESULT WINAPI
XA23M_SetOutputMatrix(IXAudio23MasteringVoice
*iface
,
1141 IXAudio2Voice
*pDestinationVoice
, UINT32 MasteringChannels
,
1142 UINT32 DestinationChannels
, const float *pLevelMatrix
,
1143 UINT32 OperationSet
)
1145 IXAudio2Impl
*This
= impl_from_IXAudio23MasteringVoice(iface
);
1146 return IXAudio2MasteringVoice_SetOutputMatrix(&This
->IXAudio2MasteringVoice_iface
,
1147 pDestinationVoice
, MasteringChannels
, DestinationChannels
,
1148 pLevelMatrix
, OperationSet
);
1151 static void WINAPI
XA23M_GetOutputMatrix(IXAudio23MasteringVoice
*iface
,
1152 IXAudio2Voice
*pDestinationVoice
, UINT32 MasteringChannels
,
1153 UINT32 DestinationChannels
, float *pLevelMatrix
)
1155 IXAudio2Impl
*This
= impl_from_IXAudio23MasteringVoice(iface
);
1156 return IXAudio2MasteringVoice_GetOutputMatrix(&This
->IXAudio2MasteringVoice_iface
,
1157 pDestinationVoice
, MasteringChannels
, DestinationChannels
,
1161 static void WINAPI
XA23M_DestroyVoice(IXAudio23MasteringVoice
*iface
)
1163 IXAudio2Impl
*This
= impl_from_IXAudio23MasteringVoice(iface
);
1164 return IXAudio2MasteringVoice_DestroyVoice(&This
->IXAudio2MasteringVoice_iface
);
1167 const IXAudio23MasteringVoiceVtbl XAudio23MasteringVoice_Vtbl
= {
1168 XA23M_GetVoiceDetails
,
1169 XA23M_SetOutputVoices
,
1170 XA23M_SetEffectChain
,
1172 XA23M_DisableEffect
,
1173 XA23M_GetEffectState
,
1174 XA23M_SetEffectParameters
,
1175 XA23M_GetEffectParameters
,
1176 XA23M_SetFilterParameters
,
1177 XA23M_GetFilterParameters
,
1180 XA23M_SetChannelVolumes
,
1181 XA23M_GetChannelVolumes
,
1182 XA23M_SetOutputMatrix
,
1183 XA23M_GetOutputMatrix
,
1187 static inline IXAudio2Impl
*impl_from_IXAudio22(IXAudio22
*iface
)
1189 return CONTAINING_RECORD(iface
, IXAudio2Impl
, IXAudio22_iface
);
1192 static HRESULT WINAPI
XA22_QueryInterface(IXAudio22
*iface
, REFIID riid
,
1195 IXAudio2Impl
*This
= impl_from_IXAudio22(iface
);
1196 return IXAudio2_QueryInterface(&This
->IXAudio2_iface
, riid
, ppvObject
);
1199 static ULONG WINAPI
XA22_AddRef(IXAudio22
*iface
)
1201 IXAudio2Impl
*This
= impl_from_IXAudio22(iface
);
1202 return IXAudio2_AddRef(&This
->IXAudio2_iface
);
1205 static ULONG WINAPI
XA22_Release(IXAudio22
*iface
)
1207 IXAudio2Impl
*This
= impl_from_IXAudio22(iface
);
1208 return IXAudio2_Release(&This
->IXAudio2_iface
);
1211 static HRESULT WINAPI
XA22_GetDeviceCount(IXAudio22
*iface
, UINT32
*pCount
)
1213 IXAudio2Impl
*This
= impl_from_IXAudio22(iface
);
1215 TRACE("%p, %p\n", This
, pCount
);
1217 *pCount
= This
->ndevs
;
1222 static HRESULT WINAPI
XA22_GetDeviceDetails(IXAudio22
*iface
, UINT32 index
,
1223 XAUDIO2_DEVICE_DETAILS
*pDeviceDetails
)
1225 IXAudio2Impl
*This
= impl_from_IXAudio22(iface
);
1228 IAudioClient
*client
;
1233 TRACE("%p, %u, %p\n", This
, index
, pDeviceDetails
);
1235 if(index
>= This
->ndevs
)
1236 return E_INVALIDARG
;
1238 hr
= IMMDeviceEnumerator_GetDevice(This
->devenum
, This
->devids
[index
], &dev
);
1240 WARN("GetDevice failed: %08x\n", hr
);
1244 hr
= IMMDevice_Activate(dev
, &IID_IAudioClient
, CLSCTX_INPROC_SERVER
,
1245 NULL
, (void**)&client
);
1247 WARN("Activate failed: %08x\n", hr
);
1248 IMMDevice_Release(dev
);
1252 hr
= IMMDevice_OpenPropertyStore(dev
, STGM_READ
, &ps
);
1254 WARN("OpenPropertyStore failed: %08x\n", hr
);
1255 IAudioClient_Release(client
);
1256 IMMDevice_Release(dev
);
1260 PropVariantInit(&var
);
1262 hr
= IPropertyStore_GetValue(ps
, (PROPERTYKEY
*)&DEVPKEY_Device_FriendlyName
, &var
);
1264 WARN("GetValue failed: %08x\n", hr
);
1268 lstrcpynW(pDeviceDetails
->DisplayName
, var
.u
.pwszVal
, sizeof(pDeviceDetails
->DisplayName
)/sizeof(WCHAR
));
1270 PropVariantClear(&var
);
1272 hr
= IAudioClient_GetMixFormat(client
, &wfx
);
1274 WARN("GetMixFormat failed: %08x\n", hr
);
1278 lstrcpyW(pDeviceDetails
->DeviceID
, This
->devids
[index
]);
1281 pDeviceDetails
->Role
= GlobalDefaultDevice
;
1283 pDeviceDetails
->Role
= NotDefaultDevice
;
1285 if(sizeof(WAVEFORMATEX
) + wfx
->cbSize
> sizeof(pDeviceDetails
->OutputFormat
)){
1286 FIXME("AudioClient format is too large to fit into WAVEFORMATEXTENSIBLE!\n");
1291 memcpy(&pDeviceDetails
->OutputFormat
, wfx
, sizeof(WAVEFORMATEX
) + wfx
->cbSize
);
1296 IPropertyStore_Release(ps
);
1297 IAudioClient_Release(client
);
1298 IMMDevice_Release(dev
);
1303 static HRESULT WINAPI
XA22_Initialize(IXAudio22
*iface
, UINT32 flags
,
1304 XAUDIO2_PROCESSOR processor
)
1306 IXAudio2Impl
*This
= impl_from_IXAudio22(iface
);
1307 TRACE("(%p)->(0x%x, 0x%x)\n", This
, flags
, processor
);
1311 static HRESULT WINAPI
XA22_RegisterForCallbacks(IXAudio22
*iface
,
1312 IXAudio2EngineCallback
*pCallback
)
1314 IXAudio2Impl
*This
= impl_from_IXAudio22(iface
);
1315 return IXAudio2_RegisterForCallbacks(&This
->IXAudio2_iface
, pCallback
);
1318 static void WINAPI
XA22_UnregisterForCallbacks(IXAudio22
*iface
,
1319 IXAudio2EngineCallback
*pCallback
)
1321 IXAudio2Impl
*This
= impl_from_IXAudio22(iface
);
1322 IXAudio2_UnregisterForCallbacks(&This
->IXAudio2_iface
, pCallback
);
1325 static HRESULT WINAPI
XA22_CreateSourceVoice(IXAudio22
*iface
,
1326 IXAudio2SourceVoice
**ppSourceVoice
, const WAVEFORMATEX
*pSourceFormat
,
1327 UINT32 flags
, float maxFrequencyRatio
,
1328 IXAudio2VoiceCallback
*pCallback
, const XAUDIO2_VOICE_SENDS
*pSendList
,
1329 const XAUDIO2_EFFECT_CHAIN
*pEffectChain
)
1331 IXAudio2Impl
*This
= impl_from_IXAudio22(iface
);
1332 return IXAudio2_CreateSourceVoice(&This
->IXAudio2_iface
, ppSourceVoice
,
1333 pSourceFormat
, flags
, maxFrequencyRatio
, pCallback
, pSendList
,
1337 static HRESULT WINAPI
XA22_CreateSubmixVoice(IXAudio22
*iface
,
1338 IXAudio2SubmixVoice
**ppSubmixVoice
, UINT32 inputChannels
,
1339 UINT32 inputSampleRate
, UINT32 flags
, UINT32 processingStage
,
1340 const XAUDIO2_VOICE_SENDS
*pSendList
,
1341 const XAUDIO2_EFFECT_CHAIN
*pEffectChain
)
1343 IXAudio2Impl
*This
= impl_from_IXAudio22(iface
);
1344 return IXAudio2_CreateSubmixVoice(&This
->IXAudio2_iface
, ppSubmixVoice
,
1345 inputChannels
, inputSampleRate
, flags
, processingStage
, pSendList
,
1349 static HRESULT WINAPI
XA22_CreateMasteringVoice(IXAudio22
*iface
,
1350 IXAudio2MasteringVoice
**ppMasteringVoice
, UINT32 inputChannels
,
1351 UINT32 inputSampleRate
, UINT32 flags
, UINT32 deviceIndex
,
1352 const XAUDIO2_EFFECT_CHAIN
*pEffectChain
)
1354 IXAudio2Impl
*This
= impl_from_IXAudio22(iface
);
1356 TRACE("(%p)->(%p, %u, %u, 0x%x, %u, %p)\n", This
, ppMasteringVoice
,
1357 inputChannels
, inputSampleRate
, flags
, deviceIndex
,
1360 if(deviceIndex
>= This
->ndevs
)
1361 return E_INVALIDARG
;
1363 return IXAudio2_CreateMasteringVoice(&This
->IXAudio2_iface
, ppMasteringVoice
,
1364 inputChannels
, inputSampleRate
, flags
, This
->devids
[deviceIndex
],
1365 pEffectChain
, AudioCategory_GameEffects
);
1368 static HRESULT WINAPI
XA22_StartEngine(IXAudio22
*iface
)
1370 IXAudio2Impl
*This
= impl_from_IXAudio22(iface
);
1371 return IXAudio2_StartEngine(&This
->IXAudio2_iface
);
1374 static void WINAPI
XA22_StopEngine(IXAudio22
*iface
)
1376 IXAudio2Impl
*This
= impl_from_IXAudio22(iface
);
1377 return IXAudio2_StopEngine(&This
->IXAudio2_iface
);
1380 static HRESULT WINAPI
XA22_CommitChanges(IXAudio22
*iface
, UINT32 operationSet
)
1382 IXAudio2Impl
*This
= impl_from_IXAudio22(iface
);
1383 return IXAudio2_CommitChanges(&This
->IXAudio2_iface
, operationSet
);
1386 static void WINAPI
XA22_GetPerformanceData(IXAudio22
*iface
,
1387 XAUDIO22_PERFORMANCE_DATA
*pPerfData
)
1389 IXAudio2Impl
*This
= impl_from_IXAudio22(iface
);
1390 XAUDIO2_PERFORMANCE_DATA data
;
1392 IXAudio2_GetPerformanceData(&This
->IXAudio2_iface
, &data
);
1394 pPerfData
->AudioCyclesSinceLastQuery
= data
.AudioCyclesSinceLastQuery
;
1395 pPerfData
->TotalCyclesSinceLastQuery
= data
.TotalCyclesSinceLastQuery
;
1396 pPerfData
->MinimumCyclesPerQuantum
= data
.MinimumCyclesPerQuantum
;
1397 pPerfData
->MaximumCyclesPerQuantum
= data
.MaximumCyclesPerQuantum
;
1398 pPerfData
->MemoryUsageInBytes
= data
.MemoryUsageInBytes
;
1399 pPerfData
->CurrentLatencyInSamples
= data
.CurrentLatencyInSamples
;
1400 pPerfData
->GlitchesSinceEngineStarted
= data
.GlitchesSinceEngineStarted
;
1401 pPerfData
->ActiveSourceVoiceCount
= data
.ActiveSourceVoiceCount
;
1402 pPerfData
->TotalSourceVoiceCount
= data
.TotalSourceVoiceCount
;
1404 pPerfData
->ActiveSubmixVoiceCount
= data
.ActiveSubmixVoiceCount
;
1405 pPerfData
->TotalSubmixVoiceCount
= data
.ActiveSubmixVoiceCount
;
1407 pPerfData
->ActiveXmaSourceVoices
= data
.ActiveXmaSourceVoices
;
1408 pPerfData
->ActiveXmaStreams
= data
.ActiveXmaStreams
;
1411 static void WINAPI
XA22_SetDebugConfiguration(IXAudio22
*iface
,
1412 const XAUDIO2_DEBUG_CONFIGURATION
*pDebugConfiguration
,
1415 IXAudio2Impl
*This
= impl_from_IXAudio22(iface
);
1416 return IXAudio2_SetDebugConfiguration(&This
->IXAudio2_iface
,
1417 pDebugConfiguration
, pReserved
);
1420 const IXAudio22Vtbl XAudio22_Vtbl
= {
1421 XA22_QueryInterface
,
1424 XA22_GetDeviceCount
,
1425 XA22_GetDeviceDetails
,
1427 XA22_RegisterForCallbacks
,
1428 XA22_UnregisterForCallbacks
,
1429 XA22_CreateSourceVoice
,
1430 XA22_CreateSubmixVoice
,
1431 XA22_CreateMasteringVoice
,
1435 XA22_GetPerformanceData
,
1436 XA22_SetDebugConfiguration
1439 static XA2SourceImpl
*impl_from_IXAudio20SourceVoice(IXAudio20SourceVoice
*iface
)
1441 return CONTAINING_RECORD(iface
, XA2SourceImpl
, IXAudio20SourceVoice_iface
);
1444 static void WINAPI
XA20SRC_GetVoiceDetails(IXAudio20SourceVoice
*iface
,
1445 XAUDIO2_VOICE_DETAILS
*pVoiceDetails
)
1447 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
1448 return IXAudio2SourceVoice_GetVoiceDetails(&This
->IXAudio2SourceVoice_iface
, pVoiceDetails
);
1451 static HRESULT WINAPI
XA20SRC_SetOutputVoices(IXAudio20SourceVoice
*iface
,
1452 const XAUDIO23_VOICE_SENDS
*pSendList
)
1454 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
1455 XAUDIO2_VOICE_SENDS sends
;
1459 TRACE("%p, %p\n", This
, pSendList
);
1461 sends
.SendCount
= pSendList
->OutputCount
;
1462 sends
.pSends
= HeapAlloc(GetProcessHeap(), 0, sends
.SendCount
* sizeof(*sends
.pSends
));
1463 for(i
= 0; i
< sends
.SendCount
; ++i
){
1464 sends
.pSends
[i
].Flags
= 0;
1465 sends
.pSends
[i
].pOutputVoice
= pSendList
->pOutputVoices
[i
];
1468 hr
= IXAudio2SourceVoice_SetOutputVoices(&This
->IXAudio2SourceVoice_iface
, &sends
);
1470 HeapFree(GetProcessHeap(), 0, sends
.pSends
);
1475 static HRESULT WINAPI
XA20SRC_SetEffectChain(IXAudio20SourceVoice
*iface
,
1476 const XAUDIO2_EFFECT_CHAIN
*pEffectChain
)
1478 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
1479 return IXAudio2SourceVoice_SetEffectChain(&This
->IXAudio2SourceVoice_iface
, pEffectChain
);
1482 static HRESULT WINAPI
XA20SRC_EnableEffect(IXAudio20SourceVoice
*iface
,
1483 UINT32 EffectIndex
, UINT32 OperationSet
)
1485 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
1486 return IXAudio2SourceVoice_EnableEffect(&This
->IXAudio2SourceVoice_iface
,
1487 EffectIndex
, OperationSet
);
1490 static HRESULT WINAPI
XA20SRC_DisableEffect(IXAudio20SourceVoice
*iface
,
1491 UINT32 EffectIndex
, UINT32 OperationSet
)
1493 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
1494 return IXAudio2SourceVoice_DisableEffect(&This
->IXAudio2SourceVoice_iface
,
1495 EffectIndex
, OperationSet
);
1498 static void WINAPI
XA20SRC_GetEffectState(IXAudio20SourceVoice
*iface
,
1499 UINT32 EffectIndex
, BOOL
*pEnabled
)
1501 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
1502 return IXAudio2SourceVoice_GetEffectState(&This
->IXAudio2SourceVoice_iface
,
1503 EffectIndex
, pEnabled
);
1506 static HRESULT WINAPI
XA20SRC_SetEffectParameters(IXAudio20SourceVoice
*iface
,
1507 UINT32 EffectIndex
, const void *pParameters
, UINT32 ParametersByteSize
,
1508 UINT32 OperationSet
)
1510 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
1511 return IXAudio2SourceVoice_SetEffectParameters(&This
->IXAudio2SourceVoice_iface
,
1512 EffectIndex
, pParameters
, ParametersByteSize
, OperationSet
);
1515 static HRESULT WINAPI
XA20SRC_GetEffectParameters(IXAudio20SourceVoice
*iface
,
1516 UINT32 EffectIndex
, void *pParameters
, UINT32 ParametersByteSize
)
1518 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
1519 return IXAudio2SourceVoice_GetEffectParameters(&This
->IXAudio2SourceVoice_iface
,
1520 EffectIndex
, pParameters
, ParametersByteSize
);
1523 static HRESULT WINAPI
XA20SRC_SetFilterParameters(IXAudio20SourceVoice
*iface
,
1524 const XAUDIO2_FILTER_PARAMETERS
*pParameters
, UINT32 OperationSet
)
1526 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
1527 return IXAudio2SourceVoice_SetFilterParameters(&This
->IXAudio2SourceVoice_iface
,
1528 pParameters
, OperationSet
);
1531 static void WINAPI
XA20SRC_GetFilterParameters(IXAudio20SourceVoice
*iface
,
1532 XAUDIO2_FILTER_PARAMETERS
*pParameters
)
1534 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
1535 return IXAudio2SourceVoice_GetFilterParameters(&This
->IXAudio2SourceVoice_iface
, pParameters
);
1538 static HRESULT WINAPI
XA20SRC_SetVolume(IXAudio20SourceVoice
*iface
,
1539 float Volume
, UINT32 OperationSet
)
1541 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
1542 return IXAudio2SourceVoice_SetVolume(&This
->IXAudio2SourceVoice_iface
,
1543 Volume
, OperationSet
);
1546 static void WINAPI
XA20SRC_GetVolume(IXAudio20SourceVoice
*iface
,
1549 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
1550 return IXAudio2SourceVoice_GetVolume(&This
->IXAudio2SourceVoice_iface
, pVolume
);
1553 static HRESULT WINAPI
XA20SRC_SetChannelVolumes(IXAudio20SourceVoice
*iface
,
1554 UINT32 Channels
, const float *pVolumes
, UINT32 OperationSet
)
1556 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
1557 return IXAudio2SourceVoice_SetChannelVolumes(&This
->IXAudio2SourceVoice_iface
,
1558 Channels
, pVolumes
, OperationSet
);
1561 static void WINAPI
XA20SRC_GetChannelVolumes(IXAudio20SourceVoice
*iface
,
1562 UINT32 Channels
, float *pVolumes
)
1564 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
1565 return IXAudio2SourceVoice_GetChannelVolumes(&This
->IXAudio2SourceVoice_iface
,
1566 Channels
, pVolumes
);
1569 static HRESULT WINAPI
XA20SRC_SetOutputMatrix(IXAudio20SourceVoice
*iface
,
1570 IXAudio2Voice
*pDestinationVoice
, UINT32 SourceChannels
,
1571 UINT32 DestinationChannels
, const float *pLevelMatrix
,
1572 UINT32 OperationSet
)
1574 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
1575 return IXAudio2SourceVoice_SetOutputMatrix(&This
->IXAudio2SourceVoice_iface
,
1576 pDestinationVoice
, SourceChannels
, DestinationChannels
,
1577 pLevelMatrix
, OperationSet
);
1580 static HRESULT WINAPI
XA20SRC_GetOutputMatrix(IXAudio20SourceVoice
*iface
,
1581 IXAudio2Voice
*pDestinationVoice
, UINT32 SourceChannels
,
1582 UINT32 DestinationChannels
, float *pLevelMatrix
)
1584 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
1585 IXAudio2SourceVoice_GetOutputMatrix(&This
->IXAudio2SourceVoice_iface
,
1586 pDestinationVoice
, SourceChannels
, DestinationChannels
,
1591 static void WINAPI
XA20SRC_DestroyVoice(IXAudio20SourceVoice
*iface
)
1593 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
1594 return IXAudio2SourceVoice_DestroyVoice(&This
->IXAudio2SourceVoice_iface
);
1597 static HRESULT WINAPI
XA20SRC_Start(IXAudio20SourceVoice
*iface
, UINT32 Flags
,
1598 UINT32 OperationSet
)
1600 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
1601 return IXAudio2SourceVoice_Start(&This
->IXAudio2SourceVoice_iface
, Flags
, OperationSet
);
1604 static HRESULT WINAPI
XA20SRC_Stop(IXAudio20SourceVoice
*iface
, UINT32 Flags
,
1605 UINT32 OperationSet
)
1607 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
1608 return IXAudio2SourceVoice_Stop(&This
->IXAudio2SourceVoice_iface
, Flags
, OperationSet
);
1611 static HRESULT WINAPI
XA20SRC_SubmitSourceBuffer(IXAudio20SourceVoice
*iface
,
1612 const XAUDIO2_BUFFER
*pBuffer
, const XAUDIO2_BUFFER_WMA
*pBufferWMA
)
1614 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
1615 return IXAudio2SourceVoice_SubmitSourceBuffer(&This
->IXAudio2SourceVoice_iface
,
1616 pBuffer
, pBufferWMA
);
1619 static HRESULT WINAPI
XA20SRC_FlushSourceBuffers(IXAudio20SourceVoice
*iface
)
1621 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
1622 return IXAudio2SourceVoice_FlushSourceBuffers(&This
->IXAudio2SourceVoice_iface
);
1625 static HRESULT WINAPI
XA20SRC_Discontinuity(IXAudio20SourceVoice
*iface
)
1627 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
1628 return IXAudio2SourceVoice_Discontinuity(&This
->IXAudio2SourceVoice_iface
);
1631 static HRESULT WINAPI
XA20SRC_ExitLoop(IXAudio20SourceVoice
*iface
,
1632 UINT32 OperationSet
)
1634 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
1635 return IXAudio2SourceVoice_ExitLoop(&This
->IXAudio2SourceVoice_iface
, OperationSet
);
1638 static void WINAPI
XA20SRC_GetState(IXAudio20SourceVoice
*iface
,
1639 XAUDIO2_VOICE_STATE
*pVoiceState
)
1641 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
1642 return IXAudio2SourceVoice_GetState(&This
->IXAudio2SourceVoice_iface
, pVoiceState
, 0);
1645 static HRESULT WINAPI
XA20SRC_SetFrequencyRatio(IXAudio20SourceVoice
*iface
,
1646 float Ratio
, UINT32 OperationSet
)
1648 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
1649 return IXAudio2SourceVoice_SetFrequencyRatio(&This
->IXAudio2SourceVoice_iface
,
1650 Ratio
, OperationSet
);
1653 static void WINAPI
XA20SRC_GetFrequencyRatio(IXAudio20SourceVoice
*iface
,
1656 XA2SourceImpl
*This
= impl_from_IXAudio20SourceVoice(iface
);
1657 return IXAudio2SourceVoice_GetFrequencyRatio(&This
->IXAudio2SourceVoice_iface
, pRatio
);
1660 const IXAudio20SourceVoiceVtbl XAudio20SourceVoice_Vtbl
= {
1661 XA20SRC_GetVoiceDetails
,
1662 XA20SRC_SetOutputVoices
,
1663 XA20SRC_SetEffectChain
,
1664 XA20SRC_EnableEffect
,
1665 XA20SRC_DisableEffect
,
1666 XA20SRC_GetEffectState
,
1667 XA20SRC_SetEffectParameters
,
1668 XA20SRC_GetEffectParameters
,
1669 XA20SRC_SetFilterParameters
,
1670 XA20SRC_GetFilterParameters
,
1673 XA20SRC_SetChannelVolumes
,
1674 XA20SRC_GetChannelVolumes
,
1675 XA20SRC_SetOutputMatrix
,
1676 XA20SRC_GetOutputMatrix
,
1677 XA20SRC_DestroyVoice
,
1680 XA20SRC_SubmitSourceBuffer
,
1681 XA20SRC_FlushSourceBuffers
,
1682 XA20SRC_Discontinuity
,
1685 XA20SRC_SetFrequencyRatio
,
1686 XA20SRC_GetFrequencyRatio
,
1689 static XA2SubmixImpl
*impl_from_IXAudio20SubmixVoice(IXAudio20SubmixVoice
*iface
)
1691 return CONTAINING_RECORD(iface
, XA2SubmixImpl
, IXAudio20SubmixVoice_iface
);
1694 static void WINAPI
XA20SUB_GetVoiceDetails(IXAudio20SubmixVoice
*iface
,
1695 XAUDIO2_VOICE_DETAILS
*pVoiceDetails
)
1697 XA2SubmixImpl
*This
= impl_from_IXAudio20SubmixVoice(iface
);
1698 return IXAudio2SubmixVoice_GetVoiceDetails(&This
->IXAudio2SubmixVoice_iface
, pVoiceDetails
);
1701 static HRESULT WINAPI
XA20SUB_SetOutputVoices(IXAudio20SubmixVoice
*iface
,
1702 const XAUDIO23_VOICE_SENDS
*pSendList
)
1704 XA2SubmixImpl
*This
= impl_from_IXAudio20SubmixVoice(iface
);
1705 XAUDIO2_VOICE_SENDS sends
;
1709 TRACE("%p, %p\n", This
, pSendList
);
1711 sends
.SendCount
= pSendList
->OutputCount
;
1712 sends
.pSends
= HeapAlloc(GetProcessHeap(), 0, sends
.SendCount
* sizeof(*sends
.pSends
));
1713 for(i
= 0; i
< sends
.SendCount
; ++i
){
1714 sends
.pSends
[i
].Flags
= 0;
1715 sends
.pSends
[i
].pOutputVoice
= pSendList
->pOutputVoices
[i
];
1718 hr
= IXAudio2SubmixVoice_SetOutputVoices(&This
->IXAudio2SubmixVoice_iface
, &sends
);
1720 HeapFree(GetProcessHeap(), 0, sends
.pSends
);
1725 static HRESULT WINAPI
XA20SUB_SetEffectChain(IXAudio20SubmixVoice
*iface
,
1726 const XAUDIO2_EFFECT_CHAIN
*pEffectChain
)
1728 XA2SubmixImpl
*This
= impl_from_IXAudio20SubmixVoice(iface
);
1729 return IXAudio2SubmixVoice_SetEffectChain(&This
->IXAudio2SubmixVoice_iface
, pEffectChain
);
1732 static HRESULT WINAPI
XA20SUB_EnableEffect(IXAudio20SubmixVoice
*iface
,
1733 UINT32 EffectIndex
, UINT32 OperationSet
)
1735 XA2SubmixImpl
*This
= impl_from_IXAudio20SubmixVoice(iface
);
1736 return IXAudio2SubmixVoice_EnableEffect(&This
->IXAudio2SubmixVoice_iface
,
1737 EffectIndex
, OperationSet
);
1740 static HRESULT WINAPI
XA20SUB_DisableEffect(IXAudio20SubmixVoice
*iface
,
1741 UINT32 EffectIndex
, UINT32 OperationSet
)
1743 XA2SubmixImpl
*This
= impl_from_IXAudio20SubmixVoice(iface
);
1744 return IXAudio2SubmixVoice_DisableEffect(&This
->IXAudio2SubmixVoice_iface
,
1745 EffectIndex
, OperationSet
);
1748 static void WINAPI
XA20SUB_GetEffectState(IXAudio20SubmixVoice
*iface
,
1749 UINT32 EffectIndex
, BOOL
*pEnabled
)
1751 XA2SubmixImpl
*This
= impl_from_IXAudio20SubmixVoice(iface
);
1752 return IXAudio2SubmixVoice_GetEffectState(&This
->IXAudio2SubmixVoice_iface
,
1753 EffectIndex
, pEnabled
);
1756 static HRESULT WINAPI
XA20SUB_SetEffectParameters(IXAudio20SubmixVoice
*iface
,
1757 UINT32 EffectIndex
, const void *pParameters
, UINT32 ParametersByteSize
,
1758 UINT32 OperationSet
)
1760 XA2SubmixImpl
*This
= impl_from_IXAudio20SubmixVoice(iface
);
1761 return IXAudio2SubmixVoice_SetEffectParameters(&This
->IXAudio2SubmixVoice_iface
,
1762 EffectIndex
, pParameters
, ParametersByteSize
, OperationSet
);
1765 static HRESULT WINAPI
XA20SUB_GetEffectParameters(IXAudio20SubmixVoice
*iface
,
1766 UINT32 EffectIndex
, void *pParameters
, UINT32 ParametersByteSize
)
1768 XA2SubmixImpl
*This
= impl_from_IXAudio20SubmixVoice(iface
);
1769 return IXAudio2SubmixVoice_GetEffectParameters(&This
->IXAudio2SubmixVoice_iface
,
1770 EffectIndex
, pParameters
, ParametersByteSize
);
1773 static HRESULT WINAPI
XA20SUB_SetFilterParameters(IXAudio20SubmixVoice
*iface
,
1774 const XAUDIO2_FILTER_PARAMETERS
*pParameters
, UINT32 OperationSet
)
1776 XA2SubmixImpl
*This
= impl_from_IXAudio20SubmixVoice(iface
);
1777 return IXAudio2SubmixVoice_SetFilterParameters(&This
->IXAudio2SubmixVoice_iface
,
1778 pParameters
, OperationSet
);
1781 static void WINAPI
XA20SUB_GetFilterParameters(IXAudio20SubmixVoice
*iface
,
1782 XAUDIO2_FILTER_PARAMETERS
*pParameters
)
1784 XA2SubmixImpl
*This
= impl_from_IXAudio20SubmixVoice(iface
);
1785 return IXAudio2SubmixVoice_GetFilterParameters(&This
->IXAudio2SubmixVoice_iface
, pParameters
);
1788 static HRESULT WINAPI
XA20SUB_SetVolume(IXAudio20SubmixVoice
*iface
,
1789 float Volume
, UINT32 OperationSet
)
1791 XA2SubmixImpl
*This
= impl_from_IXAudio20SubmixVoice(iface
);
1792 return IXAudio2SubmixVoice_SetVolume(&This
->IXAudio2SubmixVoice_iface
,
1793 Volume
, OperationSet
);
1796 static void WINAPI
XA20SUB_GetVolume(IXAudio20SubmixVoice
*iface
,
1799 XA2SubmixImpl
*This
= impl_from_IXAudio20SubmixVoice(iface
);
1800 return IXAudio2SubmixVoice_GetVolume(&This
->IXAudio2SubmixVoice_iface
, pVolume
);
1803 static HRESULT WINAPI
XA20SUB_SetChannelVolumes(IXAudio20SubmixVoice
*iface
,
1804 UINT32 Channels
, const float *pVolumes
, UINT32 OperationSet
)
1806 XA2SubmixImpl
*This
= impl_from_IXAudio20SubmixVoice(iface
);
1807 return IXAudio2SubmixVoice_SetChannelVolumes(&This
->IXAudio2SubmixVoice_iface
,
1808 Channels
, pVolumes
, OperationSet
);
1811 static void WINAPI
XA20SUB_GetChannelVolumes(IXAudio20SubmixVoice
*iface
,
1812 UINT32 Channels
, float *pVolumes
)
1814 XA2SubmixImpl
*This
= impl_from_IXAudio20SubmixVoice(iface
);
1815 return IXAudio2SubmixVoice_GetChannelVolumes(&This
->IXAudio2SubmixVoice_iface
,
1816 Channels
, pVolumes
);
1819 static HRESULT WINAPI
XA20SUB_SetOutputMatrix(IXAudio20SubmixVoice
*iface
,
1820 IXAudio2Voice
*pDestinationVoice
, UINT32 SubmixChannels
,
1821 UINT32 DestinationChannels
, const float *pLevelMatrix
,
1822 UINT32 OperationSet
)
1824 XA2SubmixImpl
*This
= impl_from_IXAudio20SubmixVoice(iface
);
1825 return IXAudio2SubmixVoice_SetOutputMatrix(&This
->IXAudio2SubmixVoice_iface
,
1826 pDestinationVoice
, SubmixChannels
, DestinationChannels
,
1827 pLevelMatrix
, OperationSet
);
1830 static HRESULT WINAPI
XA20SUB_GetOutputMatrix(IXAudio20SubmixVoice
*iface
,
1831 IXAudio2Voice
*pDestinationVoice
, UINT32 SubmixChannels
,
1832 UINT32 DestinationChannels
, float *pLevelMatrix
)
1834 XA2SubmixImpl
*This
= impl_from_IXAudio20SubmixVoice(iface
);
1835 IXAudio2SubmixVoice_GetOutputMatrix(&This
->IXAudio2SubmixVoice_iface
,
1836 pDestinationVoice
, SubmixChannels
, DestinationChannels
,
1841 static void WINAPI
XA20SUB_DestroyVoice(IXAudio20SubmixVoice
*iface
)
1843 XA2SubmixImpl
*This
= impl_from_IXAudio20SubmixVoice(iface
);
1844 return IXAudio2SubmixVoice_DestroyVoice(&This
->IXAudio2SubmixVoice_iface
);
1847 const IXAudio20SubmixVoiceVtbl XAudio20SubmixVoice_Vtbl
= {
1848 XA20SUB_GetVoiceDetails
,
1849 XA20SUB_SetOutputVoices
,
1850 XA20SUB_SetEffectChain
,
1851 XA20SUB_EnableEffect
,
1852 XA20SUB_DisableEffect
,
1853 XA20SUB_GetEffectState
,
1854 XA20SUB_SetEffectParameters
,
1855 XA20SUB_GetEffectParameters
,
1856 XA20SUB_SetFilterParameters
,
1857 XA20SUB_GetFilterParameters
,
1860 XA20SUB_SetChannelVolumes
,
1861 XA20SUB_GetChannelVolumes
,
1862 XA20SUB_SetOutputMatrix
,
1863 XA20SUB_GetOutputMatrix
,
1864 XA20SUB_DestroyVoice
1867 static IXAudio2Impl
*impl_from_IXAudio20MasteringVoice(IXAudio20MasteringVoice
*iface
)
1869 return CONTAINING_RECORD(iface
, IXAudio2Impl
, IXAudio20MasteringVoice_iface
);
1872 static void WINAPI
XA20M_GetVoiceDetails(IXAudio20MasteringVoice
*iface
,
1873 XAUDIO2_VOICE_DETAILS
*pVoiceDetails
)
1875 IXAudio2Impl
*This
= impl_from_IXAudio20MasteringVoice(iface
);
1876 return IXAudio2MasteringVoice_GetVoiceDetails(&This
->IXAudio2MasteringVoice_iface
, pVoiceDetails
);
1879 static HRESULT WINAPI
XA20M_SetOutputVoices(IXAudio20MasteringVoice
*iface
,
1880 const XAUDIO23_VOICE_SENDS
*pSendList
)
1882 IXAudio2Impl
*This
= impl_from_IXAudio20MasteringVoice(iface
);
1883 XAUDIO2_VOICE_SENDS sends
;
1887 TRACE("%p, %p\n", This
, pSendList
);
1889 sends
.SendCount
= pSendList
->OutputCount
;
1890 sends
.pSends
= HeapAlloc(GetProcessHeap(), 0, sends
.SendCount
* sizeof(*sends
.pSends
));
1891 for(i
= 0; i
< sends
.SendCount
; ++i
){
1892 sends
.pSends
[i
].Flags
= 0;
1893 sends
.pSends
[i
].pOutputVoice
= pSendList
->pOutputVoices
[i
];
1896 hr
= IXAudio2MasteringVoice_SetOutputVoices(&This
->IXAudio2MasteringVoice_iface
, &sends
);
1898 HeapFree(GetProcessHeap(), 0, sends
.pSends
);
1903 static HRESULT WINAPI
XA20M_SetEffectChain(IXAudio20MasteringVoice
*iface
,
1904 const XAUDIO2_EFFECT_CHAIN
*pEffectChain
)
1906 IXAudio2Impl
*This
= impl_from_IXAudio20MasteringVoice(iface
);
1907 return IXAudio2MasteringVoice_SetEffectChain(&This
->IXAudio2MasteringVoice_iface
, pEffectChain
);
1910 static HRESULT WINAPI
XA20M_EnableEffect(IXAudio20MasteringVoice
*iface
,
1911 UINT32 EffectIndex
, UINT32 OperationSet
)
1913 IXAudio2Impl
*This
= impl_from_IXAudio20MasteringVoice(iface
);
1914 return IXAudio2MasteringVoice_EnableEffect(&This
->IXAudio2MasteringVoice_iface
,
1915 EffectIndex
, OperationSet
);
1918 static HRESULT WINAPI
XA20M_DisableEffect(IXAudio20MasteringVoice
*iface
,
1919 UINT32 EffectIndex
, UINT32 OperationSet
)
1921 IXAudio2Impl
*This
= impl_from_IXAudio20MasteringVoice(iface
);
1922 return IXAudio2MasteringVoice_DisableEffect(&This
->IXAudio2MasteringVoice_iface
,
1923 EffectIndex
, OperationSet
);
1926 static void WINAPI
XA20M_GetEffectState(IXAudio20MasteringVoice
*iface
,
1927 UINT32 EffectIndex
, BOOL
*pEnabled
)
1929 IXAudio2Impl
*This
= impl_from_IXAudio20MasteringVoice(iface
);
1930 return IXAudio2MasteringVoice_GetEffectState(&This
->IXAudio2MasteringVoice_iface
,
1931 EffectIndex
, pEnabled
);
1934 static HRESULT WINAPI
XA20M_SetEffectParameters(IXAudio20MasteringVoice
*iface
,
1935 UINT32 EffectIndex
, const void *pParameters
, UINT32 ParametersByteSize
,
1936 UINT32 OperationSet
)
1938 IXAudio2Impl
*This
= impl_from_IXAudio20MasteringVoice(iface
);
1939 return IXAudio2MasteringVoice_SetEffectParameters(&This
->IXAudio2MasteringVoice_iface
,
1940 EffectIndex
, pParameters
, ParametersByteSize
, OperationSet
);
1943 static HRESULT WINAPI
XA20M_GetEffectParameters(IXAudio20MasteringVoice
*iface
,
1944 UINT32 EffectIndex
, void *pParameters
, UINT32 ParametersByteSize
)
1946 IXAudio2Impl
*This
= impl_from_IXAudio20MasteringVoice(iface
);
1947 return IXAudio2MasteringVoice_GetEffectParameters(&This
->IXAudio2MasteringVoice_iface
,
1948 EffectIndex
, pParameters
, ParametersByteSize
);
1951 static HRESULT WINAPI
XA20M_SetFilterParameters(IXAudio20MasteringVoice
*iface
,
1952 const XAUDIO2_FILTER_PARAMETERS
*pParameters
, UINT32 OperationSet
)
1954 IXAudio2Impl
*This
= impl_from_IXAudio20MasteringVoice(iface
);
1955 return IXAudio2MasteringVoice_SetFilterParameters(&This
->IXAudio2MasteringVoice_iface
,
1956 pParameters
, OperationSet
);
1959 static void WINAPI
XA20M_GetFilterParameters(IXAudio20MasteringVoice
*iface
,
1960 XAUDIO2_FILTER_PARAMETERS
*pParameters
)
1962 IXAudio2Impl
*This
= impl_from_IXAudio20MasteringVoice(iface
);
1963 return IXAudio2MasteringVoice_GetFilterParameters(&This
->IXAudio2MasteringVoice_iface
, pParameters
);
1966 static HRESULT WINAPI
XA20M_SetVolume(IXAudio20MasteringVoice
*iface
,
1967 float Volume
, UINT32 OperationSet
)
1969 IXAudio2Impl
*This
= impl_from_IXAudio20MasteringVoice(iface
);
1970 return IXAudio2MasteringVoice_SetVolume(&This
->IXAudio2MasteringVoice_iface
,
1971 Volume
, OperationSet
);
1974 static void WINAPI
XA20M_GetVolume(IXAudio20MasteringVoice
*iface
,
1977 IXAudio2Impl
*This
= impl_from_IXAudio20MasteringVoice(iface
);
1978 return IXAudio2MasteringVoice_GetVolume(&This
->IXAudio2MasteringVoice_iface
, pVolume
);
1981 static HRESULT WINAPI
XA20M_SetChannelVolumes(IXAudio20MasteringVoice
*iface
,
1982 UINT32 Channels
, const float *pVolumes
, UINT32 OperationSet
)
1984 IXAudio2Impl
*This
= impl_from_IXAudio20MasteringVoice(iface
);
1985 return IXAudio2MasteringVoice_SetChannelVolumes(&This
->IXAudio2MasteringVoice_iface
,
1986 Channels
, pVolumes
, OperationSet
);
1989 static void WINAPI
XA20M_GetChannelVolumes(IXAudio20MasteringVoice
*iface
,
1990 UINT32 Channels
, float *pVolumes
)
1992 IXAudio2Impl
*This
= impl_from_IXAudio20MasteringVoice(iface
);
1993 return IXAudio2MasteringVoice_GetChannelVolumes(&This
->IXAudio2MasteringVoice_iface
,
1994 Channels
, pVolumes
);
1997 static HRESULT WINAPI
XA20M_SetOutputMatrix(IXAudio20MasteringVoice
*iface
,
1998 IXAudio2Voice
*pDestinationVoice
, UINT32 MasteringChannels
,
1999 UINT32 DestinationChannels
, const float *pLevelMatrix
,
2000 UINT32 OperationSet
)
2002 IXAudio2Impl
*This
= impl_from_IXAudio20MasteringVoice(iface
);
2003 return IXAudio2MasteringVoice_SetOutputMatrix(&This
->IXAudio2MasteringVoice_iface
,
2004 pDestinationVoice
, MasteringChannels
, DestinationChannels
,
2005 pLevelMatrix
, OperationSet
);
2008 static HRESULT WINAPI
XA20M_GetOutputMatrix(IXAudio20MasteringVoice
*iface
,
2009 IXAudio2Voice
*pDestinationVoice
, UINT32 MasteringChannels
,
2010 UINT32 DestinationChannels
, float *pLevelMatrix
)
2012 IXAudio2Impl
*This
= impl_from_IXAudio20MasteringVoice(iface
);
2013 IXAudio2MasteringVoice_GetOutputMatrix(&This
->IXAudio2MasteringVoice_iface
,
2014 pDestinationVoice
, MasteringChannels
, DestinationChannels
,
2019 static void WINAPI
XA20M_DestroyVoice(IXAudio20MasteringVoice
*iface
)
2021 IXAudio2Impl
*This
= impl_from_IXAudio20MasteringVoice(iface
);
2022 return IXAudio2MasteringVoice_DestroyVoice(&This
->IXAudio2MasteringVoice_iface
);
2025 const IXAudio20MasteringVoiceVtbl XAudio20MasteringVoice_Vtbl
= {
2026 XA20M_GetVoiceDetails
,
2027 XA20M_SetOutputVoices
,
2028 XA20M_SetEffectChain
,
2030 XA20M_DisableEffect
,
2031 XA20M_GetEffectState
,
2032 XA20M_SetEffectParameters
,
2033 XA20M_GetEffectParameters
,
2034 XA20M_SetFilterParameters
,
2035 XA20M_GetFilterParameters
,
2038 XA20M_SetChannelVolumes
,
2039 XA20M_GetChannelVolumes
,
2040 XA20M_SetOutputMatrix
,
2041 XA20M_GetOutputMatrix
,
2045 static inline IXAudio2Impl
*impl_from_IXAudio20(IXAudio20
*iface
)
2047 return CONTAINING_RECORD(iface
, IXAudio2Impl
, IXAudio20_iface
);
2050 static HRESULT WINAPI
XA20_QueryInterface(IXAudio20
*iface
, REFIID riid
,
2053 IXAudio2Impl
*This
= impl_from_IXAudio20(iface
);
2054 return IXAudio2_QueryInterface(&This
->IXAudio2_iface
, riid
, ppvObject
);
2057 static ULONG WINAPI
XA20_AddRef(IXAudio20
*iface
)
2059 IXAudio2Impl
*This
= impl_from_IXAudio20(iface
);
2060 return IXAudio2_AddRef(&This
->IXAudio2_iface
);
2063 static ULONG WINAPI
XA20_Release(IXAudio20
*iface
)
2065 IXAudio2Impl
*This
= impl_from_IXAudio20(iface
);
2066 return IXAudio2_Release(&This
->IXAudio2_iface
);
2069 static HRESULT WINAPI
XA20_GetDeviceCount(IXAudio20
*iface
, UINT32
*pCount
)
2071 IXAudio2Impl
*This
= impl_from_IXAudio20(iface
);
2073 TRACE("%p, %p\n", This
, pCount
);
2075 *pCount
= This
->ndevs
;
2080 static HRESULT WINAPI
XA20_GetDeviceDetails(IXAudio20
*iface
, UINT32 index
,
2081 XAUDIO2_DEVICE_DETAILS
*pDeviceDetails
)
2083 IXAudio2Impl
*This
= impl_from_IXAudio20(iface
);
2086 IAudioClient
*client
;
2091 TRACE("%p, %u, %p\n", This
, index
, pDeviceDetails
);
2093 if(index
>= This
->ndevs
)
2094 return E_INVALIDARG
;
2096 hr
= IMMDeviceEnumerator_GetDevice(This
->devenum
, This
->devids
[index
], &dev
);
2098 WARN("GetDevice failed: %08x\n", hr
);
2102 hr
= IMMDevice_Activate(dev
, &IID_IAudioClient
, CLSCTX_INPROC_SERVER
,
2103 NULL
, (void**)&client
);
2105 WARN("Activate failed: %08x\n", hr
);
2106 IMMDevice_Release(dev
);
2110 hr
= IMMDevice_OpenPropertyStore(dev
, STGM_READ
, &ps
);
2112 WARN("OpenPropertyStore failed: %08x\n", hr
);
2113 IAudioClient_Release(client
);
2114 IMMDevice_Release(dev
);
2118 PropVariantInit(&var
);
2120 hr
= IPropertyStore_GetValue(ps
, (PROPERTYKEY
*)&DEVPKEY_Device_FriendlyName
, &var
);
2122 WARN("GetValue failed: %08x\n", hr
);
2126 lstrcpynW(pDeviceDetails
->DisplayName
, var
.u
.pwszVal
, sizeof(pDeviceDetails
->DisplayName
)/sizeof(WCHAR
));
2128 PropVariantClear(&var
);
2130 hr
= IAudioClient_GetMixFormat(client
, &wfx
);
2132 WARN("GetMixFormat failed: %08x\n", hr
);
2136 lstrcpyW(pDeviceDetails
->DeviceID
, This
->devids
[index
]);
2139 pDeviceDetails
->Role
= GlobalDefaultDevice
;
2141 pDeviceDetails
->Role
= NotDefaultDevice
;
2143 if(sizeof(WAVEFORMATEX
) + wfx
->cbSize
> sizeof(pDeviceDetails
->OutputFormat
)){
2144 FIXME("AudioClient format is too large to fit into WAVEFORMATEXTENSIBLE!\n");
2149 memcpy(&pDeviceDetails
->OutputFormat
, wfx
, sizeof(WAVEFORMATEX
) + wfx
->cbSize
);
2154 IPropertyStore_Release(ps
);
2155 IAudioClient_Release(client
);
2156 IMMDevice_Release(dev
);
2161 static HRESULT WINAPI
XA20_Initialize(IXAudio20
*iface
, UINT32 flags
,
2162 XAUDIO2_PROCESSOR processor
)
2164 IXAudio2Impl
*This
= impl_from_IXAudio20(iface
);
2165 TRACE("(%p)->(0x%x, 0x%x)\n", This
, flags
, processor
);
2169 static HRESULT WINAPI
XA20_RegisterForCallbacks(IXAudio20
*iface
,
2170 IXAudio2EngineCallback
*pCallback
)
2172 IXAudio2Impl
*This
= impl_from_IXAudio20(iface
);
2173 return IXAudio2_RegisterForCallbacks(&This
->IXAudio2_iface
, pCallback
);
2176 static void WINAPI
XA20_UnregisterForCallbacks(IXAudio20
*iface
,
2177 IXAudio2EngineCallback
*pCallback
)
2179 IXAudio2Impl
*This
= impl_from_IXAudio20(iface
);
2180 return IXAudio2_UnregisterForCallbacks(&This
->IXAudio2_iface
, pCallback
);
2183 static HRESULT WINAPI
XA20_CreateSourceVoice(IXAudio20
*iface
,
2184 IXAudio2SourceVoice
**ppSourceVoice
, const WAVEFORMATEX
*pSourceFormat
,
2185 UINT32 flags
, float maxFrequencyRatio
,
2186 IXAudio2VoiceCallback
*pCallback
, const XAUDIO2_VOICE_SENDS
*pSendList
,
2187 const XAUDIO2_EFFECT_CHAIN
*pEffectChain
)
2189 IXAudio2Impl
*This
= impl_from_IXAudio20(iface
);
2190 return IXAudio2_CreateSourceVoice(&This
->IXAudio2_iface
, ppSourceVoice
,
2191 pSourceFormat
, flags
, maxFrequencyRatio
, pCallback
, pSendList
,
2195 static HRESULT WINAPI
XA20_CreateSubmixVoice(IXAudio20
*iface
,
2196 IXAudio2SubmixVoice
**ppSubmixVoice
, UINT32 inputChannels
,
2197 UINT32 inputSampleRate
, UINT32 flags
, UINT32 processingStage
,
2198 const XAUDIO2_VOICE_SENDS
*pSendList
,
2199 const XAUDIO2_EFFECT_CHAIN
*pEffectChain
)
2201 IXAudio2Impl
*This
= impl_from_IXAudio20(iface
);
2202 return IXAudio2_CreateSubmixVoice(&This
->IXAudio2_iface
, ppSubmixVoice
,
2203 inputChannels
, inputSampleRate
, flags
, processingStage
, pSendList
,
2207 static HRESULT WINAPI
XA20_CreateMasteringVoice(IXAudio20
*iface
,
2208 IXAudio2MasteringVoice
**ppMasteringVoice
, UINT32 inputChannels
,
2209 UINT32 inputSampleRate
, UINT32 flags
, UINT32 deviceIndex
,
2210 const XAUDIO2_EFFECT_CHAIN
*pEffectChain
)
2212 IXAudio2Impl
*This
= impl_from_IXAudio20(iface
);
2214 TRACE("(%p)->(%p, %u, %u, 0x%x, %u, %p)\n", This
, ppMasteringVoice
,
2215 inputChannels
, inputSampleRate
, flags
, deviceIndex
,
2218 if(deviceIndex
>= This
->ndevs
)
2219 return E_INVALIDARG
;
2221 return IXAudio2_CreateMasteringVoice(&This
->IXAudio2_iface
, ppMasteringVoice
,
2222 inputChannels
, inputSampleRate
, flags
, This
->devids
[deviceIndex
],
2223 pEffectChain
, AudioCategory_GameEffects
);
2226 static HRESULT WINAPI
XA20_StartEngine(IXAudio20
*iface
)
2228 IXAudio2Impl
*This
= impl_from_IXAudio20(iface
);
2229 return IXAudio2_StartEngine(&This
->IXAudio2_iface
);
2232 static void WINAPI
XA20_StopEngine(IXAudio20
*iface
)
2234 IXAudio2Impl
*This
= impl_from_IXAudio20(iface
);
2235 return IXAudio2_StopEngine(&This
->IXAudio2_iface
);
2238 static HRESULT WINAPI
XA20_CommitChanges(IXAudio20
*iface
, UINT32 operationSet
)
2240 IXAudio2Impl
*This
= impl_from_IXAudio20(iface
);
2241 return IXAudio2_CommitChanges(&This
->IXAudio2_iface
, operationSet
);
2244 static void WINAPI
XA20_GetPerformanceData(IXAudio20
*iface
,
2245 XAUDIO20_PERFORMANCE_DATA
*pPerfData
)
2247 IXAudio2Impl
*This
= impl_from_IXAudio20(iface
);
2248 XAUDIO2_PERFORMANCE_DATA data
;
2250 IXAudio2_GetPerformanceData(&This
->IXAudio2_iface
, &data
);
2252 pPerfData
->AudioCyclesSinceLastQuery
= data
.AudioCyclesSinceLastQuery
;
2253 pPerfData
->TotalCyclesSinceLastQuery
= data
.TotalCyclesSinceLastQuery
;
2254 pPerfData
->MinimumCyclesPerQuantum
= data
.MinimumCyclesPerQuantum
;
2255 pPerfData
->MaximumCyclesPerQuantum
= data
.MaximumCyclesPerQuantum
;
2256 pPerfData
->MemoryUsageInBytes
= data
.MemoryUsageInBytes
;
2257 pPerfData
->CurrentLatencyInSamples
= data
.CurrentLatencyInSamples
;
2258 pPerfData
->GlitchesSinceLastQuery
= data
.GlitchesSinceEngineStarted
- This
->last_query_glitches
;
2259 This
->last_query_glitches
= data
.GlitchesSinceEngineStarted
;
2260 pPerfData
->ActiveSourceVoiceCount
= data
.ActiveSourceVoiceCount
;
2261 pPerfData
->TotalSourceVoiceCount
= data
.TotalSourceVoiceCount
;
2263 pPerfData
->ActiveSubmixVoiceCount
= data
.ActiveSubmixVoiceCount
;
2264 pPerfData
->TotalSubmixVoiceCount
= data
.ActiveSubmixVoiceCount
;
2266 pPerfData
->ActiveXmaSourceVoices
= data
.ActiveXmaSourceVoices
;
2267 pPerfData
->ActiveXmaStreams
= data
.ActiveXmaStreams
;
2270 static void WINAPI
XA20_SetDebugConfiguration(IXAudio20
*iface
,
2271 const XAUDIO2_DEBUG_CONFIGURATION
*pDebugConfiguration
,
2274 IXAudio2Impl
*This
= impl_from_IXAudio20(iface
);
2275 return IXAudio2_SetDebugConfiguration(&This
->IXAudio2_iface
,
2276 pDebugConfiguration
, pReserved
);
2279 const IXAudio20Vtbl XAudio20_Vtbl
= {
2280 XA20_QueryInterface
,
2283 XA20_GetDeviceCount
,
2284 XA20_GetDeviceDetails
,
2286 XA20_RegisterForCallbacks
,
2287 XA20_UnregisterForCallbacks
,
2288 XA20_CreateSourceVoice
,
2289 XA20_CreateSubmixVoice
,
2290 XA20_CreateMasteringVoice
,
2294 XA20_GetPerformanceData
,
2295 XA20_SetDebugConfiguration