/*** Autogenerated by WIDL 6.0-rc1 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__ */
