|
|
#ifndef FACT_CPP_XAUDIO2_H
|
|
|
#define FACT_CPP_XAUDIO2_H
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
extern "C" {
|
|
|
#endif /* __cplusplus */
|
|
|
|
|
|
#ifdef FAUDIOCPP_EXPORTS
|
|
|
#define FAUDIOCPP_API HRESULT __stdcall
|
|
|
#else
|
|
|
#define FAUDIOCPP_API __declspec(dllimport) HRESULT __stdcall
|
|
|
#endif
|
|
|
|
|
|
#ifndef XAUDIO2_VERSION
|
|
|
#define XAUDIO2_VERSION 7
|
|
|
#endif
|
|
|
|
|
|
#include "com_utils.h"
|
|
|
|
|
|
typedef FAudioProcessor XAUDIO2_PROCESSOR;
|
|
|
typedef FAudioDeviceDetails XAUDIO2_DEVICE_DETAILS;
|
|
|
typedef FAudioWaveFormatEx WAVEFORMATEX;
|
|
|
typedef FAudioWaveFormatExtensible WAVEFORMATEXTENSIBLE;
|
|
|
typedef FAudioDebugConfiguration XAUDIO2_DEBUG_CONFIGURATION;
|
|
|
typedef FAudioFilterParameters XAUDIO2_FILTER_PARAMETERS;
|
|
|
typedef FAudioBuffer XAUDIO2_BUFFER;
|
|
|
typedef FAudioBufferWMA XAUDIO2_BUFFER_WMA;
|
|
|
typedef FAudioVoiceState XAUDIO2_VOICE_STATE;
|
|
|
|
|
|
class IXAudio2EngineCallback;
|
|
|
class IXAudio2Voice;
|
|
|
class IXAudio2SourceVoice;
|
|
|
class IXAudio2SubmixVoice;
|
|
|
class IXAudio2MasteringVoice;
|
|
|
class IXAudio2VoiceCallback;
|
|
|
|
|
|
#pragma pack(push, 1)
|
|
|
|
|
|
#if XAUDIO2_VERSION >= 4
|
|
|
typedef struct XAUDIO2_SEND_DESCRIPTOR {
|
|
|
UINT32 Flags;
|
|
|
IXAudio2Voice *pOutputVoice;
|
|
|
} XAUDIO2_SEND_DESCRIPTOR;
|
|
|
|
|
|
typedef struct XAUDIO2_VOICE_SENDS {
|
|
|
UINT32 SendCount;
|
|
|
XAUDIO2_SEND_DESCRIPTOR *pSends;
|
|
|
} XAUDIO2_VOICE_SENDS;
|
|
|
#else
|
|
|
typedef struct XAUDIO2_VOICE_SENDS {
|
|
|
UINT32 SendCount;
|
|
|
IXAudio2Voice **pSends;
|
|
|
} XAUDIO2_VOICE_SENDS;
|
|
|
#endif
|
|
|
|
|
|
typedef struct XAUDIO2_EFFECT_DESCRIPTOR {
|
|
|
IUnknown *pEffect;
|
|
|
BOOL InitialState;
|
|
|
UINT32 OutputChannel;
|
|
|
} XAUDIO2_EFFECT_DESCRIPTOR;
|
|
|
|
|
|
typedef struct XAUDIO2_EFFECT_CHAIN {
|
|
|
UINT32 EffectCount;
|
|
|
XAUDIO2_EFFECT_DESCRIPTOR *pEffectDescriptors;
|
|
|
} XAUDIO2_EFFECT_CHAIN;
|
|
|
|
|
|
#if XAUDIO2_VERSION >= 3
|
|
|
typedef FAudioPerformanceData XAUDIO2_PERFORMANCE_DATA;
|
|
|
#else
|
|
|
typedef struct XAUDIO2_PERFORMANCE_DATA
|
|
|
{
|
|
|
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 TotalSubmixVoiceCount;
|
|
|
uint32_t ActiveXmaSourceVoices;
|
|
|
uint32_t ActiveXmaStreams;
|
|
|
} XAUDIO2_PERFORMANCE_DATA;
|
|
|
#endif// XAUDIO2_VERSION >= 3
|
|
|
|
|
|
#if XAUDIO2_VERSION > 7
|
|
|
typedef FAudioVoiceDetails XAUDIO2_VOICE_DETAILS;
|
|
|
#else
|
|
|
typedef struct XAUDIO2_VOICE_DETAILS {
|
|
|
uint32_t CreationFlags;
|
|
|
uint32_t InputChannels;
|
|
|
uint32_t InputSampleRate;
|
|
|
} XAUDIO2_VOICE_DETAILS;
|
|
|
#endif // XAUDIO2_VERSION > 7
|
|
|
|
|
|
#pragma pack(pop)
|
|
|
|
|
|
class IXAudio2Voice {
|
|
|
public:
|
|
|
COM_METHOD(void) GetVoiceDetails (XAUDIO2_VOICE_DETAILS* pVoiceDetails) = 0;
|
|
|
COM_METHOD(HRESULT) SetOutputVoices (const XAUDIO2_VOICE_SENDS* pSendList) = 0;
|
|
|
COM_METHOD(HRESULT) SetEffectChain (const XAUDIO2_EFFECT_CHAIN* pEffectChain) = 0;
|
|
|
COM_METHOD(HRESULT) EnableEffect (
|
|
|
UINT32 EffectIndex,
|
|
|
UINT32 OperationSet = FAUDIO_COMMIT_NOW) = 0;
|
|
|
COM_METHOD(HRESULT) DisableEffect (
|
|
|
UINT32 EffectIndex,
|
|
|
UINT32 OperationSet = FAUDIO_COMMIT_NOW) = 0;
|
|
|
COM_METHOD(void) GetEffectState (UINT32 EffectIndex, BOOL* pEnabled) = 0;
|
|
|
COM_METHOD(HRESULT) SetEffectParameters (
|
|
|
UINT32 EffectIndex,
|
|
|
const void* pParameters,
|
|
|
UINT32 ParametersByteSize,
|
|
|
UINT32 OperationSet = FAUDIO_COMMIT_NOW) = 0;
|
|
|
COM_METHOD(HRESULT) GetEffectParameters (
|
|
|
UINT32 EffectIndex,
|
|
|
void* pParameters,
|
|
|
UINT32 ParametersByteSize) = 0;
|
|
|
COM_METHOD(HRESULT) SetFilterParameters (
|
|
|
const XAUDIO2_FILTER_PARAMETERS* pParameters,
|
|
|
UINT32 OperationSet = FAUDIO_COMMIT_NOW) = 0;
|
|
|
COM_METHOD(void) GetFilterParameters (XAUDIO2_FILTER_PARAMETERS* pParameters) = 0;
|
|
|
#if XAUDIO2_VERSION >= 4
|
|
|
COM_METHOD(HRESULT) SetOutputFilterParameters (
|
|
|
IXAudio2Voice* pDestinationVoice,
|
|
|
const XAUDIO2_FILTER_PARAMETERS* pParameters,
|
|
|
UINT32 OperationSet = FAUDIO_COMMIT_NOW) = 0;
|
|
|
COM_METHOD(void) GetOutputFilterParameters (
|
|
|
IXAudio2Voice* pDestinationVoice,
|
|
|
XAUDIO2_FILTER_PARAMETERS* pParameters) = 0;
|
|
|
#endif // XAUDIO2_VERSION >= 4
|
|
|
COM_METHOD(HRESULT) SetVolume (
|
|
|
float Volume,
|
|
|
UINT32 OperationSet = FAUDIO_COMMIT_NOW) = 0;
|
|
|
COM_METHOD(void) GetVolume (float* pVolume) = 0;
|
|
|
COM_METHOD(HRESULT) SetChannelVolumes (
|
|
|
UINT32 Channels,
|
|
|
const float* pVolumes,
|
|
|
UINT32 OperationSet = FAUDIO_COMMIT_NOW) = 0;
|
|
|
COM_METHOD(void) GetChannelVolumes (UINT32 Channels, float* pVolumes) = 0;
|
|
|
COM_METHOD(HRESULT) SetOutputMatrix (
|
|
|
IXAudio2Voice* pDestinationVoice,
|
|
|
UINT32 SourceChannels,
|
|
|
UINT32 DestinationChannels,
|
|
|
const float* pLevelMatrix,
|
|
|
UINT32 OperationSet = FAUDIO_COMMIT_NOW) = 0;
|
|
|
#if XAUDIO2_VERSION >= 1
|
|
|
COM_METHOD(void) GetOutputMatrix (
|
|
|
#else
|
|
|
COM_METHOD(HRESULT) GetOutputMatrix (
|
|
|
#endif // XAUDIO2_VERSION >= 1
|
|
|
IXAudio2Voice* pDestinationVoice,
|
|
|
UINT32 SourceChannels,
|
|
|
UINT32 DestinationChannels,
|
|
|
float* pLevelMatrix) = 0;
|
|
|
COM_METHOD(void) DestroyVoice() = 0;
|
|
|
|
|
|
public:
|
|
|
// not the ideal solution but the cleanest way I known to get to the common FAudioVoice object
|
|
|
// from a IXAudioVoice pointer to any derived class (without changing the vtable)
|
|
|
FAudioVoice *faudio_voice;
|
|
|
};
|
|
|
|
|
|
class IXAudio2SourceVoice : public IXAudio2Voice {
|
|
|
public:
|
|
|
COM_METHOD(HRESULT) Start (UINT32 Flags = 0, UINT32 OperationSet = FAUDIO_COMMIT_NOW) = 0;
|
|
|
COM_METHOD(HRESULT) Stop (UINT32 Flags = 0, UINT32 OperationSet = FAUDIO_COMMIT_NOW) = 0;
|
|
|
COM_METHOD(HRESULT) SubmitSourceBuffer (
|
|
|
const XAUDIO2_BUFFER* pBuffer,
|
|
|
const XAUDIO2_BUFFER_WMA* pBufferWMA = NULL) = 0;
|
|
|
COM_METHOD(HRESULT) FlushSourceBuffers () = 0;
|
|
|
COM_METHOD(HRESULT) Discontinuity () = 0;
|
|
|
COM_METHOD(HRESULT) ExitLoop (UINT32 OperationSet = FAUDIO_COMMIT_NOW) = 0;
|
|
|
#if (XAUDIO2_VERSION <= 7)
|
|
|
COM_METHOD(void) GetState ( XAUDIO2_VOICE_STATE* pVoiceState) = 0;
|
|
|
#else
|
|
|
COM_METHOD(void) GetState ( XAUDIO2_VOICE_STATE* pVoiceState, UINT32 Flags = 0) = 0;
|
|
|
#endif
|
|
|
COM_METHOD(HRESULT) SetFrequencyRatio (
|
|
|
float Ratio,
|
|
|
UINT32 OperationSet = FAUDIO_COMMIT_NOW) = 0;
|
|
|
COM_METHOD(void) GetFrequencyRatio (float* pRatio) = 0;
|
|
|
#if XAUDIO2_VERSION >= 4
|
|
|
COM_METHOD(HRESULT) SetSourceSampleRate (UINT32 NewSourceSampleRate) = 0;
|
|
|
#endif // XAUDIO2_VERSION >= 4
|
|
|
};
|
|
|
|
|
|
class IXAudio2SubmixVoice : public IXAudio2Voice {
|
|
|
|
|
|
};
|
|
|
|
|
|
class IXAudio2MasteringVoice : public IXAudio2Voice {
|
|
|
public:
|
|
|
#if (XAUDIO2_VERSION >= 8)
|
|
|
COM_METHOD(HRESULT) GetChannelMask (uint32_t *pChannelmask) = 0;
|
|
|
#endif
|
|
|
};
|
|
|
|
|
|
class IXAudio2VoiceCallback {
|
|
|
public:
|
|
|
#if XAUDIO2_VERSION >= 1
|
|
|
COM_METHOD(void) OnVoiceProcessingPassStart (UINT32 BytesRequired) = 0;
|
|
|
#else
|
|
|
COM_METHOD(void) OnVoiceProcessingPassStart () = 0;
|
|
|
#endif // XAUDIO2_VERSION >= 1
|
|
|
COM_METHOD(void) OnVoiceProcessingPassEnd () = 0;
|
|
|
COM_METHOD(void) OnStreamEnd () = 0;
|
|
|
COM_METHOD(void) OnBufferStart (void* pBufferContext) = 0;
|
|
|
COM_METHOD(void) OnBufferEnd (void* pBufferContext) = 0;
|
|
|
COM_METHOD(void) OnLoopEnd (void* pBufferContext) = 0;
|
|
|
COM_METHOD(void) OnVoiceError (void* pBufferContext, HRESULT Error) = 0;
|
|
|
};
|
|
|
|
|
|
class IXAudio2EngineCallback {
|
|
|
public:
|
|
|
COM_METHOD(void) OnProcessingPassStart () = 0;
|
|
|
COM_METHOD(void) OnProcessingPassEnd () = 0;
|
|
|
COM_METHOD(void) OnCriticalError (HRESULT Error) = 0;
|
|
|
};
|
|
|
|
|
|
class IXAudio2 : public IUnknown {
|
|
|
public:
|
|
|
#if (XAUDIO2_VERSION <= 7)
|
|
|
COM_METHOD(HRESULT) GetDeviceCount(UINT32 *pCount) = 0;
|
|
|
COM_METHOD(HRESULT) GetDeviceDetails (UINT32 Index, XAUDIO2_DEVICE_DETAILS* pDeviceDetails) = 0;
|
|
|
COM_METHOD(HRESULT) Initialize (
|
|
|
UINT32 Flags = 0,
|
|
|
XAUDIO2_PROCESSOR XAudio2Processor = FAUDIO_DEFAULT_PROCESSOR) = 0;
|
|
|
#endif // XAUDIO2_VERSION <= 7
|
|
|
|
|
|
COM_METHOD(HRESULT) RegisterForCallbacks (IXAudio2EngineCallback* pCallback) = 0;
|
|
|
COM_METHOD(void) UnregisterForCallbacks ( IXAudio2EngineCallback* pCallback) = 0;
|
|
|
|
|
|
COM_METHOD(HRESULT) CreateSourceVoice (
|
|
|
IXAudio2SourceVoice** ppSourceVoice,
|
|
|
const WAVEFORMATEX* pSourceFormat,
|
|
|
UINT32 Flags = 0,
|
|
|
float MaxFrequencyRatio = FAUDIO_DEFAULT_FREQ_RATIO,
|
|
|
IXAudio2VoiceCallback* pCallback = NULL,
|
|
|
const XAUDIO2_VOICE_SENDS* pSendList = NULL,
|
|
|
const XAUDIO2_EFFECT_CHAIN* pEffectChain = NULL) = 0;
|
|
|
|
|
|
COM_METHOD(HRESULT) CreateSubmixVoice(
|
|
|
IXAudio2SubmixVoice** ppSubmixVoice,
|
|
|
UINT32 InputChannels,
|
|
|
UINT32 InputSampleRate,
|
|
|
UINT32 Flags = 0,
|
|
|
UINT32 ProcessingStage = 0,
|
|
|
const XAUDIO2_VOICE_SENDS* pSendList = NULL,
|
|
|
const XAUDIO2_EFFECT_CHAIN* pEffectChain = NULL) = 0;
|
|
|
|
|
|
#if XAUDIO2_VERSION <= 7
|
|
|
COM_METHOD(HRESULT) CreateMasteringVoice(
|
|
|
IXAudio2MasteringVoice** ppMasteringVoice,
|
|
|
UINT32 InputChannels = FAUDIO_DEFAULT_CHANNELS,
|
|
|
UINT32 InputSampleRate = FAUDIO_DEFAULT_SAMPLERATE,
|
|
|
UINT32 Flags = 0,
|
|
|
UINT32 DeviceIndex = 0,
|
|
|
const XAUDIO2_EFFECT_CHAIN* pEffectChain = NULL) = 0;
|
|
|
#else
|
|
|
COM_METHOD(HRESULT) CreateMasteringVoice (
|
|
|
IXAudio2MasteringVoice** ppMasteringVoice,
|
|
|
UINT32 InputChannels = FAUDIO_DEFAULT_CHANNELS,
|
|
|
UINT32 InputSampleRate = FAUDIO_DEFAULT_SAMPLERATE,
|
|
|
UINT32 Flags = 0,
|
|
|
LPCWSTR szDeviceId = NULL,
|
|
|
const XAUDIO2_EFFECT_CHAIN* pEffectChain = NULL,
|
|
|
int StreamCategory = 6) = 0; // FIXME: type was AUDIO_STREAM_CATEGORY (scoped enum so int for now)
|
|
|
#endif // XAUDIO2_VERSION <= 7
|
|
|
|
|
|
COM_METHOD(HRESULT) StartEngine() = 0;
|
|
|
COM_METHOD(void) StopEngine() = 0;
|
|
|
|
|
|
COM_METHOD(HRESULT) CommitChanges(UINT32 OperationSet) = 0;
|
|
|
|
|
|
COM_METHOD(void) GetPerformanceData(XAUDIO2_PERFORMANCE_DATA* pPerfData) = 0;
|
|
|
|
|
|
COM_METHOD(void) SetDebugConfiguration(
|
|
|
XAUDIO2_DEBUG_CONFIGURATION* pDebugConfiguration,
|
|
|
void* pReserved = NULL) = 0;
|
|
|
};
|
|
|
|
|
|
#if XAUDIO2_VERSION >= 8
|
|
|
|
|
|
FAUDIOCPP_API XAudio2Create(
|
|
|
IXAudio2 **ppXAudio2,
|
|
|
UINT32 Flags,
|
|
|
XAUDIO2_PROCESSOR XAudio2Processor
|
|
|
);
|
|
|
|
|
|
#endif // XAUDIO2_VERSION >= 8
|
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
}
|
|
|
#endif /* __cplusplus */
|
|
|
|
|
|
|
|
|
#endif // FACT_CPP_XAUDIO2_H
|
|
|
|