TESTING -- override pthreads to fix gstreamer v5
[wine/multimedia.git] / dlls / xaudio2_7 / compat.c
blobffe6531dae8b366a582053c37c4e466ed8ea3280
1 /*
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
18 ***************
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.
28 * 2.0
29 * Initial version
31 * 2.1
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.
41 * 2.2
42 * Change CLSID_XAudio2
43 * No ABI break
45 * 2.3
46 * Change CLSID_XAudio2
47 * ABI break:
48 * Change struct XAUDIO2_PERFORMANCE_DATA
50 * 2.4
51 * Change CLSID_XAudio2
52 * ABI break:
53 * Add IXAudio2Voice::SetOutputFilterParameters
54 * Add IXAudio2Voice::GetOutputFilterParameters
55 * Add IXAudio2SourceVoice::SetSourceSampleRate
56 * Change struct XAUDIO2_VOICE_SENDS
58 * 2.5
59 * Change CLSID_XAudio2
60 * No ABI break
62 * 2.6
63 * Change CLSID_XAudio2
64 * No ABI break
66 * 2.7
67 * Change CLSID_XAudio2
68 * No ABI break
70 * 2.8
71 * Remove CLSID_XAudio2
72 * Change IID_IXAudio2
73 * Add xaudio2_8.XAudio2Create
74 * ABI break:
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
83 #include "config.h"
85 #define NONAMELESSUNION
86 #define NONAMELESSSTRUCT
87 #define COBJMACROS
89 #include <stdarg.h>
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,
146 UINT32 OperationSet)
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,
195 UINT32 OperationSet)
197 XA2SourceImpl *This = impl_from_IXAudio27SourceVoice(iface);
198 return IXAudio2SourceVoice_SetVolume(&This->IXAudio2SourceVoice_iface, Volume,
199 OperationSet);
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,
221 pVolumes);
224 static HRESULT WINAPI XA27SRC_SetOutputMatrix(IXAudio27SourceVoice *iface,
225 IXAudio2Voice *pDestinationVoice, UINT32 SourceChannels,
226 UINT32 DestinationChannels, const float *pLevelMatrix,
227 UINT32 OperationSet)
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,
251 UINT32 OperationSet)
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,
258 UINT32 OperationSet)
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,
269 pBufferWMA);
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,
331 XA27SRC_SetVolume,
332 XA27SRC_GetVolume,
333 XA27SRC_SetChannelVolumes,
334 XA27SRC_GetChannelVolumes,
335 XA27SRC_SetOutputMatrix,
336 XA27SRC_GetOutputMatrix,
337 XA27SRC_DestroyVoice,
338 XA27SRC_Start,
339 XA27SRC_Stop,
340 XA27SRC_SubmitSourceBuffer,
341 XA27SRC_FlushSourceBuffers,
342 XA27SRC_Discontinuity,
343 XA27SRC_ExitLoop,
344 XA27SRC_GetState,
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,
356 void **ppvObject)
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;
382 return S_OK;
385 static HRESULT WINAPI XA27_GetDeviceDetails(IXAudio27 *iface, UINT32 index,
386 XAUDIO2_DEVICE_DETAILS *pDeviceDetails)
388 IXAudio2Impl *This = impl_from_IXAudio27(iface);
389 HRESULT hr;
390 IMMDevice *dev;
391 IAudioClient *client;
392 IPropertyStore *ps;
393 WAVEFORMATEX *wfx;
394 PROPVARIANT var;
396 TRACE("%p, %u, %p\n", This, index, pDeviceDetails);
398 if(index >= This->ndevs)
399 return E_INVALIDARG;
401 hr = IMMDeviceEnumerator_GetDevice(This->devenum, This->devids[index], &dev);
402 if(FAILED(hr)){
403 WARN("GetDevice failed: %08x\n", hr);
404 return hr;
407 hr = IMMDevice_Activate(dev, &IID_IAudioClient, CLSCTX_INPROC_SERVER,
408 NULL, (void**)&client);
409 if(FAILED(hr)){
410 WARN("Activate failed: %08x\n", hr);
411 IMMDevice_Release(dev);
412 return hr;
415 hr = IMMDevice_OpenPropertyStore(dev, STGM_READ, &ps);
416 if(FAILED(hr)){
417 WARN("OpenPropertyStore failed: %08x\n", hr);
418 IAudioClient_Release(client);
419 IMMDevice_Release(dev);
420 return hr;
423 PropVariantInit(&var);
425 hr = IPropertyStore_GetValue(ps, (PROPERTYKEY*)&DEVPKEY_Device_FriendlyName, &var);
426 if(FAILED(hr)){
427 WARN("GetValue failed: %08x\n", hr);
428 goto done;
431 lstrcpynW(pDeviceDetails->DisplayName, var.u.pwszVal, sizeof(pDeviceDetails->DisplayName)/sizeof(WCHAR));
433 PropVariantClear(&var);
435 hr = IAudioClient_GetMixFormat(client, &wfx);
436 if(FAILED(hr)){
437 WARN("GetMixFormat failed: %08x\n", hr);
438 goto done;
441 lstrcpyW(pDeviceDetails->DeviceID, This->devids[index]);
443 if(index == 0)
444 pDeviceDetails->Role = GlobalDefaultDevice;
445 else
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");
450 CoTaskMemFree(wfx);
451 hr = E_FAIL;
452 goto done;
454 memcpy(&pDeviceDetails->OutputFormat, wfx, sizeof(WAVEFORMATEX) + wfx->cbSize);
456 CoTaskMemFree(wfx);
458 done:
459 IPropertyStore_Release(ps);
460 IAudioClient_Release(client);
461 IMMDevice_Release(dev);
463 return hr;
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);
471 return S_OK;
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,
497 pEffectChain);
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,
509 pEffectChain);
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,
521 pEffectChain);
523 if(deviceIndex >= This->ndevs)
524 return E_INVALIDARG;
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,
558 void *pReserved)
560 IXAudio2Impl *This = impl_from_IXAudio27(iface);
561 return IXAudio2_SetDebugConfiguration(&This->IXAudio2_iface,
562 pDebugConfiguration, pReserved);
565 const IXAudio27Vtbl XAudio27_Vtbl = {
566 XA27_QueryInterface,
567 XA27_AddRef,
568 XA27_Release,
569 XA27_GetDeviceCount,
570 XA27_GetDeviceDetails,
571 XA27_Initialize,
572 XA27_RegisterForCallbacks,
573 XA27_UnregisterForCallbacks,
574 XA27_CreateSourceVoice,
575 XA27_CreateSubmixVoice,
576 XA27_CreateMasteringVoice,
577 XA27_StartEngine,
578 XA27_StopEngine,
579 XA27_CommitChanges,
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;
601 HRESULT hr;
602 DWORD i;
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);
617 return hr;
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,
653 UINT32 OperationSet)
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,
692 float *pVolume)
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,
711 Channels, pVolumes);
714 static HRESULT WINAPI XA23SRC_SetOutputMatrix(IXAudio23SourceVoice *iface,
715 IXAudio2Voice *pDestinationVoice, UINT32 SourceChannels,
716 UINT32 DestinationChannels, const float *pLevelMatrix,
717 UINT32 OperationSet)
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,
732 pLevelMatrix);
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,
742 UINT32 OperationSet)
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,
749 UINT32 OperationSet)
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,
776 UINT32 OperationSet)
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,
798 float *pRatio)
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,
815 XA23SRC_SetVolume,
816 XA23SRC_GetVolume,
817 XA23SRC_SetChannelVolumes,
818 XA23SRC_GetChannelVolumes,
819 XA23SRC_SetOutputMatrix,
820 XA23SRC_GetOutputMatrix,
821 XA23SRC_DestroyVoice,
822 XA23SRC_Start,
823 XA23SRC_Stop,
824 XA23SRC_SubmitSourceBuffer,
825 XA23SRC_FlushSourceBuffers,
826 XA23SRC_Discontinuity,
827 XA23SRC_ExitLoop,
828 XA23SRC_GetState,
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;
850 HRESULT hr;
851 DWORD i;
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);
866 return hr;
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,
902 UINT32 OperationSet)
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,
941 float *pVolume)
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,
960 Channels, pVolumes);
963 static HRESULT WINAPI XA23SUB_SetOutputMatrix(IXAudio23SubmixVoice *iface,
964 IXAudio2Voice *pDestinationVoice, UINT32 SubmixChannels,
965 UINT32 DestinationChannels, const float *pLevelMatrix,
966 UINT32 OperationSet)
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,
981 pLevelMatrix);
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,
1001 XA23SUB_SetVolume,
1002 XA23SUB_GetVolume,
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;
1027 HRESULT hr;
1028 DWORD i;
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);
1043 return hr;
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,
1118 float *pVolume)
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,
1158 pLevelMatrix);
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,
1171 XA23M_EnableEffect,
1172 XA23M_DisableEffect,
1173 XA23M_GetEffectState,
1174 XA23M_SetEffectParameters,
1175 XA23M_GetEffectParameters,
1176 XA23M_SetFilterParameters,
1177 XA23M_GetFilterParameters,
1178 XA23M_SetVolume,
1179 XA23M_GetVolume,
1180 XA23M_SetChannelVolumes,
1181 XA23M_GetChannelVolumes,
1182 XA23M_SetOutputMatrix,
1183 XA23M_GetOutputMatrix,
1184 XA23M_DestroyVoice
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,
1193 void **ppvObject)
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;
1219 return S_OK;
1222 static HRESULT WINAPI XA22_GetDeviceDetails(IXAudio22 *iface, UINT32 index,
1223 XAUDIO2_DEVICE_DETAILS *pDeviceDetails)
1225 IXAudio2Impl *This = impl_from_IXAudio22(iface);
1226 HRESULT hr;
1227 IMMDevice *dev;
1228 IAudioClient *client;
1229 IPropertyStore *ps;
1230 WAVEFORMATEX *wfx;
1231 PROPVARIANT var;
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);
1239 if(FAILED(hr)){
1240 WARN("GetDevice failed: %08x\n", hr);
1241 return hr;
1244 hr = IMMDevice_Activate(dev, &IID_IAudioClient, CLSCTX_INPROC_SERVER,
1245 NULL, (void**)&client);
1246 if(FAILED(hr)){
1247 WARN("Activate failed: %08x\n", hr);
1248 IMMDevice_Release(dev);
1249 return hr;
1252 hr = IMMDevice_OpenPropertyStore(dev, STGM_READ, &ps);
1253 if(FAILED(hr)){
1254 WARN("OpenPropertyStore failed: %08x\n", hr);
1255 IAudioClient_Release(client);
1256 IMMDevice_Release(dev);
1257 return hr;
1260 PropVariantInit(&var);
1262 hr = IPropertyStore_GetValue(ps, (PROPERTYKEY*)&DEVPKEY_Device_FriendlyName, &var);
1263 if(FAILED(hr)){
1264 WARN("GetValue failed: %08x\n", hr);
1265 goto done;
1268 lstrcpynW(pDeviceDetails->DisplayName, var.u.pwszVal, sizeof(pDeviceDetails->DisplayName)/sizeof(WCHAR));
1270 PropVariantClear(&var);
1272 hr = IAudioClient_GetMixFormat(client, &wfx);
1273 if(FAILED(hr)){
1274 WARN("GetMixFormat failed: %08x\n", hr);
1275 goto done;
1278 lstrcpyW(pDeviceDetails->DeviceID, This->devids[index]);
1280 if(index == 0)
1281 pDeviceDetails->Role = GlobalDefaultDevice;
1282 else
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");
1287 CoTaskMemFree(wfx);
1288 hr = E_FAIL;
1289 goto done;
1291 memcpy(&pDeviceDetails->OutputFormat, wfx, sizeof(WAVEFORMATEX) + wfx->cbSize);
1293 CoTaskMemFree(wfx);
1295 done:
1296 IPropertyStore_Release(ps);
1297 IAudioClient_Release(client);
1298 IMMDevice_Release(dev);
1300 return hr;
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);
1308 return S_OK;
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,
1334 pEffectChain);
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,
1346 pEffectChain);
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,
1358 pEffectChain);
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,
1413 void *pReserved)
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,
1422 XA22_AddRef,
1423 XA22_Release,
1424 XA22_GetDeviceCount,
1425 XA22_GetDeviceDetails,
1426 XA22_Initialize,
1427 XA22_RegisterForCallbacks,
1428 XA22_UnregisterForCallbacks,
1429 XA22_CreateSourceVoice,
1430 XA22_CreateSubmixVoice,
1431 XA22_CreateMasteringVoice,
1432 XA22_StartEngine,
1433 XA22_StopEngine,
1434 XA22_CommitChanges,
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;
1456 HRESULT hr;
1457 DWORD i;
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);
1472 return hr;
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,
1547 float *pVolume)
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,
1587 pLevelMatrix);
1588 return S_OK;
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,
1654 float *pRatio)
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,
1671 XA20SRC_SetVolume,
1672 XA20SRC_GetVolume,
1673 XA20SRC_SetChannelVolumes,
1674 XA20SRC_GetChannelVolumes,
1675 XA20SRC_SetOutputMatrix,
1676 XA20SRC_GetOutputMatrix,
1677 XA20SRC_DestroyVoice,
1678 XA20SRC_Start,
1679 XA20SRC_Stop,
1680 XA20SRC_SubmitSourceBuffer,
1681 XA20SRC_FlushSourceBuffers,
1682 XA20SRC_Discontinuity,
1683 XA20SRC_ExitLoop,
1684 XA20SRC_GetState,
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;
1706 HRESULT hr;
1707 DWORD i;
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);
1722 return hr;
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,
1797 float *pVolume)
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,
1837 pLevelMatrix);
1838 return S_OK;
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,
1858 XA20SUB_SetVolume,
1859 XA20SUB_GetVolume,
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;
1884 HRESULT hr;
1885 DWORD i;
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);
1900 return hr;
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,
1975 float *pVolume)
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,
2015 pLevelMatrix);
2016 return S_OK;
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,
2029 XA20M_EnableEffect,
2030 XA20M_DisableEffect,
2031 XA20M_GetEffectState,
2032 XA20M_SetEffectParameters,
2033 XA20M_GetEffectParameters,
2034 XA20M_SetFilterParameters,
2035 XA20M_GetFilterParameters,
2036 XA20M_SetVolume,
2037 XA20M_GetVolume,
2038 XA20M_SetChannelVolumes,
2039 XA20M_GetChannelVolumes,
2040 XA20M_SetOutputMatrix,
2041 XA20M_GetOutputMatrix,
2042 XA20M_DestroyVoice
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,
2051 void **ppvObject)
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;
2077 return S_OK;
2080 static HRESULT WINAPI XA20_GetDeviceDetails(IXAudio20 *iface, UINT32 index,
2081 XAUDIO2_DEVICE_DETAILS *pDeviceDetails)
2083 IXAudio2Impl *This = impl_from_IXAudio20(iface);
2084 HRESULT hr;
2085 IMMDevice *dev;
2086 IAudioClient *client;
2087 IPropertyStore *ps;
2088 WAVEFORMATEX *wfx;
2089 PROPVARIANT var;
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);
2097 if(FAILED(hr)){
2098 WARN("GetDevice failed: %08x\n", hr);
2099 return hr;
2102 hr = IMMDevice_Activate(dev, &IID_IAudioClient, CLSCTX_INPROC_SERVER,
2103 NULL, (void**)&client);
2104 if(FAILED(hr)){
2105 WARN("Activate failed: %08x\n", hr);
2106 IMMDevice_Release(dev);
2107 return hr;
2110 hr = IMMDevice_OpenPropertyStore(dev, STGM_READ, &ps);
2111 if(FAILED(hr)){
2112 WARN("OpenPropertyStore failed: %08x\n", hr);
2113 IAudioClient_Release(client);
2114 IMMDevice_Release(dev);
2115 return hr;
2118 PropVariantInit(&var);
2120 hr = IPropertyStore_GetValue(ps, (PROPERTYKEY*)&DEVPKEY_Device_FriendlyName, &var);
2121 if(FAILED(hr)){
2122 WARN("GetValue failed: %08x\n", hr);
2123 goto done;
2126 lstrcpynW(pDeviceDetails->DisplayName, var.u.pwszVal, sizeof(pDeviceDetails->DisplayName)/sizeof(WCHAR));
2128 PropVariantClear(&var);
2130 hr = IAudioClient_GetMixFormat(client, &wfx);
2131 if(FAILED(hr)){
2132 WARN("GetMixFormat failed: %08x\n", hr);
2133 goto done;
2136 lstrcpyW(pDeviceDetails->DeviceID, This->devids[index]);
2138 if(index == 0)
2139 pDeviceDetails->Role = GlobalDefaultDevice;
2140 else
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");
2145 CoTaskMemFree(wfx);
2146 hr = E_FAIL;
2147 goto done;
2149 memcpy(&pDeviceDetails->OutputFormat, wfx, sizeof(WAVEFORMATEX) + wfx->cbSize);
2151 CoTaskMemFree(wfx);
2153 done:
2154 IPropertyStore_Release(ps);
2155 IAudioClient_Release(client);
2156 IMMDevice_Release(dev);
2158 return hr;
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);
2166 return S_OK;
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,
2192 pEffectChain);
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,
2204 pEffectChain);
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,
2216 pEffectChain);
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,
2272 void *pReserved)
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,
2281 XA20_AddRef,
2282 XA20_Release,
2283 XA20_GetDeviceCount,
2284 XA20_GetDeviceDetails,
2285 XA20_Initialize,
2286 XA20_RegisterForCallbacks,
2287 XA20_UnregisterForCallbacks,
2288 XA20_CreateSourceVoice,
2289 XA20_CreateSubmixVoice,
2290 XA20_CreateMasteringVoice,
2291 XA20_StartEngine,
2292 XA20_StopEngine,
2293 XA20_CommitChanges,
2294 XA20_GetPerformanceData,
2295 XA20_SetDebugConfiguration