/*** Autogenerated by WIDL 6.2 from include/xaudio2.idl - Do not edit ***/

#ifdef _WIN32
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif
#include <rpc.h>
#include <rpcndr.h>
#endif

#ifndef COM_NO_WINDOWS_H
#include <windows.h>
#include <ole2.h>
#endif

#ifndef __xaudio2_h__
#define __xaudio2_h__

/* Forward declarations */

#ifndef __XAudio20_FWD_DEFINED__
#define __XAudio20_FWD_DEFINED__
#ifdef __cplusplus
typedef class XAudio20 XAudio20;
#else
typedef struct XAudio20 XAudio20;
#endif /* defined __cplusplus */
#endif /* defined __XAudio20_FWD_DEFINED__ */

#ifndef __XAudio21_FWD_DEFINED__
#define __XAudio21_FWD_DEFINED__
#ifdef __cplusplus
typedef class XAudio21 XAudio21;
#else
typedef struct XAudio21 XAudio21;
#endif /* defined __cplusplus */
#endif /* defined __XAudio21_FWD_DEFINED__ */

#ifndef __XAudio22_FWD_DEFINED__
#define __XAudio22_FWD_DEFINED__
#ifdef __cplusplus
typedef class XAudio22 XAudio22;
#else
typedef struct XAudio22 XAudio22;
#endif /* defined __cplusplus */
#endif /* defined __XAudio22_FWD_DEFINED__ */

#ifndef __XAudio23_FWD_DEFINED__
#define __XAudio23_FWD_DEFINED__
#ifdef __cplusplus
typedef class XAudio23 XAudio23;
#else
typedef struct XAudio23 XAudio23;
#endif /* defined __cplusplus */
#endif /* defined __XAudio23_FWD_DEFINED__ */

#ifndef __XAudio24_FWD_DEFINED__
#define __XAudio24_FWD_DEFINED__
#ifdef __cplusplus
typedef class XAudio24 XAudio24;
#else
typedef struct XAudio24 XAudio24;
#endif /* defined __cplusplus */
#endif /* defined __XAudio24_FWD_DEFINED__ */

#ifndef __XAudio25_FWD_DEFINED__
#define __XAudio25_FWD_DEFINED__
#ifdef __cplusplus
typedef class XAudio25 XAudio25;
#else
typedef struct XAudio25 XAudio25;
#endif /* defined __cplusplus */
#endif /* defined __XAudio25_FWD_DEFINED__ */

#ifndef __XAudio26_FWD_DEFINED__
#define __XAudio26_FWD_DEFINED__
#ifdef __cplusplus
typedef class XAudio26 XAudio26;
#else
typedef struct XAudio26 XAudio26;
#endif /* defined __cplusplus */
#endif /* defined __XAudio26_FWD_DEFINED__ */

#ifndef __XAudio27_FWD_DEFINED__
#define __XAudio27_FWD_DEFINED__
#ifdef __cplusplus
typedef class XAudio27 XAudio27;
#else
typedef struct XAudio27 XAudio27;
#endif /* defined __cplusplus */
#endif /* defined __XAudio27_FWD_DEFINED__ */

#ifndef __XAudio2Debug_FWD_DEFINED__
#define __XAudio2Debug_FWD_DEFINED__
#ifdef __cplusplus
typedef class XAudio2Debug XAudio2Debug;
#else
typedef struct XAudio2Debug XAudio2Debug;
#endif /* defined __cplusplus */
#endif /* defined __XAudio2Debug_FWD_DEFINED__ */

#ifndef __IXAudio2EngineCallback_FWD_DEFINED__
#define __IXAudio2EngineCallback_FWD_DEFINED__
typedef interface IXAudio2EngineCallback IXAudio2EngineCallback;
#ifdef __cplusplus
interface IXAudio2EngineCallback;
#endif /* __cplusplus */
#endif

#ifndef __IXAudio20Voice_FWD_DEFINED__
#define __IXAudio20Voice_FWD_DEFINED__
typedef interface IXAudio20Voice IXAudio20Voice;
#ifdef __cplusplus
interface IXAudio20Voice;
#endif /* __cplusplus */
#endif

#ifndef __IXAudio23Voice_FWD_DEFINED__
#define __IXAudio23Voice_FWD_DEFINED__
typedef interface IXAudio23Voice IXAudio23Voice;
#ifdef __cplusplus
interface IXAudio23Voice;
#endif /* __cplusplus */
#endif

#ifndef __IXAudio27Voice_FWD_DEFINED__
#define __IXAudio27Voice_FWD_DEFINED__
typedef interface IXAudio27Voice IXAudio27Voice;
#ifdef __cplusplus
interface IXAudio27Voice;
#endif /* __cplusplus */
#endif

#ifndef __IXAudio2Voice_FWD_DEFINED__
#define __IXAudio2Voice_FWD_DEFINED__
typedef interface IXAudio2Voice IXAudio2Voice;
#ifdef __cplusplus
interface IXAudio2Voice;
#endif /* __cplusplus */
#endif

#ifndef __IXAudio20SourceVoice_FWD_DEFINED__
#define __IXAudio20SourceVoice_FWD_DEFINED__
typedef interface IXAudio20SourceVoice IXAudio20SourceVoice;
#ifdef __cplusplus
interface IXAudio20SourceVoice;
#endif /* __cplusplus */
#endif

#ifndef __IXAudio23SourceVoice_FWD_DEFINED__
#define __IXAudio23SourceVoice_FWD_DEFINED__
typedef interface IXAudio23SourceVoice IXAudio23SourceVoice;
#ifdef __cplusplus
interface IXAudio23SourceVoice;
#endif /* __cplusplus */
#endif

#ifndef __IXAudio27SourceVoice_FWD_DEFINED__
#define __IXAudio27SourceVoice_FWD_DEFINED__
typedef interface IXAudio27SourceVoice IXAudio27SourceVoice;
#ifdef __cplusplus
interface IXAudio27SourceVoice;
#endif /* __cplusplus */
#endif

#ifndef __IXAudio2SourceVoice_FWD_DEFINED__
#define __IXAudio2SourceVoice_FWD_DEFINED__
typedef interface IXAudio2SourceVoice IXAudio2SourceVoice;
#ifdef __cplusplus
interface IXAudio2SourceVoice;
#endif /* __cplusplus */
#endif

#ifndef __IXAudio20SubmixVoice_FWD_DEFINED__
#define __IXAudio20SubmixVoice_FWD_DEFINED__
typedef interface IXAudio20SubmixVoice IXAudio20SubmixVoice;
#ifdef __cplusplus
interface IXAudio20SubmixVoice;
#endif /* __cplusplus */
#endif

#ifndef __IXAudio23SubmixVoice_FWD_DEFINED__
#define __IXAudio23SubmixVoice_FWD_DEFINED__
typedef interface IXAudio23SubmixVoice IXAudio23SubmixVoice;
#ifdef __cplusplus
interface IXAudio23SubmixVoice;
#endif /* __cplusplus */
#endif

#ifndef __IXAudio27SubmixVoice_FWD_DEFINED__
#define __IXAudio27SubmixVoice_FWD_DEFINED__
typedef interface IXAudio27SubmixVoice IXAudio27SubmixVoice;
#ifdef __cplusplus
interface IXAudio27SubmixVoice;
#endif /* __cplusplus */
#endif

#ifndef __IXAudio2SubmixVoice_FWD_DEFINED__
#define __IXAudio2SubmixVoice_FWD_DEFINED__
typedef interface IXAudio2SubmixVoice IXAudio2SubmixVoice;
#ifdef __cplusplus
interface IXAudio2SubmixVoice;
#endif /* __cplusplus */
#endif

#ifndef __IXAudio20MasteringVoice_FWD_DEFINED__
#define __IXAudio20MasteringVoice_FWD_DEFINED__
typedef interface IXAudio20MasteringVoice IXAudio20MasteringVoice;
#ifdef __cplusplus
interface IXAudio20MasteringVoice;
#endif /* __cplusplus */
#endif

#ifndef __IXAudio23MasteringVoice_FWD_DEFINED__
#define __IXAudio23MasteringVoice_FWD_DEFINED__
typedef interface IXAudio23MasteringVoice IXAudio23MasteringVoice;
#ifdef __cplusplus
interface IXAudio23MasteringVoice;
#endif /* __cplusplus */
#endif

#ifndef __IXAudio27MasteringVoice_FWD_DEFINED__
#define __IXAudio27MasteringVoice_FWD_DEFINED__
typedef interface IXAudio27MasteringVoice IXAudio27MasteringVoice;
#ifdef __cplusplus
interface IXAudio27MasteringVoice;
#endif /* __cplusplus */
#endif

#ifndef __IXAudio2MasteringVoice_FWD_DEFINED__
#define __IXAudio2MasteringVoice_FWD_DEFINED__
typedef interface IXAudio2MasteringVoice IXAudio2MasteringVoice;
#ifdef __cplusplus
interface IXAudio2MasteringVoice;
#endif /* __cplusplus */
#endif

#ifndef __IXAudio20VoiceCallback_FWD_DEFINED__
#define __IXAudio20VoiceCallback_FWD_DEFINED__
typedef interface IXAudio20VoiceCallback IXAudio20VoiceCallback;
#ifdef __cplusplus
interface IXAudio20VoiceCallback;
#endif /* __cplusplus */
#endif

#ifndef __IXAudio2VoiceCallback_FWD_DEFINED__
#define __IXAudio2VoiceCallback_FWD_DEFINED__
typedef interface IXAudio2VoiceCallback IXAudio2VoiceCallback;
#ifdef __cplusplus
interface IXAudio2VoiceCallback;
#endif /* __cplusplus */
#endif

#ifndef __IXAudio20_FWD_DEFINED__
#define __IXAudio20_FWD_DEFINED__
typedef interface IXAudio20 IXAudio20;
#ifdef __cplusplus
interface IXAudio20;
#endif /* __cplusplus */
#endif

#ifndef __IXAudio22_FWD_DEFINED__
#define __IXAudio22_FWD_DEFINED__
typedef interface IXAudio22 IXAudio22;
#ifdef __cplusplus
interface IXAudio22;
#endif /* __cplusplus */
#endif

#ifndef __IXAudio23_FWD_DEFINED__
#define __IXAudio23_FWD_DEFINED__
typedef interface IXAudio23 IXAudio23;
#ifdef __cplusplus
interface IXAudio23;
#endif /* __cplusplus */
#endif

#ifndef __IXAudio27_FWD_DEFINED__
#define __IXAudio27_FWD_DEFINED__
typedef interface IXAudio27 IXAudio27;
#ifdef __cplusplus
interface IXAudio27;
#endif /* __cplusplus */
#endif

#ifndef __IXAudio2_FWD_DEFINED__
#define __IXAudio2_FWD_DEFINED__
typedef interface IXAudio2 IXAudio2;
#ifdef __cplusplus
interface IXAudio2;
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <unknwn.h>
#include <mmdeviceapi.h>
#include <audiosessiontypes.h>

#ifdef __cplusplus
extern "C" {
#endif

#include <pshpack1.h>
/*****************************************************************************
 * XAudio20 coclass
 */

DEFINE_GUID(CLSID_XAudio20, 0xfac23f48, 0x31f5, 0x45a8, 0xb4,0x9b, 0x52,0x25,0xd6,0x14,0x01,0xaa);

#ifdef __cplusplus
class DECLSPEC_UUID("fac23f48-31f5-45a8-b49b-5225d61401aa") XAudio20;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(XAudio20, 0xfac23f48, 0x31f5, 0x45a8, 0xb4,0x9b, 0x52,0x25,0xd6,0x14,0x01,0xaa)
#endif
#endif

/*****************************************************************************
 * XAudio21 coclass
 */

DEFINE_GUID(CLSID_XAudio21, 0xe21a7345, 0xeb21, 0x468e, 0xbe,0x50, 0x80,0x4d,0xb9,0x7c,0xf7,0x08);

#ifdef __cplusplus
class DECLSPEC_UUID("e21a7345-eb21-468e-be50-804db97cf708") XAudio21;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(XAudio21, 0xe21a7345, 0xeb21, 0x468e, 0xbe,0x50, 0x80,0x4d,0xb9,0x7c,0xf7,0x08)
#endif
#endif

/*****************************************************************************
 * XAudio22 coclass
 */

DEFINE_GUID(CLSID_XAudio22, 0xb802058a, 0x464a, 0x42db, 0xbc,0x10, 0xb6,0x50,0xd6,0xf2,0x58,0x6a);

#ifdef __cplusplus
class DECLSPEC_UUID("b802058a-464a-42db-bc10-b650d6f2586a") XAudio22;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(XAudio22, 0xb802058a, 0x464a, 0x42db, 0xbc,0x10, 0xb6,0x50,0xd6,0xf2,0x58,0x6a)
#endif
#endif

/*****************************************************************************
 * XAudio23 coclass
 */

DEFINE_GUID(CLSID_XAudio23, 0x4c5e637a, 0x16c7, 0x4de3, 0x9c,0x46, 0x5e,0xd2,0x21,0x81,0x96,0x2d);

#ifdef __cplusplus
class DECLSPEC_UUID("4c5e637a-16c7-4de3-9c46-5ed22181962d") XAudio23;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(XAudio23, 0x4c5e637a, 0x16c7, 0x4de3, 0x9c,0x46, 0x5e,0xd2,0x21,0x81,0x96,0x2d)
#endif
#endif

/*****************************************************************************
 * XAudio24 coclass
 */

DEFINE_GUID(CLSID_XAudio24, 0x03219e78, 0x5bc3, 0x44d1, 0xb9,0x2e, 0xf6,0x3d,0x89,0xcc,0x65,0x26);

#ifdef __cplusplus
class DECLSPEC_UUID("03219e78-5bc3-44d1-b92e-f63d89cc6526") XAudio24;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(XAudio24, 0x03219e78, 0x5bc3, 0x44d1, 0xb9,0x2e, 0xf6,0x3d,0x89,0xcc,0x65,0x26)
#endif
#endif

/*****************************************************************************
 * XAudio25 coclass
 */

DEFINE_GUID(CLSID_XAudio25, 0x4c9b6dde, 0x6809, 0x46e6, 0xa2,0x78, 0x9b,0x6a,0x97,0x58,0x86,0x70);

#ifdef __cplusplus
class DECLSPEC_UUID("4c9b6dde-6809-46e6-a278-9b6a97588670") XAudio25;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(XAudio25, 0x4c9b6dde, 0x6809, 0x46e6, 0xa2,0x78, 0x9b,0x6a,0x97,0x58,0x86,0x70)
#endif
#endif

/*****************************************************************************
 * XAudio26 coclass
 */

DEFINE_GUID(CLSID_XAudio26, 0x3eda9b49, 0x2085, 0x498b, 0x9b,0xb2, 0x39,0xa6,0x77,0x84,0x93,0xde);

#ifdef __cplusplus
class DECLSPEC_UUID("3eda9b49-2085-498b-9bb2-39a6778493de") XAudio26;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(XAudio26, 0x3eda9b49, 0x2085, 0x498b, 0x9b,0xb2, 0x39,0xa6,0x77,0x84,0x93,0xde)
#endif
#endif

/*****************************************************************************
 * XAudio27 coclass
 */

DEFINE_GUID(CLSID_XAudio27, 0x5a508685, 0xa254, 0x4fba, 0x9b,0x82, 0x9a,0x24,0xb0,0x03,0x06,0xaf);

#ifdef __cplusplus
class DECLSPEC_UUID("5a508685-a254-4fba-9b82-9a24b00306af") XAudio27;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(XAudio27, 0x5a508685, 0xa254, 0x4fba, 0x9b,0x82, 0x9a,0x24,0xb0,0x03,0x06,0xaf)
#endif
#endif

/*****************************************************************************
 * XAudio2Debug coclass
 */

DEFINE_GUID(CLSID_XAudio2Debug, 0xdb05ea35, 0x0329, 0x4d4b, 0xa5,0x3a, 0x6d,0xea,0xd0,0x3d,0x38,0x52);

#ifdef __cplusplus
class DECLSPEC_UUID("db05ea35-0329-4d4b-a53a-6dead03d3852") XAudio2Debug;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(XAudio2Debug, 0xdb05ea35, 0x0329, 0x4d4b, 0xa5,0x3a, 0x6d,0xea,0xd0,0x3d,0x38,0x52)
#endif
#endif

#if 0
typedef struct WAVEFORMATEX {
    WORD wFormatTag;
    WORD nChannels;
    DWORD nSamplesPerSec;
    DWORD nAvgBytesPerSec;
    WORD nBlockAlign;
    WORD wBitsPerSample;
    WORD cbSize;
} WAVEFORMATEX;
typedef struct __WIDL_xaudio2_generated_name_00000020 {
    WAVEFORMATEX Format;
    union {
        WORD wValidBitsPerSample;
        WORD wSamplesPerBlock;
        WORD wReserved;
    } Samples;
    DWORD dwChannelMask;
    GUID SubFormat;
} WAVEFORMATEXTENSIBLE;
typedef struct __WIDL_xaudio2_generated_name_00000020 *PWAVEFORMATEXTENSIBLE;
#else
#include <mmreg.h>
#endif
#ifndef __IXAudio2Voice_FWD_DEFINED__
#define __IXAudio2Voice_FWD_DEFINED__
typedef interface IXAudio2Voice IXAudio2Voice;
#ifdef __cplusplus
interface IXAudio2Voice;
#endif /* __cplusplus */
#endif

typedef enum XAUDIO2_WINDOWS_PROCESSOR_SPECIFIER {
    Processor1 = 0x1,
    Processor2 = 0x2,
    Processor3 = 0x4,
    Processor4 = 0x8,
    Processor5 = 0x10,
    Processor6 = 0x20,
    Processor7 = 0x40,
    Processor8 = 0x80,
    Processor9 = 0x100,
    Processor10 = 0x200,
    Processor11 = 0x400,
    Processor12 = 0x800,
    Processor13 = 0x1000,
    Processor14 = 0x2000,
    Processor15 = 0x4000,
    Processor16 = 0x8000,
    Processor17 = 0x10000,
    Processor18 = 0x20000,
    Processor19 = 0x40000,
    Processor20 = 0x80000,
    Processor21 = 0x100000,
    Processor22 = 0x200000,
    Processor23 = 0x400000,
    Processor24 = 0x800000,
    Processor25 = 0x1000000,
    Processor26 = 0x2000000,
    Processor27 = 0x4000000,
    Processor28 = 0x8000000,
    Processor29 = 0x10000000,
    Processor30 = 0x20000000,
    Processor31 = 0x40000000,
    Processor32 = 0x80000000,
    XAUDIO2_ANY_PROCESSOR = 0xffffffff,
    XAUDIO2_DEFAULT_PROCESSOR = XAUDIO2_ANY_PROCESSOR
} XAUDIO2_WINDOWS_PROCESSOR_SPECIFIER;
typedef enum XAUDIO2_WINDOWS_PROCESSOR_SPECIFIER XAUDIO2_PROCESSOR;
typedef struct XAUDIO2_PERFORMANCE_DATA {
    UINT64 AudioCyclesSinceLastQuery;
    UINT64 TotalCyclesSinceLastQuery;
    UINT32 MinimumCyclesPerQuantum;
    UINT32 MaximumCyclesPerQuantum;
    UINT32 MemoryUsageInBytes;
    UINT32 CurrentLatencyInSamples;
    UINT32 GlitchesSinceEngineStarted;
    UINT32 ActiveSourceVoiceCount;
    UINT32 TotalSourceVoiceCount;
    UINT32 ActiveSubmixVoiceCount;
    UINT32 ActiveResamplerCount;
    UINT32 ActiveMatrixMixCount;
    UINT32 ActiveXmaSourceVoices;
    UINT32 ActiveXmaStreams;
} XAUDIO2_PERFORMANCE_DATA;
typedef struct XAUDIO22_PERFORMANCE_DATA {
    UINT64 AudioCyclesSinceLastQuery;
    UINT64 TotalCyclesSinceLastQuery;
    UINT32 MinimumCyclesPerQuantum;
    UINT32 MaximumCyclesPerQuantum;
    UINT32 MemoryUsageInBytes;
    UINT32 CurrentLatencyInSamples;
    UINT32 GlitchesSinceEngineStarted;
    UINT32 ActiveSourceVoiceCount;
    UINT32 TotalSourceVoiceCount;
    UINT32 ActiveSubmixVoiceCount;
    UINT32 TotalSubmixVoiceCount;
    UINT32 ActiveXmaSourceVoices;
    UINT32 ActiveXmaStreams;
} XAUDIO22_PERFORMANCE_DATA;
typedef struct XAUDIO20_PERFORMANCE_DATA {
    UINT64 AudioCyclesSinceLastQuery;
    UINT64 TotalCyclesSinceLastQuery;
    UINT32 MinimumCyclesPerQuantum;
    UINT32 MaximumCyclesPerQuantum;
    UINT32 MemoryUsageInBytes;
    UINT32 CurrentLatencyInSamples;
    UINT32 GlitchesSinceLastQuery;
    UINT32 ActiveSourceVoiceCount;
    UINT32 TotalSourceVoiceCount;
    UINT32 ActiveSubmixVoiceCount;
    UINT32 TotalSubmixVoiceCount;
    UINT32 ActiveXmaSourceVoices;
    UINT32 ActiveXmaStreams;
} XAUDIO20_PERFORMANCE_DATA;
typedef enum XAUDIO2_DEVICE_ROLE {
    NotDefaultDevice = 0x0,
    DefaultConsoleDevice = 0x1,
    DefaultMultimediaDevice = 0x2,
    DefaultCommunicationsDevice = 0x4,
    DefaultGameDevice = 0x8,
    GlobalDefaultDevice = 0xf,
    InvalidDeviceRole = ~GlobalDefaultDevice
} XAUDIO2_DEVICE_ROLE;
typedef struct XAUDIO2_DEVICE_DETAILS {
    WCHAR DeviceID[256];
    WCHAR DisplayName[256];
    XAUDIO2_DEVICE_ROLE Role;
    WAVEFORMATEXTENSIBLE OutputFormat;
} XAUDIO2_DEVICE_DETAILS;
typedef struct XAUDIO27_VOICE_DETAILS {
    UINT32 CreationFlags;
    UINT32 InputChannels;
    UINT32 InputSampleRate;
} XAUDIO27_VOICE_DETAILS;
typedef struct XAUDIO2_VOICE_DETAILS {
    UINT32 CreationFlags;
    UINT32 ActiveFlags;
    UINT32 InputChannels;
    UINT32 InputSampleRate;
} XAUDIO2_VOICE_DETAILS;
typedef struct XAUDIO2_SEND_DESCRIPTOR {
    UINT32 Flags;
    IXAudio2Voice *pOutputVoice;
} XAUDIO2_SEND_DESCRIPTOR;
typedef struct XAUDIO23_VOICE_SENDS {
    UINT32 OutputCount;
    IXAudio2Voice **pOutputVoices;
} XAUDIO23_VOICE_SENDS;
typedef struct XAUDIO2_VOICE_SENDS {
    UINT32 SendCount;
    XAUDIO2_SEND_DESCRIPTOR *pSends;
} XAUDIO2_VOICE_SENDS;
typedef struct XAUDIO2_EFFECT_DESCRIPTOR {
    IUnknown *pEffect;
    WINBOOL InitialState;
    UINT32 OutputChannels;
} XAUDIO2_EFFECT_DESCRIPTOR;
typedef struct XAUDIO2_EFFECT_CHAIN {
    UINT32 EffectCount;
    XAUDIO2_EFFECT_DESCRIPTOR *pEffectDescriptors;
} XAUDIO2_EFFECT_CHAIN;
#define XAUDIO2_MAX_BUFFER_BYTES (0x80000000)

#define XAUDIO2_MAX_QUEUED_BUFFERS (64)

#define XAUDIO2_MAX_BUFFERS_SYSTEM (2)

#define XAUDIO2_MAX_AUDIO_CHANNELS (64)

#define XAUDIO2_MIN_SAMPLE_RATE (1000)

#define XAUDIO2_MAX_SAMPLE_RATE (200000)

#define XAUDIO2_MAX_VOLUME_LEVEL (16777216.0000000)

#define XAUDIO2_MIN_FREQ_RATIO (1 / 1024.00000000000)

#define XAUDIO2_MAX_FREQ_RATIO (1024.00000000000)

#define XAUDIO2_DEFAULT_FREQ_RATIO (2.00000000000000)

#define XAUDIO2_MAX_FILTER_ONEOVERQ (1.50000000000000)

#define XAUDIO2_MAX_FILTER_FREQUENCY (1.00000000000000)

#define XAUDIO2_MAX_LOOP_COUNT (254)

#define XAUDIO20_MAX_LOOP_COUNT (0x100000)

#define XAUDIO2_COMMIT_NOW (0)

#define XAUDIO2_COMMIT_ALL (0)

#define XAUDIO2_INVALID_OPSET (0xffffffff)

#define XAUDIO2_NO_LOOP_REGION (0)

#define XAUDIO2_LOOP_INFINITE (255)

#define XAUDIO20_LOOP_INFINITE ((UINT)-1)

#define XAUDIO2_DEFAULT_CHANNELS (0)

#define XAUDIO2_DEFAULT_SAMPLERATE (0)

/*****************************************************************************
 * IXAudio2EngineCallback interface
 */
#ifndef __IXAudio2EngineCallback_INTERFACE_DEFINED__
#define __IXAudio2EngineCallback_INTERFACE_DEFINED__

#if defined(__cplusplus) && !defined(CINTERFACE)
interface IXAudio2EngineCallback
{

    BEGIN_INTERFACE

    virtual void STDMETHODCALLTYPE OnProcessingPassStart(
        ) = 0;

    virtual void STDMETHODCALLTYPE OnProcessingPassEnd(
        ) = 0;

    virtual void STDMETHODCALLTYPE OnCriticalError(
        HRESULT Error) = 0;

    END_INTERFACE

};
#else
typedef struct IXAudio2EngineCallbackVtbl {
    BEGIN_INTERFACE

    /*** IXAudio2EngineCallback methods ***/
    void (STDMETHODCALLTYPE *OnProcessingPassStart)(
        IXAudio2EngineCallback *This);

    void (STDMETHODCALLTYPE *OnProcessingPassEnd)(
        IXAudio2EngineCallback *This);

    void (STDMETHODCALLTYPE *OnCriticalError)(
        IXAudio2EngineCallback *This,
        HRESULT Error);

    END_INTERFACE
} IXAudio2EngineCallbackVtbl;

interface IXAudio2EngineCallback {
    CONST_VTBL IXAudio2EngineCallbackVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IXAudio2EngineCallback methods ***/
#define IXAudio2EngineCallback_OnProcessingPassStart(This) (This)->lpVtbl->OnProcessingPassStart(This)
#define IXAudio2EngineCallback_OnProcessingPassEnd(This) (This)->lpVtbl->OnProcessingPassEnd(This)
#define IXAudio2EngineCallback_OnCriticalError(This,Error) (This)->lpVtbl->OnCriticalError(This,Error)
#else
/*** IXAudio2EngineCallback methods ***/
static FORCEINLINE void IXAudio2EngineCallback_OnProcessingPassStart(IXAudio2EngineCallback* This) {
    This->lpVtbl->OnProcessingPassStart(This);
}
static FORCEINLINE void IXAudio2EngineCallback_OnProcessingPassEnd(IXAudio2EngineCallback* This) {
    This->lpVtbl->OnProcessingPassEnd(This);
}
static FORCEINLINE void IXAudio2EngineCallback_OnCriticalError(IXAudio2EngineCallback* This,HRESULT Error) {
    This->lpVtbl->OnCriticalError(This,Error);
}
#endif
#endif

#endif


#endif  /* __IXAudio2EngineCallback_INTERFACE_DEFINED__ */

typedef enum XAUDIO2_FILTER_TYPE {
    LowPassFilter = 0,
    BandPassFilter = 1,
    HighPassFilter = 2,
    NotchFilter = 3
} XAUDIO2_FILTER_TYPE;
typedef struct XAUDIO2_FILTER_PARAMETERS {
    XAUDIO2_FILTER_TYPE Type;
    float Frequency;
    float OneOverQ;
} XAUDIO2_FILTER_PARAMETERS;
/*****************************************************************************
 * IXAudio20Voice interface
 */
#ifndef __IXAudio20Voice_INTERFACE_DEFINED__
#define __IXAudio20Voice_INTERFACE_DEFINED__

#if defined(__cplusplus) && !defined(CINTERFACE)
interface IXAudio20Voice
{

    BEGIN_INTERFACE

    virtual void STDMETHODCALLTYPE GetVoiceDetails(
        XAUDIO27_VOICE_DETAILS *pVoiceDetails) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetOutputVoices(
        const XAUDIO23_VOICE_SENDS *pSendList) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetEffectChain(
        const XAUDIO2_EFFECT_CHAIN *pEffectChain) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnableEffect(
        UINT32 EffectIndex,
        UINT32 OperationSet = XAUDIO2_COMMIT_NOW) = 0;

    virtual HRESULT STDMETHODCALLTYPE DisableEffect(
        UINT32 EffectIndex,
        UINT32 OperationSet = XAUDIO2_COMMIT_NOW) = 0;

    virtual void STDMETHODCALLTYPE GetEffectState(
        UINT32 EffectIndex,
        WINBOOL *pEnabled) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetEffectParameters(
        UINT32 EffectIndex,
        const void *pParameters,
        UINT32 ParametersByteSize,
        UINT32 OperationSet = XAUDIO2_COMMIT_NOW) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEffectParameters(
        UINT32 EffectIndex,
        void *pParameters,
        UINT32 ParametersByteSize) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFilterParameters(
        const XAUDIO2_FILTER_PARAMETERS *pParameters,
        UINT32 OperationSet = XAUDIO2_COMMIT_NOW) = 0;

    virtual void STDMETHODCALLTYPE GetFilterParameters(
        XAUDIO2_FILTER_PARAMETERS *pParameters) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetVolume(
        float Volume,
        UINT32 OperationSet = XAUDIO2_COMMIT_NOW) = 0;

    virtual void STDMETHODCALLTYPE GetVolume(
        float *pVolume) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetChannelVolumes(
        UINT32 Channels,
        const float *pVolumes,
        UINT32 OperationSet = XAUDIO2_COMMIT_NOW) = 0;

    virtual void STDMETHODCALLTYPE GetChannelVolumes(
        UINT32 Channels,
        float *pVolumes) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetOutputMatrix(
        IXAudio2Voice *pDestinationVoice,
        UINT32 SourceChannels,
        UINT32 DestinationChannels,
        const float *pLevelMatrix,
        UINT32 OperationSet = XAUDIO2_COMMIT_NOW) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOutputMatrix(
        IXAudio2Voice *pDestinationVoice,
        UINT32 SourceChannels,
        UINT32 DestinationChannels,
        float *pLevelMatrix) = 0;

    virtual void STDMETHODCALLTYPE DestroyVoice(
        ) = 0;

    END_INTERFACE

};
#else
typedef struct IXAudio20VoiceVtbl {
    BEGIN_INTERFACE

    /*** IXAudio20Voice methods ***/
    void (STDMETHODCALLTYPE *GetVoiceDetails)(
        IXAudio20Voice *This,
        XAUDIO27_VOICE_DETAILS *pVoiceDetails);

    HRESULT (STDMETHODCALLTYPE *SetOutputVoices)(
        IXAudio20Voice *This,
        const XAUDIO23_VOICE_SENDS *pSendList);

    HRESULT (STDMETHODCALLTYPE *SetEffectChain)(
        IXAudio20Voice *This,
        const XAUDIO2_EFFECT_CHAIN *pEffectChain);

    HRESULT (STDMETHODCALLTYPE *EnableEffect)(
        IXAudio20Voice *This,
        UINT32 EffectIndex,
        UINT32 OperationSet);

    HRESULT (STDMETHODCALLTYPE *DisableEffect)(
        IXAudio20Voice *This,
        UINT32 EffectIndex,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetEffectState)(
        IXAudio20Voice *This,
        UINT32 EffectIndex,
        WINBOOL *pEnabled);

    HRESULT (STDMETHODCALLTYPE *SetEffectParameters)(
        IXAudio20Voice *This,
        UINT32 EffectIndex,
        const void *pParameters,
        UINT32 ParametersByteSize,
        UINT32 OperationSet);

    HRESULT (STDMETHODCALLTYPE *GetEffectParameters)(
        IXAudio20Voice *This,
        UINT32 EffectIndex,
        void *pParameters,
        UINT32 ParametersByteSize);

    HRESULT (STDMETHODCALLTYPE *SetFilterParameters)(
        IXAudio20Voice *This,
        const XAUDIO2_FILTER_PARAMETERS *pParameters,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetFilterParameters)(
        IXAudio20Voice *This,
        XAUDIO2_FILTER_PARAMETERS *pParameters);

    HRESULT (STDMETHODCALLTYPE *SetVolume)(
        IXAudio20Voice *This,
        float Volume,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetVolume)(
        IXAudio20Voice *This,
        float *pVolume);

    HRESULT (STDMETHODCALLTYPE *SetChannelVolumes)(
        IXAudio20Voice *This,
        UINT32 Channels,
        const float *pVolumes,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetChannelVolumes)(
        IXAudio20Voice *This,
        UINT32 Channels,
        float *pVolumes);

    HRESULT (STDMETHODCALLTYPE *SetOutputMatrix)(
        IXAudio20Voice *This,
        IXAudio2Voice *pDestinationVoice,
        UINT32 SourceChannels,
        UINT32 DestinationChannels,
        const float *pLevelMatrix,
        UINT32 OperationSet);

    HRESULT (STDMETHODCALLTYPE *GetOutputMatrix)(
        IXAudio20Voice *This,
        IXAudio2Voice *pDestinationVoice,
        UINT32 SourceChannels,
        UINT32 DestinationChannels,
        float *pLevelMatrix);

    void (STDMETHODCALLTYPE *DestroyVoice)(
        IXAudio20Voice *This);

    END_INTERFACE
} IXAudio20VoiceVtbl;

interface IXAudio20Voice {
    CONST_VTBL IXAudio20VoiceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IXAudio20Voice methods ***/
#define IXAudio20Voice_GetVoiceDetails(This,pVoiceDetails) (This)->lpVtbl->GetVoiceDetails(This,pVoiceDetails)
#define IXAudio20Voice_SetOutputVoices(This,pSendList) (This)->lpVtbl->SetOutputVoices(This,pSendList)
#define IXAudio20Voice_SetEffectChain(This,pEffectChain) (This)->lpVtbl->SetEffectChain(This,pEffectChain)
#define IXAudio20Voice_EnableEffect(This,EffectIndex,OperationSet) (This)->lpVtbl->EnableEffect(This,EffectIndex,OperationSet)
#define IXAudio20Voice_DisableEffect(This,EffectIndex,OperationSet) (This)->lpVtbl->DisableEffect(This,EffectIndex,OperationSet)
#define IXAudio20Voice_GetEffectState(This,EffectIndex,pEnabled) (This)->lpVtbl->GetEffectState(This,EffectIndex,pEnabled)
#define IXAudio20Voice_SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet) (This)->lpVtbl->SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet)
#define IXAudio20Voice_GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize) (This)->lpVtbl->GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize)
#define IXAudio20Voice_SetFilterParameters(This,pParameters,OperationSet) (This)->lpVtbl->SetFilterParameters(This,pParameters,OperationSet)
#define IXAudio20Voice_GetFilterParameters(This,pParameters) (This)->lpVtbl->GetFilterParameters(This,pParameters)
#define IXAudio20Voice_SetVolume(This,Volume,OperationSet) (This)->lpVtbl->SetVolume(This,Volume,OperationSet)
#define IXAudio20Voice_GetVolume(This,pVolume) (This)->lpVtbl->GetVolume(This,pVolume)
#define IXAudio20Voice_SetChannelVolumes(This,Channels,pVolumes,OperationSet) (This)->lpVtbl->SetChannelVolumes(This,Channels,pVolumes,OperationSet)
#define IXAudio20Voice_GetChannelVolumes(This,Channels,pVolumes) (This)->lpVtbl->GetChannelVolumes(This,Channels,pVolumes)
#define IXAudio20Voice_SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet) (This)->lpVtbl->SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet)
#define IXAudio20Voice_GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix) (This)->lpVtbl->GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix)
#define IXAudio20Voice_DestroyVoice(This) (This)->lpVtbl->DestroyVoice(This)
#else
/*** IXAudio20Voice methods ***/
static FORCEINLINE void IXAudio20Voice_GetVoiceDetails(IXAudio20Voice* This,XAUDIO27_VOICE_DETAILS *pVoiceDetails) {
    This->lpVtbl->GetVoiceDetails(This,pVoiceDetails);
}
static FORCEINLINE HRESULT IXAudio20Voice_SetOutputVoices(IXAudio20Voice* This,const XAUDIO23_VOICE_SENDS *pSendList) {
    return This->lpVtbl->SetOutputVoices(This,pSendList);
}
static FORCEINLINE HRESULT IXAudio20Voice_SetEffectChain(IXAudio20Voice* This,const XAUDIO2_EFFECT_CHAIN *pEffectChain) {
    return This->lpVtbl->SetEffectChain(This,pEffectChain);
}
static FORCEINLINE HRESULT IXAudio20Voice_EnableEffect(IXAudio20Voice* This,UINT32 EffectIndex,UINT32 OperationSet) {
    return This->lpVtbl->EnableEffect(This,EffectIndex,OperationSet);
}
static FORCEINLINE HRESULT IXAudio20Voice_DisableEffect(IXAudio20Voice* This,UINT32 EffectIndex,UINT32 OperationSet) {
    return This->lpVtbl->DisableEffect(This,EffectIndex,OperationSet);
}
static FORCEINLINE void IXAudio20Voice_GetEffectState(IXAudio20Voice* This,UINT32 EffectIndex,WINBOOL *pEnabled) {
    This->lpVtbl->GetEffectState(This,EffectIndex,pEnabled);
}
static FORCEINLINE HRESULT IXAudio20Voice_SetEffectParameters(IXAudio20Voice* This,UINT32 EffectIndex,const void *pParameters,UINT32 ParametersByteSize,UINT32 OperationSet) {
    return This->lpVtbl->SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet);
}
static FORCEINLINE HRESULT IXAudio20Voice_GetEffectParameters(IXAudio20Voice* This,UINT32 EffectIndex,void *pParameters,UINT32 ParametersByteSize) {
    return This->lpVtbl->GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize);
}
static FORCEINLINE HRESULT IXAudio20Voice_SetFilterParameters(IXAudio20Voice* This,const XAUDIO2_FILTER_PARAMETERS *pParameters,UINT32 OperationSet) {
    return This->lpVtbl->SetFilterParameters(This,pParameters,OperationSet);
}
static FORCEINLINE void IXAudio20Voice_GetFilterParameters(IXAudio20Voice* This,XAUDIO2_FILTER_PARAMETERS *pParameters) {
    This->lpVtbl->GetFilterParameters(This,pParameters);
}
static FORCEINLINE HRESULT IXAudio20Voice_SetVolume(IXAudio20Voice* This,float Volume,UINT32 OperationSet) {
    return This->lpVtbl->SetVolume(This,Volume,OperationSet);
}
static FORCEINLINE void IXAudio20Voice_GetVolume(IXAudio20Voice* This,float *pVolume) {
    This->lpVtbl->GetVolume(This,pVolume);
}
static FORCEINLINE HRESULT IXAudio20Voice_SetChannelVolumes(IXAudio20Voice* This,UINT32 Channels,const float *pVolumes,UINT32 OperationSet) {
    return This->lpVtbl->SetChannelVolumes(This,Channels,pVolumes,OperationSet);
}
static FORCEINLINE void IXAudio20Voice_GetChannelVolumes(IXAudio20Voice* This,UINT32 Channels,float *pVolumes) {
    This->lpVtbl->GetChannelVolumes(This,Channels,pVolumes);
}
static FORCEINLINE HRESULT IXAudio20Voice_SetOutputMatrix(IXAudio20Voice* This,IXAudio2Voice *pDestinationVoice,UINT32 SourceChannels,UINT32 DestinationChannels,const float *pLevelMatrix,UINT32 OperationSet) {
    return This->lpVtbl->SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet);
}
static FORCEINLINE HRESULT IXAudio20Voice_GetOutputMatrix(IXAudio20Voice* This,IXAudio2Voice *pDestinationVoice,UINT32 SourceChannels,UINT32 DestinationChannels,float *pLevelMatrix) {
    return This->lpVtbl->GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix);
}
static FORCEINLINE void IXAudio20Voice_DestroyVoice(IXAudio20Voice* This) {
    This->lpVtbl->DestroyVoice(This);
}
#endif
#endif

#endif


#endif  /* __IXAudio20Voice_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXAudio23Voice interface
 */
#ifndef __IXAudio23Voice_INTERFACE_DEFINED__
#define __IXAudio23Voice_INTERFACE_DEFINED__

#if defined(__cplusplus) && !defined(CINTERFACE)
interface IXAudio23Voice
{

    BEGIN_INTERFACE

    virtual void STDMETHODCALLTYPE GetVoiceDetails(
        XAUDIO27_VOICE_DETAILS *pVoiceDetails) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetOutputVoices(
        const XAUDIO23_VOICE_SENDS *pSendList) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetEffectChain(
        const XAUDIO2_EFFECT_CHAIN *pEffectChain) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnableEffect(
        UINT32 EffectIndex,
        UINT32 OperationSet = XAUDIO2_COMMIT_NOW) = 0;

    virtual HRESULT STDMETHODCALLTYPE DisableEffect(
        UINT32 EffectIndex,
        UINT32 OperationSet = XAUDIO2_COMMIT_NOW) = 0;

    virtual void STDMETHODCALLTYPE GetEffectState(
        UINT32 EffectIndex,
        WINBOOL *pEnabled) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetEffectParameters(
        UINT32 EffectIndex,
        const void *pParameters,
        UINT32 ParametersByteSize,
        UINT32 OperationSet = XAUDIO2_COMMIT_NOW) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEffectParameters(
        UINT32 EffectIndex,
        void *pParameters,
        UINT32 ParametersByteSize) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFilterParameters(
        const XAUDIO2_FILTER_PARAMETERS *pParameters,
        UINT32 OperationSet = XAUDIO2_COMMIT_NOW) = 0;

    virtual void STDMETHODCALLTYPE GetFilterParameters(
        XAUDIO2_FILTER_PARAMETERS *pParameters) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetVolume(
        float Volume,
        UINT32 OperationSet = XAUDIO2_COMMIT_NOW) = 0;

    virtual void STDMETHODCALLTYPE GetVolume(
        float *pVolume) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetChannelVolumes(
        UINT32 Channels,
        const float *pVolumes,
        UINT32 OperationSet = XAUDIO2_COMMIT_NOW) = 0;

    virtual void STDMETHODCALLTYPE GetChannelVolumes(
        UINT32 Channels,
        float *pVolumes) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetOutputMatrix(
        IXAudio2Voice *pDestinationVoice,
        UINT32 SourceChannels,
        UINT32 DestinationChannels,
        const float *pLevelMatrix,
        UINT32 OperationSet = XAUDIO2_COMMIT_NOW) = 0;

    virtual void STDMETHODCALLTYPE GetOutputMatrix(
        IXAudio2Voice *pDestinationVoice,
        UINT32 SourceChannels,
        UINT32 DestinationChannels,
        float *pLevelMatrix) = 0;

    virtual void STDMETHODCALLTYPE DestroyVoice(
        ) = 0;

    END_INTERFACE

};
#else
typedef struct IXAudio23VoiceVtbl {
    BEGIN_INTERFACE

    /*** IXAudio23Voice methods ***/
    void (STDMETHODCALLTYPE *GetVoiceDetails)(
        IXAudio23Voice *This,
        XAUDIO27_VOICE_DETAILS *pVoiceDetails);

    HRESULT (STDMETHODCALLTYPE *SetOutputVoices)(
        IXAudio23Voice *This,
        const XAUDIO23_VOICE_SENDS *pSendList);

    HRESULT (STDMETHODCALLTYPE *SetEffectChain)(
        IXAudio23Voice *This,
        const XAUDIO2_EFFECT_CHAIN *pEffectChain);

    HRESULT (STDMETHODCALLTYPE *EnableEffect)(
        IXAudio23Voice *This,
        UINT32 EffectIndex,
        UINT32 OperationSet);

    HRESULT (STDMETHODCALLTYPE *DisableEffect)(
        IXAudio23Voice *This,
        UINT32 EffectIndex,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetEffectState)(
        IXAudio23Voice *This,
        UINT32 EffectIndex,
        WINBOOL *pEnabled);

    HRESULT (STDMETHODCALLTYPE *SetEffectParameters)(
        IXAudio23Voice *This,
        UINT32 EffectIndex,
        const void *pParameters,
        UINT32 ParametersByteSize,
        UINT32 OperationSet);

    HRESULT (STDMETHODCALLTYPE *GetEffectParameters)(
        IXAudio23Voice *This,
        UINT32 EffectIndex,
        void *pParameters,
        UINT32 ParametersByteSize);

    HRESULT (STDMETHODCALLTYPE *SetFilterParameters)(
        IXAudio23Voice *This,
        const XAUDIO2_FILTER_PARAMETERS *pParameters,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetFilterParameters)(
        IXAudio23Voice *This,
        XAUDIO2_FILTER_PARAMETERS *pParameters);

    HRESULT (STDMETHODCALLTYPE *SetVolume)(
        IXAudio23Voice *This,
        float Volume,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetVolume)(
        IXAudio23Voice *This,
        float *pVolume);

    HRESULT (STDMETHODCALLTYPE *SetChannelVolumes)(
        IXAudio23Voice *This,
        UINT32 Channels,
        const float *pVolumes,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetChannelVolumes)(
        IXAudio23Voice *This,
        UINT32 Channels,
        float *pVolumes);

    HRESULT (STDMETHODCALLTYPE *SetOutputMatrix)(
        IXAudio23Voice *This,
        IXAudio2Voice *pDestinationVoice,
        UINT32 SourceChannels,
        UINT32 DestinationChannels,
        const float *pLevelMatrix,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetOutputMatrix)(
        IXAudio23Voice *This,
        IXAudio2Voice *pDestinationVoice,
        UINT32 SourceChannels,
        UINT32 DestinationChannels,
        float *pLevelMatrix);

    void (STDMETHODCALLTYPE *DestroyVoice)(
        IXAudio23Voice *This);

    END_INTERFACE
} IXAudio23VoiceVtbl;

interface IXAudio23Voice {
    CONST_VTBL IXAudio23VoiceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IXAudio23Voice methods ***/
#define IXAudio23Voice_GetVoiceDetails(This,pVoiceDetails) (This)->lpVtbl->GetVoiceDetails(This,pVoiceDetails)
#define IXAudio23Voice_SetOutputVoices(This,pSendList) (This)->lpVtbl->SetOutputVoices(This,pSendList)
#define IXAudio23Voice_SetEffectChain(This,pEffectChain) (This)->lpVtbl->SetEffectChain(This,pEffectChain)
#define IXAudio23Voice_EnableEffect(This,EffectIndex,OperationSet) (This)->lpVtbl->EnableEffect(This,EffectIndex,OperationSet)
#define IXAudio23Voice_DisableEffect(This,EffectIndex,OperationSet) (This)->lpVtbl->DisableEffect(This,EffectIndex,OperationSet)
#define IXAudio23Voice_GetEffectState(This,EffectIndex,pEnabled) (This)->lpVtbl->GetEffectState(This,EffectIndex,pEnabled)
#define IXAudio23Voice_SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet) (This)->lpVtbl->SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet)
#define IXAudio23Voice_GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize) (This)->lpVtbl->GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize)
#define IXAudio23Voice_SetFilterParameters(This,pParameters,OperationSet) (This)->lpVtbl->SetFilterParameters(This,pParameters,OperationSet)
#define IXAudio23Voice_GetFilterParameters(This,pParameters) (This)->lpVtbl->GetFilterParameters(This,pParameters)
#define IXAudio23Voice_SetVolume(This,Volume,OperationSet) (This)->lpVtbl->SetVolume(This,Volume,OperationSet)
#define IXAudio23Voice_GetVolume(This,pVolume) (This)->lpVtbl->GetVolume(This,pVolume)
#define IXAudio23Voice_SetChannelVolumes(This,Channels,pVolumes,OperationSet) (This)->lpVtbl->SetChannelVolumes(This,Channels,pVolumes,OperationSet)
#define IXAudio23Voice_GetChannelVolumes(This,Channels,pVolumes) (This)->lpVtbl->GetChannelVolumes(This,Channels,pVolumes)
#define IXAudio23Voice_SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet) (This)->lpVtbl->SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet)
#define IXAudio23Voice_GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix) (This)->lpVtbl->GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix)
#define IXAudio23Voice_DestroyVoice(This) (This)->lpVtbl->DestroyVoice(This)
#else
/*** IXAudio23Voice methods ***/
static FORCEINLINE void IXAudio23Voice_GetVoiceDetails(IXAudio23Voice* This,XAUDIO27_VOICE_DETAILS *pVoiceDetails) {
    This->lpVtbl->GetVoiceDetails(This,pVoiceDetails);
}
static FORCEINLINE HRESULT IXAudio23Voice_SetOutputVoices(IXAudio23Voice* This,const XAUDIO23_VOICE_SENDS *pSendList) {
    return This->lpVtbl->SetOutputVoices(This,pSendList);
}
static FORCEINLINE HRESULT IXAudio23Voice_SetEffectChain(IXAudio23Voice* This,const XAUDIO2_EFFECT_CHAIN *pEffectChain) {
    return This->lpVtbl->SetEffectChain(This,pEffectChain);
}
static FORCEINLINE HRESULT IXAudio23Voice_EnableEffect(IXAudio23Voice* This,UINT32 EffectIndex,UINT32 OperationSet) {
    return This->lpVtbl->EnableEffect(This,EffectIndex,OperationSet);
}
static FORCEINLINE HRESULT IXAudio23Voice_DisableEffect(IXAudio23Voice* This,UINT32 EffectIndex,UINT32 OperationSet) {
    return This->lpVtbl->DisableEffect(This,EffectIndex,OperationSet);
}
static FORCEINLINE void IXAudio23Voice_GetEffectState(IXAudio23Voice* This,UINT32 EffectIndex,WINBOOL *pEnabled) {
    This->lpVtbl->GetEffectState(This,EffectIndex,pEnabled);
}
static FORCEINLINE HRESULT IXAudio23Voice_SetEffectParameters(IXAudio23Voice* This,UINT32 EffectIndex,const void *pParameters,UINT32 ParametersByteSize,UINT32 OperationSet) {
    return This->lpVtbl->SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet);
}
static FORCEINLINE HRESULT IXAudio23Voice_GetEffectParameters(IXAudio23Voice* This,UINT32 EffectIndex,void *pParameters,UINT32 ParametersByteSize) {
    return This->lpVtbl->GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize);
}
static FORCEINLINE HRESULT IXAudio23Voice_SetFilterParameters(IXAudio23Voice* This,const XAUDIO2_FILTER_PARAMETERS *pParameters,UINT32 OperationSet) {
    return This->lpVtbl->SetFilterParameters(This,pParameters,OperationSet);
}
static FORCEINLINE void IXAudio23Voice_GetFilterParameters(IXAudio23Voice* This,XAUDIO2_FILTER_PARAMETERS *pParameters) {
    This->lpVtbl->GetFilterParameters(This,pParameters);
}
static FORCEINLINE HRESULT IXAudio23Voice_SetVolume(IXAudio23Voice* This,float Volume,UINT32 OperationSet) {
    return This->lpVtbl->SetVolume(This,Volume,OperationSet);
}
static FORCEINLINE void IXAudio23Voice_GetVolume(IXAudio23Voice* This,float *pVolume) {
    This->lpVtbl->GetVolume(This,pVolume);
}
static FORCEINLINE HRESULT IXAudio23Voice_SetChannelVolumes(IXAudio23Voice* This,UINT32 Channels,const float *pVolumes,UINT32 OperationSet) {
    return This->lpVtbl->SetChannelVolumes(This,Channels,pVolumes,OperationSet);
}
static FORCEINLINE void IXAudio23Voice_GetChannelVolumes(IXAudio23Voice* This,UINT32 Channels,float *pVolumes) {
    This->lpVtbl->GetChannelVolumes(This,Channels,pVolumes);
}
static FORCEINLINE HRESULT IXAudio23Voice_SetOutputMatrix(IXAudio23Voice* This,IXAudio2Voice *pDestinationVoice,UINT32 SourceChannels,UINT32 DestinationChannels,const float *pLevelMatrix,UINT32 OperationSet) {
    return This->lpVtbl->SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet);
}
static FORCEINLINE void IXAudio23Voice_GetOutputMatrix(IXAudio23Voice* This,IXAudio2Voice *pDestinationVoice,UINT32 SourceChannels,UINT32 DestinationChannels,float *pLevelMatrix) {
    This->lpVtbl->GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix);
}
static FORCEINLINE void IXAudio23Voice_DestroyVoice(IXAudio23Voice* This) {
    This->lpVtbl->DestroyVoice(This);
}
#endif
#endif

#endif


#endif  /* __IXAudio23Voice_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXAudio27Voice interface
 */
#ifndef __IXAudio27Voice_INTERFACE_DEFINED__
#define __IXAudio27Voice_INTERFACE_DEFINED__

#if defined(__cplusplus) && !defined(CINTERFACE)
interface IXAudio27Voice
{

    BEGIN_INTERFACE

    virtual void STDMETHODCALLTYPE GetVoiceDetails(
        XAUDIO27_VOICE_DETAILS *pVoiceDetails) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetOutputVoices(
        const XAUDIO2_VOICE_SENDS *pSendList) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetEffectChain(
        const XAUDIO2_EFFECT_CHAIN *pEffectChain) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnableEffect(
        UINT32 EffectIndex,
        UINT32 OperationSet = XAUDIO2_COMMIT_NOW) = 0;

    virtual HRESULT STDMETHODCALLTYPE DisableEffect(
        UINT32 EffectIndex,
        UINT32 OperationSet = XAUDIO2_COMMIT_NOW) = 0;

    virtual void STDMETHODCALLTYPE GetEffectState(
        UINT32 EffectIndex,
        WINBOOL *pEnabled) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetEffectParameters(
        UINT32 EffectIndex,
        const void *pParameters,
        UINT32 ParametersByteSize,
        UINT32 OperationSet = XAUDIO2_COMMIT_NOW) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEffectParameters(
        UINT32 EffectIndex,
        void *pParameters,
        UINT32 ParametersByteSize) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFilterParameters(
        const XAUDIO2_FILTER_PARAMETERS *pParameters,
        UINT32 OperationSet = XAUDIO2_COMMIT_NOW) = 0;

    virtual void STDMETHODCALLTYPE GetFilterParameters(
        XAUDIO2_FILTER_PARAMETERS *pParameters) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetOutputFilterParameters(
        IXAudio2Voice *pDestinationVoice,
        const XAUDIO2_FILTER_PARAMETERS *pParameters,
        UINT32 OperationSet = XAUDIO2_COMMIT_NOW) = 0;

    virtual void STDMETHODCALLTYPE GetOutputFilterParameters(
        IXAudio2Voice *pDestinationVoice,
        XAUDIO2_FILTER_PARAMETERS *pParameters) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetVolume(
        float Volume,
        UINT32 OperationSet = XAUDIO2_COMMIT_NOW) = 0;

    virtual void STDMETHODCALLTYPE GetVolume(
        float *pVolume) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetChannelVolumes(
        UINT32 Channels,
        const float *pVolumes,
        UINT32 OperationSet = XAUDIO2_COMMIT_NOW) = 0;

    virtual void STDMETHODCALLTYPE GetChannelVolumes(
        UINT32 Channels,
        float *pVolumes) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetOutputMatrix(
        IXAudio2Voice *pDestinationVoice,
        UINT32 SourceChannels,
        UINT32 DestinationChannels,
        const float *pLevelMatrix,
        UINT32 OperationSet = XAUDIO2_COMMIT_NOW) = 0;

    virtual void STDMETHODCALLTYPE GetOutputMatrix(
        IXAudio2Voice *pDestinationVoice,
        UINT32 SourceChannels,
        UINT32 DestinationChannels,
        float *pLevelMatrix) = 0;

    virtual void STDMETHODCALLTYPE DestroyVoice(
        ) = 0;

    END_INTERFACE

};
#else
typedef struct IXAudio27VoiceVtbl {
    BEGIN_INTERFACE

    /*** IXAudio27Voice methods ***/
    void (STDMETHODCALLTYPE *GetVoiceDetails)(
        IXAudio27Voice *This,
        XAUDIO27_VOICE_DETAILS *pVoiceDetails);

    HRESULT (STDMETHODCALLTYPE *SetOutputVoices)(
        IXAudio27Voice *This,
        const XAUDIO2_VOICE_SENDS *pSendList);

    HRESULT (STDMETHODCALLTYPE *SetEffectChain)(
        IXAudio27Voice *This,
        const XAUDIO2_EFFECT_CHAIN *pEffectChain);

    HRESULT (STDMETHODCALLTYPE *EnableEffect)(
        IXAudio27Voice *This,
        UINT32 EffectIndex,
        UINT32 OperationSet);

    HRESULT (STDMETHODCALLTYPE *DisableEffect)(
        IXAudio27Voice *This,
        UINT32 EffectIndex,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetEffectState)(
        IXAudio27Voice *This,
        UINT32 EffectIndex,
        WINBOOL *pEnabled);

    HRESULT (STDMETHODCALLTYPE *SetEffectParameters)(
        IXAudio27Voice *This,
        UINT32 EffectIndex,
        const void *pParameters,
        UINT32 ParametersByteSize,
        UINT32 OperationSet);

    HRESULT (STDMETHODCALLTYPE *GetEffectParameters)(
        IXAudio27Voice *This,
        UINT32 EffectIndex,
        void *pParameters,
        UINT32 ParametersByteSize);

    HRESULT (STDMETHODCALLTYPE *SetFilterParameters)(
        IXAudio27Voice *This,
        const XAUDIO2_FILTER_PARAMETERS *pParameters,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetFilterParameters)(
        IXAudio27Voice *This,
        XAUDIO2_FILTER_PARAMETERS *pParameters);

    HRESULT (STDMETHODCALLTYPE *SetOutputFilterParameters)(
        IXAudio27Voice *This,
        IXAudio2Voice *pDestinationVoice,
        const XAUDIO2_FILTER_PARAMETERS *pParameters,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetOutputFilterParameters)(
        IXAudio27Voice *This,
        IXAudio2Voice *pDestinationVoice,
        XAUDIO2_FILTER_PARAMETERS *pParameters);

    HRESULT (STDMETHODCALLTYPE *SetVolume)(
        IXAudio27Voice *This,
        float Volume,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetVolume)(
        IXAudio27Voice *This,
        float *pVolume);

    HRESULT (STDMETHODCALLTYPE *SetChannelVolumes)(
        IXAudio27Voice *This,
        UINT32 Channels,
        const float *pVolumes,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetChannelVolumes)(
        IXAudio27Voice *This,
        UINT32 Channels,
        float *pVolumes);

    HRESULT (STDMETHODCALLTYPE *SetOutputMatrix)(
        IXAudio27Voice *This,
        IXAudio2Voice *pDestinationVoice,
        UINT32 SourceChannels,
        UINT32 DestinationChannels,
        const float *pLevelMatrix,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetOutputMatrix)(
        IXAudio27Voice *This,
        IXAudio2Voice *pDestinationVoice,
        UINT32 SourceChannels,
        UINT32 DestinationChannels,
        float *pLevelMatrix);

    void (STDMETHODCALLTYPE *DestroyVoice)(
        IXAudio27Voice *This);

    END_INTERFACE
} IXAudio27VoiceVtbl;

interface IXAudio27Voice {
    CONST_VTBL IXAudio27VoiceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IXAudio27Voice methods ***/
#define IXAudio27Voice_GetVoiceDetails(This,pVoiceDetails) (This)->lpVtbl->GetVoiceDetails(This,pVoiceDetails)
#define IXAudio27Voice_SetOutputVoices(This,pSendList) (This)->lpVtbl->SetOutputVoices(This,pSendList)
#define IXAudio27Voice_SetEffectChain(This,pEffectChain) (This)->lpVtbl->SetEffectChain(This,pEffectChain)
#define IXAudio27Voice_EnableEffect(This,EffectIndex,OperationSet) (This)->lpVtbl->EnableEffect(This,EffectIndex,OperationSet)
#define IXAudio27Voice_DisableEffect(This,EffectIndex,OperationSet) (This)->lpVtbl->DisableEffect(This,EffectIndex,OperationSet)
#define IXAudio27Voice_GetEffectState(This,EffectIndex,pEnabled) (This)->lpVtbl->GetEffectState(This,EffectIndex,pEnabled)
#define IXAudio27Voice_SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet) (This)->lpVtbl->SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet)
#define IXAudio27Voice_GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize) (This)->lpVtbl->GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize)
#define IXAudio27Voice_SetFilterParameters(This,pParameters,OperationSet) (This)->lpVtbl->SetFilterParameters(This,pParameters,OperationSet)
#define IXAudio27Voice_GetFilterParameters(This,pParameters) (This)->lpVtbl->GetFilterParameters(This,pParameters)
#define IXAudio27Voice_SetOutputFilterParameters(This,pDestinationVoice,pParameters,OperationSet) (This)->lpVtbl->SetOutputFilterParameters(This,pDestinationVoice,pParameters,OperationSet)
#define IXAudio27Voice_GetOutputFilterParameters(This,pDestinationVoice,pParameters) (This)->lpVtbl->GetOutputFilterParameters(This,pDestinationVoice,pParameters)
#define IXAudio27Voice_SetVolume(This,Volume,OperationSet) (This)->lpVtbl->SetVolume(This,Volume,OperationSet)
#define IXAudio27Voice_GetVolume(This,pVolume) (This)->lpVtbl->GetVolume(This,pVolume)
#define IXAudio27Voice_SetChannelVolumes(This,Channels,pVolumes,OperationSet) (This)->lpVtbl->SetChannelVolumes(This,Channels,pVolumes,OperationSet)
#define IXAudio27Voice_GetChannelVolumes(This,Channels,pVolumes) (This)->lpVtbl->GetChannelVolumes(This,Channels,pVolumes)
#define IXAudio27Voice_SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet) (This)->lpVtbl->SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet)
#define IXAudio27Voice_GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix) (This)->lpVtbl->GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix)
#define IXAudio27Voice_DestroyVoice(This) (This)->lpVtbl->DestroyVoice(This)
#else
/*** IXAudio27Voice methods ***/
static FORCEINLINE void IXAudio27Voice_GetVoiceDetails(IXAudio27Voice* This,XAUDIO27_VOICE_DETAILS *pVoiceDetails) {
    This->lpVtbl->GetVoiceDetails(This,pVoiceDetails);
}
static FORCEINLINE HRESULT IXAudio27Voice_SetOutputVoices(IXAudio27Voice* This,const XAUDIO2_VOICE_SENDS *pSendList) {
    return This->lpVtbl->SetOutputVoices(This,pSendList);
}
static FORCEINLINE HRESULT IXAudio27Voice_SetEffectChain(IXAudio27Voice* This,const XAUDIO2_EFFECT_CHAIN *pEffectChain) {
    return This->lpVtbl->SetEffectChain(This,pEffectChain);
}
static FORCEINLINE HRESULT IXAudio27Voice_EnableEffect(IXAudio27Voice* This,UINT32 EffectIndex,UINT32 OperationSet) {
    return This->lpVtbl->EnableEffect(This,EffectIndex,OperationSet);
}
static FORCEINLINE HRESULT IXAudio27Voice_DisableEffect(IXAudio27Voice* This,UINT32 EffectIndex,UINT32 OperationSet) {
    return This->lpVtbl->DisableEffect(This,EffectIndex,OperationSet);
}
static FORCEINLINE void IXAudio27Voice_GetEffectState(IXAudio27Voice* This,UINT32 EffectIndex,WINBOOL *pEnabled) {
    This->lpVtbl->GetEffectState(This,EffectIndex,pEnabled);
}
static FORCEINLINE HRESULT IXAudio27Voice_SetEffectParameters(IXAudio27Voice* This,UINT32 EffectIndex,const void *pParameters,UINT32 ParametersByteSize,UINT32 OperationSet) {
    return This->lpVtbl->SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet);
}
static FORCEINLINE HRESULT IXAudio27Voice_GetEffectParameters(IXAudio27Voice* This,UINT32 EffectIndex,void *pParameters,UINT32 ParametersByteSize) {
    return This->lpVtbl->GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize);
}
static FORCEINLINE HRESULT IXAudio27Voice_SetFilterParameters(IXAudio27Voice* This,const XAUDIO2_FILTER_PARAMETERS *pParameters,UINT32 OperationSet) {
    return This->lpVtbl->SetFilterParameters(This,pParameters,OperationSet);
}
static FORCEINLINE void IXAudio27Voice_GetFilterParameters(IXAudio27Voice* This,XAUDIO2_FILTER_PARAMETERS *pParameters) {
    This->lpVtbl->GetFilterParameters(This,pParameters);
}
static FORCEINLINE HRESULT IXAudio27Voice_SetOutputFilterParameters(IXAudio27Voice* This,IXAudio2Voice *pDestinationVoice,const XAUDIO2_FILTER_PARAMETERS *pParameters,UINT32 OperationSet) {
    return This->lpVtbl->SetOutputFilterParameters(This,pDestinationVoice,pParameters,OperationSet);
}
static FORCEINLINE void IXAudio27Voice_GetOutputFilterParameters(IXAudio27Voice* This,IXAudio2Voice *pDestinationVoice,XAUDIO2_FILTER_PARAMETERS *pParameters) {
    This->lpVtbl->GetOutputFilterParameters(This,pDestinationVoice,pParameters);
}
static FORCEINLINE HRESULT IXAudio27Voice_SetVolume(IXAudio27Voice* This,float Volume,UINT32 OperationSet) {
    return This->lpVtbl->SetVolume(This,Volume,OperationSet);
}
static FORCEINLINE void IXAudio27Voice_GetVolume(IXAudio27Voice* This,float *pVolume) {
    This->lpVtbl->GetVolume(This,pVolume);
}
static FORCEINLINE HRESULT IXAudio27Voice_SetChannelVolumes(IXAudio27Voice* This,UINT32 Channels,const float *pVolumes,UINT32 OperationSet) {
    return This->lpVtbl->SetChannelVolumes(This,Channels,pVolumes,OperationSet);
}
static FORCEINLINE void IXAudio27Voice_GetChannelVolumes(IXAudio27Voice* This,UINT32 Channels,float *pVolumes) {
    This->lpVtbl->GetChannelVolumes(This,Channels,pVolumes);
}
static FORCEINLINE HRESULT IXAudio27Voice_SetOutputMatrix(IXAudio27Voice* This,IXAudio2Voice *pDestinationVoice,UINT32 SourceChannels,UINT32 DestinationChannels,const float *pLevelMatrix,UINT32 OperationSet) {
    return This->lpVtbl->SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet);
}
static FORCEINLINE void IXAudio27Voice_GetOutputMatrix(IXAudio27Voice* This,IXAudio2Voice *pDestinationVoice,UINT32 SourceChannels,UINT32 DestinationChannels,float *pLevelMatrix) {
    This->lpVtbl->GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix);
}
static FORCEINLINE void IXAudio27Voice_DestroyVoice(IXAudio27Voice* This) {
    This->lpVtbl->DestroyVoice(This);
}
#endif
#endif

#endif


#endif  /* __IXAudio27Voice_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXAudio2Voice interface
 */
#ifndef __IXAudio2Voice_INTERFACE_DEFINED__
#define __IXAudio2Voice_INTERFACE_DEFINED__

#if defined(__cplusplus) && !defined(CINTERFACE)
interface IXAudio2Voice
{

    BEGIN_INTERFACE

    virtual void STDMETHODCALLTYPE GetVoiceDetails(
        XAUDIO2_VOICE_DETAILS *pVoiceDetails) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetOutputVoices(
        const XAUDIO2_VOICE_SENDS *pSendList) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetEffectChain(
        const XAUDIO2_EFFECT_CHAIN *pEffectChain) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnableEffect(
        UINT32 EffectIndex,
        UINT32 OperationSet = XAUDIO2_COMMIT_NOW) = 0;

    virtual HRESULT STDMETHODCALLTYPE DisableEffect(
        UINT32 EffectIndex,
        UINT32 OperationSet = XAUDIO2_COMMIT_NOW) = 0;

    virtual void STDMETHODCALLTYPE GetEffectState(
        UINT32 EffectIndex,
        WINBOOL *pEnabled) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetEffectParameters(
        UINT32 EffectIndex,
        const void *pParameters,
        UINT32 ParametersByteSize,
        UINT32 OperationSet = XAUDIO2_COMMIT_NOW) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEffectParameters(
        UINT32 EffectIndex,
        void *pParameters,
        UINT32 ParametersByteSize) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFilterParameters(
        const XAUDIO2_FILTER_PARAMETERS *pParameters,
        UINT32 OperationSet = XAUDIO2_COMMIT_NOW) = 0;

    virtual void STDMETHODCALLTYPE GetFilterParameters(
        XAUDIO2_FILTER_PARAMETERS *pParameters) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetOutputFilterParameters(
        IXAudio2Voice *pDestinationVoice,
        const XAUDIO2_FILTER_PARAMETERS *pParameters,
        UINT32 OperationSet = XAUDIO2_COMMIT_NOW) = 0;

    virtual void STDMETHODCALLTYPE GetOutputFilterParameters(
        IXAudio2Voice *pDestinationVoice,
        XAUDIO2_FILTER_PARAMETERS *pParameters) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetVolume(
        float Volume,
        UINT32 OperationSet = XAUDIO2_COMMIT_NOW) = 0;

    virtual void STDMETHODCALLTYPE GetVolume(
        float *pVolume) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetChannelVolumes(
        UINT32 Channels,
        const float *pVolumes,
        UINT32 OperationSet = XAUDIO2_COMMIT_NOW) = 0;

    virtual void STDMETHODCALLTYPE GetChannelVolumes(
        UINT32 Channels,
        float *pVolumes) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetOutputMatrix(
        IXAudio2Voice *pDestinationVoice,
        UINT32 SourceChannels,
        UINT32 DestinationChannels,
        const float *pLevelMatrix,
        UINT32 OperationSet = XAUDIO2_COMMIT_NOW) = 0;

    virtual void STDMETHODCALLTYPE GetOutputMatrix(
        IXAudio2Voice *pDestinationVoice,
        UINT32 SourceChannels,
        UINT32 DestinationChannels,
        float *pLevelMatrix) = 0;

    virtual void STDMETHODCALLTYPE DestroyVoice(
        ) = 0;

    END_INTERFACE

};
#else
typedef struct IXAudio2VoiceVtbl {
    BEGIN_INTERFACE

    /*** IXAudio2Voice methods ***/
    void (STDMETHODCALLTYPE *GetVoiceDetails)(
        IXAudio2Voice *This,
        XAUDIO2_VOICE_DETAILS *pVoiceDetails);

    HRESULT (STDMETHODCALLTYPE *SetOutputVoices)(
        IXAudio2Voice *This,
        const XAUDIO2_VOICE_SENDS *pSendList);

    HRESULT (STDMETHODCALLTYPE *SetEffectChain)(
        IXAudio2Voice *This,
        const XAUDIO2_EFFECT_CHAIN *pEffectChain);

    HRESULT (STDMETHODCALLTYPE *EnableEffect)(
        IXAudio2Voice *This,
        UINT32 EffectIndex,
        UINT32 OperationSet);

    HRESULT (STDMETHODCALLTYPE *DisableEffect)(
        IXAudio2Voice *This,
        UINT32 EffectIndex,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetEffectState)(
        IXAudio2Voice *This,
        UINT32 EffectIndex,
        WINBOOL *pEnabled);

    HRESULT (STDMETHODCALLTYPE *SetEffectParameters)(
        IXAudio2Voice *This,
        UINT32 EffectIndex,
        const void *pParameters,
        UINT32 ParametersByteSize,
        UINT32 OperationSet);

    HRESULT (STDMETHODCALLTYPE *GetEffectParameters)(
        IXAudio2Voice *This,
        UINT32 EffectIndex,
        void *pParameters,
        UINT32 ParametersByteSize);

    HRESULT (STDMETHODCALLTYPE *SetFilterParameters)(
        IXAudio2Voice *This,
        const XAUDIO2_FILTER_PARAMETERS *pParameters,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetFilterParameters)(
        IXAudio2Voice *This,
        XAUDIO2_FILTER_PARAMETERS *pParameters);

    HRESULT (STDMETHODCALLTYPE *SetOutputFilterParameters)(
        IXAudio2Voice *This,
        IXAudio2Voice *pDestinationVoice,
        const XAUDIO2_FILTER_PARAMETERS *pParameters,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetOutputFilterParameters)(
        IXAudio2Voice *This,
        IXAudio2Voice *pDestinationVoice,
        XAUDIO2_FILTER_PARAMETERS *pParameters);

    HRESULT (STDMETHODCALLTYPE *SetVolume)(
        IXAudio2Voice *This,
        float Volume,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetVolume)(
        IXAudio2Voice *This,
        float *pVolume);

    HRESULT (STDMETHODCALLTYPE *SetChannelVolumes)(
        IXAudio2Voice *This,
        UINT32 Channels,
        const float *pVolumes,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetChannelVolumes)(
        IXAudio2Voice *This,
        UINT32 Channels,
        float *pVolumes);

    HRESULT (STDMETHODCALLTYPE *SetOutputMatrix)(
        IXAudio2Voice *This,
        IXAudio2Voice *pDestinationVoice,
        UINT32 SourceChannels,
        UINT32 DestinationChannels,
        const float *pLevelMatrix,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetOutputMatrix)(
        IXAudio2Voice *This,
        IXAudio2Voice *pDestinationVoice,
        UINT32 SourceChannels,
        UINT32 DestinationChannels,
        float *pLevelMatrix);

    void (STDMETHODCALLTYPE *DestroyVoice)(
        IXAudio2Voice *This);

    END_INTERFACE
} IXAudio2VoiceVtbl;

interface IXAudio2Voice {
    CONST_VTBL IXAudio2VoiceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IXAudio2Voice methods ***/
#define IXAudio2Voice_GetVoiceDetails(This,pVoiceDetails) (This)->lpVtbl->GetVoiceDetails(This,pVoiceDetails)
#define IXAudio2Voice_SetOutputVoices(This,pSendList) (This)->lpVtbl->SetOutputVoices(This,pSendList)
#define IXAudio2Voice_SetEffectChain(This,pEffectChain) (This)->lpVtbl->SetEffectChain(This,pEffectChain)
#define IXAudio2Voice_EnableEffect(This,EffectIndex,OperationSet) (This)->lpVtbl->EnableEffect(This,EffectIndex,OperationSet)
#define IXAudio2Voice_DisableEffect(This,EffectIndex,OperationSet) (This)->lpVtbl->DisableEffect(This,EffectIndex,OperationSet)
#define IXAudio2Voice_GetEffectState(This,EffectIndex,pEnabled) (This)->lpVtbl->GetEffectState(This,EffectIndex,pEnabled)
#define IXAudio2Voice_SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet) (This)->lpVtbl->SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet)
#define IXAudio2Voice_GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize) (This)->lpVtbl->GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize)
#define IXAudio2Voice_SetFilterParameters(This,pParameters,OperationSet) (This)->lpVtbl->SetFilterParameters(This,pParameters,OperationSet)
#define IXAudio2Voice_GetFilterParameters(This,pParameters) (This)->lpVtbl->GetFilterParameters(This,pParameters)
#define IXAudio2Voice_SetOutputFilterParameters(This,pDestinationVoice,pParameters,OperationSet) (This)->lpVtbl->SetOutputFilterParameters(This,pDestinationVoice,pParameters,OperationSet)
#define IXAudio2Voice_GetOutputFilterParameters(This,pDestinationVoice,pParameters) (This)->lpVtbl->GetOutputFilterParameters(This,pDestinationVoice,pParameters)
#define IXAudio2Voice_SetVolume(This,Volume,OperationSet) (This)->lpVtbl->SetVolume(This,Volume,OperationSet)
#define IXAudio2Voice_GetVolume(This,pVolume) (This)->lpVtbl->GetVolume(This,pVolume)
#define IXAudio2Voice_SetChannelVolumes(This,Channels,pVolumes,OperationSet) (This)->lpVtbl->SetChannelVolumes(This,Channels,pVolumes,OperationSet)
#define IXAudio2Voice_GetChannelVolumes(This,Channels,pVolumes) (This)->lpVtbl->GetChannelVolumes(This,Channels,pVolumes)
#define IXAudio2Voice_SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet) (This)->lpVtbl->SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet)
#define IXAudio2Voice_GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix) (This)->lpVtbl->GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix)
#define IXAudio2Voice_DestroyVoice(This) (This)->lpVtbl->DestroyVoice(This)
#else
/*** IXAudio2Voice methods ***/
static FORCEINLINE void IXAudio2Voice_GetVoiceDetails(IXAudio2Voice* This,XAUDIO2_VOICE_DETAILS *pVoiceDetails) {
    This->lpVtbl->GetVoiceDetails(This,pVoiceDetails);
}
static FORCEINLINE HRESULT IXAudio2Voice_SetOutputVoices(IXAudio2Voice* This,const XAUDIO2_VOICE_SENDS *pSendList) {
    return This->lpVtbl->SetOutputVoices(This,pSendList);
}
static FORCEINLINE HRESULT IXAudio2Voice_SetEffectChain(IXAudio2Voice* This,const XAUDIO2_EFFECT_CHAIN *pEffectChain) {
    return This->lpVtbl->SetEffectChain(This,pEffectChain);
}
static FORCEINLINE HRESULT IXAudio2Voice_EnableEffect(IXAudio2Voice* This,UINT32 EffectIndex,UINT32 OperationSet) {
    return This->lpVtbl->EnableEffect(This,EffectIndex,OperationSet);
}
static FORCEINLINE HRESULT IXAudio2Voice_DisableEffect(IXAudio2Voice* This,UINT32 EffectIndex,UINT32 OperationSet) {
    return This->lpVtbl->DisableEffect(This,EffectIndex,OperationSet);
}
static FORCEINLINE void IXAudio2Voice_GetEffectState(IXAudio2Voice* This,UINT32 EffectIndex,WINBOOL *pEnabled) {
    This->lpVtbl->GetEffectState(This,EffectIndex,pEnabled);
}
static FORCEINLINE HRESULT IXAudio2Voice_SetEffectParameters(IXAudio2Voice* This,UINT32 EffectIndex,const void *pParameters,UINT32 ParametersByteSize,UINT32 OperationSet) {
    return This->lpVtbl->SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet);
}
static FORCEINLINE HRESULT IXAudio2Voice_GetEffectParameters(IXAudio2Voice* This,UINT32 EffectIndex,void *pParameters,UINT32 ParametersByteSize) {
    return This->lpVtbl->GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize);
}
static FORCEINLINE HRESULT IXAudio2Voice_SetFilterParameters(IXAudio2Voice* This,const XAUDIO2_FILTER_PARAMETERS *pParameters,UINT32 OperationSet) {
    return This->lpVtbl->SetFilterParameters(This,pParameters,OperationSet);
}
static FORCEINLINE void IXAudio2Voice_GetFilterParameters(IXAudio2Voice* This,XAUDIO2_FILTER_PARAMETERS *pParameters) {
    This->lpVtbl->GetFilterParameters(This,pParameters);
}
static FORCEINLINE HRESULT IXAudio2Voice_SetOutputFilterParameters(IXAudio2Voice* This,IXAudio2Voice *pDestinationVoice,const XAUDIO2_FILTER_PARAMETERS *pParameters,UINT32 OperationSet) {
    return This->lpVtbl->SetOutputFilterParameters(This,pDestinationVoice,pParameters,OperationSet);
}
static FORCEINLINE void IXAudio2Voice_GetOutputFilterParameters(IXAudio2Voice* This,IXAudio2Voice *pDestinationVoice,XAUDIO2_FILTER_PARAMETERS *pParameters) {
    This->lpVtbl->GetOutputFilterParameters(This,pDestinationVoice,pParameters);
}
static FORCEINLINE HRESULT IXAudio2Voice_SetVolume(IXAudio2Voice* This,float Volume,UINT32 OperationSet) {
    return This->lpVtbl->SetVolume(This,Volume,OperationSet);
}
static FORCEINLINE void IXAudio2Voice_GetVolume(IXAudio2Voice* This,float *pVolume) {
    This->lpVtbl->GetVolume(This,pVolume);
}
static FORCEINLINE HRESULT IXAudio2Voice_SetChannelVolumes(IXAudio2Voice* This,UINT32 Channels,const float *pVolumes,UINT32 OperationSet) {
    return This->lpVtbl->SetChannelVolumes(This,Channels,pVolumes,OperationSet);
}
static FORCEINLINE void IXAudio2Voice_GetChannelVolumes(IXAudio2Voice* This,UINT32 Channels,float *pVolumes) {
    This->lpVtbl->GetChannelVolumes(This,Channels,pVolumes);
}
static FORCEINLINE HRESULT IXAudio2Voice_SetOutputMatrix(IXAudio2Voice* This,IXAudio2Voice *pDestinationVoice,UINT32 SourceChannels,UINT32 DestinationChannels,const float *pLevelMatrix,UINT32 OperationSet) {
    return This->lpVtbl->SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet);
}
static FORCEINLINE void IXAudio2Voice_GetOutputMatrix(IXAudio2Voice* This,IXAudio2Voice *pDestinationVoice,UINT32 SourceChannels,UINT32 DestinationChannels,float *pLevelMatrix) {
    This->lpVtbl->GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix);
}
static FORCEINLINE void IXAudio2Voice_DestroyVoice(IXAudio2Voice* This) {
    This->lpVtbl->DestroyVoice(This);
}
#endif
#endif

#endif


#endif  /* __IXAudio2Voice_INTERFACE_DEFINED__ */

typedef struct XAUDIO2_BUFFER {
    UINT32 Flags;
    UINT32 AudioBytes;
    const BYTE *pAudioData;
    UINT32 PlayBegin;
    UINT32 PlayLength;
    UINT32 LoopBegin;
    UINT32 LoopLength;
    UINT32 LoopCount;
    void *pContext;
} XAUDIO2_BUFFER;
typedef struct XAUDIO2_BUFFER_WMA {
    const UINT32 *pDecodedPacketCumulativeBytes;
    UINT32 PacketCount;
} XAUDIO2_BUFFER_WMA;
typedef struct XAUDIO2_VOICE_STATE {
    void *pCurrentBufferContext;
    UINT32 BuffersQueued;
    UINT64 SamplesPlayed;
} XAUDIO2_VOICE_STATE;
/*****************************************************************************
 * IXAudio20SourceVoice interface
 */
#ifndef __IXAudio20SourceVoice_INTERFACE_DEFINED__
#define __IXAudio20SourceVoice_INTERFACE_DEFINED__

#if defined(__cplusplus) && !defined(CINTERFACE)
interface IXAudio20SourceVoice : public IXAudio20Voice
{
    virtual HRESULT STDMETHODCALLTYPE Start(
        UINT32 Flags = 0,
        UINT32 OperationSet = XAUDIO2_COMMIT_NOW) = 0;

    virtual HRESULT STDMETHODCALLTYPE Stop(
        UINT32 Flags = 0,
        UINT32 OperationSet = XAUDIO2_COMMIT_NOW) = 0;

    virtual HRESULT STDMETHODCALLTYPE SubmitSourceBuffer(
        const XAUDIO2_BUFFER *pBuffer,
        const XAUDIO2_BUFFER_WMA *pBufferWMA = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE FlushSourceBuffers(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Discontinuity(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE ExitLoop(
        UINT32 OperationSet = XAUDIO2_COMMIT_NOW) = 0;

    virtual void STDMETHODCALLTYPE GetState(
        XAUDIO2_VOICE_STATE *pVoiceState) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFrequencyRatio(
        float Ratio,
        UINT32 OperationSet = XAUDIO2_COMMIT_NOW) = 0;

    virtual void STDMETHODCALLTYPE GetFrequencyRatio(
        float *pRatio) = 0;

};
#else
typedef struct IXAudio20SourceVoiceVtbl {
    BEGIN_INTERFACE

    /*** IXAudio20Voice methods ***/
    void (STDMETHODCALLTYPE *GetVoiceDetails)(
        IXAudio20SourceVoice *This,
        XAUDIO27_VOICE_DETAILS *pVoiceDetails);

    HRESULT (STDMETHODCALLTYPE *SetOutputVoices)(
        IXAudio20SourceVoice *This,
        const XAUDIO23_VOICE_SENDS *pSendList);

    HRESULT (STDMETHODCALLTYPE *SetEffectChain)(
        IXAudio20SourceVoice *This,
        const XAUDIO2_EFFECT_CHAIN *pEffectChain);

    HRESULT (STDMETHODCALLTYPE *EnableEffect)(
        IXAudio20SourceVoice *This,
        UINT32 EffectIndex,
        UINT32 OperationSet);

    HRESULT (STDMETHODCALLTYPE *DisableEffect)(
        IXAudio20SourceVoice *This,
        UINT32 EffectIndex,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetEffectState)(
        IXAudio20SourceVoice *This,
        UINT32 EffectIndex,
        WINBOOL *pEnabled);

    HRESULT (STDMETHODCALLTYPE *SetEffectParameters)(
        IXAudio20SourceVoice *This,
        UINT32 EffectIndex,
        const void *pParameters,
        UINT32 ParametersByteSize,
        UINT32 OperationSet);

    HRESULT (STDMETHODCALLTYPE *GetEffectParameters)(
        IXAudio20SourceVoice *This,
        UINT32 EffectIndex,
        void *pParameters,
        UINT32 ParametersByteSize);

    HRESULT (STDMETHODCALLTYPE *SetFilterParameters)(
        IXAudio20SourceVoice *This,
        const XAUDIO2_FILTER_PARAMETERS *pParameters,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetFilterParameters)(
        IXAudio20SourceVoice *This,
        XAUDIO2_FILTER_PARAMETERS *pParameters);

    HRESULT (STDMETHODCALLTYPE *SetVolume)(
        IXAudio20SourceVoice *This,
        float Volume,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetVolume)(
        IXAudio20SourceVoice *This,
        float *pVolume);

    HRESULT (STDMETHODCALLTYPE *SetChannelVolumes)(
        IXAudio20SourceVoice *This,
        UINT32 Channels,
        const float *pVolumes,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetChannelVolumes)(
        IXAudio20SourceVoice *This,
        UINT32 Channels,
        float *pVolumes);

    HRESULT (STDMETHODCALLTYPE *SetOutputMatrix)(
        IXAudio20SourceVoice *This,
        IXAudio2Voice *pDestinationVoice,
        UINT32 SourceChannels,
        UINT32 DestinationChannels,
        const float *pLevelMatrix,
        UINT32 OperationSet);

    HRESULT (STDMETHODCALLTYPE *GetOutputMatrix)(
        IXAudio20SourceVoice *This,
        IXAudio2Voice *pDestinationVoice,
        UINT32 SourceChannels,
        UINT32 DestinationChannels,
        float *pLevelMatrix);

    void (STDMETHODCALLTYPE *DestroyVoice)(
        IXAudio20SourceVoice *This);

    /*** IXAudio20SourceVoice methods ***/
    HRESULT (STDMETHODCALLTYPE *Start)(
        IXAudio20SourceVoice *This,
        UINT32 Flags,
        UINT32 OperationSet);

    HRESULT (STDMETHODCALLTYPE *Stop)(
        IXAudio20SourceVoice *This,
        UINT32 Flags,
        UINT32 OperationSet);

    HRESULT (STDMETHODCALLTYPE *SubmitSourceBuffer)(
        IXAudio20SourceVoice *This,
        const XAUDIO2_BUFFER *pBuffer,
        const XAUDIO2_BUFFER_WMA *pBufferWMA);

    HRESULT (STDMETHODCALLTYPE *FlushSourceBuffers)(
        IXAudio20SourceVoice *This);

    HRESULT (STDMETHODCALLTYPE *Discontinuity)(
        IXAudio20SourceVoice *This);

    HRESULT (STDMETHODCALLTYPE *ExitLoop)(
        IXAudio20SourceVoice *This,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetState)(
        IXAudio20SourceVoice *This,
        XAUDIO2_VOICE_STATE *pVoiceState);

    HRESULT (STDMETHODCALLTYPE *SetFrequencyRatio)(
        IXAudio20SourceVoice *This,
        float Ratio,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetFrequencyRatio)(
        IXAudio20SourceVoice *This,
        float *pRatio);

    END_INTERFACE
} IXAudio20SourceVoiceVtbl;

interface IXAudio20SourceVoice {
    CONST_VTBL IXAudio20SourceVoiceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IXAudio20Voice methods ***/
#define IXAudio20SourceVoice_GetVoiceDetails(This,pVoiceDetails) (This)->lpVtbl->GetVoiceDetails(This,pVoiceDetails)
#define IXAudio20SourceVoice_SetOutputVoices(This,pSendList) (This)->lpVtbl->SetOutputVoices(This,pSendList)
#define IXAudio20SourceVoice_SetEffectChain(This,pEffectChain) (This)->lpVtbl->SetEffectChain(This,pEffectChain)
#define IXAudio20SourceVoice_EnableEffect(This,EffectIndex,OperationSet) (This)->lpVtbl->EnableEffect(This,EffectIndex,OperationSet)
#define IXAudio20SourceVoice_DisableEffect(This,EffectIndex,OperationSet) (This)->lpVtbl->DisableEffect(This,EffectIndex,OperationSet)
#define IXAudio20SourceVoice_GetEffectState(This,EffectIndex,pEnabled) (This)->lpVtbl->GetEffectState(This,EffectIndex,pEnabled)
#define IXAudio20SourceVoice_SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet) (This)->lpVtbl->SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet)
#define IXAudio20SourceVoice_GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize) (This)->lpVtbl->GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize)
#define IXAudio20SourceVoice_SetFilterParameters(This,pParameters,OperationSet) (This)->lpVtbl->SetFilterParameters(This,pParameters,OperationSet)
#define IXAudio20SourceVoice_GetFilterParameters(This,pParameters) (This)->lpVtbl->GetFilterParameters(This,pParameters)
#define IXAudio20SourceVoice_SetVolume(This,Volume,OperationSet) (This)->lpVtbl->SetVolume(This,Volume,OperationSet)
#define IXAudio20SourceVoice_GetVolume(This,pVolume) (This)->lpVtbl->GetVolume(This,pVolume)
#define IXAudio20SourceVoice_SetChannelVolumes(This,Channels,pVolumes,OperationSet) (This)->lpVtbl->SetChannelVolumes(This,Channels,pVolumes,OperationSet)
#define IXAudio20SourceVoice_GetChannelVolumes(This,Channels,pVolumes) (This)->lpVtbl->GetChannelVolumes(This,Channels,pVolumes)
#define IXAudio20SourceVoice_SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet) (This)->lpVtbl->SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet)
#define IXAudio20SourceVoice_GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix) (This)->lpVtbl->GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix)
#define IXAudio20SourceVoice_DestroyVoice(This) (This)->lpVtbl->DestroyVoice(This)
/*** IXAudio20SourceVoice methods ***/
#define IXAudio20SourceVoice_Start(This,Flags,OperationSet) (This)->lpVtbl->Start(This,Flags,OperationSet)
#define IXAudio20SourceVoice_Stop(This,Flags,OperationSet) (This)->lpVtbl->Stop(This,Flags,OperationSet)
#define IXAudio20SourceVoice_SubmitSourceBuffer(This,pBuffer,pBufferWMA) (This)->lpVtbl->SubmitSourceBuffer(This,pBuffer,pBufferWMA)
#define IXAudio20SourceVoice_FlushSourceBuffers(This) (This)->lpVtbl->FlushSourceBuffers(This)
#define IXAudio20SourceVoice_Discontinuity(This) (This)->lpVtbl->Discontinuity(This)
#define IXAudio20SourceVoice_ExitLoop(This,OperationSet) (This)->lpVtbl->ExitLoop(This,OperationSet)
#define IXAudio20SourceVoice_GetState(This,pVoiceState) (This)->lpVtbl->GetState(This,pVoiceState)
#define IXAudio20SourceVoice_SetFrequencyRatio(This,Ratio,OperationSet) (This)->lpVtbl->SetFrequencyRatio(This,Ratio,OperationSet)
#define IXAudio20SourceVoice_GetFrequencyRatio(This,pRatio) (This)->lpVtbl->GetFrequencyRatio(This,pRatio)
#else
/*** IXAudio20Voice methods ***/
static FORCEINLINE void IXAudio20SourceVoice_GetVoiceDetails(IXAudio20SourceVoice* This,XAUDIO27_VOICE_DETAILS *pVoiceDetails) {
    This->lpVtbl->GetVoiceDetails(This,pVoiceDetails);
}
static FORCEINLINE HRESULT IXAudio20SourceVoice_SetOutputVoices(IXAudio20SourceVoice* This,const XAUDIO23_VOICE_SENDS *pSendList) {
    return This->lpVtbl->SetOutputVoices(This,pSendList);
}
static FORCEINLINE HRESULT IXAudio20SourceVoice_SetEffectChain(IXAudio20SourceVoice* This,const XAUDIO2_EFFECT_CHAIN *pEffectChain) {
    return This->lpVtbl->SetEffectChain(This,pEffectChain);
}
static FORCEINLINE HRESULT IXAudio20SourceVoice_EnableEffect(IXAudio20SourceVoice* This,UINT32 EffectIndex,UINT32 OperationSet) {
    return This->lpVtbl->EnableEffect(This,EffectIndex,OperationSet);
}
static FORCEINLINE HRESULT IXAudio20SourceVoice_DisableEffect(IXAudio20SourceVoice* This,UINT32 EffectIndex,UINT32 OperationSet) {
    return This->lpVtbl->DisableEffect(This,EffectIndex,OperationSet);
}
static FORCEINLINE void IXAudio20SourceVoice_GetEffectState(IXAudio20SourceVoice* This,UINT32 EffectIndex,WINBOOL *pEnabled) {
    This->lpVtbl->GetEffectState(This,EffectIndex,pEnabled);
}
static FORCEINLINE HRESULT IXAudio20SourceVoice_SetEffectParameters(IXAudio20SourceVoice* This,UINT32 EffectIndex,const void *pParameters,UINT32 ParametersByteSize,UINT32 OperationSet) {
    return This->lpVtbl->SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet);
}
static FORCEINLINE HRESULT IXAudio20SourceVoice_GetEffectParameters(IXAudio20SourceVoice* This,UINT32 EffectIndex,void *pParameters,UINT32 ParametersByteSize) {
    return This->lpVtbl->GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize);
}
static FORCEINLINE HRESULT IXAudio20SourceVoice_SetFilterParameters(IXAudio20SourceVoice* This,const XAUDIO2_FILTER_PARAMETERS *pParameters,UINT32 OperationSet) {
    return This->lpVtbl->SetFilterParameters(This,pParameters,OperationSet);
}
static FORCEINLINE void IXAudio20SourceVoice_GetFilterParameters(IXAudio20SourceVoice* This,XAUDIO2_FILTER_PARAMETERS *pParameters) {
    This->lpVtbl->GetFilterParameters(This,pParameters);
}
static FORCEINLINE HRESULT IXAudio20SourceVoice_SetVolume(IXAudio20SourceVoice* This,float Volume,UINT32 OperationSet) {
    return This->lpVtbl->SetVolume(This,Volume,OperationSet);
}
static FORCEINLINE void IXAudio20SourceVoice_GetVolume(IXAudio20SourceVoice* This,float *pVolume) {
    This->lpVtbl->GetVolume(This,pVolume);
}
static FORCEINLINE HRESULT IXAudio20SourceVoice_SetChannelVolumes(IXAudio20SourceVoice* This,UINT32 Channels,const float *pVolumes,UINT32 OperationSet) {
    return This->lpVtbl->SetChannelVolumes(This,Channels,pVolumes,OperationSet);
}
static FORCEINLINE void IXAudio20SourceVoice_GetChannelVolumes(IXAudio20SourceVoice* This,UINT32 Channels,float *pVolumes) {
    This->lpVtbl->GetChannelVolumes(This,Channels,pVolumes);
}
static FORCEINLINE HRESULT IXAudio20SourceVoice_SetOutputMatrix(IXAudio20SourceVoice* This,IXAudio2Voice *pDestinationVoice,UINT32 SourceChannels,UINT32 DestinationChannels,const float *pLevelMatrix,UINT32 OperationSet) {
    return This->lpVtbl->SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet);
}
static FORCEINLINE HRESULT IXAudio20SourceVoice_GetOutputMatrix(IXAudio20SourceVoice* This,IXAudio2Voice *pDestinationVoice,UINT32 SourceChannels,UINT32 DestinationChannels,float *pLevelMatrix) {
    return This->lpVtbl->GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix);
}
static FORCEINLINE void IXAudio20SourceVoice_DestroyVoice(IXAudio20SourceVoice* This) {
    This->lpVtbl->DestroyVoice(This);
}
/*** IXAudio20SourceVoice methods ***/
static FORCEINLINE HRESULT IXAudio20SourceVoice_Start(IXAudio20SourceVoice* This,UINT32 Flags,UINT32 OperationSet) {
    return This->lpVtbl->Start(This,Flags,OperationSet);
}
static FORCEINLINE HRESULT IXAudio20SourceVoice_Stop(IXAudio20SourceVoice* This,UINT32 Flags,UINT32 OperationSet) {
    return This->lpVtbl->Stop(This,Flags,OperationSet);
}
static FORCEINLINE HRESULT IXAudio20SourceVoice_SubmitSourceBuffer(IXAudio20SourceVoice* This,const XAUDIO2_BUFFER *pBuffer,const XAUDIO2_BUFFER_WMA *pBufferWMA) {
    return This->lpVtbl->SubmitSourceBuffer(This,pBuffer,pBufferWMA);
}
static FORCEINLINE HRESULT IXAudio20SourceVoice_FlushSourceBuffers(IXAudio20SourceVoice* This) {
    return This->lpVtbl->FlushSourceBuffers(This);
}
static FORCEINLINE HRESULT IXAudio20SourceVoice_Discontinuity(IXAudio20SourceVoice* This) {
    return This->lpVtbl->Discontinuity(This);
}
static FORCEINLINE HRESULT IXAudio20SourceVoice_ExitLoop(IXAudio20SourceVoice* This,UINT32 OperationSet) {
    return This->lpVtbl->ExitLoop(This,OperationSet);
}
static FORCEINLINE void IXAudio20SourceVoice_GetState(IXAudio20SourceVoice* This,XAUDIO2_VOICE_STATE *pVoiceState) {
    This->lpVtbl->GetState(This,pVoiceState);
}
static FORCEINLINE HRESULT IXAudio20SourceVoice_SetFrequencyRatio(IXAudio20SourceVoice* This,float Ratio,UINT32 OperationSet) {
    return This->lpVtbl->SetFrequencyRatio(This,Ratio,OperationSet);
}
static FORCEINLINE void IXAudio20SourceVoice_GetFrequencyRatio(IXAudio20SourceVoice* This,float *pRatio) {
    This->lpVtbl->GetFrequencyRatio(This,pRatio);
}
#endif
#endif

#endif


#endif  /* __IXAudio20SourceVoice_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXAudio23SourceVoice interface
 */
#ifndef __IXAudio23SourceVoice_INTERFACE_DEFINED__
#define __IXAudio23SourceVoice_INTERFACE_DEFINED__

#if defined(__cplusplus) && !defined(CINTERFACE)
interface IXAudio23SourceVoice : public IXAudio23Voice
{
    virtual HRESULT STDMETHODCALLTYPE Start(
        UINT32 Flags = 0,
        UINT32 OperationSet = XAUDIO2_COMMIT_NOW) = 0;

    virtual HRESULT STDMETHODCALLTYPE Stop(
        UINT32 Flags = 0,
        UINT32 OperationSet = XAUDIO2_COMMIT_NOW) = 0;

    virtual HRESULT STDMETHODCALLTYPE SubmitSourceBuffer(
        const XAUDIO2_BUFFER *pBuffer,
        const XAUDIO2_BUFFER_WMA *pBufferWMA = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE FlushSourceBuffers(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Discontinuity(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE ExitLoop(
        UINT32 OperationSet = XAUDIO2_COMMIT_NOW) = 0;

    virtual void STDMETHODCALLTYPE GetState(
        XAUDIO2_VOICE_STATE *pVoiceState) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFrequencyRatio(
        float Ratio,
        UINT32 OperationSet = XAUDIO2_COMMIT_NOW) = 0;

    virtual void STDMETHODCALLTYPE GetFrequencyRatio(
        float *pRatio) = 0;

};
#else
typedef struct IXAudio23SourceVoiceVtbl {
    BEGIN_INTERFACE

    /*** IXAudio23Voice methods ***/
    void (STDMETHODCALLTYPE *GetVoiceDetails)(
        IXAudio23SourceVoice *This,
        XAUDIO27_VOICE_DETAILS *pVoiceDetails);

    HRESULT (STDMETHODCALLTYPE *SetOutputVoices)(
        IXAudio23SourceVoice *This,
        const XAUDIO23_VOICE_SENDS *pSendList);

    HRESULT (STDMETHODCALLTYPE *SetEffectChain)(
        IXAudio23SourceVoice *This,
        const XAUDIO2_EFFECT_CHAIN *pEffectChain);

    HRESULT (STDMETHODCALLTYPE *EnableEffect)(
        IXAudio23SourceVoice *This,
        UINT32 EffectIndex,
        UINT32 OperationSet);

    HRESULT (STDMETHODCALLTYPE *DisableEffect)(
        IXAudio23SourceVoice *This,
        UINT32 EffectIndex,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetEffectState)(
        IXAudio23SourceVoice *This,
        UINT32 EffectIndex,
        WINBOOL *pEnabled);

    HRESULT (STDMETHODCALLTYPE *SetEffectParameters)(
        IXAudio23SourceVoice *This,
        UINT32 EffectIndex,
        const void *pParameters,
        UINT32 ParametersByteSize,
        UINT32 OperationSet);

    HRESULT (STDMETHODCALLTYPE *GetEffectParameters)(
        IXAudio23SourceVoice *This,
        UINT32 EffectIndex,
        void *pParameters,
        UINT32 ParametersByteSize);

    HRESULT (STDMETHODCALLTYPE *SetFilterParameters)(
        IXAudio23SourceVoice *This,
        const XAUDIO2_FILTER_PARAMETERS *pParameters,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetFilterParameters)(
        IXAudio23SourceVoice *This,
        XAUDIO2_FILTER_PARAMETERS *pParameters);

    HRESULT (STDMETHODCALLTYPE *SetVolume)(
        IXAudio23SourceVoice *This,
        float Volume,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetVolume)(
        IXAudio23SourceVoice *This,
        float *pVolume);

    HRESULT (STDMETHODCALLTYPE *SetChannelVolumes)(
        IXAudio23SourceVoice *This,
        UINT32 Channels,
        const float *pVolumes,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetChannelVolumes)(
        IXAudio23SourceVoice *This,
        UINT32 Channels,
        float *pVolumes);

    HRESULT (STDMETHODCALLTYPE *SetOutputMatrix)(
        IXAudio23SourceVoice *This,
        IXAudio2Voice *pDestinationVoice,
        UINT32 SourceChannels,
        UINT32 DestinationChannels,
        const float *pLevelMatrix,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetOutputMatrix)(
        IXAudio23SourceVoice *This,
        IXAudio2Voice *pDestinationVoice,
        UINT32 SourceChannels,
        UINT32 DestinationChannels,
        float *pLevelMatrix);

    void (STDMETHODCALLTYPE *DestroyVoice)(
        IXAudio23SourceVoice *This);

    /*** IXAudio23SourceVoice methods ***/
    HRESULT (STDMETHODCALLTYPE *Start)(
        IXAudio23SourceVoice *This,
        UINT32 Flags,
        UINT32 OperationSet);

    HRESULT (STDMETHODCALLTYPE *Stop)(
        IXAudio23SourceVoice *This,
        UINT32 Flags,
        UINT32 OperationSet);

    HRESULT (STDMETHODCALLTYPE *SubmitSourceBuffer)(
        IXAudio23SourceVoice *This,
        const XAUDIO2_BUFFER *pBuffer,
        const XAUDIO2_BUFFER_WMA *pBufferWMA);

    HRESULT (STDMETHODCALLTYPE *FlushSourceBuffers)(
        IXAudio23SourceVoice *This);

    HRESULT (STDMETHODCALLTYPE *Discontinuity)(
        IXAudio23SourceVoice *This);

    HRESULT (STDMETHODCALLTYPE *ExitLoop)(
        IXAudio23SourceVoice *This,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetState)(
        IXAudio23SourceVoice *This,
        XAUDIO2_VOICE_STATE *pVoiceState);

    HRESULT (STDMETHODCALLTYPE *SetFrequencyRatio)(
        IXAudio23SourceVoice *This,
        float Ratio,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetFrequencyRatio)(
        IXAudio23SourceVoice *This,
        float *pRatio);

    END_INTERFACE
} IXAudio23SourceVoiceVtbl;

interface IXAudio23SourceVoice {
    CONST_VTBL IXAudio23SourceVoiceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IXAudio23Voice methods ***/
#define IXAudio23SourceVoice_GetVoiceDetails(This,pVoiceDetails) (This)->lpVtbl->GetVoiceDetails(This,pVoiceDetails)
#define IXAudio23SourceVoice_SetOutputVoices(This,pSendList) (This)->lpVtbl->SetOutputVoices(This,pSendList)
#define IXAudio23SourceVoice_SetEffectChain(This,pEffectChain) (This)->lpVtbl->SetEffectChain(This,pEffectChain)
#define IXAudio23SourceVoice_EnableEffect(This,EffectIndex,OperationSet) (This)->lpVtbl->EnableEffect(This,EffectIndex,OperationSet)
#define IXAudio23SourceVoice_DisableEffect(This,EffectIndex,OperationSet) (This)->lpVtbl->DisableEffect(This,EffectIndex,OperationSet)
#define IXAudio23SourceVoice_GetEffectState(This,EffectIndex,pEnabled) (This)->lpVtbl->GetEffectState(This,EffectIndex,pEnabled)
#define IXAudio23SourceVoice_SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet) (This)->lpVtbl->SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet)
#define IXAudio23SourceVoice_GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize) (This)->lpVtbl->GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize)
#define IXAudio23SourceVoice_SetFilterParameters(This,pParameters,OperationSet) (This)->lpVtbl->SetFilterParameters(This,pParameters,OperationSet)
#define IXAudio23SourceVoice_GetFilterParameters(This,pParameters) (This)->lpVtbl->GetFilterParameters(This,pParameters)
#define IXAudio23SourceVoice_SetVolume(This,Volume,OperationSet) (This)->lpVtbl->SetVolume(This,Volume,OperationSet)
#define IXAudio23SourceVoice_GetVolume(This,pVolume) (This)->lpVtbl->GetVolume(This,pVolume)
#define IXAudio23SourceVoice_SetChannelVolumes(This,Channels,pVolumes,OperationSet) (This)->lpVtbl->SetChannelVolumes(This,Channels,pVolumes,OperationSet)
#define IXAudio23SourceVoice_GetChannelVolumes(This,Channels,pVolumes) (This)->lpVtbl->GetChannelVolumes(This,Channels,pVolumes)
#define IXAudio23SourceVoice_SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet) (This)->lpVtbl->SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet)
#define IXAudio23SourceVoice_GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix) (This)->lpVtbl->GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix)
#define IXAudio23SourceVoice_DestroyVoice(This) (This)->lpVtbl->DestroyVoice(This)
/*** IXAudio23SourceVoice methods ***/
#define IXAudio23SourceVoice_Start(This,Flags,OperationSet) (This)->lpVtbl->Start(This,Flags,OperationSet)
#define IXAudio23SourceVoice_Stop(This,Flags,OperationSet) (This)->lpVtbl->Stop(This,Flags,OperationSet)
#define IXAudio23SourceVoice_SubmitSourceBuffer(This,pBuffer,pBufferWMA) (This)->lpVtbl->SubmitSourceBuffer(This,pBuffer,pBufferWMA)
#define IXAudio23SourceVoice_FlushSourceBuffers(This) (This)->lpVtbl->FlushSourceBuffers(This)
#define IXAudio23SourceVoice_Discontinuity(This) (This)->lpVtbl->Discontinuity(This)
#define IXAudio23SourceVoice_ExitLoop(This,OperationSet) (This)->lpVtbl->ExitLoop(This,OperationSet)
#define IXAudio23SourceVoice_GetState(This,pVoiceState) (This)->lpVtbl->GetState(This,pVoiceState)
#define IXAudio23SourceVoice_SetFrequencyRatio(This,Ratio,OperationSet) (This)->lpVtbl->SetFrequencyRatio(This,Ratio,OperationSet)
#define IXAudio23SourceVoice_GetFrequencyRatio(This,pRatio) (This)->lpVtbl->GetFrequencyRatio(This,pRatio)
#else
/*** IXAudio23Voice methods ***/
static FORCEINLINE void IXAudio23SourceVoice_GetVoiceDetails(IXAudio23SourceVoice* This,XAUDIO27_VOICE_DETAILS *pVoiceDetails) {
    This->lpVtbl->GetVoiceDetails(This,pVoiceDetails);
}
static FORCEINLINE HRESULT IXAudio23SourceVoice_SetOutputVoices(IXAudio23SourceVoice* This,const XAUDIO23_VOICE_SENDS *pSendList) {
    return This->lpVtbl->SetOutputVoices(This,pSendList);
}
static FORCEINLINE HRESULT IXAudio23SourceVoice_SetEffectChain(IXAudio23SourceVoice* This,const XAUDIO2_EFFECT_CHAIN *pEffectChain) {
    return This->lpVtbl->SetEffectChain(This,pEffectChain);
}
static FORCEINLINE HRESULT IXAudio23SourceVoice_EnableEffect(IXAudio23SourceVoice* This,UINT32 EffectIndex,UINT32 OperationSet) {
    return This->lpVtbl->EnableEffect(This,EffectIndex,OperationSet);
}
static FORCEINLINE HRESULT IXAudio23SourceVoice_DisableEffect(IXAudio23SourceVoice* This,UINT32 EffectIndex,UINT32 OperationSet) {
    return This->lpVtbl->DisableEffect(This,EffectIndex,OperationSet);
}
static FORCEINLINE void IXAudio23SourceVoice_GetEffectState(IXAudio23SourceVoice* This,UINT32 EffectIndex,WINBOOL *pEnabled) {
    This->lpVtbl->GetEffectState(This,EffectIndex,pEnabled);
}
static FORCEINLINE HRESULT IXAudio23SourceVoice_SetEffectParameters(IXAudio23SourceVoice* This,UINT32 EffectIndex,const void *pParameters,UINT32 ParametersByteSize,UINT32 OperationSet) {
    return This->lpVtbl->SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet);
}
static FORCEINLINE HRESULT IXAudio23SourceVoice_GetEffectParameters(IXAudio23SourceVoice* This,UINT32 EffectIndex,void *pParameters,UINT32 ParametersByteSize) {
    return This->lpVtbl->GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize);
}
static FORCEINLINE HRESULT IXAudio23SourceVoice_SetFilterParameters(IXAudio23SourceVoice* This,const XAUDIO2_FILTER_PARAMETERS *pParameters,UINT32 OperationSet) {
    return This->lpVtbl->SetFilterParameters(This,pParameters,OperationSet);
}
static FORCEINLINE void IXAudio23SourceVoice_GetFilterParameters(IXAudio23SourceVoice* This,XAUDIO2_FILTER_PARAMETERS *pParameters) {
    This->lpVtbl->GetFilterParameters(This,pParameters);
}
static FORCEINLINE HRESULT IXAudio23SourceVoice_SetVolume(IXAudio23SourceVoice* This,float Volume,UINT32 OperationSet) {
    return This->lpVtbl->SetVolume(This,Volume,OperationSet);
}
static FORCEINLINE void IXAudio23SourceVoice_GetVolume(IXAudio23SourceVoice* This,float *pVolume) {
    This->lpVtbl->GetVolume(This,pVolume);
}
static FORCEINLINE HRESULT IXAudio23SourceVoice_SetChannelVolumes(IXAudio23SourceVoice* This,UINT32 Channels,const float *pVolumes,UINT32 OperationSet) {
    return This->lpVtbl->SetChannelVolumes(This,Channels,pVolumes,OperationSet);
}
static FORCEINLINE void IXAudio23SourceVoice_GetChannelVolumes(IXAudio23SourceVoice* This,UINT32 Channels,float *pVolumes) {
    This->lpVtbl->GetChannelVolumes(This,Channels,pVolumes);
}
static FORCEINLINE HRESULT IXAudio23SourceVoice_SetOutputMatrix(IXAudio23SourceVoice* This,IXAudio2Voice *pDestinationVoice,UINT32 SourceChannels,UINT32 DestinationChannels,const float *pLevelMatrix,UINT32 OperationSet) {
    return This->lpVtbl->SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet);
}
static FORCEINLINE void IXAudio23SourceVoice_GetOutputMatrix(IXAudio23SourceVoice* This,IXAudio2Voice *pDestinationVoice,UINT32 SourceChannels,UINT32 DestinationChannels,float *pLevelMatrix) {
    This->lpVtbl->GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix);
}
static FORCEINLINE void IXAudio23SourceVoice_DestroyVoice(IXAudio23SourceVoice* This) {
    This->lpVtbl->DestroyVoice(This);
}
/*** IXAudio23SourceVoice methods ***/
static FORCEINLINE HRESULT IXAudio23SourceVoice_Start(IXAudio23SourceVoice* This,UINT32 Flags,UINT32 OperationSet) {
    return This->lpVtbl->Start(This,Flags,OperationSet);
}
static FORCEINLINE HRESULT IXAudio23SourceVoice_Stop(IXAudio23SourceVoice* This,UINT32 Flags,UINT32 OperationSet) {
    return This->lpVtbl->Stop(This,Flags,OperationSet);
}
static FORCEINLINE HRESULT IXAudio23SourceVoice_SubmitSourceBuffer(IXAudio23SourceVoice* This,const XAUDIO2_BUFFER *pBuffer,const XAUDIO2_BUFFER_WMA *pBufferWMA) {
    return This->lpVtbl->SubmitSourceBuffer(This,pBuffer,pBufferWMA);
}
static FORCEINLINE HRESULT IXAudio23SourceVoice_FlushSourceBuffers(IXAudio23SourceVoice* This) {
    return This->lpVtbl->FlushSourceBuffers(This);
}
static FORCEINLINE HRESULT IXAudio23SourceVoice_Discontinuity(IXAudio23SourceVoice* This) {
    return This->lpVtbl->Discontinuity(This);
}
static FORCEINLINE HRESULT IXAudio23SourceVoice_ExitLoop(IXAudio23SourceVoice* This,UINT32 OperationSet) {
    return This->lpVtbl->ExitLoop(This,OperationSet);
}
static FORCEINLINE void IXAudio23SourceVoice_GetState(IXAudio23SourceVoice* This,XAUDIO2_VOICE_STATE *pVoiceState) {
    This->lpVtbl->GetState(This,pVoiceState);
}
static FORCEINLINE HRESULT IXAudio23SourceVoice_SetFrequencyRatio(IXAudio23SourceVoice* This,float Ratio,UINT32 OperationSet) {
    return This->lpVtbl->SetFrequencyRatio(This,Ratio,OperationSet);
}
static FORCEINLINE void IXAudio23SourceVoice_GetFrequencyRatio(IXAudio23SourceVoice* This,float *pRatio) {
    This->lpVtbl->GetFrequencyRatio(This,pRatio);
}
#endif
#endif

#endif


#endif  /* __IXAudio23SourceVoice_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXAudio27SourceVoice interface
 */
#ifndef __IXAudio27SourceVoice_INTERFACE_DEFINED__
#define __IXAudio27SourceVoice_INTERFACE_DEFINED__

#if defined(__cplusplus) && !defined(CINTERFACE)
interface IXAudio27SourceVoice : public IXAudio27Voice
{
    virtual HRESULT STDMETHODCALLTYPE Start(
        UINT32 Flags = 0,
        UINT32 OperationSet = XAUDIO2_COMMIT_NOW) = 0;

    virtual HRESULT STDMETHODCALLTYPE Stop(
        UINT32 Flags = 0,
        UINT32 OperationSet = XAUDIO2_COMMIT_NOW) = 0;

    virtual HRESULT STDMETHODCALLTYPE SubmitSourceBuffer(
        const XAUDIO2_BUFFER *pBuffer,
        const XAUDIO2_BUFFER_WMA *pBufferWMA = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE FlushSourceBuffers(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Discontinuity(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE ExitLoop(
        UINT32 OperationSet = XAUDIO2_COMMIT_NOW) = 0;

    virtual void STDMETHODCALLTYPE GetState(
        XAUDIO2_VOICE_STATE *pVoiceState) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFrequencyRatio(
        float Ratio,
        UINT32 OperationSet = XAUDIO2_COMMIT_NOW) = 0;

    virtual void STDMETHODCALLTYPE GetFrequencyRatio(
        float *pRatio) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSourceSampleRate(
        UINT32 NewSourceSampleRate) = 0;

};
#else
typedef struct IXAudio27SourceVoiceVtbl {
    BEGIN_INTERFACE

    /*** IXAudio27Voice methods ***/
    void (STDMETHODCALLTYPE *GetVoiceDetails)(
        IXAudio27SourceVoice *This,
        XAUDIO27_VOICE_DETAILS *pVoiceDetails);

    HRESULT (STDMETHODCALLTYPE *SetOutputVoices)(
        IXAudio27SourceVoice *This,
        const XAUDIO2_VOICE_SENDS *pSendList);

    HRESULT (STDMETHODCALLTYPE *SetEffectChain)(
        IXAudio27SourceVoice *This,
        const XAUDIO2_EFFECT_CHAIN *pEffectChain);

    HRESULT (STDMETHODCALLTYPE *EnableEffect)(
        IXAudio27SourceVoice *This,
        UINT32 EffectIndex,
        UINT32 OperationSet);

    HRESULT (STDMETHODCALLTYPE *DisableEffect)(
        IXAudio27SourceVoice *This,
        UINT32 EffectIndex,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetEffectState)(
        IXAudio27SourceVoice *This,
        UINT32 EffectIndex,
        WINBOOL *pEnabled);

    HRESULT (STDMETHODCALLTYPE *SetEffectParameters)(
        IXAudio27SourceVoice *This,
        UINT32 EffectIndex,
        const void *pParameters,
        UINT32 ParametersByteSize,
        UINT32 OperationSet);

    HRESULT (STDMETHODCALLTYPE *GetEffectParameters)(
        IXAudio27SourceVoice *This,
        UINT32 EffectIndex,
        void *pParameters,
        UINT32 ParametersByteSize);

    HRESULT (STDMETHODCALLTYPE *SetFilterParameters)(
        IXAudio27SourceVoice *This,
        const XAUDIO2_FILTER_PARAMETERS *pParameters,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetFilterParameters)(
        IXAudio27SourceVoice *This,
        XAUDIO2_FILTER_PARAMETERS *pParameters);

    HRESULT (STDMETHODCALLTYPE *SetOutputFilterParameters)(
        IXAudio27SourceVoice *This,
        IXAudio2Voice *pDestinationVoice,
        const XAUDIO2_FILTER_PARAMETERS *pParameters,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetOutputFilterParameters)(
        IXAudio27SourceVoice *This,
        IXAudio2Voice *pDestinationVoice,
        XAUDIO2_FILTER_PARAMETERS *pParameters);

    HRESULT (STDMETHODCALLTYPE *SetVolume)(
        IXAudio27SourceVoice *This,
        float Volume,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetVolume)(
        IXAudio27SourceVoice *This,
        float *pVolume);

    HRESULT (STDMETHODCALLTYPE *SetChannelVolumes)(
        IXAudio27SourceVoice *This,
        UINT32 Channels,
        const float *pVolumes,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetChannelVolumes)(
        IXAudio27SourceVoice *This,
        UINT32 Channels,
        float *pVolumes);

    HRESULT (STDMETHODCALLTYPE *SetOutputMatrix)(
        IXAudio27SourceVoice *This,
        IXAudio2Voice *pDestinationVoice,
        UINT32 SourceChannels,
        UINT32 DestinationChannels,
        const float *pLevelMatrix,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetOutputMatrix)(
        IXAudio27SourceVoice *This,
        IXAudio2Voice *pDestinationVoice,
        UINT32 SourceChannels,
        UINT32 DestinationChannels,
        float *pLevelMatrix);

    void (STDMETHODCALLTYPE *DestroyVoice)(
        IXAudio27SourceVoice *This);

    /*** IXAudio27SourceVoice methods ***/
    HRESULT (STDMETHODCALLTYPE *Start)(
        IXAudio27SourceVoice *This,
        UINT32 Flags,
        UINT32 OperationSet);

    HRESULT (STDMETHODCALLTYPE *Stop)(
        IXAudio27SourceVoice *This,
        UINT32 Flags,
        UINT32 OperationSet);

    HRESULT (STDMETHODCALLTYPE *SubmitSourceBuffer)(
        IXAudio27SourceVoice *This,
        const XAUDIO2_BUFFER *pBuffer,
        const XAUDIO2_BUFFER_WMA *pBufferWMA);

    HRESULT (STDMETHODCALLTYPE *FlushSourceBuffers)(
        IXAudio27SourceVoice *This);

    HRESULT (STDMETHODCALLTYPE *Discontinuity)(
        IXAudio27SourceVoice *This);

    HRESULT (STDMETHODCALLTYPE *ExitLoop)(
        IXAudio27SourceVoice *This,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetState)(
        IXAudio27SourceVoice *This,
        XAUDIO2_VOICE_STATE *pVoiceState);

    HRESULT (STDMETHODCALLTYPE *SetFrequencyRatio)(
        IXAudio27SourceVoice *This,
        float Ratio,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetFrequencyRatio)(
        IXAudio27SourceVoice *This,
        float *pRatio);

    HRESULT (STDMETHODCALLTYPE *SetSourceSampleRate)(
        IXAudio27SourceVoice *This,
        UINT32 NewSourceSampleRate);

    END_INTERFACE
} IXAudio27SourceVoiceVtbl;

interface IXAudio27SourceVoice {
    CONST_VTBL IXAudio27SourceVoiceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IXAudio27Voice methods ***/
#define IXAudio27SourceVoice_GetVoiceDetails(This,pVoiceDetails) (This)->lpVtbl->GetVoiceDetails(This,pVoiceDetails)
#define IXAudio27SourceVoice_SetOutputVoices(This,pSendList) (This)->lpVtbl->SetOutputVoices(This,pSendList)
#define IXAudio27SourceVoice_SetEffectChain(This,pEffectChain) (This)->lpVtbl->SetEffectChain(This,pEffectChain)
#define IXAudio27SourceVoice_EnableEffect(This,EffectIndex,OperationSet) (This)->lpVtbl->EnableEffect(This,EffectIndex,OperationSet)
#define IXAudio27SourceVoice_DisableEffect(This,EffectIndex,OperationSet) (This)->lpVtbl->DisableEffect(This,EffectIndex,OperationSet)
#define IXAudio27SourceVoice_GetEffectState(This,EffectIndex,pEnabled) (This)->lpVtbl->GetEffectState(This,EffectIndex,pEnabled)
#define IXAudio27SourceVoice_SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet) (This)->lpVtbl->SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet)
#define IXAudio27SourceVoice_GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize) (This)->lpVtbl->GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize)
#define IXAudio27SourceVoice_SetFilterParameters(This,pParameters,OperationSet) (This)->lpVtbl->SetFilterParameters(This,pParameters,OperationSet)
#define IXAudio27SourceVoice_GetFilterParameters(This,pParameters) (This)->lpVtbl->GetFilterParameters(This,pParameters)
#define IXAudio27SourceVoice_SetOutputFilterParameters(This,pDestinationVoice,pParameters,OperationSet) (This)->lpVtbl->SetOutputFilterParameters(This,pDestinationVoice,pParameters,OperationSet)
#define IXAudio27SourceVoice_GetOutputFilterParameters(This,pDestinationVoice,pParameters) (This)->lpVtbl->GetOutputFilterParameters(This,pDestinationVoice,pParameters)
#define IXAudio27SourceVoice_SetVolume(This,Volume,OperationSet) (This)->lpVtbl->SetVolume(This,Volume,OperationSet)
#define IXAudio27SourceVoice_GetVolume(This,pVolume) (This)->lpVtbl->GetVolume(This,pVolume)
#define IXAudio27SourceVoice_SetChannelVolumes(This,Channels,pVolumes,OperationSet) (This)->lpVtbl->SetChannelVolumes(This,Channels,pVolumes,OperationSet)
#define IXAudio27SourceVoice_GetChannelVolumes(This,Channels,pVolumes) (This)->lpVtbl->GetChannelVolumes(This,Channels,pVolumes)
#define IXAudio27SourceVoice_SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet) (This)->lpVtbl->SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet)
#define IXAudio27SourceVoice_GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix) (This)->lpVtbl->GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix)
#define IXAudio27SourceVoice_DestroyVoice(This) (This)->lpVtbl->DestroyVoice(This)
/*** IXAudio27SourceVoice methods ***/
#define IXAudio27SourceVoice_Start(This,Flags,OperationSet) (This)->lpVtbl->Start(This,Flags,OperationSet)
#define IXAudio27SourceVoice_Stop(This,Flags,OperationSet) (This)->lpVtbl->Stop(This,Flags,OperationSet)
#define IXAudio27SourceVoice_SubmitSourceBuffer(This,pBuffer,pBufferWMA) (This)->lpVtbl->SubmitSourceBuffer(This,pBuffer,pBufferWMA)
#define IXAudio27SourceVoice_FlushSourceBuffers(This) (This)->lpVtbl->FlushSourceBuffers(This)
#define IXAudio27SourceVoice_Discontinuity(This) (This)->lpVtbl->Discontinuity(This)
#define IXAudio27SourceVoice_ExitLoop(This,OperationSet) (This)->lpVtbl->ExitLoop(This,OperationSet)
#define IXAudio27SourceVoice_GetState(This,pVoiceState) (This)->lpVtbl->GetState(This,pVoiceState)
#define IXAudio27SourceVoice_SetFrequencyRatio(This,Ratio,OperationSet) (This)->lpVtbl->SetFrequencyRatio(This,Ratio,OperationSet)
#define IXAudio27SourceVoice_GetFrequencyRatio(This,pRatio) (This)->lpVtbl->GetFrequencyRatio(This,pRatio)
#define IXAudio27SourceVoice_SetSourceSampleRate(This,NewSourceSampleRate) (This)->lpVtbl->SetSourceSampleRate(This,NewSourceSampleRate)
#else
/*** IXAudio27Voice methods ***/
static FORCEINLINE void IXAudio27SourceVoice_GetVoiceDetails(IXAudio27SourceVoice* This,XAUDIO27_VOICE_DETAILS *pVoiceDetails) {
    This->lpVtbl->GetVoiceDetails(This,pVoiceDetails);
}
static FORCEINLINE HRESULT IXAudio27SourceVoice_SetOutputVoices(IXAudio27SourceVoice* This,const XAUDIO2_VOICE_SENDS *pSendList) {
    return This->lpVtbl->SetOutputVoices(This,pSendList);
}
static FORCEINLINE HRESULT IXAudio27SourceVoice_SetEffectChain(IXAudio27SourceVoice* This,const XAUDIO2_EFFECT_CHAIN *pEffectChain) {
    return This->lpVtbl->SetEffectChain(This,pEffectChain);
}
static FORCEINLINE HRESULT IXAudio27SourceVoice_EnableEffect(IXAudio27SourceVoice* This,UINT32 EffectIndex,UINT32 OperationSet) {
    return This->lpVtbl->EnableEffect(This,EffectIndex,OperationSet);
}
static FORCEINLINE HRESULT IXAudio27SourceVoice_DisableEffect(IXAudio27SourceVoice* This,UINT32 EffectIndex,UINT32 OperationSet) {
    return This->lpVtbl->DisableEffect(This,EffectIndex,OperationSet);
}
static FORCEINLINE void IXAudio27SourceVoice_GetEffectState(IXAudio27SourceVoice* This,UINT32 EffectIndex,WINBOOL *pEnabled) {
    This->lpVtbl->GetEffectState(This,EffectIndex,pEnabled);
}
static FORCEINLINE HRESULT IXAudio27SourceVoice_SetEffectParameters(IXAudio27SourceVoice* This,UINT32 EffectIndex,const void *pParameters,UINT32 ParametersByteSize,UINT32 OperationSet) {
    return This->lpVtbl->SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet);
}
static FORCEINLINE HRESULT IXAudio27SourceVoice_GetEffectParameters(IXAudio27SourceVoice* This,UINT32 EffectIndex,void *pParameters,UINT32 ParametersByteSize) {
    return This->lpVtbl->GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize);
}
static FORCEINLINE HRESULT IXAudio27SourceVoice_SetFilterParameters(IXAudio27SourceVoice* This,const XAUDIO2_FILTER_PARAMETERS *pParameters,UINT32 OperationSet) {
    return This->lpVtbl->SetFilterParameters(This,pParameters,OperationSet);
}
static FORCEINLINE void IXAudio27SourceVoice_GetFilterParameters(IXAudio27SourceVoice* This,XAUDIO2_FILTER_PARAMETERS *pParameters) {
    This->lpVtbl->GetFilterParameters(This,pParameters);
}
static FORCEINLINE HRESULT IXAudio27SourceVoice_SetOutputFilterParameters(IXAudio27SourceVoice* This,IXAudio2Voice *pDestinationVoice,const XAUDIO2_FILTER_PARAMETERS *pParameters,UINT32 OperationSet) {
    return This->lpVtbl->SetOutputFilterParameters(This,pDestinationVoice,pParameters,OperationSet);
}
static FORCEINLINE void IXAudio27SourceVoice_GetOutputFilterParameters(IXAudio27SourceVoice* This,IXAudio2Voice *pDestinationVoice,XAUDIO2_FILTER_PARAMETERS *pParameters) {
    This->lpVtbl->GetOutputFilterParameters(This,pDestinationVoice,pParameters);
}
static FORCEINLINE HRESULT IXAudio27SourceVoice_SetVolume(IXAudio27SourceVoice* This,float Volume,UINT32 OperationSet) {
    return This->lpVtbl->SetVolume(This,Volume,OperationSet);
}
static FORCEINLINE void IXAudio27SourceVoice_GetVolume(IXAudio27SourceVoice* This,float *pVolume) {
    This->lpVtbl->GetVolume(This,pVolume);
}
static FORCEINLINE HRESULT IXAudio27SourceVoice_SetChannelVolumes(IXAudio27SourceVoice* This,UINT32 Channels,const float *pVolumes,UINT32 OperationSet) {
    return This->lpVtbl->SetChannelVolumes(This,Channels,pVolumes,OperationSet);
}
static FORCEINLINE void IXAudio27SourceVoice_GetChannelVolumes(IXAudio27SourceVoice* This,UINT32 Channels,float *pVolumes) {
    This->lpVtbl->GetChannelVolumes(This,Channels,pVolumes);
}
static FORCEINLINE HRESULT IXAudio27SourceVoice_SetOutputMatrix(IXAudio27SourceVoice* This,IXAudio2Voice *pDestinationVoice,UINT32 SourceChannels,UINT32 DestinationChannels,const float *pLevelMatrix,UINT32 OperationSet) {
    return This->lpVtbl->SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet);
}
static FORCEINLINE void IXAudio27SourceVoice_GetOutputMatrix(IXAudio27SourceVoice* This,IXAudio2Voice *pDestinationVoice,UINT32 SourceChannels,UINT32 DestinationChannels,float *pLevelMatrix) {
    This->lpVtbl->GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix);
}
static FORCEINLINE void IXAudio27SourceVoice_DestroyVoice(IXAudio27SourceVoice* This) {
    This->lpVtbl->DestroyVoice(This);
}
/*** IXAudio27SourceVoice methods ***/
static FORCEINLINE HRESULT IXAudio27SourceVoice_Start(IXAudio27SourceVoice* This,UINT32 Flags,UINT32 OperationSet) {
    return This->lpVtbl->Start(This,Flags,OperationSet);
}
static FORCEINLINE HRESULT IXAudio27SourceVoice_Stop(IXAudio27SourceVoice* This,UINT32 Flags,UINT32 OperationSet) {
    return This->lpVtbl->Stop(This,Flags,OperationSet);
}
static FORCEINLINE HRESULT IXAudio27SourceVoice_SubmitSourceBuffer(IXAudio27SourceVoice* This,const XAUDIO2_BUFFER *pBuffer,const XAUDIO2_BUFFER_WMA *pBufferWMA) {
    return This->lpVtbl->SubmitSourceBuffer(This,pBuffer,pBufferWMA);
}
static FORCEINLINE HRESULT IXAudio27SourceVoice_FlushSourceBuffers(IXAudio27SourceVoice* This) {
    return This->lpVtbl->FlushSourceBuffers(This);
}
static FORCEINLINE HRESULT IXAudio27SourceVoice_Discontinuity(IXAudio27SourceVoice* This) {
    return This->lpVtbl->Discontinuity(This);
}
static FORCEINLINE HRESULT IXAudio27SourceVoice_ExitLoop(IXAudio27SourceVoice* This,UINT32 OperationSet) {
    return This->lpVtbl->ExitLoop(This,OperationSet);
}
static FORCEINLINE void IXAudio27SourceVoice_GetState(IXAudio27SourceVoice* This,XAUDIO2_VOICE_STATE *pVoiceState) {
    This->lpVtbl->GetState(This,pVoiceState);
}
static FORCEINLINE HRESULT IXAudio27SourceVoice_SetFrequencyRatio(IXAudio27SourceVoice* This,float Ratio,UINT32 OperationSet) {
    return This->lpVtbl->SetFrequencyRatio(This,Ratio,OperationSet);
}
static FORCEINLINE void IXAudio27SourceVoice_GetFrequencyRatio(IXAudio27SourceVoice* This,float *pRatio) {
    This->lpVtbl->GetFrequencyRatio(This,pRatio);
}
static FORCEINLINE HRESULT IXAudio27SourceVoice_SetSourceSampleRate(IXAudio27SourceVoice* This,UINT32 NewSourceSampleRate) {
    return This->lpVtbl->SetSourceSampleRate(This,NewSourceSampleRate);
}
#endif
#endif

#endif


#endif  /* __IXAudio27SourceVoice_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXAudio2SourceVoice interface
 */
#ifndef __IXAudio2SourceVoice_INTERFACE_DEFINED__
#define __IXAudio2SourceVoice_INTERFACE_DEFINED__

#if defined(__cplusplus) && !defined(CINTERFACE)
interface IXAudio2SourceVoice : public IXAudio2Voice
{
    virtual HRESULT STDMETHODCALLTYPE Start(
        UINT32 Flags = 0,
        UINT32 OperationSet = XAUDIO2_COMMIT_NOW) = 0;

    virtual HRESULT STDMETHODCALLTYPE Stop(
        UINT32 Flags = 0,
        UINT32 OperationSet = XAUDIO2_COMMIT_NOW) = 0;

    virtual HRESULT STDMETHODCALLTYPE SubmitSourceBuffer(
        const XAUDIO2_BUFFER *pBuffer,
        const XAUDIO2_BUFFER_WMA *pBufferWMA = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE FlushSourceBuffers(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Discontinuity(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE ExitLoop(
        UINT32 OperationSet = XAUDIO2_COMMIT_NOW) = 0;

    virtual void STDMETHODCALLTYPE GetState(
        XAUDIO2_VOICE_STATE *pVoiceState,
        UINT32 Flags = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFrequencyRatio(
        float Ratio,
        UINT32 OperationSet = XAUDIO2_COMMIT_NOW) = 0;

    virtual void STDMETHODCALLTYPE GetFrequencyRatio(
        float *pRatio) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSourceSampleRate(
        UINT32 NewSourceSampleRate) = 0;

};
#else
typedef struct IXAudio2SourceVoiceVtbl {
    BEGIN_INTERFACE

    /*** IXAudio2Voice methods ***/
    void (STDMETHODCALLTYPE *GetVoiceDetails)(
        IXAudio2SourceVoice *This,
        XAUDIO2_VOICE_DETAILS *pVoiceDetails);

    HRESULT (STDMETHODCALLTYPE *SetOutputVoices)(
        IXAudio2SourceVoice *This,
        const XAUDIO2_VOICE_SENDS *pSendList);

    HRESULT (STDMETHODCALLTYPE *SetEffectChain)(
        IXAudio2SourceVoice *This,
        const XAUDIO2_EFFECT_CHAIN *pEffectChain);

    HRESULT (STDMETHODCALLTYPE *EnableEffect)(
        IXAudio2SourceVoice *This,
        UINT32 EffectIndex,
        UINT32 OperationSet);

    HRESULT (STDMETHODCALLTYPE *DisableEffect)(
        IXAudio2SourceVoice *This,
        UINT32 EffectIndex,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetEffectState)(
        IXAudio2SourceVoice *This,
        UINT32 EffectIndex,
        WINBOOL *pEnabled);

    HRESULT (STDMETHODCALLTYPE *SetEffectParameters)(
        IXAudio2SourceVoice *This,
        UINT32 EffectIndex,
        const void *pParameters,
        UINT32 ParametersByteSize,
        UINT32 OperationSet);

    HRESULT (STDMETHODCALLTYPE *GetEffectParameters)(
        IXAudio2SourceVoice *This,
        UINT32 EffectIndex,
        void *pParameters,
        UINT32 ParametersByteSize);

    HRESULT (STDMETHODCALLTYPE *SetFilterParameters)(
        IXAudio2SourceVoice *This,
        const XAUDIO2_FILTER_PARAMETERS *pParameters,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetFilterParameters)(
        IXAudio2SourceVoice *This,
        XAUDIO2_FILTER_PARAMETERS *pParameters);

    HRESULT (STDMETHODCALLTYPE *SetOutputFilterParameters)(
        IXAudio2SourceVoice *This,
        IXAudio2Voice *pDestinationVoice,
        const XAUDIO2_FILTER_PARAMETERS *pParameters,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetOutputFilterParameters)(
        IXAudio2SourceVoice *This,
        IXAudio2Voice *pDestinationVoice,
        XAUDIO2_FILTER_PARAMETERS *pParameters);

    HRESULT (STDMETHODCALLTYPE *SetVolume)(
        IXAudio2SourceVoice *This,
        float Volume,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetVolume)(
        IXAudio2SourceVoice *This,
        float *pVolume);

    HRESULT (STDMETHODCALLTYPE *SetChannelVolumes)(
        IXAudio2SourceVoice *This,
        UINT32 Channels,
        const float *pVolumes,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetChannelVolumes)(
        IXAudio2SourceVoice *This,
        UINT32 Channels,
        float *pVolumes);

    HRESULT (STDMETHODCALLTYPE *SetOutputMatrix)(
        IXAudio2SourceVoice *This,
        IXAudio2Voice *pDestinationVoice,
        UINT32 SourceChannels,
        UINT32 DestinationChannels,
        const float *pLevelMatrix,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetOutputMatrix)(
        IXAudio2SourceVoice *This,
        IXAudio2Voice *pDestinationVoice,
        UINT32 SourceChannels,
        UINT32 DestinationChannels,
        float *pLevelMatrix);

    void (STDMETHODCALLTYPE *DestroyVoice)(
        IXAudio2SourceVoice *This);

    /*** IXAudio2SourceVoice methods ***/
    HRESULT (STDMETHODCALLTYPE *Start)(
        IXAudio2SourceVoice *This,
        UINT32 Flags,
        UINT32 OperationSet);

    HRESULT (STDMETHODCALLTYPE *Stop)(
        IXAudio2SourceVoice *This,
        UINT32 Flags,
        UINT32 OperationSet);

    HRESULT (STDMETHODCALLTYPE *SubmitSourceBuffer)(
        IXAudio2SourceVoice *This,
        const XAUDIO2_BUFFER *pBuffer,
        const XAUDIO2_BUFFER_WMA *pBufferWMA);

    HRESULT (STDMETHODCALLTYPE *FlushSourceBuffers)(
        IXAudio2SourceVoice *This);

    HRESULT (STDMETHODCALLTYPE *Discontinuity)(
        IXAudio2SourceVoice *This);

    HRESULT (STDMETHODCALLTYPE *ExitLoop)(
        IXAudio2SourceVoice *This,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetState)(
        IXAudio2SourceVoice *This,
        XAUDIO2_VOICE_STATE *pVoiceState,
        UINT32 Flags);

    HRESULT (STDMETHODCALLTYPE *SetFrequencyRatio)(
        IXAudio2SourceVoice *This,
        float Ratio,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetFrequencyRatio)(
        IXAudio2SourceVoice *This,
        float *pRatio);

    HRESULT (STDMETHODCALLTYPE *SetSourceSampleRate)(
        IXAudio2SourceVoice *This,
        UINT32 NewSourceSampleRate);

    END_INTERFACE
} IXAudio2SourceVoiceVtbl;

interface IXAudio2SourceVoice {
    CONST_VTBL IXAudio2SourceVoiceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IXAudio2Voice methods ***/
#define IXAudio2SourceVoice_GetVoiceDetails(This,pVoiceDetails) (This)->lpVtbl->GetVoiceDetails(This,pVoiceDetails)
#define IXAudio2SourceVoice_SetOutputVoices(This,pSendList) (This)->lpVtbl->SetOutputVoices(This,pSendList)
#define IXAudio2SourceVoice_SetEffectChain(This,pEffectChain) (This)->lpVtbl->SetEffectChain(This,pEffectChain)
#define IXAudio2SourceVoice_EnableEffect(This,EffectIndex,OperationSet) (This)->lpVtbl->EnableEffect(This,EffectIndex,OperationSet)
#define IXAudio2SourceVoice_DisableEffect(This,EffectIndex,OperationSet) (This)->lpVtbl->DisableEffect(This,EffectIndex,OperationSet)
#define IXAudio2SourceVoice_GetEffectState(This,EffectIndex,pEnabled) (This)->lpVtbl->GetEffectState(This,EffectIndex,pEnabled)
#define IXAudio2SourceVoice_SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet) (This)->lpVtbl->SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet)
#define IXAudio2SourceVoice_GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize) (This)->lpVtbl->GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize)
#define IXAudio2SourceVoice_SetFilterParameters(This,pParameters,OperationSet) (This)->lpVtbl->SetFilterParameters(This,pParameters,OperationSet)
#define IXAudio2SourceVoice_GetFilterParameters(This,pParameters) (This)->lpVtbl->GetFilterParameters(This,pParameters)
#define IXAudio2SourceVoice_SetOutputFilterParameters(This,pDestinationVoice,pParameters,OperationSet) (This)->lpVtbl->SetOutputFilterParameters(This,pDestinationVoice,pParameters,OperationSet)
#define IXAudio2SourceVoice_GetOutputFilterParameters(This,pDestinationVoice,pParameters) (This)->lpVtbl->GetOutputFilterParameters(This,pDestinationVoice,pParameters)
#define IXAudio2SourceVoice_SetVolume(This,Volume,OperationSet) (This)->lpVtbl->SetVolume(This,Volume,OperationSet)
#define IXAudio2SourceVoice_GetVolume(This,pVolume) (This)->lpVtbl->GetVolume(This,pVolume)
#define IXAudio2SourceVoice_SetChannelVolumes(This,Channels,pVolumes,OperationSet) (This)->lpVtbl->SetChannelVolumes(This,Channels,pVolumes,OperationSet)
#define IXAudio2SourceVoice_GetChannelVolumes(This,Channels,pVolumes) (This)->lpVtbl->GetChannelVolumes(This,Channels,pVolumes)
#define IXAudio2SourceVoice_SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet) (This)->lpVtbl->SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet)
#define IXAudio2SourceVoice_GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix) (This)->lpVtbl->GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix)
#define IXAudio2SourceVoice_DestroyVoice(This) (This)->lpVtbl->DestroyVoice(This)
/*** IXAudio2SourceVoice methods ***/
#define IXAudio2SourceVoice_Start(This,Flags,OperationSet) (This)->lpVtbl->Start(This,Flags,OperationSet)
#define IXAudio2SourceVoice_Stop(This,Flags,OperationSet) (This)->lpVtbl->Stop(This,Flags,OperationSet)
#define IXAudio2SourceVoice_SubmitSourceBuffer(This,pBuffer,pBufferWMA) (This)->lpVtbl->SubmitSourceBuffer(This,pBuffer,pBufferWMA)
#define IXAudio2SourceVoice_FlushSourceBuffers(This) (This)->lpVtbl->FlushSourceBuffers(This)
#define IXAudio2SourceVoice_Discontinuity(This) (This)->lpVtbl->Discontinuity(This)
#define IXAudio2SourceVoice_ExitLoop(This,OperationSet) (This)->lpVtbl->ExitLoop(This,OperationSet)
#define IXAudio2SourceVoice_GetState(This,pVoiceState,Flags) (This)->lpVtbl->GetState(This,pVoiceState,Flags)
#define IXAudio2SourceVoice_SetFrequencyRatio(This,Ratio,OperationSet) (This)->lpVtbl->SetFrequencyRatio(This,Ratio,OperationSet)
#define IXAudio2SourceVoice_GetFrequencyRatio(This,pRatio) (This)->lpVtbl->GetFrequencyRatio(This,pRatio)
#define IXAudio2SourceVoice_SetSourceSampleRate(This,NewSourceSampleRate) (This)->lpVtbl->SetSourceSampleRate(This,NewSourceSampleRate)
#else
/*** IXAudio2Voice methods ***/
static FORCEINLINE void IXAudio2SourceVoice_GetVoiceDetails(IXAudio2SourceVoice* This,XAUDIO2_VOICE_DETAILS *pVoiceDetails) {
    This->lpVtbl->GetVoiceDetails(This,pVoiceDetails);
}
static FORCEINLINE HRESULT IXAudio2SourceVoice_SetOutputVoices(IXAudio2SourceVoice* This,const XAUDIO2_VOICE_SENDS *pSendList) {
    return This->lpVtbl->SetOutputVoices(This,pSendList);
}
static FORCEINLINE HRESULT IXAudio2SourceVoice_SetEffectChain(IXAudio2SourceVoice* This,const XAUDIO2_EFFECT_CHAIN *pEffectChain) {
    return This->lpVtbl->SetEffectChain(This,pEffectChain);
}
static FORCEINLINE HRESULT IXAudio2SourceVoice_EnableEffect(IXAudio2SourceVoice* This,UINT32 EffectIndex,UINT32 OperationSet) {
    return This->lpVtbl->EnableEffect(This,EffectIndex,OperationSet);
}
static FORCEINLINE HRESULT IXAudio2SourceVoice_DisableEffect(IXAudio2SourceVoice* This,UINT32 EffectIndex,UINT32 OperationSet) {
    return This->lpVtbl->DisableEffect(This,EffectIndex,OperationSet);
}
static FORCEINLINE void IXAudio2SourceVoice_GetEffectState(IXAudio2SourceVoice* This,UINT32 EffectIndex,WINBOOL *pEnabled) {
    This->lpVtbl->GetEffectState(This,EffectIndex,pEnabled);
}
static FORCEINLINE HRESULT IXAudio2SourceVoice_SetEffectParameters(IXAudio2SourceVoice* This,UINT32 EffectIndex,const void *pParameters,UINT32 ParametersByteSize,UINT32 OperationSet) {
    return This->lpVtbl->SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet);
}
static FORCEINLINE HRESULT IXAudio2SourceVoice_GetEffectParameters(IXAudio2SourceVoice* This,UINT32 EffectIndex,void *pParameters,UINT32 ParametersByteSize) {
    return This->lpVtbl->GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize);
}
static FORCEINLINE HRESULT IXAudio2SourceVoice_SetFilterParameters(IXAudio2SourceVoice* This,const XAUDIO2_FILTER_PARAMETERS *pParameters,UINT32 OperationSet) {
    return This->lpVtbl->SetFilterParameters(This,pParameters,OperationSet);
}
static FORCEINLINE void IXAudio2SourceVoice_GetFilterParameters(IXAudio2SourceVoice* This,XAUDIO2_FILTER_PARAMETERS *pParameters) {
    This->lpVtbl->GetFilterParameters(This,pParameters);
}
static FORCEINLINE HRESULT IXAudio2SourceVoice_SetOutputFilterParameters(IXAudio2SourceVoice* This,IXAudio2Voice *pDestinationVoice,const XAUDIO2_FILTER_PARAMETERS *pParameters,UINT32 OperationSet) {
    return This->lpVtbl->SetOutputFilterParameters(This,pDestinationVoice,pParameters,OperationSet);
}
static FORCEINLINE void IXAudio2SourceVoice_GetOutputFilterParameters(IXAudio2SourceVoice* This,IXAudio2Voice *pDestinationVoice,XAUDIO2_FILTER_PARAMETERS *pParameters) {
    This->lpVtbl->GetOutputFilterParameters(This,pDestinationVoice,pParameters);
}
static FORCEINLINE HRESULT IXAudio2SourceVoice_SetVolume(IXAudio2SourceVoice* This,float Volume,UINT32 OperationSet) {
    return This->lpVtbl->SetVolume(This,Volume,OperationSet);
}
static FORCEINLINE void IXAudio2SourceVoice_GetVolume(IXAudio2SourceVoice* This,float *pVolume) {
    This->lpVtbl->GetVolume(This,pVolume);
}
static FORCEINLINE HRESULT IXAudio2SourceVoice_SetChannelVolumes(IXAudio2SourceVoice* This,UINT32 Channels,const float *pVolumes,UINT32 OperationSet) {
    return This->lpVtbl->SetChannelVolumes(This,Channels,pVolumes,OperationSet);
}
static FORCEINLINE void IXAudio2SourceVoice_GetChannelVolumes(IXAudio2SourceVoice* This,UINT32 Channels,float *pVolumes) {
    This->lpVtbl->GetChannelVolumes(This,Channels,pVolumes);
}
static FORCEINLINE HRESULT IXAudio2SourceVoice_SetOutputMatrix(IXAudio2SourceVoice* This,IXAudio2Voice *pDestinationVoice,UINT32 SourceChannels,UINT32 DestinationChannels,const float *pLevelMatrix,UINT32 OperationSet) {
    return This->lpVtbl->SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet);
}
static FORCEINLINE void IXAudio2SourceVoice_GetOutputMatrix(IXAudio2SourceVoice* This,IXAudio2Voice *pDestinationVoice,UINT32 SourceChannels,UINT32 DestinationChannels,float *pLevelMatrix) {
    This->lpVtbl->GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix);
}
static FORCEINLINE void IXAudio2SourceVoice_DestroyVoice(IXAudio2SourceVoice* This) {
    This->lpVtbl->DestroyVoice(This);
}
/*** IXAudio2SourceVoice methods ***/
static FORCEINLINE HRESULT IXAudio2SourceVoice_Start(IXAudio2SourceVoice* This,UINT32 Flags,UINT32 OperationSet) {
    return This->lpVtbl->Start(This,Flags,OperationSet);
}
static FORCEINLINE HRESULT IXAudio2SourceVoice_Stop(IXAudio2SourceVoice* This,UINT32 Flags,UINT32 OperationSet) {
    return This->lpVtbl->Stop(This,Flags,OperationSet);
}
static FORCEINLINE HRESULT IXAudio2SourceVoice_SubmitSourceBuffer(IXAudio2SourceVoice* This,const XAUDIO2_BUFFER *pBuffer,const XAUDIO2_BUFFER_WMA *pBufferWMA) {
    return This->lpVtbl->SubmitSourceBuffer(This,pBuffer,pBufferWMA);
}
static FORCEINLINE HRESULT IXAudio2SourceVoice_FlushSourceBuffers(IXAudio2SourceVoice* This) {
    return This->lpVtbl->FlushSourceBuffers(This);
}
static FORCEINLINE HRESULT IXAudio2SourceVoice_Discontinuity(IXAudio2SourceVoice* This) {
    return This->lpVtbl->Discontinuity(This);
}
static FORCEINLINE HRESULT IXAudio2SourceVoice_ExitLoop(IXAudio2SourceVoice* This,UINT32 OperationSet) {
    return This->lpVtbl->ExitLoop(This,OperationSet);
}
static FORCEINLINE void IXAudio2SourceVoice_GetState(IXAudio2SourceVoice* This,XAUDIO2_VOICE_STATE *pVoiceState,UINT32 Flags) {
    This->lpVtbl->GetState(This,pVoiceState,Flags);
}
static FORCEINLINE HRESULT IXAudio2SourceVoice_SetFrequencyRatio(IXAudio2SourceVoice* This,float Ratio,UINT32 OperationSet) {
    return This->lpVtbl->SetFrequencyRatio(This,Ratio,OperationSet);
}
static FORCEINLINE void IXAudio2SourceVoice_GetFrequencyRatio(IXAudio2SourceVoice* This,float *pRatio) {
    This->lpVtbl->GetFrequencyRatio(This,pRatio);
}
static FORCEINLINE HRESULT IXAudio2SourceVoice_SetSourceSampleRate(IXAudio2SourceVoice* This,UINT32 NewSourceSampleRate) {
    return This->lpVtbl->SetSourceSampleRate(This,NewSourceSampleRate);
}
#endif
#endif

#endif


#endif  /* __IXAudio2SourceVoice_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXAudio20SubmixVoice interface
 */
#ifndef __IXAudio20SubmixVoice_INTERFACE_DEFINED__
#define __IXAudio20SubmixVoice_INTERFACE_DEFINED__

#if defined(__cplusplus) && !defined(CINTERFACE)
interface IXAudio20SubmixVoice : public IXAudio20Voice
{
};
#else
typedef struct IXAudio20SubmixVoiceVtbl {
    BEGIN_INTERFACE

    /*** IXAudio20Voice methods ***/
    void (STDMETHODCALLTYPE *GetVoiceDetails)(
        IXAudio20SubmixVoice *This,
        XAUDIO27_VOICE_DETAILS *pVoiceDetails);

    HRESULT (STDMETHODCALLTYPE *SetOutputVoices)(
        IXAudio20SubmixVoice *This,
        const XAUDIO23_VOICE_SENDS *pSendList);

    HRESULT (STDMETHODCALLTYPE *SetEffectChain)(
        IXAudio20SubmixVoice *This,
        const XAUDIO2_EFFECT_CHAIN *pEffectChain);

    HRESULT (STDMETHODCALLTYPE *EnableEffect)(
        IXAudio20SubmixVoice *This,
        UINT32 EffectIndex,
        UINT32 OperationSet);

    HRESULT (STDMETHODCALLTYPE *DisableEffect)(
        IXAudio20SubmixVoice *This,
        UINT32 EffectIndex,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetEffectState)(
        IXAudio20SubmixVoice *This,
        UINT32 EffectIndex,
        WINBOOL *pEnabled);

    HRESULT (STDMETHODCALLTYPE *SetEffectParameters)(
        IXAudio20SubmixVoice *This,
        UINT32 EffectIndex,
        const void *pParameters,
        UINT32 ParametersByteSize,
        UINT32 OperationSet);

    HRESULT (STDMETHODCALLTYPE *GetEffectParameters)(
        IXAudio20SubmixVoice *This,
        UINT32 EffectIndex,
        void *pParameters,
        UINT32 ParametersByteSize);

    HRESULT (STDMETHODCALLTYPE *SetFilterParameters)(
        IXAudio20SubmixVoice *This,
        const XAUDIO2_FILTER_PARAMETERS *pParameters,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetFilterParameters)(
        IXAudio20SubmixVoice *This,
        XAUDIO2_FILTER_PARAMETERS *pParameters);

    HRESULT (STDMETHODCALLTYPE *SetVolume)(
        IXAudio20SubmixVoice *This,
        float Volume,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetVolume)(
        IXAudio20SubmixVoice *This,
        float *pVolume);

    HRESULT (STDMETHODCALLTYPE *SetChannelVolumes)(
        IXAudio20SubmixVoice *This,
        UINT32 Channels,
        const float *pVolumes,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetChannelVolumes)(
        IXAudio20SubmixVoice *This,
        UINT32 Channels,
        float *pVolumes);

    HRESULT (STDMETHODCALLTYPE *SetOutputMatrix)(
        IXAudio20SubmixVoice *This,
        IXAudio2Voice *pDestinationVoice,
        UINT32 SourceChannels,
        UINT32 DestinationChannels,
        const float *pLevelMatrix,
        UINT32 OperationSet);

    HRESULT (STDMETHODCALLTYPE *GetOutputMatrix)(
        IXAudio20SubmixVoice *This,
        IXAudio2Voice *pDestinationVoice,
        UINT32 SourceChannels,
        UINT32 DestinationChannels,
        float *pLevelMatrix);

    void (STDMETHODCALLTYPE *DestroyVoice)(
        IXAudio20SubmixVoice *This);

    END_INTERFACE
} IXAudio20SubmixVoiceVtbl;

interface IXAudio20SubmixVoice {
    CONST_VTBL IXAudio20SubmixVoiceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IXAudio20Voice methods ***/
#define IXAudio20SubmixVoice_GetVoiceDetails(This,pVoiceDetails) (This)->lpVtbl->GetVoiceDetails(This,pVoiceDetails)
#define IXAudio20SubmixVoice_SetOutputVoices(This,pSendList) (This)->lpVtbl->SetOutputVoices(This,pSendList)
#define IXAudio20SubmixVoice_SetEffectChain(This,pEffectChain) (This)->lpVtbl->SetEffectChain(This,pEffectChain)
#define IXAudio20SubmixVoice_EnableEffect(This,EffectIndex,OperationSet) (This)->lpVtbl->EnableEffect(This,EffectIndex,OperationSet)
#define IXAudio20SubmixVoice_DisableEffect(This,EffectIndex,OperationSet) (This)->lpVtbl->DisableEffect(This,EffectIndex,OperationSet)
#define IXAudio20SubmixVoice_GetEffectState(This,EffectIndex,pEnabled) (This)->lpVtbl->GetEffectState(This,EffectIndex,pEnabled)
#define IXAudio20SubmixVoice_SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet) (This)->lpVtbl->SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet)
#define IXAudio20SubmixVoice_GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize) (This)->lpVtbl->GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize)
#define IXAudio20SubmixVoice_SetFilterParameters(This,pParameters,OperationSet) (This)->lpVtbl->SetFilterParameters(This,pParameters,OperationSet)
#define IXAudio20SubmixVoice_GetFilterParameters(This,pParameters) (This)->lpVtbl->GetFilterParameters(This,pParameters)
#define IXAudio20SubmixVoice_SetVolume(This,Volume,OperationSet) (This)->lpVtbl->SetVolume(This,Volume,OperationSet)
#define IXAudio20SubmixVoice_GetVolume(This,pVolume) (This)->lpVtbl->GetVolume(This,pVolume)
#define IXAudio20SubmixVoice_SetChannelVolumes(This,Channels,pVolumes,OperationSet) (This)->lpVtbl->SetChannelVolumes(This,Channels,pVolumes,OperationSet)
#define IXAudio20SubmixVoice_GetChannelVolumes(This,Channels,pVolumes) (This)->lpVtbl->GetChannelVolumes(This,Channels,pVolumes)
#define IXAudio20SubmixVoice_SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet) (This)->lpVtbl->SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet)
#define IXAudio20SubmixVoice_GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix) (This)->lpVtbl->GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix)
#define IXAudio20SubmixVoice_DestroyVoice(This) (This)->lpVtbl->DestroyVoice(This)
#else
/*** IXAudio20Voice methods ***/
static FORCEINLINE void IXAudio20SubmixVoice_GetVoiceDetails(IXAudio20SubmixVoice* This,XAUDIO27_VOICE_DETAILS *pVoiceDetails) {
    This->lpVtbl->GetVoiceDetails(This,pVoiceDetails);
}
static FORCEINLINE HRESULT IXAudio20SubmixVoice_SetOutputVoices(IXAudio20SubmixVoice* This,const XAUDIO23_VOICE_SENDS *pSendList) {
    return This->lpVtbl->SetOutputVoices(This,pSendList);
}
static FORCEINLINE HRESULT IXAudio20SubmixVoice_SetEffectChain(IXAudio20SubmixVoice* This,const XAUDIO2_EFFECT_CHAIN *pEffectChain) {
    return This->lpVtbl->SetEffectChain(This,pEffectChain);
}
static FORCEINLINE HRESULT IXAudio20SubmixVoice_EnableEffect(IXAudio20SubmixVoice* This,UINT32 EffectIndex,UINT32 OperationSet) {
    return This->lpVtbl->EnableEffect(This,EffectIndex,OperationSet);
}
static FORCEINLINE HRESULT IXAudio20SubmixVoice_DisableEffect(IXAudio20SubmixVoice* This,UINT32 EffectIndex,UINT32 OperationSet) {
    return This->lpVtbl->DisableEffect(This,EffectIndex,OperationSet);
}
static FORCEINLINE void IXAudio20SubmixVoice_GetEffectState(IXAudio20SubmixVoice* This,UINT32 EffectIndex,WINBOOL *pEnabled) {
    This->lpVtbl->GetEffectState(This,EffectIndex,pEnabled);
}
static FORCEINLINE HRESULT IXAudio20SubmixVoice_SetEffectParameters(IXAudio20SubmixVoice* This,UINT32 EffectIndex,const void *pParameters,UINT32 ParametersByteSize,UINT32 OperationSet) {
    return This->lpVtbl->SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet);
}
static FORCEINLINE HRESULT IXAudio20SubmixVoice_GetEffectParameters(IXAudio20SubmixVoice* This,UINT32 EffectIndex,void *pParameters,UINT32 ParametersByteSize) {
    return This->lpVtbl->GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize);
}
static FORCEINLINE HRESULT IXAudio20SubmixVoice_SetFilterParameters(IXAudio20SubmixVoice* This,const XAUDIO2_FILTER_PARAMETERS *pParameters,UINT32 OperationSet) {
    return This->lpVtbl->SetFilterParameters(This,pParameters,OperationSet);
}
static FORCEINLINE void IXAudio20SubmixVoice_GetFilterParameters(IXAudio20SubmixVoice* This,XAUDIO2_FILTER_PARAMETERS *pParameters) {
    This->lpVtbl->GetFilterParameters(This,pParameters);
}
static FORCEINLINE HRESULT IXAudio20SubmixVoice_SetVolume(IXAudio20SubmixVoice* This,float Volume,UINT32 OperationSet) {
    return This->lpVtbl->SetVolume(This,Volume,OperationSet);
}
static FORCEINLINE void IXAudio20SubmixVoice_GetVolume(IXAudio20SubmixVoice* This,float *pVolume) {
    This->lpVtbl->GetVolume(This,pVolume);
}
static FORCEINLINE HRESULT IXAudio20SubmixVoice_SetChannelVolumes(IXAudio20SubmixVoice* This,UINT32 Channels,const float *pVolumes,UINT32 OperationSet) {
    return This->lpVtbl->SetChannelVolumes(This,Channels,pVolumes,OperationSet);
}
static FORCEINLINE void IXAudio20SubmixVoice_GetChannelVolumes(IXAudio20SubmixVoice* This,UINT32 Channels,float *pVolumes) {
    This->lpVtbl->GetChannelVolumes(This,Channels,pVolumes);
}
static FORCEINLINE HRESULT IXAudio20SubmixVoice_SetOutputMatrix(IXAudio20SubmixVoice* This,IXAudio2Voice *pDestinationVoice,UINT32 SourceChannels,UINT32 DestinationChannels,const float *pLevelMatrix,UINT32 OperationSet) {
    return This->lpVtbl->SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet);
}
static FORCEINLINE HRESULT IXAudio20SubmixVoice_GetOutputMatrix(IXAudio20SubmixVoice* This,IXAudio2Voice *pDestinationVoice,UINT32 SourceChannels,UINT32 DestinationChannels,float *pLevelMatrix) {
    return This->lpVtbl->GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix);
}
static FORCEINLINE void IXAudio20SubmixVoice_DestroyVoice(IXAudio20SubmixVoice* This) {
    This->lpVtbl->DestroyVoice(This);
}
#endif
#endif

#endif


#endif  /* __IXAudio20SubmixVoice_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXAudio23SubmixVoice interface
 */
#ifndef __IXAudio23SubmixVoice_INTERFACE_DEFINED__
#define __IXAudio23SubmixVoice_INTERFACE_DEFINED__

#if defined(__cplusplus) && !defined(CINTERFACE)
interface IXAudio23SubmixVoice : public IXAudio23Voice
{
};
#else
typedef struct IXAudio23SubmixVoiceVtbl {
    BEGIN_INTERFACE

    /*** IXAudio23Voice methods ***/
    void (STDMETHODCALLTYPE *GetVoiceDetails)(
        IXAudio23SubmixVoice *This,
        XAUDIO27_VOICE_DETAILS *pVoiceDetails);

    HRESULT (STDMETHODCALLTYPE *SetOutputVoices)(
        IXAudio23SubmixVoice *This,
        const XAUDIO23_VOICE_SENDS *pSendList);

    HRESULT (STDMETHODCALLTYPE *SetEffectChain)(
        IXAudio23SubmixVoice *This,
        const XAUDIO2_EFFECT_CHAIN *pEffectChain);

    HRESULT (STDMETHODCALLTYPE *EnableEffect)(
        IXAudio23SubmixVoice *This,
        UINT32 EffectIndex,
        UINT32 OperationSet);

    HRESULT (STDMETHODCALLTYPE *DisableEffect)(
        IXAudio23SubmixVoice *This,
        UINT32 EffectIndex,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetEffectState)(
        IXAudio23SubmixVoice *This,
        UINT32 EffectIndex,
        WINBOOL *pEnabled);

    HRESULT (STDMETHODCALLTYPE *SetEffectParameters)(
        IXAudio23SubmixVoice *This,
        UINT32 EffectIndex,
        const void *pParameters,
        UINT32 ParametersByteSize,
        UINT32 OperationSet);

    HRESULT (STDMETHODCALLTYPE *GetEffectParameters)(
        IXAudio23SubmixVoice *This,
        UINT32 EffectIndex,
        void *pParameters,
        UINT32 ParametersByteSize);

    HRESULT (STDMETHODCALLTYPE *SetFilterParameters)(
        IXAudio23SubmixVoice *This,
        const XAUDIO2_FILTER_PARAMETERS *pParameters,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetFilterParameters)(
        IXAudio23SubmixVoice *This,
        XAUDIO2_FILTER_PARAMETERS *pParameters);

    HRESULT (STDMETHODCALLTYPE *SetVolume)(
        IXAudio23SubmixVoice *This,
        float Volume,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetVolume)(
        IXAudio23SubmixVoice *This,
        float *pVolume);

    HRESULT (STDMETHODCALLTYPE *SetChannelVolumes)(
        IXAudio23SubmixVoice *This,
        UINT32 Channels,
        const float *pVolumes,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetChannelVolumes)(
        IXAudio23SubmixVoice *This,
        UINT32 Channels,
        float *pVolumes);

    HRESULT (STDMETHODCALLTYPE *SetOutputMatrix)(
        IXAudio23SubmixVoice *This,
        IXAudio2Voice *pDestinationVoice,
        UINT32 SourceChannels,
        UINT32 DestinationChannels,
        const float *pLevelMatrix,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetOutputMatrix)(
        IXAudio23SubmixVoice *This,
        IXAudio2Voice *pDestinationVoice,
        UINT32 SourceChannels,
        UINT32 DestinationChannels,
        float *pLevelMatrix);

    void (STDMETHODCALLTYPE *DestroyVoice)(
        IXAudio23SubmixVoice *This);

    END_INTERFACE
} IXAudio23SubmixVoiceVtbl;

interface IXAudio23SubmixVoice {
    CONST_VTBL IXAudio23SubmixVoiceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IXAudio23Voice methods ***/
#define IXAudio23SubmixVoice_GetVoiceDetails(This,pVoiceDetails) (This)->lpVtbl->GetVoiceDetails(This,pVoiceDetails)
#define IXAudio23SubmixVoice_SetOutputVoices(This,pSendList) (This)->lpVtbl->SetOutputVoices(This,pSendList)
#define IXAudio23SubmixVoice_SetEffectChain(This,pEffectChain) (This)->lpVtbl->SetEffectChain(This,pEffectChain)
#define IXAudio23SubmixVoice_EnableEffect(This,EffectIndex,OperationSet) (This)->lpVtbl->EnableEffect(This,EffectIndex,OperationSet)
#define IXAudio23SubmixVoice_DisableEffect(This,EffectIndex,OperationSet) (This)->lpVtbl->DisableEffect(This,EffectIndex,OperationSet)
#define IXAudio23SubmixVoice_GetEffectState(This,EffectIndex,pEnabled) (This)->lpVtbl->GetEffectState(This,EffectIndex,pEnabled)
#define IXAudio23SubmixVoice_SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet) (This)->lpVtbl->SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet)
#define IXAudio23SubmixVoice_GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize) (This)->lpVtbl->GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize)
#define IXAudio23SubmixVoice_SetFilterParameters(This,pParameters,OperationSet) (This)->lpVtbl->SetFilterParameters(This,pParameters,OperationSet)
#define IXAudio23SubmixVoice_GetFilterParameters(This,pParameters) (This)->lpVtbl->GetFilterParameters(This,pParameters)
#define IXAudio23SubmixVoice_SetVolume(This,Volume,OperationSet) (This)->lpVtbl->SetVolume(This,Volume,OperationSet)
#define IXAudio23SubmixVoice_GetVolume(This,pVolume) (This)->lpVtbl->GetVolume(This,pVolume)
#define IXAudio23SubmixVoice_SetChannelVolumes(This,Channels,pVolumes,OperationSet) (This)->lpVtbl->SetChannelVolumes(This,Channels,pVolumes,OperationSet)
#define IXAudio23SubmixVoice_GetChannelVolumes(This,Channels,pVolumes) (This)->lpVtbl->GetChannelVolumes(This,Channels,pVolumes)
#define IXAudio23SubmixVoice_SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet) (This)->lpVtbl->SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet)
#define IXAudio23SubmixVoice_GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix) (This)->lpVtbl->GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix)
#define IXAudio23SubmixVoice_DestroyVoice(This) (This)->lpVtbl->DestroyVoice(This)
#else
/*** IXAudio23Voice methods ***/
static FORCEINLINE void IXAudio23SubmixVoice_GetVoiceDetails(IXAudio23SubmixVoice* This,XAUDIO27_VOICE_DETAILS *pVoiceDetails) {
    This->lpVtbl->GetVoiceDetails(This,pVoiceDetails);
}
static FORCEINLINE HRESULT IXAudio23SubmixVoice_SetOutputVoices(IXAudio23SubmixVoice* This,const XAUDIO23_VOICE_SENDS *pSendList) {
    return This->lpVtbl->SetOutputVoices(This,pSendList);
}
static FORCEINLINE HRESULT IXAudio23SubmixVoice_SetEffectChain(IXAudio23SubmixVoice* This,const XAUDIO2_EFFECT_CHAIN *pEffectChain) {
    return This->lpVtbl->SetEffectChain(This,pEffectChain);
}
static FORCEINLINE HRESULT IXAudio23SubmixVoice_EnableEffect(IXAudio23SubmixVoice* This,UINT32 EffectIndex,UINT32 OperationSet) {
    return This->lpVtbl->EnableEffect(This,EffectIndex,OperationSet);
}
static FORCEINLINE HRESULT IXAudio23SubmixVoice_DisableEffect(IXAudio23SubmixVoice* This,UINT32 EffectIndex,UINT32 OperationSet) {
    return This->lpVtbl->DisableEffect(This,EffectIndex,OperationSet);
}
static FORCEINLINE void IXAudio23SubmixVoice_GetEffectState(IXAudio23SubmixVoice* This,UINT32 EffectIndex,WINBOOL *pEnabled) {
    This->lpVtbl->GetEffectState(This,EffectIndex,pEnabled);
}
static FORCEINLINE HRESULT IXAudio23SubmixVoice_SetEffectParameters(IXAudio23SubmixVoice* This,UINT32 EffectIndex,const void *pParameters,UINT32 ParametersByteSize,UINT32 OperationSet) {
    return This->lpVtbl->SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet);
}
static FORCEINLINE HRESULT IXAudio23SubmixVoice_GetEffectParameters(IXAudio23SubmixVoice* This,UINT32 EffectIndex,void *pParameters,UINT32 ParametersByteSize) {
    return This->lpVtbl->GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize);
}
static FORCEINLINE HRESULT IXAudio23SubmixVoice_SetFilterParameters(IXAudio23SubmixVoice* This,const XAUDIO2_FILTER_PARAMETERS *pParameters,UINT32 OperationSet) {
    return This->lpVtbl->SetFilterParameters(This,pParameters,OperationSet);
}
static FORCEINLINE void IXAudio23SubmixVoice_GetFilterParameters(IXAudio23SubmixVoice* This,XAUDIO2_FILTER_PARAMETERS *pParameters) {
    This->lpVtbl->GetFilterParameters(This,pParameters);
}
static FORCEINLINE HRESULT IXAudio23SubmixVoice_SetVolume(IXAudio23SubmixVoice* This,float Volume,UINT32 OperationSet) {
    return This->lpVtbl->SetVolume(This,Volume,OperationSet);
}
static FORCEINLINE void IXAudio23SubmixVoice_GetVolume(IXAudio23SubmixVoice* This,float *pVolume) {
    This->lpVtbl->GetVolume(This,pVolume);
}
static FORCEINLINE HRESULT IXAudio23SubmixVoice_SetChannelVolumes(IXAudio23SubmixVoice* This,UINT32 Channels,const float *pVolumes,UINT32 OperationSet) {
    return This->lpVtbl->SetChannelVolumes(This,Channels,pVolumes,OperationSet);
}
static FORCEINLINE void IXAudio23SubmixVoice_GetChannelVolumes(IXAudio23SubmixVoice* This,UINT32 Channels,float *pVolumes) {
    This->lpVtbl->GetChannelVolumes(This,Channels,pVolumes);
}
static FORCEINLINE HRESULT IXAudio23SubmixVoice_SetOutputMatrix(IXAudio23SubmixVoice* This,IXAudio2Voice *pDestinationVoice,UINT32 SourceChannels,UINT32 DestinationChannels,const float *pLevelMatrix,UINT32 OperationSet) {
    return This->lpVtbl->SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet);
}
static FORCEINLINE void IXAudio23SubmixVoice_GetOutputMatrix(IXAudio23SubmixVoice* This,IXAudio2Voice *pDestinationVoice,UINT32 SourceChannels,UINT32 DestinationChannels,float *pLevelMatrix) {
    This->lpVtbl->GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix);
}
static FORCEINLINE void IXAudio23SubmixVoice_DestroyVoice(IXAudio23SubmixVoice* This) {
    This->lpVtbl->DestroyVoice(This);
}
#endif
#endif

#endif


#endif  /* __IXAudio23SubmixVoice_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXAudio27SubmixVoice interface
 */
#ifndef __IXAudio27SubmixVoice_INTERFACE_DEFINED__
#define __IXAudio27SubmixVoice_INTERFACE_DEFINED__

#if defined(__cplusplus) && !defined(CINTERFACE)
interface IXAudio27SubmixVoice : public IXAudio27Voice
{
};
#else
typedef struct IXAudio27SubmixVoiceVtbl {
    BEGIN_INTERFACE

    /*** IXAudio27Voice methods ***/
    void (STDMETHODCALLTYPE *GetVoiceDetails)(
        IXAudio27SubmixVoice *This,
        XAUDIO27_VOICE_DETAILS *pVoiceDetails);

    HRESULT (STDMETHODCALLTYPE *SetOutputVoices)(
        IXAudio27SubmixVoice *This,
        const XAUDIO2_VOICE_SENDS *pSendList);

    HRESULT (STDMETHODCALLTYPE *SetEffectChain)(
        IXAudio27SubmixVoice *This,
        const XAUDIO2_EFFECT_CHAIN *pEffectChain);

    HRESULT (STDMETHODCALLTYPE *EnableEffect)(
        IXAudio27SubmixVoice *This,
        UINT32 EffectIndex,
        UINT32 OperationSet);

    HRESULT (STDMETHODCALLTYPE *DisableEffect)(
        IXAudio27SubmixVoice *This,
        UINT32 EffectIndex,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetEffectState)(
        IXAudio27SubmixVoice *This,
        UINT32 EffectIndex,
        WINBOOL *pEnabled);

    HRESULT (STDMETHODCALLTYPE *SetEffectParameters)(
        IXAudio27SubmixVoice *This,
        UINT32 EffectIndex,
        const void *pParameters,
        UINT32 ParametersByteSize,
        UINT32 OperationSet);

    HRESULT (STDMETHODCALLTYPE *GetEffectParameters)(
        IXAudio27SubmixVoice *This,
        UINT32 EffectIndex,
        void *pParameters,
        UINT32 ParametersByteSize);

    HRESULT (STDMETHODCALLTYPE *SetFilterParameters)(
        IXAudio27SubmixVoice *This,
        const XAUDIO2_FILTER_PARAMETERS *pParameters,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetFilterParameters)(
        IXAudio27SubmixVoice *This,
        XAUDIO2_FILTER_PARAMETERS *pParameters);

    HRESULT (STDMETHODCALLTYPE *SetOutputFilterParameters)(
        IXAudio27SubmixVoice *This,
        IXAudio2Voice *pDestinationVoice,
        const XAUDIO2_FILTER_PARAMETERS *pParameters,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetOutputFilterParameters)(
        IXAudio27SubmixVoice *This,
        IXAudio2Voice *pDestinationVoice,
        XAUDIO2_FILTER_PARAMETERS *pParameters);

    HRESULT (STDMETHODCALLTYPE *SetVolume)(
        IXAudio27SubmixVoice *This,
        float Volume,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetVolume)(
        IXAudio27SubmixVoice *This,
        float *pVolume);

    HRESULT (STDMETHODCALLTYPE *SetChannelVolumes)(
        IXAudio27SubmixVoice *This,
        UINT32 Channels,
        const float *pVolumes,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetChannelVolumes)(
        IXAudio27SubmixVoice *This,
        UINT32 Channels,
        float *pVolumes);

    HRESULT (STDMETHODCALLTYPE *SetOutputMatrix)(
        IXAudio27SubmixVoice *This,
        IXAudio2Voice *pDestinationVoice,
        UINT32 SourceChannels,
        UINT32 DestinationChannels,
        const float *pLevelMatrix,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetOutputMatrix)(
        IXAudio27SubmixVoice *This,
        IXAudio2Voice *pDestinationVoice,
        UINT32 SourceChannels,
        UINT32 DestinationChannels,
        float *pLevelMatrix);

    void (STDMETHODCALLTYPE *DestroyVoice)(
        IXAudio27SubmixVoice *This);

    END_INTERFACE
} IXAudio27SubmixVoiceVtbl;

interface IXAudio27SubmixVoice {
    CONST_VTBL IXAudio27SubmixVoiceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IXAudio27Voice methods ***/
#define IXAudio27SubmixVoice_GetVoiceDetails(This,pVoiceDetails) (This)->lpVtbl->GetVoiceDetails(This,pVoiceDetails)
#define IXAudio27SubmixVoice_SetOutputVoices(This,pSendList) (This)->lpVtbl->SetOutputVoices(This,pSendList)
#define IXAudio27SubmixVoice_SetEffectChain(This,pEffectChain) (This)->lpVtbl->SetEffectChain(This,pEffectChain)
#define IXAudio27SubmixVoice_EnableEffect(This,EffectIndex,OperationSet) (This)->lpVtbl->EnableEffect(This,EffectIndex,OperationSet)
#define IXAudio27SubmixVoice_DisableEffect(This,EffectIndex,OperationSet) (This)->lpVtbl->DisableEffect(This,EffectIndex,OperationSet)
#define IXAudio27SubmixVoice_GetEffectState(This,EffectIndex,pEnabled) (This)->lpVtbl->GetEffectState(This,EffectIndex,pEnabled)
#define IXAudio27SubmixVoice_SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet) (This)->lpVtbl->SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet)
#define IXAudio27SubmixVoice_GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize) (This)->lpVtbl->GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize)
#define IXAudio27SubmixVoice_SetFilterParameters(This,pParameters,OperationSet) (This)->lpVtbl->SetFilterParameters(This,pParameters,OperationSet)
#define IXAudio27SubmixVoice_GetFilterParameters(This,pParameters) (This)->lpVtbl->GetFilterParameters(This,pParameters)
#define IXAudio27SubmixVoice_SetOutputFilterParameters(This,pDestinationVoice,pParameters,OperationSet) (This)->lpVtbl->SetOutputFilterParameters(This,pDestinationVoice,pParameters,OperationSet)
#define IXAudio27SubmixVoice_GetOutputFilterParameters(This,pDestinationVoice,pParameters) (This)->lpVtbl->GetOutputFilterParameters(This,pDestinationVoice,pParameters)
#define IXAudio27SubmixVoice_SetVolume(This,Volume,OperationSet) (This)->lpVtbl->SetVolume(This,Volume,OperationSet)
#define IXAudio27SubmixVoice_GetVolume(This,pVolume) (This)->lpVtbl->GetVolume(This,pVolume)
#define IXAudio27SubmixVoice_SetChannelVolumes(This,Channels,pVolumes,OperationSet) (This)->lpVtbl->SetChannelVolumes(This,Channels,pVolumes,OperationSet)
#define IXAudio27SubmixVoice_GetChannelVolumes(This,Channels,pVolumes) (This)->lpVtbl->GetChannelVolumes(This,Channels,pVolumes)
#define IXAudio27SubmixVoice_SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet) (This)->lpVtbl->SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet)
#define IXAudio27SubmixVoice_GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix) (This)->lpVtbl->GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix)
#define IXAudio27SubmixVoice_DestroyVoice(This) (This)->lpVtbl->DestroyVoice(This)
#else
/*** IXAudio27Voice methods ***/
static FORCEINLINE void IXAudio27SubmixVoice_GetVoiceDetails(IXAudio27SubmixVoice* This,XAUDIO27_VOICE_DETAILS *pVoiceDetails) {
    This->lpVtbl->GetVoiceDetails(This,pVoiceDetails);
}
static FORCEINLINE HRESULT IXAudio27SubmixVoice_SetOutputVoices(IXAudio27SubmixVoice* This,const XAUDIO2_VOICE_SENDS *pSendList) {
    return This->lpVtbl->SetOutputVoices(This,pSendList);
}
static FORCEINLINE HRESULT IXAudio27SubmixVoice_SetEffectChain(IXAudio27SubmixVoice* This,const XAUDIO2_EFFECT_CHAIN *pEffectChain) {
    return This->lpVtbl->SetEffectChain(This,pEffectChain);
}
static FORCEINLINE HRESULT IXAudio27SubmixVoice_EnableEffect(IXAudio27SubmixVoice* This,UINT32 EffectIndex,UINT32 OperationSet) {
    return This->lpVtbl->EnableEffect(This,EffectIndex,OperationSet);
}
static FORCEINLINE HRESULT IXAudio27SubmixVoice_DisableEffect(IXAudio27SubmixVoice* This,UINT32 EffectIndex,UINT32 OperationSet) {
    return This->lpVtbl->DisableEffect(This,EffectIndex,OperationSet);
}
static FORCEINLINE void IXAudio27SubmixVoice_GetEffectState(IXAudio27SubmixVoice* This,UINT32 EffectIndex,WINBOOL *pEnabled) {
    This->lpVtbl->GetEffectState(This,EffectIndex,pEnabled);
}
static FORCEINLINE HRESULT IXAudio27SubmixVoice_SetEffectParameters(IXAudio27SubmixVoice* This,UINT32 EffectIndex,const void *pParameters,UINT32 ParametersByteSize,UINT32 OperationSet) {
    return This->lpVtbl->SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet);
}
static FORCEINLINE HRESULT IXAudio27SubmixVoice_GetEffectParameters(IXAudio27SubmixVoice* This,UINT32 EffectIndex,void *pParameters,UINT32 ParametersByteSize) {
    return This->lpVtbl->GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize);
}
static FORCEINLINE HRESULT IXAudio27SubmixVoice_SetFilterParameters(IXAudio27SubmixVoice* This,const XAUDIO2_FILTER_PARAMETERS *pParameters,UINT32 OperationSet) {
    return This->lpVtbl->SetFilterParameters(This,pParameters,OperationSet);
}
static FORCEINLINE void IXAudio27SubmixVoice_GetFilterParameters(IXAudio27SubmixVoice* This,XAUDIO2_FILTER_PARAMETERS *pParameters) {
    This->lpVtbl->GetFilterParameters(This,pParameters);
}
static FORCEINLINE HRESULT IXAudio27SubmixVoice_SetOutputFilterParameters(IXAudio27SubmixVoice* This,IXAudio2Voice *pDestinationVoice,const XAUDIO2_FILTER_PARAMETERS *pParameters,UINT32 OperationSet) {
    return This->lpVtbl->SetOutputFilterParameters(This,pDestinationVoice,pParameters,OperationSet);
}
static FORCEINLINE void IXAudio27SubmixVoice_GetOutputFilterParameters(IXAudio27SubmixVoice* This,IXAudio2Voice *pDestinationVoice,XAUDIO2_FILTER_PARAMETERS *pParameters) {
    This->lpVtbl->GetOutputFilterParameters(This,pDestinationVoice,pParameters);
}
static FORCEINLINE HRESULT IXAudio27SubmixVoice_SetVolume(IXAudio27SubmixVoice* This,float Volume,UINT32 OperationSet) {
    return This->lpVtbl->SetVolume(This,Volume,OperationSet);
}
static FORCEINLINE void IXAudio27SubmixVoice_GetVolume(IXAudio27SubmixVoice* This,float *pVolume) {
    This->lpVtbl->GetVolume(This,pVolume);
}
static FORCEINLINE HRESULT IXAudio27SubmixVoice_SetChannelVolumes(IXAudio27SubmixVoice* This,UINT32 Channels,const float *pVolumes,UINT32 OperationSet) {
    return This->lpVtbl->SetChannelVolumes(This,Channels,pVolumes,OperationSet);
}
static FORCEINLINE void IXAudio27SubmixVoice_GetChannelVolumes(IXAudio27SubmixVoice* This,UINT32 Channels,float *pVolumes) {
    This->lpVtbl->GetChannelVolumes(This,Channels,pVolumes);
}
static FORCEINLINE HRESULT IXAudio27SubmixVoice_SetOutputMatrix(IXAudio27SubmixVoice* This,IXAudio2Voice *pDestinationVoice,UINT32 SourceChannels,UINT32 DestinationChannels,const float *pLevelMatrix,UINT32 OperationSet) {
    return This->lpVtbl->SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet);
}
static FORCEINLINE void IXAudio27SubmixVoice_GetOutputMatrix(IXAudio27SubmixVoice* This,IXAudio2Voice *pDestinationVoice,UINT32 SourceChannels,UINT32 DestinationChannels,float *pLevelMatrix) {
    This->lpVtbl->GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix);
}
static FORCEINLINE void IXAudio27SubmixVoice_DestroyVoice(IXAudio27SubmixVoice* This) {
    This->lpVtbl->DestroyVoice(This);
}
#endif
#endif

#endif


#endif  /* __IXAudio27SubmixVoice_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXAudio2SubmixVoice interface
 */
#ifndef __IXAudio2SubmixVoice_INTERFACE_DEFINED__
#define __IXAudio2SubmixVoice_INTERFACE_DEFINED__

#if defined(__cplusplus) && !defined(CINTERFACE)
interface IXAudio2SubmixVoice : public IXAudio2Voice
{
};
#else
typedef struct IXAudio2SubmixVoiceVtbl {
    BEGIN_INTERFACE

    /*** IXAudio2Voice methods ***/
    void (STDMETHODCALLTYPE *GetVoiceDetails)(
        IXAudio2SubmixVoice *This,
        XAUDIO2_VOICE_DETAILS *pVoiceDetails);

    HRESULT (STDMETHODCALLTYPE *SetOutputVoices)(
        IXAudio2SubmixVoice *This,
        const XAUDIO2_VOICE_SENDS *pSendList);

    HRESULT (STDMETHODCALLTYPE *SetEffectChain)(
        IXAudio2SubmixVoice *This,
        const XAUDIO2_EFFECT_CHAIN *pEffectChain);

    HRESULT (STDMETHODCALLTYPE *EnableEffect)(
        IXAudio2SubmixVoice *This,
        UINT32 EffectIndex,
        UINT32 OperationSet);

    HRESULT (STDMETHODCALLTYPE *DisableEffect)(
        IXAudio2SubmixVoice *This,
        UINT32 EffectIndex,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetEffectState)(
        IXAudio2SubmixVoice *This,
        UINT32 EffectIndex,
        WINBOOL *pEnabled);

    HRESULT (STDMETHODCALLTYPE *SetEffectParameters)(
        IXAudio2SubmixVoice *This,
        UINT32 EffectIndex,
        const void *pParameters,
        UINT32 ParametersByteSize,
        UINT32 OperationSet);

    HRESULT (STDMETHODCALLTYPE *GetEffectParameters)(
        IXAudio2SubmixVoice *This,
        UINT32 EffectIndex,
        void *pParameters,
        UINT32 ParametersByteSize);

    HRESULT (STDMETHODCALLTYPE *SetFilterParameters)(
        IXAudio2SubmixVoice *This,
        const XAUDIO2_FILTER_PARAMETERS *pParameters,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetFilterParameters)(
        IXAudio2SubmixVoice *This,
        XAUDIO2_FILTER_PARAMETERS *pParameters);

    HRESULT (STDMETHODCALLTYPE *SetOutputFilterParameters)(
        IXAudio2SubmixVoice *This,
        IXAudio2Voice *pDestinationVoice,
        const XAUDIO2_FILTER_PARAMETERS *pParameters,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetOutputFilterParameters)(
        IXAudio2SubmixVoice *This,
        IXAudio2Voice *pDestinationVoice,
        XAUDIO2_FILTER_PARAMETERS *pParameters);

    HRESULT (STDMETHODCALLTYPE *SetVolume)(
        IXAudio2SubmixVoice *This,
        float Volume,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetVolume)(
        IXAudio2SubmixVoice *This,
        float *pVolume);

    HRESULT (STDMETHODCALLTYPE *SetChannelVolumes)(
        IXAudio2SubmixVoice *This,
        UINT32 Channels,
        const float *pVolumes,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetChannelVolumes)(
        IXAudio2SubmixVoice *This,
        UINT32 Channels,
        float *pVolumes);

    HRESULT (STDMETHODCALLTYPE *SetOutputMatrix)(
        IXAudio2SubmixVoice *This,
        IXAudio2Voice *pDestinationVoice,
        UINT32 SourceChannels,
        UINT32 DestinationChannels,
        const float *pLevelMatrix,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetOutputMatrix)(
        IXAudio2SubmixVoice *This,
        IXAudio2Voice *pDestinationVoice,
        UINT32 SourceChannels,
        UINT32 DestinationChannels,
        float *pLevelMatrix);

    void (STDMETHODCALLTYPE *DestroyVoice)(
        IXAudio2SubmixVoice *This);

    END_INTERFACE
} IXAudio2SubmixVoiceVtbl;

interface IXAudio2SubmixVoice {
    CONST_VTBL IXAudio2SubmixVoiceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IXAudio2Voice methods ***/
#define IXAudio2SubmixVoice_GetVoiceDetails(This,pVoiceDetails) (This)->lpVtbl->GetVoiceDetails(This,pVoiceDetails)
#define IXAudio2SubmixVoice_SetOutputVoices(This,pSendList) (This)->lpVtbl->SetOutputVoices(This,pSendList)
#define IXAudio2SubmixVoice_SetEffectChain(This,pEffectChain) (This)->lpVtbl->SetEffectChain(This,pEffectChain)
#define IXAudio2SubmixVoice_EnableEffect(This,EffectIndex,OperationSet) (This)->lpVtbl->EnableEffect(This,EffectIndex,OperationSet)
#define IXAudio2SubmixVoice_DisableEffect(This,EffectIndex,OperationSet) (This)->lpVtbl->DisableEffect(This,EffectIndex,OperationSet)
#define IXAudio2SubmixVoice_GetEffectState(This,EffectIndex,pEnabled) (This)->lpVtbl->GetEffectState(This,EffectIndex,pEnabled)
#define IXAudio2SubmixVoice_SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet) (This)->lpVtbl->SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet)
#define IXAudio2SubmixVoice_GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize) (This)->lpVtbl->GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize)
#define IXAudio2SubmixVoice_SetFilterParameters(This,pParameters,OperationSet) (This)->lpVtbl->SetFilterParameters(This,pParameters,OperationSet)
#define IXAudio2SubmixVoice_GetFilterParameters(This,pParameters) (This)->lpVtbl->GetFilterParameters(This,pParameters)
#define IXAudio2SubmixVoice_SetOutputFilterParameters(This,pDestinationVoice,pParameters,OperationSet) (This)->lpVtbl->SetOutputFilterParameters(This,pDestinationVoice,pParameters,OperationSet)
#define IXAudio2SubmixVoice_GetOutputFilterParameters(This,pDestinationVoice,pParameters) (This)->lpVtbl->GetOutputFilterParameters(This,pDestinationVoice,pParameters)
#define IXAudio2SubmixVoice_SetVolume(This,Volume,OperationSet) (This)->lpVtbl->SetVolume(This,Volume,OperationSet)
#define IXAudio2SubmixVoice_GetVolume(This,pVolume) (This)->lpVtbl->GetVolume(This,pVolume)
#define IXAudio2SubmixVoice_SetChannelVolumes(This,Channels,pVolumes,OperationSet) (This)->lpVtbl->SetChannelVolumes(This,Channels,pVolumes,OperationSet)
#define IXAudio2SubmixVoice_GetChannelVolumes(This,Channels,pVolumes) (This)->lpVtbl->GetChannelVolumes(This,Channels,pVolumes)
#define IXAudio2SubmixVoice_SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet) (This)->lpVtbl->SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet)
#define IXAudio2SubmixVoice_GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix) (This)->lpVtbl->GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix)
#define IXAudio2SubmixVoice_DestroyVoice(This) (This)->lpVtbl->DestroyVoice(This)
#else
/*** IXAudio2Voice methods ***/
static FORCEINLINE void IXAudio2SubmixVoice_GetVoiceDetails(IXAudio2SubmixVoice* This,XAUDIO2_VOICE_DETAILS *pVoiceDetails) {
    This->lpVtbl->GetVoiceDetails(This,pVoiceDetails);
}
static FORCEINLINE HRESULT IXAudio2SubmixVoice_SetOutputVoices(IXAudio2SubmixVoice* This,const XAUDIO2_VOICE_SENDS *pSendList) {
    return This->lpVtbl->SetOutputVoices(This,pSendList);
}
static FORCEINLINE HRESULT IXAudio2SubmixVoice_SetEffectChain(IXAudio2SubmixVoice* This,const XAUDIO2_EFFECT_CHAIN *pEffectChain) {
    return This->lpVtbl->SetEffectChain(This,pEffectChain);
}
static FORCEINLINE HRESULT IXAudio2SubmixVoice_EnableEffect(IXAudio2SubmixVoice* This,UINT32 EffectIndex,UINT32 OperationSet) {
    return This->lpVtbl->EnableEffect(This,EffectIndex,OperationSet);
}
static FORCEINLINE HRESULT IXAudio2SubmixVoice_DisableEffect(IXAudio2SubmixVoice* This,UINT32 EffectIndex,UINT32 OperationSet) {
    return This->lpVtbl->DisableEffect(This,EffectIndex,OperationSet);
}
static FORCEINLINE void IXAudio2SubmixVoice_GetEffectState(IXAudio2SubmixVoice* This,UINT32 EffectIndex,WINBOOL *pEnabled) {
    This->lpVtbl->GetEffectState(This,EffectIndex,pEnabled);
}
static FORCEINLINE HRESULT IXAudio2SubmixVoice_SetEffectParameters(IXAudio2SubmixVoice* This,UINT32 EffectIndex,const void *pParameters,UINT32 ParametersByteSize,UINT32 OperationSet) {
    return This->lpVtbl->SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet);
}
static FORCEINLINE HRESULT IXAudio2SubmixVoice_GetEffectParameters(IXAudio2SubmixVoice* This,UINT32 EffectIndex,void *pParameters,UINT32 ParametersByteSize) {
    return This->lpVtbl->GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize);
}
static FORCEINLINE HRESULT IXAudio2SubmixVoice_SetFilterParameters(IXAudio2SubmixVoice* This,const XAUDIO2_FILTER_PARAMETERS *pParameters,UINT32 OperationSet) {
    return This->lpVtbl->SetFilterParameters(This,pParameters,OperationSet);
}
static FORCEINLINE void IXAudio2SubmixVoice_GetFilterParameters(IXAudio2SubmixVoice* This,XAUDIO2_FILTER_PARAMETERS *pParameters) {
    This->lpVtbl->GetFilterParameters(This,pParameters);
}
static FORCEINLINE HRESULT IXAudio2SubmixVoice_SetOutputFilterParameters(IXAudio2SubmixVoice* This,IXAudio2Voice *pDestinationVoice,const XAUDIO2_FILTER_PARAMETERS *pParameters,UINT32 OperationSet) {
    return This->lpVtbl->SetOutputFilterParameters(This,pDestinationVoice,pParameters,OperationSet);
}
static FORCEINLINE void IXAudio2SubmixVoice_GetOutputFilterParameters(IXAudio2SubmixVoice* This,IXAudio2Voice *pDestinationVoice,XAUDIO2_FILTER_PARAMETERS *pParameters) {
    This->lpVtbl->GetOutputFilterParameters(This,pDestinationVoice,pParameters);
}
static FORCEINLINE HRESULT IXAudio2SubmixVoice_SetVolume(IXAudio2SubmixVoice* This,float Volume,UINT32 OperationSet) {
    return This->lpVtbl->SetVolume(This,Volume,OperationSet);
}
static FORCEINLINE void IXAudio2SubmixVoice_GetVolume(IXAudio2SubmixVoice* This,float *pVolume) {
    This->lpVtbl->GetVolume(This,pVolume);
}
static FORCEINLINE HRESULT IXAudio2SubmixVoice_SetChannelVolumes(IXAudio2SubmixVoice* This,UINT32 Channels,const float *pVolumes,UINT32 OperationSet) {
    return This->lpVtbl->SetChannelVolumes(This,Channels,pVolumes,OperationSet);
}
static FORCEINLINE void IXAudio2SubmixVoice_GetChannelVolumes(IXAudio2SubmixVoice* This,UINT32 Channels,float *pVolumes) {
    This->lpVtbl->GetChannelVolumes(This,Channels,pVolumes);
}
static FORCEINLINE HRESULT IXAudio2SubmixVoice_SetOutputMatrix(IXAudio2SubmixVoice* This,IXAudio2Voice *pDestinationVoice,UINT32 SourceChannels,UINT32 DestinationChannels,const float *pLevelMatrix,UINT32 OperationSet) {
    return This->lpVtbl->SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet);
}
static FORCEINLINE void IXAudio2SubmixVoice_GetOutputMatrix(IXAudio2SubmixVoice* This,IXAudio2Voice *pDestinationVoice,UINT32 SourceChannels,UINT32 DestinationChannels,float *pLevelMatrix) {
    This->lpVtbl->GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix);
}
static FORCEINLINE void IXAudio2SubmixVoice_DestroyVoice(IXAudio2SubmixVoice* This) {
    This->lpVtbl->DestroyVoice(This);
}
#endif
#endif

#endif


#endif  /* __IXAudio2SubmixVoice_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXAudio20MasteringVoice interface
 */
#ifndef __IXAudio20MasteringVoice_INTERFACE_DEFINED__
#define __IXAudio20MasteringVoice_INTERFACE_DEFINED__

#if defined(__cplusplus) && !defined(CINTERFACE)
interface IXAudio20MasteringVoice : public IXAudio20Voice
{
};
#else
typedef struct IXAudio20MasteringVoiceVtbl {
    BEGIN_INTERFACE

    /*** IXAudio20Voice methods ***/
    void (STDMETHODCALLTYPE *GetVoiceDetails)(
        IXAudio20MasteringVoice *This,
        XAUDIO27_VOICE_DETAILS *pVoiceDetails);

    HRESULT (STDMETHODCALLTYPE *SetOutputVoices)(
        IXAudio20MasteringVoice *This,
        const XAUDIO23_VOICE_SENDS *pSendList);

    HRESULT (STDMETHODCALLTYPE *SetEffectChain)(
        IXAudio20MasteringVoice *This,
        const XAUDIO2_EFFECT_CHAIN *pEffectChain);

    HRESULT (STDMETHODCALLTYPE *EnableEffect)(
        IXAudio20MasteringVoice *This,
        UINT32 EffectIndex,
        UINT32 OperationSet);

    HRESULT (STDMETHODCALLTYPE *DisableEffect)(
        IXAudio20MasteringVoice *This,
        UINT32 EffectIndex,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetEffectState)(
        IXAudio20MasteringVoice *This,
        UINT32 EffectIndex,
        WINBOOL *pEnabled);

    HRESULT (STDMETHODCALLTYPE *SetEffectParameters)(
        IXAudio20MasteringVoice *This,
        UINT32 EffectIndex,
        const void *pParameters,
        UINT32 ParametersByteSize,
        UINT32 OperationSet);

    HRESULT (STDMETHODCALLTYPE *GetEffectParameters)(
        IXAudio20MasteringVoice *This,
        UINT32 EffectIndex,
        void *pParameters,
        UINT32 ParametersByteSize);

    HRESULT (STDMETHODCALLTYPE *SetFilterParameters)(
        IXAudio20MasteringVoice *This,
        const XAUDIO2_FILTER_PARAMETERS *pParameters,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetFilterParameters)(
        IXAudio20MasteringVoice *This,
        XAUDIO2_FILTER_PARAMETERS *pParameters);

    HRESULT (STDMETHODCALLTYPE *SetVolume)(
        IXAudio20MasteringVoice *This,
        float Volume,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetVolume)(
        IXAudio20MasteringVoice *This,
        float *pVolume);

    HRESULT (STDMETHODCALLTYPE *SetChannelVolumes)(
        IXAudio20MasteringVoice *This,
        UINT32 Channels,
        const float *pVolumes,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetChannelVolumes)(
        IXAudio20MasteringVoice *This,
        UINT32 Channels,
        float *pVolumes);

    HRESULT (STDMETHODCALLTYPE *SetOutputMatrix)(
        IXAudio20MasteringVoice *This,
        IXAudio2Voice *pDestinationVoice,
        UINT32 SourceChannels,
        UINT32 DestinationChannels,
        const float *pLevelMatrix,
        UINT32 OperationSet);

    HRESULT (STDMETHODCALLTYPE *GetOutputMatrix)(
        IXAudio20MasteringVoice *This,
        IXAudio2Voice *pDestinationVoice,
        UINT32 SourceChannels,
        UINT32 DestinationChannels,
        float *pLevelMatrix);

    void (STDMETHODCALLTYPE *DestroyVoice)(
        IXAudio20MasteringVoice *This);

    END_INTERFACE
} IXAudio20MasteringVoiceVtbl;

interface IXAudio20MasteringVoice {
    CONST_VTBL IXAudio20MasteringVoiceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IXAudio20Voice methods ***/
#define IXAudio20MasteringVoice_GetVoiceDetails(This,pVoiceDetails) (This)->lpVtbl->GetVoiceDetails(This,pVoiceDetails)
#define IXAudio20MasteringVoice_SetOutputVoices(This,pSendList) (This)->lpVtbl->SetOutputVoices(This,pSendList)
#define IXAudio20MasteringVoice_SetEffectChain(This,pEffectChain) (This)->lpVtbl->SetEffectChain(This,pEffectChain)
#define IXAudio20MasteringVoice_EnableEffect(This,EffectIndex,OperationSet) (This)->lpVtbl->EnableEffect(This,EffectIndex,OperationSet)
#define IXAudio20MasteringVoice_DisableEffect(This,EffectIndex,OperationSet) (This)->lpVtbl->DisableEffect(This,EffectIndex,OperationSet)
#define IXAudio20MasteringVoice_GetEffectState(This,EffectIndex,pEnabled) (This)->lpVtbl->GetEffectState(This,EffectIndex,pEnabled)
#define IXAudio20MasteringVoice_SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet) (This)->lpVtbl->SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet)
#define IXAudio20MasteringVoice_GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize) (This)->lpVtbl->GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize)
#define IXAudio20MasteringVoice_SetFilterParameters(This,pParameters,OperationSet) (This)->lpVtbl->SetFilterParameters(This,pParameters,OperationSet)
#define IXAudio20MasteringVoice_GetFilterParameters(This,pParameters) (This)->lpVtbl->GetFilterParameters(This,pParameters)
#define IXAudio20MasteringVoice_SetVolume(This,Volume,OperationSet) (This)->lpVtbl->SetVolume(This,Volume,OperationSet)
#define IXAudio20MasteringVoice_GetVolume(This,pVolume) (This)->lpVtbl->GetVolume(This,pVolume)
#define IXAudio20MasteringVoice_SetChannelVolumes(This,Channels,pVolumes,OperationSet) (This)->lpVtbl->SetChannelVolumes(This,Channels,pVolumes,OperationSet)
#define IXAudio20MasteringVoice_GetChannelVolumes(This,Channels,pVolumes) (This)->lpVtbl->GetChannelVolumes(This,Channels,pVolumes)
#define IXAudio20MasteringVoice_SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet) (This)->lpVtbl->SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet)
#define IXAudio20MasteringVoice_GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix) (This)->lpVtbl->GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix)
#define IXAudio20MasteringVoice_DestroyVoice(This) (This)->lpVtbl->DestroyVoice(This)
#else
/*** IXAudio20Voice methods ***/
static FORCEINLINE void IXAudio20MasteringVoice_GetVoiceDetails(IXAudio20MasteringVoice* This,XAUDIO27_VOICE_DETAILS *pVoiceDetails) {
    This->lpVtbl->GetVoiceDetails(This,pVoiceDetails);
}
static FORCEINLINE HRESULT IXAudio20MasteringVoice_SetOutputVoices(IXAudio20MasteringVoice* This,const XAUDIO23_VOICE_SENDS *pSendList) {
    return This->lpVtbl->SetOutputVoices(This,pSendList);
}
static FORCEINLINE HRESULT IXAudio20MasteringVoice_SetEffectChain(IXAudio20MasteringVoice* This,const XAUDIO2_EFFECT_CHAIN *pEffectChain) {
    return This->lpVtbl->SetEffectChain(This,pEffectChain);
}
static FORCEINLINE HRESULT IXAudio20MasteringVoice_EnableEffect(IXAudio20MasteringVoice* This,UINT32 EffectIndex,UINT32 OperationSet) {
    return This->lpVtbl->EnableEffect(This,EffectIndex,OperationSet);
}
static FORCEINLINE HRESULT IXAudio20MasteringVoice_DisableEffect(IXAudio20MasteringVoice* This,UINT32 EffectIndex,UINT32 OperationSet) {
    return This->lpVtbl->DisableEffect(This,EffectIndex,OperationSet);
}
static FORCEINLINE void IXAudio20MasteringVoice_GetEffectState(IXAudio20MasteringVoice* This,UINT32 EffectIndex,WINBOOL *pEnabled) {
    This->lpVtbl->GetEffectState(This,EffectIndex,pEnabled);
}
static FORCEINLINE HRESULT IXAudio20MasteringVoice_SetEffectParameters(IXAudio20MasteringVoice* This,UINT32 EffectIndex,const void *pParameters,UINT32 ParametersByteSize,UINT32 OperationSet) {
    return This->lpVtbl->SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet);
}
static FORCEINLINE HRESULT IXAudio20MasteringVoice_GetEffectParameters(IXAudio20MasteringVoice* This,UINT32 EffectIndex,void *pParameters,UINT32 ParametersByteSize) {
    return This->lpVtbl->GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize);
}
static FORCEINLINE HRESULT IXAudio20MasteringVoice_SetFilterParameters(IXAudio20MasteringVoice* This,const XAUDIO2_FILTER_PARAMETERS *pParameters,UINT32 OperationSet) {
    return This->lpVtbl->SetFilterParameters(This,pParameters,OperationSet);
}
static FORCEINLINE void IXAudio20MasteringVoice_GetFilterParameters(IXAudio20MasteringVoice* This,XAUDIO2_FILTER_PARAMETERS *pParameters) {
    This->lpVtbl->GetFilterParameters(This,pParameters);
}
static FORCEINLINE HRESULT IXAudio20MasteringVoice_SetVolume(IXAudio20MasteringVoice* This,float Volume,UINT32 OperationSet) {
    return This->lpVtbl->SetVolume(This,Volume,OperationSet);
}
static FORCEINLINE void IXAudio20MasteringVoice_GetVolume(IXAudio20MasteringVoice* This,float *pVolume) {
    This->lpVtbl->GetVolume(This,pVolume);
}
static FORCEINLINE HRESULT IXAudio20MasteringVoice_SetChannelVolumes(IXAudio20MasteringVoice* This,UINT32 Channels,const float *pVolumes,UINT32 OperationSet) {
    return This->lpVtbl->SetChannelVolumes(This,Channels,pVolumes,OperationSet);
}
static FORCEINLINE void IXAudio20MasteringVoice_GetChannelVolumes(IXAudio20MasteringVoice* This,UINT32 Channels,float *pVolumes) {
    This->lpVtbl->GetChannelVolumes(This,Channels,pVolumes);
}
static FORCEINLINE HRESULT IXAudio20MasteringVoice_SetOutputMatrix(IXAudio20MasteringVoice* This,IXAudio2Voice *pDestinationVoice,UINT32 SourceChannels,UINT32 DestinationChannels,const float *pLevelMatrix,UINT32 OperationSet) {
    return This->lpVtbl->SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet);
}
static FORCEINLINE HRESULT IXAudio20MasteringVoice_GetOutputMatrix(IXAudio20MasteringVoice* This,IXAudio2Voice *pDestinationVoice,UINT32 SourceChannels,UINT32 DestinationChannels,float *pLevelMatrix) {
    return This->lpVtbl->GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix);
}
static FORCEINLINE void IXAudio20MasteringVoice_DestroyVoice(IXAudio20MasteringVoice* This) {
    This->lpVtbl->DestroyVoice(This);
}
#endif
#endif

#endif


#endif  /* __IXAudio20MasteringVoice_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXAudio23MasteringVoice interface
 */
#ifndef __IXAudio23MasteringVoice_INTERFACE_DEFINED__
#define __IXAudio23MasteringVoice_INTERFACE_DEFINED__

#if defined(__cplusplus) && !defined(CINTERFACE)
interface IXAudio23MasteringVoice : public IXAudio23Voice
{
};
#else
typedef struct IXAudio23MasteringVoiceVtbl {
    BEGIN_INTERFACE

    /*** IXAudio23Voice methods ***/
    void (STDMETHODCALLTYPE *GetVoiceDetails)(
        IXAudio23MasteringVoice *This,
        XAUDIO27_VOICE_DETAILS *pVoiceDetails);

    HRESULT (STDMETHODCALLTYPE *SetOutputVoices)(
        IXAudio23MasteringVoice *This,
        const XAUDIO23_VOICE_SENDS *pSendList);

    HRESULT (STDMETHODCALLTYPE *SetEffectChain)(
        IXAudio23MasteringVoice *This,
        const XAUDIO2_EFFECT_CHAIN *pEffectChain);

    HRESULT (STDMETHODCALLTYPE *EnableEffect)(
        IXAudio23MasteringVoice *This,
        UINT32 EffectIndex,
        UINT32 OperationSet);

    HRESULT (STDMETHODCALLTYPE *DisableEffect)(
        IXAudio23MasteringVoice *This,
        UINT32 EffectIndex,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetEffectState)(
        IXAudio23MasteringVoice *This,
        UINT32 EffectIndex,
        WINBOOL *pEnabled);

    HRESULT (STDMETHODCALLTYPE *SetEffectParameters)(
        IXAudio23MasteringVoice *This,
        UINT32 EffectIndex,
        const void *pParameters,
        UINT32 ParametersByteSize,
        UINT32 OperationSet);

    HRESULT (STDMETHODCALLTYPE *GetEffectParameters)(
        IXAudio23MasteringVoice *This,
        UINT32 EffectIndex,
        void *pParameters,
        UINT32 ParametersByteSize);

    HRESULT (STDMETHODCALLTYPE *SetFilterParameters)(
        IXAudio23MasteringVoice *This,
        const XAUDIO2_FILTER_PARAMETERS *pParameters,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetFilterParameters)(
        IXAudio23MasteringVoice *This,
        XAUDIO2_FILTER_PARAMETERS *pParameters);

    HRESULT (STDMETHODCALLTYPE *SetVolume)(
        IXAudio23MasteringVoice *This,
        float Volume,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetVolume)(
        IXAudio23MasteringVoice *This,
        float *pVolume);

    HRESULT (STDMETHODCALLTYPE *SetChannelVolumes)(
        IXAudio23MasteringVoice *This,
        UINT32 Channels,
        const float *pVolumes,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetChannelVolumes)(
        IXAudio23MasteringVoice *This,
        UINT32 Channels,
        float *pVolumes);

    HRESULT (STDMETHODCALLTYPE *SetOutputMatrix)(
        IXAudio23MasteringVoice *This,
        IXAudio2Voice *pDestinationVoice,
        UINT32 SourceChannels,
        UINT32 DestinationChannels,
        const float *pLevelMatrix,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetOutputMatrix)(
        IXAudio23MasteringVoice *This,
        IXAudio2Voice *pDestinationVoice,
        UINT32 SourceChannels,
        UINT32 DestinationChannels,
        float *pLevelMatrix);

    void (STDMETHODCALLTYPE *DestroyVoice)(
        IXAudio23MasteringVoice *This);

    END_INTERFACE
} IXAudio23MasteringVoiceVtbl;

interface IXAudio23MasteringVoice {
    CONST_VTBL IXAudio23MasteringVoiceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IXAudio23Voice methods ***/
#define IXAudio23MasteringVoice_GetVoiceDetails(This,pVoiceDetails) (This)->lpVtbl->GetVoiceDetails(This,pVoiceDetails)
#define IXAudio23MasteringVoice_SetOutputVoices(This,pSendList) (This)->lpVtbl->SetOutputVoices(This,pSendList)
#define IXAudio23MasteringVoice_SetEffectChain(This,pEffectChain) (This)->lpVtbl->SetEffectChain(This,pEffectChain)
#define IXAudio23MasteringVoice_EnableEffect(This,EffectIndex,OperationSet) (This)->lpVtbl->EnableEffect(This,EffectIndex,OperationSet)
#define IXAudio23MasteringVoice_DisableEffect(This,EffectIndex,OperationSet) (This)->lpVtbl->DisableEffect(This,EffectIndex,OperationSet)
#define IXAudio23MasteringVoice_GetEffectState(This,EffectIndex,pEnabled) (This)->lpVtbl->GetEffectState(This,EffectIndex,pEnabled)
#define IXAudio23MasteringVoice_SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet) (This)->lpVtbl->SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet)
#define IXAudio23MasteringVoice_GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize) (This)->lpVtbl->GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize)
#define IXAudio23MasteringVoice_SetFilterParameters(This,pParameters,OperationSet) (This)->lpVtbl->SetFilterParameters(This,pParameters,OperationSet)
#define IXAudio23MasteringVoice_GetFilterParameters(This,pParameters) (This)->lpVtbl->GetFilterParameters(This,pParameters)
#define IXAudio23MasteringVoice_SetVolume(This,Volume,OperationSet) (This)->lpVtbl->SetVolume(This,Volume,OperationSet)
#define IXAudio23MasteringVoice_GetVolume(This,pVolume) (This)->lpVtbl->GetVolume(This,pVolume)
#define IXAudio23MasteringVoice_SetChannelVolumes(This,Channels,pVolumes,OperationSet) (This)->lpVtbl->SetChannelVolumes(This,Channels,pVolumes,OperationSet)
#define IXAudio23MasteringVoice_GetChannelVolumes(This,Channels,pVolumes) (This)->lpVtbl->GetChannelVolumes(This,Channels,pVolumes)
#define IXAudio23MasteringVoice_SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet) (This)->lpVtbl->SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet)
#define IXAudio23MasteringVoice_GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix) (This)->lpVtbl->GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix)
#define IXAudio23MasteringVoice_DestroyVoice(This) (This)->lpVtbl->DestroyVoice(This)
#else
/*** IXAudio23Voice methods ***/
static FORCEINLINE void IXAudio23MasteringVoice_GetVoiceDetails(IXAudio23MasteringVoice* This,XAUDIO27_VOICE_DETAILS *pVoiceDetails) {
    This->lpVtbl->GetVoiceDetails(This,pVoiceDetails);
}
static FORCEINLINE HRESULT IXAudio23MasteringVoice_SetOutputVoices(IXAudio23MasteringVoice* This,const XAUDIO23_VOICE_SENDS *pSendList) {
    return This->lpVtbl->SetOutputVoices(This,pSendList);
}
static FORCEINLINE HRESULT IXAudio23MasteringVoice_SetEffectChain(IXAudio23MasteringVoice* This,const XAUDIO2_EFFECT_CHAIN *pEffectChain) {
    return This->lpVtbl->SetEffectChain(This,pEffectChain);
}
static FORCEINLINE HRESULT IXAudio23MasteringVoice_EnableEffect(IXAudio23MasteringVoice* This,UINT32 EffectIndex,UINT32 OperationSet) {
    return This->lpVtbl->EnableEffect(This,EffectIndex,OperationSet);
}
static FORCEINLINE HRESULT IXAudio23MasteringVoice_DisableEffect(IXAudio23MasteringVoice* This,UINT32 EffectIndex,UINT32 OperationSet) {
    return This->lpVtbl->DisableEffect(This,EffectIndex,OperationSet);
}
static FORCEINLINE void IXAudio23MasteringVoice_GetEffectState(IXAudio23MasteringVoice* This,UINT32 EffectIndex,WINBOOL *pEnabled) {
    This->lpVtbl->GetEffectState(This,EffectIndex,pEnabled);
}
static FORCEINLINE HRESULT IXAudio23MasteringVoice_SetEffectParameters(IXAudio23MasteringVoice* This,UINT32 EffectIndex,const void *pParameters,UINT32 ParametersByteSize,UINT32 OperationSet) {
    return This->lpVtbl->SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet);
}
static FORCEINLINE HRESULT IXAudio23MasteringVoice_GetEffectParameters(IXAudio23MasteringVoice* This,UINT32 EffectIndex,void *pParameters,UINT32 ParametersByteSize) {
    return This->lpVtbl->GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize);
}
static FORCEINLINE HRESULT IXAudio23MasteringVoice_SetFilterParameters(IXAudio23MasteringVoice* This,const XAUDIO2_FILTER_PARAMETERS *pParameters,UINT32 OperationSet) {
    return This->lpVtbl->SetFilterParameters(This,pParameters,OperationSet);
}
static FORCEINLINE void IXAudio23MasteringVoice_GetFilterParameters(IXAudio23MasteringVoice* This,XAUDIO2_FILTER_PARAMETERS *pParameters) {
    This->lpVtbl->GetFilterParameters(This,pParameters);
}
static FORCEINLINE HRESULT IXAudio23MasteringVoice_SetVolume(IXAudio23MasteringVoice* This,float Volume,UINT32 OperationSet) {
    return This->lpVtbl->SetVolume(This,Volume,OperationSet);
}
static FORCEINLINE void IXAudio23MasteringVoice_GetVolume(IXAudio23MasteringVoice* This,float *pVolume) {
    This->lpVtbl->GetVolume(This,pVolume);
}
static FORCEINLINE HRESULT IXAudio23MasteringVoice_SetChannelVolumes(IXAudio23MasteringVoice* This,UINT32 Channels,const float *pVolumes,UINT32 OperationSet) {
    return This->lpVtbl->SetChannelVolumes(This,Channels,pVolumes,OperationSet);
}
static FORCEINLINE void IXAudio23MasteringVoice_GetChannelVolumes(IXAudio23MasteringVoice* This,UINT32 Channels,float *pVolumes) {
    This->lpVtbl->GetChannelVolumes(This,Channels,pVolumes);
}
static FORCEINLINE HRESULT IXAudio23MasteringVoice_SetOutputMatrix(IXAudio23MasteringVoice* This,IXAudio2Voice *pDestinationVoice,UINT32 SourceChannels,UINT32 DestinationChannels,const float *pLevelMatrix,UINT32 OperationSet) {
    return This->lpVtbl->SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet);
}
static FORCEINLINE void IXAudio23MasteringVoice_GetOutputMatrix(IXAudio23MasteringVoice* This,IXAudio2Voice *pDestinationVoice,UINT32 SourceChannels,UINT32 DestinationChannels,float *pLevelMatrix) {
    This->lpVtbl->GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix);
}
static FORCEINLINE void IXAudio23MasteringVoice_DestroyVoice(IXAudio23MasteringVoice* This) {
    This->lpVtbl->DestroyVoice(This);
}
#endif
#endif

#endif


#endif  /* __IXAudio23MasteringVoice_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXAudio27MasteringVoice interface
 */
#ifndef __IXAudio27MasteringVoice_INTERFACE_DEFINED__
#define __IXAudio27MasteringVoice_INTERFACE_DEFINED__

#if defined(__cplusplus) && !defined(CINTERFACE)
interface IXAudio27MasteringVoice : public IXAudio27Voice
{
};
#else
typedef struct IXAudio27MasteringVoiceVtbl {
    BEGIN_INTERFACE

    /*** IXAudio27Voice methods ***/
    void (STDMETHODCALLTYPE *GetVoiceDetails)(
        IXAudio27MasteringVoice *This,
        XAUDIO27_VOICE_DETAILS *pVoiceDetails);

    HRESULT (STDMETHODCALLTYPE *SetOutputVoices)(
        IXAudio27MasteringVoice *This,
        const XAUDIO2_VOICE_SENDS *pSendList);

    HRESULT (STDMETHODCALLTYPE *SetEffectChain)(
        IXAudio27MasteringVoice *This,
        const XAUDIO2_EFFECT_CHAIN *pEffectChain);

    HRESULT (STDMETHODCALLTYPE *EnableEffect)(
        IXAudio27MasteringVoice *This,
        UINT32 EffectIndex,
        UINT32 OperationSet);

    HRESULT (STDMETHODCALLTYPE *DisableEffect)(
        IXAudio27MasteringVoice *This,
        UINT32 EffectIndex,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetEffectState)(
        IXAudio27MasteringVoice *This,
        UINT32 EffectIndex,
        WINBOOL *pEnabled);

    HRESULT (STDMETHODCALLTYPE *SetEffectParameters)(
        IXAudio27MasteringVoice *This,
        UINT32 EffectIndex,
        const void *pParameters,
        UINT32 ParametersByteSize,
        UINT32 OperationSet);

    HRESULT (STDMETHODCALLTYPE *GetEffectParameters)(
        IXAudio27MasteringVoice *This,
        UINT32 EffectIndex,
        void *pParameters,
        UINT32 ParametersByteSize);

    HRESULT (STDMETHODCALLTYPE *SetFilterParameters)(
        IXAudio27MasteringVoice *This,
        const XAUDIO2_FILTER_PARAMETERS *pParameters,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetFilterParameters)(
        IXAudio27MasteringVoice *This,
        XAUDIO2_FILTER_PARAMETERS *pParameters);

    HRESULT (STDMETHODCALLTYPE *SetOutputFilterParameters)(
        IXAudio27MasteringVoice *This,
        IXAudio2Voice *pDestinationVoice,
        const XAUDIO2_FILTER_PARAMETERS *pParameters,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetOutputFilterParameters)(
        IXAudio27MasteringVoice *This,
        IXAudio2Voice *pDestinationVoice,
        XAUDIO2_FILTER_PARAMETERS *pParameters);

    HRESULT (STDMETHODCALLTYPE *SetVolume)(
        IXAudio27MasteringVoice *This,
        float Volume,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetVolume)(
        IXAudio27MasteringVoice *This,
        float *pVolume);

    HRESULT (STDMETHODCALLTYPE *SetChannelVolumes)(
        IXAudio27MasteringVoice *This,
        UINT32 Channels,
        const float *pVolumes,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetChannelVolumes)(
        IXAudio27MasteringVoice *This,
        UINT32 Channels,
        float *pVolumes);

    HRESULT (STDMETHODCALLTYPE *SetOutputMatrix)(
        IXAudio27MasteringVoice *This,
        IXAudio2Voice *pDestinationVoice,
        UINT32 SourceChannels,
        UINT32 DestinationChannels,
        const float *pLevelMatrix,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetOutputMatrix)(
        IXAudio27MasteringVoice *This,
        IXAudio2Voice *pDestinationVoice,
        UINT32 SourceChannels,
        UINT32 DestinationChannels,
        float *pLevelMatrix);

    void (STDMETHODCALLTYPE *DestroyVoice)(
        IXAudio27MasteringVoice *This);

    END_INTERFACE
} IXAudio27MasteringVoiceVtbl;

interface IXAudio27MasteringVoice {
    CONST_VTBL IXAudio27MasteringVoiceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IXAudio27Voice methods ***/
#define IXAudio27MasteringVoice_GetVoiceDetails(This,pVoiceDetails) (This)->lpVtbl->GetVoiceDetails(This,pVoiceDetails)
#define IXAudio27MasteringVoice_SetOutputVoices(This,pSendList) (This)->lpVtbl->SetOutputVoices(This,pSendList)
#define IXAudio27MasteringVoice_SetEffectChain(This,pEffectChain) (This)->lpVtbl->SetEffectChain(This,pEffectChain)
#define IXAudio27MasteringVoice_EnableEffect(This,EffectIndex,OperationSet) (This)->lpVtbl->EnableEffect(This,EffectIndex,OperationSet)
#define IXAudio27MasteringVoice_DisableEffect(This,EffectIndex,OperationSet) (This)->lpVtbl->DisableEffect(This,EffectIndex,OperationSet)
#define IXAudio27MasteringVoice_GetEffectState(This,EffectIndex,pEnabled) (This)->lpVtbl->GetEffectState(This,EffectIndex,pEnabled)
#define IXAudio27MasteringVoice_SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet) (This)->lpVtbl->SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet)
#define IXAudio27MasteringVoice_GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize) (This)->lpVtbl->GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize)
#define IXAudio27MasteringVoice_SetFilterParameters(This,pParameters,OperationSet) (This)->lpVtbl->SetFilterParameters(This,pParameters,OperationSet)
#define IXAudio27MasteringVoice_GetFilterParameters(This,pParameters) (This)->lpVtbl->GetFilterParameters(This,pParameters)
#define IXAudio27MasteringVoice_SetOutputFilterParameters(This,pDestinationVoice,pParameters,OperationSet) (This)->lpVtbl->SetOutputFilterParameters(This,pDestinationVoice,pParameters,OperationSet)
#define IXAudio27MasteringVoice_GetOutputFilterParameters(This,pDestinationVoice,pParameters) (This)->lpVtbl->GetOutputFilterParameters(This,pDestinationVoice,pParameters)
#define IXAudio27MasteringVoice_SetVolume(This,Volume,OperationSet) (This)->lpVtbl->SetVolume(This,Volume,OperationSet)
#define IXAudio27MasteringVoice_GetVolume(This,pVolume) (This)->lpVtbl->GetVolume(This,pVolume)
#define IXAudio27MasteringVoice_SetChannelVolumes(This,Channels,pVolumes,OperationSet) (This)->lpVtbl->SetChannelVolumes(This,Channels,pVolumes,OperationSet)
#define IXAudio27MasteringVoice_GetChannelVolumes(This,Channels,pVolumes) (This)->lpVtbl->GetChannelVolumes(This,Channels,pVolumes)
#define IXAudio27MasteringVoice_SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet) (This)->lpVtbl->SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet)
#define IXAudio27MasteringVoice_GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix) (This)->lpVtbl->GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix)
#define IXAudio27MasteringVoice_DestroyVoice(This) (This)->lpVtbl->DestroyVoice(This)
#else
/*** IXAudio27Voice methods ***/
static FORCEINLINE void IXAudio27MasteringVoice_GetVoiceDetails(IXAudio27MasteringVoice* This,XAUDIO27_VOICE_DETAILS *pVoiceDetails) {
    This->lpVtbl->GetVoiceDetails(This,pVoiceDetails);
}
static FORCEINLINE HRESULT IXAudio27MasteringVoice_SetOutputVoices(IXAudio27MasteringVoice* This,const XAUDIO2_VOICE_SENDS *pSendList) {
    return This->lpVtbl->SetOutputVoices(This,pSendList);
}
static FORCEINLINE HRESULT IXAudio27MasteringVoice_SetEffectChain(IXAudio27MasteringVoice* This,const XAUDIO2_EFFECT_CHAIN *pEffectChain) {
    return This->lpVtbl->SetEffectChain(This,pEffectChain);
}
static FORCEINLINE HRESULT IXAudio27MasteringVoice_EnableEffect(IXAudio27MasteringVoice* This,UINT32 EffectIndex,UINT32 OperationSet) {
    return This->lpVtbl->EnableEffect(This,EffectIndex,OperationSet);
}
static FORCEINLINE HRESULT IXAudio27MasteringVoice_DisableEffect(IXAudio27MasteringVoice* This,UINT32 EffectIndex,UINT32 OperationSet) {
    return This->lpVtbl->DisableEffect(This,EffectIndex,OperationSet);
}
static FORCEINLINE void IXAudio27MasteringVoice_GetEffectState(IXAudio27MasteringVoice* This,UINT32 EffectIndex,WINBOOL *pEnabled) {
    This->lpVtbl->GetEffectState(This,EffectIndex,pEnabled);
}
static FORCEINLINE HRESULT IXAudio27MasteringVoice_SetEffectParameters(IXAudio27MasteringVoice* This,UINT32 EffectIndex,const void *pParameters,UINT32 ParametersByteSize,UINT32 OperationSet) {
    return This->lpVtbl->SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet);
}
static FORCEINLINE HRESULT IXAudio27MasteringVoice_GetEffectParameters(IXAudio27MasteringVoice* This,UINT32 EffectIndex,void *pParameters,UINT32 ParametersByteSize) {
    return This->lpVtbl->GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize);
}
static FORCEINLINE HRESULT IXAudio27MasteringVoice_SetFilterParameters(IXAudio27MasteringVoice* This,const XAUDIO2_FILTER_PARAMETERS *pParameters,UINT32 OperationSet) {
    return This->lpVtbl->SetFilterParameters(This,pParameters,OperationSet);
}
static FORCEINLINE void IXAudio27MasteringVoice_GetFilterParameters(IXAudio27MasteringVoice* This,XAUDIO2_FILTER_PARAMETERS *pParameters) {
    This->lpVtbl->GetFilterParameters(This,pParameters);
}
static FORCEINLINE HRESULT IXAudio27MasteringVoice_SetOutputFilterParameters(IXAudio27MasteringVoice* This,IXAudio2Voice *pDestinationVoice,const XAUDIO2_FILTER_PARAMETERS *pParameters,UINT32 OperationSet) {
    return This->lpVtbl->SetOutputFilterParameters(This,pDestinationVoice,pParameters,OperationSet);
}
static FORCEINLINE void IXAudio27MasteringVoice_GetOutputFilterParameters(IXAudio27MasteringVoice* This,IXAudio2Voice *pDestinationVoice,XAUDIO2_FILTER_PARAMETERS *pParameters) {
    This->lpVtbl->GetOutputFilterParameters(This,pDestinationVoice,pParameters);
}
static FORCEINLINE HRESULT IXAudio27MasteringVoice_SetVolume(IXAudio27MasteringVoice* This,float Volume,UINT32 OperationSet) {
    return This->lpVtbl->SetVolume(This,Volume,OperationSet);
}
static FORCEINLINE void IXAudio27MasteringVoice_GetVolume(IXAudio27MasteringVoice* This,float *pVolume) {
    This->lpVtbl->GetVolume(This,pVolume);
}
static FORCEINLINE HRESULT IXAudio27MasteringVoice_SetChannelVolumes(IXAudio27MasteringVoice* This,UINT32 Channels,const float *pVolumes,UINT32 OperationSet) {
    return This->lpVtbl->SetChannelVolumes(This,Channels,pVolumes,OperationSet);
}
static FORCEINLINE void IXAudio27MasteringVoice_GetChannelVolumes(IXAudio27MasteringVoice* This,UINT32 Channels,float *pVolumes) {
    This->lpVtbl->GetChannelVolumes(This,Channels,pVolumes);
}
static FORCEINLINE HRESULT IXAudio27MasteringVoice_SetOutputMatrix(IXAudio27MasteringVoice* This,IXAudio2Voice *pDestinationVoice,UINT32 SourceChannels,UINT32 DestinationChannels,const float *pLevelMatrix,UINT32 OperationSet) {
    return This->lpVtbl->SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet);
}
static FORCEINLINE void IXAudio27MasteringVoice_GetOutputMatrix(IXAudio27MasteringVoice* This,IXAudio2Voice *pDestinationVoice,UINT32 SourceChannels,UINT32 DestinationChannels,float *pLevelMatrix) {
    This->lpVtbl->GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix);
}
static FORCEINLINE void IXAudio27MasteringVoice_DestroyVoice(IXAudio27MasteringVoice* This) {
    This->lpVtbl->DestroyVoice(This);
}
#endif
#endif

#endif


#endif  /* __IXAudio27MasteringVoice_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXAudio2MasteringVoice interface
 */
#ifndef __IXAudio2MasteringVoice_INTERFACE_DEFINED__
#define __IXAudio2MasteringVoice_INTERFACE_DEFINED__

#if defined(__cplusplus) && !defined(CINTERFACE)
interface IXAudio2MasteringVoice : public IXAudio2Voice
{
    virtual void STDMETHODCALLTYPE GetChannelMask(
        DWORD *pChannelMask) = 0;

};
#else
typedef struct IXAudio2MasteringVoiceVtbl {
    BEGIN_INTERFACE

    /*** IXAudio2Voice methods ***/
    void (STDMETHODCALLTYPE *GetVoiceDetails)(
        IXAudio2MasteringVoice *This,
        XAUDIO2_VOICE_DETAILS *pVoiceDetails);

    HRESULT (STDMETHODCALLTYPE *SetOutputVoices)(
        IXAudio2MasteringVoice *This,
        const XAUDIO2_VOICE_SENDS *pSendList);

    HRESULT (STDMETHODCALLTYPE *SetEffectChain)(
        IXAudio2MasteringVoice *This,
        const XAUDIO2_EFFECT_CHAIN *pEffectChain);

    HRESULT (STDMETHODCALLTYPE *EnableEffect)(
        IXAudio2MasteringVoice *This,
        UINT32 EffectIndex,
        UINT32 OperationSet);

    HRESULT (STDMETHODCALLTYPE *DisableEffect)(
        IXAudio2MasteringVoice *This,
        UINT32 EffectIndex,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetEffectState)(
        IXAudio2MasteringVoice *This,
        UINT32 EffectIndex,
        WINBOOL *pEnabled);

    HRESULT (STDMETHODCALLTYPE *SetEffectParameters)(
        IXAudio2MasteringVoice *This,
        UINT32 EffectIndex,
        const void *pParameters,
        UINT32 ParametersByteSize,
        UINT32 OperationSet);

    HRESULT (STDMETHODCALLTYPE *GetEffectParameters)(
        IXAudio2MasteringVoice *This,
        UINT32 EffectIndex,
        void *pParameters,
        UINT32 ParametersByteSize);

    HRESULT (STDMETHODCALLTYPE *SetFilterParameters)(
        IXAudio2MasteringVoice *This,
        const XAUDIO2_FILTER_PARAMETERS *pParameters,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetFilterParameters)(
        IXAudio2MasteringVoice *This,
        XAUDIO2_FILTER_PARAMETERS *pParameters);

    HRESULT (STDMETHODCALLTYPE *SetOutputFilterParameters)(
        IXAudio2MasteringVoice *This,
        IXAudio2Voice *pDestinationVoice,
        const XAUDIO2_FILTER_PARAMETERS *pParameters,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetOutputFilterParameters)(
        IXAudio2MasteringVoice *This,
        IXAudio2Voice *pDestinationVoice,
        XAUDIO2_FILTER_PARAMETERS *pParameters);

    HRESULT (STDMETHODCALLTYPE *SetVolume)(
        IXAudio2MasteringVoice *This,
        float Volume,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetVolume)(
        IXAudio2MasteringVoice *This,
        float *pVolume);

    HRESULT (STDMETHODCALLTYPE *SetChannelVolumes)(
        IXAudio2MasteringVoice *This,
        UINT32 Channels,
        const float *pVolumes,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetChannelVolumes)(
        IXAudio2MasteringVoice *This,
        UINT32 Channels,
        float *pVolumes);

    HRESULT (STDMETHODCALLTYPE *SetOutputMatrix)(
        IXAudio2MasteringVoice *This,
        IXAudio2Voice *pDestinationVoice,
        UINT32 SourceChannels,
        UINT32 DestinationChannels,
        const float *pLevelMatrix,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetOutputMatrix)(
        IXAudio2MasteringVoice *This,
        IXAudio2Voice *pDestinationVoice,
        UINT32 SourceChannels,
        UINT32 DestinationChannels,
        float *pLevelMatrix);

    void (STDMETHODCALLTYPE *DestroyVoice)(
        IXAudio2MasteringVoice *This);

    /*** IXAudio2MasteringVoice methods ***/
    void (STDMETHODCALLTYPE *GetChannelMask)(
        IXAudio2MasteringVoice *This,
        DWORD *pChannelMask);

    END_INTERFACE
} IXAudio2MasteringVoiceVtbl;

interface IXAudio2MasteringVoice {
    CONST_VTBL IXAudio2MasteringVoiceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IXAudio2Voice methods ***/
#define IXAudio2MasteringVoice_GetVoiceDetails(This,pVoiceDetails) (This)->lpVtbl->GetVoiceDetails(This,pVoiceDetails)
#define IXAudio2MasteringVoice_SetOutputVoices(This,pSendList) (This)->lpVtbl->SetOutputVoices(This,pSendList)
#define IXAudio2MasteringVoice_SetEffectChain(This,pEffectChain) (This)->lpVtbl->SetEffectChain(This,pEffectChain)
#define IXAudio2MasteringVoice_EnableEffect(This,EffectIndex,OperationSet) (This)->lpVtbl->EnableEffect(This,EffectIndex,OperationSet)
#define IXAudio2MasteringVoice_DisableEffect(This,EffectIndex,OperationSet) (This)->lpVtbl->DisableEffect(This,EffectIndex,OperationSet)
#define IXAudio2MasteringVoice_GetEffectState(This,EffectIndex,pEnabled) (This)->lpVtbl->GetEffectState(This,EffectIndex,pEnabled)
#define IXAudio2MasteringVoice_SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet) (This)->lpVtbl->SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet)
#define IXAudio2MasteringVoice_GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize) (This)->lpVtbl->GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize)
#define IXAudio2MasteringVoice_SetFilterParameters(This,pParameters,OperationSet) (This)->lpVtbl->SetFilterParameters(This,pParameters,OperationSet)
#define IXAudio2MasteringVoice_GetFilterParameters(This,pParameters) (This)->lpVtbl->GetFilterParameters(This,pParameters)
#define IXAudio2MasteringVoice_SetOutputFilterParameters(This,pDestinationVoice,pParameters,OperationSet) (This)->lpVtbl->SetOutputFilterParameters(This,pDestinationVoice,pParameters,OperationSet)
#define IXAudio2MasteringVoice_GetOutputFilterParameters(This,pDestinationVoice,pParameters) (This)->lpVtbl->GetOutputFilterParameters(This,pDestinationVoice,pParameters)
#define IXAudio2MasteringVoice_SetVolume(This,Volume,OperationSet) (This)->lpVtbl->SetVolume(This,Volume,OperationSet)
#define IXAudio2MasteringVoice_GetVolume(This,pVolume) (This)->lpVtbl->GetVolume(This,pVolume)
#define IXAudio2MasteringVoice_SetChannelVolumes(This,Channels,pVolumes,OperationSet) (This)->lpVtbl->SetChannelVolumes(This,Channels,pVolumes,OperationSet)
#define IXAudio2MasteringVoice_GetChannelVolumes(This,Channels,pVolumes) (This)->lpVtbl->GetChannelVolumes(This,Channels,pVolumes)
#define IXAudio2MasteringVoice_SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet) (This)->lpVtbl->SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet)
#define IXAudio2MasteringVoice_GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix) (This)->lpVtbl->GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix)
#define IXAudio2MasteringVoice_DestroyVoice(This) (This)->lpVtbl->DestroyVoice(This)
/*** IXAudio2MasteringVoice methods ***/
#define IXAudio2MasteringVoice_GetChannelMask(This,pChannelMask) (This)->lpVtbl->GetChannelMask(This,pChannelMask)
#else
/*** IXAudio2Voice methods ***/
static FORCEINLINE void IXAudio2MasteringVoice_GetVoiceDetails(IXAudio2MasteringVoice* This,XAUDIO2_VOICE_DETAILS *pVoiceDetails) {
    This->lpVtbl->GetVoiceDetails(This,pVoiceDetails);
}
static FORCEINLINE HRESULT IXAudio2MasteringVoice_SetOutputVoices(IXAudio2MasteringVoice* This,const XAUDIO2_VOICE_SENDS *pSendList) {
    return This->lpVtbl->SetOutputVoices(This,pSendList);
}
static FORCEINLINE HRESULT IXAudio2MasteringVoice_SetEffectChain(IXAudio2MasteringVoice* This,const XAUDIO2_EFFECT_CHAIN *pEffectChain) {
    return This->lpVtbl->SetEffectChain(This,pEffectChain);
}
static FORCEINLINE HRESULT IXAudio2MasteringVoice_EnableEffect(IXAudio2MasteringVoice* This,UINT32 EffectIndex,UINT32 OperationSet) {
    return This->lpVtbl->EnableEffect(This,EffectIndex,OperationSet);
}
static FORCEINLINE HRESULT IXAudio2MasteringVoice_DisableEffect(IXAudio2MasteringVoice* This,UINT32 EffectIndex,UINT32 OperationSet) {
    return This->lpVtbl->DisableEffect(This,EffectIndex,OperationSet);
}
static FORCEINLINE void IXAudio2MasteringVoice_GetEffectState(IXAudio2MasteringVoice* This,UINT32 EffectIndex,WINBOOL *pEnabled) {
    This->lpVtbl->GetEffectState(This,EffectIndex,pEnabled);
}
static FORCEINLINE HRESULT IXAudio2MasteringVoice_SetEffectParameters(IXAudio2MasteringVoice* This,UINT32 EffectIndex,const void *pParameters,UINT32 ParametersByteSize,UINT32 OperationSet) {
    return This->lpVtbl->SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet);
}
static FORCEINLINE HRESULT IXAudio2MasteringVoice_GetEffectParameters(IXAudio2MasteringVoice* This,UINT32 EffectIndex,void *pParameters,UINT32 ParametersByteSize) {
    return This->lpVtbl->GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize);
}
static FORCEINLINE HRESULT IXAudio2MasteringVoice_SetFilterParameters(IXAudio2MasteringVoice* This,const XAUDIO2_FILTER_PARAMETERS *pParameters,UINT32 OperationSet) {
    return This->lpVtbl->SetFilterParameters(This,pParameters,OperationSet);
}
static FORCEINLINE void IXAudio2MasteringVoice_GetFilterParameters(IXAudio2MasteringVoice* This,XAUDIO2_FILTER_PARAMETERS *pParameters) {
    This->lpVtbl->GetFilterParameters(This,pParameters);
}
static FORCEINLINE HRESULT IXAudio2MasteringVoice_SetOutputFilterParameters(IXAudio2MasteringVoice* This,IXAudio2Voice *pDestinationVoice,const XAUDIO2_FILTER_PARAMETERS *pParameters,UINT32 OperationSet) {
    return This->lpVtbl->SetOutputFilterParameters(This,pDestinationVoice,pParameters,OperationSet);
}
static FORCEINLINE void IXAudio2MasteringVoice_GetOutputFilterParameters(IXAudio2MasteringVoice* This,IXAudio2Voice *pDestinationVoice,XAUDIO2_FILTER_PARAMETERS *pParameters) {
    This->lpVtbl->GetOutputFilterParameters(This,pDestinationVoice,pParameters);
}
static FORCEINLINE HRESULT IXAudio2MasteringVoice_SetVolume(IXAudio2MasteringVoice* This,float Volume,UINT32 OperationSet) {
    return This->lpVtbl->SetVolume(This,Volume,OperationSet);
}
static FORCEINLINE void IXAudio2MasteringVoice_GetVolume(IXAudio2MasteringVoice* This,float *pVolume) {
    This->lpVtbl->GetVolume(This,pVolume);
}
static FORCEINLINE HRESULT IXAudio2MasteringVoice_SetChannelVolumes(IXAudio2MasteringVoice* This,UINT32 Channels,const float *pVolumes,UINT32 OperationSet) {
    return This->lpVtbl->SetChannelVolumes(This,Channels,pVolumes,OperationSet);
}
static FORCEINLINE void IXAudio2MasteringVoice_GetChannelVolumes(IXAudio2MasteringVoice* This,UINT32 Channels,float *pVolumes) {
    This->lpVtbl->GetChannelVolumes(This,Channels,pVolumes);
}
static FORCEINLINE HRESULT IXAudio2MasteringVoice_SetOutputMatrix(IXAudio2MasteringVoice* This,IXAudio2Voice *pDestinationVoice,UINT32 SourceChannels,UINT32 DestinationChannels,const float *pLevelMatrix,UINT32 OperationSet) {
    return This->lpVtbl->SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet);
}
static FORCEINLINE void IXAudio2MasteringVoice_GetOutputMatrix(IXAudio2MasteringVoice* This,IXAudio2Voice *pDestinationVoice,UINT32 SourceChannels,UINT32 DestinationChannels,float *pLevelMatrix) {
    This->lpVtbl->GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix);
}
static FORCEINLINE void IXAudio2MasteringVoice_DestroyVoice(IXAudio2MasteringVoice* This) {
    This->lpVtbl->DestroyVoice(This);
}
/*** IXAudio2MasteringVoice methods ***/
static FORCEINLINE void IXAudio2MasteringVoice_GetChannelMask(IXAudio2MasteringVoice* This,DWORD *pChannelMask) {
    This->lpVtbl->GetChannelMask(This,pChannelMask);
}
#endif
#endif

#endif


#endif  /* __IXAudio2MasteringVoice_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXAudio20VoiceCallback interface
 */
#ifndef __IXAudio20VoiceCallback_INTERFACE_DEFINED__
#define __IXAudio20VoiceCallback_INTERFACE_DEFINED__

#if defined(__cplusplus) && !defined(CINTERFACE)
interface IXAudio20VoiceCallback
{

    BEGIN_INTERFACE

    virtual void STDMETHODCALLTYPE OnVoiceProcessingPassStart(
        ) = 0;

    virtual void STDMETHODCALLTYPE OnVoiceProcessingPassEnd(
        ) = 0;

    virtual void STDMETHODCALLTYPE OnStreamEnd(
        ) = 0;

    virtual void STDMETHODCALLTYPE OnBufferStart(
        void *pBufferContext) = 0;

    virtual void STDMETHODCALLTYPE OnBufferEnd(
        void *pBufferContext) = 0;

    virtual void STDMETHODCALLTYPE OnLoopEnd(
        void *pBufferContext) = 0;

    virtual void STDMETHODCALLTYPE OnVoiceError(
        void *pBuffercontext,
        HRESULT Error) = 0;

    END_INTERFACE

};
#else
typedef struct IXAudio20VoiceCallbackVtbl {
    BEGIN_INTERFACE

    /*** IXAudio20VoiceCallback methods ***/
    void (STDMETHODCALLTYPE *OnVoiceProcessingPassStart)(
        IXAudio20VoiceCallback *This);

    void (STDMETHODCALLTYPE *OnVoiceProcessingPassEnd)(
        IXAudio20VoiceCallback *This);

    void (STDMETHODCALLTYPE *OnStreamEnd)(
        IXAudio20VoiceCallback *This);

    void (STDMETHODCALLTYPE *OnBufferStart)(
        IXAudio20VoiceCallback *This,
        void *pBufferContext);

    void (STDMETHODCALLTYPE *OnBufferEnd)(
        IXAudio20VoiceCallback *This,
        void *pBufferContext);

    void (STDMETHODCALLTYPE *OnLoopEnd)(
        IXAudio20VoiceCallback *This,
        void *pBufferContext);

    void (STDMETHODCALLTYPE *OnVoiceError)(
        IXAudio20VoiceCallback *This,
        void *pBuffercontext,
        HRESULT Error);

    END_INTERFACE
} IXAudio20VoiceCallbackVtbl;

interface IXAudio20VoiceCallback {
    CONST_VTBL IXAudio20VoiceCallbackVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IXAudio20VoiceCallback methods ***/
#define IXAudio20VoiceCallback_OnVoiceProcessingPassStart(This) (This)->lpVtbl->OnVoiceProcessingPassStart(This)
#define IXAudio20VoiceCallback_OnVoiceProcessingPassEnd(This) (This)->lpVtbl->OnVoiceProcessingPassEnd(This)
#define IXAudio20VoiceCallback_OnStreamEnd(This) (This)->lpVtbl->OnStreamEnd(This)
#define IXAudio20VoiceCallback_OnBufferStart(This,pBufferContext) (This)->lpVtbl->OnBufferStart(This,pBufferContext)
#define IXAudio20VoiceCallback_OnBufferEnd(This,pBufferContext) (This)->lpVtbl->OnBufferEnd(This,pBufferContext)
#define IXAudio20VoiceCallback_OnLoopEnd(This,pBufferContext) (This)->lpVtbl->OnLoopEnd(This,pBufferContext)
#define IXAudio20VoiceCallback_OnVoiceError(This,pBuffercontext,Error) (This)->lpVtbl->OnVoiceError(This,pBuffercontext,Error)
#else
/*** IXAudio20VoiceCallback methods ***/
static FORCEINLINE void IXAudio20VoiceCallback_OnVoiceProcessingPassStart(IXAudio20VoiceCallback* This) {
    This->lpVtbl->OnVoiceProcessingPassStart(This);
}
static FORCEINLINE void IXAudio20VoiceCallback_OnVoiceProcessingPassEnd(IXAudio20VoiceCallback* This) {
    This->lpVtbl->OnVoiceProcessingPassEnd(This);
}
static FORCEINLINE void IXAudio20VoiceCallback_OnStreamEnd(IXAudio20VoiceCallback* This) {
    This->lpVtbl->OnStreamEnd(This);
}
static FORCEINLINE void IXAudio20VoiceCallback_OnBufferStart(IXAudio20VoiceCallback* This,void *pBufferContext) {
    This->lpVtbl->OnBufferStart(This,pBufferContext);
}
static FORCEINLINE void IXAudio20VoiceCallback_OnBufferEnd(IXAudio20VoiceCallback* This,void *pBufferContext) {
    This->lpVtbl->OnBufferEnd(This,pBufferContext);
}
static FORCEINLINE void IXAudio20VoiceCallback_OnLoopEnd(IXAudio20VoiceCallback* This,void *pBufferContext) {
    This->lpVtbl->OnLoopEnd(This,pBufferContext);
}
static FORCEINLINE void IXAudio20VoiceCallback_OnVoiceError(IXAudio20VoiceCallback* This,void *pBuffercontext,HRESULT Error) {
    This->lpVtbl->OnVoiceError(This,pBuffercontext,Error);
}
#endif
#endif

#endif


#endif  /* __IXAudio20VoiceCallback_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXAudio2VoiceCallback interface
 */
#ifndef __IXAudio2VoiceCallback_INTERFACE_DEFINED__
#define __IXAudio2VoiceCallback_INTERFACE_DEFINED__

#if defined(__cplusplus) && !defined(CINTERFACE)
interface IXAudio2VoiceCallback
{

    BEGIN_INTERFACE

    virtual void STDMETHODCALLTYPE OnVoiceProcessingPassStart(
        UINT32 BytesRequired) = 0;

    virtual void STDMETHODCALLTYPE OnVoiceProcessingPassEnd(
        ) = 0;

    virtual void STDMETHODCALLTYPE OnStreamEnd(
        ) = 0;

    virtual void STDMETHODCALLTYPE OnBufferStart(
        void *pBufferContext) = 0;

    virtual void STDMETHODCALLTYPE OnBufferEnd(
        void *pBufferContext) = 0;

    virtual void STDMETHODCALLTYPE OnLoopEnd(
        void *pBufferContext) = 0;

    virtual void STDMETHODCALLTYPE OnVoiceError(
        void *pBuffercontext,
        HRESULT Error) = 0;

    END_INTERFACE

};
#else
typedef struct IXAudio2VoiceCallbackVtbl {
    BEGIN_INTERFACE

    /*** IXAudio2VoiceCallback methods ***/
    void (STDMETHODCALLTYPE *OnVoiceProcessingPassStart)(
        IXAudio2VoiceCallback *This,
        UINT32 BytesRequired);

    void (STDMETHODCALLTYPE *OnVoiceProcessingPassEnd)(
        IXAudio2VoiceCallback *This);

    void (STDMETHODCALLTYPE *OnStreamEnd)(
        IXAudio2VoiceCallback *This);

    void (STDMETHODCALLTYPE *OnBufferStart)(
        IXAudio2VoiceCallback *This,
        void *pBufferContext);

    void (STDMETHODCALLTYPE *OnBufferEnd)(
        IXAudio2VoiceCallback *This,
        void *pBufferContext);

    void (STDMETHODCALLTYPE *OnLoopEnd)(
        IXAudio2VoiceCallback *This,
        void *pBufferContext);

    void (STDMETHODCALLTYPE *OnVoiceError)(
        IXAudio2VoiceCallback *This,
        void *pBuffercontext,
        HRESULT Error);

    END_INTERFACE
} IXAudio2VoiceCallbackVtbl;

interface IXAudio2VoiceCallback {
    CONST_VTBL IXAudio2VoiceCallbackVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IXAudio2VoiceCallback methods ***/
#define IXAudio2VoiceCallback_OnVoiceProcessingPassStart(This,BytesRequired) (This)->lpVtbl->OnVoiceProcessingPassStart(This,BytesRequired)
#define IXAudio2VoiceCallback_OnVoiceProcessingPassEnd(This) (This)->lpVtbl->OnVoiceProcessingPassEnd(This)
#define IXAudio2VoiceCallback_OnStreamEnd(This) (This)->lpVtbl->OnStreamEnd(This)
#define IXAudio2VoiceCallback_OnBufferStart(This,pBufferContext) (This)->lpVtbl->OnBufferStart(This,pBufferContext)
#define IXAudio2VoiceCallback_OnBufferEnd(This,pBufferContext) (This)->lpVtbl->OnBufferEnd(This,pBufferContext)
#define IXAudio2VoiceCallback_OnLoopEnd(This,pBufferContext) (This)->lpVtbl->OnLoopEnd(This,pBufferContext)
#define IXAudio2VoiceCallback_OnVoiceError(This,pBuffercontext,Error) (This)->lpVtbl->OnVoiceError(This,pBuffercontext,Error)
#else
/*** IXAudio2VoiceCallback methods ***/
static FORCEINLINE void IXAudio2VoiceCallback_OnVoiceProcessingPassStart(IXAudio2VoiceCallback* This,UINT32 BytesRequired) {
    This->lpVtbl->OnVoiceProcessingPassStart(This,BytesRequired);
}
static FORCEINLINE void IXAudio2VoiceCallback_OnVoiceProcessingPassEnd(IXAudio2VoiceCallback* This) {
    This->lpVtbl->OnVoiceProcessingPassEnd(This);
}
static FORCEINLINE void IXAudio2VoiceCallback_OnStreamEnd(IXAudio2VoiceCallback* This) {
    This->lpVtbl->OnStreamEnd(This);
}
static FORCEINLINE void IXAudio2VoiceCallback_OnBufferStart(IXAudio2VoiceCallback* This,void *pBufferContext) {
    This->lpVtbl->OnBufferStart(This,pBufferContext);
}
static FORCEINLINE void IXAudio2VoiceCallback_OnBufferEnd(IXAudio2VoiceCallback* This,void *pBufferContext) {
    This->lpVtbl->OnBufferEnd(This,pBufferContext);
}
static FORCEINLINE void IXAudio2VoiceCallback_OnLoopEnd(IXAudio2VoiceCallback* This,void *pBufferContext) {
    This->lpVtbl->OnLoopEnd(This,pBufferContext);
}
static FORCEINLINE void IXAudio2VoiceCallback_OnVoiceError(IXAudio2VoiceCallback* This,void *pBuffercontext,HRESULT Error) {
    This->lpVtbl->OnVoiceError(This,pBuffercontext,Error);
}
#endif
#endif

#endif


#endif  /* __IXAudio2VoiceCallback_INTERFACE_DEFINED__ */

typedef struct XAUDIO2_DEBUG_CONFIGURATION {
    UINT32 TraceMask;
    UINT32 BreakMask;
    WINBOOL LogThreadID;
    WINBOOL LogFileline;
    WINBOOL LogFunctionName;
    WINBOOL LogTiming;
} XAUDIO2_DEBUG_CONFIGURATION;
/*****************************************************************************
 * IXAudio20 interface
 */
#ifndef __IXAudio20_INTERFACE_DEFINED__
#define __IXAudio20_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXAudio20, 0x8bcf1f58, 0x9fe7, 0x4583, 0x8a,0xc6, 0xe2,0xad,0xc4,0x65,0xc8,0xbb);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("8bcf1f58-9fe7-4583-8ac6-e2adc465c8bb")
IXAudio20 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetDeviceCount(
        UINT32 *pCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDeviceDetails(
        UINT32 Index,
        XAUDIO2_DEVICE_DETAILS *pDeviceDetails) = 0;

    virtual HRESULT STDMETHODCALLTYPE Initialize(
        UINT32 Flags = 0,
        XAUDIO2_PROCESSOR XAudio2Processor = XAUDIO2_DEFAULT_PROCESSOR) = 0;

    virtual HRESULT STDMETHODCALLTYPE RegisterForCallbacks(
        IXAudio2EngineCallback *pCallback) = 0;

    virtual void STDMETHODCALLTYPE UnregisterForCallbacks(
        IXAudio2EngineCallback *pCallback) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateSourceVoice(
        IXAudio2SourceVoice **ppSourceVoice,
        const WAVEFORMATEX *pSourceFormat,
        UINT32 Flags = 0,
        float MaxFrequencyRatio = XAUDIO2_DEFAULT_FREQ_RATIO,
        IXAudio2VoiceCallback *pCallback = 0,
        const XAUDIO23_VOICE_SENDS *pSendList = 0,
        const XAUDIO2_EFFECT_CHAIN *pEffectChain = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateSubmixVoice(
        IXAudio2SubmixVoice **ppSubmixVoice,
        UINT32 InputChannels,
        UINT32 InputSampleRate,
        UINT32 Flags = 0,
        UINT32 ProcessingStage = 0,
        const XAUDIO23_VOICE_SENDS *pSendList = 0,
        const XAUDIO2_EFFECT_CHAIN *pEffectChain = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateMasteringVoice(
        IXAudio2MasteringVoice **ppMasteringVoice,
        UINT32 InputChannels = XAUDIO2_DEFAULT_CHANNELS,
        UINT32 InputSampleRate = XAUDIO2_DEFAULT_SAMPLERATE,
        UINT32 Flags = 0,
        UINT32 DeviceIndex = 0,
        const XAUDIO2_EFFECT_CHAIN *pEffectChain = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE StartEngine(
        ) = 0;

    virtual void STDMETHODCALLTYPE StopEngine(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE CommitChanges(
        UINT32 OperationSet) = 0;

    virtual void STDMETHODCALLTYPE GetPerformanceData(
        XAUDIO20_PERFORMANCE_DATA *pPerfData) = 0;

    virtual void STDMETHODCALLTYPE SetDebugConfiguration(
        const XAUDIO2_DEBUG_CONFIGURATION *pDebugConfiguration,
        void *pReserved = 0) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXAudio20, 0x8bcf1f58, 0x9fe7, 0x4583, 0x8a,0xc6, 0xe2,0xad,0xc4,0x65,0xc8,0xbb)
#endif
#else
typedef struct IXAudio20Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IXAudio20 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IXAudio20 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IXAudio20 *This);

    /*** IXAudio20 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDeviceCount)(
        IXAudio20 *This,
        UINT32 *pCount);

    HRESULT (STDMETHODCALLTYPE *GetDeviceDetails)(
        IXAudio20 *This,
        UINT32 Index,
        XAUDIO2_DEVICE_DETAILS *pDeviceDetails);

    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IXAudio20 *This,
        UINT32 Flags,
        XAUDIO2_PROCESSOR XAudio2Processor);

    HRESULT (STDMETHODCALLTYPE *RegisterForCallbacks)(
        IXAudio20 *This,
        IXAudio2EngineCallback *pCallback);

    void (STDMETHODCALLTYPE *UnregisterForCallbacks)(
        IXAudio20 *This,
        IXAudio2EngineCallback *pCallback);

    HRESULT (STDMETHODCALLTYPE *CreateSourceVoice)(
        IXAudio20 *This,
        IXAudio2SourceVoice **ppSourceVoice,
        const WAVEFORMATEX *pSourceFormat,
        UINT32 Flags,
        float MaxFrequencyRatio,
        IXAudio2VoiceCallback *pCallback,
        const XAUDIO23_VOICE_SENDS *pSendList,
        const XAUDIO2_EFFECT_CHAIN *pEffectChain);

    HRESULT (STDMETHODCALLTYPE *CreateSubmixVoice)(
        IXAudio20 *This,
        IXAudio2SubmixVoice **ppSubmixVoice,
        UINT32 InputChannels,
        UINT32 InputSampleRate,
        UINT32 Flags,
        UINT32 ProcessingStage,
        const XAUDIO23_VOICE_SENDS *pSendList,
        const XAUDIO2_EFFECT_CHAIN *pEffectChain);

    HRESULT (STDMETHODCALLTYPE *CreateMasteringVoice)(
        IXAudio20 *This,
        IXAudio2MasteringVoice **ppMasteringVoice,
        UINT32 InputChannels,
        UINT32 InputSampleRate,
        UINT32 Flags,
        UINT32 DeviceIndex,
        const XAUDIO2_EFFECT_CHAIN *pEffectChain);

    HRESULT (STDMETHODCALLTYPE *StartEngine)(
        IXAudio20 *This);

    void (STDMETHODCALLTYPE *StopEngine)(
        IXAudio20 *This);

    HRESULT (STDMETHODCALLTYPE *CommitChanges)(
        IXAudio20 *This,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetPerformanceData)(
        IXAudio20 *This,
        XAUDIO20_PERFORMANCE_DATA *pPerfData);

    void (STDMETHODCALLTYPE *SetDebugConfiguration)(
        IXAudio20 *This,
        const XAUDIO2_DEBUG_CONFIGURATION *pDebugConfiguration,
        void *pReserved);

    END_INTERFACE
} IXAudio20Vtbl;

interface IXAudio20 {
    CONST_VTBL IXAudio20Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXAudio20_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXAudio20_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXAudio20_Release(This) (This)->lpVtbl->Release(This)
/*** IXAudio20 methods ***/
#define IXAudio20_GetDeviceCount(This,pCount) (This)->lpVtbl->GetDeviceCount(This,pCount)
#define IXAudio20_GetDeviceDetails(This,Index,pDeviceDetails) (This)->lpVtbl->GetDeviceDetails(This,Index,pDeviceDetails)
#define IXAudio20_Initialize(This,Flags,XAudio2Processor) (This)->lpVtbl->Initialize(This,Flags,XAudio2Processor)
#define IXAudio20_RegisterForCallbacks(This,pCallback) (This)->lpVtbl->RegisterForCallbacks(This,pCallback)
#define IXAudio20_UnregisterForCallbacks(This,pCallback) (This)->lpVtbl->UnregisterForCallbacks(This,pCallback)
#define IXAudio20_CreateSourceVoice(This,ppSourceVoice,pSourceFormat,Flags,MaxFrequencyRatio,pCallback,pSendList,pEffectChain) (This)->lpVtbl->CreateSourceVoice(This,ppSourceVoice,pSourceFormat,Flags,MaxFrequencyRatio,pCallback,pSendList,pEffectChain)
#define IXAudio20_CreateSubmixVoice(This,ppSubmixVoice,InputChannels,InputSampleRate,Flags,ProcessingStage,pSendList,pEffectChain) (This)->lpVtbl->CreateSubmixVoice(This,ppSubmixVoice,InputChannels,InputSampleRate,Flags,ProcessingStage,pSendList,pEffectChain)
#define IXAudio20_CreateMasteringVoice(This,ppMasteringVoice,InputChannels,InputSampleRate,Flags,DeviceIndex,pEffectChain) (This)->lpVtbl->CreateMasteringVoice(This,ppMasteringVoice,InputChannels,InputSampleRate,Flags,DeviceIndex,pEffectChain)
#define IXAudio20_StartEngine(This) (This)->lpVtbl->StartEngine(This)
#define IXAudio20_StopEngine(This) (This)->lpVtbl->StopEngine(This)
#define IXAudio20_CommitChanges(This,OperationSet) (This)->lpVtbl->CommitChanges(This,OperationSet)
#define IXAudio20_GetPerformanceData(This,pPerfData) (This)->lpVtbl->GetPerformanceData(This,pPerfData)
#define IXAudio20_SetDebugConfiguration(This,pDebugConfiguration,pReserved) (This)->lpVtbl->SetDebugConfiguration(This,pDebugConfiguration,pReserved)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IXAudio20_QueryInterface(IXAudio20* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IXAudio20_AddRef(IXAudio20* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IXAudio20_Release(IXAudio20* This) {
    return This->lpVtbl->Release(This);
}
/*** IXAudio20 methods ***/
static FORCEINLINE HRESULT IXAudio20_GetDeviceCount(IXAudio20* This,UINT32 *pCount) {
    return This->lpVtbl->GetDeviceCount(This,pCount);
}
static FORCEINLINE HRESULT IXAudio20_GetDeviceDetails(IXAudio20* This,UINT32 Index,XAUDIO2_DEVICE_DETAILS *pDeviceDetails) {
    return This->lpVtbl->GetDeviceDetails(This,Index,pDeviceDetails);
}
static FORCEINLINE HRESULT IXAudio20_Initialize(IXAudio20* This,UINT32 Flags,XAUDIO2_PROCESSOR XAudio2Processor) {
    return This->lpVtbl->Initialize(This,Flags,XAudio2Processor);
}
static FORCEINLINE HRESULT IXAudio20_RegisterForCallbacks(IXAudio20* This,IXAudio2EngineCallback *pCallback) {
    return This->lpVtbl->RegisterForCallbacks(This,pCallback);
}
static FORCEINLINE void IXAudio20_UnregisterForCallbacks(IXAudio20* This,IXAudio2EngineCallback *pCallback) {
    This->lpVtbl->UnregisterForCallbacks(This,pCallback);
}
static FORCEINLINE HRESULT IXAudio20_CreateSourceVoice(IXAudio20* This,IXAudio2SourceVoice **ppSourceVoice,const WAVEFORMATEX *pSourceFormat,UINT32 Flags,float MaxFrequencyRatio,IXAudio2VoiceCallback *pCallback,const XAUDIO23_VOICE_SENDS *pSendList,const XAUDIO2_EFFECT_CHAIN *pEffectChain) {
    return This->lpVtbl->CreateSourceVoice(This,ppSourceVoice,pSourceFormat,Flags,MaxFrequencyRatio,pCallback,pSendList,pEffectChain);
}
static FORCEINLINE HRESULT IXAudio20_CreateSubmixVoice(IXAudio20* This,IXAudio2SubmixVoice **ppSubmixVoice,UINT32 InputChannels,UINT32 InputSampleRate,UINT32 Flags,UINT32 ProcessingStage,const XAUDIO23_VOICE_SENDS *pSendList,const XAUDIO2_EFFECT_CHAIN *pEffectChain) {
    return This->lpVtbl->CreateSubmixVoice(This,ppSubmixVoice,InputChannels,InputSampleRate,Flags,ProcessingStage,pSendList,pEffectChain);
}
static FORCEINLINE HRESULT IXAudio20_CreateMasteringVoice(IXAudio20* This,IXAudio2MasteringVoice **ppMasteringVoice,UINT32 InputChannels,UINT32 InputSampleRate,UINT32 Flags,UINT32 DeviceIndex,const XAUDIO2_EFFECT_CHAIN *pEffectChain) {
    return This->lpVtbl->CreateMasteringVoice(This,ppMasteringVoice,InputChannels,InputSampleRate,Flags,DeviceIndex,pEffectChain);
}
static FORCEINLINE HRESULT IXAudio20_StartEngine(IXAudio20* This) {
    return This->lpVtbl->StartEngine(This);
}
static FORCEINLINE void IXAudio20_StopEngine(IXAudio20* This) {
    This->lpVtbl->StopEngine(This);
}
static FORCEINLINE HRESULT IXAudio20_CommitChanges(IXAudio20* This,UINT32 OperationSet) {
    return This->lpVtbl->CommitChanges(This,OperationSet);
}
static FORCEINLINE void IXAudio20_GetPerformanceData(IXAudio20* This,XAUDIO20_PERFORMANCE_DATA *pPerfData) {
    This->lpVtbl->GetPerformanceData(This,pPerfData);
}
static FORCEINLINE void IXAudio20_SetDebugConfiguration(IXAudio20* This,const XAUDIO2_DEBUG_CONFIGURATION *pDebugConfiguration,void *pReserved) {
    This->lpVtbl->SetDebugConfiguration(This,pDebugConfiguration,pReserved);
}
#endif
#endif

#endif


#endif  /* __IXAudio20_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXAudio22 interface
 */
#ifndef __IXAudio22_INTERFACE_DEFINED__
#define __IXAudio22_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXAudio22, 0x8bcf1f58, 0x9fe7, 0x4583, 0x8a,0xc6, 0xe2,0xad,0xc4,0x65,0xc8,0xbb);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("8bcf1f58-9fe7-4583-8ac6-e2adc465c8bb")
IXAudio22 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetDeviceCount(
        UINT32 *pCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDeviceDetails(
        UINT32 Index,
        XAUDIO2_DEVICE_DETAILS *pDeviceDetails) = 0;

    virtual HRESULT STDMETHODCALLTYPE Initialize(
        UINT32 Flags = 0,
        XAUDIO2_PROCESSOR XAudio2Processor = XAUDIO2_DEFAULT_PROCESSOR) = 0;

    virtual HRESULT STDMETHODCALLTYPE RegisterForCallbacks(
        IXAudio2EngineCallback *pCallback) = 0;

    virtual void STDMETHODCALLTYPE UnregisterForCallbacks(
        IXAudio2EngineCallback *pCallback) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateSourceVoice(
        IXAudio2SourceVoice **ppSourceVoice,
        const WAVEFORMATEX *pSourceFormat,
        UINT32 Flags = 0,
        float MaxFrequencyRatio = XAUDIO2_DEFAULT_FREQ_RATIO,
        IXAudio2VoiceCallback *pCallback = 0,
        const XAUDIO23_VOICE_SENDS *pSendList = 0,
        const XAUDIO2_EFFECT_CHAIN *pEffectChain = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateSubmixVoice(
        IXAudio2SubmixVoice **ppSubmixVoice,
        UINT32 InputChannels,
        UINT32 InputSampleRate,
        UINT32 Flags = 0,
        UINT32 ProcessingStage = 0,
        const XAUDIO23_VOICE_SENDS *pSendList = 0,
        const XAUDIO2_EFFECT_CHAIN *pEffectChain = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateMasteringVoice(
        IXAudio2MasteringVoice **ppMasteringVoice,
        UINT32 InputChannels = XAUDIO2_DEFAULT_CHANNELS,
        UINT32 InputSampleRate = XAUDIO2_DEFAULT_SAMPLERATE,
        UINT32 Flags = 0,
        UINT32 DeviceIndex = 0,
        const XAUDIO2_EFFECT_CHAIN *pEffectChain = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE StartEngine(
        ) = 0;

    virtual void STDMETHODCALLTYPE StopEngine(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE CommitChanges(
        UINT32 OperationSet) = 0;

    virtual void STDMETHODCALLTYPE GetPerformanceData(
        XAUDIO22_PERFORMANCE_DATA *pPerfData) = 0;

    virtual void STDMETHODCALLTYPE SetDebugConfiguration(
        const XAUDIO2_DEBUG_CONFIGURATION *pDebugConfiguration,
        void *pReserved = 0) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXAudio22, 0x8bcf1f58, 0x9fe7, 0x4583, 0x8a,0xc6, 0xe2,0xad,0xc4,0x65,0xc8,0xbb)
#endif
#else
typedef struct IXAudio22Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IXAudio22 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IXAudio22 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IXAudio22 *This);

    /*** IXAudio22 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDeviceCount)(
        IXAudio22 *This,
        UINT32 *pCount);

    HRESULT (STDMETHODCALLTYPE *GetDeviceDetails)(
        IXAudio22 *This,
        UINT32 Index,
        XAUDIO2_DEVICE_DETAILS *pDeviceDetails);

    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IXAudio22 *This,
        UINT32 Flags,
        XAUDIO2_PROCESSOR XAudio2Processor);

    HRESULT (STDMETHODCALLTYPE *RegisterForCallbacks)(
        IXAudio22 *This,
        IXAudio2EngineCallback *pCallback);

    void (STDMETHODCALLTYPE *UnregisterForCallbacks)(
        IXAudio22 *This,
        IXAudio2EngineCallback *pCallback);

    HRESULT (STDMETHODCALLTYPE *CreateSourceVoice)(
        IXAudio22 *This,
        IXAudio2SourceVoice **ppSourceVoice,
        const WAVEFORMATEX *pSourceFormat,
        UINT32 Flags,
        float MaxFrequencyRatio,
        IXAudio2VoiceCallback *pCallback,
        const XAUDIO23_VOICE_SENDS *pSendList,
        const XAUDIO2_EFFECT_CHAIN *pEffectChain);

    HRESULT (STDMETHODCALLTYPE *CreateSubmixVoice)(
        IXAudio22 *This,
        IXAudio2SubmixVoice **ppSubmixVoice,
        UINT32 InputChannels,
        UINT32 InputSampleRate,
        UINT32 Flags,
        UINT32 ProcessingStage,
        const XAUDIO23_VOICE_SENDS *pSendList,
        const XAUDIO2_EFFECT_CHAIN *pEffectChain);

    HRESULT (STDMETHODCALLTYPE *CreateMasteringVoice)(
        IXAudio22 *This,
        IXAudio2MasteringVoice **ppMasteringVoice,
        UINT32 InputChannels,
        UINT32 InputSampleRate,
        UINT32 Flags,
        UINT32 DeviceIndex,
        const XAUDIO2_EFFECT_CHAIN *pEffectChain);

    HRESULT (STDMETHODCALLTYPE *StartEngine)(
        IXAudio22 *This);

    void (STDMETHODCALLTYPE *StopEngine)(
        IXAudio22 *This);

    HRESULT (STDMETHODCALLTYPE *CommitChanges)(
        IXAudio22 *This,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetPerformanceData)(
        IXAudio22 *This,
        XAUDIO22_PERFORMANCE_DATA *pPerfData);

    void (STDMETHODCALLTYPE *SetDebugConfiguration)(
        IXAudio22 *This,
        const XAUDIO2_DEBUG_CONFIGURATION *pDebugConfiguration,
        void *pReserved);

    END_INTERFACE
} IXAudio22Vtbl;

interface IXAudio22 {
    CONST_VTBL IXAudio22Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXAudio22_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXAudio22_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXAudio22_Release(This) (This)->lpVtbl->Release(This)
/*** IXAudio22 methods ***/
#define IXAudio22_GetDeviceCount(This,pCount) (This)->lpVtbl->GetDeviceCount(This,pCount)
#define IXAudio22_GetDeviceDetails(This,Index,pDeviceDetails) (This)->lpVtbl->GetDeviceDetails(This,Index,pDeviceDetails)
#define IXAudio22_Initialize(This,Flags,XAudio2Processor) (This)->lpVtbl->Initialize(This,Flags,XAudio2Processor)
#define IXAudio22_RegisterForCallbacks(This,pCallback) (This)->lpVtbl->RegisterForCallbacks(This,pCallback)
#define IXAudio22_UnregisterForCallbacks(This,pCallback) (This)->lpVtbl->UnregisterForCallbacks(This,pCallback)
#define IXAudio22_CreateSourceVoice(This,ppSourceVoice,pSourceFormat,Flags,MaxFrequencyRatio,pCallback,pSendList,pEffectChain) (This)->lpVtbl->CreateSourceVoice(This,ppSourceVoice,pSourceFormat,Flags,MaxFrequencyRatio,pCallback,pSendList,pEffectChain)
#define IXAudio22_CreateSubmixVoice(This,ppSubmixVoice,InputChannels,InputSampleRate,Flags,ProcessingStage,pSendList,pEffectChain) (This)->lpVtbl->CreateSubmixVoice(This,ppSubmixVoice,InputChannels,InputSampleRate,Flags,ProcessingStage,pSendList,pEffectChain)
#define IXAudio22_CreateMasteringVoice(This,ppMasteringVoice,InputChannels,InputSampleRate,Flags,DeviceIndex,pEffectChain) (This)->lpVtbl->CreateMasteringVoice(This,ppMasteringVoice,InputChannels,InputSampleRate,Flags,DeviceIndex,pEffectChain)
#define IXAudio22_StartEngine(This) (This)->lpVtbl->StartEngine(This)
#define IXAudio22_StopEngine(This) (This)->lpVtbl->StopEngine(This)
#define IXAudio22_CommitChanges(This,OperationSet) (This)->lpVtbl->CommitChanges(This,OperationSet)
#define IXAudio22_GetPerformanceData(This,pPerfData) (This)->lpVtbl->GetPerformanceData(This,pPerfData)
#define IXAudio22_SetDebugConfiguration(This,pDebugConfiguration,pReserved) (This)->lpVtbl->SetDebugConfiguration(This,pDebugConfiguration,pReserved)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IXAudio22_QueryInterface(IXAudio22* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IXAudio22_AddRef(IXAudio22* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IXAudio22_Release(IXAudio22* This) {
    return This->lpVtbl->Release(This);
}
/*** IXAudio22 methods ***/
static FORCEINLINE HRESULT IXAudio22_GetDeviceCount(IXAudio22* This,UINT32 *pCount) {
    return This->lpVtbl->GetDeviceCount(This,pCount);
}
static FORCEINLINE HRESULT IXAudio22_GetDeviceDetails(IXAudio22* This,UINT32 Index,XAUDIO2_DEVICE_DETAILS *pDeviceDetails) {
    return This->lpVtbl->GetDeviceDetails(This,Index,pDeviceDetails);
}
static FORCEINLINE HRESULT IXAudio22_Initialize(IXAudio22* This,UINT32 Flags,XAUDIO2_PROCESSOR XAudio2Processor) {
    return This->lpVtbl->Initialize(This,Flags,XAudio2Processor);
}
static FORCEINLINE HRESULT IXAudio22_RegisterForCallbacks(IXAudio22* This,IXAudio2EngineCallback *pCallback) {
    return This->lpVtbl->RegisterForCallbacks(This,pCallback);
}
static FORCEINLINE void IXAudio22_UnregisterForCallbacks(IXAudio22* This,IXAudio2EngineCallback *pCallback) {
    This->lpVtbl->UnregisterForCallbacks(This,pCallback);
}
static FORCEINLINE HRESULT IXAudio22_CreateSourceVoice(IXAudio22* This,IXAudio2SourceVoice **ppSourceVoice,const WAVEFORMATEX *pSourceFormat,UINT32 Flags,float MaxFrequencyRatio,IXAudio2VoiceCallback *pCallback,const XAUDIO23_VOICE_SENDS *pSendList,const XAUDIO2_EFFECT_CHAIN *pEffectChain) {
    return This->lpVtbl->CreateSourceVoice(This,ppSourceVoice,pSourceFormat,Flags,MaxFrequencyRatio,pCallback,pSendList,pEffectChain);
}
static FORCEINLINE HRESULT IXAudio22_CreateSubmixVoice(IXAudio22* This,IXAudio2SubmixVoice **ppSubmixVoice,UINT32 InputChannels,UINT32 InputSampleRate,UINT32 Flags,UINT32 ProcessingStage,const XAUDIO23_VOICE_SENDS *pSendList,const XAUDIO2_EFFECT_CHAIN *pEffectChain) {
    return This->lpVtbl->CreateSubmixVoice(This,ppSubmixVoice,InputChannels,InputSampleRate,Flags,ProcessingStage,pSendList,pEffectChain);
}
static FORCEINLINE HRESULT IXAudio22_CreateMasteringVoice(IXAudio22* This,IXAudio2MasteringVoice **ppMasteringVoice,UINT32 InputChannels,UINT32 InputSampleRate,UINT32 Flags,UINT32 DeviceIndex,const XAUDIO2_EFFECT_CHAIN *pEffectChain) {
    return This->lpVtbl->CreateMasteringVoice(This,ppMasteringVoice,InputChannels,InputSampleRate,Flags,DeviceIndex,pEffectChain);
}
static FORCEINLINE HRESULT IXAudio22_StartEngine(IXAudio22* This) {
    return This->lpVtbl->StartEngine(This);
}
static FORCEINLINE void IXAudio22_StopEngine(IXAudio22* This) {
    This->lpVtbl->StopEngine(This);
}
static FORCEINLINE HRESULT IXAudio22_CommitChanges(IXAudio22* This,UINT32 OperationSet) {
    return This->lpVtbl->CommitChanges(This,OperationSet);
}
static FORCEINLINE void IXAudio22_GetPerformanceData(IXAudio22* This,XAUDIO22_PERFORMANCE_DATA *pPerfData) {
    This->lpVtbl->GetPerformanceData(This,pPerfData);
}
static FORCEINLINE void IXAudio22_SetDebugConfiguration(IXAudio22* This,const XAUDIO2_DEBUG_CONFIGURATION *pDebugConfiguration,void *pReserved) {
    This->lpVtbl->SetDebugConfiguration(This,pDebugConfiguration,pReserved);
}
#endif
#endif

#endif


#endif  /* __IXAudio22_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXAudio23 interface
 */
#ifndef __IXAudio23_INTERFACE_DEFINED__
#define __IXAudio23_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXAudio23, 0x8bcf1f58, 0x9fe7, 0x4583, 0x8a,0xc6, 0xe2,0xad,0xc4,0x65,0xc8,0xbb);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("8bcf1f58-9fe7-4583-8ac6-e2adc465c8bb")
IXAudio23 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetDeviceCount(
        UINT32 *pCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDeviceDetails(
        UINT32 Index,
        XAUDIO2_DEVICE_DETAILS *pDeviceDetails) = 0;

    virtual HRESULT STDMETHODCALLTYPE Initialize(
        UINT32 Flags = 0,
        XAUDIO2_PROCESSOR XAudio2Processor = XAUDIO2_DEFAULT_PROCESSOR) = 0;

    virtual HRESULT STDMETHODCALLTYPE RegisterForCallbacks(
        IXAudio2EngineCallback *pCallback) = 0;

    virtual void STDMETHODCALLTYPE UnregisterForCallbacks(
        IXAudio2EngineCallback *pCallback) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateSourceVoice(
        IXAudio2SourceVoice **ppSourceVoice,
        const WAVEFORMATEX *pSourceFormat,
        UINT32 Flags = 0,
        float MaxFrequencyRatio = XAUDIO2_DEFAULT_FREQ_RATIO,
        IXAudio2VoiceCallback *pCallback = 0,
        const XAUDIO23_VOICE_SENDS *pSendList = 0,
        const XAUDIO2_EFFECT_CHAIN *pEffectChain = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateSubmixVoice(
        IXAudio2SubmixVoice **ppSubmixVoice,
        UINT32 InputChannels,
        UINT32 InputSampleRate,
        UINT32 Flags = 0,
        UINT32 ProcessingStage = 0,
        const XAUDIO23_VOICE_SENDS *pSendList = 0,
        const XAUDIO2_EFFECT_CHAIN *pEffectChain = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateMasteringVoice(
        IXAudio2MasteringVoice **ppMasteringVoice,
        UINT32 InputChannels = XAUDIO2_DEFAULT_CHANNELS,
        UINT32 InputSampleRate = XAUDIO2_DEFAULT_SAMPLERATE,
        UINT32 Flags = 0,
        UINT32 DeviceIndex = 0,
        const XAUDIO2_EFFECT_CHAIN *pEffectChain = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE StartEngine(
        ) = 0;

    virtual void STDMETHODCALLTYPE StopEngine(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE CommitChanges(
        UINT32 OperationSet) = 0;

    virtual void STDMETHODCALLTYPE GetPerformanceData(
        XAUDIO2_PERFORMANCE_DATA *pPerfData) = 0;

    virtual void STDMETHODCALLTYPE SetDebugConfiguration(
        const XAUDIO2_DEBUG_CONFIGURATION *pDebugConfiguration,
        void *pReserved = 0) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXAudio23, 0x8bcf1f58, 0x9fe7, 0x4583, 0x8a,0xc6, 0xe2,0xad,0xc4,0x65,0xc8,0xbb)
#endif
#else
typedef struct IXAudio23Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IXAudio23 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IXAudio23 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IXAudio23 *This);

    /*** IXAudio23 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDeviceCount)(
        IXAudio23 *This,
        UINT32 *pCount);

    HRESULT (STDMETHODCALLTYPE *GetDeviceDetails)(
        IXAudio23 *This,
        UINT32 Index,
        XAUDIO2_DEVICE_DETAILS *pDeviceDetails);

    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IXAudio23 *This,
        UINT32 Flags,
        XAUDIO2_PROCESSOR XAudio2Processor);

    HRESULT (STDMETHODCALLTYPE *RegisterForCallbacks)(
        IXAudio23 *This,
        IXAudio2EngineCallback *pCallback);

    void (STDMETHODCALLTYPE *UnregisterForCallbacks)(
        IXAudio23 *This,
        IXAudio2EngineCallback *pCallback);

    HRESULT (STDMETHODCALLTYPE *CreateSourceVoice)(
        IXAudio23 *This,
        IXAudio2SourceVoice **ppSourceVoice,
        const WAVEFORMATEX *pSourceFormat,
        UINT32 Flags,
        float MaxFrequencyRatio,
        IXAudio2VoiceCallback *pCallback,
        const XAUDIO23_VOICE_SENDS *pSendList,
        const XAUDIO2_EFFECT_CHAIN *pEffectChain);

    HRESULT (STDMETHODCALLTYPE *CreateSubmixVoice)(
        IXAudio23 *This,
        IXAudio2SubmixVoice **ppSubmixVoice,
        UINT32 InputChannels,
        UINT32 InputSampleRate,
        UINT32 Flags,
        UINT32 ProcessingStage,
        const XAUDIO23_VOICE_SENDS *pSendList,
        const XAUDIO2_EFFECT_CHAIN *pEffectChain);

    HRESULT (STDMETHODCALLTYPE *CreateMasteringVoice)(
        IXAudio23 *This,
        IXAudio2MasteringVoice **ppMasteringVoice,
        UINT32 InputChannels,
        UINT32 InputSampleRate,
        UINT32 Flags,
        UINT32 DeviceIndex,
        const XAUDIO2_EFFECT_CHAIN *pEffectChain);

    HRESULT (STDMETHODCALLTYPE *StartEngine)(
        IXAudio23 *This);

    void (STDMETHODCALLTYPE *StopEngine)(
        IXAudio23 *This);

    HRESULT (STDMETHODCALLTYPE *CommitChanges)(
        IXAudio23 *This,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetPerformanceData)(
        IXAudio23 *This,
        XAUDIO2_PERFORMANCE_DATA *pPerfData);

    void (STDMETHODCALLTYPE *SetDebugConfiguration)(
        IXAudio23 *This,
        const XAUDIO2_DEBUG_CONFIGURATION *pDebugConfiguration,
        void *pReserved);

    END_INTERFACE
} IXAudio23Vtbl;

interface IXAudio23 {
    CONST_VTBL IXAudio23Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXAudio23_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXAudio23_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXAudio23_Release(This) (This)->lpVtbl->Release(This)
/*** IXAudio23 methods ***/
#define IXAudio23_GetDeviceCount(This,pCount) (This)->lpVtbl->GetDeviceCount(This,pCount)
#define IXAudio23_GetDeviceDetails(This,Index,pDeviceDetails) (This)->lpVtbl->GetDeviceDetails(This,Index,pDeviceDetails)
#define IXAudio23_Initialize(This,Flags,XAudio2Processor) (This)->lpVtbl->Initialize(This,Flags,XAudio2Processor)
#define IXAudio23_RegisterForCallbacks(This,pCallback) (This)->lpVtbl->RegisterForCallbacks(This,pCallback)
#define IXAudio23_UnregisterForCallbacks(This,pCallback) (This)->lpVtbl->UnregisterForCallbacks(This,pCallback)
#define IXAudio23_CreateSourceVoice(This,ppSourceVoice,pSourceFormat,Flags,MaxFrequencyRatio,pCallback,pSendList,pEffectChain) (This)->lpVtbl->CreateSourceVoice(This,ppSourceVoice,pSourceFormat,Flags,MaxFrequencyRatio,pCallback,pSendList,pEffectChain)
#define IXAudio23_CreateSubmixVoice(This,ppSubmixVoice,InputChannels,InputSampleRate,Flags,ProcessingStage,pSendList,pEffectChain) (This)->lpVtbl->CreateSubmixVoice(This,ppSubmixVoice,InputChannels,InputSampleRate,Flags,ProcessingStage,pSendList,pEffectChain)
#define IXAudio23_CreateMasteringVoice(This,ppMasteringVoice,InputChannels,InputSampleRate,Flags,DeviceIndex,pEffectChain) (This)->lpVtbl->CreateMasteringVoice(This,ppMasteringVoice,InputChannels,InputSampleRate,Flags,DeviceIndex,pEffectChain)
#define IXAudio23_StartEngine(This) (This)->lpVtbl->StartEngine(This)
#define IXAudio23_StopEngine(This) (This)->lpVtbl->StopEngine(This)
#define IXAudio23_CommitChanges(This,OperationSet) (This)->lpVtbl->CommitChanges(This,OperationSet)
#define IXAudio23_GetPerformanceData(This,pPerfData) (This)->lpVtbl->GetPerformanceData(This,pPerfData)
#define IXAudio23_SetDebugConfiguration(This,pDebugConfiguration,pReserved) (This)->lpVtbl->SetDebugConfiguration(This,pDebugConfiguration,pReserved)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IXAudio23_QueryInterface(IXAudio23* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IXAudio23_AddRef(IXAudio23* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IXAudio23_Release(IXAudio23* This) {
    return This->lpVtbl->Release(This);
}
/*** IXAudio23 methods ***/
static FORCEINLINE HRESULT IXAudio23_GetDeviceCount(IXAudio23* This,UINT32 *pCount) {
    return This->lpVtbl->GetDeviceCount(This,pCount);
}
static FORCEINLINE HRESULT IXAudio23_GetDeviceDetails(IXAudio23* This,UINT32 Index,XAUDIO2_DEVICE_DETAILS *pDeviceDetails) {
    return This->lpVtbl->GetDeviceDetails(This,Index,pDeviceDetails);
}
static FORCEINLINE HRESULT IXAudio23_Initialize(IXAudio23* This,UINT32 Flags,XAUDIO2_PROCESSOR XAudio2Processor) {
    return This->lpVtbl->Initialize(This,Flags,XAudio2Processor);
}
static FORCEINLINE HRESULT IXAudio23_RegisterForCallbacks(IXAudio23* This,IXAudio2EngineCallback *pCallback) {
    return This->lpVtbl->RegisterForCallbacks(This,pCallback);
}
static FORCEINLINE void IXAudio23_UnregisterForCallbacks(IXAudio23* This,IXAudio2EngineCallback *pCallback) {
    This->lpVtbl->UnregisterForCallbacks(This,pCallback);
}
static FORCEINLINE HRESULT IXAudio23_CreateSourceVoice(IXAudio23* This,IXAudio2SourceVoice **ppSourceVoice,const WAVEFORMATEX *pSourceFormat,UINT32 Flags,float MaxFrequencyRatio,IXAudio2VoiceCallback *pCallback,const XAUDIO23_VOICE_SENDS *pSendList,const XAUDIO2_EFFECT_CHAIN *pEffectChain) {
    return This->lpVtbl->CreateSourceVoice(This,ppSourceVoice,pSourceFormat,Flags,MaxFrequencyRatio,pCallback,pSendList,pEffectChain);
}
static FORCEINLINE HRESULT IXAudio23_CreateSubmixVoice(IXAudio23* This,IXAudio2SubmixVoice **ppSubmixVoice,UINT32 InputChannels,UINT32 InputSampleRate,UINT32 Flags,UINT32 ProcessingStage,const XAUDIO23_VOICE_SENDS *pSendList,const XAUDIO2_EFFECT_CHAIN *pEffectChain) {
    return This->lpVtbl->CreateSubmixVoice(This,ppSubmixVoice,InputChannels,InputSampleRate,Flags,ProcessingStage,pSendList,pEffectChain);
}
static FORCEINLINE HRESULT IXAudio23_CreateMasteringVoice(IXAudio23* This,IXAudio2MasteringVoice **ppMasteringVoice,UINT32 InputChannels,UINT32 InputSampleRate,UINT32 Flags,UINT32 DeviceIndex,const XAUDIO2_EFFECT_CHAIN *pEffectChain) {
    return This->lpVtbl->CreateMasteringVoice(This,ppMasteringVoice,InputChannels,InputSampleRate,Flags,DeviceIndex,pEffectChain);
}
static FORCEINLINE HRESULT IXAudio23_StartEngine(IXAudio23* This) {
    return This->lpVtbl->StartEngine(This);
}
static FORCEINLINE void IXAudio23_StopEngine(IXAudio23* This) {
    This->lpVtbl->StopEngine(This);
}
static FORCEINLINE HRESULT IXAudio23_CommitChanges(IXAudio23* This,UINT32 OperationSet) {
    return This->lpVtbl->CommitChanges(This,OperationSet);
}
static FORCEINLINE void IXAudio23_GetPerformanceData(IXAudio23* This,XAUDIO2_PERFORMANCE_DATA *pPerfData) {
    This->lpVtbl->GetPerformanceData(This,pPerfData);
}
static FORCEINLINE void IXAudio23_SetDebugConfiguration(IXAudio23* This,const XAUDIO2_DEBUG_CONFIGURATION *pDebugConfiguration,void *pReserved) {
    This->lpVtbl->SetDebugConfiguration(This,pDebugConfiguration,pReserved);
}
#endif
#endif

#endif


#endif  /* __IXAudio23_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXAudio27 interface
 */
#ifndef __IXAudio27_INTERFACE_DEFINED__
#define __IXAudio27_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXAudio27, 0x8bcf1f58, 0x9fe7, 0x4583, 0x8a,0xc6, 0xe2,0xad,0xc4,0x65,0xc8,0xbb);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("8bcf1f58-9fe7-4583-8ac6-e2adc465c8bb")
IXAudio27 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetDeviceCount(
        UINT32 *pCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDeviceDetails(
        UINT32 Index,
        XAUDIO2_DEVICE_DETAILS *pDeviceDetails) = 0;

    virtual HRESULT STDMETHODCALLTYPE Initialize(
        UINT32 Flags = 0,
        XAUDIO2_PROCESSOR XAudio2Processor = XAUDIO2_DEFAULT_PROCESSOR) = 0;

    virtual HRESULT STDMETHODCALLTYPE RegisterForCallbacks(
        IXAudio2EngineCallback *pCallback) = 0;

    virtual void STDMETHODCALLTYPE UnregisterForCallbacks(
        IXAudio2EngineCallback *pCallback) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateSourceVoice(
        IXAudio2SourceVoice **ppSourceVoice,
        const WAVEFORMATEX *pSourceFormat,
        UINT32 Flags = 0,
        float MaxFrequencyRatio = XAUDIO2_DEFAULT_FREQ_RATIO,
        IXAudio2VoiceCallback *pCallback = 0,
        const XAUDIO2_VOICE_SENDS *pSendList = 0,
        const XAUDIO2_EFFECT_CHAIN *pEffectChain = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateSubmixVoice(
        IXAudio2SubmixVoice **ppSubmixVoice,
        UINT32 InputChannels,
        UINT32 InputSampleRate,
        UINT32 Flags = 0,
        UINT32 ProcessingStage = 0,
        const XAUDIO2_VOICE_SENDS *pSendList = 0,
        const XAUDIO2_EFFECT_CHAIN *pEffectChain = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateMasteringVoice(
        IXAudio2MasteringVoice **ppMasteringVoice,
        UINT32 InputChannels = XAUDIO2_DEFAULT_CHANNELS,
        UINT32 InputSampleRate = XAUDIO2_DEFAULT_SAMPLERATE,
        UINT32 Flags = 0,
        UINT32 DeviceIndex = 0,
        const XAUDIO2_EFFECT_CHAIN *pEffectChain = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE StartEngine(
        ) = 0;

    virtual void STDMETHODCALLTYPE StopEngine(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE CommitChanges(
        UINT32 OperationSet) = 0;

    virtual void STDMETHODCALLTYPE GetPerformanceData(
        XAUDIO2_PERFORMANCE_DATA *pPerfData) = 0;

    virtual void STDMETHODCALLTYPE SetDebugConfiguration(
        const XAUDIO2_DEBUG_CONFIGURATION *pDebugConfiguration,
        void *pReserved = 0) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXAudio27, 0x8bcf1f58, 0x9fe7, 0x4583, 0x8a,0xc6, 0xe2,0xad,0xc4,0x65,0xc8,0xbb)
#endif
#else
typedef struct IXAudio27Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IXAudio27 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IXAudio27 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IXAudio27 *This);

    /*** IXAudio27 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDeviceCount)(
        IXAudio27 *This,
        UINT32 *pCount);

    HRESULT (STDMETHODCALLTYPE *GetDeviceDetails)(
        IXAudio27 *This,
        UINT32 Index,
        XAUDIO2_DEVICE_DETAILS *pDeviceDetails);

    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IXAudio27 *This,
        UINT32 Flags,
        XAUDIO2_PROCESSOR XAudio2Processor);

    HRESULT (STDMETHODCALLTYPE *RegisterForCallbacks)(
        IXAudio27 *This,
        IXAudio2EngineCallback *pCallback);

    void (STDMETHODCALLTYPE *UnregisterForCallbacks)(
        IXAudio27 *This,
        IXAudio2EngineCallback *pCallback);

    HRESULT (STDMETHODCALLTYPE *CreateSourceVoice)(
        IXAudio27 *This,
        IXAudio2SourceVoice **ppSourceVoice,
        const WAVEFORMATEX *pSourceFormat,
        UINT32 Flags,
        float MaxFrequencyRatio,
        IXAudio2VoiceCallback *pCallback,
        const XAUDIO2_VOICE_SENDS *pSendList,
        const XAUDIO2_EFFECT_CHAIN *pEffectChain);

    HRESULT (STDMETHODCALLTYPE *CreateSubmixVoice)(
        IXAudio27 *This,
        IXAudio2SubmixVoice **ppSubmixVoice,
        UINT32 InputChannels,
        UINT32 InputSampleRate,
        UINT32 Flags,
        UINT32 ProcessingStage,
        const XAUDIO2_VOICE_SENDS *pSendList,
        const XAUDIO2_EFFECT_CHAIN *pEffectChain);

    HRESULT (STDMETHODCALLTYPE *CreateMasteringVoice)(
        IXAudio27 *This,
        IXAudio2MasteringVoice **ppMasteringVoice,
        UINT32 InputChannels,
        UINT32 InputSampleRate,
        UINT32 Flags,
        UINT32 DeviceIndex,
        const XAUDIO2_EFFECT_CHAIN *pEffectChain);

    HRESULT (STDMETHODCALLTYPE *StartEngine)(
        IXAudio27 *This);

    void (STDMETHODCALLTYPE *StopEngine)(
        IXAudio27 *This);

    HRESULT (STDMETHODCALLTYPE *CommitChanges)(
        IXAudio27 *This,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetPerformanceData)(
        IXAudio27 *This,
        XAUDIO2_PERFORMANCE_DATA *pPerfData);

    void (STDMETHODCALLTYPE *SetDebugConfiguration)(
        IXAudio27 *This,
        const XAUDIO2_DEBUG_CONFIGURATION *pDebugConfiguration,
        void *pReserved);

    END_INTERFACE
} IXAudio27Vtbl;

interface IXAudio27 {
    CONST_VTBL IXAudio27Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXAudio27_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXAudio27_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXAudio27_Release(This) (This)->lpVtbl->Release(This)
/*** IXAudio27 methods ***/
#define IXAudio27_GetDeviceCount(This,pCount) (This)->lpVtbl->GetDeviceCount(This,pCount)
#define IXAudio27_GetDeviceDetails(This,Index,pDeviceDetails) (This)->lpVtbl->GetDeviceDetails(This,Index,pDeviceDetails)
#define IXAudio27_Initialize(This,Flags,XAudio2Processor) (This)->lpVtbl->Initialize(This,Flags,XAudio2Processor)
#define IXAudio27_RegisterForCallbacks(This,pCallback) (This)->lpVtbl->RegisterForCallbacks(This,pCallback)
#define IXAudio27_UnregisterForCallbacks(This,pCallback) (This)->lpVtbl->UnregisterForCallbacks(This,pCallback)
#define IXAudio27_CreateSourceVoice(This,ppSourceVoice,pSourceFormat,Flags,MaxFrequencyRatio,pCallback,pSendList,pEffectChain) (This)->lpVtbl->CreateSourceVoice(This,ppSourceVoice,pSourceFormat,Flags,MaxFrequencyRatio,pCallback,pSendList,pEffectChain)
#define IXAudio27_CreateSubmixVoice(This,ppSubmixVoice,InputChannels,InputSampleRate,Flags,ProcessingStage,pSendList,pEffectChain) (This)->lpVtbl->CreateSubmixVoice(This,ppSubmixVoice,InputChannels,InputSampleRate,Flags,ProcessingStage,pSendList,pEffectChain)
#define IXAudio27_CreateMasteringVoice(This,ppMasteringVoice,InputChannels,InputSampleRate,Flags,DeviceIndex,pEffectChain) (This)->lpVtbl->CreateMasteringVoice(This,ppMasteringVoice,InputChannels,InputSampleRate,Flags,DeviceIndex,pEffectChain)
#define IXAudio27_StartEngine(This) (This)->lpVtbl->StartEngine(This)
#define IXAudio27_StopEngine(This) (This)->lpVtbl->StopEngine(This)
#define IXAudio27_CommitChanges(This,OperationSet) (This)->lpVtbl->CommitChanges(This,OperationSet)
#define IXAudio27_GetPerformanceData(This,pPerfData) (This)->lpVtbl->GetPerformanceData(This,pPerfData)
#define IXAudio27_SetDebugConfiguration(This,pDebugConfiguration,pReserved) (This)->lpVtbl->SetDebugConfiguration(This,pDebugConfiguration,pReserved)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IXAudio27_QueryInterface(IXAudio27* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IXAudio27_AddRef(IXAudio27* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IXAudio27_Release(IXAudio27* This) {
    return This->lpVtbl->Release(This);
}
/*** IXAudio27 methods ***/
static FORCEINLINE HRESULT IXAudio27_GetDeviceCount(IXAudio27* This,UINT32 *pCount) {
    return This->lpVtbl->GetDeviceCount(This,pCount);
}
static FORCEINLINE HRESULT IXAudio27_GetDeviceDetails(IXAudio27* This,UINT32 Index,XAUDIO2_DEVICE_DETAILS *pDeviceDetails) {
    return This->lpVtbl->GetDeviceDetails(This,Index,pDeviceDetails);
}
static FORCEINLINE HRESULT IXAudio27_Initialize(IXAudio27* This,UINT32 Flags,XAUDIO2_PROCESSOR XAudio2Processor) {
    return This->lpVtbl->Initialize(This,Flags,XAudio2Processor);
}
static FORCEINLINE HRESULT IXAudio27_RegisterForCallbacks(IXAudio27* This,IXAudio2EngineCallback *pCallback) {
    return This->lpVtbl->RegisterForCallbacks(This,pCallback);
}
static FORCEINLINE void IXAudio27_UnregisterForCallbacks(IXAudio27* This,IXAudio2EngineCallback *pCallback) {
    This->lpVtbl->UnregisterForCallbacks(This,pCallback);
}
static FORCEINLINE HRESULT IXAudio27_CreateSourceVoice(IXAudio27* This,IXAudio2SourceVoice **ppSourceVoice,const WAVEFORMATEX *pSourceFormat,UINT32 Flags,float MaxFrequencyRatio,IXAudio2VoiceCallback *pCallback,const XAUDIO2_VOICE_SENDS *pSendList,const XAUDIO2_EFFECT_CHAIN *pEffectChain) {
    return This->lpVtbl->CreateSourceVoice(This,ppSourceVoice,pSourceFormat,Flags,MaxFrequencyRatio,pCallback,pSendList,pEffectChain);
}
static FORCEINLINE HRESULT IXAudio27_CreateSubmixVoice(IXAudio27* This,IXAudio2SubmixVoice **ppSubmixVoice,UINT32 InputChannels,UINT32 InputSampleRate,UINT32 Flags,UINT32 ProcessingStage,const XAUDIO2_VOICE_SENDS *pSendList,const XAUDIO2_EFFECT_CHAIN *pEffectChain) {
    return This->lpVtbl->CreateSubmixVoice(This,ppSubmixVoice,InputChannels,InputSampleRate,Flags,ProcessingStage,pSendList,pEffectChain);
}
static FORCEINLINE HRESULT IXAudio27_CreateMasteringVoice(IXAudio27* This,IXAudio2MasteringVoice **ppMasteringVoice,UINT32 InputChannels,UINT32 InputSampleRate,UINT32 Flags,UINT32 DeviceIndex,const XAUDIO2_EFFECT_CHAIN *pEffectChain) {
    return This->lpVtbl->CreateMasteringVoice(This,ppMasteringVoice,InputChannels,InputSampleRate,Flags,DeviceIndex,pEffectChain);
}
static FORCEINLINE HRESULT IXAudio27_StartEngine(IXAudio27* This) {
    return This->lpVtbl->StartEngine(This);
}
static FORCEINLINE void IXAudio27_StopEngine(IXAudio27* This) {
    This->lpVtbl->StopEngine(This);
}
static FORCEINLINE HRESULT IXAudio27_CommitChanges(IXAudio27* This,UINT32 OperationSet) {
    return This->lpVtbl->CommitChanges(This,OperationSet);
}
static FORCEINLINE void IXAudio27_GetPerformanceData(IXAudio27* This,XAUDIO2_PERFORMANCE_DATA *pPerfData) {
    This->lpVtbl->GetPerformanceData(This,pPerfData);
}
static FORCEINLINE void IXAudio27_SetDebugConfiguration(IXAudio27* This,const XAUDIO2_DEBUG_CONFIGURATION *pDebugConfiguration,void *pReserved) {
    This->lpVtbl->SetDebugConfiguration(This,pDebugConfiguration,pReserved);
}
#endif
#endif

#endif


#endif  /* __IXAudio27_INTERFACE_DEFINED__ */

DEFINE_GUID(IID_IXAudio28, 0x60d8dac8, 0x5aa1, 0x4e8e, 0xb5, 0x97, 0x2f, 0x5e, 0x28, 0x83, 0xd4, 0x84);
/*****************************************************************************
 * IXAudio2 interface
 */
#ifndef __IXAudio2_INTERFACE_DEFINED__
#define __IXAudio2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXAudio2, 0x2b02e3cf, 0x2e0b, 0x4ec3, 0xbe,0x45, 0x1b,0x2a,0x3f,0xe7,0x21,0x0d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2b02e3cf-2e0b-4ec3-be45-1b2a3fe7210d")
IXAudio2 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE RegisterForCallbacks(
        IXAudio2EngineCallback *pCallback) = 0;

    virtual void STDMETHODCALLTYPE UnregisterForCallbacks(
        IXAudio2EngineCallback *pCallback) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateSourceVoice(
        IXAudio2SourceVoice **ppSourceVoice,
        const WAVEFORMATEX *pSourceFormat,
        UINT32 Flags = 0,
        float MaxFrequencyRatio = XAUDIO2_DEFAULT_FREQ_RATIO,
        IXAudio2VoiceCallback *pCallback = 0,
        const XAUDIO2_VOICE_SENDS *pSendList = 0,
        const XAUDIO2_EFFECT_CHAIN *pEffectChain = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateSubmixVoice(
        IXAudio2SubmixVoice **ppSubmixVoice,
        UINT32 InputChannels,
        UINT32 InputSampleRate,
        UINT32 Flags = 0,
        UINT32 ProcessingStage = 0,
        const XAUDIO2_VOICE_SENDS *pSendList = 0,
        const XAUDIO2_EFFECT_CHAIN *pEffectChain = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateMasteringVoice(
        IXAudio2MasteringVoice **ppMasteringVoice,
        UINT32 InputChannels = XAUDIO2_DEFAULT_CHANNELS,
        UINT32 InputSampleRate = XAUDIO2_DEFAULT_SAMPLERATE,
        UINT32 Flags = 0,
        LPCWSTR DeviceId = 0,
        const XAUDIO2_EFFECT_CHAIN *pEffectChain = 0,
        AUDIO_STREAM_CATEGORY StreamCategory = AudioCategory_GameEffects) = 0;

    virtual HRESULT STDMETHODCALLTYPE StartEngine(
        ) = 0;

    virtual void STDMETHODCALLTYPE StopEngine(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE CommitChanges(
        UINT32 OperationSet) = 0;

    virtual void STDMETHODCALLTYPE GetPerformanceData(
        XAUDIO2_PERFORMANCE_DATA *pPerfData) = 0;

    virtual void STDMETHODCALLTYPE SetDebugConfiguration(
        const XAUDIO2_DEBUG_CONFIGURATION *pDebugConfiguration,
        void *pReserved = 0) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXAudio2, 0x2b02e3cf, 0x2e0b, 0x4ec3, 0xbe,0x45, 0x1b,0x2a,0x3f,0xe7,0x21,0x0d)
#endif
#else
typedef struct IXAudio2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IXAudio2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IXAudio2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IXAudio2 *This);

    /*** IXAudio2 methods ***/
    HRESULT (STDMETHODCALLTYPE *RegisterForCallbacks)(
        IXAudio2 *This,
        IXAudio2EngineCallback *pCallback);

    void (STDMETHODCALLTYPE *UnregisterForCallbacks)(
        IXAudio2 *This,
        IXAudio2EngineCallback *pCallback);

    HRESULT (STDMETHODCALLTYPE *CreateSourceVoice)(
        IXAudio2 *This,
        IXAudio2SourceVoice **ppSourceVoice,
        const WAVEFORMATEX *pSourceFormat,
        UINT32 Flags,
        float MaxFrequencyRatio,
        IXAudio2VoiceCallback *pCallback,
        const XAUDIO2_VOICE_SENDS *pSendList,
        const XAUDIO2_EFFECT_CHAIN *pEffectChain);

    HRESULT (STDMETHODCALLTYPE *CreateSubmixVoice)(
        IXAudio2 *This,
        IXAudio2SubmixVoice **ppSubmixVoice,
        UINT32 InputChannels,
        UINT32 InputSampleRate,
        UINT32 Flags,
        UINT32 ProcessingStage,
        const XAUDIO2_VOICE_SENDS *pSendList,
        const XAUDIO2_EFFECT_CHAIN *pEffectChain);

    HRESULT (STDMETHODCALLTYPE *CreateMasteringVoice)(
        IXAudio2 *This,
        IXAudio2MasteringVoice **ppMasteringVoice,
        UINT32 InputChannels,
        UINT32 InputSampleRate,
        UINT32 Flags,
        LPCWSTR DeviceId,
        const XAUDIO2_EFFECT_CHAIN *pEffectChain,
        AUDIO_STREAM_CATEGORY StreamCategory);

    HRESULT (STDMETHODCALLTYPE *StartEngine)(
        IXAudio2 *This);

    void (STDMETHODCALLTYPE *StopEngine)(
        IXAudio2 *This);

    HRESULT (STDMETHODCALLTYPE *CommitChanges)(
        IXAudio2 *This,
        UINT32 OperationSet);

    void (STDMETHODCALLTYPE *GetPerformanceData)(
        IXAudio2 *This,
        XAUDIO2_PERFORMANCE_DATA *pPerfData);

    void (STDMETHODCALLTYPE *SetDebugConfiguration)(
        IXAudio2 *This,
        const XAUDIO2_DEBUG_CONFIGURATION *pDebugConfiguration,
        void *pReserved);

    END_INTERFACE
} IXAudio2Vtbl;

interface IXAudio2 {
    CONST_VTBL IXAudio2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXAudio2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXAudio2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXAudio2_Release(This) (This)->lpVtbl->Release(This)
/*** IXAudio2 methods ***/
#define IXAudio2_RegisterForCallbacks(This,pCallback) (This)->lpVtbl->RegisterForCallbacks(This,pCallback)
#define IXAudio2_UnregisterForCallbacks(This,pCallback) (This)->lpVtbl->UnregisterForCallbacks(This,pCallback)
#define IXAudio2_CreateSourceVoice(This,ppSourceVoice,pSourceFormat,Flags,MaxFrequencyRatio,pCallback,pSendList,pEffectChain) (This)->lpVtbl->CreateSourceVoice(This,ppSourceVoice,pSourceFormat,Flags,MaxFrequencyRatio,pCallback,pSendList,pEffectChain)
#define IXAudio2_CreateSubmixVoice(This,ppSubmixVoice,InputChannels,InputSampleRate,Flags,ProcessingStage,pSendList,pEffectChain) (This)->lpVtbl->CreateSubmixVoice(This,ppSubmixVoice,InputChannels,InputSampleRate,Flags,ProcessingStage,pSendList,pEffectChain)
#define IXAudio2_CreateMasteringVoice(This,ppMasteringVoice,InputChannels,InputSampleRate,Flags,DeviceId,pEffectChain,StreamCategory) (This)->lpVtbl->CreateMasteringVoice(This,ppMasteringVoice,InputChannels,InputSampleRate,Flags,DeviceId,pEffectChain,StreamCategory)
#define IXAudio2_StartEngine(This) (This)->lpVtbl->StartEngine(This)
#define IXAudio2_StopEngine(This) (This)->lpVtbl->StopEngine(This)
#define IXAudio2_CommitChanges(This,OperationSet) (This)->lpVtbl->CommitChanges(This,OperationSet)
#define IXAudio2_GetPerformanceData(This,pPerfData) (This)->lpVtbl->GetPerformanceData(This,pPerfData)
#define IXAudio2_SetDebugConfiguration(This,pDebugConfiguration,pReserved) (This)->lpVtbl->SetDebugConfiguration(This,pDebugConfiguration,pReserved)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IXAudio2_QueryInterface(IXAudio2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IXAudio2_AddRef(IXAudio2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IXAudio2_Release(IXAudio2* This) {
    return This->lpVtbl->Release(This);
}
/*** IXAudio2 methods ***/
static FORCEINLINE HRESULT IXAudio2_RegisterForCallbacks(IXAudio2* This,IXAudio2EngineCallback *pCallback) {
    return This->lpVtbl->RegisterForCallbacks(This,pCallback);
}
static FORCEINLINE void IXAudio2_UnregisterForCallbacks(IXAudio2* This,IXAudio2EngineCallback *pCallback) {
    This->lpVtbl->UnregisterForCallbacks(This,pCallback);
}
static FORCEINLINE HRESULT IXAudio2_CreateSourceVoice(IXAudio2* This,IXAudio2SourceVoice **ppSourceVoice,const WAVEFORMATEX *pSourceFormat,UINT32 Flags,float MaxFrequencyRatio,IXAudio2VoiceCallback *pCallback,const XAUDIO2_VOICE_SENDS *pSendList,const XAUDIO2_EFFECT_CHAIN *pEffectChain) {
    return This->lpVtbl->CreateSourceVoice(This,ppSourceVoice,pSourceFormat,Flags,MaxFrequencyRatio,pCallback,pSendList,pEffectChain);
}
static FORCEINLINE HRESULT IXAudio2_CreateSubmixVoice(IXAudio2* This,IXAudio2SubmixVoice **ppSubmixVoice,UINT32 InputChannels,UINT32 InputSampleRate,UINT32 Flags,UINT32 ProcessingStage,const XAUDIO2_VOICE_SENDS *pSendList,const XAUDIO2_EFFECT_CHAIN *pEffectChain) {
    return This->lpVtbl->CreateSubmixVoice(This,ppSubmixVoice,InputChannels,InputSampleRate,Flags,ProcessingStage,pSendList,pEffectChain);
}
static FORCEINLINE HRESULT IXAudio2_CreateMasteringVoice(IXAudio2* This,IXAudio2MasteringVoice **ppMasteringVoice,UINT32 InputChannels,UINT32 InputSampleRate,UINT32 Flags,LPCWSTR DeviceId,const XAUDIO2_EFFECT_CHAIN *pEffectChain,AUDIO_STREAM_CATEGORY StreamCategory) {
    return This->lpVtbl->CreateMasteringVoice(This,ppMasteringVoice,InputChannels,InputSampleRate,Flags,DeviceId,pEffectChain,StreamCategory);
}
static FORCEINLINE HRESULT IXAudio2_StartEngine(IXAudio2* This) {
    return This->lpVtbl->StartEngine(This);
}
static FORCEINLINE void IXAudio2_StopEngine(IXAudio2* This) {
    This->lpVtbl->StopEngine(This);
}
static FORCEINLINE HRESULT IXAudio2_CommitChanges(IXAudio2* This,UINT32 OperationSet) {
    return This->lpVtbl->CommitChanges(This,OperationSet);
}
static FORCEINLINE void IXAudio2_GetPerformanceData(IXAudio2* This,XAUDIO2_PERFORMANCE_DATA *pPerfData) {
    This->lpVtbl->GetPerformanceData(This,pPerfData);
}
static FORCEINLINE void IXAudio2_SetDebugConfiguration(IXAudio2* This,const XAUDIO2_DEBUG_CONFIGURATION *pDebugConfiguration,void *pReserved) {
    This->lpVtbl->SetDebugConfiguration(This,pDebugConfiguration,pReserved);
}
#endif
#endif

#endif


#endif  /* __IXAudio2_INTERFACE_DEFINED__ */

#define XAUDIO2_DEBUG_ENGINE (1)

#define XAUDIO2_VOICE_NOPITCH (2)

#define XAUDIO2_VOICE_NOSRC (4)

#define XAUDIO2_VOICE_USEFILTER (8)

#define XAUDIO2_VOICE_MUSIC (16)

#define XAUDIO2_PLAY_TAILS (32)

#define XAUDIO2_END_OF_STREAM (64)

#define XAUDIO2_SEND_USEFILTER (128)

#define XAUDIO2_VOICE_NOSAMPLESPLAYED (256)

#define XAUDIO2_DEFAULT_FILTER_TYPE (LowPassFilter)

#define XAUDIO2_DEFAULT_FILTER_FREQUENCY (XAUDIO2_MAX_FILTER_FREQUENCY)

#define XAUDIO2_DEFAULT_FILTER_ONEOVERQ (1.00000000000000)

#define XAUDIO2_QUANTUM_NUMERATOR (1)

#define XAUDIO2_QUANTUM_DENOMINATOR (100)

#define XAUDIO2_QUANTUM_MS ((1000.00000000000 * XAUDIO2_QUANTUM_NUMERATOR) / XAUDIO2_QUANTUM_DENOMINATOR)

#define XAUDIO2_E_INVALID_CALL ((HRESULT)0x88960001)
#define XAUDIO2_E_XMA_DECODER_ERROR ((HRESULT)0x88960002)
#define XAUDIO2_E_XAPO_CREATION_FAILED ((HRESULT)0x88960003)
#define XAUDIO2_E_DEVICE_INVALIDATED ((HRESULT)0x88960004)
#define XAUDIO20_E_XMA_DECODER_ERROR ((HRESULT)0x88960001)
#define XAUDIO20_E_XAPO_CREATION_FAILED ((HRESULT)0x88960002)
#define XAUDIO20_E_DEVICE_INVALIDATED ((HRESULT)0x88960003)
#ifdef XAUDIO2_HELPER_FUNCTIONS
#define _USE_MATH_DEFINES
#include <math.h>
inline static float XAudio2DecibelsToAmplitudeRatio(float decibels) { return powf(10.0f, decibels/20.0f); }
inline static float XAudio2AmplitudeRatioToDecibels(float volume) { if (volume == 0) { return -3.402823466e+38f; } return 20.0f * log10f(volume); }
inline static float XAudio2SemitonesToFrequencyRatio(float semitones) { return powf(2.0f, semitones/12.0f); }
inline static float XAudio2FrequencyRatioToSemitones(float freqratio) { return 39.86313713864835f * log10f(freqratio); }
inline static float XAudio2CutoffFrequencyToRadians(float cutofffreq, UINT32 samplerate) { if ((UINT32)(cutofffreq * 6.0f) >= samplerate) { return XAUDIO2_MAX_FILTER_FREQUENCY; } return 2.0f * sinf((float)M_PI * cutofffreq / samplerate); }
inline static float XAudio2RadiansToCutoffFrequency(float radians, float samplerate) { return samplerate * asinf(radians/2.0f) / (float)M_PI; }
#endif
HRESULT WINAPI XAudio2Create(IXAudio2** pxaudio2, UINT32 flags, XAUDIO2_PROCESSOR processor);
#include <poppack.h>
/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __xaudio2_h__ */
