diff --git a/Directory.Build.props b/Directory.Build.props index dddf0c5..7390d72 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -14,7 +14,7 @@ true $(MSBuildThisFileDirectory)NuGet.config - 1.9.21 + 1.9.22 true diff --git a/src/Generator/Program.cs b/src/Generator/Program.cs index a0606aa..74f4dcf 100644 --- a/src/Generator/Program.cs +++ b/src/Generator/Program.cs @@ -2527,6 +2527,11 @@ public static class Program } } + if (parameterName == "pReserved") + { + argumentBuilder.Append(" = null"); + } + argumentsTypesBuilder.Append(parameterType); argumentsNameBuilder.Append(parameterName); @@ -3385,7 +3390,14 @@ public static class Program private static bool IsEnum(string typeName) { - return s_visitedEnums.Contains(typeName); + switch (typeName) + { + case "Media.Audio.AUDIO_STREAM_CATEGORY": + return true; + + default: + return s_visitedEnums.Contains(typeName); + } } private static bool IsStruct(string typeName) diff --git a/src/Vortice.Win32.Media.Audio.XAudio2/Generated/IXAudio2.cs b/src/Vortice.Win32.Media.Audio.XAudio2/Generated/IXAudio2.cs index 4a63a6e..a6156cd 100644 --- a/src/Vortice.Win32.Media.Audio.XAudio2/Generated/IXAudio2.cs +++ b/src/Vortice.Win32.Media.Audio.XAudio2/Generated/IXAudio2.cs @@ -137,12 +137,12 @@ public unsafe partial struct IXAudio2 : IXAudio2.Interface, INativeGuid /// [MethodImpl(MethodImplOptions.AggressiveInlining)] [VtblIndex(7)] - public HResult CreateMasteringVoice(IXAudio2MasteringVoice** ppMasteringVoice, uint InputChannels, uint InputSampleRate, uint Flags, ushort* szDeviceId, EffectChain* pEffectChain, Media.Audio.AudioStreamCategory* StreamCategory) + public HResult CreateMasteringVoice(IXAudio2MasteringVoice** ppMasteringVoice, uint InputChannels, uint InputSampleRate, uint Flags, ushort* szDeviceId, EffectChain* pEffectChain, Media.Audio.AudioStreamCategory StreamCategory) { #if NET6_0_OR_GREATER - return ((delegate* unmanaged)(lpVtbl[7]))((IXAudio2*)Unsafe.AsPointer(ref this), ppMasteringVoice, InputChannels, InputSampleRate, Flags, szDeviceId, pEffectChain, StreamCategory); + return ((delegate* unmanaged)(lpVtbl[7]))((IXAudio2*)Unsafe.AsPointer(ref this), ppMasteringVoice, InputChannels, InputSampleRate, Flags, szDeviceId, pEffectChain, StreamCategory); #else - return ((delegate* unmanaged[Stdcall])(lpVtbl[7]))((IXAudio2*)Unsafe.AsPointer(ref this), ppMasteringVoice, InputChannels, InputSampleRate, Flags, szDeviceId, pEffectChain, StreamCategory); + return ((delegate* unmanaged[Stdcall])(lpVtbl[7]))((IXAudio2*)Unsafe.AsPointer(ref this), ppMasteringVoice, InputChannels, InputSampleRate, Flags, szDeviceId, pEffectChain, StreamCategory); #endif } @@ -197,7 +197,7 @@ public unsafe partial struct IXAudio2 : IXAudio2.Interface, INativeGuid /// [MethodImpl(MethodImplOptions.AggressiveInlining)] [VtblIndex(12)] - public void SetDebugConfiguration(DebugConfiguration* pDebugConfiguration, void* pReserved) + public void SetDebugConfiguration(DebugConfiguration* pDebugConfiguration, void* pReserved = null) { #if NET6_0_OR_GREATER ((delegate* unmanaged)(lpVtbl[12]))((IXAudio2*)Unsafe.AsPointer(ref this), pDebugConfiguration, pReserved); @@ -221,7 +221,7 @@ public unsafe partial struct IXAudio2 : IXAudio2.Interface, INativeGuid HResult CreateSubmixVoice(IXAudio2SubmixVoice** ppSubmixVoice, uint InputChannels, uint InputSampleRate, uint Flags, uint ProcessingStage, VoiceSends* pSendList, EffectChain* pEffectChain); [VtblIndex(7)] - HResult CreateMasteringVoice(IXAudio2MasteringVoice** ppMasteringVoice, uint InputChannels, uint InputSampleRate, uint Flags, ushort* szDeviceId, EffectChain* pEffectChain, Media.Audio.AudioStreamCategory* StreamCategory); + HResult CreateMasteringVoice(IXAudio2MasteringVoice** ppMasteringVoice, uint InputChannels, uint InputSampleRate, uint Flags, ushort* szDeviceId, EffectChain* pEffectChain, Media.Audio.AudioStreamCategory StreamCategory); [VtblIndex(8)] HResult StartEngine(); @@ -236,7 +236,7 @@ public unsafe partial struct IXAudio2 : IXAudio2.Interface, INativeGuid void GetPerformanceData(PerformanceData* pPerfData); [VtblIndex(12)] - void SetDebugConfiguration(DebugConfiguration* pDebugConfiguration, void* pReserved); + void SetDebugConfiguration(DebugConfiguration* pDebugConfiguration, void* pReserved = null); } } diff --git a/src/Vortice.Win32.Media.Audio.XAudio2/X3DAudio/Apis.cs b/src/Vortice.Win32.Media.Audio.XAudio2/X3DAudio/Apis.cs new file mode 100644 index 0000000..7adfe4e --- /dev/null +++ b/src/Vortice.Win32.Media.Audio.XAudio2/X3DAudio/Apis.cs @@ -0,0 +1,23 @@ +// Copyright © Amer Koleci and Contributors. +// Licensed under the MIT License (MIT). See LICENSE in the repository root for more information. + +namespace Win32.Media.Audio.XAudio2; + +public static unsafe partial class Apis +{ + public static HResult X3DAudioInitialize(uint SpeakerChannelMask, out X3DAudioHandle Instance) + { + return X3DAudioInitialize(SpeakerChannelMask, X3DAUDIO_SPEED_OF_SOUND, out Instance); + } + + public static void X3DAudioCalculate(in X3DAudioHandle Instance, X3DAudioListener* pListener, X3DAudioEmitter* pEmitter, X3DCalculateFlags Flags, X3DAudioDSPSettings* pDSPSettings) + { + X3DAudioCalculate(Instance, pListener, pEmitter, (uint)Flags, pDSPSettings); + } + + [DllImport("xaudio2_9", ExactSpelling = true)] + public static extern HResult X3DAudioInitialize(uint SpeakerChannelMask, float SpeedOfSound, out X3DAudioHandle Instance); + + [DllImport("xaudio2_9", ExactSpelling = true)] + public static extern void X3DAudioCalculate(in X3DAudioHandle Instance, X3DAudioListener* pListener, X3DAudioEmitter* pEmitter, uint Flags, X3DAudioDSPSettings* pDSPSettings); +} diff --git a/src/Vortice.Win32.Media.Audio.XAudio2/X3DAudio/X3DAudioCone.cs b/src/Vortice.Win32.Media.Audio.XAudio2/X3DAudio/X3DAudioCone.cs new file mode 100644 index 0000000..ecdc356 --- /dev/null +++ b/src/Vortice.Win32.Media.Audio.XAudio2/X3DAudio/X3DAudioCone.cs @@ -0,0 +1,26 @@ +// Copyright © Amer Koleci and Contributors. +// Licensed under the MIT License (MIT). See LICENSE in the repository root for more information. + +namespace Win32.Media.Audio.XAudio2; + +/// X3DAUDIO_CONE +[StructLayout(LayoutKind.Sequential, Pack = 1)] +public partial struct X3DAudioCone +{ + [NativeTypeName("FLOAT32")] + public float InnerAngle; + + [NativeTypeName("FLOAT32")] + public float OuterAngle; + + [NativeTypeName("FLOAT32")] + public float InnerVolume; + + [NativeTypeName("FLOAT32")] + public float OuterVolume; + + [NativeTypeName("FLOAT32")] + public float InnerLPF; +} + + diff --git a/src/Vortice.Win32.Media.Audio.XAudio2/X3DAudio/X3DAudioDSPSettings.cs b/src/Vortice.Win32.Media.Audio.XAudio2/X3DAudio/X3DAudioDSPSettings.cs new file mode 100644 index 0000000..aedeabe --- /dev/null +++ b/src/Vortice.Win32.Media.Audio.XAudio2/X3DAudio/X3DAudioDSPSettings.cs @@ -0,0 +1,35 @@ +// Copyright © Amer Koleci and Contributors. +// Licensed under the MIT License (MIT). See LICENSE in the repository root for more information. + +namespace Win32.Media.Audio.XAudio2; + +/// X3DAUDIO_DSP_SETTINGS +[StructLayout(LayoutKind.Sequential, Pack = 1)] +public unsafe partial struct X3DAudioDSPSettings +{ + public float* pMatrixCoefficients; + + public float* pDelayTimes; + + public uint SrcChannelCount; + + public uint DstChannelCount; + + public float LPFDirectCoefficient; + + public float LPFReverbCoefficient; + + public float ReverbLevel; + + public float DopplerFactor; + + public float EmitterToListenerAngle; + + public float EmitterToListenerDistance; + + public float EmitterVelocityComponent; + + public float ListenerVelocityComponent; +} + + diff --git a/src/Vortice.Win32.Media.Audio.XAudio2/X3DAudio/X3DAudioDistanceCurve.cs b/src/Vortice.Win32.Media.Audio.XAudio2/X3DAudio/X3DAudioDistanceCurve.cs new file mode 100644 index 0000000..3788b84 --- /dev/null +++ b/src/Vortice.Win32.Media.Audio.XAudio2/X3DAudio/X3DAudioDistanceCurve.cs @@ -0,0 +1,15 @@ +// Copyright © Amer Koleci and Contributors. +// Licensed under the MIT License (MIT). See LICENSE in the repository root for more information. + +namespace Win32.Media.Audio.XAudio2; + +/// X3DAUDIO_DISTANCE_CURVE +[StructLayout(LayoutKind.Sequential, Pack = 1)] +public unsafe partial struct X3DAudioDistanceCurve +{ + public X3DAudioDistanceCurvePoint* pPoints; + + public uint PointCount; +} + + diff --git a/src/Vortice.Win32.Media.Audio.XAudio2/X3DAudio/X3DAudioDistanceCurvePoint.cs b/src/Vortice.Win32.Media.Audio.XAudio2/X3DAudio/X3DAudioDistanceCurvePoint.cs new file mode 100644 index 0000000..658a5e3 --- /dev/null +++ b/src/Vortice.Win32.Media.Audio.XAudio2/X3DAudio/X3DAudioDistanceCurvePoint.cs @@ -0,0 +1,15 @@ +// Copyright © Amer Koleci and Contributors. +// Licensed under the MIT License (MIT). See LICENSE in the repository root for more information. + +namespace Win32.Media.Audio.XAudio2; + +/// X3DAUDIO_DISTANCE_CURVE_POINT +[StructLayout(LayoutKind.Sequential, Pack = 1)] +public unsafe partial struct X3DAudioDistanceCurvePoint +{ + public float Distance; + + public float DSPSetting; +} + + diff --git a/src/Vortice.Win32.Media.Audio.XAudio2/X3DAudio/X3DAudioEmitter.cs b/src/Vortice.Win32.Media.Audio.XAudio2/X3DAudio/X3DAudioEmitter.cs new file mode 100644 index 0000000..c55630c --- /dev/null +++ b/src/Vortice.Win32.Media.Audio.XAudio2/X3DAudio/X3DAudioEmitter.cs @@ -0,0 +1,45 @@ +// Copyright © Amer Koleci and Contributors. +// Licensed under the MIT License (MIT). See LICENSE in the repository root for more information. + +namespace Win32.Media.Audio.XAudio2; + +/// X3DAUDIO_EMITTER +[StructLayout(LayoutKind.Sequential, Pack = 1)] +public unsafe partial struct X3DAudioEmitter +{ + public X3DAudioCone* pCone; + + public Vector3 OrientFront; + + public Vector3 OrientTop; + + public Vector3 Position; + + public Vector3 Velocity; + + public float InnerRadius; + + public float InnerRadiusAngle; + + public uint ChannelCount; + + public float ChannelRadius; + + public float* pChannelAzimuths; + + public X3DAudioDistanceCurve* pVolumeCurve; + + public X3DAudioDistanceCurve* pLFECurve; + + public X3DAudioDistanceCurve* pLPFDirectCurve; + + public X3DAudioDistanceCurve* pLPFReverbCurve; + + public X3DAudioDistanceCurve* pReverbCurve; + + public float CurveDistanceScaler; + + public float DopplerScaler; +} + + diff --git a/src/Vortice.Win32.Media.Audio.XAudio2/X3DAudio/X3DAudioHandle.cs b/src/Vortice.Win32.Media.Audio.XAudio2/X3DAudio/X3DAudioHandle.cs new file mode 100644 index 0000000..d575ffa --- /dev/null +++ b/src/Vortice.Win32.Media.Audio.XAudio2/X3DAudio/X3DAudioHandle.cs @@ -0,0 +1,13 @@ +// Copyright © Amer Koleci and Contributors. +// Licensed under the MIT License (MIT). See LICENSE in the repository root for more information. + +using static Win32.Media.Audio.XAudio2.Apis; + +namespace Win32.Media.Audio.XAudio2; + +[StructLayout(LayoutKind.Explicit, Size = (int)X3DAUDIO_HANDLE_BYTESIZE)] +public readonly struct X3DAudioHandle +{ +} + + diff --git a/src/Vortice.Win32.Media.Audio.XAudio2/X3DAudio/X3DAudioListener.cs b/src/Vortice.Win32.Media.Audio.XAudio2/X3DAudio/X3DAudioListener.cs new file mode 100644 index 0000000..1c76724 --- /dev/null +++ b/src/Vortice.Win32.Media.Audio.XAudio2/X3DAudio/X3DAudioListener.cs @@ -0,0 +1,21 @@ +// Copyright © Amer Koleci and Contributors. +// Licensed under the MIT License (MIT). See LICENSE in the repository root for more information. + +namespace Win32.Media.Audio.XAudio2; + +/// X3DAUDIO_LISTENER +[StructLayout(LayoutKind.Sequential, Pack = 1)] +public struct X3DAudioListener +{ + public Vector3 OrientFront; + + public Vector3 OrientTop; + + public Vector3 Position; + + public Vector3 Velocity; + + public unsafe X3DAudioCone* pCone; +} + + diff --git a/src/Vortice.Win32.Media.Audio.XAudio2/X3DAudio/X3DCalculateFlags.cs b/src/Vortice.Win32.Media.Audio.XAudio2/X3DAudio/X3DCalculateFlags.cs new file mode 100644 index 0000000..ea712d4 --- /dev/null +++ b/src/Vortice.Win32.Media.Audio.XAudio2/X3DAudio/X3DCalculateFlags.cs @@ -0,0 +1,32 @@ +// Copyright © Amer Koleci and Contributors. +// Licensed under the MIT License (MIT). See LICENSE in the repository root for more information. + +using static Win32.Media.Audio.XAudio2.Apis; + +namespace Win32.Media.Audio.XAudio2; + +[Flags] +public enum X3DCalculateFlags : uint +{ + None = 0, + /// X3DAUDIO_CALCULATE_MATRIX + Matrix = X3DAUDIO_CALCULATE_MATRIX, + /// X3DAUDIO_CALCULATE_DELAY + Delay = X3DAUDIO_CALCULATE_DELAY, + /// X3DAUDIO_CALCULATE_LPF_DIRECT + LpfDirect = X3DAUDIO_CALCULATE_LPF_DIRECT, + /// X3DAUDIO_CALCULATE_LPF_REVERB + LpfReverb = X3DAUDIO_CALCULATE_LPF_REVERB, + /// X3DAUDIO_CALCULATE_REVERB + Reverb = X3DAUDIO_CALCULATE_REVERB, + /// X3DAUDIO_CALCULATE_DOPPLER + Doppler = X3DAUDIO_CALCULATE_DOPPLER, + /// X3DAUDIO_CALCULATE_EMITTER_ANGLE + EmitterAngle = X3DAUDIO_CALCULATE_EMITTER_ANGLE, + /// X3DAUDIO_CALCULATE_ZEROCENTER + ZeroCenter = X3DAUDIO_CALCULATE_ZEROCENTER, + /// X3DAUDIO_CALCULATE_REDIRECT_TO_LFE + RedirectToLfe = X3DAUDIO_CALCULATE_REDIRECT_TO_LFE, +} + + diff --git a/src/Vortice.Win32.Media.Audio.XAudio2/XAudio2.xml b/src/Vortice.Win32.Media.Audio.XAudio2/XAudio2.xml index 2a90c45..c8b0cea 100644 --- a/src/Vortice.Win32.Media.Audio.XAudio2/XAudio2.xml +++ b/src/Vortice.Win32.Media.Audio.XAudio2/XAudio2.xml @@ -418,7 +418,6 @@ See Remarks for more information on volume levels. Changes global debug logging options for XAudio2. Microsoft Docs: Pointer to a XAUDIO2_DEBUG_CONFIGURATION structure that contains the new debug configuration. - This parameter is reserved and must be NULL. diff --git a/src/Vortice.Win32/Media/Audio/Speakers.cs b/src/Vortice.Win32/Media/Audio/Speakers.cs new file mode 100644 index 0000000..13aee7b --- /dev/null +++ b/src/Vortice.Win32/Media/Audio/Speakers.cs @@ -0,0 +1,85 @@ +// Copyright © Amer Koleci and Contributors. +// Licensed under the MIT License (MIT). See LICENSE in the repository root for more information. + +namespace Win32.Media.Audio; + +/// SPEAKER_FLAGS +/// SPEAKER_FLAGS +[Flags] +public enum Speakers : uint +{ + /// + /// None value. + /// + None = 0, + /// SPEAKER_FRONT_LEFT + FrontLeft = 0x1, + /// SPEAKER_FRONT_RIGHT + FrontRight = 0x2, + /// SPEAKER_FRONT_CENTER + FrontCenter = 0x4, + /// SPEAKER_LOW_FREQUENCY + LowFrequency = 0x4, + /// SPEAKER_BACK_LEFT + BackLeft = 0x10, + /// SPEAKER_BACK_RIGHT + BackRight = 0x20, + /// SPEAKER_FRONT_LEFT_OF_CENTER + FrontLeftOfCenter = 0x40, + /// SPEAKER_FRONT_RIGHT_OF_CENTER + FrontRightOfCenter = 0x80, + /// SPEAKER_BACK_CENTER + BackCenter = 0x100, + /// SPEAKER_SIDE_LEFT + SideLeft = 0x200, + /// SPEAKER_SIDE_RIGHT + SideRight = 0x400, + /// SPEAKER_TOP_CENTER + TopCenter = 0x800, + /// SPEAKER_TOP_FRONT_LEFT + TopFrontLeft = 0x1000, + /// SPEAKER_TOP_FRONT_CENTER + TopFrontCenter = 0x2000, + /// SPEAKER_TOP_FRONT_RIGHT + TopFrontRight = 0x4000, + /// SPEAKER_TOP_BACK_LEFT + TopBackLeft = 0x8000, + /// SPEAKER_TOP_BACK_CENTER + TopBackCenter = 0x10000, + /// SPEAKER_TOP_BACK_RIGHT + TopBackRight = 0x20000, + /// SPEAKER_RESERVED + Reserved = 0x7FFC0000, + /// SPEAKER_ALL + All = 0x80000000, + + [NativeTypeName("#define SPEAKER_MONO SPEAKER_FRONT_CENTER")] + Mono = FrontCenter, + + [NativeTypeName("#define SPEAKER_STEREO (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT)")] + Stereo = (FrontLeft | FrontRight), + + [NativeTypeName("#define SPEAKER_2POINT1 (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_LOW_FREQUENCY)")] + TwoPointOne = (0x00000001 | 0x00000002 | 0x00000008), + + [NativeTypeName("#define SPEAKER_SURROUND (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_BACK_CENTER)")] + Surround = (0x00000001 | 0x00000002 | 0x00000004 | 0x00000100), + + [NativeTypeName("#define SPEAKER_QUAD (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT)")] + Quad = (0x00000001 | 0x00000002 | 0x00000010 | 0x00000020), + + [NativeTypeName("#define SPEAKER_4POINT1 (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_LOW_FREQUENCY | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT)")] + FourPointOne = (0x00000001 | 0x00000002 | 0x00000008 | 0x00000010 | 0x00000020), + + [NativeTypeName("#define SPEAKER_5POINT1 (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT)")] + FivePointOne = (0x00000001 | 0x00000002 | 0x00000004 | 0x00000008 | 0x00000010 | 0x00000020), + + [NativeTypeName("#define SPEAKER_7POINT1 (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT | SPEAKER_FRONT_LEFT_OF_CENTER | SPEAKER_FRONT_RIGHT_OF_CENTER)")] + SevenPointOne = (0x00000001 | 0x00000002 | 0x00000004 | 0x00000008 | 0x00000010 | 0x00000020 | 0x00000040 | 0x00000080), + + [NativeTypeName("#define SPEAKER_5POINT1_SURROUND (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | SPEAKER_SIDE_LEFT | SPEAKER_SIDE_RIGHT)")] + FivePointOneSurround = (0x00000001 | 0x00000002 | 0x00000004 | 0x00000008 | 0x00000200 | 0x00000400), + + [NativeTypeName("#define SPEAKER_7POINT1_SURROUND (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT | SPEAKER_SIDE_LEFT | SPEAKER_SIDE_RIGHT)")] + SevenPointOneSurround = (0x00000001 | 0x00000002 | 0x00000004 | 0x00000008 | 0x00000010 | 0x00000020 | 0x00000200 | 0x00000400), +} diff --git a/src/samples/01-ClearScreen/Program.cs b/src/samples/01-ClearScreen/Program.cs index 72b52d9..687f769 100644 --- a/src/samples/01-ClearScreen/Program.cs +++ b/src/samples/01-ClearScreen/Program.cs @@ -12,6 +12,7 @@ using Win32.Graphics.Dxgi; using Win32.Graphics.Dxgi.Common; using Win32.Graphics.Imaging; using Win32.Graphics.Imaging.D2D; +using Win32.Media.Audio.XAudio2; using static Win32.Apis; using static Win32.Graphics.Direct2D.Apis; using static Win32.Graphics.Direct3D.Dxc.Apis; @@ -19,6 +20,8 @@ using static Win32.Graphics.Direct3D11.Apis; using static Win32.Graphics.DirectWrite.Apis; using static Win32.Graphics.Dxgi.Apis; using static Win32.Graphics.Imaging.D2D.Apis; +using static Win32.Media.Audio.XAudio2.Apis; + using DWriteFactoryType = Win32.Graphics.DirectWrite.FactoryType; using FactoryType = Win32.Graphics.Direct2D.FactoryType; using FeatureLevel = Win32.Graphics.Direct3D.FeatureLevel; @@ -110,6 +113,8 @@ public static unsafe class Program public static void Main() { + ThrowIfFailed(X3DAudioInitialize(0u, X3DAUDIO_SPEED_OF_SOUND, out X3DAudioHandle handle)); + TestDxc(); TestWic(); TestD2D1AndDWrite();