/* 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 * */ #ifndef FAUDIO_H #define FAUDIO_H #ifdef _WIN32 #define FAUDIOAPI #define FAUDIOCALL #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 #include #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 22 #define FAUDIO_MINOR_VERSION 2 #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: */