diff --git a/mingw-w64-headers/Makefile.am b/mingw-w64-headers/Makefile.am
index a014218..9cb7d80 100644
--- a/mingw-w64-headers/Makefile.am
+++ b/mingw-w64-headers/Makefile.am
@@ -239,6 +239,9 @@
   include/wmdrmsdk.idl \
   include/wpcapi.idl \
   include/wtypes.idl \
+  include/xapo.idl \
+  include/xaudio2.idl \
+  include/xaudio2fx.idl \
   include/xmllite.idl \
   include/xpsdigitalsignature.idl \
   include/xpsobjectmodel_1.idl \
diff --git a/mingw-w64-headers/Makefile.in b/mingw-w64-headers/Makefile.in
index 2497aab..d0f12e8 100644
--- a/mingw-w64-headers/Makefile.in
+++ b/mingw-w64-headers/Makefile.in
@@ -302,6 +302,7 @@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -538,6 +539,9 @@
 @HAVE_WIDL_TRUE@  include/wmdrmsdk.idl \
 @HAVE_WIDL_TRUE@  include/wpcapi.idl \
 @HAVE_WIDL_TRUE@  include/wtypes.idl \
+@HAVE_WIDL_TRUE@  include/xapo.idl \
+@HAVE_WIDL_TRUE@  include/xaudio2.idl \
+@HAVE_WIDL_TRUE@  include/xaudio2fx.idl \
 @HAVE_WIDL_TRUE@  include/xmllite.idl \
 @HAVE_WIDL_TRUE@  include/xpsdigitalsignature.idl \
 @HAVE_WIDL_TRUE@  include/xpsobjectmodel_1.idl \
diff --git a/mingw-w64-headers/include/devpkey.h b/mingw-w64-headers/include/devpkey.h
index d24b382..2f8fe51 100644
--- a/mingw-w64-headers/include/devpkey.h
+++ b/mingw-w64-headers/include/devpkey.h
@@ -1,7 +1,230 @@
-#include <portabledeviceconnectapi.h>
+/*
+ * Copyright (C) 2010 Maarten Lankhorst for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
 #include <devpropdef.h>
 
 DEFINE_DEVPROPKEY(DEVPKEY_NAME, 0xb725f130,0x47ef,0x101a,0xa5,0xf1,0x02,0x60,0x8c,0x9e,0xeb,0xac, 10);
+
+DEFINE_DEVPROPKEY(DEVPKEY_Device_DeviceDesc, 0xa45c254e,0xdf1c,0x4efd,0x80,0x20,0x67,0xd1,0x46,0xa8,0x50,0xe0, 2);
 DEFINE_DEVPROPKEY(DEVPKEY_Device_HardwareIds, 0xa45c254e,0xdf1c,0x4efd,0x80,0x20,0x67,0xd1,0x46,0xa8,0x50,0xe0, 3);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_CompatibleIds, 0xa45c254e,0xdf1c,0x4efd,0x80,0x20,0x67,0xd1,0x46,0xa8,0x50,0xe0, 4);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_Service, 0xa45c254e,0xdf1c,0x4efd,0x80,0x20,0x67,0xd1,0x46,0xa8,0x50,0xe0, 6);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_Class, 0xa45c254e,0xdf1c,0x4efd,0x80,0x20,0x67,0xd1,0x46,0xa8,0x50,0xe0, 9);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_ClassGuid, 0xa45c254e,0xdf1c,0x4efd,0x80,0x20,0x67,0xd1,0x46,0xa8,0x50,0xe0, 10);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_Driver, 0xa45c254e,0xdf1c,0x4efd,0x80,0x20,0x67,0xd1,0x46,0xa8,0x50,0xe0, 11);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_ConfigFlags, 0xa45c254e,0xdf1c,0x4efd,0x80,0x20,0x67,0xd1,0x46,0xa8,0x50,0xe0, 12);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_Manufacturer, 0xa45c254e,0xdf1c,0x4efd,0x80,0x20,0x67,0xd1,0x46,0xa8,0x50,0xe0, 13);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_FriendlyName, 0xa45c254e,0xdf1c,0x4efd,0x80,0x20,0x67,0xd1,0x46,0xa8,0x50,0xe0, 14);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_LocationInfo, 0xa45c254e,0xdf1c,0x4efd,0x80,0x20,0x67,0xd1,0x46,0xa8,0x50,0xe0, 15);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_PDOName, 0xa45c254e,0xdf1c,0x4efd,0x80,0x20,0x67,0xd1,0x46,0xa8,0x50,0xe0, 16);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_Capabilities, 0xa45c254e,0xdf1c,0x4efd,0x80,0x20,0x67,0xd1,0x46,0xa8,0x50,0xe0, 17);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_UINumber, 0xa45c254e,0xdf1c,0x4efd,0x80,0x20,0x67,0xd1,0x46,0xa8,0x50,0xe0, 18);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_UpperFilters, 0xa45c254e,0xdf1c,0x4efd,0x80,0x20,0x67,0xd1,0x46,0xa8,0x50,0xe0, 19);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_LowerFilters, 0xa45c254e,0xdf1c,0x4efd,0x80,0x20,0x67,0xd1,0x46,0xa8,0x50,0xe0, 20);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_BusTypeGuid, 0xa45c254e,0xdf1c,0x4efd,0x80,0x20,0x67,0xd1,0x46,0xa8,0x50,0xe0, 21);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_LegacyBusType, 0xa45c254e,0xdf1c,0x4efd,0x80,0x20,0x67,0xd1,0x46,0xa8,0x50,0xe0, 22);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_BusNumber, 0xa45c254e,0xdf1c,0x4efd,0x80,0x20,0x67,0xd1,0x46,0xa8,0x50,0xe0, 23);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_EnumeratorName, 0xa45c254e,0xdf1c,0x4efd,0x80,0x20,0x67,0xd1,0x46,0xa8,0x50,0xe0, 24);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_Security, 0xa45c254e,0xdf1c,0x4efd,0x80,0x20,0x67,0xd1,0x46,0xa8,0x50,0xe0, 25);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_SecuritySDS, 0xa45c254e,0xdf1c,0x4efd,0x80,0x20,0x67,0xd1,0x46,0xa8,0x50,0xe0, 26);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_DevType, 0xa45c254e,0xdf1c,0x4efd,0x80,0x20,0x67,0xd1,0x46,0xa8,0x50,0xe0, 27);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_Exclusive, 0xa45c254e,0xdf1c,0x4efd,0x80,0x20,0x67,0xd1,0x46,0xa8,0x50,0xe0, 28);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_Characteristics, 0xa45c254e,0xdf1c,0x4efd,0x80,0x20,0x67,0xd1,0x46,0xa8,0x50,0xe0, 29);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_Address, 0xa45c254e,0xdf1c,0x4efd,0x80,0x20,0x67,0xd1,0x46,0xa8,0x50,0xe0, 30);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_UINumberDescFormat, 0xa45c254e,0xdf1c,0x4efd,0x80,0x20,0x67,0xd1,0x46,0xa8,0x50,0xe0, 31);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_PowerData, 0xa45c254e,0xdf1c,0x4efd,0x80,0x20,0x67,0xd1,0x46,0xa8,0x50,0xe0, 32);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_RemovalPolicy, 0xa45c254e,0xdf1c,0x4efd,0x80,0x20,0x67,0xd1,0x46,0xa8,0x50,0xe0, 33);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_RemovalPolicyDefault, 0xa45c254e,0xdf1c,0x4efd,0x80,0x20,0x67,0xd1,0x46,0xa8,0x50,0xe0, 34);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_RemovalPolicyOverride, 0xa45c254e,0xdf1c,0x4efd,0x80,0x20,0x67,0xd1,0x46,0xa8,0x50,0xe0, 35);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_InstallState, 0xa45c254e,0xdf1c,0x4efd,0x80,0x20,0x67,0xd1,0x46,0xa8,0x50,0xe0, 36);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_LocationPaths, 0xa45c254e,0xdf1c,0x4efd,0x80,0x20,0x67,0xd1,0x46,0xa8,0x50,0xe0, 37);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_BaseContainerId, 0xa45c254e,0xdf1c,0x4efd,0x80,0x20,0x67,0xd1,0x46,0xa8,0x50,0xe0, 38);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_InstanceId, 0x78c34fc8,0x104a,0x4aca,0x9e,0xa4,0x52,0x4d,0x52,0x99,0x6e,0x57, 256);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_DevNodeStatus, 0x4340a6c5,0x93fa,0x4706,0x97,0x2c,0x7b,0x64,0x80,0x08,0xa5,0xa7, 2);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_ProblemCode, 0x4340a6c5,0x93fa,0x4706,0x97,0x2c,0x7b,0x64,0x80,0x08,0xa5,0xa7, 3);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_EjectionRelations, 0x4340a6c5,0x93fa,0x4706,0x97,0x2c,0x7b,0x64,0x80,0x08,0xa5,0xa7, 4);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_RemovalRelations, 0x4340a6c5,0x93fa,0x4706,0x97,0x2c,0x7b,0x64,0x80,0x08,0xa5,0xa7, 5);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_PowerRelations, 0x4340a6c5,0x93fa,0x4706,0x97,0x2c,0x7b,0x64,0x80,0x08,0xa5,0xa7, 6);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_BusRelations, 0x4340a6c5,0x93fa,0x4706,0x97,0x2c,0x7b,0x64,0x80,0x08,0xa5,0xa7, 7);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_Parent, 0x4340a6c5,0x93fa,0x4706,0x97,0x2c,0x7b,0x64,0x80,0x08,0xa5,0xa7, 8);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_Children, 0x4340a6c5,0x93fa,0x4706,0x97,0x2c,0x7b,0x64,0x80,0x08,0xa5,0xa7, 9);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_Siblings, 0x4340a6c5,0x93fa,0x4706,0x97,0x2c,0x7b,0x64,0x80,0x08,0xa5,0xa7, 10);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_TransportRelations, 0x4340a6c5,0x93fa,0x4706,0x97,0x2c,0x7b,0x64,0x80,0x08,0xa5,0xa7, 11);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_ProblemStatus, 0x4340a6c5,0x93fa,0x4706,0x97,0x2c,0x7b,0x64,0x80,0x08,0xa5,0xa7, 12);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_Reported, 0x80497100,0x8c73,0x48b9,0xaa,0xd9,0xce,0x38,0x7e,0x19,0xc5,0x6e, 2);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_Legacy, 0x80497100,0x8c73,0x48b9,0xaa,0xd9,0xce,0x38,0x7e,0x19,0xc5,0x6e, 3);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_ContainerId, 0x8c7ed206,0x3f8a,0x4827,0xb3,0xab,0xae,0x9e,0x1f,0xae,0xfc,0x6c, 2);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_InLocalMachineContainer, 0x8c7ed206,0x3f8a,0x4827,0xb3,0xab,0xae,0x9e,0x1f,0xae,0xfc,0x6c, 4);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_Model, 0x78c34fc8,0x104a,0x4aca,0x9e,0xa4,0x52,0x4d,0x52,0x99,0x6e,0x57, 39);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_ModelId, 0x80d81ea6,0x7473,0x4b0c,0x82,0x16,0xef,0xc1,0x1a,0x2c,0x4c,0x8b, 2);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_FriendlyNameAttributes, 0x80d81ea6,0x7473,0x4b0c,0x82,0x16,0xef,0xc1,0x1a,0x2c,0x4c,0x8b, 3);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_ManufacturerAttributes, 0x80d81ea6,0x7473,0x4b0c,0x82,0x16,0xef,0xc1,0x1a,0x2c,0x4c,0x8b, 4);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_PresenceNotForDevice, 0x80d81ea6,0x7473,0x4b0c,0x82,0x16,0xef,0xc1,0x1a,0x2c,0x4c,0x8b, 5);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_SignalStrength, 0x80d81ea6,0x7473,0x4b0c,0x82,0x16,0xef,0xc1,0x1a,0x2c,0x4c,0x8b, 6);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_IsAssociateableByUserAction, 0x80d81ea6,0x7473,0x4b0c,0x82,0x16,0xef,0xc1,0x1a,0x2c,0x4c,0x8b, 7);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_ShowInUninstallUI, 0x80d81ea6,0x7473,0x4b0c,0x82,0x16,0xef,0xc1,0x1a,0x2c,0x4c,0x8b, 8);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_Numa_Proximity_Domain, 0x540b947e,0x8b40,0x45bc,0xa8,0xa2,0x6a,0x0b,0x89,0x4c,0xbd,0xa2, 1);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_DHP_Rebalance_Policy, 0x540b947e,0x8b40,0x45bc,0xa8,0xa2,0x6a,0x0b,0x89,0x4c,0xbd,0xa2, 2);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_Numa_Node, 0x540b947e,0x8b40,0x45bc,0xa8,0xa2,0x6a,0x0b,0x89,0x4c,0xbd,0xa2, 3);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_BusReportedDeviceDesc, 0x540b947e,0x8b40,0x45bc,0xa8,0xa2,0x6a,0x0b,0x89,0x4c,0xbd,0xa2, 4);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_IsPresent, 0x540b947e,0x8b40,0x45bc,0xa8,0xa2,0x6a,0x0b,0x89,0x4c,0xbd,0xa2, 5);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_HasProblem, 0x540b947e,0x8b40,0x45bc,0xa8,0xa2,0x6a,0x0b,0x89,0x4c,0xbd,0xa2, 6);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_ConfigurationId, 0x540b947e,0x8b40,0x45bc,0xa8,0xa2,0x6a,0x0b,0x89,0x4c,0xbd,0xa2, 7);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_ReportedDeviceIdsHash, 0x540b947e,0x8b40,0x45bc,0xa8,0xa2,0x6a,0x0b,0x89,0x4c,0xbd,0xa2, 8);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_PhysicalDeviceLocation, 0x540b947e,0x8b40,0x45bc,0xa8,0xa2,0x6a,0x0b,0x89,0x4c,0xbd,0xa2, 9);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_BiosDeviceName, 0x540b947e,0x8b40,0x45bc,0xa8,0xa2,0x6a,0x0b,0x89,0x4c,0xbd,0xa2, 10);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_DriverProblemDesc, 0x540b947e,0x8b40,0x45bc,0xa8,0xa2,0x6a,0x0b,0x89,0x4c,0xbd,0xa2, 11);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_DebuggerSafe, 0x540b947e,0x8b40,0x45bc,0xa8,0xa2,0x6a,0x0b,0x89,0x4c,0xbd,0xa2, 12);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_PostInstallInProgress, 0x540b947e,0x8b40,0x45bc,0xa8,0xa2,0x6a,0x0b,0x89,0x4c,0xbd,0xa2, 13);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_Stack, 0x540b947e,0x8b40,0x45bc,0xa8,0xa2,0x6a,0x0b,0x89,0x4c,0xbd,0xa2, 14);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_ExtendedConfigurationIds, 0x540b947e,0x8b40,0x45bc,0xa8,0xa2,0x6a,0x0b,0x89,0x4c,0xbd,0xa2, 15);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_IsRebootRequired, 0x540b947e,0x8b40,0x45bc,0xa8,0xa2,0x6a,0x0b,0x89,0x4c,0xbd,0xa2, 16);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_FirmwareDate, 0x540b947e,0x8b40,0x45bc,0xa8,0xa2,0x6a,0x0b,0x89,0x4c,0xbd,0xa2, 17);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_FirmwareVersion, 0x540b947e,0x8b40,0x45bc,0xa8,0xa2,0x6a,0x0b,0x89,0x4c,0xbd,0xa2, 18);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_FirmwareRevision, 0x540b947e,0x8b40,0x45bc,0xa8,0xa2,0x6a,0x0b,0x89,0x4c,0xbd,0xa2, 19);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_DependencyProviders, 0x540b947e,0x8b40,0x45bc,0xa8,0xa2,0x6a,0x0b,0x89,0x4c,0xbd,0xa2, 20);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_DependencyDependents, 0x540b947e,0x8b40,0x45bc,0xa8,0xa2,0x6a,0x0b,0x89,0x4c,0xbd,0xa2, 21);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_SoftRestartSupported, 0x540b947e,0x8b40,0x45bc,0xa8,0xa2,0x6a,0x0b,0x89,0x4c,0xbd,0xa2, 22);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_ExtendedAddress, 0x540b947e,0x8b40,0x45bc,0xa8,0xa2,0x6a,0x0b,0x89,0x4c,0xbd,0xa2, 23);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_SessionId, 0x83da6326,0x97a6,0x4088,0x94,0x53,0xa1,0x92,0x3f,0x57,0x3b,0x29, 6);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_InstallDate, 0x83da6326,0x97a6,0x4088,0x94,0x53,0xa1,0x92,0x3f,0x57,0x3b,0x29, 100);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_FirstInstallDate, 0x83da6326,0x97a6,0x4088,0x94,0x53,0xa1,0x92,0x3f,0x57,0x3b,0x29, 101);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_LastArrivalDate, 0x83da6326,0x97a6,0x4088,0x94,0x53,0xa1,0x92,0x3f,0x57,0x3b,0x29, 102);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_LastRemovalDate, 0x83da6326,0x97a6,0x4088,0x94,0x53,0xa1,0x92,0x3f,0x57,0x3b,0x29, 103);
 DEFINE_DEVPROPKEY(DEVPKEY_Device_DriverDate, 0xa8b865dd,0x2e3d,0x4094,0xad,0x97,0xe5,0x93,0xa7,0xc,0x75,0xd6, 2);
 DEFINE_DEVPROPKEY(DEVPKEY_Device_DriverVersion, 0xa8b865dd,0x2e3d,0x4094,0xad,0x97,0xe5,0x93,0xa7,0xc,0x75,0xd6, 3);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_DriverDesc, 0xa8b865dd,0x2e3d,0x4094,0xad,0x97,0xe5,0x93,0xa7,0xc,0x75,0xd6, 4);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_DriverInfPath, 0xa8b865dd,0x2e3d,0x4094,0xad,0x97,0xe5,0x93,0xa7,0xc,0x75,0xd6, 5);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_DriverInfSection, 0xa8b865dd,0x2e3d,0x4094,0xad,0x97,0xe5,0x93,0xa7,0xc,0x75,0xd6, 6);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_DriverInfSectionExt, 0xa8b865dd,0x2e3d,0x4094,0xad,0x97,0xe5,0x93,0xa7,0xc,0x75,0xd6, 7);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_MatchingDeviceId, 0xa8b865dd,0x2e3d,0x4094,0xad,0x97,0xe5,0x93,0xa7,0xc,0x75,0xd6, 8);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_DriverProvider, 0xa8b865dd,0x2e3d,0x4094,0xad,0x97,0xe5,0x93,0xa7,0xc,0x75,0xd6, 9);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_DriverPropPageProvider, 0xa8b865dd,0x2e3d,0x4094,0xad,0x97,0xe5,0x93,0xa7,0xc,0x75,0xd6, 10);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_DriverCoInstallers, 0xa8b865dd,0x2e3d,0x4094,0xad,0x97,0xe5,0x93,0xa7,0xc,0x75,0xd6, 11);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_ResourcePickerTags, 0xa8b865dd,0x2e3d,0x4094,0xad,0x97,0xe5,0x93,0xa7,0xc,0x75,0xd6, 12);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_ResourcePickerExceptions, 0xa8b865dd,0x2e3d,0x4094,0xad,0x97,0xe5,0x93,0xa7,0xc,0x75,0xd6, 13);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_DriverRank, 0xa8b865dd,0x2e3d,0x4094,0xad,0x97,0xe5,0x93,0xa7,0xc,0x75,0xd6, 14);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_DriverLogoLevel, 0xa8b865dd,0x2e3d,0x4094,0xad,0x97,0xe5,0x93,0xa7,0xc,0x75,0xd6, 15);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_NoConnectSound, 0xa8b865dd,0x2e3d,0x4094,0xad,0x97,0xe5,0x93,0xa7,0xc,0x75,0xd6, 17);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_GenericDriverInstalled, 0xa8b865dd,0x2e3d,0x4094,0xad,0x97,0xe5,0x93,0xa7,0xc,0x75,0xd6, 18);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_AdditionalSoftwareRequested, 0xa8b865dd,0x2e3d,0x4094,0xad,0x97,0xe5,0x93,0xa7,0xc,0x75,0xd6, 19);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_SafeRemovalRequired, 0xafd97640,0x86a3,0x4210,0xb6,0x7c,0x28,0x9c,0x41,0xaa,0xbe,0x55, 2);
+DEFINE_DEVPROPKEY(DEVPKEY_Device_SafeRemovalRequiredOverride, 0xafd97640,0x86a3,0x4210,0xb6,0x7c,0x28,0x9c,0x41,0xaa,0xbe,0x55, 3);
+
+DEFINE_DEVPROPKEY(DEVPKEY_DrvPkg_Model, 0xcf73bb51,0x3abf,0x44a2,0x85,0xe0,0x9a,0x3d,0xc7,0xa1,0x21,0x32, 2);
+DEFINE_DEVPROPKEY(DEVPKEY_DrvPkg_VendorWebSite, 0xcf73bb51,0x3abf,0x44a2,0x85,0xe0,0x9a,0x3d,0xc7,0xa1,0x21,0x32, 3);
+DEFINE_DEVPROPKEY(DEVPKEY_DrvPkg_DetailedDescription, 0xcf73bb51,0x3abf,0x44a2,0x85,0xe0,0x9a,0x3d,0xc7,0xa1,0x21,0x32, 4);
+DEFINE_DEVPROPKEY(DEVPKEY_DrvPkg_DocumentationLink, 0xcf73bb51,0x3abf,0x44a2,0x85,0xe0,0x9a,0x3d,0xc7,0xa1,0x21,0x32, 5);
+DEFINE_DEVPROPKEY(DEVPKEY_DrvPkg_Icon, 0xcf73bb51,0x3abf,0x44a2,0x85,0xe0,0x9a,0x3d,0xc7,0xa1,0x21,0x32, 6);
+DEFINE_DEVPROPKEY(DEVPKEY_DrvPkg_BrandingIcon, 0xcf73bb51,0x3abf,0x44a2,0x85,0xe0,0x9a,0x3d,0xc7,0xa1,0x21,0x32, 7);
+
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceClass_UpperFilters, 0x4321918b,0xf69e,0x470d,0xa5,0xde,0x4d,0x88,0xc7,0x5a,0xd2,0x4b, 19);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceClass_LowerFilters, 0x4321918b,0xf69e,0x470d,0xa5,0xde,0x4d,0x88,0xc7,0x5a,0xd2,0x4b, 20);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceClass_Security, 0x4321918b,0xf69e,0x470d,0xa5,0xde,0x4d,0x88,0xc7,0x5a,0xd2,0x4b, 25);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceClass_SecuritySDS, 0x4321918b,0xf69e,0x470d,0xa5,0xde,0x4d,0x88,0xc7,0x5a,0xd2,0x4b, 26);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceClass_DevType, 0x4321918b,0xf69e,0x470d,0xa5,0xde,0x4d,0x88,0xc7,0x5a,0xd2,0x4b, 27);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceClass_Exclusive, 0x4321918b,0xf69e,0x470d,0xa5,0xde,0x4d,0x88,0xc7,0x5a,0xd2,0x4b, 28);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceClass_Characteristics, 0x4321918b,0xf69e,0x470d,0xa5,0xde,0x4d,0x88,0xc7,0x5a,0xd2,0x4b, 29);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceClass_Name, 0x259abffc,0x50a7,0x47ce,0xaf,0x8,0x68,0xc9,0xa7,0xd7,0x33,0x66, 2);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceClass_ClassName, 0x259abffc,0x50a7,0x47ce,0xaf,0x8,0x68,0xc9,0xa7,0xd7,0x33,0x66, 3);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceClass_Icon, 0x259abffc,0x50a7,0x47ce,0xaf,0x8,0x68,0xc9,0xa7,0xd7,0x33,0x66, 4);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceClass_ClassInstaller, 0x259abffc,0x50a7,0x47ce,0xaf,0x8,0x68,0xc9,0xa7,0xd7,0x33,0x66, 5);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceClass_PropPageProvider, 0x259abffc,0x50a7,0x47ce,0xaf,0x8,0x68,0xc9,0xa7,0xd7,0x33,0x66, 6);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceClass_NoInstallClass, 0x259abffc,0x50a7,0x47ce,0xaf,0x8,0x68,0xc9,0xa7,0xd7,0x33,0x66, 7);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceClass_NoDisplayClass, 0x259abffc,0x50a7,0x47ce,0xaf,0x8,0x68,0xc9,0xa7,0xd7,0x33,0x66, 8);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceClass_SilentInstall, 0x259abffc,0x50a7,0x47ce,0xaf,0x8,0x68,0xc9,0xa7,0xd7,0x33,0x66, 9);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceClass_NoUseClass, 0x259abffc,0x50a7,0x47ce,0xaf,0x8,0x68,0xc9,0xa7,0xd7,0x33,0x66, 10);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceClass_DefaultService, 0x259abffc,0x50a7,0x47ce,0xaf,0x8,0x68,0xc9,0xa7,0xd7,0x33,0x66, 11);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceClass_IconPath, 0x259abffc,0x50a7,0x47ce,0xaf,0x8,0x68,0xc9,0xa7,0xd7,0x33,0x66, 12);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceClass_DHPRebalanceOptOut, 0xd14d3ef3,0x66cf,0x4ba2,0x9d,0x38,0x0d,0xdb,0x37,0xab,0x47,0x01, 2);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceClass_ClassCoInstallers, 0x713d1703,0xa2e2,0x49f5,0x92,0x14,0x56,0x47,0x2e,0xf3,0xda,0x5c, 2);
+
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceInterface_FriendlyName, 0x026e516e,0xb814,0x414b,0x83,0xcd,0x85,0x6d,0x6f,0xef,0x48,0x22, 2);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceInterface_Enabled, 0x026e516e,0xb814,0x414b,0x83,0xcd,0x85,0x6d,0x6f,0xef,0x48,0x22, 3);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceInterface_ClassGuid, 0x026e516e,0xb814,0x414b,0x83,0xcd,0x85,0x6d,0x6f,0xef,0x48,0x22, 4);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceInterface_ReferenceString, 0x026e516e,0xb814,0x414b,0x83,0xcd,0x85,0x6d,0x6f,0xef,0x48,0x22, 5);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceInterface_Restricted, 0x026e516e,0xb814,0x414b,0x83,0xcd,0x85,0x6d,0x6f,0xef,0x48,0x22, 6);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceInterface_UnrestrictedAppCapabilities, 0x026e516e,0xb814,0x414b,0x83,0xcd,0x85,0x6d,0x6f,0xef,0x48,0x22, 8);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceInterface_SchematicName, 0x026e516e,0xb814,0x414b,0x83,0xcd,0x85,0x6d,0x6f,0xef,0x48,0x22, 9);
+
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceInterfaceClass_DefaultInterface, 0x14c83a99,0x0b3f,0x44b7,0xbe,0x4c,0xa1,0x78,0xd3,0x99,0x05,0x64, 2);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceInterfaceClass_Name, 0x14c83a99,0x0b3f,0x44b7,0xbe,0x4c,0xa1,0x78,0xd3,0x99,0x05,0x64, 3);
+
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_Address, 0x78c34fc8,0x104a,0x4aca,0x9e,0xa4,0x52,0x4d,0x52,0x99,0x6e,0x57, 51);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_DiscoveryMethod, 0x78c34fc8,0x104a,0x4aca,0x9e,0xa4,0x52,0x4d,0x52,0x99,0x6e,0x57, 52);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_IsEncrypted, 0x78c34fc8,0x104a,0x4aca,0x9e,0xa4,0x52,0x4d,0x52,0x99,0x6e,0x57, 53);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_IsAuthenticated, 0x78c34fc8,0x104a,0x4aca,0x9e,0xa4,0x52,0x4d,0x52,0x99,0x6e,0x57, 54);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_IsConnected, 0x78c34fc8,0x104a,0x4aca,0x9e,0xa4,0x52,0x4d,0x52,0x99,0x6e,0x57, 55);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_IsPaired, 0x78c34fc8,0x104a,0x4aca,0x9e,0xa4,0x52,0x4d,0x52,0x99,0x6e,0x57, 56);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_Icon, 0x78c34fc8,0x104a,0x4aca,0x9e,0xa4,0x52,0x4d,0x52,0x99,0x6e,0x57, 57);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_Version, 0x78c34fc8,0x104a,0x4aca,0x9e,0xa4,0x52,0x4d,0x52,0x99,0x6e,0x57, 65);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_Last_Seen, 0x78c34fc8,0x104a,0x4aca,0x9e,0xa4,0x52,0x4d,0x52,0x99,0x6e,0x57, 66);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_Last_Connected, 0x78c34fc8,0x104a,0x4aca,0x9e,0xa4,0x52,0x4d,0x52,0x99,0x6e,0x57, 67);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_IsShowInDisconnectedState, 0x78c34fc8,0x104a,0x4aca,0x9e,0xa4,0x52,0x4d,0x52,0x99,0x6e,0x57, 68);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_IsLocalMachine, 0x78c34fc8,0x104a,0x4aca,0x9e,0xa4,0x52,0x4d,0x52,0x99,0x6e,0x57, 70);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_MetadataPath, 0x78c34fc8,0x104a,0x4aca,0x9e,0xa4,0x52,0x4d,0x52,0x99,0x6e,0x57, 71);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_IsMetadataSearchInProgress, 0x78c34fc8,0x104a,0x4aca,0x9e,0xa4,0x52,0x4d,0x52,0x99,0x6e,0x57, 72);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_MetadataChecksum, 0x78c34fc8,0x104a,0x4aca,0x9e,0xa4,0x52,0x4d,0x52,0x99,0x6e,0x57, 73);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_IsNotInterestingForDisplay, 0x78c34fc8,0x104a,0x4aca,0x9e,0xa4,0x52,0x4d,0x52,0x99,0x6e,0x57, 74);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_LaunchDeviceStageOnDeviceConnect, 0x78c34fc8,0x104a,0x4aca,0x9e,0xa4,0x52,0x4d,0x52,0x99,0x6e,0x57, 76);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_LaunchDeviceStageFromExplorer, 0x78c34fc8,0x104a,0x4aca,0x9e,0xa4,0x52,0x4d,0x52,0x99,0x6e,0x57, 77);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_BaselineExperienceId, 0x78c34fc8,0x104a,0x4aca,0x9e,0xa4,0x52,0x4d,0x52,0x99,0x6e,0x57, 78);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_IsDeviceUniquelyIdentifiable, 0x78c34fc8,0x104a,0x4aca,0x9e,0xa4,0x52,0x4d,0x52,0x99,0x6e,0x57, 79);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_AssociationArray, 0x78c34fc8,0x104a,0x4aca,0x9e,0xa4,0x52,0x4d,0x52,0x99,0x6e,0x57, 80);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_DeviceDescription1, 0x78c34fc8,0x104a,0x4aca,0x9e,0xa4,0x52,0x4d,0x52,0x99,0x6e,0x57, 81);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_DeviceDescription2, 0x78c34fc8,0x104a,0x4aca,0x9e,0xa4,0x52,0x4d,0x52,0x99,0x6e,0x57, 82);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_HasProblem, 0x78c34fc8,0x104a,0x4aca,0x9e,0xa4,0x52,0x4d,0x52,0x99,0x6e,0x57, 83);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_IsSharedDevice, 0x78c34fc8,0x104a,0x4aca,0x9e,0xa4,0x52,0x4d,0x52,0x99,0x6e,0x57, 84);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_IsNetworkDevice, 0x78c34fc8,0x104a,0x4aca,0x9e,0xa4,0x52,0x4d,0x52,0x99,0x6e,0x57, 85);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_IsDefaultDevice, 0x78c34fc8,0x104a,0x4aca,0x9e,0xa4,0x52,0x4d,0x52,0x99,0x6e,0x57, 86);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_MetadataCabinet, 0x78c34fc8,0x104a,0x4aca,0x9e,0xa4,0x52,0x4d,0x52,0x99,0x6e,0x57, 87);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_RequiresPairingElevation, 0x78c34fc8,0x104a,0x4aca,0x9e,0xa4,0x52,0x4d,0x52,0x99,0x6e,0x57, 88);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_ExperienceId, 0x78c34fc8,0x104a,0x4aca,0x9e,0xa4,0x52,0x4d,0x52,0x99,0x6e,0x57, 89);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_Category, 0x78c34fc8,0x104a,0x4aca,0x9e,0xa4,0x52,0x4d,0x52,0x99,0x6e,0x57, 90);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_Category_Desc_Singular, 0x78c34fc8,0x104a,0x4aca,0x9e,0xa4,0x52,0x4d,0x52,0x99,0x6e,0x57, 91);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_Category_Desc_Plural, 0x78c34fc8,0x104a,0x4aca,0x9e,0xa4,0x52,0x4d,0x52,0x99,0x6e,0x57, 92);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_Category_Icon, 0x78c34fc8,0x104a,0x4aca,0x9e,0xa4,0x52,0x4d,0x52,0x99,0x6e,0x57, 93);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_CategoryGroup_Desc, 0x78c34fc8,0x104a,0x4aca,0x9e,0xa4,0x52,0x4d,0x52,0x99,0x6e,0x57, 94);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_CategoryGroup_Icon, 0x78c34fc8,0x104a,0x4aca,0x9e,0xa4,0x52,0x4d,0x52,0x99,0x6e,0x57, 95);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_PrimaryCategory, 0x78c34fc8,0x104a,0x4aca,0x9e,0xa4,0x52,0x4d,0x52,0x99,0x6e,0x57, 97);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_UnpairUninstall, 0x78c34fc8,0x104a,0x4aca,0x9e,0xa4,0x52,0x4d,0x52,0x99,0x6e,0x57, 98);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_RequiresUninstallElevation, 0x78c34fc8,0x104a,0x4aca,0x9e,0xa4,0x52,0x4d,0x52,0x99,0x6e,0x57, 99);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_DeviceFunctionSubRank, 0x78c34fc8,0x104a,0x4aca,0x9e,0xa4,0x52,0x4d,0x52,0x99,0x6e,0x57, 100);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_AlwaysShowDeviceAsConnected, 0x78c34fc8,0x104a,0x4aca,0x9e,0xa4,0x52,0x4d,0x52,0x99,0x6e,0x57, 101);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_ConfigFlags, 0x78c34fc8,0x104a,0x4aca,0x9e,0xa4,0x52,0x4d,0x52,0x99,0x6e,0x57, 105);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_PrivilegedPackageFamilyNames, 0x78c34fc8,0x104a,0x4aca,0x9e,0xa4,0x52,0x4d,0x52,0x99,0x6e,0x57, 106);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_CustomPrivilegedPackageFamilyNames, 0x78c34fc8,0x104a,0x4aca,0x9e,0xa4,0x52,0x4d,0x52,0x99,0x6e,0x57, 107);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_IsRebootRequired, 0x78c34fc8,0x104a,0x4aca,0x9e,0xa4,0x52,0x4d,0x52,0x99,0x6e,0x57, 108);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_FriendlyName, 0x656A3BB3,0xECC0,0x43FD,0x84,0x77,0x4A,0xE0,0x40,0x4A,0x96,0xCD, 12288);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_Manufacturer, 0x656A3BB3,0xECC0,0x43FD,0x84,0x77,0x4A,0xE0,0x40,0x4A,0x96,0xCD, 8192);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_ModelName, 0x656A3BB3,0xECC0,0x43FD,0x84,0x77,0x4A,0xE0,0x40,0x4A,0x96,0xCD, 8194);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_ModelNumber, 0x656A3BB3,0xECC0,0x43FD,0x84,0x77,0x4A,0xE0,0x40,0x4A,0x96,0xCD, 8195);
+DEFINE_DEVPROPKEY(DEVPKEY_DeviceContainer_InstallInProgress, 0x83da6326,0x97a6,0x4088,0x94,0x53,0xa1,0x92,0x3f,0x57,0x3b,0x29, 9);
+
+DEFINE_DEVPROPKEY(DEVPKEY_DevQuery_ObjectType, 0x13673f42,0xa3d6,0x49f6,0xb4,0xda,0xae,0x46,0xe0,0xc5,0x23,0x7c, 2);
+
+#define DEVPKEY_Numa_Proximity_Domain DEVPKEY_Device_Numa_Proximity_Domain
+
+#define DEVPKEY_DeviceDisplay_DiscoveryMethod DEVPKEY_DeviceContainer_DiscoveryMethod
+#define DEVPKEY_DeviceDisplay_IsShowInDisconnectedState DEVPKEY_DeviceContainer_IsShowInDisconnectedState
+#define DEVPKEY_DeviceDisplay_IsNotInterestingForDisplay DEVPKEY_DeviceContainer_IsNotInterestingForDisplay
+#define DEVPKEY_DeviceDisplay_IsNetworkDevice DEVPKEY_DeviceContainer_IsNetworkDevice
+#define DEVPKEY_DeviceDisplay_Category DEVPKEY_DeviceContainer_Category
+#define DEVPKEY_DeviceDisplay_UnpairUninstall DEVPKEY_DeviceContainer_UnpairUninstall
+#define DEVPKEY_DeviceDisplay_RequiresUninstallElevation DEVPKEY_DeviceContainer_RequiresUninstallElevation
+#define DEVPKEY_DeviceDisplay_AlwaysShowDeviceAsConnected DEVPKEY_DeviceContainer_AlwaysShowDeviceAsConnected
diff --git a/mingw-w64-headers/include/xapo.h b/mingw-w64-headers/include/xapo.h
new file mode 100644
index 0000000..5ab493d
--- /dev/null
+++ b/mingw-w64-headers/include/xapo.h
@@ -0,0 +1,415 @@
+/*** Autogenerated by WIDL 5.13 from include/xapo.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 __xapo_h__
+#define __xapo_h__
+
+/* Forward declarations */
+
+#ifndef __IXAPO_FWD_DEFINED__
+#define __IXAPO_FWD_DEFINED__
+typedef interface IXAPO IXAPO;
+#ifdef __cplusplus
+interface IXAPO;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IXAPOParameters_FWD_DEFINED__
+#define __IXAPOParameters_FWD_DEFINED__
+typedef interface IXAPOParameters IXAPOParameters;
+#ifdef __cplusplus
+interface IXAPOParameters;
+#endif /* __cplusplus */
+#endif
+
+/* Headers for imported files */
+
+#include <unknwn.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define XAPO_FLAG_CHANNELS_MUST_MATCH 0x1
+#define XAPO_FLAG_FRAMERATE_MUST_MATCH 0x2
+#define XAPO_FLAG_BITSPERSAMPLE_MUST_MATCH 0x4
+#define XAPO_FLAG_BUFFERCOUNT_MUST_MATCH 0x8
+#define XAPO_FLAG_INPLACE_SUPPORTED 0x10
+#define XAPO_FLAG_INPLACE_REQUIRED 0x20
+#if 0
+typedef struct WAVEFORMATEX {
+    WORD wFormatTag;
+    WORD nChannels;
+    DWORD nSamplesPerSec;
+    DWORD nAvgBytesPerSec;
+    WORD nBlockAlign;
+    WORD wBitsPerSample;
+    WORD cbSize;
+} WAVEFORMATEX;
+typedef struct __WIDL_xapo_generated_name_0000000C {
+    WAVEFORMATEX Format;
+    union {
+        WORD wValidBitsPerSample;
+        WORD wSamplesPerBlock;
+        WORD wReserved;
+    } Samples;
+    DWORD dwChannelMask;
+    GUID SubFormat;
+} WAVEFORMATEXTENSIBLE;
+typedef struct __WIDL_xapo_generated_name_0000000C *PWAVEFORMATEXTENSIBLE;
+#else
+#include <mmreg.h>
+#endif
+typedef struct XAPO_REGISTRATION_PROPERTIES {
+    CLSID clsid;
+    WCHAR FriendlyName[256];
+    WCHAR CopyrightInfo[256];
+    UINT32 MajorVersion;
+    UINT32 MinorVersion;
+    UINT32 Flags;
+    UINT32 MinInputBufferCount;
+    UINT32 MaxInputBufferCount;
+    UINT32 MinOutputBufferCount;
+    UINT32 MaxOutputBufferCount;
+} XAPO_REGISTRATION_PROPERTIES;
+typedef struct XAPO20_REGISTRATION_PROPERTIES {
+    CLSID clsid;
+    WCHAR FriendlyName[256];
+    WCHAR CopyrightInfo[256];
+    UINT32 MajorVersion;
+    UINT32 MinorVersion;
+    UINT32 Flags;
+    UINT32 MinInputBufferCount;
+    UINT32 MaxInputBufferCount;
+    UINT32 MinOutputBufferCount;
+    UINT32 MaxOutputBufferCount;
+    UINT32 InterfaceCount;
+    IID InterfaceArray[1];
+} XAPO20_REGISTRATION_PROPERTIES;
+typedef struct XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS {
+    const WAVEFORMATEX *pFormat;
+    UINT32 MaxFrameCount;
+} XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS;
+typedef enum XAPO_BUFFER_FLAGS {
+    XAPO_BUFFER_SILENT = 0,
+    XAPO_BUFFER_VALID = 1
+} XAPO_BUFFER_FLAGS;
+typedef struct XAPO_PROCESS_BUFFER_PARAMETERS {
+    void *pBuffer;
+    XAPO_BUFFER_FLAGS BufferFlags;
+    UINT32 ValidFrameCount;
+} XAPO_PROCESS_BUFFER_PARAMETERS;
+/*****************************************************************************
+ * IXAPO interface
+ */
+#ifndef __IXAPO_INTERFACE_DEFINED__
+#define __IXAPO_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IXAPO, 0xa410b984, 0x9839, 0x4819, 0xa0,0xbe, 0x28,0x56,0xae,0x6b,0x3a,0xdb);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("a410b984-9839-4819-a0be-2856ae6b3adb")
+IXAPO : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetRegistrationProperties(
+        XAPO_REGISTRATION_PROPERTIES **props) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE IsInputFormatSupported(
+        const WAVEFORMATEX *output_fmt,
+        const WAVEFORMATEX *input_fmt,
+        WAVEFORMATEX **supported_fmt) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE IsOutputFormatSupported(
+        const WAVEFORMATEX *input_fmt,
+        const WAVEFORMATEX *output_fmt,
+        WAVEFORMATEX **supported_fmt) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Initialize(
+        const void *data,
+        UINT32 data_len) = 0;
+
+    virtual void STDMETHODCALLTYPE Reset(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE LockForProcess(
+        UINT32 in_params_count,
+        const XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS *in_params,
+        UINT32 out_params_count,
+        const XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS *out_params) = 0;
+
+    virtual void STDMETHODCALLTYPE UnlockForProcess(
+        ) = 0;
+
+    virtual void STDMETHODCALLTYPE Process(
+        UINT32 in_params_count,
+        const XAPO_PROCESS_BUFFER_PARAMETERS *in_params,
+        UINT32 out_params_count,
+        XAPO_PROCESS_BUFFER_PARAMETERS *out_params,
+        WINBOOL enabled) = 0;
+
+    virtual UINT32 STDMETHODCALLTYPE CalcInputFrames(
+        UINT32 output_frames) = 0;
+
+    virtual UINT32 STDMETHODCALLTYPE CalcOutputFrames(
+        UINT32 input_frames) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IXAPO, 0xa410b984, 0x9839, 0x4819, 0xa0,0xbe, 0x28,0x56,0xae,0x6b,0x3a,0xdb)
+#endif
+#else
+typedef struct IXAPOVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IXAPO *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IXAPO *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IXAPO *This);
+
+    /*** IXAPO methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetRegistrationProperties)(
+        IXAPO *This,
+        XAPO_REGISTRATION_PROPERTIES **props);
+
+    HRESULT (STDMETHODCALLTYPE *IsInputFormatSupported)(
+        IXAPO *This,
+        const WAVEFORMATEX *output_fmt,
+        const WAVEFORMATEX *input_fmt,
+        WAVEFORMATEX **supported_fmt);
+
+    HRESULT (STDMETHODCALLTYPE *IsOutputFormatSupported)(
+        IXAPO *This,
+        const WAVEFORMATEX *input_fmt,
+        const WAVEFORMATEX *output_fmt,
+        WAVEFORMATEX **supported_fmt);
+
+    HRESULT (STDMETHODCALLTYPE *Initialize)(
+        IXAPO *This,
+        const void *data,
+        UINT32 data_len);
+
+    void (STDMETHODCALLTYPE *Reset)(
+        IXAPO *This);
+
+    HRESULT (STDMETHODCALLTYPE *LockForProcess)(
+        IXAPO *This,
+        UINT32 in_params_count,
+        const XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS *in_params,
+        UINT32 out_params_count,
+        const XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS *out_params);
+
+    void (STDMETHODCALLTYPE *UnlockForProcess)(
+        IXAPO *This);
+
+    void (STDMETHODCALLTYPE *Process)(
+        IXAPO *This,
+        UINT32 in_params_count,
+        const XAPO_PROCESS_BUFFER_PARAMETERS *in_params,
+        UINT32 out_params_count,
+        XAPO_PROCESS_BUFFER_PARAMETERS *out_params,
+        WINBOOL enabled);
+
+    UINT32 (STDMETHODCALLTYPE *CalcInputFrames)(
+        IXAPO *This,
+        UINT32 output_frames);
+
+    UINT32 (STDMETHODCALLTYPE *CalcOutputFrames)(
+        IXAPO *This,
+        UINT32 input_frames);
+
+    END_INTERFACE
+} IXAPOVtbl;
+
+interface IXAPO {
+    CONST_VTBL IXAPOVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IXAPO_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IXAPO_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IXAPO_Release(This) (This)->lpVtbl->Release(This)
+/*** IXAPO methods ***/
+#define IXAPO_GetRegistrationProperties(This,props) (This)->lpVtbl->GetRegistrationProperties(This,props)
+#define IXAPO_IsInputFormatSupported(This,output_fmt,input_fmt,supported_fmt) (This)->lpVtbl->IsInputFormatSupported(This,output_fmt,input_fmt,supported_fmt)
+#define IXAPO_IsOutputFormatSupported(This,input_fmt,output_fmt,supported_fmt) (This)->lpVtbl->IsOutputFormatSupported(This,input_fmt,output_fmt,supported_fmt)
+#define IXAPO_Initialize(This,data,data_len) (This)->lpVtbl->Initialize(This,data,data_len)
+#define IXAPO_Reset(This) (This)->lpVtbl->Reset(This)
+#define IXAPO_LockForProcess(This,in_params_count,in_params,out_params_count,out_params) (This)->lpVtbl->LockForProcess(This,in_params_count,in_params,out_params_count,out_params)
+#define IXAPO_UnlockForProcess(This) (This)->lpVtbl->UnlockForProcess(This)
+#define IXAPO_Process(This,in_params_count,in_params,out_params_count,out_params,enabled) (This)->lpVtbl->Process(This,in_params_count,in_params,out_params_count,out_params,enabled)
+#define IXAPO_CalcInputFrames(This,output_frames) (This)->lpVtbl->CalcInputFrames(This,output_frames)
+#define IXAPO_CalcOutputFrames(This,input_frames) (This)->lpVtbl->CalcOutputFrames(This,input_frames)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IXAPO_QueryInterface(IXAPO* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IXAPO_AddRef(IXAPO* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IXAPO_Release(IXAPO* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IXAPO methods ***/
+static FORCEINLINE HRESULT IXAPO_GetRegistrationProperties(IXAPO* This,XAPO_REGISTRATION_PROPERTIES **props) {
+    return This->lpVtbl->GetRegistrationProperties(This,props);
+}
+static FORCEINLINE HRESULT IXAPO_IsInputFormatSupported(IXAPO* This,const WAVEFORMATEX *output_fmt,const WAVEFORMATEX *input_fmt,WAVEFORMATEX **supported_fmt) {
+    return This->lpVtbl->IsInputFormatSupported(This,output_fmt,input_fmt,supported_fmt);
+}
+static FORCEINLINE HRESULT IXAPO_IsOutputFormatSupported(IXAPO* This,const WAVEFORMATEX *input_fmt,const WAVEFORMATEX *output_fmt,WAVEFORMATEX **supported_fmt) {
+    return This->lpVtbl->IsOutputFormatSupported(This,input_fmt,output_fmt,supported_fmt);
+}
+static FORCEINLINE HRESULT IXAPO_Initialize(IXAPO* This,const void *data,UINT32 data_len) {
+    return This->lpVtbl->Initialize(This,data,data_len);
+}
+static FORCEINLINE void IXAPO_Reset(IXAPO* This) {
+    This->lpVtbl->Reset(This);
+}
+static FORCEINLINE HRESULT IXAPO_LockForProcess(IXAPO* This,UINT32 in_params_count,const XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS *in_params,UINT32 out_params_count,const XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS *out_params) {
+    return This->lpVtbl->LockForProcess(This,in_params_count,in_params,out_params_count,out_params);
+}
+static FORCEINLINE void IXAPO_UnlockForProcess(IXAPO* This) {
+    This->lpVtbl->UnlockForProcess(This);
+}
+static FORCEINLINE void IXAPO_Process(IXAPO* This,UINT32 in_params_count,const XAPO_PROCESS_BUFFER_PARAMETERS *in_params,UINT32 out_params_count,XAPO_PROCESS_BUFFER_PARAMETERS *out_params,WINBOOL enabled) {
+    This->lpVtbl->Process(This,in_params_count,in_params,out_params_count,out_params,enabled);
+}
+static FORCEINLINE UINT32 IXAPO_CalcInputFrames(IXAPO* This,UINT32 output_frames) {
+    return This->lpVtbl->CalcInputFrames(This,output_frames);
+}
+static FORCEINLINE UINT32 IXAPO_CalcOutputFrames(IXAPO* This,UINT32 input_frames) {
+    return This->lpVtbl->CalcOutputFrames(This,input_frames);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IXAPO_INTERFACE_DEFINED__ */
+
+DEFINE_GUID(IID_IXAPO27, 0xa90bc001, 0xe897, 0xe897, 0x55, 0xe4, 0x9e, 0x47, 0x00, 0x00, 0x00, 0x00);
+/*****************************************************************************
+ * IXAPOParameters interface
+ */
+#ifndef __IXAPOParameters_INTERFACE_DEFINED__
+#define __IXAPOParameters_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IXAPOParameters, 0x26d95c66, 0x80f2, 0x499a, 0xad,0x54, 0x5a,0xe7,0xf0,0x1c,0x6d,0x98);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("26d95c66-80f2-499a-ad54-5ae7f01c6d98")
+IXAPOParameters : public IUnknown
+{
+    virtual void STDMETHODCALLTYPE SetParameters(
+        const void *params,
+        UINT32 params_len) = 0;
+
+    virtual void STDMETHODCALLTYPE GetParameters(
+        void *params,
+        UINT32 params_len) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IXAPOParameters, 0x26d95c66, 0x80f2, 0x499a, 0xad,0x54, 0x5a,0xe7,0xf0,0x1c,0x6d,0x98)
+#endif
+#else
+typedef struct IXAPOParametersVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IXAPOParameters *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IXAPOParameters *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IXAPOParameters *This);
+
+    /*** IXAPOParameters methods ***/
+    void (STDMETHODCALLTYPE *SetParameters)(
+        IXAPOParameters *This,
+        const void *params,
+        UINT32 params_len);
+
+    void (STDMETHODCALLTYPE *GetParameters)(
+        IXAPOParameters *This,
+        void *params,
+        UINT32 params_len);
+
+    END_INTERFACE
+} IXAPOParametersVtbl;
+
+interface IXAPOParameters {
+    CONST_VTBL IXAPOParametersVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IXAPOParameters_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IXAPOParameters_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IXAPOParameters_Release(This) (This)->lpVtbl->Release(This)
+/*** IXAPOParameters methods ***/
+#define IXAPOParameters_SetParameters(This,params,params_len) (This)->lpVtbl->SetParameters(This,params,params_len)
+#define IXAPOParameters_GetParameters(This,params,params_len) (This)->lpVtbl->GetParameters(This,params,params_len)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IXAPOParameters_QueryInterface(IXAPOParameters* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IXAPOParameters_AddRef(IXAPOParameters* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IXAPOParameters_Release(IXAPOParameters* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IXAPOParameters methods ***/
+static FORCEINLINE void IXAPOParameters_SetParameters(IXAPOParameters* This,const void *params,UINT32 params_len) {
+    This->lpVtbl->SetParameters(This,params,params_len);
+}
+static FORCEINLINE void IXAPOParameters_GetParameters(IXAPOParameters* This,void *params,UINT32 params_len) {
+    This->lpVtbl->GetParameters(This,params,params_len);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IXAPOParameters_INTERFACE_DEFINED__ */
+
+DEFINE_GUID(IID_IXAPO27Parameters, 0xa90bc001, 0xe897, 0xe897, 0x55, 0xe4, 0x9e, 0x47, 0x00, 0x00, 0x00, 0x01);
+/* Begin additional prototypes for all interfaces */
+
+
+/* End additional prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __xapo_h__ */
diff --git a/mingw-w64-headers/include/xapo.idl b/mingw-w64-headers/include/xapo.idl
new file mode 100644
index 0000000..841793d
--- /dev/null
+++ b/mingw-w64-headers/include/xapo.idl
@@ -0,0 +1,154 @@
+/*
+ * Copyright (c) 2015 Andrew Eikum for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+import "unknwn.idl";
+
+#define XAPO_REGISTRATION_STRING_LENGTH 256
+
+cpp_quote("#define XAPO_FLAG_CHANNELS_MUST_MATCH 0x1")
+cpp_quote("#define XAPO_FLAG_FRAMERATE_MUST_MATCH 0x2")
+cpp_quote("#define XAPO_FLAG_BITSPERSAMPLE_MUST_MATCH 0x4")
+cpp_quote("#define XAPO_FLAG_BUFFERCOUNT_MUST_MATCH 0x8")
+cpp_quote("#define XAPO_FLAG_INPLACE_SUPPORTED 0x10")
+cpp_quote("#define XAPO_FLAG_INPLACE_REQUIRED 0x20")
+
+cpp_quote("#if 0")
+typedef struct WAVEFORMATEX
+{
+    WORD wFormatTag;
+    WORD nChannels;
+    DWORD nSamplesPerSec;
+    DWORD nAvgBytesPerSec;
+    WORD nBlockAlign;
+    WORD wBitsPerSample;
+    WORD cbSize;
+} WAVEFORMATEX;
+
+typedef struct {
+    WAVEFORMATEX    Format;
+    union {
+        WORD        wValidBitsPerSample;
+        WORD        wSamplesPerBlock;
+        WORD        wReserved;
+    } Samples;
+    DWORD           dwChannelMask;
+    GUID            SubFormat;
+} WAVEFORMATEXTENSIBLE, *PWAVEFORMATEXTENSIBLE;
+cpp_quote("#else")
+cpp_quote("#include <mmreg.h>")
+cpp_quote("#endif")
+
+typedef struct XAPO_REGISTRATION_PROPERTIES
+{
+    CLSID clsid;
+    WCHAR FriendlyName[XAPO_REGISTRATION_STRING_LENGTH];
+    WCHAR CopyrightInfo[XAPO_REGISTRATION_STRING_LENGTH];
+    UINT32 MajorVersion;
+    UINT32 MinorVersion;
+    UINT32 Flags;
+    UINT32 MinInputBufferCount;
+    UINT32 MaxInputBufferCount;
+    UINT32 MinOutputBufferCount;
+    UINT32 MaxOutputBufferCount;
+} XAPO_REGISTRATION_PROPERTIES;
+
+typedef struct XAPO20_REGISTRATION_PROPERTIES
+{
+    CLSID clsid;
+    WCHAR FriendlyName[XAPO_REGISTRATION_STRING_LENGTH];
+    WCHAR CopyrightInfo[XAPO_REGISTRATION_STRING_LENGTH];
+    UINT32 MajorVersion;
+    UINT32 MinorVersion;
+    UINT32 Flags;
+    UINT32 MinInputBufferCount;
+    UINT32 MaxInputBufferCount;
+    UINT32 MinOutputBufferCount;
+    UINT32 MaxOutputBufferCount;
+    UINT32 InterfaceCount;
+    IID InterfaceArray[1];
+} XAPO20_REGISTRATION_PROPERTIES;
+
+typedef struct XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS {
+    const WAVEFORMATEX *pFormat;
+    UINT32 MaxFrameCount;
+} XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS;
+
+typedef enum XAPO_BUFFER_FLAGS {
+    XAPO_BUFFER_SILENT,
+    XAPO_BUFFER_VALID
+} XAPO_BUFFER_FLAGS;
+
+typedef struct XAPO_PROCESS_BUFFER_PARAMETERS {
+    void *pBuffer;
+    XAPO_BUFFER_FLAGS BufferFlags;
+    UINT32 ValidFrameCount;
+} XAPO_PROCESS_BUFFER_PARAMETERS;
+
+/* XAudio2 2.8 version of IXAPO */
+[
+    object,
+    local,
+    uuid(a410b984-9839-4819-a0be-2856ae6b3adb)
+]
+interface IXAPO : IUnknown
+{
+    HRESULT GetRegistrationProperties([out] XAPO_REGISTRATION_PROPERTIES **props);
+
+    HRESULT IsInputFormatSupported(const WAVEFORMATEX *output_fmt,
+        const WAVEFORMATEX *input_fmt, WAVEFORMATEX **supported_fmt);
+
+    HRESULT IsOutputFormatSupported(const WAVEFORMATEX *input_fmt,
+        const WAVEFORMATEX *output_fmt, WAVEFORMATEX **supported_fmt);
+
+    HRESULT Initialize(const void *data, UINT32 data_len);
+
+    void Reset(void);
+
+    HRESULT LockForProcess(UINT32 in_params_count, const XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS *in_params,
+        UINT32 out_params_count, const XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS *out_params);
+
+    void UnlockForProcess(void);
+
+    void Process(UINT32 in_params_count, const XAPO_PROCESS_BUFFER_PARAMETERS *in_params,
+        UINT32 out_params_count, XAPO_PROCESS_BUFFER_PARAMETERS *out_params,
+        BOOL enabled);
+
+    UINT32 CalcInputFrames(UINT32 output_frames);
+
+    UINT32 CalcOutputFrames(UINT32 input_frames);
+}
+
+/* XAudio2 2.7 version of IXAPO is identical to 2.8 */
+cpp_quote("DEFINE_GUID(IID_IXAPO27, 0xa90bc001, 0xe897, 0xe897, 0x55, 0xe4, 0x9e, 0x47, 0x00, 0x00, 0x00, 0x00);")
+
+
+/* XAudio2 2.8 version of IXAPOParameters */
+[
+    object,
+    local,
+    uuid(26d95c66-80f2-499a-ad54-5ae7f01c6d98)
+]
+interface IXAPOParameters : IUnknown
+{
+    void SetParameters(const void *params, UINT32 params_len);
+
+    void GetParameters(void *params, UINT32 params_len);
+}
+
+/* XAudio2 2.7 version of IXAPOParameters is identical to 2.8 */
+cpp_quote("DEFINE_GUID(IID_IXAPO27Parameters, 0xa90bc001, 0xe897, 0xe897, 0x55, 0xe4, 0x9e, 0x47, 0x00, 0x00, 0x00, 0x01);")
diff --git a/mingw-w64-headers/include/xapofx.h b/mingw-w64-headers/include/xapofx.h
new file mode 100644
index 0000000..65292db
--- /dev/null
+++ b/mingw-w64-headers/include/xapofx.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2015 Andrew Eikum for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+/* CLSIDs used by CreateFX, but never registered */
+
+#ifndef _XAPOFX_H
+#define _XAPOFX_H
+
+/* xapofx 1.0 through 1.5 */
+DEFINE_GUID(CLSID_FXEQ27, 0xa90bc001, 0xe897, 0xe897, 0x74, 0x39, 0x43, 0x55, 0x00, 0x00, 0x00, 0x00);
+/* xaudio >= 2.8 */
+DEFINE_GUID(CLSID_FXEQ, 0xf5e01117, 0xd6c4, 0x485a, 0xa3, 0xf5, 0x69, 0x51, 0x96, 0xf3, 0xdb, 0xfa);
+
+/* xapofx 1.0 through 1.5 */
+DEFINE_GUID(CLSID_FXMasteringLimiter27, 0xa90bc001, 0xe897, 0xe897, 0x74, 0x39, 0x43, 0x55, 0x00, 0x00, 0x00, 0x01);
+/* xaudio >= 2.8 */
+DEFINE_GUID(CLSID_FXMasteringLimiter, 0xc4137916, 0x2be1, 0x46fd, 0x85, 0x99, 0x44, 0x15, 0x36, 0xf4, 0x98, 0x56);
+
+/* xapofx 1.0 through 1.5 */
+DEFINE_GUID(CLSID_FXReverb27, 0xa90bc001, 0xe897, 0xe897, 0x74, 0x39, 0x43, 0x55, 0x00, 0x00, 0x00, 0x02);
+/* xaudio >= 2.8 */
+DEFINE_GUID(CLSID_FXReverb, 0x7d9aca56, 0xcb68, 0x4807, 0xb6, 0x32, 0xb1, 0x37, 0x35, 0x2e, 0x85, 0x96);
+
+/* xapofx 1.0 through 1.5 */
+DEFINE_GUID(CLSID_FXEcho27, 0xa90bc001, 0xe897, 0xe897, 0x74, 0x39, 0x43, 0x55, 0x00, 0x00, 0x00, 0x03);
+/* xaudio >= 2.8 */
+DEFINE_GUID(CLSID_FXEcho, 0x5039d740, 0xf736, 0x449a, 0x84, 0xd3, 0xa5, 0x62, 0x02, 0x55, 0x7b, 0x87);
+
+#endif
diff --git a/mingw-w64-headers/include/xaudio2.h b/mingw-w64-headers/include/xaudio2.h
new file mode 100644
index 0000000..132003c
--- /dev/null
+++ b/mingw-w64-headers/include/xaudio2.h
@@ -0,0 +1,6221 @@
+/*** Autogenerated by WIDL 5.13 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 (0x88960001)
+
+#define XAUDIO2_E_XMA_DECODER_ERROR (0x88960002)
+
+#define XAUDIO2_E_XAPO_CREATION_FAILED (0x88960003)
+
+#define XAUDIO2_E_DEVICE_INVALIDATED (0x88960004)
+
+#define XAUDIO20_E_XMA_DECODER_ERROR (0x88960001)
+
+#define XAUDIO20_E_XAPO_CREATION_FAILED (0x88960002)
+
+#define XAUDIO20_E_DEVICE_INVALIDATED (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__ */
diff --git a/mingw-w64-headers/include/xaudio2.idl b/mingw-w64-headers/include/xaudio2.idl
new file mode 100644
index 0000000..074454d
--- /dev/null
+++ b/mingw-w64-headers/include/xaudio2.idl
@@ -0,0 +1,1269 @@
+/*
+ * Copyright (c) 2015 Mark Harmstone
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+import "unknwn.idl";
+import "mmdeviceapi.idl";
+
+import "audiosessiontypes.h";
+
+cpp_quote("#include <pshpack1.h>")
+
+[
+    uuid(fac23f48-31f5-45a8-b49b-5225d61401aa)
+]
+coclass XAudio20 {
+    interface IUnknown;
+}
+
+[
+    uuid(e21a7345-eb21-468e-be50-804db97cf708)
+]
+coclass XAudio21 {
+    interface IUnknown;
+}
+
+[
+    uuid(b802058a-464a-42db-bc10-b650d6f2586a)
+]
+coclass XAudio22 {
+    interface IUnknown;
+}
+
+[
+    uuid(4c5e637a-16c7-4de3-9c46-5ed22181962d)
+]
+coclass XAudio23 {
+    interface IUnknown;
+}
+
+[
+    uuid(03219e78-5bc3-44d1-b92e-f63d89cc6526)
+]
+coclass XAudio24 {
+    interface IUnknown;
+}
+
+[
+    uuid(4c9b6dde-6809-46e6-a278-9b6a97588670)
+]
+coclass XAudio25 {
+    interface IUnknown;
+}
+
+[
+    uuid(3eda9b49-2085-498b-9bb2-39a6778493de)
+]
+coclass XAudio26 {
+    interface IUnknown;
+}
+
+[
+    uuid(5a508685-a254-4fba-9b82-9a24b00306af)
+]
+coclass XAudio27 {
+    interface IUnknown;
+}
+
+[
+    uuid(db05ea35-0329-4d4b-a53a-6dead03d3852)
+]
+coclass XAudio2Debug {
+    interface IUnknown;
+}
+
+cpp_quote("#if 0")
+typedef struct WAVEFORMATEX
+{
+    WORD wFormatTag;
+    WORD nChannels;
+    DWORD nSamplesPerSec;
+    DWORD nAvgBytesPerSec;
+    WORD nBlockAlign;
+    WORD wBitsPerSample;
+    WORD cbSize;
+} WAVEFORMATEX;
+
+typedef struct {
+    WAVEFORMATEX    Format;
+    union {
+        WORD        wValidBitsPerSample;
+        WORD        wSamplesPerBlock;
+        WORD        wReserved;
+    } Samples;
+    DWORD           dwChannelMask;
+    GUID            SubFormat;
+} WAVEFORMATEXTENSIBLE, *PWAVEFORMATEXTENSIBLE;
+cpp_quote("#else")
+cpp_quote("#include <mmreg.h>")
+cpp_quote("#endif")
+
+interface IXAudio2Voice;
+
+typedef enum XAUDIO2_WINDOWS_PROCESSOR_SPECIFIER
+{
+    Processor1  = 0x00000001,
+    Processor2  = 0x00000002,
+    Processor3  = 0x00000004,
+    Processor4  = 0x00000008,
+    Processor5  = 0x00000010,
+    Processor6  = 0x00000020,
+    Processor7  = 0x00000040,
+    Processor8  = 0x00000080,
+    Processor9  = 0x00000100,
+    Processor10 = 0x00000200,
+    Processor11 = 0x00000400,
+    Processor12 = 0x00000800,
+    Processor13 = 0x00001000,
+    Processor14 = 0x00002000,
+    Processor15 = 0x00004000,
+    Processor16 = 0x00008000,
+    Processor17 = 0x00010000,
+    Processor18 = 0x00020000,
+    Processor19 = 0x00040000,
+    Processor20 = 0x00080000,
+    Processor21 = 0x00100000,
+    Processor22 = 0x00200000,
+    Processor23 = 0x00400000,
+    Processor24 = 0x00800000,
+    Processor25 = 0x01000000,
+    Processor26 = 0x02000000,
+    Processor27 = 0x04000000,
+    Processor28 = 0x08000000,
+    Processor29 = 0x10000000,
+    Processor30 = 0x20000000,
+    Processor31 = 0x40000000,
+    Processor32 = 0x80000000,
+    XAUDIO2_ANY_PROCESSOR = 0xffffffff,
+    XAUDIO2_DEFAULT_PROCESSOR = XAUDIO2_ANY_PROCESSOR
+} 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;
+
+/* XAudio2 2.3's XAUDIO2_VOICE_SENDS struct */
+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;
+    BOOL InitialState;
+    UINT32 OutputChannels;
+} XAUDIO2_EFFECT_DESCRIPTOR;
+
+typedef struct XAUDIO2_EFFECT_CHAIN
+{
+    UINT32 EffectCount;
+    XAUDIO2_EFFECT_DESCRIPTOR* pEffectDescriptors;
+} XAUDIO2_EFFECT_CHAIN;
+
+const UINT32 XAUDIO2_MAX_BUFFER_BYTES = 0x80000000;
+const UINT32 XAUDIO2_MAX_QUEUED_BUFFERS = 64;
+const UINT32 XAUDIO2_MAX_BUFFERS_SYSTEM = 2;
+const UINT32 XAUDIO2_MAX_AUDIO_CHANNELS = 64;
+const UINT32 XAUDIO2_MIN_SAMPLE_RATE = 1000;
+const UINT32 XAUDIO2_MAX_SAMPLE_RATE = 200000;
+const float XAUDIO2_MAX_VOLUME_LEVEL = 16777216.0;
+const float XAUDIO2_MIN_FREQ_RATIO = (1/1024.0);
+const float XAUDIO2_MAX_FREQ_RATIO = 1024.0;
+const float XAUDIO2_DEFAULT_FREQ_RATIO = 2.0;
+const float XAUDIO2_MAX_FILTER_ONEOVERQ = 1.5;
+const float XAUDIO2_MAX_FILTER_FREQUENCY = 1.0;
+const UINT32 XAUDIO2_MAX_LOOP_COUNT = 254;
+const UINT32 XAUDIO20_MAX_LOOP_COUNT = 0x100000; /* xaudio 2.0 */
+
+const UINT32 XAUDIO2_COMMIT_NOW = 0;
+const UINT32 XAUDIO2_COMMIT_ALL = 0;
+const UINT32 XAUDIO2_INVALID_OPSET = 0xffffffff;
+const UINT32 XAUDIO2_NO_LOOP_REGION = 0;
+const UINT32 XAUDIO2_LOOP_INFINITE = 255;
+const UINT32 XAUDIO20_LOOP_INFINITE = ((UINT)-1); /* xaudio 2.0 */
+const UINT32 XAUDIO2_DEFAULT_CHANNELS = 0;
+const UINT32 XAUDIO2_DEFAULT_SAMPLERATE = 0;
+
+[
+    object,
+    local
+]
+interface IXAudio2EngineCallback
+{
+    void OnProcessingPassStart();
+
+    void OnProcessingPassEnd();
+
+    void OnCriticalError([in] HRESULT Error);
+}
+
+typedef enum XAUDIO2_FILTER_TYPE
+{
+    LowPassFilter,
+    BandPassFilter,
+    HighPassFilter,
+    NotchFilter
+} XAUDIO2_FILTER_TYPE;
+
+typedef struct XAUDIO2_FILTER_PARAMETERS
+{
+    XAUDIO2_FILTER_TYPE Type;
+    float Frequency;
+    float OneOverQ;
+} XAUDIO2_FILTER_PARAMETERS;
+
+/* XAudio 2.0's IXAudio2Voice */
+/* XAudio2 2.0's IXAudio2Voice interface. Actually called
+ * IXAudio2Voice in the Mar 2008 DX SDK */
+[
+    object,
+    local
+]
+interface IXAudio20Voice
+{
+    void GetVoiceDetails([out] XAUDIO27_VOICE_DETAILS* pVoiceDetails);
+
+    HRESULT SetOutputVoices([in] const XAUDIO23_VOICE_SENDS* pSendList);
+
+    HRESULT SetEffectChain([in] const XAUDIO2_EFFECT_CHAIN* pEffectChain);
+
+    HRESULT EnableEffect(
+        [in] UINT32 EffectIndex,
+        [in, defaultvalue(XAUDIO2_COMMIT_NOW)] UINT32 OperationSet);
+
+    HRESULT DisableEffect(
+        [in] UINT32 EffectIndex,
+        [in, defaultvalue(XAUDIO2_COMMIT_NOW)] UINT32 OperationSet);
+
+    void GetEffectState(
+        [in] UINT32 EffectIndex,
+        [out] BOOL* pEnabled);
+
+    HRESULT SetEffectParameters(
+        [in] UINT32 EffectIndex,
+        [in] const void* pParameters,
+        [in] UINT32 ParametersByteSize,
+        [in, defaultvalue(XAUDIO2_COMMIT_NOW)] UINT32 OperationSet);
+
+    HRESULT GetEffectParameters(
+        [in] UINT32 EffectIndex,
+        [out] void* pParameters,
+        [in] UINT32 ParametersByteSize);
+
+    HRESULT SetFilterParameters(
+        [in] const XAUDIO2_FILTER_PARAMETERS* pParameters,
+        [in, defaultvalue(XAUDIO2_COMMIT_NOW)] UINT32 OperationSet);
+
+    void GetFilterParameters([out] XAUDIO2_FILTER_PARAMETERS* pParameters);
+
+    HRESULT SetVolume(
+        [in] float Volume,
+        [in, defaultvalue(XAUDIO2_COMMIT_NOW)] UINT32 OperationSet);
+
+    void GetVolume([out] float* pVolume);
+
+    HRESULT SetChannelVolumes(
+        [in] UINT32 Channels,
+        [in, size_is(Channels)] const float* pVolumes,
+        [in, defaultvalue(XAUDIO2_COMMIT_NOW)] UINT32 OperationSet);
+
+    void GetChannelVolumes(
+        [in] UINT32 Channels,
+        [out, size_is(Channels)] float* pVolumes);
+
+    HRESULT SetOutputMatrix(
+        [in] IXAudio2Voice* pDestinationVoice,
+        [in] UINT32 SourceChannels,
+        [in] UINT32 DestinationChannels,
+        [in, size_is(SourceChannels * DestinationChannels)] const float* pLevelMatrix,
+        [in, defaultvalue(XAUDIO2_COMMIT_NOW)] UINT32 OperationSet);
+
+    HRESULT GetOutputMatrix(
+        [in] IXAudio2Voice* pDestinationVoice,
+        [in] UINT32 SourceChannels,
+        [in] UINT32 DestinationChannels,
+        [out, size_is(SourceChannels * DestinationChannels)] float* pLevelMatrix);
+
+    void DestroyVoice();
+}
+
+/* XAudio 2.3's IXAudio2Voice */
+/* XAudio2 2.3's IXAudio2Voice interface. Actually called
+ * IXAudio2Voice in the Nov 2008 DX SDK */
+[
+    object,
+    local
+]
+interface IXAudio23Voice
+{
+    void GetVoiceDetails([out] XAUDIO27_VOICE_DETAILS* pVoiceDetails);
+
+    HRESULT SetOutputVoices([in] const XAUDIO23_VOICE_SENDS* pSendList);
+
+    HRESULT SetEffectChain([in] const XAUDIO2_EFFECT_CHAIN* pEffectChain);
+
+    HRESULT EnableEffect(
+        [in] UINT32 EffectIndex,
+        [in, defaultvalue(XAUDIO2_COMMIT_NOW)] UINT32 OperationSet);
+
+    HRESULT DisableEffect(
+        [in] UINT32 EffectIndex,
+        [in, defaultvalue(XAUDIO2_COMMIT_NOW)] UINT32 OperationSet);
+
+    void GetEffectState(
+        [in] UINT32 EffectIndex,
+        [out] BOOL* pEnabled);
+
+    HRESULT SetEffectParameters(
+        [in] UINT32 EffectIndex,
+        [in] const void* pParameters,
+        [in] UINT32 ParametersByteSize,
+        [in, defaultvalue(XAUDIO2_COMMIT_NOW)] UINT32 OperationSet);
+
+    HRESULT GetEffectParameters(
+        [in] UINT32 EffectIndex,
+        [out] void* pParameters,
+        [in] UINT32 ParametersByteSize);
+
+    HRESULT SetFilterParameters(
+        [in] const XAUDIO2_FILTER_PARAMETERS* pParameters,
+        [in, defaultvalue(XAUDIO2_COMMIT_NOW)] UINT32 OperationSet);
+
+    void GetFilterParameters([out] XAUDIO2_FILTER_PARAMETERS* pParameters);
+
+    HRESULT SetVolume(
+        [in] float Volume,
+        [in, defaultvalue(XAUDIO2_COMMIT_NOW)] UINT32 OperationSet);
+
+    void GetVolume([out] float* pVolume);
+
+    HRESULT SetChannelVolumes(
+        [in] UINT32 Channels,
+        [in, size_is(Channels)] const float* pVolumes,
+        [in, defaultvalue(XAUDIO2_COMMIT_NOW)] UINT32 OperationSet);
+
+    void GetChannelVolumes(
+        [in] UINT32 Channels,
+        [out, size_is(Channels)] float* pVolumes);
+
+    HRESULT SetOutputMatrix(
+        [in] IXAudio2Voice* pDestinationVoice,
+        [in] UINT32 SourceChannels,
+        [in] UINT32 DestinationChannels,
+        [in, size_is(SourceChannels * DestinationChannels)] const float* pLevelMatrix,
+        [in, defaultvalue(XAUDIO2_COMMIT_NOW)] UINT32 OperationSet);
+
+    void GetOutputMatrix(
+        [in] IXAudio2Voice* pDestinationVoice,
+        [in] UINT32 SourceChannels,
+        [in] UINT32 DestinationChannels,
+        [out, size_is(SourceChannels * DestinationChannels)] float* pLevelMatrix);
+
+    void DestroyVoice();
+}
+
+/* XAudio 2.7's IXAudio2Voice */
+/* XAudio2 2.7's IXAudio2Voice interface. Actually called
+ * IXAudio2Voice in the Jun 2010 DX SDK */
+[
+    object,
+    local
+]
+interface IXAudio27Voice
+{
+    void GetVoiceDetails([out] XAUDIO27_VOICE_DETAILS* pVoiceDetails);
+
+    HRESULT SetOutputVoices([in] const XAUDIO2_VOICE_SENDS* pSendList);
+
+    HRESULT SetEffectChain([in] const XAUDIO2_EFFECT_CHAIN* pEffectChain);
+
+    HRESULT EnableEffect(
+        [in] UINT32 EffectIndex,
+        [in, defaultvalue(XAUDIO2_COMMIT_NOW)] UINT32 OperationSet);
+
+    HRESULT DisableEffect(
+        [in] UINT32 EffectIndex,
+        [in, defaultvalue(XAUDIO2_COMMIT_NOW)] UINT32 OperationSet);
+
+    void GetEffectState(
+        [in] UINT32 EffectIndex,
+        [out] BOOL* pEnabled);
+
+    HRESULT SetEffectParameters(
+        [in] UINT32 EffectIndex,
+        [in] const void* pParameters,
+        [in] UINT32 ParametersByteSize,
+        [in, defaultvalue(XAUDIO2_COMMIT_NOW)] UINT32 OperationSet);
+
+    HRESULT GetEffectParameters(
+        [in] UINT32 EffectIndex,
+        [out] void* pParameters,
+        [in] UINT32 ParametersByteSize);
+
+    HRESULT SetFilterParameters(
+        [in] const XAUDIO2_FILTER_PARAMETERS* pParameters,
+        [in, defaultvalue(XAUDIO2_COMMIT_NOW)] UINT32 OperationSet);
+
+    void GetFilterParameters([out] XAUDIO2_FILTER_PARAMETERS* pParameters);
+
+    HRESULT SetOutputFilterParameters(
+        [in] IXAudio2Voice* pDestinationVoice,
+        [in] const XAUDIO2_FILTER_PARAMETERS* pParameters,
+        [in, defaultvalue(XAUDIO2_COMMIT_NOW)] UINT32 OperationSet);
+
+    void GetOutputFilterParameters(
+        [in] IXAudio2Voice* pDestinationVoice,
+        [out] XAUDIO2_FILTER_PARAMETERS* pParameters);
+
+    HRESULT SetVolume(
+        [in] float Volume,
+        [in, defaultvalue(XAUDIO2_COMMIT_NOW)] UINT32 OperationSet);
+
+    void GetVolume([out] float* pVolume);
+
+    HRESULT SetChannelVolumes(
+        [in] UINT32 Channels,
+        [in, size_is(Channels)] const float* pVolumes,
+        [in, defaultvalue(XAUDIO2_COMMIT_NOW)] UINT32 OperationSet);
+
+    void GetChannelVolumes(
+        [in] UINT32 Channels,
+        [out, size_is(Channels)] float* pVolumes);
+
+    HRESULT SetOutputMatrix(
+        [in] IXAudio2Voice* pDestinationVoice,
+        [in] UINT32 SourceChannels,
+        [in] UINT32 DestinationChannels,
+        [in, size_is(SourceChannels * DestinationChannels)] const float* pLevelMatrix,
+        [in, defaultvalue(XAUDIO2_COMMIT_NOW)] UINT32 OperationSet);
+
+    void GetOutputMatrix(
+        [in] IXAudio2Voice* pDestinationVoice,
+        [in] UINT32 SourceChannels,
+        [in] UINT32 DestinationChannels,
+        [out, size_is(SourceChannels * DestinationChannels)] float* pLevelMatrix);
+
+    void DestroyVoice();
+}
+
+[
+    object,
+    local
+]
+interface IXAudio2Voice
+{
+    void GetVoiceDetails([out] XAUDIO2_VOICE_DETAILS* pVoiceDetails);
+
+    HRESULT SetOutputVoices([in] const XAUDIO2_VOICE_SENDS* pSendList);
+
+    HRESULT SetEffectChain([in] const XAUDIO2_EFFECT_CHAIN* pEffectChain);
+
+    HRESULT EnableEffect(
+        [in] UINT32 EffectIndex,
+        [in, defaultvalue(XAUDIO2_COMMIT_NOW)] UINT32 OperationSet);
+
+    HRESULT DisableEffect(
+        [in] UINT32 EffectIndex,
+        [in, defaultvalue(XAUDIO2_COMMIT_NOW)] UINT32 OperationSet);
+
+    void GetEffectState(
+        [in] UINT32 EffectIndex,
+        [out] BOOL* pEnabled);
+
+    HRESULT SetEffectParameters(
+        [in] UINT32 EffectIndex,
+        [in] const void* pParameters,
+        [in] UINT32 ParametersByteSize,
+        [in, defaultvalue(XAUDIO2_COMMIT_NOW)] UINT32 OperationSet);
+
+    HRESULT GetEffectParameters(
+        [in] UINT32 EffectIndex,
+        [out] void* pParameters,
+        [in] UINT32 ParametersByteSize);
+
+    HRESULT SetFilterParameters(
+        [in] const XAUDIO2_FILTER_PARAMETERS* pParameters,
+        [in, defaultvalue(XAUDIO2_COMMIT_NOW)] UINT32 OperationSet);
+
+    void GetFilterParameters([out] XAUDIO2_FILTER_PARAMETERS* pParameters);
+
+    HRESULT SetOutputFilterParameters(
+        [in] IXAudio2Voice* pDestinationVoice,
+        [in] const XAUDIO2_FILTER_PARAMETERS* pParameters,
+        [in, defaultvalue(XAUDIO2_COMMIT_NOW)] UINT32 OperationSet);
+
+    void GetOutputFilterParameters(
+        [in] IXAudio2Voice* pDestinationVoice,
+        [out] XAUDIO2_FILTER_PARAMETERS* pParameters);
+
+    HRESULT SetVolume(
+        [in] float Volume,
+        [in, defaultvalue(XAUDIO2_COMMIT_NOW)] UINT32 OperationSet);
+
+    void GetVolume([out] float* pVolume);
+
+    HRESULT SetChannelVolumes(
+        [in] UINT32 Channels,
+        [in, size_is(Channels)] const float* pVolumes,
+        [in, defaultvalue(XAUDIO2_COMMIT_NOW)] UINT32 OperationSet);
+
+    void GetChannelVolumes(
+        [in] UINT32 Channels,
+        [out, size_is(Channels)] float* pVolumes);
+
+    HRESULT SetOutputMatrix(
+        [in] IXAudio2Voice* pDestinationVoice,
+        [in] UINT32 SourceChannels,
+        [in] UINT32 DestinationChannels,
+        [in, size_is(SourceChannels * DestinationChannels)] const float* pLevelMatrix,
+        [in, defaultvalue(XAUDIO2_COMMIT_NOW)] UINT32 OperationSet);
+
+    void GetOutputMatrix(
+        [in] IXAudio2Voice* pDestinationVoice,
+        [in] UINT32 SourceChannels,
+        [in] UINT32 DestinationChannels,
+        [out, size_is(SourceChannels * DestinationChannels)] float* pLevelMatrix);
+
+    void DestroyVoice();
+}
+
+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;
+
+[
+    local
+]
+/* XAudio2 2.0's IXAudio2SourceVoice interface. Actually called
+ * IXAudio2SourceVoice in the Mar 2008 DX SDK */
+interface IXAudio20SourceVoice : IXAudio20Voice
+{
+    HRESULT Start(
+        [in, defaultvalue(0)] UINT32 Flags,
+        [in, defaultvalue(XAUDIO2_COMMIT_NOW)] UINT32 OperationSet);
+
+    HRESULT Stop(
+        [in, defaultvalue(0)] UINT32 Flags,
+        [in, defaultvalue(XAUDIO2_COMMIT_NOW)] UINT32 OperationSet);
+
+    HRESULT SubmitSourceBuffer(
+        [in] const XAUDIO2_BUFFER* pBuffer,
+        [in, defaultvalue(NULL)] const XAUDIO2_BUFFER_WMA* pBufferWMA);
+
+    HRESULT FlushSourceBuffers();
+
+    HRESULT Discontinuity();
+
+    HRESULT ExitLoop([in, defaultvalue(XAUDIO2_COMMIT_NOW)] UINT32 OperationSet);
+
+    void GetState([out] XAUDIO2_VOICE_STATE* pVoiceState);
+
+    HRESULT SetFrequencyRatio(
+        [in] float Ratio,
+        [in, defaultvalue(XAUDIO2_COMMIT_NOW)] UINT32 OperationSet);
+
+    void GetFrequencyRatio([out] float* pRatio);
+}
+
+[
+    local
+]
+/* XAudio2 2.3's IXAudio2SourceVoice interface. Actually called
+ * IXAudio2SourceVoice in the Nov 2008 DX SDK */
+interface IXAudio23SourceVoice : IXAudio23Voice
+{
+    HRESULT Start(
+        [in, defaultvalue(0)] UINT32 Flags,
+        [in, defaultvalue(XAUDIO2_COMMIT_NOW)] UINT32 OperationSet);
+
+    HRESULT Stop(
+        [in, defaultvalue(0)] UINT32 Flags,
+        [in, defaultvalue(XAUDIO2_COMMIT_NOW)] UINT32 OperationSet);
+
+    HRESULT SubmitSourceBuffer(
+        [in] const XAUDIO2_BUFFER* pBuffer,
+        [in, defaultvalue(NULL)] const XAUDIO2_BUFFER_WMA* pBufferWMA);
+
+    HRESULT FlushSourceBuffers();
+
+    HRESULT Discontinuity();
+
+    HRESULT ExitLoop([in, defaultvalue(XAUDIO2_COMMIT_NOW)] UINT32 OperationSet);
+
+    void GetState([out] XAUDIO2_VOICE_STATE* pVoiceState);
+
+    HRESULT SetFrequencyRatio(
+        [in] float Ratio,
+        [in, defaultvalue(XAUDIO2_COMMIT_NOW)] UINT32 OperationSet);
+
+    void GetFrequencyRatio([out] float* pRatio);
+}
+
+[
+    local
+]
+/* XAudio2 2.7's IXAudio2SourceVoice interface. Actually called
+ * IXAudio2SourceVoice in the Jun 2010 DX SDK */
+interface IXAudio27SourceVoice : IXAudio27Voice
+{
+    HRESULT Start(
+        [in, defaultvalue(0)] UINT32 Flags,
+        [in, defaultvalue(XAUDIO2_COMMIT_NOW)] UINT32 OperationSet);
+
+    HRESULT Stop(
+        [in, defaultvalue(0)] UINT32 Flags,
+        [in, defaultvalue(XAUDIO2_COMMIT_NOW)] UINT32 OperationSet);
+
+    HRESULT SubmitSourceBuffer(
+        [in] const XAUDIO2_BUFFER* pBuffer,
+        [in, defaultvalue(NULL)] const XAUDIO2_BUFFER_WMA* pBufferWMA);
+
+    HRESULT FlushSourceBuffers();
+
+    HRESULT Discontinuity();
+
+    HRESULT ExitLoop([in, defaultvalue(XAUDIO2_COMMIT_NOW)] UINT32 OperationSet);
+
+    void GetState([out] XAUDIO2_VOICE_STATE* pVoiceState);
+
+    HRESULT SetFrequencyRatio(
+        [in] float Ratio,
+        [in, defaultvalue(XAUDIO2_COMMIT_NOW)] UINT32 OperationSet);
+
+    void GetFrequencyRatio([out] float* pRatio);
+
+    HRESULT SetSourceSampleRate([in] UINT32 NewSourceSampleRate);
+}
+
+[
+    local
+]
+/* XAudio2 2.8's IXAudio2SourceVoice interface. */
+interface IXAudio2SourceVoice : IXAudio2Voice
+{
+    HRESULT Start(
+        [in, defaultvalue(0)] UINT32 Flags,
+        [in, defaultvalue(XAUDIO2_COMMIT_NOW)] UINT32 OperationSet);
+
+    HRESULT Stop(
+        [in, defaultvalue(0)] UINT32 Flags,
+        [in, defaultvalue(XAUDIO2_COMMIT_NOW)] UINT32 OperationSet);
+
+    HRESULT SubmitSourceBuffer(
+        [in] const XAUDIO2_BUFFER* pBuffer,
+        [in, defaultvalue(NULL)] const XAUDIO2_BUFFER_WMA* pBufferWMA);
+
+    HRESULT FlushSourceBuffers();
+
+    HRESULT Discontinuity();
+
+    HRESULT ExitLoop([in, defaultvalue(XAUDIO2_COMMIT_NOW)] UINT32 OperationSet);
+
+    void GetState([out] XAUDIO2_VOICE_STATE* pVoiceState, [in, defaultvalue(0)] UINT32 Flags);
+
+    HRESULT SetFrequencyRatio(
+        [in] float Ratio,
+        [in, defaultvalue(XAUDIO2_COMMIT_NOW)] UINT32 OperationSet);
+
+    void GetFrequencyRatio([out] float* pRatio);
+
+    HRESULT SetSourceSampleRate([in] UINT32 NewSourceSampleRate);
+}
+
+[
+    local
+]
+/* XAudio2 2.0's IXAudio2SubmixVoice interface. Actually called
+ * IXAudio2SubmixVoice in the Mar 2008 DX SDK */
+interface IXAudio20SubmixVoice : IXAudio20Voice
+{
+}
+
+[
+    local
+]
+/* XAudio2 2.3's IXAudio2SubmixVoice interface. Actually called
+ * IXAudio2SubmixVoice in the Nov 2008 DX SDK */
+interface IXAudio23SubmixVoice : IXAudio23Voice
+{
+}
+
+[
+    local
+]
+/* XAudio2 2.7's IXAudio2SubmixVoice interface. Actually called
+ * IXAudio2SubmixVoice in the Jun 2010 DX SDK */
+interface IXAudio27SubmixVoice : IXAudio27Voice
+{
+}
+
+[
+    local
+]
+interface IXAudio2SubmixVoice : IXAudio2Voice
+{
+}
+
+[
+    local
+]
+/* XAudio2 2.0's IXAudio2MasteringVoice interface. Actually called
+ * IXAudio2MasteringVoice in the Mar 2008 DX SDK */
+interface IXAudio20MasteringVoice : IXAudio20Voice
+{
+}
+
+[
+    local
+]
+/* XAudio2 2.3's IXAudio2MasteringVoice interface. Actually called
+ * IXAudio2MasteringVoice in the Nov 2008 DX SDK */
+interface IXAudio23MasteringVoice : IXAudio23Voice
+{
+}
+
+[
+    local
+]
+/* XAudio2 2.7's IXAudio2MasteringVoice interface. Actually called
+ * IXAudio2MasteringVoice in the Jun 2010 DX SDK */
+interface IXAudio27MasteringVoice : IXAudio27Voice
+{
+}
+
+[
+    local
+]
+interface IXAudio2MasteringVoice : IXAudio2Voice
+{
+    /* not present in XAudio2 2.7 */
+    void GetChannelMask([out] DWORD *pChannelMask);
+}
+
+[
+    object,
+    local
+]
+interface IXAudio20VoiceCallback
+{
+    void OnVoiceProcessingPassStart();
+
+    void OnVoiceProcessingPassEnd();
+
+    void OnStreamEnd();
+
+    void OnBufferStart([in] void* pBufferContext);
+
+    void OnBufferEnd([in] void* pBufferContext);
+
+    void OnLoopEnd([in] void* pBufferContext);
+
+    void OnVoiceError(
+        [in] void* pBuffercontext,
+        [in] HRESULT Error);
+}
+
+[
+    object,
+    local
+]
+interface IXAudio2VoiceCallback
+{
+    void OnVoiceProcessingPassStart([in] UINT32 BytesRequired);
+
+    void OnVoiceProcessingPassEnd();
+
+    void OnStreamEnd();
+
+    void OnBufferStart([in] void* pBufferContext);
+
+    void OnBufferEnd([in] void* pBufferContext);
+
+    void OnLoopEnd([in] void* pBufferContext);
+
+    void OnVoiceError(
+        [in] void* pBuffercontext,
+        [in] HRESULT Error);
+}
+
+typedef struct XAUDIO2_DEBUG_CONFIGURATION
+{
+    UINT32 TraceMask;
+    UINT32 BreakMask;
+    BOOL LogThreadID;
+    BOOL LogFileline;
+    BOOL LogFunctionName;
+    BOOL LogTiming;
+} XAUDIO2_DEBUG_CONFIGURATION;
+
+[
+    object,
+    uuid(8bcf1f58-9fe7-4583-8ac6-e2adc465c8bb), /* all versions before 28 share IID_IXAudio */
+]
+/* XAudio2 2.0's IXAudio2 interface. Actually called IXAudio2 in the Mar 2008
+ * DX SDK */
+interface IXAudio20 : IUnknown
+{
+    HRESULT GetDeviceCount([out] UINT32* pCount);
+
+    HRESULT GetDeviceDetails(
+        [in] UINT32 Index,
+        [out] XAUDIO2_DEVICE_DETAILS* pDeviceDetails);
+
+    HRESULT Initialize(
+        [in, defaultvalue(0)] UINT32 Flags,
+        [in, defaultvalue(XAUDIO2_DEFAULT_PROCESSOR)] XAUDIO2_PROCESSOR XAudio2Processor);
+
+    HRESULT RegisterForCallbacks([in] IXAudio2EngineCallback* pCallback);
+
+    void UnregisterForCallbacks([in] IXAudio2EngineCallback* pCallback);
+
+    HRESULT CreateSourceVoice(
+        [out] IXAudio2SourceVoice** ppSourceVoice,
+        [in] const WAVEFORMATEX* pSourceFormat,
+        [in, defaultvalue(0)] UINT32 Flags,
+        [in, defaultvalue(XAUDIO2_DEFAULT_FREQ_RATIO)] float MaxFrequencyRatio,
+        [in, defaultvalue(NULL)] IXAudio2VoiceCallback* pCallback,
+        [in, defaultvalue(NULL)] const XAUDIO23_VOICE_SENDS* pSendList,
+        [in, defaultvalue(NULL)] const XAUDIO2_EFFECT_CHAIN* pEffectChain);
+
+    HRESULT CreateSubmixVoice(
+        [out] IXAudio2SubmixVoice** ppSubmixVoice,
+        [in] UINT32 InputChannels,
+        [in] UINT32 InputSampleRate,
+        [in, defaultvalue(0)] UINT32 Flags,
+        [in, defaultvalue(0)] UINT32 ProcessingStage,
+        [in, defaultvalue(NULL)] const XAUDIO23_VOICE_SENDS* pSendList,
+        [in, defaultvalue(NULL)] const XAUDIO2_EFFECT_CHAIN* pEffectChain);
+
+    HRESULT CreateMasteringVoice(
+        [out] IXAudio2MasteringVoice** ppMasteringVoice,
+        [in, defaultvalue(XAUDIO2_DEFAULT_CHANNELS)] UINT32 InputChannels,
+        [in, defaultvalue(XAUDIO2_DEFAULT_SAMPLERATE)] UINT32 InputSampleRate,
+        [in, defaultvalue(0)] UINT32 Flags,
+        [in, defaultvalue(0)] UINT32 DeviceIndex,
+        [in, defaultvalue(NULL)] const XAUDIO2_EFFECT_CHAIN* pEffectChain);
+
+    HRESULT StartEngine();
+
+    void StopEngine();
+
+    HRESULT CommitChanges([in] UINT32 OperationSet);
+
+    void GetPerformanceData([out] XAUDIO20_PERFORMANCE_DATA* pPerfData);
+
+    [local] void SetDebugConfiguration(
+        [in] const XAUDIO2_DEBUG_CONFIGURATION* pDebugConfiguration,
+        [in, defaultvalue(NULL)] void* pReserved);
+}
+
+[
+    object,
+    uuid(8bcf1f58-9fe7-4583-8ac6-e2adc465c8bb), /* all versions before 28 share IID_IXAudio */
+]
+/* XAudio2 2.2's IXAudio2 interface. Actually called IXAudio2 in the Jun 2010
+ * DX SDK */
+interface IXAudio22 : IUnknown
+{
+    HRESULT GetDeviceCount([out] UINT32* pCount);
+
+    HRESULT GetDeviceDetails(
+        [in] UINT32 Index,
+        [out] XAUDIO2_DEVICE_DETAILS* pDeviceDetails);
+
+    HRESULT Initialize(
+        [in, defaultvalue(0)] UINT32 Flags,
+        [in, defaultvalue(XAUDIO2_DEFAULT_PROCESSOR)] XAUDIO2_PROCESSOR XAudio2Processor);
+
+    HRESULT RegisterForCallbacks([in] IXAudio2EngineCallback* pCallback);
+
+    void UnregisterForCallbacks([in] IXAudio2EngineCallback* pCallback);
+
+    HRESULT CreateSourceVoice(
+        [out] IXAudio2SourceVoice** ppSourceVoice,
+        [in] const WAVEFORMATEX* pSourceFormat,
+        [in, defaultvalue(0)] UINT32 Flags,
+        [in, defaultvalue(XAUDIO2_DEFAULT_FREQ_RATIO)] float MaxFrequencyRatio,
+        [in, defaultvalue(NULL)] IXAudio2VoiceCallback* pCallback,
+        [in, defaultvalue(NULL)] const XAUDIO23_VOICE_SENDS* pSendList,
+        [in, defaultvalue(NULL)] const XAUDIO2_EFFECT_CHAIN* pEffectChain);
+
+    HRESULT CreateSubmixVoice(
+        [out] IXAudio2SubmixVoice** ppSubmixVoice,
+        [in] UINT32 InputChannels,
+        [in] UINT32 InputSampleRate,
+        [in, defaultvalue(0)] UINT32 Flags,
+        [in, defaultvalue(0)] UINT32 ProcessingStage,
+        [in, defaultvalue(NULL)] const XAUDIO23_VOICE_SENDS* pSendList,
+        [in, defaultvalue(NULL)] const XAUDIO2_EFFECT_CHAIN* pEffectChain);
+
+    HRESULT CreateMasteringVoice(
+        [out] IXAudio2MasteringVoice** ppMasteringVoice,
+        [in, defaultvalue(XAUDIO2_DEFAULT_CHANNELS)] UINT32 InputChannels,
+        [in, defaultvalue(XAUDIO2_DEFAULT_SAMPLERATE)] UINT32 InputSampleRate,
+        [in, defaultvalue(0)] UINT32 Flags,
+        [in, defaultvalue(0)] UINT32 DeviceIndex,
+        [in, defaultvalue(NULL)] const XAUDIO2_EFFECT_CHAIN* pEffectChain);
+
+    HRESULT StartEngine();
+
+    void StopEngine();
+
+    HRESULT CommitChanges([in] UINT32 OperationSet);
+
+    void GetPerformanceData([out] XAUDIO22_PERFORMANCE_DATA* pPerfData);
+
+    [local] void SetDebugConfiguration(
+        [in] const XAUDIO2_DEBUG_CONFIGURATION* pDebugConfiguration,
+        [in, defaultvalue(NULL)] void* pReserved);
+}
+
+[
+    object,
+    uuid(8bcf1f58-9fe7-4583-8ac6-e2adc465c8bb), /* all versions before 28 share IID_IXAudio */
+]
+/* XAudio2 2.3's IXAudio2 interface. Actually called IXAudio2 in the Nov 2008
+ * DX SDK */
+interface IXAudio23 : IUnknown
+{
+    HRESULT GetDeviceCount([out] UINT32* pCount);
+
+    HRESULT GetDeviceDetails(
+        [in] UINT32 Index,
+        [out] XAUDIO2_DEVICE_DETAILS* pDeviceDetails);
+
+    HRESULT Initialize(
+        [in, defaultvalue(0)] UINT32 Flags,
+        [in, defaultvalue(XAUDIO2_DEFAULT_PROCESSOR)] XAUDIO2_PROCESSOR XAudio2Processor);
+
+    HRESULT RegisterForCallbacks([in] IXAudio2EngineCallback* pCallback);
+
+    void UnregisterForCallbacks([in] IXAudio2EngineCallback* pCallback);
+
+    HRESULT CreateSourceVoice(
+        [out] IXAudio2SourceVoice** ppSourceVoice,
+        [in] const WAVEFORMATEX* pSourceFormat,
+        [in, defaultvalue(0)] UINT32 Flags,
+        [in, defaultvalue(XAUDIO2_DEFAULT_FREQ_RATIO)] float MaxFrequencyRatio,
+        [in, defaultvalue(NULL)] IXAudio2VoiceCallback* pCallback,
+        [in, defaultvalue(NULL)] const XAUDIO23_VOICE_SENDS* pSendList,
+        [in, defaultvalue(NULL)] const XAUDIO2_EFFECT_CHAIN* pEffectChain);
+
+    HRESULT CreateSubmixVoice(
+        [out] IXAudio2SubmixVoice** ppSubmixVoice,
+        [in] UINT32 InputChannels,
+        [in] UINT32 InputSampleRate,
+        [in, defaultvalue(0)] UINT32 Flags,
+        [in, defaultvalue(0)] UINT32 ProcessingStage,
+        [in, defaultvalue(NULL)] const XAUDIO23_VOICE_SENDS* pSendList,
+        [in, defaultvalue(NULL)] const XAUDIO2_EFFECT_CHAIN* pEffectChain);
+
+    HRESULT CreateMasteringVoice(
+        [out] IXAudio2MasteringVoice** ppMasteringVoice,
+        [in, defaultvalue(XAUDIO2_DEFAULT_CHANNELS)] UINT32 InputChannels,
+        [in, defaultvalue(XAUDIO2_DEFAULT_SAMPLERATE)] UINT32 InputSampleRate,
+        [in, defaultvalue(0)] UINT32 Flags,
+        [in, defaultvalue(0)] UINT32 DeviceIndex,
+        [in, defaultvalue(NULL)] const XAUDIO2_EFFECT_CHAIN* pEffectChain);
+
+    HRESULT StartEngine();
+
+    void StopEngine();
+
+    HRESULT CommitChanges([in] UINT32 OperationSet);
+
+    void GetPerformanceData([out] XAUDIO2_PERFORMANCE_DATA* pPerfData);
+
+    [local] void SetDebugConfiguration(
+        [in] const XAUDIO2_DEBUG_CONFIGURATION* pDebugConfiguration,
+        [in, defaultvalue(NULL)] void* pReserved);
+}
+
+[
+    object,
+    uuid(8bcf1f58-9fe7-4583-8ac6-e2adc465c8bb),
+]
+/* XAudio2 2.7's IXAudio2 interface. Actually called IXAudio2 in the Jun 2010
+ * DX SDK */
+interface IXAudio27 : IUnknown
+{
+    HRESULT GetDeviceCount([out] UINT32* pCount);
+
+    HRESULT GetDeviceDetails(
+        [in] UINT32 Index,
+        [out] XAUDIO2_DEVICE_DETAILS* pDeviceDetails);
+
+    HRESULT Initialize(
+        [in, defaultvalue(0)] UINT32 Flags,
+        [in, defaultvalue(XAUDIO2_DEFAULT_PROCESSOR)] XAUDIO2_PROCESSOR XAudio2Processor);
+
+    HRESULT RegisterForCallbacks([in] IXAudio2EngineCallback* pCallback);
+
+    void UnregisterForCallbacks([in] IXAudio2EngineCallback* pCallback);
+
+    HRESULT CreateSourceVoice(
+        [out] IXAudio2SourceVoice** ppSourceVoice,
+        [in] const WAVEFORMATEX* pSourceFormat,
+        [in, defaultvalue(0)] UINT32 Flags,
+        [in, defaultvalue(XAUDIO2_DEFAULT_FREQ_RATIO)] float MaxFrequencyRatio,
+        [in, defaultvalue(NULL)] IXAudio2VoiceCallback* pCallback,
+        [in, defaultvalue(NULL)] const XAUDIO2_VOICE_SENDS* pSendList,
+        [in, defaultvalue(NULL)] const XAUDIO2_EFFECT_CHAIN* pEffectChain);
+
+    HRESULT CreateSubmixVoice(
+        [out] IXAudio2SubmixVoice** ppSubmixVoice,
+        [in] UINT32 InputChannels,
+        [in] UINT32 InputSampleRate,
+        [in, defaultvalue(0)] UINT32 Flags,
+        [in, defaultvalue(0)] UINT32 ProcessingStage,
+        [in, defaultvalue(NULL)] const XAUDIO2_VOICE_SENDS* pSendList,
+        [in, defaultvalue(NULL)] const XAUDIO2_EFFECT_CHAIN* pEffectChain);
+
+    HRESULT CreateMasteringVoice(
+        [out] IXAudio2MasteringVoice** ppMasteringVoice,
+        [in, defaultvalue(XAUDIO2_DEFAULT_CHANNELS)] UINT32 InputChannels,
+        [in, defaultvalue(XAUDIO2_DEFAULT_SAMPLERATE)] UINT32 InputSampleRate,
+        [in, defaultvalue(0)] UINT32 Flags,
+        [in, defaultvalue(0)] UINT32 DeviceIndex,
+        [in, defaultvalue(NULL)] const XAUDIO2_EFFECT_CHAIN* pEffectChain);
+
+    HRESULT StartEngine();
+
+    void StopEngine();
+
+    HRESULT CommitChanges([in] UINT32 OperationSet);
+
+    void GetPerformanceData([out] XAUDIO2_PERFORMANCE_DATA* pPerfData);
+
+    [local] void SetDebugConfiguration(
+        [in] const XAUDIO2_DEBUG_CONFIGURATION* pDebugConfiguration,
+        [in, defaultvalue(NULL)] void* pReserved);
+}
+
+/* XAudio2 2.8's IXAudio2 is identical to 2.9's */
+cpp_quote("DEFINE_GUID(IID_IXAudio28, 0x60d8dac8, 0x5aa1, 0x4e8e, 0xb5, 0x97, 0x2f, 0x5e, 0x28, 0x83, 0xd4, 0x84);")
+
+[
+    object,
+    uuid(2b02e3cf-2e0b-4ec3-be45-1b2a3fe7210d)
+]
+/* XAudio2 2.9's IXAudio2 interface. */
+interface IXAudio2 : IUnknown
+{
+    HRESULT RegisterForCallbacks([in] IXAudio2EngineCallback* pCallback);
+
+    void UnregisterForCallbacks([in] IXAudio2EngineCallback* pCallback);
+
+    HRESULT CreateSourceVoice(
+        [out] IXAudio2SourceVoice** ppSourceVoice,
+        [in] const WAVEFORMATEX* pSourceFormat,
+        [in, defaultvalue(0)] UINT32 Flags,
+        [in, defaultvalue(XAUDIO2_DEFAULT_FREQ_RATIO)] float MaxFrequencyRatio,
+        [in, defaultvalue(NULL)] IXAudio2VoiceCallback* pCallback,
+        [in, defaultvalue(NULL)] const XAUDIO2_VOICE_SENDS* pSendList,
+        [in, defaultvalue(NULL)] const XAUDIO2_EFFECT_CHAIN* pEffectChain);
+
+    HRESULT CreateSubmixVoice(
+        [out] IXAudio2SubmixVoice** ppSubmixVoice,
+        [in] UINT32 InputChannels,
+        [in] UINT32 InputSampleRate,
+        [in, defaultvalue(0)] UINT32 Flags,
+        [in, defaultvalue(0)] UINT32 ProcessingStage,
+        [in, defaultvalue(NULL)] const XAUDIO2_VOICE_SENDS* pSendList,
+        [in, defaultvalue(NULL)] const XAUDIO2_EFFECT_CHAIN* pEffectChain);
+
+    HRESULT CreateMasteringVoice(
+        [out] IXAudio2MasteringVoice** ppMasteringVoice,
+        [in, defaultvalue(XAUDIO2_DEFAULT_CHANNELS)] UINT32 InputChannels,
+        [in, defaultvalue(XAUDIO2_DEFAULT_SAMPLERATE)] UINT32 InputSampleRate,
+        [in, defaultvalue(0)] UINT32 Flags,
+        [in, defaultvalue(NULL)] LPCWSTR DeviceId,
+        [in, defaultvalue(NULL)] const XAUDIO2_EFFECT_CHAIN* pEffectChain,
+        [in, defaultvalue(AudioCategory_GameEffects)] AUDIO_STREAM_CATEGORY StreamCategory);
+
+    HRESULT StartEngine();
+
+    void StopEngine();
+
+    HRESULT CommitChanges([in] UINT32 OperationSet);
+
+    void GetPerformanceData([out] XAUDIO2_PERFORMANCE_DATA* pPerfData);
+
+    [local] void SetDebugConfiguration(
+        [in] const XAUDIO2_DEBUG_CONFIGURATION* pDebugConfiguration,
+        [in, defaultvalue(NULL)] void* pReserved);
+}
+
+const UINT32 XAUDIO2_DEBUG_ENGINE = 1;
+const UINT32 XAUDIO2_VOICE_NOPITCH = 2;
+const UINT32 XAUDIO2_VOICE_NOSRC = 4;
+const UINT32 XAUDIO2_VOICE_USEFILTER = 8;
+const UINT32 XAUDIO2_VOICE_MUSIC = 16;
+const UINT32 XAUDIO2_PLAY_TAILS = 32;
+const UINT32 XAUDIO2_END_OF_STREAM = 64;
+const UINT32 XAUDIO2_SEND_USEFILTER = 128;
+const UINT32 XAUDIO2_VOICE_NOSAMPLESPLAYED = 256;
+
+const XAUDIO2_FILTER_TYPE XAUDIO2_DEFAULT_FILTER_TYPE = LowPassFilter;
+const float XAUDIO2_DEFAULT_FILTER_FREQUENCY = XAUDIO2_MAX_FILTER_FREQUENCY;
+const float XAUDIO2_DEFAULT_FILTER_ONEOVERQ = 1.0;
+const UINT32 XAUDIO2_QUANTUM_NUMERATOR = 1;
+const UINT32 XAUDIO2_QUANTUM_DENOMINATOR = 100;
+const float XAUDIO2_QUANTUM_MS = (1000.0 * XAUDIO2_QUANTUM_NUMERATOR / XAUDIO2_QUANTUM_DENOMINATOR);
+
+const HRESULT XAUDIO2_E_INVALID_CALL = 0x88960001;
+const HRESULT XAUDIO2_E_XMA_DECODER_ERROR = 0x88960002;
+const HRESULT XAUDIO2_E_XAPO_CREATION_FAILED = 0x88960003;
+const HRESULT XAUDIO2_E_DEVICE_INVALIDATED = 0x88960004;
+
+/* xaudio 2.0 error codes */
+const HRESULT XAUDIO20_E_XMA_DECODER_ERROR = 0x88960001;
+const HRESULT XAUDIO20_E_XAPO_CREATION_FAILED = 0x88960002;
+const HRESULT XAUDIO20_E_DEVICE_INVALIDATED = 0x88960003;
+
+cpp_quote("#ifdef XAUDIO2_HELPER_FUNCTIONS")
+cpp_quote("#define _USE_MATH_DEFINES")
+cpp_quote("#include <math.h>")
+cpp_quote("inline static float XAudio2DecibelsToAmplitudeRatio(float decibels) { return powf(10.0f, decibels/20.0f); }")
+cpp_quote("inline static float XAudio2AmplitudeRatioToDecibels(float volume) { if (volume == 0) { return -3.402823466e+38f; } return 20.0f * log10f(volume); }")
+cpp_quote("inline static float XAudio2SemitonesToFrequencyRatio(float semitones) { return powf(2.0f, semitones/12.0f); }")
+cpp_quote("inline static float XAudio2FrequencyRatioToSemitones(float freqratio) { return 39.86313713864835f * log10f(freqratio); }")
+cpp_quote("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); }")
+cpp_quote("inline static float XAudio2RadiansToCutoffFrequency(float radians, float samplerate) { return samplerate * asinf(radians/2.0f) / (float)M_PI; }")
+cpp_quote("#endif")
+
+cpp_quote("HRESULT WINAPI XAudio2Create(IXAudio2** pxaudio2, UINT32 flags, XAUDIO2_PROCESSOR processor);")
+
+cpp_quote("#include <poppack.h>")
diff --git a/mingw-w64-headers/include/xaudio2fx.h b/mingw-w64-headers/include/xaudio2fx.h
new file mode 100644
index 0000000..2b1ba40
--- /dev/null
+++ b/mingw-w64-headers/include/xaudio2fx.h
@@ -0,0 +1,390 @@
+/*** Autogenerated by WIDL 5.13 from include/xaudio2fx.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 __xaudio2fx_h__
+#define __xaudio2fx_h__
+
+/* Forward declarations */
+
+#ifndef __AudioVolumeMeter20_FWD_DEFINED__
+#define __AudioVolumeMeter20_FWD_DEFINED__
+#ifdef __cplusplus
+typedef class AudioVolumeMeter20 AudioVolumeMeter20;
+#else
+typedef struct AudioVolumeMeter20 AudioVolumeMeter20;
+#endif /* defined __cplusplus */
+#endif /* defined __AudioVolumeMeter20_FWD_DEFINED__ */
+
+#ifndef __AudioVolumeMeter21_FWD_DEFINED__
+#define __AudioVolumeMeter21_FWD_DEFINED__
+#ifdef __cplusplus
+typedef class AudioVolumeMeter21 AudioVolumeMeter21;
+#else
+typedef struct AudioVolumeMeter21 AudioVolumeMeter21;
+#endif /* defined __cplusplus */
+#endif /* defined __AudioVolumeMeter21_FWD_DEFINED__ */
+
+#ifndef __AudioVolumeMeter22_FWD_DEFINED__
+#define __AudioVolumeMeter22_FWD_DEFINED__
+#ifdef __cplusplus
+typedef class AudioVolumeMeter22 AudioVolumeMeter22;
+#else
+typedef struct AudioVolumeMeter22 AudioVolumeMeter22;
+#endif /* defined __cplusplus */
+#endif /* defined __AudioVolumeMeter22_FWD_DEFINED__ */
+
+#ifndef __AudioVolumeMeter23_FWD_DEFINED__
+#define __AudioVolumeMeter23_FWD_DEFINED__
+#ifdef __cplusplus
+typedef class AudioVolumeMeter23 AudioVolumeMeter23;
+#else
+typedef struct AudioVolumeMeter23 AudioVolumeMeter23;
+#endif /* defined __cplusplus */
+#endif /* defined __AudioVolumeMeter23_FWD_DEFINED__ */
+
+#ifndef __AudioVolumeMeter24_FWD_DEFINED__
+#define __AudioVolumeMeter24_FWD_DEFINED__
+#ifdef __cplusplus
+typedef class AudioVolumeMeter24 AudioVolumeMeter24;
+#else
+typedef struct AudioVolumeMeter24 AudioVolumeMeter24;
+#endif /* defined __cplusplus */
+#endif /* defined __AudioVolumeMeter24_FWD_DEFINED__ */
+
+#ifndef __AudioVolumeMeter25_FWD_DEFINED__
+#define __AudioVolumeMeter25_FWD_DEFINED__
+#ifdef __cplusplus
+typedef class AudioVolumeMeter25 AudioVolumeMeter25;
+#else
+typedef struct AudioVolumeMeter25 AudioVolumeMeter25;
+#endif /* defined __cplusplus */
+#endif /* defined __AudioVolumeMeter25_FWD_DEFINED__ */
+
+#ifndef __AudioVolumeMeter26_FWD_DEFINED__
+#define __AudioVolumeMeter26_FWD_DEFINED__
+#ifdef __cplusplus
+typedef class AudioVolumeMeter26 AudioVolumeMeter26;
+#else
+typedef struct AudioVolumeMeter26 AudioVolumeMeter26;
+#endif /* defined __cplusplus */
+#endif /* defined __AudioVolumeMeter26_FWD_DEFINED__ */
+
+#ifndef __AudioVolumeMeter27_FWD_DEFINED__
+#define __AudioVolumeMeter27_FWD_DEFINED__
+#ifdef __cplusplus
+typedef class AudioVolumeMeter27 AudioVolumeMeter27;
+#else
+typedef struct AudioVolumeMeter27 AudioVolumeMeter27;
+#endif /* defined __cplusplus */
+#endif /* defined __AudioVolumeMeter27_FWD_DEFINED__ */
+
+#ifndef __AudioReverb20_FWD_DEFINED__
+#define __AudioReverb20_FWD_DEFINED__
+#ifdef __cplusplus
+typedef class AudioReverb20 AudioReverb20;
+#else
+typedef struct AudioReverb20 AudioReverb20;
+#endif /* defined __cplusplus */
+#endif /* defined __AudioReverb20_FWD_DEFINED__ */
+
+#ifndef __AudioReverb21_FWD_DEFINED__
+#define __AudioReverb21_FWD_DEFINED__
+#ifdef __cplusplus
+typedef class AudioReverb21 AudioReverb21;
+#else
+typedef struct AudioReverb21 AudioReverb21;
+#endif /* defined __cplusplus */
+#endif /* defined __AudioReverb21_FWD_DEFINED__ */
+
+#ifndef __AudioReverb22_FWD_DEFINED__
+#define __AudioReverb22_FWD_DEFINED__
+#ifdef __cplusplus
+typedef class AudioReverb22 AudioReverb22;
+#else
+typedef struct AudioReverb22 AudioReverb22;
+#endif /* defined __cplusplus */
+#endif /* defined __AudioReverb22_FWD_DEFINED__ */
+
+#ifndef __AudioReverb23_FWD_DEFINED__
+#define __AudioReverb23_FWD_DEFINED__
+#ifdef __cplusplus
+typedef class AudioReverb23 AudioReverb23;
+#else
+typedef struct AudioReverb23 AudioReverb23;
+#endif /* defined __cplusplus */
+#endif /* defined __AudioReverb23_FWD_DEFINED__ */
+
+#ifndef __AudioReverb24_FWD_DEFINED__
+#define __AudioReverb24_FWD_DEFINED__
+#ifdef __cplusplus
+typedef class AudioReverb24 AudioReverb24;
+#else
+typedef struct AudioReverb24 AudioReverb24;
+#endif /* defined __cplusplus */
+#endif /* defined __AudioReverb24_FWD_DEFINED__ */
+
+#ifndef __AudioReverb25_FWD_DEFINED__
+#define __AudioReverb25_FWD_DEFINED__
+#ifdef __cplusplus
+typedef class AudioReverb25 AudioReverb25;
+#else
+typedef struct AudioReverb25 AudioReverb25;
+#endif /* defined __cplusplus */
+#endif /* defined __AudioReverb25_FWD_DEFINED__ */
+
+#ifndef __AudioReverb26_FWD_DEFINED__
+#define __AudioReverb26_FWD_DEFINED__
+#ifdef __cplusplus
+typedef class AudioReverb26 AudioReverb26;
+#else
+typedef struct AudioReverb26 AudioReverb26;
+#endif /* defined __cplusplus */
+#endif /* defined __AudioReverb26_FWD_DEFINED__ */
+
+#ifndef __AudioReverb27_FWD_DEFINED__
+#define __AudioReverb27_FWD_DEFINED__
+#ifdef __cplusplus
+typedef class AudioReverb27 AudioReverb27;
+#else
+typedef struct AudioReverb27 AudioReverb27;
+#endif /* defined __cplusplus */
+#endif /* defined __AudioReverb27_FWD_DEFINED__ */
+
+/* Headers for imported files */
+
+#include <unknwn.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*****************************************************************************
+ * AudioVolumeMeter20 coclass
+ */
+
+DEFINE_GUID(CLSID_AudioVolumeMeter20, 0xc0c56f46, 0x29b1, 0x44e9, 0x99,0x39, 0xa3,0x2c,0xe8,0x68,0x67,0xe2);
+
+#ifdef __cplusplus
+class DECLSPEC_UUID("c0c56f46-29b1-44e9-9939-a32ce86867e2") AudioVolumeMeter20;
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(AudioVolumeMeter20, 0xc0c56f46, 0x29b1, 0x44e9, 0x99,0x39, 0xa3,0x2c,0xe8,0x68,0x67,0xe2)
+#endif
+#endif
+
+/*****************************************************************************
+ * AudioVolumeMeter21 coclass
+ */
+
+DEFINE_GUID(CLSID_AudioVolumeMeter21, 0xc1e3f122, 0xa2ea, 0x442c, 0x85,0x4f, 0x20,0xd9,0x8f,0x83,0x57,0xa1);
+
+#ifdef __cplusplus
+class DECLSPEC_UUID("c1e3f122-a2ea-442c-854f-20d98f8357a1") AudioVolumeMeter21;
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(AudioVolumeMeter21, 0xc1e3f122, 0xa2ea, 0x442c, 0x85,0x4f, 0x20,0xd9,0x8f,0x83,0x57,0xa1)
+#endif
+#endif
+
+/*****************************************************************************
+ * AudioVolumeMeter22 coclass
+ */
+
+DEFINE_GUID(CLSID_AudioVolumeMeter22, 0xf5ca7b34, 0x8055, 0x42c0, 0xb8,0x36, 0x21,0x61,0x29,0xeb,0x7e,0x30);
+
+#ifdef __cplusplus
+class DECLSPEC_UUID("f5ca7b34-8055-42c0-b836-216129eb7e30") AudioVolumeMeter22;
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(AudioVolumeMeter22, 0xf5ca7b34, 0x8055, 0x42c0, 0xb8,0x36, 0x21,0x61,0x29,0xeb,0x7e,0x30)
+#endif
+#endif
+
+/*****************************************************************************
+ * AudioVolumeMeter23 coclass
+ */
+
+DEFINE_GUID(CLSID_AudioVolumeMeter23, 0xe180344b, 0xac83, 0x4483, 0x95,0x9e, 0x18,0xa5,0xc5,0x6a,0x5e,0x19);
+
+#ifdef __cplusplus
+class DECLSPEC_UUID("e180344b-ac83-4483-959e-18a5c56a5e19") AudioVolumeMeter23;
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(AudioVolumeMeter23, 0xe180344b, 0xac83, 0x4483, 0x95,0x9e, 0x18,0xa5,0xc5,0x6a,0x5e,0x19)
+#endif
+#endif
+
+/*****************************************************************************
+ * AudioVolumeMeter24 coclass
+ */
+
+DEFINE_GUID(CLSID_AudioVolumeMeter24, 0xc7338b95, 0x52b8, 0x4542, 0xaa,0x79, 0x42,0xeb,0x01,0x6c,0x8c,0x1c);
+
+#ifdef __cplusplus
+class DECLSPEC_UUID("c7338b95-52b8-4542-aa79-42eb016c8c1c") AudioVolumeMeter24;
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(AudioVolumeMeter24, 0xc7338b95, 0x52b8, 0x4542, 0xaa,0x79, 0x42,0xeb,0x01,0x6c,0x8c,0x1c)
+#endif
+#endif
+
+/*****************************************************************************
+ * AudioVolumeMeter25 coclass
+ */
+
+DEFINE_GUID(CLSID_AudioVolumeMeter25, 0x2139e6da, 0xc341, 0x4774, 0x9a,0xc3, 0xb4,0xe0,0x26,0x34,0x7f,0x64);
+
+#ifdef __cplusplus
+class DECLSPEC_UUID("2139e6da-c341-4774-9ac3-b4e026347f64") AudioVolumeMeter25;
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(AudioVolumeMeter25, 0x2139e6da, 0xc341, 0x4774, 0x9a,0xc3, 0xb4,0xe0,0x26,0x34,0x7f,0x64)
+#endif
+#endif
+
+/*****************************************************************************
+ * AudioVolumeMeter26 coclass
+ */
+
+DEFINE_GUID(CLSID_AudioVolumeMeter26, 0xe48c5a3f, 0x93ef, 0x43bb, 0xa0,0x92, 0x2c,0x7c,0xeb,0x94,0x6f,0x27);
+
+#ifdef __cplusplus
+class DECLSPEC_UUID("e48c5a3f-93ef-43bb-a092-2c7ceb946f27") AudioVolumeMeter26;
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(AudioVolumeMeter26, 0xe48c5a3f, 0x93ef, 0x43bb, 0xa0,0x92, 0x2c,0x7c,0xeb,0x94,0x6f,0x27)
+#endif
+#endif
+
+/*****************************************************************************
+ * AudioVolumeMeter27 coclass
+ */
+
+DEFINE_GUID(CLSID_AudioVolumeMeter27, 0xcac1105f, 0x619b, 0x4d04, 0x83,0x1a, 0x44,0xe1,0xcb,0xf1,0x2d,0x57);
+
+#ifdef __cplusplus
+class DECLSPEC_UUID("cac1105f-619b-4d04-831a-44e1cbf12d57") AudioVolumeMeter27;
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(AudioVolumeMeter27, 0xcac1105f, 0x619b, 0x4d04, 0x83,0x1a, 0x44,0xe1,0xcb,0xf1,0x2d,0x57)
+#endif
+#endif
+
+/*****************************************************************************
+ * AudioReverb20 coclass
+ */
+
+DEFINE_GUID(CLSID_AudioReverb20, 0x6f6ea3a9, 0x2cf5, 0x41cf, 0x91,0xc1, 0x21,0x70,0xb1,0x54,0x00,0x63);
+
+#ifdef __cplusplus
+class DECLSPEC_UUID("6f6ea3a9-2cf5-41cf-91c1-2170b1540063") AudioReverb20;
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(AudioReverb20, 0x6f6ea3a9, 0x2cf5, 0x41cf, 0x91,0xc1, 0x21,0x70,0xb1,0x54,0x00,0x63)
+#endif
+#endif
+
+/*****************************************************************************
+ * AudioReverb21 coclass
+ */
+
+DEFINE_GUID(CLSID_AudioReverb21, 0xf4769300, 0xb949, 0x4df9, 0xb3,0x33, 0x00,0xd3,0x39,0x32,0xe9,0xa6);
+
+#ifdef __cplusplus
+class DECLSPEC_UUID("f4769300-b949-4df9-b333-00d33932e9a6") AudioReverb21;
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(AudioReverb21, 0xf4769300, 0xb949, 0x4df9, 0xb3,0x33, 0x00,0xd3,0x39,0x32,0xe9,0xa6)
+#endif
+#endif
+
+/*****************************************************************************
+ * AudioReverb22 coclass
+ */
+
+DEFINE_GUID(CLSID_AudioReverb22, 0x629cf0de, 0x3ecc, 0x41e7, 0x99,0x26, 0xf7,0xe4,0x3e,0xeb,0xec,0x51);
+
+#ifdef __cplusplus
+class DECLSPEC_UUID("629cf0de-3ecc-41e7-9926-f7e43eebec51") AudioReverb22;
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(AudioReverb22, 0x629cf0de, 0x3ecc, 0x41e7, 0x99,0x26, 0xf7,0xe4,0x3e,0xeb,0xec,0x51)
+#endif
+#endif
+
+/*****************************************************************************
+ * AudioReverb23 coclass
+ */
+
+DEFINE_GUID(CLSID_AudioReverb23, 0x9cab402c, 0x1d37, 0x44b4, 0x88,0x6d, 0xfa,0x4f,0x36,0x17,0x0a,0x4c);
+
+#ifdef __cplusplus
+class DECLSPEC_UUID("9cab402c-1d37-44b4-886d-fa4f36170a4c") AudioReverb23;
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(AudioReverb23, 0x9cab402c, 0x1d37, 0x44b4, 0x88,0x6d, 0xfa,0x4f,0x36,0x17,0x0a,0x4c)
+#endif
+#endif
+
+/*****************************************************************************
+ * AudioReverb24 coclass
+ */
+
+DEFINE_GUID(CLSID_AudioReverb24, 0x8bb7778b, 0x645b, 0x4475, 0x9a,0x73, 0x1d,0xe3,0x17,0x0b,0xd3,0xaf);
+
+#ifdef __cplusplus
+class DECLSPEC_UUID("8bb7778b-645b-4475-9a73-1de3170bd3af") AudioReverb24;
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(AudioReverb24, 0x8bb7778b, 0x645b, 0x4475, 0x9a,0x73, 0x1d,0xe3,0x17,0x0b,0xd3,0xaf)
+#endif
+#endif
+
+/*****************************************************************************
+ * AudioReverb25 coclass
+ */
+
+DEFINE_GUID(CLSID_AudioReverb25, 0xd06df0d0, 0x8518, 0x441e, 0x82,0x2f, 0x54,0x51,0xd5,0xc5,0x95,0xb8);
+
+#ifdef __cplusplus
+class DECLSPEC_UUID("d06df0d0-8518-441e-822f-5451d5c595b8") AudioReverb25;
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(AudioReverb25, 0xd06df0d0, 0x8518, 0x441e, 0x82,0x2f, 0x54,0x51,0xd5,0xc5,0x95,0xb8)
+#endif
+#endif
+
+/*****************************************************************************
+ * AudioReverb26 coclass
+ */
+
+DEFINE_GUID(CLSID_AudioReverb26, 0xcecec95a, 0xd894, 0x491a, 0xbe,0xe3, 0x5e,0x10,0x6f,0xb5,0x9f,0x2d);
+
+#ifdef __cplusplus
+class DECLSPEC_UUID("cecec95a-d894-491a-bee3-5e106fb59f2d") AudioReverb26;
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(AudioReverb26, 0xcecec95a, 0xd894, 0x491a, 0xbe,0xe3, 0x5e,0x10,0x6f,0xb5,0x9f,0x2d)
+#endif
+#endif
+
+/*****************************************************************************
+ * AudioReverb27 coclass
+ */
+
+DEFINE_GUID(CLSID_AudioReverb27, 0x6a93130e, 0x1d53, 0x41d1, 0xa9,0xcf, 0xe7,0x58,0x80,0x0b,0xb1,0x79);
+
+#ifdef __cplusplus
+class DECLSPEC_UUID("6a93130e-1d53-41d1-a9cf-e758800bb179") AudioReverb27;
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(AudioReverb27, 0x6a93130e, 0x1d53, 0x41d1, 0xa9,0xcf, 0xe7,0x58,0x80,0x0b,0xb1,0x79)
+#endif
+#endif
+
+/* Begin additional prototypes for all interfaces */
+
+
+/* End additional prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __xaudio2fx_h__ */
diff --git a/mingw-w64-headers/include/xaudio2fx.idl b/mingw-w64-headers/include/xaudio2fx.idl
new file mode 100644
index 0000000..224c660
--- /dev/null
+++ b/mingw-w64-headers/include/xaudio2fx.idl
@@ -0,0 +1,131 @@
+/*
+ * Copyright (c) 2015 Andrew Eikum
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+import "unknwn.idl";
+
+[
+    uuid(c0c56f46-29b1-44e9-9939-a32ce86867e2)
+]
+coclass AudioVolumeMeter20 {
+    interface IUnknown;
+}
+
+[
+    uuid(c1e3f122-a2ea-442c-854f-20d98f8357a1)
+]
+coclass AudioVolumeMeter21 {
+    interface IUnknown;
+}
+
+[
+    uuid(f5ca7b34-8055-42c0-b836-216129eb7e30)
+]
+coclass AudioVolumeMeter22 {
+    interface IUnknown;
+}
+
+[
+    uuid(e180344b-ac83-4483-959e-18a5c56a5e19)
+]
+coclass AudioVolumeMeter23 {
+    interface IUnknown;
+}
+
+[
+    uuid(c7338b95-52b8-4542-aa79-42eb016c8c1c)
+]
+coclass AudioVolumeMeter24 {
+    interface IUnknown;
+}
+
+[
+    uuid(2139e6da-c341-4774-9ac3-b4e026347f64)
+]
+coclass AudioVolumeMeter25 {
+    interface IUnknown;
+}
+
+[
+    uuid(e48c5a3f-93ef-43bb-a092-2c7ceb946f27)
+]
+coclass AudioVolumeMeter26 {
+    interface IUnknown;
+}
+
+[
+    uuid(cac1105f-619b-4d04-831a-44e1cbf12d57)
+]
+coclass AudioVolumeMeter27 {
+    interface IUnknown;
+}
+
+[
+    uuid(6f6ea3a9-2cf5-41cf-91c1-2170b1540063)
+]
+coclass AudioReverb20 {
+    interface IUnknown;
+}
+
+[
+    uuid(f4769300-b949-4df9-b333-00d33932e9a6)
+]
+coclass AudioReverb21 {
+    interface IUnknown;
+}
+
+[
+    uuid(629cf0de-3ecc-41e7-9926-f7e43eebec51)
+]
+coclass AudioReverb22 {
+    interface IUnknown;
+}
+
+[
+    uuid(9cab402c-1d37-44b4-886d-fa4f36170a4c)
+]
+coclass AudioReverb23 {
+    interface IUnknown;
+}
+
+[
+    uuid(8bb7778b-645b-4475-9a73-1de3170bd3af)
+]
+coclass AudioReverb24 {
+    interface IUnknown;
+}
+
+[
+    uuid(d06df0d0-8518-441e-822f-5451d5c595b8)
+]
+coclass AudioReverb25 {
+    interface IUnknown;
+}
+
+[
+    uuid(cecec95a-d894-491a-bee3-5e106fb59f2d)
+]
+coclass AudioReverb26 {
+    interface IUnknown;
+}
+
+[
+    uuid(6a93130e-1d53-41d1-a9cf-e758800bb179)
+]
+coclass AudioReverb27 {
+    interface IUnknown;
+}
diff --git a/mingw-w64-headers/wine-import.sh b/mingw-w64-headers/wine-import.sh
index ec74e7d..e3b36ee 100755
--- a/mingw-w64-headers/wine-import.sh
+++ b/mingw-w64-headers/wine-import.sh
@@ -78,6 +78,7 @@
 	d3dx9shape.h \
 	d3dx9tex.h \
 	d3dx9xof.h \
+	devpkey.h \
 	dls1.h \
 	dls2.h \
 	dmerror.h \
@@ -118,7 +119,8 @@
 	vfwmsgs.h \
 	winhttp.h \
 	winineti.h \
-        xinput.h; do
+	xapofx.h \
+	xinput.h; do
     import_header $f include
 done
 
@@ -181,6 +183,9 @@
 	wmsbuffer \
 	wmsdkidl \
 	wpcapi \
+	xapo \
+	xaudio2 \
+	xaudio2fx \
 	xmllite; do
     import_idl $f.idl include
 done
