[RFC PATCH 3/5] xaudio2_7: Import FAudio headers for private use.
Rémi Bernon
rbernon at codeweavers.com
Wed Jun 23 07:37:25 CDT 2021
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
dlls/xaudio2_7/FAudio/F3DAudio.h | 262 ++++++
dlls/xaudio2_7/FAudio/FACT.h | 814 ++++++++++++++++++
dlls/xaudio2_7/FAudio/FACT3D.h | 127 +++
dlls/xaudio2_7/FAudio/FAPO.h | 207 +++++
dlls/xaudio2_7/FAudio/FAPOBase.h | 264 ++++++
dlls/xaudio2_7/FAudio/FAPOFX.h | 178 ++++
dlls/xaudio2_7/FAudio/FAudio.h | 1322 ++++++++++++++++++++++++++++++
dlls/xaudio2_7/FAudio/FAudioFX.h | 308 +++++++
8 files changed, 3482 insertions(+)
create mode 100644 dlls/xaudio2_7/FAudio/F3DAudio.h
create mode 100644 dlls/xaudio2_7/FAudio/FACT.h
create mode 100644 dlls/xaudio2_7/FAudio/FACT3D.h
create mode 100644 dlls/xaudio2_7/FAudio/FAPO.h
create mode 100644 dlls/xaudio2_7/FAudio/FAPOBase.h
create mode 100644 dlls/xaudio2_7/FAudio/FAPOFX.h
create mode 100644 dlls/xaudio2_7/FAudio/FAudio.h
create mode 100644 dlls/xaudio2_7/FAudio/FAudioFX.h
diff --git a/dlls/xaudio2_7/FAudio/F3DAudio.h b/dlls/xaudio2_7/FAudio/F3DAudio.h
new file mode 100644
index 00000000000..5fbb618243c
--- /dev/null
+++ b/dlls/xaudio2_7/FAudio/F3DAudio.h
@@ -0,0 +1,262 @@
+/* FAudio - XAudio Reimplementation for FNA
+ *
+ * Copyright (c) 2011-2021 Ethan Lee, Luigi Auriemma, and the MonoGame Team
+ *
+ * This software is provided 'as-is', without any express or implied warranty.
+ * In no event will the authors be held liable for any damages arising from
+ * the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ * claim that you wrote the original software. If you use this software in a
+ * product, an acknowledgment in the product documentation would be
+ * appreciated but is not required.
+ *
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ * misrepresented as being the original software.
+ *
+ * 3. This notice may not be removed or altered from any source distribution.
+ *
+ * Ethan "flibitijibibo" Lee <flibitijibibo at flibitijibibo.com>
+ *
+ */
+
+/* This file has no documentation since the MSDN docs are still perfectly fine:
+ * https://docs.microsoft.com/en-us/windows/desktop/api/x3daudio/
+ */
+
+#ifndef F3DAUDIO_H
+#define F3DAUDIO_H
+
+#ifdef _WIN32
+#define F3DAUDIOAPI __declspec(dllexport)
+#else
+#define F3DAUDIOAPI
+#endif
+
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/* Constants */
+
+#ifndef _SPEAKER_POSITIONS_
+#define SPEAKER_FRONT_LEFT 0x00000001
+#define SPEAKER_FRONT_RIGHT 0x00000002
+#define SPEAKER_FRONT_CENTER 0x00000004
+#define SPEAKER_LOW_FREQUENCY 0x00000008
+#define SPEAKER_BACK_LEFT 0x00000010
+#define SPEAKER_BACK_RIGHT 0x00000020
+#define SPEAKER_FRONT_LEFT_OF_CENTER 0x00000040
+#define SPEAKER_FRONT_RIGHT_OF_CENTER 0x00000080
+#define SPEAKER_BACK_CENTER 0x00000100
+#define SPEAKER_SIDE_LEFT 0x00000200
+#define SPEAKER_SIDE_RIGHT 0x00000400
+#define SPEAKER_TOP_CENTER 0x00000800
+#define SPEAKER_TOP_FRONT_LEFT 0x00001000
+#define SPEAKER_TOP_FRONT_CENTER 0x00002000
+#define SPEAKER_TOP_FRONT_RIGHT 0x00004000
+#define SPEAKER_TOP_BACK_LEFT 0x00008000
+#define SPEAKER_TOP_BACK_CENTER 0x00010000
+#define SPEAKER_TOP_BACK_RIGHT 0x00020000
+#define _SPEAKER_POSITIONS_
+#endif
+
+#ifndef SPEAKER_MONO
+#define SPEAKER_MONO SPEAKER_FRONT_CENTER
+#define SPEAKER_STEREO (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT)
+#define SPEAKER_2POINT1 \
+ ( SPEAKER_FRONT_LEFT | \
+ SPEAKER_FRONT_RIGHT | \
+ SPEAKER_LOW_FREQUENCY )
+#define SPEAKER_SURROUND \
+ ( SPEAKER_FRONT_LEFT | \
+ SPEAKER_FRONT_RIGHT | \
+ SPEAKER_FRONT_CENTER | \
+ SPEAKER_BACK_CENTER )
+#define SPEAKER_QUAD \
+ ( SPEAKER_FRONT_LEFT | \
+ SPEAKER_FRONT_RIGHT | \
+ SPEAKER_BACK_LEFT | \
+ SPEAKER_BACK_RIGHT )
+#define SPEAKER_4POINT1 \
+ ( SPEAKER_FRONT_LEFT | \
+ SPEAKER_FRONT_RIGHT | \
+ SPEAKER_LOW_FREQUENCY | \
+ SPEAKER_BACK_LEFT | \
+ SPEAKER_BACK_RIGHT )
+#define SPEAKER_5POINT1 \
+ ( SPEAKER_FRONT_LEFT | \
+ SPEAKER_FRONT_RIGHT | \
+ SPEAKER_FRONT_CENTER | \
+ SPEAKER_LOW_FREQUENCY | \
+ SPEAKER_BACK_LEFT | \
+ SPEAKER_BACK_RIGHT )
+#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 )
+#define SPEAKER_5POINT1_SURROUND \
+ ( SPEAKER_FRONT_LEFT | \
+ SPEAKER_FRONT_RIGHT | \
+ SPEAKER_FRONT_CENTER | \
+ SPEAKER_LOW_FREQUENCY | \
+ SPEAKER_SIDE_LEFT | \
+ SPEAKER_SIDE_RIGHT )
+#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 )
+#define SPEAKER_XBOX SPEAKER_5POINT1
+#endif
+
+#define F3DAUDIO_PI 3.141592654f
+#define F3DAUDIO_2PI 6.283185307f
+
+#define F3DAUDIO_CALCULATE_MATRIX 0x00000001
+#define F3DAUDIO_CALCULATE_DELAY 0x00000002
+#define F3DAUDIO_CALCULATE_LPF_DIRECT 0x00000004
+#define F3DAUDIO_CALCULATE_LPF_REVERB 0x00000008
+#define F3DAUDIO_CALCULATE_REVERB 0x00000010
+#define F3DAUDIO_CALCULATE_DOPPLER 0x00000020
+#define F3DAUDIO_CALCULATE_EMITTER_ANGLE 0x00000040
+#define F3DAUDIO_CALCULATE_ZEROCENTER 0x00010000
+#define F3DAUDIO_CALCULATE_REDIRECT_TO_LFE 0x00020000
+
+/* Type Declarations */
+
+#define F3DAUDIO_HANDLE_BYTESIZE 20
+typedef uint8_t F3DAUDIO_HANDLE[F3DAUDIO_HANDLE_BYTESIZE];
+
+/* Structures */
+
+#pragma pack(push, 1)
+
+typedef struct F3DAUDIO_VECTOR
+{
+ float x;
+ float y;
+ float z;
+} F3DAUDIO_VECTOR;
+
+typedef struct F3DAUDIO_DISTANCE_CURVE_POINT
+{
+ float Distance;
+ float DSPSetting;
+} F3DAUDIO_DISTANCE_CURVE_POINT;
+
+typedef struct F3DAUDIO_DISTANCE_CURVE
+{
+ F3DAUDIO_DISTANCE_CURVE_POINT *pPoints;
+ uint32_t PointCount;
+} F3DAUDIO_DISTANCE_CURVE;
+
+typedef struct F3DAUDIO_CONE
+{
+ float InnerAngle;
+ float OuterAngle;
+ float InnerVolume;
+ float OuterVolume;
+ float InnerLPF;
+ float OuterLPF;
+ float InnerReverb;
+ float OuterReverb;
+} F3DAUDIO_CONE;
+
+typedef struct F3DAUDIO_LISTENER
+{
+ F3DAUDIO_VECTOR OrientFront;
+ F3DAUDIO_VECTOR OrientTop;
+ F3DAUDIO_VECTOR Position;
+ F3DAUDIO_VECTOR Velocity;
+ F3DAUDIO_CONE *pCone;
+} F3DAUDIO_LISTENER;
+
+typedef struct F3DAUDIO_EMITTER
+{
+ F3DAUDIO_CONE *pCone;
+ F3DAUDIO_VECTOR OrientFront;
+ F3DAUDIO_VECTOR OrientTop;
+ F3DAUDIO_VECTOR Position;
+ F3DAUDIO_VECTOR Velocity;
+ float InnerRadius;
+ float InnerRadiusAngle;
+ uint32_t ChannelCount;
+ float ChannelRadius;
+ float *pChannelAzimuths;
+ F3DAUDIO_DISTANCE_CURVE *pVolumeCurve;
+ F3DAUDIO_DISTANCE_CURVE *pLFECurve;
+ F3DAUDIO_DISTANCE_CURVE *pLPFDirectCurve;
+ F3DAUDIO_DISTANCE_CURVE *pLPFReverbCurve;
+ F3DAUDIO_DISTANCE_CURVE *pReverbCurve;
+ float CurveDistanceScaler;
+ float DopplerScaler;
+} F3DAUDIO_EMITTER;
+
+#ifndef F3DAUDIO_DSP_SETTINGS_DECL
+#define F3DAUDIO_DSP_SETTINGS_DECL
+typedef struct F3DAUDIO_DSP_SETTINGS F3DAUDIO_DSP_SETTINGS;
+#endif /* F3DAUDIO_DSP_SETTINGS_DECL */
+
+struct F3DAUDIO_DSP_SETTINGS
+{
+ float *pMatrixCoefficients;
+ float *pDelayTimes;
+ uint32_t SrcChannelCount;
+ uint32_t DstChannelCount;
+ float LPFDirectCoefficient;
+ float LPFReverbCoefficient;
+ float ReverbLevel;
+ float DopplerFactor;
+ float EmitterToListenerAngle;
+ float EmitterToListenerDistance;
+ float EmitterVelocityComponent;
+ float ListenerVelocityComponent;
+};
+
+#pragma pack(pop)
+
+/* Functions */
+
+F3DAUDIOAPI void F3DAudioInitialize(
+ uint32_t SpeakerChannelMask,
+ float SpeedOfSound,
+ F3DAUDIO_HANDLE Instance
+);
+
+F3DAUDIOAPI uint32_t F3DAudioInitialize8(
+ uint32_t SpeakerChannelMask,
+ float SpeedOfSound,
+ F3DAUDIO_HANDLE Instance
+);
+
+F3DAUDIOAPI void F3DAudioCalculate(
+ const F3DAUDIO_HANDLE Instance,
+ const F3DAUDIO_LISTENER *pListener,
+ const F3DAUDIO_EMITTER *pEmitter,
+ uint32_t Flags,
+ F3DAUDIO_DSP_SETTINGS *pDSPSettings
+);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* F3DAUDIO_H */
+
+/* vim: set noexpandtab shiftwidth=8 tabstop=8: */
diff --git a/dlls/xaudio2_7/FAudio/FACT.h b/dlls/xaudio2_7/FAudio/FACT.h
new file mode 100644
index 00000000000..579b7168812
--- /dev/null
+++ b/dlls/xaudio2_7/FAudio/FACT.h
@@ -0,0 +1,814 @@
+/* FAudio - XAudio Reimplementation for FNA
+ *
+ * Copyright (c) 2011-2021 Ethan Lee, Luigi Auriemma, and the MonoGame Team
+ *
+ * This software is provided 'as-is', without any express or implied warranty.
+ * In no event will the authors be held liable for any damages arising from
+ * the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ * claim that you wrote the original software. If you use this software in a
+ * product, an acknowledgment in the product documentation would be
+ * appreciated but is not required.
+ *
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ * misrepresented as being the original software.
+ *
+ * 3. This notice may not be removed or altered from any source distribution.
+ *
+ * Ethan "flibitijibibo" Lee <flibitijibibo at flibitijibibo.com>
+ *
+ */
+
+/* This file has no documentation since you are expected to already know how
+ * XACT works if you are still using these APIs!
+ */
+
+#ifndef FACT_H
+#define FACT_H
+
+#include "FAudio.h"
+
+#define FACTAPI FAUDIOAPI
+#ifdef _WIN32
+#define FACTCALL __stdcall
+#else
+#define FACTCALL
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/* Type Declarations */
+
+typedef struct FACTAudioEngine FACTAudioEngine;
+typedef struct FACTSoundBank FACTSoundBank;
+typedef struct FACTWaveBank FACTWaveBank;
+typedef struct FACTWave FACTWave;
+typedef struct FACTCue FACTCue;
+typedef struct FACTNotification FACTNotification;
+
+typedef struct FACTRendererDetails
+{
+ int16_t rendererID[0xFF]; /* Win32 wchar_t */
+ int16_t displayName[0xFF]; /* Win32 wchar_t */
+ int32_t defaultDevice;
+} FACTRendererDetails;
+
+typedef struct FACTOverlapped
+{
+ void *Internal; /* ULONG_PTR */
+ void *InternalHigh; /* ULONG_PTR */
+ FAUDIONAMELESS union
+ {
+ FAUDIONAMELESS struct
+ {
+ uint32_t Offset;
+ uint32_t OffsetHigh;
+ };
+ void *Pointer;
+ };
+ void *hEvent;
+} FACTOverlapped;
+
+typedef int32_t (FACTCALL * FACTReadFileCallback)(
+ void *hFile,
+ void *buffer,
+ uint32_t nNumberOfBytesToRead,
+ uint32_t *lpNumberOfBytesRead,
+ FACTOverlapped *lpOverlapped
+);
+
+typedef int32_t (FACTCALL * FACTGetOverlappedResultCallback)(
+ void *hFile,
+ FACTOverlapped *lpOverlapped,
+ uint32_t *lpNumberOfBytesTransferred,
+ int32_t bWait
+);
+
+typedef struct FACTFileIOCallbacks
+{
+ FACTReadFileCallback readFileCallback;
+ FACTGetOverlappedResultCallback getOverlappedResultCallback;
+} FACTFileIOCallbacks;
+
+typedef void (FACTCALL * FACTNotificationCallback)(
+ const FACTNotification *pNotification
+);
+
+/* FIXME: ABI bug! This should be pack(1) explicitly. Do not memcpy this! */
+typedef struct FACTRuntimeParameters
+{
+ uint32_t lookAheadTime;
+ void *pGlobalSettingsBuffer;
+ uint32_t globalSettingsBufferSize;
+ uint32_t globalSettingsFlags;
+ uint32_t globalSettingsAllocAttributes;
+ FACTFileIOCallbacks fileIOCallbacks;
+ FACTNotificationCallback fnNotificationCallback;
+ int16_t *pRendererID; /* Win32 wchar_t* */
+ FAudio *pXAudio2;
+ FAudioMasteringVoice *pMasteringVoice;
+} FACTRuntimeParameters;
+
+typedef struct FACTStreamingParameters
+{
+ void *file;
+ uint32_t offset;
+ uint32_t flags;
+ uint16_t packetSize; /* Measured in DVD sectors, or 2048 bytes */
+} FACTStreamingParameters;
+
+#define FACT_WAVEBANK_TYPE_BUFFER 0x00000000
+#define FACT_WAVEBANK_TYPE_STREAMING 0x00000001
+#define FACT_WAVEBANK_TYPE_MASK 0x00000001
+
+#define FACT_WAVEBANK_FLAGS_ENTRYNAMES 0x00010000
+#define FACT_WAVEBANK_FLAGS_COMPACT 0x00020000
+#define FACT_WAVEBANK_FLAGS_SYNC_DISABLED 0x00040000
+#define FACT_WAVEBANK_FLAGS_SEEKTABLES 0x00080000
+#define FACT_WAVEBANK_FLAGS_MASK 0x000F0000
+
+typedef enum FACTWaveBankSegIdx
+{
+ FACT_WAVEBANK_SEGIDX_BANKDATA = 0,
+ FACT_WAVEBANK_SEGIDX_ENTRYMETADATA,
+ FACT_WAVEBANK_SEGIDX_SEEKTABLES,
+ FACT_WAVEBANK_SEGIDX_ENTRYNAMES,
+ FACT_WAVEBANK_SEGIDX_ENTRYWAVEDATA,
+ FACT_WAVEBANK_SEGIDX_COUNT
+} FACTWaveBankSegIdx;
+
+#pragma pack(push, 1)
+
+typedef struct FACTWaveBankRegion
+{
+ uint32_t dwOffset;
+ uint32_t dwLength;
+} FACTWaveBankRegion;
+
+typedef struct FACTWaveBankSampleRegion
+{
+ uint32_t dwStartSample;
+ uint32_t dwTotalSamples;
+} FACTWaveBankSampleRegion;
+
+typedef struct FACTWaveBankHeader
+{
+ uint32_t dwSignature;
+ uint32_t dwVersion;
+ uint32_t dwHeaderVersion;
+ FACTWaveBankRegion Segments[FACT_WAVEBANK_SEGIDX_COUNT];
+} FACTWaveBankHeader;
+
+typedef union FACTWaveBankMiniWaveFormat
+{
+ FAUDIONAMELESS struct
+ {
+ uint32_t wFormatTag : 2;
+ uint32_t nChannels : 3;
+ uint32_t nSamplesPerSec : 18;
+ uint32_t wBlockAlign : 8;
+ uint32_t wBitsPerSample : 1;
+ };
+ uint32_t dwValue;
+} FACTWaveBankMiniWaveFormat;
+
+typedef struct FACTWaveBankEntry
+{
+ FAUDIONAMELESS union
+ {
+ FAUDIONAMELESS struct
+ {
+ uint32_t dwFlags : 4;
+ uint32_t Duration : 28;
+ };
+ uint32_t dwFlagsAndDuration;
+ };
+ FACTWaveBankMiniWaveFormat Format;
+ FACTWaveBankRegion PlayRegion;
+ FACTWaveBankSampleRegion LoopRegion;
+} FACTWaveBankEntry;
+
+typedef struct FACTWaveBankEntryCompact
+{
+ uint32_t dwOffset : 21;
+ uint32_t dwLengthDeviation : 11;
+} FACTWaveBankEntryCompact;
+
+typedef struct FACTWaveBankData
+{
+ uint32_t dwFlags;
+ uint32_t dwEntryCount;
+ char szBankName[64];
+ uint32_t dwEntryMetaDataElementSize;
+ uint32_t dwEntryNameElementSize;
+ uint32_t dwAlignment;
+ FACTWaveBankMiniWaveFormat CompactFormat;
+ uint64_t BuildTime;
+} FACTWaveBankData;
+
+#pragma pack(pop)
+
+typedef struct FACTWaveProperties
+{
+ char friendlyName[64];
+ FACTWaveBankMiniWaveFormat format;
+ uint32_t durationInSamples;
+ FACTWaveBankSampleRegion loopRegion;
+ int32_t streaming;
+} FACTWaveProperties;
+
+typedef struct FACTWaveInstanceProperties
+{
+ FACTWaveProperties properties;
+ int32_t backgroundMusic;
+} FACTWaveInstanceProperties;
+
+typedef struct FACTCueProperties
+{
+ char friendlyName[0xFF];
+ int32_t interactive;
+ uint16_t iaVariableIndex;
+ uint16_t numVariations;
+ uint8_t maxInstances;
+ uint8_t currentInstances;
+} FACTCueProperties;
+
+typedef struct FACTTrackProperties
+{
+ uint32_t duration;
+ uint16_t numVariations;
+ uint8_t numChannels;
+ uint16_t waveVariation;
+ uint8_t loopCount;
+} FACTTrackProperties;
+
+typedef struct FACTVariationProperties
+{
+ uint16_t index;
+ uint8_t weight;
+ float iaVariableMin;
+ float iaVariableMax;
+ int32_t linger;
+} FACTVariationProperties;
+
+typedef struct FACTSoundProperties
+{
+ uint16_t category;
+ uint8_t priority;
+ int16_t pitch;
+ float volume;
+ uint16_t numTracks;
+ FACTTrackProperties arrTrackProperties[1];
+} FACTSoundProperties;
+
+typedef struct FACTSoundVariationProperties
+{
+ FACTVariationProperties variationProperties;
+ FACTSoundProperties soundProperties;
+} FACTSoundVariationProperties;
+
+typedef struct FACTCueInstanceProperties
+{
+ uint32_t allocAttributes;
+ FACTCueProperties cueProperties;
+ FACTSoundVariationProperties activeVariationProperties;
+} FACTCueInstanceProperties;
+
+#pragma pack(push, 1)
+
+typedef struct FACTNotificationDescription
+{
+ uint8_t type;
+ uint8_t flags;
+ FACTSoundBank *pSoundBank;
+ FACTWaveBank *pWaveBank;
+ FACTCue *pCue;
+ FACTWave *pWave;
+ uint16_t cueIndex;
+ uint16_t waveIndex;
+ void* pvContext;
+} FACTNotificationDescription;
+
+typedef struct FACTNotificationCue
+{
+ uint16_t cueIndex;
+ FACTSoundBank *pSoundBank;
+ FACTCue *pCue;
+} FACTNotificationCue;
+
+typedef struct FACTNotificationMarker
+{
+ uint16_t cueIndex;
+ FACTSoundBank *pSoundBank;
+ FACTCue *pCue;
+ uint32_t marker;
+} FACTNotificationMarker;
+
+typedef struct FACTNotificationSoundBank
+{
+ FACTSoundBank *pSoundBank;
+} FACTNotificationSoundBank;
+
+typedef struct FACTNotificationWaveBank
+{
+ FACTWaveBank *pWaveBank;
+} FACTNotificationWaveBank;
+
+typedef struct FACTNotificationVariable
+{
+ uint16_t cueIndex;
+ FACTSoundBank *pSoundBank;
+ FACTCue *pCue;
+ uint16_t variableIndex;
+ float variableValue;
+ int32_t local;
+} FACTNotificationVariable;
+
+typedef struct FACTNotificationGUI
+{
+ uint32_t reserved;
+} FACTNotificationGUI;
+
+typedef struct FACTNotificationWave
+{
+ FACTWaveBank *pWaveBank;
+ uint16_t waveIndex;
+ uint16_t cueIndex;
+ FACTSoundBank *pSoundBank;
+ FACTCue *pCue;
+ FACTWave *pWave;
+} FACTNotificationWave;
+
+struct FACTNotification
+{
+ uint8_t type;
+ int32_t timeStamp;
+ void *pvContext;
+ FAUDIONAMELESS union
+ {
+ FACTNotificationCue cue;
+ FACTNotificationMarker marker;
+ FACTNotificationSoundBank soundBank;
+ FACTNotificationWaveBank waveBank;
+ FACTNotificationVariable variable;
+ FACTNotificationGUI gui;
+ FACTNotificationWave wave;
+ };
+};
+
+#pragma pack(pop)
+
+/* Constants */
+
+#define FACT_CONTENT_VERSION 46
+
+static const uint32_t FACT_FLAG_MANAGEDATA = 0x00000001;
+
+static const uint32_t FACT_FLAG_STOP_RELEASE = 0x00000000;
+static const uint32_t FACT_FLAG_STOP_IMMEDIATE = 0x00000001;
+
+static const uint32_t FACT_FLAG_BACKGROUND_MUSIC = 0x00000002;
+static const uint32_t FACT_FLAG_UNITS_MS = 0x00000004;
+static const uint32_t FACT_FLAG_UNITS_SAMPLES = 0x00000008;
+
+static const uint32_t FACT_STATE_CREATED = 0x00000001;
+static const uint32_t FACT_STATE_PREPARING = 0x00000002;
+static const uint32_t FACT_STATE_PREPARED = 0x00000004;
+static const uint32_t FACT_STATE_PLAYING = 0x00000008;
+static const uint32_t FACT_STATE_STOPPING = 0x00000010;
+static const uint32_t FACT_STATE_STOPPED = 0x00000020;
+static const uint32_t FACT_STATE_PAUSED = 0x00000040;
+static const uint32_t FACT_STATE_INUSE = 0x00000080;
+static const uint32_t FACT_STATE_PREPAREFAILED = 0x80000000;
+
+static const int16_t FACTPITCH_MIN = -1200;
+static const int16_t FACTPITCH_MAX = 1200;
+static const int16_t FACTPITCH_MIN_TOTAL = -2400;
+static const int16_t FACTPITCH_MAX_TOTAL = 2400;
+
+static const float FACTVOLUME_MIN = 0.0f;
+static const float FACTVOLUME_MAX = 16777216.0f;
+
+static const uint16_t FACTINDEX_INVALID = 0xFFFF;
+static const uint16_t FACTVARIABLEINDEX_INVALID = 0xFFFF;
+static const uint16_t FACTCATEGORY_INVALID = 0xFFFF;
+
+static const uint8_t FACTNOTIFICATIONTYPE_CUEPREPARED = 1;
+static const uint8_t FACTNOTIFICATIONTYPE_CUEPLAY = 2;
+static const uint8_t FACTNOTIFICATIONTYPE_CUESTOP = 3;
+static const uint8_t FACTNOTIFICATIONTYPE_CUEDESTROYED = 4;
+static const uint8_t FACTNOTIFICATIONTYPE_MARKER = 5;
+static const uint8_t FACTNOTIFICATIONTYPE_SOUNDBANKDESTROYED = 6;
+static const uint8_t FACTNOTIFICATIONTYPE_WAVEBANKDESTROYED = 7;
+static const uint8_t FACTNOTIFICATIONTYPE_LOCALVARIABLECHANGED = 8;
+static const uint8_t FACTNOTIFICATIONTYPE_GLOBALVARIABLECHANGED = 9;
+static const uint8_t FACTNOTIFICATIONTYPE_GUICONNECTED = 10;
+static const uint8_t FACTNOTIFICATIONTYPE_GUIDISCONNECTED = 11;
+static const uint8_t FACTNOTIFICATIONTYPE_WAVEPREPARED = 12;
+static const uint8_t FACTNOTIFICATIONTYPE_WAVEPLAY = 13;
+static const uint8_t FACTNOTIFICATIONTYPE_WAVESTOP = 14;
+static const uint8_t FACTNOTIFICATIONTYPE_WAVELOOPED = 15;
+static const uint8_t FACTNOTIFICATIONTYPE_WAVEDESTROYED = 16;
+static const uint8_t FACTNOTIFICATIONTYPE_WAVEBANKPREPARED = 17;
+static const uint8_t FACTNOTIFICATIONTYPE_WAVEBANKSTREAMING_INVALIDCONTENT = 18;
+
+static const uint8_t FACT_FLAG_NOTIFICATION_PERSIST = 0x01;
+
+#define FACT_ENGINE_LOOKAHEAD_DEFAULT 250
+
+#define FACT_MAX_WMA_AVG_BYTES_PER_SEC_ENTRIES 7
+static const uint32_t aWMAAvgBytesPerSec[] =
+{
+ 12000,
+ 24000,
+ 4000,
+ 6000,
+ 8000,
+ 20000,
+ 2500
+};
+
+#define FACT_MAX_WMA_BLOCK_ALIGN_ENTRIES 17
+static const uint32_t aWMABlockAlign[] =
+{
+ 929,
+ 1487,
+ 1280,
+ 2230,
+ 8917,
+ 8192,
+ 4459,
+ 5945,
+ 2304,
+ 1536,
+ 1485,
+ 1008,
+ 2731,
+ 4096,
+ 6827,
+ 5462,
+ 1280
+};
+
+/* AudioEngine Interface */
+
+FACTAPI uint32_t FACTCreateEngine(
+ uint32_t dwCreationFlags,
+ FACTAudioEngine **ppEngine
+);
+
+/* See "extensions/CustomAllocatorEXT.txt" for more details. */
+FACTAPI uint32_t FACTCreateEngineWithCustomAllocatorEXT(
+ uint32_t dwCreationFlags,
+ FACTAudioEngine **ppEngine,
+ FAudioMallocFunc customMalloc,
+ FAudioFreeFunc customFree,
+ FAudioReallocFunc customRealloc
+);
+
+FACTAPI uint32_t FACTAudioEngine_AddRef(FACTAudioEngine *pEngine);
+
+FACTAPI uint32_t FACTAudioEngine_Release(FACTAudioEngine *pEngine);
+
+/* FIXME: QueryInterface? Or just ignore COM garbage... -flibit */
+
+FACTAPI uint32_t FACTAudioEngine_GetRendererCount(
+ FACTAudioEngine *pEngine,
+ uint16_t *pnRendererCount
+);
+
+FACTAPI uint32_t FACTAudioEngine_GetRendererDetails(
+ FACTAudioEngine *pEngine,
+ uint16_t nRendererIndex,
+ FACTRendererDetails *pRendererDetails
+);
+
+FACTAPI uint32_t FACTAudioEngine_GetFinalMixFormat(
+ FACTAudioEngine *pEngine,
+ FAudioWaveFormatExtensible *pFinalMixFormat
+);
+
+FACTAPI uint32_t FACTAudioEngine_Initialize(
+ FACTAudioEngine *pEngine,
+ const FACTRuntimeParameters *pParams
+);
+
+FACTAPI uint32_t FACTAudioEngine_ShutDown(FACTAudioEngine *pEngine);
+
+FACTAPI uint32_t FACTAudioEngine_DoWork(FACTAudioEngine *pEngine);
+
+FACTAPI uint32_t FACTAudioEngine_CreateSoundBank(
+ FACTAudioEngine *pEngine,
+ const void *pvBuffer,
+ uint32_t dwSize,
+ uint32_t dwFlags,
+ uint32_t dwAllocAttributes,
+ FACTSoundBank **ppSoundBank
+);
+
+FACTAPI uint32_t FACTAudioEngine_CreateInMemoryWaveBank(
+ FACTAudioEngine *pEngine,
+ const void *pvBuffer,
+ uint32_t dwSize,
+ uint32_t dwFlags,
+ uint32_t dwAllocAttributes,
+ FACTWaveBank **ppWaveBank
+);
+
+FACTAPI uint32_t FACTAudioEngine_CreateStreamingWaveBank(
+ FACTAudioEngine *pEngine,
+ const FACTStreamingParameters *pParms,
+ FACTWaveBank **ppWaveBank
+);
+
+FACTAPI uint32_t FACTAudioEngine_PrepareWave(
+ FACTAudioEngine *pEngine,
+ uint32_t dwFlags,
+ const char *szWavePath,
+ uint32_t wStreamingPacketSize,
+ uint32_t dwAlignment,
+ uint32_t dwPlayOffset,
+ uint8_t nLoopCount,
+ FACTWave **ppWave
+);
+
+FACTAPI uint32_t FACTAudioEngine_PrepareInMemoryWave(
+ FACTAudioEngine *pEngine,
+ uint32_t dwFlags,
+ FACTWaveBankEntry entry,
+ uint32_t *pdwSeekTable, /* Optional! */
+ uint8_t *pbWaveData,
+ uint32_t dwPlayOffset,
+ uint8_t nLoopCount,
+ FACTWave **ppWave
+);
+
+FACTAPI uint32_t FACTAudioEngine_PrepareStreamingWave(
+ FACTAudioEngine *pEngine,
+ uint32_t dwFlags,
+ FACTWaveBankEntry entry,
+ FACTStreamingParameters streamingParams,
+ uint32_t dwAlignment,
+ uint32_t *pdwSeekTable, /* Optional! */
+ uint8_t *pbWaveData, /* ABI bug, do not use! */
+ uint32_t dwPlayOffset,
+ uint8_t nLoopCount,
+ FACTWave **ppWave
+);
+
+FACTAPI uint32_t FACTAudioEngine_RegisterNotification(
+ FACTAudioEngine *pEngine,
+ const FACTNotificationDescription *pNotificationDescription
+);
+
+FACTAPI uint32_t FACTAudioEngine_UnRegisterNotification(
+ FACTAudioEngine *pEngine,
+ const FACTNotificationDescription *pNotificationDescription
+);
+
+FACTAPI uint16_t FACTAudioEngine_GetCategory(
+ FACTAudioEngine *pEngine,
+ const char *szFriendlyName
+);
+
+FACTAPI uint32_t FACTAudioEngine_Stop(
+ FACTAudioEngine *pEngine,
+ uint16_t nCategory,
+ uint32_t dwFlags
+);
+
+FACTAPI uint32_t FACTAudioEngine_SetVolume(
+ FACTAudioEngine *pEngine,
+ uint16_t nCategory,
+ float volume
+);
+
+FACTAPI uint32_t FACTAudioEngine_Pause(
+ FACTAudioEngine *pEngine,
+ uint16_t nCategory,
+ int32_t fPause
+);
+
+FACTAPI uint16_t FACTAudioEngine_GetGlobalVariableIndex(
+ FACTAudioEngine *pEngine,
+ const char *szFriendlyName
+);
+
+FACTAPI uint32_t FACTAudioEngine_SetGlobalVariable(
+ FACTAudioEngine *pEngine,
+ uint16_t nIndex,
+ float nValue
+);
+
+FACTAPI uint32_t FACTAudioEngine_GetGlobalVariable(
+ FACTAudioEngine *pEngine,
+ uint16_t nIndex,
+ float *pnValue
+);
+
+/* SoundBank Interface */
+
+FACTAPI uint16_t FACTSoundBank_GetCueIndex(
+ FACTSoundBank *pSoundBank,
+ const char *szFriendlyName
+);
+
+FACTAPI uint32_t FACTSoundBank_GetNumCues(
+ FACTSoundBank *pSoundBank,
+ uint16_t *pnNumCues
+);
+
+FACTAPI uint32_t FACTSoundBank_GetCueProperties(
+ FACTSoundBank *pSoundBank,
+ uint16_t nCueIndex,
+ FACTCueProperties *pProperties
+);
+
+FACTAPI uint32_t FACTSoundBank_Prepare(
+ FACTSoundBank *pSoundBank,
+ uint16_t nCueIndex,
+ uint32_t dwFlags,
+ int32_t timeOffset,
+ FACTCue** ppCue
+);
+
+FACTAPI uint32_t FACTSoundBank_Play(
+ FACTSoundBank *pSoundBank,
+ uint16_t nCueIndex,
+ uint32_t dwFlags,
+ int32_t timeOffset,
+ FACTCue** ppCue /* Optional! */
+);
+
+#ifndef F3DAUDIO_DSP_SETTINGS_DECL
+#define F3DAUDIO_DSP_SETTINGS_DECL
+typedef struct F3DAUDIO_DSP_SETTINGS F3DAUDIO_DSP_SETTINGS;
+#endif /* F3DAUDIO_DSP_SETTINGS_DECL */
+
+FACTAPI uint32_t FACTSoundBank_Play3D(
+ FACTSoundBank *pSoundBank,
+ uint16_t nCueIndex,
+ uint32_t dwFlags,
+ int32_t timeOffset,
+ F3DAUDIO_DSP_SETTINGS *pDSPSettings,
+ FACTCue** ppCue /* Optional! */
+);
+
+FACTAPI uint32_t FACTSoundBank_Stop(
+ FACTSoundBank *pSoundBank,
+ uint16_t nCueIndex,
+ uint32_t dwFlags
+);
+
+FACTAPI uint32_t FACTSoundBank_Destroy(FACTSoundBank *pSoundBank);
+
+FACTAPI uint32_t FACTSoundBank_GetState(
+ FACTSoundBank *pSoundBank,
+ uint32_t *pdwState
+);
+
+/* WaveBank Interface */
+
+FACTAPI uint32_t FACTWaveBank_Destroy(FACTWaveBank *pWaveBank);
+
+FACTAPI uint32_t FACTWaveBank_GetState(
+ FACTWaveBank *pWaveBank,
+ uint32_t *pdwState
+);
+
+FACTAPI uint32_t FACTWaveBank_GetNumWaves(
+ FACTWaveBank *pWaveBank,
+ uint16_t *pnNumWaves
+);
+
+FACTAPI uint16_t FACTWaveBank_GetWaveIndex(
+ FACTWaveBank *pWaveBank,
+ const char *szFriendlyName
+);
+
+FACTAPI uint32_t FACTWaveBank_GetWaveProperties(
+ FACTWaveBank *pWaveBank,
+ uint16_t nWaveIndex,
+ FACTWaveProperties *pWaveProperties
+);
+
+FACTAPI uint32_t FACTWaveBank_Prepare(
+ FACTWaveBank *pWaveBank,
+ uint16_t nWaveIndex,
+ uint32_t dwFlags,
+ uint32_t dwPlayOffset,
+ uint8_t nLoopCount,
+ FACTWave **ppWave
+);
+
+FACTAPI uint32_t FACTWaveBank_Play(
+ FACTWaveBank *pWaveBank,
+ uint16_t nWaveIndex,
+ uint32_t dwFlags,
+ uint32_t dwPlayOffset,
+ uint8_t nLoopCount,
+ FACTWave **ppWave
+);
+
+FACTAPI uint32_t FACTWaveBank_Stop(
+ FACTWaveBank *pWaveBank,
+ uint16_t nWaveIndex,
+ uint32_t dwFlags
+);
+
+/* Wave Interface */
+
+FACTAPI uint32_t FACTWave_Destroy(FACTWave *pWave);
+
+FACTAPI uint32_t FACTWave_Play(FACTWave *pWave);
+
+FACTAPI uint32_t FACTWave_Stop(FACTWave *pWave, uint32_t dwFlags);
+
+FACTAPI uint32_t FACTWave_Pause(FACTWave *pWave, int32_t fPause);
+
+FACTAPI uint32_t FACTWave_GetState(FACTWave *pWave, uint32_t *pdwState);
+
+FACTAPI uint32_t FACTWave_SetPitch(FACTWave *pWave, int16_t pitch);
+
+FACTAPI uint32_t FACTWave_SetVolume(FACTWave *pWave, float volume);
+
+FACTAPI uint32_t FACTWave_SetMatrixCoefficients(
+ FACTWave *pWave,
+ uint32_t uSrcChannelCount,
+ uint32_t uDstChannelCount,
+ float *pMatrixCoefficients
+);
+
+FACTAPI uint32_t FACTWave_GetProperties(
+ FACTWave *pWave,
+ FACTWaveInstanceProperties *pProperties
+);
+
+/* Cue Interface */
+
+FACTAPI uint32_t FACTCue_Destroy(FACTCue *pCue);
+
+FACTAPI uint32_t FACTCue_Play(FACTCue *pCue);
+
+FACTAPI uint32_t FACTCue_Stop(FACTCue *pCue, uint32_t dwFlags);
+
+FACTAPI uint32_t FACTCue_GetState(FACTCue *pCue, uint32_t *pdwState);
+
+FACTAPI uint32_t FACTCue_SetMatrixCoefficients(
+ FACTCue *pCue,
+ uint32_t uSrcChannelCount,
+ uint32_t uDstChannelCount,
+ float *pMatrixCoefficients
+);
+
+FACTAPI uint16_t FACTCue_GetVariableIndex(
+ FACTCue *pCue,
+ const char *szFriendlyName
+);
+
+FACTAPI uint32_t FACTCue_SetVariable(
+ FACTCue *pCue,
+ uint16_t nIndex,
+ float nValue
+);
+
+FACTAPI uint32_t FACTCue_GetVariable(
+ FACTCue *pCue,
+ uint16_t nIndex,
+ float *nValue
+);
+
+FACTAPI uint32_t FACTCue_Pause(FACTCue *pCue, int32_t fPause);
+
+FACTAPI uint32_t FACTCue_GetProperties(
+ FACTCue *pCue,
+ FACTCueInstanceProperties **ppProperties
+);
+
+FACTAPI uint32_t FACTCue_SetOutputVoices(
+ FACTCue *pCue,
+ const FAudioVoiceSends *pSendList /* Optional! */
+);
+
+FACTAPI uint32_t FACTCue_SetOutputVoiceMatrix(
+ FACTCue *pCue,
+ const FAudioVoice *pDestinationVoice, /* Optional! */
+ uint32_t SourceChannels,
+ uint32_t DestinationChannels,
+ const float *pLevelMatrix /* SourceChannels * DestinationChannels */
+);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* FACT_H */
+
+/* vim: set noexpandtab shiftwidth=8 tabstop=8: */
diff --git a/dlls/xaudio2_7/FAudio/FACT3D.h b/dlls/xaudio2_7/FAudio/FACT3D.h
new file mode 100644
index 00000000000..6ac02a82986
--- /dev/null
+++ b/dlls/xaudio2_7/FAudio/FACT3D.h
@@ -0,0 +1,127 @@
+/* FAudio - XAudio Reimplementation for FNA
+ *
+ * Copyright (c) 2011-2021 Ethan Lee, Luigi Auriemma, and the MonoGame Team
+ *
+ * This software is provided 'as-is', without any express or implied warranty.
+ * In no event will the authors be held liable for any damages arising from
+ * the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ * claim that you wrote the original software. If you use this software in a
+ * product, an acknowledgment in the product documentation would be
+ * appreciated but is not required.
+ *
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ * misrepresented as being the original software.
+ *
+ * 3. This notice may not be removed or altered from any source distribution.
+ *
+ * Ethan "flibitijibibo" Lee <flibitijibibo at flibitijibibo.com>
+ *
+ */
+
+/* This file has no documentation since you are expected to already know how
+ * XACT works if you are still using these APIs!
+ */
+
+#ifndef FACT3D_H
+#define FACT3D_H
+
+#include "F3DAudio.h"
+#include "FACT.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/* Constants */
+
+#define LEFT_AZIMUTH (3.0f * F3DAUDIO_PI / 2.0f)
+#define RIGHT_AZIMUTH (F3DAUDIO_PI / 2.0f)
+#define FRONT_LEFT_AZIMUTH (7.0f * F3DAUDIO_PI / 4.0f)
+#define FRONT_RIGHT_AZIMUTH (F3DAUDIO_PI / 4.0f)
+#define FRONT_CENTER_AZIMUTH 0.0f
+#define LOW_FREQUENCY_AZIMUTH F3DAUDIO_2PI
+#define BACK_LEFT_AZIMUTH (5.0f * F3DAUDIO_PI / 4.0f)
+#define BACK_RIGHT_AZIMUTH (3.0f * F3DAUDIO_PI / 4.0f)
+#define BACK_CENTER_AZIMUTH F3DAUDIO_PI
+#define FRONT_LEFT_OF_CENTER_AZIMUTH (15.0f * F3DAUDIO_PI / 8.0f)
+#define FRONT_RIGHT_OF_CENTER_AZIMUTH (F3DAUDIO_PI / 8.0f)
+
+static const float aStereoLayout[] =
+{
+ LEFT_AZIMUTH,
+ RIGHT_AZIMUTH
+};
+static const float a2Point1Layout[] =
+{
+ LEFT_AZIMUTH,
+ RIGHT_AZIMUTH,
+ LOW_FREQUENCY_AZIMUTH
+};
+static const float aQuadLayout[] =
+{
+ FRONT_LEFT_AZIMUTH,
+ FRONT_RIGHT_AZIMUTH,
+ BACK_LEFT_AZIMUTH,
+ BACK_RIGHT_AZIMUTH
+};
+static const float a4Point1Layout[] =
+{
+ FRONT_LEFT_AZIMUTH,
+ FRONT_RIGHT_AZIMUTH,
+ LOW_FREQUENCY_AZIMUTH,
+ BACK_LEFT_AZIMUTH,
+ BACK_RIGHT_AZIMUTH
+};
+static const float a5Point1Layout[] =
+{
+ FRONT_LEFT_AZIMUTH,
+ FRONT_RIGHT_AZIMUTH,
+ FRONT_CENTER_AZIMUTH,
+ LOW_FREQUENCY_AZIMUTH,
+ BACK_LEFT_AZIMUTH,
+ BACK_RIGHT_AZIMUTH
+};
+static const float a7Point1Layout[] =
+{
+ FRONT_LEFT_AZIMUTH,
+ FRONT_RIGHT_AZIMUTH,
+ FRONT_CENTER_AZIMUTH,
+ LOW_FREQUENCY_AZIMUTH,
+ BACK_LEFT_AZIMUTH,
+ BACK_RIGHT_AZIMUTH,
+ LEFT_AZIMUTH,
+ RIGHT_AZIMUTH
+};
+
+/* Functions */
+
+FACTAPI uint32_t FACT3DInitialize(
+ FACTAudioEngine *pEngine,
+ F3DAUDIO_HANDLE F3DInstance
+);
+
+FACTAPI uint32_t FACT3DCalculate(
+ F3DAUDIO_HANDLE F3DInstance,
+ const F3DAUDIO_LISTENER *pListener,
+ F3DAUDIO_EMITTER *pEmitter,
+ F3DAUDIO_DSP_SETTINGS *pDSPSettings
+);
+
+FACTAPI uint32_t FACT3DApply(
+ F3DAUDIO_DSP_SETTINGS *pDSPSettings,
+ FACTCue *pCue
+);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* FACT3D_H */
+
+/* vim: set noexpandtab shiftwidth=8 tabstop=8: */
diff --git a/dlls/xaudio2_7/FAudio/FAPO.h b/dlls/xaudio2_7/FAudio/FAPO.h
new file mode 100644
index 00000000000..0609770047f
--- /dev/null
+++ b/dlls/xaudio2_7/FAudio/FAPO.h
@@ -0,0 +1,207 @@
+/* FAudio - XAudio Reimplementation for FNA
+ *
+ * Copyright (c) 2011-2021 Ethan Lee, Luigi Auriemma, and the MonoGame Team
+ *
+ * This software is provided 'as-is', without any express or implied warranty.
+ * In no event will the authors be held liable for any damages arising from
+ * the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ * claim that you wrote the original software. If you use this software in a
+ * product, an acknowledgment in the product documentation would be
+ * appreciated but is not required.
+ *
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ * misrepresented as being the original software.
+ *
+ * 3. This notice may not be removed or altered from any source distribution.
+ *
+ * Ethan "flibitijibibo" Lee <flibitijibibo at flibitijibibo.com>
+ *
+ */
+
+/* This file has no documentation since the MSDN docs are still perfectly fine:
+ * https://docs.microsoft.com/en-us/windows/desktop/api/xapo/
+ *
+ * Of course, the APIs aren't exactly the same since XAPO is super dependent on
+ * C++. Instead, we use a struct full of functions to mimic a vtable.
+ *
+ * The only serious difference is that our FAPO (yes, really) always has the
+ * Get/SetParameters function pointers, for simplicity. You can ignore these if
+ * your effect does not have parameters, as they will never get called unless
+ * it is explicitly requested by the application.
+ */
+
+#ifndef FAPO_H
+#define FAPO_H
+
+#include "FAudio.h"
+
+#define FAPOAPI FAUDIOAPI
+#define FAPOCALL FAUDIOCALL
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/* Enumerations */
+
+typedef enum FAPOBufferFlags
+{
+ FAPO_BUFFER_SILENT,
+ FAPO_BUFFER_VALID
+} FAPOBufferFlags;
+
+/* Structures */
+
+#pragma pack(push, 1)
+
+typedef struct FAPORegistrationProperties
+{
+ FAudioGUID clsid;
+ int16_t FriendlyName[256]; /* Win32 wchar_t */
+ int16_t CopyrightInfo[256]; /* Win32 wchar_t */
+ uint32_t MajorVersion;
+ uint32_t MinorVersion;
+ uint32_t Flags;
+ uint32_t MinInputBufferCount;
+ uint32_t MaxInputBufferCount;
+ uint32_t MinOutputBufferCount;
+ uint32_t MaxOutputBufferCount;
+} FAPORegistrationProperties;
+
+typedef struct FAPOLockForProcessBufferParameters
+{
+ const FAudioWaveFormatEx *pFormat;
+ uint32_t MaxFrameCount;
+} FAPOLockForProcessBufferParameters;
+
+typedef struct FAPOProcessBufferParameters
+{
+ void* pBuffer;
+ FAPOBufferFlags BufferFlags;
+ uint32_t ValidFrameCount;
+} FAPOProcessBufferParameters;
+
+#pragma pack(pop)
+
+/* Constants */
+
+#define FAPO_MIN_CHANNELS 1
+#define FAPO_MAX_CHANNELS 64
+
+#define FAPO_MIN_FRAMERATE 1000
+#define FAPO_MAX_FRAMERATE 200000
+
+#define FAPO_REGISTRATION_STRING_LENGTH 256
+
+#define FAPO_FLAG_CHANNELS_MUST_MATCH 0x00000001
+#define FAPO_FLAG_FRAMERATE_MUST_MATCH 0x00000002
+#define FAPO_FLAG_BITSPERSAMPLE_MUST_MATCH 0x00000004
+#define FAPO_FLAG_BUFFERCOUNT_MUST_MATCH 0x00000008
+#define FAPO_FLAG_INPLACE_REQUIRED 0x00000020
+#define FAPO_FLAG_INPLACE_SUPPORTED 0x00000010
+
+/* FAPO Interface */
+
+#ifndef FAPO_DECL
+#define FAPO_DECL
+typedef struct FAPO FAPO;
+#endif /* FAPO_DECL */
+
+typedef int32_t (FAPOCALL * AddRefFunc)(
+ void *fapo
+);
+typedef int32_t (FAPOCALL * ReleaseFunc)(
+ void *fapo
+);
+typedef uint32_t (FAPOCALL * GetRegistrationPropertiesFunc)(
+ void* fapo,
+ FAPORegistrationProperties **ppRegistrationProperties
+);
+typedef uint32_t (FAPOCALL * IsInputFormatSupportedFunc)(
+ void* fapo,
+ const FAudioWaveFormatEx *pOutputFormat,
+ const FAudioWaveFormatEx *pRequestedInputFormat,
+ FAudioWaveFormatEx **ppSupportedInputFormat
+);
+typedef uint32_t (FAPOCALL * IsOutputFormatSupportedFunc)(
+ void* fapo,
+ const FAudioWaveFormatEx *pInputFormat,
+ const FAudioWaveFormatEx *pRequestedOutputFormat,
+ FAudioWaveFormatEx **ppSupportedOutputFormat
+);
+typedef uint32_t (FAPOCALL * InitializeFunc)(
+ void* fapo,
+ const void* pData,
+ uint32_t DataByteSize
+);
+typedef void (FAPOCALL * ResetFunc)(
+ void* fapo
+);
+typedef uint32_t (FAPOCALL * LockForProcessFunc)(
+ void* fapo,
+ uint32_t InputLockedParameterCount,
+ const FAPOLockForProcessBufferParameters *pInputLockedParameters,
+ uint32_t OutputLockedParameterCount,
+ const FAPOLockForProcessBufferParameters *pOutputLockedParameters
+);
+typedef void (FAPOCALL * UnlockForProcessFunc)(
+ void* fapo
+);
+typedef void (FAPOCALL * ProcessFunc)(
+ void* fapo,
+ uint32_t InputProcessParameterCount,
+ const FAPOProcessBufferParameters* pInputProcessParameters,
+ uint32_t OutputProcessParameterCount,
+ FAPOProcessBufferParameters* pOutputProcessParameters,
+ int32_t IsEnabled
+);
+typedef uint32_t (FAPOCALL * CalcInputFramesFunc)(
+ void* fapo,
+ uint32_t OutputFrameCount
+);
+typedef uint32_t (FAPOCALL * CalcOutputFramesFunc)(
+ void* fapo,
+ uint32_t InputFrameCount
+);
+typedef void (FAPOCALL * SetParametersFunc)(
+ void* fapo,
+ const void* pParameters,
+ uint32_t ParameterByteSize
+);
+typedef void (FAPOCALL * GetParametersFunc)(
+ void* fapo,
+ void* pParameters,
+ uint32_t ParameterByteSize
+);
+
+struct FAPO
+{
+ AddRefFunc AddRef;
+ ReleaseFunc Release;
+ GetRegistrationPropertiesFunc GetRegistrationProperties;
+ IsInputFormatSupportedFunc IsInputFormatSupported;
+ IsOutputFormatSupportedFunc IsOutputFormatSupported;
+ InitializeFunc Initialize;
+ ResetFunc Reset;
+ LockForProcessFunc LockForProcess;
+ UnlockForProcessFunc UnlockForProcess;
+ ProcessFunc Process;
+ CalcInputFramesFunc CalcInputFrames;
+ CalcOutputFramesFunc CalcOutputFrames;
+ SetParametersFunc SetParameters;
+ GetParametersFunc GetParameters;
+};
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* FAPO_H */
+
+/* vim: set noexpandtab shiftwidth=8 tabstop=8: */
diff --git a/dlls/xaudio2_7/FAudio/FAPOBase.h b/dlls/xaudio2_7/FAudio/FAPOBase.h
new file mode 100644
index 00000000000..c2fcdd2981c
--- /dev/null
+++ b/dlls/xaudio2_7/FAudio/FAPOBase.h
@@ -0,0 +1,264 @@
+/* FAudio - XAudio Reimplementation for FNA
+ *
+ * Copyright (c) 2011-2021 Ethan Lee, Luigi Auriemma, and the MonoGame Team
+ *
+ * This software is provided 'as-is', without any express or implied warranty.
+ * In no event will the authors be held liable for any damages arising from
+ * the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ * claim that you wrote the original software. If you use this software in a
+ * product, an acknowledgment in the product documentation would be
+ * appreciated but is not required.
+ *
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ * misrepresented as being the original software.
+ *
+ * 3. This notice may not be removed or altered from any source distribution.
+ *
+ * Ethan "flibitijibibo" Lee <flibitijibibo at flibitijibibo.com>
+ *
+ */
+
+/* This file has no documentation since the MSDN docs are still perfectly fine:
+ * https://docs.microsoft.com/en-us/windows/desktop/api/xapobase/
+ *
+ * Of course, the APIs aren't exactly the same since XAPO is super dependent on
+ * C++. Instead, we use a struct full of functions to mimic a vtable.
+ *
+ * To mimic the CXAPOParametersBase experience, initialize the object like this:
+ *
+ * extern FAPORegistrationProperties MyFAPOProperties;
+ * extern int32_t producer;
+ * typedef struct MyFAPOParams
+ * {
+ * uint32_t something;
+ * } MyFAPOParams;
+ * typedef struct MyFAPO
+ * {
+ * FAPOBase base;
+ * uint32_t somethingElse;
+ * } MyFAPO;
+ * void MyFAPO_Free(void* fapo)
+ * {
+ * MyFAPO *mine = (MyFAPO*) fapo;
+ * mine->base.pFree(mine->base.m_pParameterBlocks);
+ * mine->base.pFree(fapo);
+ * }
+ *
+ * MyFAPO *result = (MyFAPO*) SDL_malloc(sizeof(MyFAPO));
+ * uint8_t *params = (uint8_t*) SDL_malloc(sizeof(MyFAPOParams) * 3);
+ * CreateFAPOBase(
+ * &result->base,
+ * &MyFAPOProperties,
+ * params,
+ * sizeof(MyFAPOParams),
+ * producer
+ * );
+ * result->base.base.Initialize = (InitializeFunc) MyFAPO_Initialize;
+ * result->base.base.Process = (ProcessFunc) MyFAPO_Process;
+ * result->base.Destructor = MyFAPO_Free;
+ */
+
+#ifndef FAPOBASE_H
+#define FAPOBASE_H
+
+#include "FAPO.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/* Constants */
+
+#define FAPOBASE_DEFAULT_FORMAT_TAG FAUDIO_FORMAT_IEEE_FLOAT
+#define FAPOBASE_DEFAULT_FORMAT_MIN_CHANNELS FAPO_MIN_CHANNELS
+#define FAPOBASE_DEFAULT_FORMAT_MAX_CHANNELS FAPO_MAX_CHANNELS
+#define FAPOBASE_DEFAULT_FORMAT_MIN_FRAMERATE FAPO_MIN_FRAMERATE
+#define FAPOBASE_DEFAULT_FORMAT_MAX_FRAMERATE FAPO_MAX_FRAMERATE
+#define FAPOBASE_DEFAULT_FORMAT_BITSPERSAMPLE 32
+
+#define FAPOBASE_DEFAULT_FLAG ( \
+ FAPO_FLAG_CHANNELS_MUST_MATCH | \
+ FAPO_FLAG_FRAMERATE_MUST_MATCH | \
+ FAPO_FLAG_BITSPERSAMPLE_MUST_MATCH | \
+ FAPO_FLAG_BUFFERCOUNT_MUST_MATCH | \
+ FAPO_FLAG_INPLACE_SUPPORTED \
+)
+
+#define FAPOBASE_DEFAULT_BUFFER_COUNT 1
+
+/* FAPOBase Interface */
+
+typedef struct FAPOBase FAPOBase;
+
+typedef void (FAPOCALL * OnSetParametersFunc)(
+ FAPOBase *fapo,
+ const void* parameters,
+ uint32_t parametersSize
+);
+
+#pragma pack(push, 8)
+struct FAPOBase
+{
+ /* Base Classes/Interfaces */
+ FAPO base;
+ void (FAPOCALL *Destructor)(void*);
+
+ /* Public Virtual Functions */
+ OnSetParametersFunc OnSetParameters;
+
+ /* Private Variables */
+ const FAPORegistrationProperties *m_pRegistrationProperties;
+ void* m_pfnMatrixMixFunction;
+ float *m_pfl32MatrixCoefficients;
+ uint32_t m_nSrcFormatType;
+ uint8_t m_fIsScalarMatrix;
+ uint8_t m_fIsLocked;
+ uint8_t *m_pParameterBlocks;
+ uint8_t *m_pCurrentParameters;
+ uint8_t *m_pCurrentParametersInternal;
+ uint32_t m_uCurrentParametersIndex;
+ uint32_t m_uParameterBlockByteSize;
+ uint8_t m_fNewerResultsReady;
+ uint8_t m_fProducer;
+
+ /* Protected Variables */
+ int32_t m_lReferenceCount; /* LONG */
+
+ /* Allocator callbacks, NOT part of XAPOBase spec! */
+ FAudioMallocFunc pMalloc;
+ FAudioFreeFunc pFree;
+ FAudioReallocFunc pRealloc;
+};
+#pragma pack(pop)
+
+FAPOAPI void CreateFAPOBase(
+ FAPOBase *fapo,
+ const FAPORegistrationProperties *pRegistrationProperties,
+ uint8_t *pParameterBlocks,
+ uint32_t uParameterBlockByteSize,
+ uint8_t fProducer
+);
+
+/* See "extensions/CustomAllocatorEXT.txt" for more information. */
+FAPOAPI void CreateFAPOBaseWithCustomAllocatorEXT(
+ FAPOBase *fapo,
+ const FAPORegistrationProperties *pRegistrationProperties,
+ uint8_t *pParameterBlocks,
+ uint32_t uParameterBlockByteSize,
+ uint8_t fProducer,
+ FAudioMallocFunc customMalloc,
+ FAudioFreeFunc customFree,
+ FAudioReallocFunc customRealloc
+);
+
+FAPOAPI int32_t FAPOBase_AddRef(FAPOBase *fapo);
+
+FAPOAPI int32_t FAPOBase_Release(FAPOBase *fapo);
+
+FAPOAPI uint32_t FAPOBase_GetRegistrationProperties(
+ FAPOBase *fapo,
+ FAPORegistrationProperties **ppRegistrationProperties
+);
+
+FAPOAPI uint32_t FAPOBase_IsInputFormatSupported(
+ FAPOBase *fapo,
+ const FAudioWaveFormatEx *pOutputFormat,
+ const FAudioWaveFormatEx *pRequestedInputFormat,
+ FAudioWaveFormatEx **ppSupportedInputFormat
+);
+
+FAPOAPI uint32_t FAPOBase_IsOutputFormatSupported(
+ FAPOBase *fapo,
+ const FAudioWaveFormatEx *pInputFormat,
+ const FAudioWaveFormatEx *pRequestedOutputFormat,
+ FAudioWaveFormatEx **ppSupportedOutputFormat
+);
+
+FAPOAPI uint32_t FAPOBase_Initialize(
+ FAPOBase *fapo,
+ const void* pData,
+ uint32_t DataByteSize
+);
+
+FAPOAPI void FAPOBase_Reset(FAPOBase *fapo);
+
+FAPOAPI uint32_t FAPOBase_LockForProcess(
+ FAPOBase *fapo,
+ uint32_t InputLockedParameterCount,
+ const FAPOLockForProcessBufferParameters *pInputLockedParameters,
+ uint32_t OutputLockedParameterCount,
+ const FAPOLockForProcessBufferParameters *pOutputLockedParameters
+);
+
+FAPOAPI void FAPOBase_UnlockForProcess(FAPOBase *fapo);
+
+FAPOAPI uint32_t FAPOBase_CalcInputFrames(
+ FAPOBase *fapo,
+ uint32_t OutputFrameCount
+);
+
+FAPOAPI uint32_t FAPOBase_CalcOutputFrames(
+ FAPOBase *fapo,
+ uint32_t InputFrameCount
+);
+
+FAPOAPI uint32_t FAPOBase_ValidateFormatDefault(
+ FAPOBase *fapo,
+ FAudioWaveFormatEx *pFormat,
+ uint8_t fOverwrite
+);
+
+FAPOAPI uint32_t FAPOBase_ValidateFormatPair(
+ FAPOBase *fapo,
+ const FAudioWaveFormatEx *pSupportedFormat,
+ FAudioWaveFormatEx *pRequestedFormat,
+ uint8_t fOverwrite
+);
+
+FAPOAPI void FAPOBase_ProcessThru(
+ FAPOBase *fapo,
+ void* pInputBuffer,
+ float *pOutputBuffer,
+ uint32_t FrameCount,
+ uint16_t InputChannelCount,
+ uint16_t OutputChannelCount,
+ uint8_t MixWithOutput
+);
+
+FAPOAPI void FAPOBase_SetParameters(
+ FAPOBase *fapo,
+ const void* pParameters,
+ uint32_t ParameterByteSize
+);
+
+FAPOAPI void FAPOBase_GetParameters(
+ FAPOBase *fapo,
+ void* pParameters,
+ uint32_t ParameterByteSize
+);
+
+FAPOAPI void FAPOBase_OnSetParameters(
+ FAPOBase *fapo,
+ const void* parameters,
+ uint32_t parametersSize
+);
+
+FAPOAPI uint8_t FAPOBase_ParametersChanged(FAPOBase *fapo);
+
+FAPOAPI uint8_t* FAPOBase_BeginProcess(FAPOBase *fapo);
+
+FAPOAPI void FAPOBase_EndProcess(FAPOBase *fapo);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* FAPOBASE_H */
+
+/* vim: set noexpandtab shiftwidth=8 tabstop=8: */
diff --git a/dlls/xaudio2_7/FAudio/FAPOFX.h b/dlls/xaudio2_7/FAudio/FAPOFX.h
new file mode 100644
index 00000000000..5aae441b2cc
--- /dev/null
+++ b/dlls/xaudio2_7/FAudio/FAPOFX.h
@@ -0,0 +1,178 @@
+/* FAudio - XAudio Reimplementation for FNA
+ *
+ * Copyright (c) 2011-2021 Ethan Lee, Luigi Auriemma, and the MonoGame Team
+ *
+ * This software is provided 'as-is', without any express or implied warranty.
+ * In no event will the authors be held liable for any damages arising from
+ * the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ * claim that you wrote the original software. If you use this software in a
+ * product, an acknowledgment in the product documentation would be
+ * appreciated but is not required.
+ *
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ * misrepresented as being the original software.
+ *
+ * 3. This notice may not be removed or altered from any source distribution.
+ *
+ * Ethan "flibitijibibo" Lee <flibitijibibo at flibitijibibo.com>
+ *
+ */
+
+#ifndef FAPOFX_H
+#define FAPOFX_H
+
+#include "FAPO.h"
+
+#define FAPOFXAPI FAUDIOAPI
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/* GUIDs */
+
+/* "Legacy" GUIDs are from XAPOFX <= 1.5. They were removed in XAudio 2.8 and later. */
+extern const FAudioGUID FAPOFX_CLSID_FXEQ, FAPOFX_CLSID_FXEQ_LEGACY;
+extern const FAudioGUID FAPOFX_CLSID_FXMasteringLimiter, FAPOFX_CLSID_FXMasteringLimiter_LEGACY;
+extern const FAudioGUID FAPOFX_CLSID_FXReverb, FAPOFX_CLSID_FXReverb_LEGACY;
+extern const FAudioGUID FAPOFX_CLSID_FXEcho, FAPOFX_CLSID_FXEcho_LEGACY;
+
+/* Structures */
+
+#pragma pack(push, 1)
+
+/* See FAPOFXEQ_* constants below.
+ * FrequencyCenter is in Hz, Gain is amplitude ratio, Bandwidth is Q factor.
+ */
+typedef struct FAPOFXEQParameters
+{
+ float FrequencyCenter0;
+ float Gain0;
+ float Bandwidth0;
+ float FrequencyCenter1;
+ float Gain1;
+ float Bandwidth1;
+ float FrequencyCenter2;
+ float Gain2;
+ float Bandwidth2;
+ float FrequencyCenter3;
+ float Gain3;
+ float Bandwidth3;
+} FAPOFXEQParameters;
+
+/* See FAPOFXMASTERINGLIMITER_* constants below. */
+typedef struct FAPOFXMasteringLimiterParameters
+{
+ uint32_t Release; /* In milliseconds */
+ uint32_t Loudness; /* In... uh, MSDN doesn't actually say what. */
+} FAPOFXMasteringLimiterParameters;
+
+/* See FAPOFXREVERB_* constants below.
+ * Both parameters are arbitrary and should be treated subjectively.
+ */
+typedef struct FAPOFXReverbParameters
+{
+ float Diffusion;
+ float RoomSize;
+} FAPOFXReverbParameters;
+
+/* See FAPOFXECHO_* constants below. */
+typedef struct FAPOFXEchoParameters
+{
+ float WetDryMix; /* Percentage of processed signal vs original */
+ float Feedback; /* Percentage to feed back into input */
+ float Delay; /* In milliseconds */
+} FAPOFXEchoParameters;
+
+#pragma pack(pop)
+
+/* Constants */
+
+#define FAPOFXEQ_MIN_FRAMERATE 22000
+#define FAPOFXEQ_MAX_FRAMERATE 48000
+
+#define FAPOFXEQ_MIN_FREQUENCY_CENTER 20.0f
+#define FAPOFXEQ_MAX_FREQUENCY_CENTER 20000.0f
+#define FAPOFXEQ_DEFAULT_FREQUENCY_CENTER_0 100.0f
+#define FAPOFXEQ_DEFAULT_FREQUENCY_CENTER_1 800.0f
+#define FAPOFXEQ_DEFAULT_FREQUENCY_CENTER_2 2000.0f
+#define FAPOFXEQ_DEFAULT_FREQUENCY_CENTER_3 10000.0f
+
+#define FAPOFXEQ_MIN_GAIN 0.126f
+#define FAPOFXEQ_MAX_GAIN 7.94f
+#define FAPOFXEQ_DEFAULT_GAIN 1.0f
+
+#define FAPOFXEQ_MIN_BANDWIDTH 0.1f
+#define FAPOFXEQ_MAX_BANDWIDTH 2.0f
+#define FAPOFXEQ_DEFAULT_BANDWIDTH 1.0f
+
+#define FAPOFXMASTERINGLIMITER_MIN_RELEASE 1
+#define FAPOFXMASTERINGLIMITER_MAX_RELEASE 20
+#define FAPOFXMASTERINGLIMITER_DEFAULT_RELEASE 6
+
+#define FAPOFXMASTERINGLIMITER_MIN_LOUDNESS 1
+#define FAPOFXMASTERINGLIMITER_MAX_LOUDNESS 1800
+#define FAPOFXMASTERINGLIMITER_DEFAULT_LOUDNESS 1000
+
+#define FAPOFXREVERB_MIN_DIFFUSION 0.0f
+#define FAPOFXREVERB_MAX_DIFFUSION 1.0f
+#define FAPOFXREVERB_DEFAULT_DIFFUSION 0.9f
+
+#define FAPOFXREVERB_MIN_ROOMSIZE 0.0001f
+#define FAPOFXREVERB_MAX_ROOMSIZE 1.0f
+#define FAPOFXREVERB_DEFAULT_ROOMSIZE 0.6f
+
+#define FAPOFXECHO_MIN_WETDRYMIX 0.0f
+#define FAPOFXECHO_MAX_WETDRYMIX 1.0f
+#define FAPOFXECHO_DEFAULT_WETDRYMIX 0.5f
+
+#define FAPOFXECHO_MIN_FEEDBACK 0.0f
+#define FAPOFXECHO_MAX_FEEDBACK 1.0f
+#define FAPOFXECHO_DEFAULT_FEEDBACK 0.5f
+
+#define FAPOFXECHO_MIN_DELAY 1.0f
+#define FAPOFXECHO_MAX_DELAY 2000.0f
+#define FAPOFXECHO_DEFAULT_DELAY 500.0f
+
+/* Functions */
+
+/* Creates an effect from the pre-made FAPOFX effect library.
+ *
+ * clsid: A reference to one of the FAPOFX_CLSID_* GUIDs
+ * pEffect: Filled with the resulting FAPO object
+ * pInitData: Starting parameters, pass NULL to use the default values
+ * InitDataByteSize: Parameter struct size, pass 0 if pInitData is NULL
+ *
+ * Returns 0 on success.
+ */
+FAPOFXAPI uint32_t FAPOFX_CreateFX(
+ const FAudioGUID *clsid,
+ FAPO **pEffect,
+ const void *pInitData,
+ uint32_t InitDataByteSize
+);
+
+/* See "extensions/CustomAllocatorEXT.txt" for more details. */
+FAPOFXAPI uint32_t FAPOFX_CreateFXWithCustomAllocatorEXT(
+ const FAudioGUID *clsid,
+ FAPO **pEffect,
+ const void *pInitData,
+ uint32_t InitDataByteSize,
+ FAudioMallocFunc customMalloc,
+ FAudioFreeFunc customFree,
+ FAudioReallocFunc customRealloc
+);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* FAPOFX_H */
+
+/* vim: set noexpandtab shiftwidth=8 tabstop=8: */
diff --git a/dlls/xaudio2_7/FAudio/FAudio.h b/dlls/xaudio2_7/FAudio/FAudio.h
new file mode 100644
index 00000000000..96f07d892f2
--- /dev/null
+++ b/dlls/xaudio2_7/FAudio/FAudio.h
@@ -0,0 +1,1322 @@
+/* FAudio - XAudio Reimplementation for FNA
+ *
+ * Copyright (c) 2011-2021 Ethan Lee, Luigi Auriemma, and the MonoGame Team
+ *
+ * This software is provided 'as-is', without any express or implied warranty.
+ * In no event will the authors be held liable for any damages arising from
+ * the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ * claim that you wrote the original software. If you use this software in a
+ * product, an acknowledgment in the product documentation would be
+ * appreciated but is not required.
+ *
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ * misrepresented as being the original software.
+ *
+ * 3. This notice may not be removed or altered from any source distribution.
+ *
+ * Ethan "flibitijibibo" Lee <flibitijibibo at flibitijibibo.com>
+ *
+ */
+
+#ifndef FAUDIO_H
+#define FAUDIO_H
+
+#ifdef _WIN32
+#define FAUDIOAPI __declspec(dllexport)
+#define FAUDIOCALL __cdecl
+#else
+#define FAUDIOAPI
+#define FAUDIOCALL
+#endif
+
+#ifdef _MSC_VER
+#define FAUDIODEPRECATED(msg) __declspec(deprecated(msg))
+#else
+#define FAUDIODEPRECATED(msg) __attribute__((deprecated(msg)))
+#endif
+
+/* -Wpedantic nameless union/struct silencing */
+#ifndef FAUDIONAMELESS
+#ifdef __GNUC__
+#define FAUDIONAMELESS __extension__
+#else
+#define FAUDIONAMELESS
+#endif /* __GNUC__ */
+#endif /* FAUDIONAMELESS */
+
+#include <stdint.h>
+#include <stddef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/* Type Declarations */
+
+typedef struct FAudio FAudio;
+typedef struct FAudioVoice FAudioVoice;
+typedef FAudioVoice FAudioSourceVoice;
+typedef FAudioVoice FAudioSubmixVoice;
+typedef FAudioVoice FAudioMasteringVoice;
+typedef struct FAudioEngineCallback FAudioEngineCallback;
+typedef struct FAudioVoiceCallback FAudioVoiceCallback;
+
+/* Enumerations */
+
+typedef enum FAudioDeviceRole
+{
+ FAudioNotDefaultDevice = 0x0,
+ FAudioDefaultConsoleDevice = 0x1,
+ FAudioDefaultMultimediaDevice = 0x2,
+ FAudioDefaultCommunicationsDevice = 0x4,
+ FAudioDefaultGameDevice = 0x8,
+ FAudioGlobalDefaultDevice = 0xF,
+ FAudioInvalidDeviceRole = ~FAudioGlobalDefaultDevice
+} FAudioDeviceRole;
+
+typedef enum FAudioFilterType
+{
+ FAudioLowPassFilter,
+ FAudioBandPassFilter,
+ FAudioHighPassFilter,
+ FAudioNotchFilter
+} FAudioFilterType;
+
+typedef enum FAudioStreamCategory
+{
+ FAudioStreamCategory_Other,
+ FAudioStreamCategory_ForegroundOnlyMedia,
+ FAudioStreamCategory_BackgroundCapableMedia,
+ FAudioStreamCategory_Communications,
+ FAudioStreamCategory_Alerts,
+ FAudioStreamCategory_SoundEffects,
+ FAudioStreamCategory_GameEffects,
+ FAudioStreamCategory_GameMedia,
+ FAudioStreamCategory_GameChat,
+ FAudioStreamCategory_Speech,
+ FAudioStreamCategory_Movie,
+ FAudioStreamCategory_Media
+} FAudioStreamCategory;
+
+/* FIXME: The original enum violates ISO C and is platform specific anyway... */
+typedef uint32_t FAudioProcessor;
+#define FAUDIO_DEFAULT_PROCESSOR 0xFFFFFFFF
+
+/* Structures */
+
+#pragma pack(push, 1)
+
+typedef struct FAudioGUID
+{
+ uint32_t Data1;
+ uint16_t Data2;
+ uint16_t Data3;
+ uint8_t Data4[8];
+} FAudioGUID;
+
+/* See MSDN:
+ * https://msdn.microsoft.com/en-us/library/windows/desktop/dd390970%28v=vs.85%29.aspx
+ */
+typedef struct FAudioWaveFormatEx
+{
+ uint16_t wFormatTag;
+ uint16_t nChannels;
+ uint32_t nSamplesPerSec;
+ uint32_t nAvgBytesPerSec;
+ uint16_t nBlockAlign;
+ uint16_t wBitsPerSample;
+ uint16_t cbSize;
+} FAudioWaveFormatEx;
+
+/* See MSDN:
+ * https://msdn.microsoft.com/en-us/library/windows/desktop/dd390971(v=vs.85).aspx
+ */
+typedef struct FAudioWaveFormatExtensible
+{
+ FAudioWaveFormatEx Format;
+ union
+ {
+ uint16_t wValidBitsPerSample;
+ uint16_t wSamplesPerBlock;
+ uint16_t wReserved;
+ } Samples;
+ uint32_t dwChannelMask;
+ FAudioGUID SubFormat;
+} FAudioWaveFormatExtensible;
+
+typedef struct FAudioADPCMCoefSet
+{
+ int16_t iCoef1;
+ int16_t iCoef2;
+} FAudioADPCMCoefSet;
+
+typedef struct FAudioADPCMWaveFormat
+{
+ FAudioWaveFormatEx wfx;
+ uint16_t wSamplesPerBlock;
+ uint16_t wNumCoef;
+
+ /* MSVC warns on empty arrays in structs */
+ #ifdef _MSC_VER
+ #pragma warning(push)
+ #pragma warning(disable: 4200)
+ #endif
+
+ FAudioADPCMCoefSet aCoef[];
+ /* MSADPCM has 7 coefficient pairs:
+ * {
+ * { 256, 0 },
+ * { 512, -256 },
+ * { 0, 0 },
+ * { 192, 64 },
+ * { 240, 0 },
+ * { 460, -208 },
+ * { 392, -232 }
+ * }
+ */
+
+ #ifdef _MSC_VER
+ #pragma warning(pop)
+ #endif
+} FAudioADPCMWaveFormat;
+
+typedef struct FAudioDeviceDetails
+{
+ int16_t DeviceID[256]; /* Win32 wchar_t */
+ int16_t DisplayName[256]; /* Win32 wchar_t */
+ FAudioDeviceRole Role;
+ FAudioWaveFormatExtensible OutputFormat;
+} FAudioDeviceDetails;
+
+typedef struct FAudioVoiceDetails
+{
+ uint32_t CreationFlags;
+ uint32_t ActiveFlags;
+ uint32_t InputChannels;
+ uint32_t InputSampleRate;
+} FAudioVoiceDetails;
+
+typedef struct FAudioSendDescriptor
+{
+ uint32_t Flags; /* 0 or FAUDIO_SEND_USEFILTER */
+ FAudioVoice *pOutputVoice;
+} FAudioSendDescriptor;
+
+typedef struct FAudioVoiceSends
+{
+ uint32_t SendCount;
+ FAudioSendDescriptor *pSends;
+} FAudioVoiceSends;
+
+#ifndef FAPO_DECL
+#define FAPO_DECL
+typedef struct FAPO FAPO;
+#endif /* FAPO_DECL */
+
+typedef struct FAudioEffectDescriptor
+{
+ FAPO *pEffect;
+ int32_t InitialState; /* 1 - Enabled, 0 - Disabled */
+ uint32_t OutputChannels;
+} FAudioEffectDescriptor;
+
+typedef struct FAudioEffectChain
+{
+ uint32_t EffectCount;
+ FAudioEffectDescriptor *pEffectDescriptors;
+} FAudioEffectChain;
+
+typedef struct FAudioFilterParameters
+{
+ FAudioFilterType Type;
+ float Frequency; /* [0, FAUDIO_MAX_FILTER_FREQUENCY] */
+ float OneOverQ; /* [0, FAUDIO_MAX_FILTER_ONEOVERQ] */
+} FAudioFilterParameters;
+
+typedef struct FAudioBuffer
+{
+ /* Either 0 or FAUDIO_END_OF_STREAM */
+ uint32_t Flags;
+ /* Pointer to wave data, memory block size.
+ * Note that pAudioData is not copied; FAudio reads directly from your
+ * pointer! This pointer must be valid until FAudio has finished using
+ * it, at which point an OnBufferEnd callback will be generated.
+ */
+ uint32_t AudioBytes;
+ const uint8_t *pAudioData;
+ /* Play region, in sample frames. */
+ uint32_t PlayBegin;
+ uint32_t PlayLength;
+ /* Loop region, in sample frames.
+ * This can be used to loop a subregion of the wave instead of looping
+ * the whole thing, i.e. if you have an intro/outro you can set these
+ * to loop the middle sections instead. If you don't need this, set both
+ * values to 0.
+ */
+ uint32_t LoopBegin;
+ uint32_t LoopLength;
+ /* [0, FAUDIO_LOOP_INFINITE] */
+ uint32_t LoopCount;
+ /* This is sent to callbacks as pBufferContext */
+ void *pContext;
+} FAudioBuffer;
+
+typedef struct FAudioBufferWMA
+{
+ const uint32_t *pDecodedPacketCumulativeBytes;
+ uint32_t PacketCount;
+} FAudioBufferWMA;
+
+typedef struct FAudioVoiceState
+{
+ void *pCurrentBufferContext;
+ uint32_t BuffersQueued;
+ uint64_t SamplesPlayed;
+} FAudioVoiceState;
+
+typedef struct FAudioPerformanceData
+{
+ uint64_t AudioCyclesSinceLastQuery;
+ uint64_t TotalCyclesSinceLastQuery;
+ uint32_t MinimumCyclesPerQuantum;
+ uint32_t MaximumCyclesPerQuantum;
+ uint32_t MemoryUsageInBytes;
+ uint32_t CurrentLatencyInSamples;
+ uint32_t GlitchesSinceEngineStarted;
+ uint32_t ActiveSourceVoiceCount;
+ uint32_t TotalSourceVoiceCount;
+ uint32_t ActiveSubmixVoiceCount;
+ uint32_t ActiveResamplerCount;
+ uint32_t ActiveMatrixMixCount;
+ uint32_t ActiveXmaSourceVoices;
+ uint32_t ActiveXmaStreams;
+} FAudioPerformanceData;
+
+typedef struct FAudioDebugConfiguration
+{
+ /* See FAUDIO_LOG_* */
+ uint32_t TraceMask;
+ uint32_t BreakMask;
+ /* 0 or 1 */
+ int32_t LogThreadID;
+ int32_t LogFileline;
+ int32_t LogFunctionName;
+ int32_t LogTiming;
+} FAudioDebugConfiguration;
+
+#pragma pack(pop)
+
+/* This ISN'T packed. Strictly speaking it wouldn't have mattered anyway but eh.
+ * See https://github.com/microsoft/DirectXTK/issues/256
+ */
+typedef struct FAudioXMA2WaveFormatEx
+{
+ FAudioWaveFormatEx wfx;
+ uint16_t wNumStreams;
+ uint32_t dwChannelMask;
+ uint32_t dwSamplesEncoded;
+ uint32_t dwBytesPerBlock;
+ uint32_t dwPlayBegin;
+ uint32_t dwPlayLength;
+ uint32_t dwLoopBegin;
+ uint32_t dwLoopLength;
+ uint8_t bLoopCount;
+ uint8_t bEncoderVersion;
+ uint16_t wBlockCount;
+} FAudioXMA2WaveFormat;
+
+/* Constants */
+
+#define FAUDIO_E_OUT_OF_MEMORY 0x8007000e
+#define FAUDIO_E_INVALID_ARG 0x80070057
+#define FAUDIO_E_UNSUPPORTED_FORMAT 0x88890008
+#define FAUDIO_E_INVALID_CALL 0x88960001
+#define FAUDIO_E_DEVICE_INVALIDATED 0x88960004
+#define FAPO_E_FORMAT_UNSUPPORTED 0x88970001
+
+#define FAUDIO_MAX_BUFFER_BYTES 0x80000000
+#define FAUDIO_MAX_QUEUED_BUFFERS 64
+#define FAUDIO_MAX_AUDIO_CHANNELS 64
+#define FAUDIO_MIN_SAMPLE_RATE 1000
+#define FAUDIO_MAX_SAMPLE_RATE 200000
+#define FAUDIO_MAX_VOLUME_LEVEL 16777216.0f
+#define FAUDIO_MIN_FREQ_RATIO (1.0f / 1024.0f)
+#define FAUDIO_MAX_FREQ_RATIO 1024.0f
+#define FAUDIO_DEFAULT_FREQ_RATIO 2.0f
+#define FAUDIO_MAX_FILTER_ONEOVERQ 1.5f
+#define FAUDIO_MAX_FILTER_FREQUENCY 1.0f
+#define FAUDIO_MAX_LOOP_COUNT 254
+
+#define FAUDIO_COMMIT_NOW 0
+#define FAUDIO_COMMIT_ALL 0
+#define FAUDIO_INVALID_OPSET (uint32_t) (-1)
+#define FAUDIO_NO_LOOP_REGION 0
+#define FAUDIO_LOOP_INFINITE 255
+#define FAUDIO_DEFAULT_CHANNELS 0
+#define FAUDIO_DEFAULT_SAMPLERATE 0
+
+#define FAUDIO_DEBUG_ENGINE 0x0001
+#define FAUDIO_VOICE_NOPITCH 0x0002
+#define FAUDIO_VOICE_NOSRC 0x0004
+#define FAUDIO_VOICE_USEFILTER 0x0008
+#define FAUDIO_VOICE_MUSIC 0x0010
+#define FAUDIO_PLAY_TAILS 0x0020
+#define FAUDIO_END_OF_STREAM 0x0040
+#define FAUDIO_SEND_USEFILTER 0x0080
+#define FAUDIO_VOICE_NOSAMPLESPLAYED 0x0100
+#define FAUDIO_1024_QUANTUM 0x8000
+
+#define FAUDIO_DEFAULT_FILTER_TYPE FAudioLowPassFilter
+#define FAUDIO_DEFAULT_FILTER_FREQUENCY FAUDIO_MAX_FILTER_FREQUENCY
+#define FAUDIO_DEFAULT_FILTER_ONEOVERQ 1.0f
+
+#define FAUDIO_LOG_ERRORS 0x0001
+#define FAUDIO_LOG_WARNINGS 0x0002
+#define FAUDIO_LOG_INFO 0x0004
+#define FAUDIO_LOG_DETAIL 0x0008
+#define FAUDIO_LOG_API_CALLS 0x0010
+#define FAUDIO_LOG_FUNC_CALLS 0x0020
+#define FAUDIO_LOG_TIMING 0x0040
+#define FAUDIO_LOG_LOCKS 0x0080
+#define FAUDIO_LOG_MEMORY 0x0100
+#define FAUDIO_LOG_STREAMING 0x1000
+
+#ifndef _SPEAKER_POSITIONS_
+#define SPEAKER_FRONT_LEFT 0x00000001
+#define SPEAKER_FRONT_RIGHT 0x00000002
+#define SPEAKER_FRONT_CENTER 0x00000004
+#define SPEAKER_LOW_FREQUENCY 0x00000008
+#define SPEAKER_BACK_LEFT 0x00000010
+#define SPEAKER_BACK_RIGHT 0x00000020
+#define SPEAKER_FRONT_LEFT_OF_CENTER 0x00000040
+#define SPEAKER_FRONT_RIGHT_OF_CENTER 0x00000080
+#define SPEAKER_BACK_CENTER 0x00000100
+#define SPEAKER_SIDE_LEFT 0x00000200
+#define SPEAKER_SIDE_RIGHT 0x00000400
+#define SPEAKER_TOP_CENTER 0x00000800
+#define SPEAKER_TOP_FRONT_LEFT 0x00001000
+#define SPEAKER_TOP_FRONT_CENTER 0x00002000
+#define SPEAKER_TOP_FRONT_RIGHT 0x00004000
+#define SPEAKER_TOP_BACK_LEFT 0x00008000
+#define SPEAKER_TOP_BACK_CENTER 0x00010000
+#define SPEAKER_TOP_BACK_RIGHT 0x00020000
+#define _SPEAKER_POSITIONS_
+#endif
+
+#ifndef SPEAKER_MONO
+#define SPEAKER_MONO SPEAKER_FRONT_CENTER
+#define SPEAKER_STEREO (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT)
+#define SPEAKER_2POINT1 \
+ ( SPEAKER_FRONT_LEFT | \
+ SPEAKER_FRONT_RIGHT | \
+ SPEAKER_LOW_FREQUENCY )
+#define SPEAKER_SURROUND \
+ ( SPEAKER_FRONT_LEFT | \
+ SPEAKER_FRONT_RIGHT | \
+ SPEAKER_FRONT_CENTER | \
+ SPEAKER_BACK_CENTER )
+#define SPEAKER_QUAD \
+ ( SPEAKER_FRONT_LEFT | \
+ SPEAKER_FRONT_RIGHT | \
+ SPEAKER_BACK_LEFT | \
+ SPEAKER_BACK_RIGHT )
+#define SPEAKER_4POINT1 \
+ ( SPEAKER_FRONT_LEFT | \
+ SPEAKER_FRONT_RIGHT | \
+ SPEAKER_LOW_FREQUENCY | \
+ SPEAKER_BACK_LEFT | \
+ SPEAKER_BACK_RIGHT )
+#define SPEAKER_5POINT1 \
+ ( SPEAKER_FRONT_LEFT | \
+ SPEAKER_FRONT_RIGHT | \
+ SPEAKER_FRONT_CENTER | \
+ SPEAKER_LOW_FREQUENCY | \
+ SPEAKER_BACK_LEFT | \
+ SPEAKER_BACK_RIGHT )
+#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 )
+#define SPEAKER_5POINT1_SURROUND \
+ ( SPEAKER_FRONT_LEFT | \
+ SPEAKER_FRONT_RIGHT | \
+ SPEAKER_FRONT_CENTER | \
+ SPEAKER_LOW_FREQUENCY | \
+ SPEAKER_SIDE_LEFT | \
+ SPEAKER_SIDE_RIGHT )
+#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 )
+#define SPEAKER_XBOX SPEAKER_5POINT1
+#endif
+
+#define FAUDIO_FORMAT_PCM 1
+#define FAUDIO_FORMAT_MSADPCM 2
+#define FAUDIO_FORMAT_IEEE_FLOAT 3
+#define FAUDIO_FORMAT_WMAUDIO2 0x0161
+#define FAUDIO_FORMAT_WMAUDIO3 0x0162
+#define FAUDIO_FORMAT_WMAUDIO_LOSSLESS 0x0163
+#define FAUDIO_FORMAT_XMAUDIO2 0x0166
+#define FAUDIO_FORMAT_EXTENSIBLE 0xFFFE
+
+extern FAudioGUID DATAFORMAT_SUBTYPE_PCM;
+extern FAudioGUID DATAFORMAT_SUBTYPE_IEEE_FLOAT;
+
+/* FAudio Version API */
+
+#define FAUDIO_TARGET_VERSION 8 /* Targeting compatibility with XAudio 2.8 */
+
+#define FAUDIO_ABI_VERSION 0
+#define FAUDIO_MAJOR_VERSION 21
+#define FAUDIO_MINOR_VERSION 6
+#define FAUDIO_PATCH_VERSION 0
+
+#define FAUDIO_COMPILED_VERSION ( \
+ (FAUDIO_ABI_VERSION * 100 * 100 * 100) + \
+ (FAUDIO_MAJOR_VERSION * 100 * 100) + \
+ (FAUDIO_MINOR_VERSION * 100) + \
+ (FAUDIO_PATCH_VERSION) \
+)
+
+FAUDIOAPI uint32_t FAudioLinkedVersion(void);
+
+/* FAudio Interface */
+
+/* This should be your first FAudio call.
+ *
+ * ppFAudio: Filled with the FAudio core context.
+ * Flags: Can be 0 or FAUDIO_DEBUG_ENGINE.
+ * XAudio2Processor: Set this to FAUDIO_DEFAULT_PROCESSOR.
+ *
+ * Returns 0 on success.
+ */
+FAUDIOAPI uint32_t FAudioCreate(
+ FAudio **ppFAudio,
+ uint32_t Flags,
+ FAudioProcessor XAudio2Processor
+);
+
+/* See "extensions/COMConstructEXT.txt" for more details */
+FAUDIOAPI uint32_t FAudioCOMConstructEXT(FAudio **ppFAudio, uint8_t version);
+
+/* Increments a reference counter. When counter is 0, audio is freed.
+ * Returns the reference count after incrementing.
+ */
+FAUDIOAPI uint32_t FAudio_AddRef(FAudio *audio);
+
+/* Decrements a reference counter. When counter is 0, audio is freed.
+ * Returns the reference count after decrementing.
+ */
+FAUDIOAPI uint32_t FAudio_Release(FAudio *audio);
+
+/* Queries the number of sound devices available for use.
+ *
+ * pCount: Filled with the number of available sound devices.
+ *
+ * Returns 0 on success.
+ */
+FAUDIOAPI uint32_t FAudio_GetDeviceCount(FAudio *audio, uint32_t *pCount);
+
+/* Gets basic information about a sound device.
+ *
+ * Index: Can be between 0 and the result of GetDeviceCount.
+ * pDeviceDetails: Filled with the device information.
+ *
+ * Returns 0 on success.
+ */
+FAUDIOAPI uint32_t FAudio_GetDeviceDetails(
+ FAudio *audio,
+ uint32_t Index,
+ FAudioDeviceDetails *pDeviceDetails
+);
+
+/* You don't actually have to call this, unless you're using the COM APIs.
+ * See the FAudioCreate API for parameter information.
+ */
+FAUDIOAPI uint32_t FAudio_Initialize(
+ FAudio *audio,
+ uint32_t Flags,
+ FAudioProcessor XAudio2Processor
+);
+
+/* Register a new set of engine callbacks.
+ * There is no limit to the number of sets, but expect performance to degrade
+ * if you have a whole bunch of these. You most likely only need one.
+ *
+ * pCallback: The completely-initialized FAudioEngineCallback structure.
+ *
+ * Returns 0 on success.
+ */
+FAUDIOAPI uint32_t FAudio_RegisterForCallbacks(
+ FAudio *audio,
+ FAudioEngineCallback *pCallback
+);
+
+/* Remove an active set of engine callbacks.
+ * This checks the pointer value, NOT the callback values!
+ *
+ * pCallback: An FAudioEngineCallback structure previously sent to Register.
+ *
+ * Returns 0 on success.
+ */
+FAUDIOAPI void FAudio_UnregisterForCallbacks(
+ FAudio *audio,
+ FAudioEngineCallback *pCallback
+);
+
+/* Creates a "source" voice, used to play back wavedata.
+ *
+ * ppSourceVoice: Filled with the source voice pointer.
+ * pSourceFormat: The input wavedata format, see the documentation for
+ * FAudioWaveFormatEx.
+ * Flags: Can be 0 or a mix of the following FAUDIO_VOICE_* flags:
+ * NOPITCH/NOSRC: Resampling is disabled. If you set this,
+ * the source format sample rate MUST match
+ * the output voices' input sample rates.
+ * Also, SetFrequencyRatio will fail.
+ * USEFILTER: Enables the use of SetFilterParameters.
+ * MUSIC: Unsupported.
+ * MaxFrequencyRatio: AKA your max pitch. This allows us to optimize the size
+ * of the decode/resample cache sizes. For example, if you
+ * only expect to raise pitch by a single octave, you can
+ * set this value to 2.0f. 2.0f is the default value.
+ * Bounds: [FAUDIO_MIN_FREQ_RATIO, FAUDIO_MAX_FREQ_RATIO].
+ * pCallback: Voice callbacks, see FAudioVoiceCallback documentation.
+ * pSendList: List of output voices. If NULL, defaults to master.
+ * All output voices must have the same sample rate!
+ * pEffectChain: List of FAPO effects. This value can be NULL.
+ *
+ * Returns 0 on success.
+ */
+FAUDIOAPI uint32_t FAudio_CreateSourceVoice(
+ FAudio *audio,
+ FAudioSourceVoice **ppSourceVoice,
+ const FAudioWaveFormatEx *pSourceFormat,
+ uint32_t Flags,
+ float MaxFrequencyRatio,
+ FAudioVoiceCallback *pCallback,
+ const FAudioVoiceSends *pSendList,
+ const FAudioEffectChain *pEffectChain
+);
+
+/* Creates a "submix" voice, used to mix/process input voices.
+ * The typical use case for this is to perform CPU-intensive tasks on large
+ * groups of voices all at once. Examples include resampling and FAPO effects.
+ *
+ * ppSubmixVoice: Filled with the submix voice pointer.
+ * InputChannels: Input voices will convert to this channel count.
+ * InputSampleRate: Input voices will convert to this sample rate.
+ * Flags: Can be 0 or FAUDIO_VOICE_USEFILTER.
+ * ProcessingStage: If you have multiple submixes that depend on a specific
+ * order of processing, you can sort them by setting this
+ * value to prioritize them. For example, submixes with
+ * stage 0 will process first, then stage 1, 2, and so on.
+ * pSendList: List of output voices. If NULL, defaults to master.
+ * All output voices must have the same sample rate!
+ * pEffectChain: List of FAPO effects. This value can be NULL.
+ *
+ * Returns 0 on success.
+ */
+FAUDIOAPI uint32_t FAudio_CreateSubmixVoice(
+ FAudio *audio,
+ FAudioSubmixVoice **ppSubmixVoice,
+ uint32_t InputChannels,
+ uint32_t InputSampleRate,
+ uint32_t Flags,
+ uint32_t ProcessingStage,
+ const FAudioVoiceSends *pSendList,
+ const FAudioEffectChain *pEffectChain
+);
+
+/* This should be your second FAudio call, unless you care about which device
+ * you want to use. In that case, see GetDeviceDetails.
+ *
+ * ppMasteringVoice: Filled with the mastering voice pointer.
+ * InputChannels: Device channel count. Can be FAUDIO_DEFAULT_CHANNELS.
+ * InputSampleRate: Device sample rate. Can be FAUDIO_DEFAULT_SAMPLERATE.
+ * Flags: This value must be 0.
+ * DeviceIndex: 0 for the default device. See GetDeviceCount.
+ * pEffectChain: List of FAPO effects. This value can be NULL.
+ *
+ * Returns 0 on success.
+ */
+FAUDIOAPI uint32_t FAudio_CreateMasteringVoice(
+ FAudio *audio,
+ FAudioMasteringVoice **ppMasteringVoice,
+ uint32_t InputChannels,
+ uint32_t InputSampleRate,
+ uint32_t Flags,
+ uint32_t DeviceIndex,
+ const FAudioEffectChain *pEffectChain
+);
+
+/* This is the XAudio 2.8+ version of CreateMasteringVoice.
+ * Right now this doesn't do anything. Don't use this function.
+ */
+FAUDIOAPI uint32_t FAudio_CreateMasteringVoice8(
+ FAudio *audio,
+ FAudioMasteringVoice **ppMasteringVoice,
+ uint32_t InputChannels,
+ uint32_t InputSampleRate,
+ uint32_t Flags,
+ uint16_t *szDeviceId,
+ const FAudioEffectChain *pEffectChain,
+ FAudioStreamCategory StreamCategory
+);
+
+/* Starts the engine, begins processing the audio graph.
+ * Returns 0 on success.
+ */
+FAUDIOAPI uint32_t FAudio_StartEngine(FAudio *audio);
+
+/* Stops the engine and halts all processing.
+ * The audio device will continue to run, but will produce silence.
+ * The graph will be frozen until you call StartEngine, where it will then
+ * resume all processing exactly as it would have had this never been called.
+ */
+FAUDIOAPI void FAudio_StopEngine(FAudio *audio);
+
+/* Flushes a batch of FAudio calls compiled with a given "OperationSet" tag.
+ * This function is based on IXAudio2::CommitChanges from the XAudio2 spec.
+ * This is useful for pushing calls that need to be done perfectly in sync. For
+ * example, if you want to play two separate sources at the exact same time, you
+ * can call FAudioSourceVoice_Start with an OperationSet value of your choice,
+ * then call CommitChanges with that same value to start the sources together.
+ *
+ * OperationSet: Either a value known by you or FAUDIO_COMMIT_ALL
+ *
+ * Returns 0 on success.
+ */
+FAUDIOAPI uint32_t FAudio_CommitOperationSet(
+ FAudio *audio,
+ uint32_t OperationSet
+);
+
+/* DO NOT USE THIS FUNCTION OR I SWEAR TO GOD */
+FAUDIODEPRECATED("This function will break your program! Use FAudio_CommitOperationSet instead!")
+FAUDIOAPI uint32_t FAudio_CommitChanges(FAudio *audio);
+
+/* Requests various bits of performance information from the engine.
+ *
+ * pPerfData: Filled with the data. See FAudioPerformanceData for details.
+ */
+FAUDIOAPI void FAudio_GetPerformanceData(
+ FAudio *audio,
+ FAudioPerformanceData *pPerfData
+);
+
+/* When using a Debug binary, this lets you configure what information gets
+ * logged to output. Be careful, this can spit out a LOT of text.
+ *
+ * pDebugConfiguration: See FAudioDebugConfiguration for details.
+ * pReserved: Set this to NULL.
+ */
+FAUDIOAPI void FAudio_SetDebugConfiguration(
+ FAudio *audio,
+ FAudioDebugConfiguration *pDebugConfiguration,
+ void* pReserved
+);
+
+/* Requests the values that determine's the engine's update size.
+ * For example, a 48KHz engine with a 1024-sample update period would return
+ * 1024 for the numerator and 48000 for the denominator. With this information,
+ * you can determine the precise update size in milliseconds.
+ *
+ * quantumNumerator - The engine's update size, in sample frames.
+ * quantumDenominator - The engine's sample rate, in Hz
+ */
+FAUDIOAPI void FAudio_GetProcessingQuantum(
+ FAudio *audio,
+ uint32_t *quantumNumerator,
+ uint32_t *quantumDenominator
+);
+
+/* FAudioVoice Interface */
+
+/* Requests basic information about a voice.
+ *
+ * pVoiceDetails: See FAudioVoiceDetails for details.
+ */
+FAUDIOAPI void FAudioVoice_GetVoiceDetails(
+ FAudioVoice *voice,
+ FAudioVoiceDetails *pVoiceDetails
+);
+
+/* Change the output voices for this voice.
+ * This function is invalid for mastering voices.
+ *
+ * pSendList: List of output voices. If NULL, defaults to master.
+ * All output voices must have the same sample rate!
+ *
+ * Returns 0 on success.
+ */
+FAUDIOAPI uint32_t FAudioVoice_SetOutputVoices(
+ FAudioVoice *voice,
+ const FAudioVoiceSends *pSendList
+);
+
+/* Change/Remove the effect chain for this voice.
+ *
+ * pEffectChain: List of FAPO effects. This value can be NULL.
+ * Note that the final channel counts for this chain MUST
+ * match the input/output channel count that was
+ * determined at voice creation time!
+ *
+ * Returns 0 on success.
+ */
+FAUDIOAPI uint32_t FAudioVoice_SetEffectChain(
+ FAudioVoice *voice,
+ const FAudioEffectChain *pEffectChain
+);
+
+/* Enables an effect in the effect chain.
+ *
+ * EffectIndex: The index of the effect (based on the chain order).
+ * OperationSet: See CommitChanges. Default is FAUDIO_COMMIT_NOW.
+ *
+ * Returns 0 on success.
+ */
+FAUDIOAPI uint32_t FAudioVoice_EnableEffect(
+ FAudioVoice *voice,
+ uint32_t EffectIndex,
+ uint32_t OperationSet
+);
+
+/* Disables an effect in the effect chain.
+ *
+ * EffectIndex: The index of the effect (based on the chain order).
+ * OperationSet: See CommitChanges. Default is FAUDIO_COMMIT_NOW.
+ *
+ * Returns 0 on success.
+ */
+FAUDIOAPI uint32_t FAudioVoice_DisableEffect(
+ FAudioVoice *voice,
+ uint32_t EffectIndex,
+ uint32_t OperationSet
+);
+
+/* Queries the enabled/disabled state of an effect in the effect chain.
+ *
+ * EffectIndex: The index of the effect (based on the chain order).
+ * pEnabled: Filled with either 1 (Enabled) or 0 (Disabled).
+ *
+ * Returns 0 on success.
+ */
+FAUDIOAPI void FAudioVoice_GetEffectState(
+ FAudioVoice *voice,
+ uint32_t EffectIndex,
+ int32_t *pEnabled
+);
+
+/* Submits a block of memory to be sent to FAPO::SetParameters.
+ *
+ * EffectIndex: The index of the effect (based on the chain order).
+ * pParameters: The values to be copied and submitted to the FAPO.
+ * ParametersByteSize: This should match what the FAPO expects!
+ * OperationSet: See CommitChanges. Default is FAUDIO_COMMIT_NOW.
+ *
+ * Returns 0 on success.
+ */
+FAUDIOAPI uint32_t FAudioVoice_SetEffectParameters(
+ FAudioVoice *voice,
+ uint32_t EffectIndex,
+ const void *pParameters,
+ uint32_t ParametersByteSize,
+ uint32_t OperationSet
+);
+
+/* Requests the latest parameters from FAPO::GetParameters.
+ *
+ * EffectIndex: The index of the effect (based on the chain order).
+ * pParameters: Filled with the latest parameter values from the FAPO.
+ * ParametersByteSize: This should match what the FAPO expects!
+ *
+ * Returns 0 on success.
+ */
+FAUDIOAPI uint32_t FAudioVoice_GetEffectParameters(
+ FAudioVoice *voice,
+ uint32_t EffectIndex,
+ void *pParameters,
+ uint32_t ParametersByteSize
+);
+
+/* Sets the filter variables for a voice.
+ * This is only valid on voices with the USEFILTER flag.
+ *
+ * pParameters: See FAudioFilterParameters for details.
+ * OperationSet: See CommitChanges. Default is FAUDIO_COMMIT_NOW.
+ *
+ * Returns 0 on success.
+ */
+FAUDIOAPI uint32_t FAudioVoice_SetFilterParameters(
+ FAudioVoice *voice,
+ const FAudioFilterParameters *pParameters,
+ uint32_t OperationSet
+);
+
+/* Requests the filter variables for a voice.
+ * This is only valid on voices with the USEFILTER flag.
+ *
+ * pParameters: See FAudioFilterParameters for details.
+ */
+FAUDIOAPI void FAudioVoice_GetFilterParameters(
+ FAudioVoice *voice,
+ FAudioFilterParameters *pParameters
+);
+
+/* Sets the filter variables for a voice's output voice.
+ * This is only valid on sends with the USEFILTER flag.
+ *
+ * pDestinationVoice: An output voice from the voice's send list.
+ * pParameters: See FAudioFilterParameters for details.
+ * OperationSet: See CommitChanges. Default is FAUDIO_COMMIT_NOW.
+ *
+ * Returns 0 on success.
+ */
+FAUDIOAPI uint32_t FAudioVoice_SetOutputFilterParameters(
+ FAudioVoice *voice,
+ FAudioVoice *pDestinationVoice,
+ const FAudioFilterParameters *pParameters,
+ uint32_t OperationSet
+);
+
+/* Requests the filter variables for a voice's output voice.
+ * This is only valid on sends with the USEFILTER flag.
+ *
+ * pDestinationVoice: An output voice from the voice's send list.
+ * pParameters: See FAudioFilterParameters for details.
+ */
+FAUDIOAPI void FAudioVoice_GetOutputFilterParameters(
+ FAudioVoice *voice,
+ FAudioVoice *pDestinationVoice,
+ FAudioFilterParameters *pParameters
+);
+
+/* Sets the global volume of a voice.
+ *
+ * Volume: Amplitude ratio. 1.0f is default, 0.0f is silence.
+ * Note that you can actually set volume < 0.0f!
+ * Bounds: [-FAUDIO_MAX_VOLUME_LEVEL, FAUDIO_MAX_VOLUME_LEVEL]
+ * OperationSet: See CommitChanges. Default is FAUDIO_COMMIT_NOW.
+ *
+ * Returns 0 on success.
+ */
+FAUDIOAPI uint32_t FAudioVoice_SetVolume(
+ FAudioVoice *voice,
+ float Volume,
+ uint32_t OperationSet
+);
+
+/* Requests the global volume of a voice.
+ *
+ * pVolume: Filled with the current voice amplitude ratio.
+ */
+FAUDIOAPI void FAudioVoice_GetVolume(
+ FAudioVoice *voice,
+ float *pVolume
+);
+
+/* Sets the per-channel volumes of a voice.
+ *
+ * Channels: Must match the channel count of this voice!
+ * pVolumes: Amplitude ratios for each channel. Same as SetVolume.
+ * OperationSet: See CommitChanges. Default is FAUDIO_COMMIT_NOW.
+ *
+ * Returns 0 on success.
+ */
+FAUDIOAPI uint32_t FAudioVoice_SetChannelVolumes(
+ FAudioVoice *voice,
+ uint32_t Channels,
+ const float *pVolumes,
+ uint32_t OperationSet
+);
+
+/* Requests the per-channel volumes of a voice.
+ *
+ * Channels: Must match the channel count of this voice!
+ * pVolumes: Filled with the current channel amplitude ratios.
+ */
+FAUDIOAPI void FAudioVoice_GetChannelVolumes(
+ FAudioVoice *voice,
+ uint32_t Channels,
+ float *pVolumes
+);
+
+/* Sets the volumes of a send's output channels. The matrix is based on the
+ * voice's input channels. For example, the default matrix for a 2-channel
+ * source and a 2-channel output voice is as follows:
+ * [0] = 1.0f; <- Left input, left output
+ * [1] = 0.0f; <- Right input, left output
+ * [2] = 0.0f; <- Left input, right output
+ * [3] = 1.0f; <- Right input, right output
+ * This is typically only used for panning or 3D sound (via F3DAudio).
+ *
+ * pDestinationVoice: An output voice from the voice's send list.
+ * SourceChannels: Must match the voice's input channel count!
+ * DestinationChannels: Must match the destination's input channel count!
+ * pLevelMatrix: A float[SourceChannels * DestinationChannels].
+ * OperationSet: See CommitChanges. Default is FAUDIO_COMMIT_NOW.
+ *
+ * Returns 0 on success.
+ */
+FAUDIOAPI uint32_t FAudioVoice_SetOutputMatrix(
+ FAudioVoice *voice,
+ FAudioVoice *pDestinationVoice,
+ uint32_t SourceChannels,
+ uint32_t DestinationChannels,
+ const float *pLevelMatrix,
+ uint32_t OperationSet
+);
+
+/* Gets the volumes of a send's output channels. See SetOutputMatrix.
+ *
+ * pDestinationVoice: An output voice from the voice's send list.
+ * SourceChannels: Must match the voice's input channel count!
+ * DestinationChannels: Must match the voice's output channel count!
+ * pLevelMatrix: A float[SourceChannels * DestinationChannels].
+ */
+FAUDIOAPI void FAudioVoice_GetOutputMatrix(
+ FAudioVoice *voice,
+ FAudioVoice *pDestinationVoice,
+ uint32_t SourceChannels,
+ uint32_t DestinationChannels,
+ float *pLevelMatrix
+);
+
+/* Removes this voice from the audio graph and frees memory. */
+FAUDIOAPI void FAudioVoice_DestroyVoice(FAudioVoice *voice);
+
+/* FAudioSourceVoice Interface */
+
+/* Starts processing for a source voice.
+ *
+ * Flags: Must be 0.
+ * OperationSet: See CommitChanges. Default is FAUDIO_COMMIT_NOW.
+ *
+ * Returns 0 on success.
+ */
+FAUDIOAPI uint32_t FAudioSourceVoice_Start(
+ FAudioSourceVoice *voice,
+ uint32_t Flags,
+ uint32_t OperationSet
+);
+
+/* Pauses processing for a source voice. Yes, I said pausing.
+ * If you want to _actually_ stop, call FlushSourceBuffers next.
+ *
+ * Flags: Can be 0 or FAUDIO_PLAY_TAILS, which allows effects to
+ * keep emitting output even after processing has stopped.
+ * OperationSet: See CommitChanges. Default is FAUDIO_COMMIT_NOW.
+ *
+ * Returns 0 on success.
+ */
+FAUDIOAPI uint32_t FAudioSourceVoice_Stop(
+ FAudioSourceVoice *voice,
+ uint32_t Flags,
+ uint32_t OperationSet
+);
+
+/* Submits a block of wavedata for the source to process.
+ *
+ * pBuffer: See FAudioBuffer for details.
+ * pBufferWMA: See FAudioBufferWMA for details. (Also, don't use WMA.)
+ *
+ * Returns 0 on success.
+ */
+FAUDIOAPI uint32_t FAudioSourceVoice_SubmitSourceBuffer(
+ FAudioSourceVoice *voice,
+ const FAudioBuffer *pBuffer,
+ const FAudioBufferWMA *pBufferWMA
+);
+
+/* Removes all buffers from a source, with a minor exception.
+ * If the voice is still playing, the active buffer is left alone.
+ * All buffers that are removed will spawn an OnBufferEnd callback.
+ *
+ * Returns 0 on success.
+ */
+FAUDIOAPI uint32_t FAudioSourceVoice_FlushSourceBuffers(
+ FAudioSourceVoice *voice
+);
+
+/* Takes the last buffer currently queued and sets the END_OF_STREAM flag.
+ *
+ * Returns 0 on success.
+ */
+FAUDIOAPI uint32_t FAudioSourceVoice_Discontinuity(
+ FAudioSourceVoice *voice
+);
+
+/* Sets the loop count of the active buffer to 0.
+ *
+ * OperationSet: See CommitChanges. Default is FAUDIO_COMMIT_NOW.
+ *
+ * Returns 0 on success.
+ */
+FAUDIOAPI uint32_t FAudioSourceVoice_ExitLoop(
+ FAudioSourceVoice *voice,
+ uint32_t OperationSet
+);
+
+/* Requests the state and some basic statistics for this source.
+ *
+ * pVoiceState: See FAudioVoiceState for details.
+ * Flags: Can be 0 or FAUDIO_VOICE_NOSAMPLESPLAYED.
+ */
+FAUDIOAPI void FAudioSourceVoice_GetState(
+ FAudioSourceVoice *voice,
+ FAudioVoiceState *pVoiceState,
+ uint32_t Flags
+);
+
+/* Sets the frequency ratio (fancy phrase for pitch) of this source.
+ *
+ * Ratio: The frequency ratio, must be <= MaxFrequencyRatio.
+ * OperationSet: See CommitChanges. Default is FAUDIO_COMMIT_NOW.
+ *
+ * Returns 0 on success.
+ */
+FAUDIOAPI uint32_t FAudioSourceVoice_SetFrequencyRatio(
+ FAudioSourceVoice *voice,
+ float Ratio,
+ uint32_t OperationSet
+);
+
+/* Requests the frequency ratio (fancy phrase for pitch) of this source.
+ *
+ * pRatio: Filled with the frequency ratio.
+ */
+FAUDIOAPI void FAudioSourceVoice_GetFrequencyRatio(
+ FAudioSourceVoice *voice,
+ float *pRatio
+);
+
+/* Resets the core sample rate of this source.
+ * You probably don't want this, it's more likely you want SetFrequencyRatio.
+ * This is used to recycle voices without having to constantly reallocate them.
+ * For example, if you have wavedata that's all float32 mono, but the sample
+ * rates are different, you can take a source that was being used for a 48KHz
+ * wave and call this so it can be used for a 44.1KHz wave.
+ *
+ * NewSourceSampleRate: The new sample rate for this source.
+ *
+ * Returns 0 on success.
+ */
+FAUDIOAPI uint32_t FAudioSourceVoice_SetSourceSampleRate(
+ FAudioSourceVoice *voice,
+ uint32_t NewSourceSampleRate
+);
+
+/* FAudioMasteringVoice Interface */
+
+/* Requests the channel mask for the mastering voice.
+ * This is typically used with F3DAudioInitialize, but you may find it
+ * interesting if you want to see the user's basic speaker layout.
+ *
+ * pChannelMask: Filled with the channel mask.
+ *
+ * Returns 0 on success.
+ */
+FAUDIOAPI uint32_t FAudioMasteringVoice_GetChannelMask(
+ FAudioMasteringVoice *voice,
+ uint32_t *pChannelMask
+);
+
+/* FAudioEngineCallback Interface */
+
+/* If something horrible happens, this will be called.
+ *
+ * Error: The error code that spawned this callback.
+ */
+typedef void (FAUDIOCALL * OnCriticalErrorFunc)(
+ FAudioEngineCallback *callback,
+ uint32_t Error
+);
+
+/* This is called at the end of a processing update. */
+typedef void (FAUDIOCALL * OnProcessingPassEndFunc)(
+ FAudioEngineCallback *callback
+);
+
+/* This is called at the beginning of a processing update. */
+typedef void (FAUDIOCALL * OnProcessingPassStartFunc)(
+ FAudioEngineCallback *callback
+);
+
+struct FAudioEngineCallback
+{
+ OnCriticalErrorFunc OnCriticalError;
+ OnProcessingPassEndFunc OnProcessingPassEnd;
+ OnProcessingPassStartFunc OnProcessingPassStart;
+};
+
+/* FAudioVoiceCallback Interface */
+
+/* When a buffer is no longer in use, this is called.
+ *
+ * pBufferContext: The pContext for the FAudioBuffer in question.
+ */
+typedef void (FAUDIOCALL * OnBufferEndFunc)(
+ FAudioVoiceCallback *callback,
+ void *pBufferContext
+);
+
+/* When a buffer is now being used, this is called.
+ *
+ * pBufferContext: The pContext for the FAudioBuffer in question.
+ */
+typedef void (FAUDIOCALL * OnBufferStartFunc)(
+ FAudioVoiceCallback *callback,
+ void *pBufferContext
+);
+
+/* When a buffer completes a loop, this is called.
+ *
+ * pBufferContext: The pContext for the FAudioBuffer in question.
+ */
+typedef void (FAUDIOCALL * OnLoopEndFunc)(
+ FAudioVoiceCallback *callback,
+ void *pBufferContext
+);
+
+/* When a buffer that has the END_OF_STREAM flag is finished, this is called. */
+typedef void (FAUDIOCALL * OnStreamEndFunc)(
+ FAudioVoiceCallback *callback
+);
+
+/* If something horrible happens to a voice, this is called.
+ *
+ * pBufferContext: The pContext for the FAudioBuffer in question.
+ * Error: The error code that spawned this callback.
+ */
+typedef void (FAUDIOCALL * OnVoiceErrorFunc)(
+ FAudioVoiceCallback *callback,
+ void *pBufferContext,
+ uint32_t Error
+);
+
+/* When this voice is done being processed, this is called. */
+typedef void (FAUDIOCALL * OnVoiceProcessingPassEndFunc)(
+ FAudioVoiceCallback *callback
+);
+
+/* When a voice is about to start being processed, this is called.
+ *
+ * BytesRequested: The number of bytes needed from the application to
+ * complete a full update. For example, if we need 512
+ * frames for a whole update, and the voice is a float32
+ * stereo source, BytesRequired will be 4096.
+ */
+typedef void (FAUDIOCALL * OnVoiceProcessingPassStartFunc)(
+ FAudioVoiceCallback *callback,
+ uint32_t BytesRequired
+);
+
+struct FAudioVoiceCallback
+{
+ OnBufferEndFunc OnBufferEnd;
+ OnBufferStartFunc OnBufferStart;
+ OnLoopEndFunc OnLoopEnd;
+ OnStreamEndFunc OnStreamEnd;
+ OnVoiceErrorFunc OnVoiceError;
+ OnVoiceProcessingPassEndFunc OnVoiceProcessingPassEnd;
+ OnVoiceProcessingPassStartFunc OnVoiceProcessingPassStart;
+};
+
+/* FAudio Custom Allocator API
+ * See "extensions/CustomAllocatorEXT.txt" for more information.
+ */
+
+typedef void* (FAUDIOCALL * FAudioMallocFunc)(size_t size);
+typedef void (FAUDIOCALL * FAudioFreeFunc)(void* ptr);
+typedef void* (FAUDIOCALL * FAudioReallocFunc)(void* ptr, size_t size);
+
+FAUDIOAPI uint32_t FAudioCreateWithCustomAllocatorEXT(
+ FAudio **ppFAudio,
+ uint32_t Flags,
+ FAudioProcessor XAudio2Processor,
+ FAudioMallocFunc customMalloc,
+ FAudioFreeFunc customFree,
+ FAudioReallocFunc customRealloc
+);
+FAUDIOAPI uint32_t FAudioCOMConstructWithCustomAllocatorEXT(
+ FAudio **ppFAudio,
+ uint8_t version,
+ FAudioMallocFunc customMalloc,
+ FAudioFreeFunc customFree,
+ FAudioReallocFunc customRealloc
+);
+
+/* FAudio Engine Procedure API
+ * See "extensions/EngineProcedureEXT.txt" for more information.
+ */
+typedef void (FAUDIOCALL *FAudioEngineCallEXT)(FAudio *audio, float *output);
+typedef void (FAUDIOCALL *FAudioEngineProcedureEXT)(FAudioEngineCallEXT defaultEngineProc, FAudio *audio, float *output, void *user);
+
+FAUDIOAPI void FAudio_SetEngineProcedureEXT(
+ FAudio *audio,
+ FAudioEngineProcedureEXT clientEngineProc,
+ void *user
+);
+
+
+/* FAudio I/O API */
+
+#define FAUDIO_SEEK_SET 0
+#define FAUDIO_SEEK_CUR 1
+#define FAUDIO_SEEK_END 2
+#define FAUDIO_EOF -1
+
+typedef size_t (FAUDIOCALL * FAudio_readfunc)(
+ void *data,
+ void *dst,
+ size_t size,
+ size_t count
+);
+typedef int64_t (FAUDIOCALL * FAudio_seekfunc)(
+ void *data,
+ int64_t offset,
+ int whence
+);
+typedef int (FAUDIOCALL * FAudio_closefunc)(
+ void *data
+);
+
+typedef struct FAudioIOStream
+{
+ void *data;
+ FAudio_readfunc read;
+ FAudio_seekfunc seek;
+ FAudio_closefunc close;
+ void *lock;
+} FAudioIOStream;
+
+FAUDIOAPI FAudioIOStream* FAudio_fopen(const char *path);
+FAUDIOAPI FAudioIOStream* FAudio_memopen(void *mem, int len);
+FAUDIOAPI uint8_t* FAudio_memptr(FAudioIOStream *io, size_t offset);
+FAUDIOAPI void FAudio_close(FAudioIOStream *io);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* FAUDIO_H */
+
+/* vim: set noexpandtab shiftwidth=8 tabstop=8: */
diff --git a/dlls/xaudio2_7/FAudio/FAudioFX.h b/dlls/xaudio2_7/FAudio/FAudioFX.h
new file mode 100644
index 00000000000..22052d33e87
--- /dev/null
+++ b/dlls/xaudio2_7/FAudio/FAudioFX.h
@@ -0,0 +1,308 @@
+/* FAudio - XAudio Reimplementation for FNA
+ *
+ * Copyright (c) 2011-2021 Ethan Lee, Luigi Auriemma, and the MonoGame Team
+ *
+ * This software is provided 'as-is', without any express or implied warranty.
+ * In no event will the authors be held liable for any damages arising from
+ * the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ * claim that you wrote the original software. If you use this software in a
+ * product, an acknowledgment in the product documentation would be
+ * appreciated but is not required.
+ *
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ * misrepresented as being the original software.
+ *
+ * 3. This notice may not be removed or altered from any source distribution.
+ *
+ * Ethan "flibitijibibo" Lee <flibitijibibo at flibitijibibo.com>
+ *
+ */
+
+/* This file has no documentation since the MSDN docs are still perfectly fine:
+ * https://docs.microsoft.com/en-us/windows/desktop/api/xaudio2fx/
+ *
+ * Note, however, that FAudio's Reverb implementation does NOT support the new
+ * parameters for XAudio 2.9's 7.1 Reverb effect!
+ */
+
+#ifndef FAUDIOFX_H
+#define FAUDIOFX_H
+
+#include "FAudio.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/* GUIDs */
+
+extern const FAudioGUID FAudioFX_CLSID_AudioVolumeMeter;
+extern const FAudioGUID FAudioFX_CLSID_AudioReverb;
+
+/* Structures */
+
+#pragma pack(push, 1)
+
+typedef struct FAudioFXVolumeMeterLevels
+{
+ float *pPeakLevels;
+ float *pRMSLevels;
+ uint32_t ChannelCount;
+} FAudioFXVolumeMeterLevels;
+
+typedef struct FAudioFXReverbParameters
+{
+ float WetDryMix;
+ uint32_t ReflectionsDelay;
+ uint8_t ReverbDelay;
+ uint8_t RearDelay;
+ uint8_t PositionLeft;
+ uint8_t PositionRight;
+ uint8_t PositionMatrixLeft;
+ uint8_t PositionMatrixRight;
+ uint8_t EarlyDiffusion;
+ uint8_t LateDiffusion;
+ uint8_t LowEQGain;
+ uint8_t LowEQCutoff;
+ uint8_t HighEQGain;
+ uint8_t HighEQCutoff;
+ float RoomFilterFreq;
+ float RoomFilterMain;
+ float RoomFilterHF;
+ float ReflectionsGain;
+ float ReverbGain;
+ float DecayTime;
+ float Density;
+ float RoomSize;
+} FAudioFXReverbParameters;
+
+typedef struct FAudioFXReverbParameters9
+{
+ float WetDryMix;
+ uint32_t ReflectionsDelay;
+ uint8_t ReverbDelay;
+ uint8_t RearDelay;
+ uint8_t SideDelay;
+ uint8_t PositionLeft;
+ uint8_t PositionRight;
+ uint8_t PositionMatrixLeft;
+ uint8_t PositionMatrixRight;
+ uint8_t EarlyDiffusion;
+ uint8_t LateDiffusion;
+ uint8_t LowEQGain;
+ uint8_t LowEQCutoff;
+ uint8_t HighEQGain;
+ uint8_t HighEQCutoff;
+ float RoomFilterFreq;
+ float RoomFilterMain;
+ float RoomFilterHF;
+ float ReflectionsGain;
+ float ReverbGain;
+ float DecayTime;
+ float Density;
+ float RoomSize;
+} FAudioFXReverbParameters9;
+
+typedef struct FAudioFXReverbI3DL2Parameters
+{
+ float WetDryMix;
+ int32_t Room;
+ int32_t RoomHF;
+ float RoomRolloffFactor;
+ float DecayTime;
+ float DecayHFRatio;
+ int32_t Reflections;
+ float ReflectionsDelay;
+ int32_t Reverb;
+ float ReverbDelay;
+ float Diffusion;
+ float Density;
+ float HFReference;
+} FAudioFXReverbI3DL2Parameters;
+
+#pragma pack(pop)
+
+/* Constants */
+
+#define FAUDIOFX_DEBUG 1
+
+#define FAUDIOFX_REVERB_MIN_FRAMERATE 20000
+#define FAUDIOFX_REVERB_MAX_FRAMERATE 48000
+
+#define FAUDIOFX_REVERB_MIN_WET_DRY_MIX 0.0f
+#define FAUDIOFX_REVERB_MIN_REFLECTIONS_DELAY 0
+#define FAUDIOFX_REVERB_MIN_REVERB_DELAY 0
+#define FAUDIOFX_REVERB_MIN_REAR_DELAY 0
+#define FAUDIOFX_REVERB_MIN_7POINT1_SIDE_DELAY 0
+#define FAUDIOFX_REVERB_MIN_7POINT1_REAR_DELAY 0
+#define FAUDIOFX_REVERB_MIN_POSITION 0
+#define FAUDIOFX_REVERB_MIN_DIFFUSION 0
+#define FAUDIOFX_REVERB_MIN_LOW_EQ_GAIN 0
+#define FAUDIOFX_REVERB_MIN_LOW_EQ_CUTOFF 0
+#define FAUDIOFX_REVERB_MIN_HIGH_EQ_GAIN 0
+#define FAUDIOFX_REVERB_MIN_HIGH_EQ_CUTOFF 0
+#define FAUDIOFX_REVERB_MIN_ROOM_FILTER_FREQ 20.0f
+#define FAUDIOFX_REVERB_MIN_ROOM_FILTER_MAIN -100.0f
+#define FAUDIOFX_REVERB_MIN_ROOM_FILTER_HF -100.0f
+#define FAUDIOFX_REVERB_MIN_REFLECTIONS_GAIN -100.0f
+#define FAUDIOFX_REVERB_MIN_REVERB_GAIN -100.0f
+#define FAUDIOFX_REVERB_MIN_DECAY_TIME 0.1f
+#define FAUDIOFX_REVERB_MIN_DENSITY 0.0f
+#define FAUDIOFX_REVERB_MIN_ROOM_SIZE 0.0f
+
+#define FAUDIOFX_REVERB_MAX_WET_DRY_MIX 100.0f
+#define FAUDIOFX_REVERB_MAX_REFLECTIONS_DELAY 300
+#define FAUDIOFX_REVERB_MAX_REVERB_DELAY 85
+#define FAUDIOFX_REVERB_MAX_REAR_DELAY 5
+#define FAUDIOFX_REVERB_MAX_7POINT1_SIDE_DELAY 5
+#define FAUDIOFX_REVERB_MAX_7POINT1_REAR_DELAY 20
+#define FAUDIOFX_REVERB_MAX_POSITION 30
+#define FAUDIOFX_REVERB_MAX_DIFFUSION 15
+#define FAUDIOFX_REVERB_MAX_LOW_EQ_GAIN 12
+#define FAUDIOFX_REVERB_MAX_LOW_EQ_CUTOFF 9
+#define FAUDIOFX_REVERB_MAX_HIGH_EQ_GAIN 8
+#define FAUDIOFX_REVERB_MAX_HIGH_EQ_CUTOFF 14
+#define FAUDIOFX_REVERB_MAX_ROOM_FILTER_FREQ 20000.0f
+#define FAUDIOFX_REVERB_MAX_ROOM_FILTER_MAIN 0.0f
+#define FAUDIOFX_REVERB_MAX_ROOM_FILTER_HF 0.0f
+#define FAUDIOFX_REVERB_MAX_REFLECTIONS_GAIN 20.0f
+#define FAUDIOFX_REVERB_MAX_REVERB_GAIN 20.0f
+#define FAUDIOFX_REVERB_MAX_DENSITY 100.0f
+#define FAUDIOFX_REVERB_MAX_ROOM_SIZE 100.0f
+
+#define FAUDIOFX_REVERB_DEFAULT_WET_DRY_MIX 100.0f
+#define FAUDIOFX_REVERB_DEFAULT_REFLECTIONS_DELAY 5
+#define FAUDIOFX_REVERB_DEFAULT_REVERB_DELAY 5
+#define FAUDIOFX_REVERB_DEFAULT_REAR_DELAY 5
+#define FAUDIOFX_REVERB_DEFAULT_7POINT1_SIDE_DELAY 5
+#define FAUDIOFX_REVERB_DEFAULT_7POINT1_REAR_DELAY 20
+#define FAUDIOFX_REVERB_DEFAULT_POSITION 6
+#define FAUDIOFX_REVERB_DEFAULT_POSITION_MATRIX 27
+#define FAUDIOFX_REVERB_DEFAULT_EARLY_DIFFUSION 8
+#define FAUDIOFX_REVERB_DEFAULT_LATE_DIFFUSION 8
+#define FAUDIOFX_REVERB_DEFAULT_LOW_EQ_GAIN 8
+#define FAUDIOFX_REVERB_DEFAULT_LOW_EQ_CUTOFF 4
+#define FAUDIOFX_REVERB_DEFAULT_HIGH_EQ_GAIN 8
+#define FAUDIOFX_REVERB_DEFAULT_HIGH_EQ_CUTOFF 4
+#define FAUDIOFX_REVERB_DEFAULT_ROOM_FILTER_FREQ 5000.0f
+#define FAUDIOFX_REVERB_DEFAULT_ROOM_FILTER_MAIN 0.0f
+#define FAUDIOFX_REVERB_DEFAULT_ROOM_FILTER_HF 0.0f
+#define FAUDIOFX_REVERB_DEFAULT_REFLECTIONS_GAIN 0.0f
+#define FAUDIOFX_REVERB_DEFAULT_REVERB_GAIN 0.0f
+#define FAUDIOFX_REVERB_DEFAULT_DECAY_TIME 1.0f
+#define FAUDIOFX_REVERB_DEFAULT_DENSITY 100.0f
+#define FAUDIOFX_REVERB_DEFAULT_ROOM_SIZE 100.0f
+
+#define FAUDIOFX_I3DL2_PRESET_DEFAULT \
+ {100,-10000, 0,0.0f, 1.00f,0.50f,-10000,0.020f,-10000,0.040f,100.0f,100.0f,5000.0f}
+#define FAUDIOFX_I3DL2_PRESET_GENERIC \
+ {100, -1000, -100,0.0f, 1.49f,0.83f, -2602,0.007f, 200,0.011f,100.0f,100.0f,5000.0f}
+#define FAUDIOFX_I3DL2_PRESET_PADDEDCELL \
+ {100, -1000,-6000,0.0f, 0.17f,0.10f, -1204,0.001f, 207,0.002f,100.0f,100.0f,5000.0f}
+#define FAUDIOFX_I3DL2_PRESET_ROOM \
+ {100, -1000, -454,0.0f, 0.40f,0.83f, -1646,0.002f, 53,0.003f,100.0f,100.0f,5000.0f}
+#define FAUDIOFX_I3DL2_PRESET_BATHROOM \
+ {100, -1000,-1200,0.0f, 1.49f,0.54f, -370,0.007f, 1030,0.011f,100.0f, 60.0f,5000.0f}
+#define FAUDIOFX_I3DL2_PRESET_LIVINGROOM \
+ {100, -1000,-6000,0.0f, 0.50f,0.10f, -1376,0.003f, -1104,0.004f,100.0f,100.0f,5000.0f}
+#define FAUDIOFX_I3DL2_PRESET_STONEROOM \
+ {100, -1000, -300,0.0f, 2.31f,0.64f, -711,0.012f, 83,0.017f,100.0f,100.0f,5000.0f}
+#define FAUDIOFX_I3DL2_PRESET_AUDITORIUM \
+ {100, -1000, -476,0.0f, 4.32f,0.59f, -789,0.020f, -289,0.030f,100.0f,100.0f,5000.0f}
+#define FAUDIOFX_I3DL2_PRESET_CONCERTHALL \
+ {100, -1000, -500,0.0f, 3.92f,0.70f, -1230,0.020f, -2,0.029f,100.0f,100.0f,5000.0f}
+#define FAUDIOFX_I3DL2_PRESET_CAVE \
+ {100, -1000, 0,0.0f, 2.91f,1.30f, -602,0.015f, -302,0.022f,100.0f,100.0f,5000.0f}
+#define FAUDIOFX_I3DL2_PRESET_ARENA \
+ {100, -1000, -698,0.0f, 7.24f,0.33f, -1166,0.020f, 16,0.030f,100.0f,100.0f,5000.0f}
+#define FAUDIOFX_I3DL2_PRESET_HANGAR \
+ {100, -1000,-1000,0.0f,10.05f,0.23f, -602,0.020f, 198,0.030f,100.0f,100.0f,5000.0f}
+#define FAUDIOFX_I3DL2_PRESET_CARPETEDHALLWAY \
+ {100, -1000,-4000,0.0f, 0.30f,0.10f, -1831,0.002f, -1630,0.030f,100.0f,100.0f,5000.0f}
+#define FAUDIOFX_I3DL2_PRESET_HALLWAY \
+ {100, -1000, -300,0.0f, 1.49f,0.59f, -1219,0.007f, 441,0.011f,100.0f,100.0f,5000.0f}
+#define FAUDIOFX_I3DL2_PRESET_STONECORRIDOR \
+ {100, -1000, -237,0.0f, 2.70f,0.79f, -1214,0.013f, 395,0.020f,100.0f,100.0f,5000.0f}
+#define FAUDIOFX_I3DL2_PRESET_ALLEY \
+ {100, -1000, -270,0.0f, 1.49f,0.86f, -1204,0.007f, -4,0.011f,100.0f,100.0f,5000.0f}
+#define FAUDIOFX_I3DL2_PRESET_FOREST \
+ {100, -1000,-3300,0.0f, 1.49f,0.54f, -2560,0.162f, -613,0.088f, 79.0f,100.0f,5000.0f}
+#define FAUDIOFX_I3DL2_PRESET_CITY \
+ {100, -1000, -800,0.0f, 1.49f,0.67f, -2273,0.007f, -2217,0.011f, 50.0f,100.0f,5000.0f}
+#define FAUDIOFX_I3DL2_PRESET_MOUNTAINS \
+ {100, -1000,-2500,0.0f, 1.49f,0.21f, -2780,0.300f, -2014,0.100f, 27.0f,100.0f,5000.0f}
+#define FAUDIOFX_I3DL2_PRESET_QUARRY \
+ {100, -1000,-1000,0.0f, 1.49f,0.83f,-10000,0.061f, 500,0.025f,100.0f,100.0f,5000.0f}
+#define FAUDIOFX_I3DL2_PRESET_PLAIN \
+ {100, -1000,-2000,0.0f, 1.49f,0.50f, -2466,0.179f, -2514,0.100f, 21.0f,100.0f,5000.0f}
+#define FAUDIOFX_I3DL2_PRESET_PARKINGLOT \
+ {100, -1000, 0,0.0f, 1.65f,1.50f, -1363,0.008f, -1153,0.012f,100.0f,100.0f,5000.0f}
+#define FAUDIOFX_I3DL2_PRESET_SEWERPIPE \
+ {100, -1000,-1000,0.0f, 2.81f,0.14f, 429,0.014f, 648,0.021f, 80.0f, 60.0f,5000.0f}
+#define FAUDIOFX_I3DL2_PRESET_UNDERWATER \
+ {100, -1000,-4000,0.0f, 1.49f,0.10f, -449,0.007f, 1700,0.011f,100.0f,100.0f,5000.0f}
+#define FAUDIOFX_I3DL2_PRESET_SMALLROOM \
+ {100, -1000, -600,0.0f, 1.10f,0.83f, -400,0.005f, 500,0.010f,100.0f,100.0f,5000.0f}
+#define FAUDIOFX_I3DL2_PRESET_MEDIUMROOM \
+ {100, -1000, -600,0.0f, 1.30f,0.83f, -1000,0.010f, -200,0.020f,100.0f,100.0f,5000.0f}
+#define FAUDIOFX_I3DL2_PRESET_LARGEROOM \
+ {100, -1000, -600,0.0f, 1.50f,0.83f, -1600,0.020f, -1000,0.040f,100.0f,100.0f,5000.0f}
+#define FAUDIOFX_I3DL2_PRESET_MEDIUMHALL \
+ {100, -1000, -600,0.0f, 1.80f,0.70f, -1300,0.015f, -800,0.030f,100.0f,100.0f,5000.0f}
+#define FAUDIOFX_I3DL2_PRESET_LARGEHALL \
+ {100, -1000, -600,0.0f, 1.80f,0.70f, -2000,0.030f, -1400,0.060f,100.0f,100.0f,5000.0f}
+#define FAUDIOFX_I3DL2_PRESET_PLATE \
+ {100, -1000, -200,0.0f, 1.30f,0.90f, 0,0.002f, 0,0.010f,100.0f, 75.0f,5000.0f}
+
+/* Functions */
+
+FAUDIOAPI uint32_t FAudioCreateVolumeMeter(FAPO** ppApo, uint32_t Flags);
+FAUDIOAPI uint32_t FAudioCreateReverb(FAPO** ppApo, uint32_t Flags);
+FAUDIOAPI uint32_t FAudioCreateReverb9(FAPO** ppApo, uint32_t Flags);
+
+/* See "extensions/CustomAllocatorEXT.txt" for more information. */
+FAUDIOAPI uint32_t FAudioCreateVolumeMeterWithCustomAllocatorEXT(
+ FAPO** ppApo,
+ uint32_t Flags,
+ FAudioMallocFunc customMalloc,
+ FAudioFreeFunc customFree,
+ FAudioReallocFunc customRealloc
+);
+FAUDIOAPI uint32_t FAudioCreateReverbWithCustomAllocatorEXT(
+ FAPO** ppApo,
+ uint32_t Flags,
+ FAudioMallocFunc customMalloc,
+ FAudioFreeFunc customFree,
+ FAudioReallocFunc customRealloc
+);
+FAUDIOAPI uint32_t FAudioCreateReverb9WithCustomAllocatorEXT(
+ FAPO** ppApo,
+ uint32_t Flags,
+ FAudioMallocFunc customMalloc,
+ FAudioFreeFunc customFree,
+ FAudioReallocFunc customRealloc
+);
+
+FAUDIOAPI void ReverbConvertI3DL2ToNative(
+ const FAudioFXReverbI3DL2Parameters *pI3DL2,
+ FAudioFXReverbParameters *pNative
+);
+FAUDIOAPI void ReverbConvertI3DL2ToNative9(
+ const FAudioFXReverbI3DL2Parameters *pI3DL2,
+ FAudioFXReverbParameters9 *pNative,
+ int32_t sevenDotOneReverb
+);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* FAUDIOFX_H */
+
+/* vim: set noexpandtab shiftwidth=8 tabstop=8: */
--
2.31.0
More information about the wine-devel
mailing list