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
23 #define NONAMELESSUNION
27 #include "xaudio_private.h"
30 #include "wine/debug.h"
32 WINE_DEFAULT_DEBUG_CHANNEL(xaudio2
);
35 BOOL WINAPI
DllMain(HINSTANCE hinstDLL
, DWORD reason
, void *pReserved
)
37 TRACE("(%p, %d, %p)\n", hinstDLL
, reason
, pReserved
);
41 case DLL_WINE_PREATTACH
:
42 return FALSE
; /* prefer native version */
43 case DLL_PROCESS_ATTACH
:
44 DisableThreadLibraryCalls( hinstDLL
);
49 #endif /* XAPOFX1_VER */
51 typedef struct _VUMeterImpl
{
53 IXAPOParameters IXAPOParameters_iface
;
58 static VUMeterImpl
*VUMeterImpl_from_IXAPO(IXAPO
*iface
)
60 return CONTAINING_RECORD(iface
, VUMeterImpl
, IXAPO_iface
);
63 static VUMeterImpl
*VUMeterImpl_from_IXAPOParameters(IXAPOParameters
*iface
)
65 return CONTAINING_RECORD(iface
, VUMeterImpl
, IXAPOParameters_iface
);
68 static HRESULT WINAPI
VUMXAPO_QueryInterface(IXAPO
*iface
, REFIID riid
,
71 VUMeterImpl
*This
= VUMeterImpl_from_IXAPO(iface
);
73 TRACE("%p, %s, %p\n", This
, wine_dbgstr_guid(riid
), ppvObject
);
75 if(IsEqualGUID(riid
, &IID_IUnknown
) ||
76 IsEqualGUID(riid
, &IID_IXAPO
) ||
77 IsEqualGUID(riid
, &IID_IXAPO27
))
78 *ppvObject
= &This
->IXAPO_iface
;
79 else if(IsEqualGUID(riid
, &IID_IXAPOParameters
))
80 *ppvObject
= &This
->IXAPOParameters_iface
;
85 IUnknown_AddRef((IUnknown
*)*ppvObject
);
92 static ULONG WINAPI
VUMXAPO_AddRef(IXAPO
*iface
)
94 VUMeterImpl
*This
= VUMeterImpl_from_IXAPO(iface
);
95 ULONG ref
= InterlockedIncrement(&This
->ref
);
96 TRACE("(%p)->(): Refcount now %u\n", This
, ref
);
100 static ULONG WINAPI
VUMXAPO_Release(IXAPO
*iface
)
102 VUMeterImpl
*This
= VUMeterImpl_from_IXAPO(iface
);
103 ULONG ref
= InterlockedDecrement(&This
->ref
);
105 TRACE("(%p)->(): Refcount now %u\n", This
, ref
);
108 HeapFree(GetProcessHeap(), 0, This
);
113 static HRESULT WINAPI
VUMXAPO_GetRegistrationProperties(IXAPO
*iface
,
114 XAPO_REGISTRATION_PROPERTIES
**props
)
116 VUMeterImpl
*This
= VUMeterImpl_from_IXAPO(iface
);
117 TRACE("%p, %p\n", This
, props
);
118 /* TODO: check for version == 20 and use XAPO20_REGISTRATION_PROPERTIES */
122 static HRESULT WINAPI
VUMXAPO_IsInputFormatSupported(IXAPO
*iface
,
123 const WAVEFORMATEX
*output_fmt
, const WAVEFORMATEX
*input_fmt
,
124 WAVEFORMATEX
**supported_fmt
)
126 VUMeterImpl
*This
= VUMeterImpl_from_IXAPO(iface
);
127 TRACE("%p, %p, %p, %p\n", This
, output_fmt
, input_fmt
, supported_fmt
);
131 static HRESULT WINAPI
VUMXAPO_IsOutputFormatSupported(IXAPO
*iface
,
132 const WAVEFORMATEX
*input_fmt
, const WAVEFORMATEX
*output_fmt
,
133 WAVEFORMATEX
**supported_fmt
)
135 VUMeterImpl
*This
= VUMeterImpl_from_IXAPO(iface
);
136 TRACE("%p, %p, %p, %p\n", This
, input_fmt
, output_fmt
, supported_fmt
);
140 static HRESULT WINAPI
VUMXAPO_Initialize(IXAPO
*iface
, const void *data
,
143 VUMeterImpl
*This
= VUMeterImpl_from_IXAPO(iface
);
144 TRACE("%p, %p, %u\n", This
, data
, data_len
);
148 static void WINAPI
VUMXAPO_Reset(IXAPO
*iface
)
150 VUMeterImpl
*This
= VUMeterImpl_from_IXAPO(iface
);
154 static HRESULT WINAPI
VUMXAPO_LockForProcess(IXAPO
*iface
,
155 UINT32 in_params_count
,
156 const XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS
*in_params
,
157 UINT32 out_params_count
,
158 const XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS
*out_params
)
160 VUMeterImpl
*This
= VUMeterImpl_from_IXAPO(iface
);
161 TRACE("%p, %u, %p, %u, %p\n", This
, in_params_count
, in_params
,
162 out_params_count
, out_params
);
166 static void WINAPI
VUMXAPO_UnlockForProcess(IXAPO
*iface
)
168 VUMeterImpl
*This
= VUMeterImpl_from_IXAPO(iface
);
172 static void WINAPI
VUMXAPO_Process(IXAPO
*iface
, UINT32 in_params_count
,
173 const XAPO_PROCESS_BUFFER_PARAMETERS
*in_params
,
174 UINT32 out_params_count
,
175 const XAPO_PROCESS_BUFFER_PARAMETERS
*out_params
, BOOL enabled
)
177 VUMeterImpl
*This
= VUMeterImpl_from_IXAPO(iface
);
178 TRACE("%p, %u, %p, %u, %p, %u\n", This
, in_params_count
, in_params
,
179 out_params_count
, out_params
, enabled
);
182 static UINT32 WINAPI
VUMXAPO_CalcInputFrames(IXAPO
*iface
, UINT32 output_frames
)
184 VUMeterImpl
*This
= VUMeterImpl_from_IXAPO(iface
);
185 TRACE("%p, %u\n", This
, output_frames
);
189 static UINT32 WINAPI
VUMXAPO_CalcOutputFrames(IXAPO
*iface
, UINT32 input_frames
)
191 VUMeterImpl
*This
= VUMeterImpl_from_IXAPO(iface
);
192 TRACE("%p, %u\n", This
, input_frames
);
196 static const IXAPOVtbl VUMXAPO_Vtbl
= {
197 VUMXAPO_QueryInterface
,
200 VUMXAPO_GetRegistrationProperties
,
201 VUMXAPO_IsInputFormatSupported
,
202 VUMXAPO_IsOutputFormatSupported
,
205 VUMXAPO_LockForProcess
,
206 VUMXAPO_UnlockForProcess
,
208 VUMXAPO_CalcInputFrames
,
209 VUMXAPO_CalcOutputFrames
212 static HRESULT WINAPI
VUMXAPOParams_QueryInterface(IXAPOParameters
*iface
,
213 REFIID riid
, void **ppvObject
)
215 VUMeterImpl
*This
= VUMeterImpl_from_IXAPOParameters(iface
);
216 return VUMXAPO_QueryInterface(&This
->IXAPO_iface
, riid
, ppvObject
);
219 static ULONG WINAPI
VUMXAPOParams_AddRef(IXAPOParameters
*iface
)
221 VUMeterImpl
*This
= VUMeterImpl_from_IXAPOParameters(iface
);
222 return VUMXAPO_AddRef(&This
->IXAPO_iface
);
225 static ULONG WINAPI
VUMXAPOParams_Release(IXAPOParameters
*iface
)
227 VUMeterImpl
*This
= VUMeterImpl_from_IXAPOParameters(iface
);
228 return VUMXAPO_Release(&This
->IXAPO_iface
);
231 static void WINAPI
VUMXAPOParams_SetParameters(IXAPOParameters
*iface
,
232 const void *params
, UINT32 params_len
)
234 VUMeterImpl
*This
= VUMeterImpl_from_IXAPOParameters(iface
);
235 TRACE("%p, %p, %u\n", This
, params
, params_len
);
238 static void WINAPI
VUMXAPOParams_GetParameters(IXAPOParameters
*iface
,
239 void *params
, UINT32 params_len
)
241 VUMeterImpl
*This
= VUMeterImpl_from_IXAPOParameters(iface
);
242 TRACE("%p, %p, %u\n", This
, params
, params_len
);
245 static const IXAPOParametersVtbl VUMXAPOParameters_Vtbl
= {
246 VUMXAPOParams_QueryInterface
,
247 VUMXAPOParams_AddRef
,
248 VUMXAPOParams_Release
,
249 VUMXAPOParams_SetParameters
,
250 VUMXAPOParams_GetParameters
253 typedef struct _ReverbImpl
{
255 IXAPOParameters IXAPOParameters_iface
;
260 static ReverbImpl
*ReverbImpl_from_IXAPO(IXAPO
*iface
)
262 return CONTAINING_RECORD(iface
, ReverbImpl
, IXAPO_iface
);
265 static ReverbImpl
*ReverbImpl_from_IXAPOParameters(IXAPOParameters
*iface
)
267 return CONTAINING_RECORD(iface
, ReverbImpl
, IXAPOParameters_iface
);
270 static HRESULT WINAPI
RVBXAPO_QueryInterface(IXAPO
*iface
, REFIID riid
, void **ppvObject
)
272 ReverbImpl
*This
= ReverbImpl_from_IXAPO(iface
);
274 TRACE("%p, %s, %p\n", This
, wine_dbgstr_guid(riid
), ppvObject
);
276 if(IsEqualGUID(riid
, &IID_IUnknown
) ||
277 IsEqualGUID(riid
, &IID_IXAPO
) ||
278 IsEqualGUID(riid
, &IID_IXAPO27
))
279 *ppvObject
= &This
->IXAPO_iface
;
280 else if(IsEqualGUID(riid
, &IID_IXAPOParameters
))
281 *ppvObject
= &This
->IXAPOParameters_iface
;
286 IUnknown_AddRef((IUnknown
*)*ppvObject
);
290 return E_NOINTERFACE
;
293 static ULONG WINAPI
RVBXAPO_AddRef(IXAPO
*iface
)
295 ReverbImpl
*This
= ReverbImpl_from_IXAPO(iface
);
296 ULONG ref
= InterlockedIncrement(&This
->ref
);
297 TRACE("(%p)->(): Refcount now %u\n", This
, ref
);
301 static ULONG WINAPI
RVBXAPO_Release(IXAPO
*iface
)
303 ReverbImpl
*This
= ReverbImpl_from_IXAPO(iface
);
304 ULONG ref
= InterlockedDecrement(&This
->ref
);
306 TRACE("(%p)->(): Refcount now %u\n", This
, ref
);
309 HeapFree(GetProcessHeap(), 0, This
);
314 static HRESULT WINAPI
RVBXAPO_GetRegistrationProperties(IXAPO
*iface
,
315 XAPO_REGISTRATION_PROPERTIES
**props
)
317 ReverbImpl
*This
= ReverbImpl_from_IXAPO(iface
);
318 TRACE("%p, %p\n", This
, props
);
319 /* TODO: check for version == 20 and use XAPO20_REGISTRATION_PROPERTIES */
323 static HRESULT WINAPI
RVBXAPO_IsInputFormatSupported(IXAPO
*iface
,
324 const WAVEFORMATEX
*output_fmt
, const WAVEFORMATEX
*input_fmt
,
325 WAVEFORMATEX
**supported_fmt
)
327 ReverbImpl
*This
= ReverbImpl_from_IXAPO(iface
);
328 TRACE("%p, %p, %p, %p\n", This
, output_fmt
, input_fmt
, supported_fmt
);
332 static HRESULT WINAPI
RVBXAPO_IsOutputFormatSupported(IXAPO
*iface
,
333 const WAVEFORMATEX
*input_fmt
, const WAVEFORMATEX
*output_fmt
,
334 WAVEFORMATEX
**supported_fmt
)
336 ReverbImpl
*This
= ReverbImpl_from_IXAPO(iface
);
337 TRACE("%p, %p, %p, %p\n", This
, input_fmt
, output_fmt
, supported_fmt
);
341 static HRESULT WINAPI
RVBXAPO_Initialize(IXAPO
*iface
, const void *data
,
344 ReverbImpl
*This
= ReverbImpl_from_IXAPO(iface
);
345 TRACE("%p, %p, %u\n", This
, data
, data_len
);
349 static void WINAPI
RVBXAPO_Reset(IXAPO
*iface
)
351 ReverbImpl
*This
= ReverbImpl_from_IXAPO(iface
);
355 static HRESULT WINAPI
RVBXAPO_LockForProcess(IXAPO
*iface
, UINT32 in_params_count
,
356 const XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS
*in_params
,
357 UINT32 out_params_count
,
358 const XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS
*out_params
)
360 ReverbImpl
*This
= ReverbImpl_from_IXAPO(iface
);
361 TRACE("%p, %u, %p, %u, %p\n", This
, in_params_count
, in_params
,
362 out_params_count
, out_params
);
366 static void WINAPI
RVBXAPO_UnlockForProcess(IXAPO
*iface
)
368 ReverbImpl
*This
= ReverbImpl_from_IXAPO(iface
);
372 static void WINAPI
RVBXAPO_Process(IXAPO
*iface
, UINT32 in_params_count
,
373 const XAPO_PROCESS_BUFFER_PARAMETERS
*in_params
,
374 UINT32 out_params_count
,
375 const XAPO_PROCESS_BUFFER_PARAMETERS
*out_params
, BOOL enabled
)
377 ReverbImpl
*This
= ReverbImpl_from_IXAPO(iface
);
378 TRACE("%p, %u, %p, %u, %p, %u\n", This
, in_params_count
, in_params
,
379 out_params_count
, out_params
, enabled
);
382 static UINT32 WINAPI
RVBXAPO_CalcInputFrames(IXAPO
*iface
, UINT32 output_frames
)
384 ReverbImpl
*This
= ReverbImpl_from_IXAPO(iface
);
385 TRACE("%p, %u\n", This
, output_frames
);
389 static UINT32 WINAPI
RVBXAPO_CalcOutputFrames(IXAPO
*iface
, UINT32 input_frames
)
391 ReverbImpl
*This
= ReverbImpl_from_IXAPO(iface
);
392 TRACE("%p, %u\n", This
, input_frames
);
396 static const IXAPOVtbl RVBXAPO_Vtbl
= {
397 RVBXAPO_QueryInterface
,
400 RVBXAPO_GetRegistrationProperties
,
401 RVBXAPO_IsInputFormatSupported
,
402 RVBXAPO_IsOutputFormatSupported
,
405 RVBXAPO_LockForProcess
,
406 RVBXAPO_UnlockForProcess
,
408 RVBXAPO_CalcInputFrames
,
409 RVBXAPO_CalcOutputFrames
412 static HRESULT WINAPI
RVBXAPOParams_QueryInterface(IXAPOParameters
*iface
,
413 REFIID riid
, void **ppvObject
)
415 ReverbImpl
*This
= ReverbImpl_from_IXAPOParameters(iface
);
416 return RVBXAPO_QueryInterface(&This
->IXAPO_iface
, riid
, ppvObject
);
419 static ULONG WINAPI
RVBXAPOParams_AddRef(IXAPOParameters
*iface
)
421 ReverbImpl
*This
= ReverbImpl_from_IXAPOParameters(iface
);
422 return RVBXAPO_AddRef(&This
->IXAPO_iface
);
425 static ULONG WINAPI
RVBXAPOParams_Release(IXAPOParameters
*iface
)
427 ReverbImpl
*This
= ReverbImpl_from_IXAPOParameters(iface
);
428 return RVBXAPO_Release(&This
->IXAPO_iface
);
431 static void WINAPI
RVBXAPOParams_SetParameters(IXAPOParameters
*iface
,
432 const void *params
, UINT32 params_len
)
434 ReverbImpl
*This
= ReverbImpl_from_IXAPOParameters(iface
);
435 TRACE("%p, %p, %u\n", This
, params
, params_len
);
438 static void WINAPI
RVBXAPOParams_GetParameters(IXAPOParameters
*iface
, void *params
,
441 ReverbImpl
*This
= ReverbImpl_from_IXAPOParameters(iface
);
442 TRACE("%p, %p, %u\n", This
, params
, params_len
);
445 static const IXAPOParametersVtbl RVBXAPOParameters_Vtbl
= {
446 RVBXAPOParams_QueryInterface
,
447 RVBXAPOParams_AddRef
,
448 RVBXAPOParams_Release
,
449 RVBXAPOParams_SetParameters
,
450 RVBXAPOParams_GetParameters
453 typedef struct _EQImpl
{
455 IXAPOParameters IXAPOParameters_iface
;
460 static EQImpl
*EQImpl_from_IXAPO(IXAPO
*iface
)
462 return CONTAINING_RECORD(iface
, EQImpl
, IXAPO_iface
);
465 static EQImpl
*EQImpl_from_IXAPOParameters(IXAPOParameters
*iface
)
467 return CONTAINING_RECORD(iface
, EQImpl
, IXAPOParameters_iface
);
470 static HRESULT WINAPI
EQXAPO_QueryInterface(IXAPO
*iface
, REFIID riid
, void **ppvObject
)
472 EQImpl
*This
= EQImpl_from_IXAPO(iface
);
474 TRACE("%p, %s, %p\n", This
, wine_dbgstr_guid(riid
), ppvObject
);
476 if(IsEqualGUID(riid
, &IID_IUnknown
) ||
477 IsEqualGUID(riid
, &IID_IXAPO
) ||
478 IsEqualGUID(riid
, &IID_IXAPO27
))
479 *ppvObject
= &This
->IXAPO_iface
;
480 else if(IsEqualGUID(riid
, &IID_IXAPOParameters
))
481 *ppvObject
= &This
->IXAPOParameters_iface
;
486 IUnknown_AddRef((IUnknown
*)*ppvObject
);
490 return E_NOINTERFACE
;
493 static ULONG WINAPI
EQXAPO_AddRef(IXAPO
*iface
)
495 EQImpl
*This
= EQImpl_from_IXAPO(iface
);
496 ULONG ref
= InterlockedIncrement(&This
->ref
);
497 TRACE("(%p)->(): Refcount now %u\n", This
, ref
);
501 static ULONG WINAPI
EQXAPO_Release(IXAPO
*iface
)
503 EQImpl
*This
= EQImpl_from_IXAPO(iface
);
504 ULONG ref
= InterlockedDecrement(&This
->ref
);
506 TRACE("(%p)->(): Refcount now %u\n", This
, ref
);
509 HeapFree(GetProcessHeap(), 0, This
);
514 static HRESULT WINAPI
EQXAPO_GetRegistrationProperties(IXAPO
*iface
,
515 XAPO_REGISTRATION_PROPERTIES
**props
)
517 EQImpl
*This
= EQImpl_from_IXAPO(iface
);
518 TRACE("%p, %p\n", This
, props
);
519 /* TODO: check for version == 20 and use XAPO20_REGISTRATION_PROPERTIES */
523 static HRESULT WINAPI
EQXAPO_IsInputFormatSupported(IXAPO
*iface
,
524 const WAVEFORMATEX
*output_fmt
, const WAVEFORMATEX
*input_fmt
,
525 WAVEFORMATEX
**supported_fmt
)
527 EQImpl
*This
= EQImpl_from_IXAPO(iface
);
528 TRACE("%p, %p, %p, %p\n", This
, output_fmt
, input_fmt
, supported_fmt
);
532 static HRESULT WINAPI
EQXAPO_IsOutputFormatSupported(IXAPO
*iface
,
533 const WAVEFORMATEX
*input_fmt
, const WAVEFORMATEX
*output_fmt
,
534 WAVEFORMATEX
**supported_fmt
)
536 EQImpl
*This
= EQImpl_from_IXAPO(iface
);
537 TRACE("%p, %p, %p, %p\n", This
, input_fmt
, output_fmt
, supported_fmt
);
541 static HRESULT WINAPI
EQXAPO_Initialize(IXAPO
*iface
, const void *data
,
544 EQImpl
*This
= EQImpl_from_IXAPO(iface
);
545 TRACE("%p, %p, %u\n", This
, data
, data_len
);
549 static void WINAPI
EQXAPO_Reset(IXAPO
*iface
)
551 EQImpl
*This
= EQImpl_from_IXAPO(iface
);
555 static HRESULT WINAPI
EQXAPO_LockForProcess(IXAPO
*iface
, UINT32 in_params_count
,
556 const XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS
*in_params
,
557 UINT32 out_params_count
,
558 const XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS
*out_params
)
560 EQImpl
*This
= EQImpl_from_IXAPO(iface
);
561 TRACE("%p, %u, %p, %u, %p\n", This
, in_params_count
, in_params
,
562 out_params_count
, out_params
);
566 static void WINAPI
EQXAPO_UnlockForProcess(IXAPO
*iface
)
568 EQImpl
*This
= EQImpl_from_IXAPO(iface
);
572 static void WINAPI
EQXAPO_Process(IXAPO
*iface
, UINT32 in_params_count
,
573 const XAPO_PROCESS_BUFFER_PARAMETERS
*in_params
,
574 UINT32 out_params_count
,
575 const XAPO_PROCESS_BUFFER_PARAMETERS
*out_params
, BOOL enabled
)
577 EQImpl
*This
= EQImpl_from_IXAPO(iface
);
578 TRACE("%p, %u, %p, %u, %p, %u\n", This
, in_params_count
, in_params
,
579 out_params_count
, out_params
, enabled
);
582 static UINT32 WINAPI
EQXAPO_CalcInputFrames(IXAPO
*iface
, UINT32 output_frames
)
584 EQImpl
*This
= EQImpl_from_IXAPO(iface
);
585 TRACE("%p, %u\n", This
, output_frames
);
589 static UINT32 WINAPI
EQXAPO_CalcOutputFrames(IXAPO
*iface
, UINT32 input_frames
)
591 EQImpl
*This
= EQImpl_from_IXAPO(iface
);
592 TRACE("%p, %u\n", This
, input_frames
);
596 static const IXAPOVtbl EQXAPO_Vtbl
= {
597 EQXAPO_QueryInterface
,
600 EQXAPO_GetRegistrationProperties
,
601 EQXAPO_IsInputFormatSupported
,
602 EQXAPO_IsOutputFormatSupported
,
605 EQXAPO_LockForProcess
,
606 EQXAPO_UnlockForProcess
,
608 EQXAPO_CalcInputFrames
,
609 EQXAPO_CalcOutputFrames
612 static HRESULT WINAPI
EQXAPOParams_QueryInterface(IXAPOParameters
*iface
,
613 REFIID riid
, void **ppvObject
)
615 EQImpl
*This
= EQImpl_from_IXAPOParameters(iface
);
616 return EQXAPO_QueryInterface(&This
->IXAPO_iface
, riid
, ppvObject
);
619 static ULONG WINAPI
EQXAPOParams_AddRef(IXAPOParameters
*iface
)
621 EQImpl
*This
= EQImpl_from_IXAPOParameters(iface
);
622 return EQXAPO_AddRef(&This
->IXAPO_iface
);
625 static ULONG WINAPI
EQXAPOParams_Release(IXAPOParameters
*iface
)
627 EQImpl
*This
= EQImpl_from_IXAPOParameters(iface
);
628 return EQXAPO_Release(&This
->IXAPO_iface
);
631 static void WINAPI
EQXAPOParams_SetParameters(IXAPOParameters
*iface
,
632 const void *params
, UINT32 params_len
)
634 EQImpl
*This
= EQImpl_from_IXAPOParameters(iface
);
635 TRACE("%p, %p, %u\n", This
, params
, params_len
);
638 static void WINAPI
EQXAPOParams_GetParameters(IXAPOParameters
*iface
, void *params
,
641 EQImpl
*This
= EQImpl_from_IXAPOParameters(iface
);
642 TRACE("%p, %p, %u\n", This
, params
, params_len
);
645 static const IXAPOParametersVtbl EQXAPOParameters_Vtbl
= {
646 EQXAPOParams_QueryInterface
,
648 EQXAPOParams_Release
,
649 EQXAPOParams_SetParameters
,
650 EQXAPOParams_GetParameters
654 IClassFactory IClassFactory_iface
;
659 static struct xapo_cf
*xapo_impl_from_IClassFactory(IClassFactory
*iface
)
661 return CONTAINING_RECORD(iface
, struct xapo_cf
, IClassFactory_iface
);
664 static HRESULT WINAPI
xapocf_QueryInterface(IClassFactory
*iface
, REFIID riid
, void **ppobj
)
666 if(IsEqualGUID(riid
, &IID_IUnknown
)
667 || IsEqualGUID(riid
, &IID_IClassFactory
))
669 IClassFactory_AddRef(iface
);
675 WARN("(%p)->(%s, %p): interface not found\n", iface
, debugstr_guid(riid
), ppobj
);
676 return E_NOINTERFACE
;
679 static ULONG WINAPI
xapocf_AddRef(IClassFactory
*iface
)
681 struct xapo_cf
*This
= xapo_impl_from_IClassFactory(iface
);
682 ULONG ref
= InterlockedIncrement(&This
->ref
);
683 TRACE("(%p)->(): Refcount now %u\n", This
, ref
);
687 static ULONG WINAPI
xapocf_Release(IClassFactory
*iface
)
689 struct xapo_cf
*This
= xapo_impl_from_IClassFactory(iface
);
690 ULONG ref
= InterlockedDecrement(&This
->ref
);
691 TRACE("(%p)->(): Refcount now %u\n", This
, ref
);
693 HeapFree(GetProcessHeap(), 0, This
);
697 static HRESULT WINAPI
xapocf_CreateInstance(IClassFactory
*iface
, IUnknown
*pOuter
,
698 REFIID riid
, void **ppobj
)
700 struct xapo_cf
*This
= xapo_impl_from_IClassFactory(iface
);
703 TRACE("(%p)->(%p,%s,%p)\n", This
, pOuter
, debugstr_guid(riid
), ppobj
);
708 return CLASS_E_NOAGGREGATION
;
710 if(IsEqualGUID(This
->class, &CLSID_AudioVolumeMeter27
)){
713 object
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(*object
));
715 return E_OUTOFMEMORY
;
717 object
->IXAPO_iface
.lpVtbl
= &VUMXAPO_Vtbl
;
718 object
->IXAPOParameters_iface
.lpVtbl
= &VUMXAPOParameters_Vtbl
;
720 hr
= IXAPO_QueryInterface(&object
->IXAPO_iface
, riid
, ppobj
);
722 HeapFree(GetProcessHeap(), 0, object
);
725 }else if(IsEqualGUID(This
->class, &CLSID_FXReverb
)){
728 object
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(*object
));
730 return E_OUTOFMEMORY
;
732 object
->IXAPO_iface
.lpVtbl
= &RVBXAPO_Vtbl
;
733 object
->IXAPOParameters_iface
.lpVtbl
= &RVBXAPOParameters_Vtbl
;
735 hr
= IXAPO_QueryInterface(&object
->IXAPO_iface
, riid
, ppobj
);
737 HeapFree(GetProcessHeap(), 0, object
);
740 }else if(IsEqualGUID(This
->class, &CLSID_FXEQ
)){
743 object
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(*object
));
745 return E_OUTOFMEMORY
;
747 object
->IXAPO_iface
.lpVtbl
= &EQXAPO_Vtbl
;
748 object
->IXAPOParameters_iface
.lpVtbl
= &EQXAPOParameters_Vtbl
;
750 hr
= IXAPO_QueryInterface(&object
->IXAPO_iface
, riid
, ppobj
);
752 HeapFree(GetProcessHeap(), 0, object
);
756 /* TODO FXECHO, FXMasteringLimiter, */
762 static HRESULT WINAPI
xapocf_LockServer(IClassFactory
*iface
, BOOL dolock
)
764 struct xapo_cf
*This
= xapo_impl_from_IClassFactory(iface
);
765 FIXME("(%p)->(%d): stub!\n", This
, dolock
);
769 static const IClassFactoryVtbl xapo_Vtbl
=
771 xapocf_QueryInterface
,
774 xapocf_CreateInstance
,
778 HRESULT
make_xapo_factory(REFCLSID clsid
, REFIID riid
, void **ppv
)
781 struct xapo_cf
*ret
= HeapAlloc(GetProcessHeap(), 0, sizeof(struct xapo_cf
));
782 ret
->IClassFactory_iface
.lpVtbl
= &xapo_Vtbl
;
785 hr
= IClassFactory_QueryInterface(&ret
->IClassFactory_iface
, riid
, ppv
);
787 HeapFree(GetProcessHeap(), 0, ret
);
792 HRESULT WINAPI
CreateAudioVolumeMeter(IUnknown
**out
)
797 hr
= make_xapo_factory(&CLSID_AudioVolumeMeter27
, &IID_IClassFactory
, (void**)&cf
);
801 hr
= IClassFactory_CreateInstance(cf
, NULL
, &IID_IUnknown
, (void**)out
);
803 IClassFactory_Release(cf
);
808 HRESULT WINAPI
CreateAudioReverb(IUnknown
**out
)
813 hr
= make_xapo_factory(&CLSID_FXReverb
, &IID_IClassFactory
, (void**)&cf
);
817 hr
= IClassFactory_CreateInstance(cf
, NULL
, &IID_IUnknown
, (void**)out
);
819 IClassFactory_Release(cf
);
824 HRESULT CDECL
CreateFX(REFCLSID clsid
, IUnknown
**out
, void *initdata
, UINT32 initdata_bytes
)
828 const GUID
*class = NULL
;
833 if(IsEqualGUID(clsid
, &CLSID_FXReverb27
) ||
834 IsEqualGUID(clsid
, &CLSID_FXReverb
))
835 class = &CLSID_FXReverb
;
836 else if(IsEqualGUID(clsid
, &CLSID_FXEQ27
) ||
837 IsEqualGUID(clsid
, &CLSID_FXEQ
))
841 hr
= make_xapo_factory(class, &IID_IClassFactory
, (void**)&cf
);
845 hr
= IClassFactory_CreateInstance(cf
, NULL
, &IID_IUnknown
, (void**)&obj
);
846 IClassFactory_Release(cf
);
850 hr
= CoCreateInstance(clsid
, NULL
, CLSCTX_INPROC_SERVER
, &IID_IUnknown
, (void**)&obj
);
852 WARN("CoCreateInstance failed: %08x\n", hr
);
857 if(initdata
&& initdata_bytes
> 0){
860 hr
= IUnknown_QueryInterface(obj
, &IID_IXAPO
, (void**)&xapo
);
862 hr
= IXAPO_Initialize(xapo
, initdata
, initdata_bytes
);
867 WARN("Initialize failed: %08x\n", hr
);
868 IUnknown_Release(obj
);
878 #endif /* XAUDIO2_VER >= 8 */
881 HRESULT CDECL
CreateFX(REFCLSID clsid
, IUnknown
**out
)
885 const GUID
*class = NULL
;
888 TRACE("%s %p\n", debugstr_guid(clsid
), out
);
892 if(IsEqualGUID(clsid
, &CLSID_FXReverb27
) ||
893 IsEqualGUID(clsid
, &CLSID_FXReverb
))
894 class = &CLSID_FXReverb
;
895 else if(IsEqualGUID(clsid
, &CLSID_FXEQ27
) ||
896 IsEqualGUID(clsid
, &CLSID_FXEQ
))
898 /* TODO FXECHO, FXMasteringLimiter, */
901 hr
= make_xapo_factory(class, &IID_IClassFactory
, (void**)&cf
);
905 hr
= IClassFactory_CreateInstance(cf
, NULL
, &IID_IUnknown
, (void**)&obj
);
906 IClassFactory_Release(cf
);
910 hr
= CoCreateInstance(clsid
, NULL
, CLSCTX_INPROC_SERVER
, &IID_IUnknown
, (void**)&obj
);
912 WARN("CoCreateInstance failed: %08x\n", hr
);
921 #endif /* XAPOFX1_VER */