mirror of
https://github.com/simtactics/niotso.git
synced 2025-03-15 08:11:22 +00:00
* Finally removed the dependency on libstdc++ with TDM GCC, reducing the size of the exe from 153kB to 87kB
271 lines
No EOL
9.4 KiB
C++
271 lines
No EOL
9.4 KiB
C++
/*
|
|
xaudio2.hpp (2010-08-14)
|
|
author: OV2
|
|
|
|
ruby-specific header to provide mingw-friendly xaudio2 interfaces
|
|
*/
|
|
|
|
#include <unknwn.h>
|
|
#include <mmreg.h>
|
|
|
|
DEFINE_GUID(CLSID_XAudio2, 0xe21a7345, 0xeb21, 0x468e, 0xbe, 0x50, 0x80, 0x4d, 0xb9, 0x7c, 0xf7, 0x08);
|
|
DEFINE_GUID(CLSID_XAudio2_Debug, 0xf7a76c21, 0x53d4, 0x46bb, 0xac, 0x53, 0x8b, 0x45, 0x9c, 0xae, 0x46, 0xbd);
|
|
DEFINE_GUID(IID_IXAudio2, 0x8bcf1f58, 0x9fe7, 0x4583, 0x8a, 0xc6, 0xe2, 0xad, 0xc4, 0x65, 0xc8, 0xbb);
|
|
|
|
DECLARE_INTERFACE(IXAudio2Voice);
|
|
|
|
#define XAUDIO2_COMMIT_NOW 0
|
|
#define XAUDIO2_DEFAULT_CHANNELS 0
|
|
#define XAUDIO2_DEFAULT_SAMPLERATE 0
|
|
#define XAUDIO2_DEFAULT_FREQ_RATIO 4.0f
|
|
#define XAUDIO2_DEBUG_ENGINE 0x0001
|
|
#define XAUDIO2_LOOP_INFINITE 255
|
|
#define XAUDIO2_VOICE_NOSRC 0x0004
|
|
|
|
enum XAUDIO2_DEVICE_ROLE
|
|
{
|
|
NotDefaultDevice = 0x0,
|
|
DefaultConsoleDevice = 0x1,
|
|
DefaultMultimediaDevice = 0x2,
|
|
DefaultCommunicationsDevice = 0x4,
|
|
DefaultGameDevice = 0x8,
|
|
GlobalDefaultDevice = 0xf,
|
|
InvalidDeviceRole = ~GlobalDefaultDevice
|
|
};
|
|
|
|
struct XAUDIO2_DEVICE_DETAILS
|
|
{
|
|
WCHAR DeviceID[256];
|
|
WCHAR DisplayName[256];
|
|
XAUDIO2_DEVICE_ROLE Role;
|
|
WAVEFORMATEXTENSIBLE OutputFormat;
|
|
};
|
|
|
|
struct XAUDIO2_VOICE_DETAILS
|
|
{
|
|
UINT32 CreationFlags;
|
|
UINT32 InputChannels;
|
|
UINT32 InputSampleRate;
|
|
};
|
|
|
|
typedef enum XAUDIO2_WINDOWS_PROCESSOR_SPECIFIER
|
|
{
|
|
Processor1 = 0x00000001,
|
|
Processor2 = 0x00000002,
|
|
Processor3 = 0x00000004,
|
|
Processor4 = 0x00000008,
|
|
Processor5 = 0x00000010,
|
|
Processor6 = 0x00000020,
|
|
Processor7 = 0x00000040,
|
|
Processor8 = 0x00000080,
|
|
Processor9 = 0x00000100,
|
|
Processor10 = 0x00000200,
|
|
Processor11 = 0x00000400,
|
|
Processor12 = 0x00000800,
|
|
Processor13 = 0x00001000,
|
|
Processor14 = 0x00002000,
|
|
Processor15 = 0x00004000,
|
|
Processor16 = 0x00008000,
|
|
Processor17 = 0x00010000,
|
|
Processor18 = 0x00020000,
|
|
Processor19 = 0x00040000,
|
|
Processor20 = 0x00080000,
|
|
Processor21 = 0x00100000,
|
|
Processor22 = 0x00200000,
|
|
Processor23 = 0x00400000,
|
|
Processor24 = 0x00800000,
|
|
Processor25 = 0x01000000,
|
|
Processor26 = 0x02000000,
|
|
Processor27 = 0x04000000,
|
|
Processor28 = 0x08000000,
|
|
Processor29 = 0x10000000,
|
|
Processor30 = 0x20000000,
|
|
Processor31 = 0x40000000,
|
|
Processor32 = 0x80000000,
|
|
XAUDIO2_ANY_PROCESSOR = 0xffffffff,
|
|
XAUDIO2_DEFAULT_PROCESSOR = XAUDIO2_ANY_PROCESSOR
|
|
} XAUDIO2_WINDOWS_PROCESSOR_SPECIFIER, XAUDIO2_PROCESSOR;
|
|
|
|
struct XAUDIO2_VOICE_SENDS
|
|
{
|
|
UINT32 OutputCount;
|
|
IXAudio2Voice* *pOutputVoices;
|
|
};
|
|
|
|
struct XAUDIO2_EFFECT_DESCRIPTOR
|
|
{
|
|
IUnknown *pEffect;
|
|
BOOL InitialState;
|
|
UINT32 OutputChannels;
|
|
};
|
|
|
|
struct XAUDIO2_EFFECT_CHAIN
|
|
{
|
|
UINT32 EffectCount;
|
|
const XAUDIO2_EFFECT_DESCRIPTOR *pEffectDescriptors;
|
|
};
|
|
|
|
enum XAUDIO2_FILTER_TYPE
|
|
{
|
|
LowPassFilter,
|
|
BandPassFilter,
|
|
HighPassFilter
|
|
};
|
|
|
|
struct XAUDIO2_FILTER_PARAMETERS
|
|
{
|
|
XAUDIO2_FILTER_TYPE Type;
|
|
float Frequency;
|
|
float OneOverQ;
|
|
};
|
|
|
|
struct XAUDIO2_BUFFER
|
|
{
|
|
UINT32 Flags;
|
|
UINT32 AudioBytes;
|
|
const BYTE *pAudioData;
|
|
UINT32 PlayBegin;
|
|
UINT32 PlayLength;
|
|
UINT32 LoopBegin;
|
|
UINT32 LoopLength;
|
|
UINT32 LoopCount;
|
|
void *pContext;
|
|
};
|
|
|
|
struct XAUDIO2_BUFFER_WMA
|
|
{
|
|
const UINT32 *pDecodedPacketCumulativeBytes;
|
|
UINT32 PacketCount;
|
|
};
|
|
|
|
struct XAUDIO2_VOICE_STATE
|
|
{
|
|
void *pCurrentBufferContext;
|
|
UINT32 BuffersQueued;
|
|
UINT64 SamplesPlayed;
|
|
};
|
|
|
|
struct XAUDIO2_PERFORMANCE_DATA
|
|
{
|
|
UINT64 AudioCyclesSinceLastQuery;
|
|
UINT64 TotalCyclesSinceLastQuery;
|
|
UINT32 MinimumCyclesPerQuantum;
|
|
UINT32 MaximumCyclesPerQuantum;
|
|
UINT32 MemoryUsageInBytes;
|
|
UINT32 CurrentLatencyInSamples;
|
|
UINT32 GlitchesSinceEngineStarted;
|
|
UINT32 ActiveSourceVoiceCount;
|
|
UINT32 TotalSourceVoiceCount;
|
|
UINT32 ActiveSubmixVoiceCount;
|
|
UINT32 TotalSubmixVoiceCount;
|
|
UINT32 ActiveXmaSourceVoices;
|
|
UINT32 ActiveXmaStreams;
|
|
};
|
|
|
|
struct XAUDIO2_DEBUG_CONFIGURATION
|
|
{
|
|
UINT32 TraceMask;
|
|
UINT32 BreakMask;
|
|
BOOL LogThreadID;
|
|
BOOL LogFileline;
|
|
BOOL LogFunctionName;
|
|
BOOL LogTiming;
|
|
};
|
|
|
|
DECLARE_INTERFACE(IXAudio2EngineCallback)
|
|
{
|
|
STDMETHOD_(void, OnProcessingPassStart) (void);
|
|
STDMETHOD_(void, OnProcessingPassEnd) (void);
|
|
STDMETHOD_(void, OnCriticalError) (HRESULT Error);
|
|
};
|
|
|
|
DECLARE_INTERFACE(IXAudio2VoiceCallback)
|
|
{
|
|
STDMETHOD_(void, OnVoiceProcessingPassStart) (UINT32 BytesRequired);
|
|
STDMETHOD_(void, OnVoiceProcessingPassEnd) (void);
|
|
STDMETHOD_(void, OnStreamEnd) (void);
|
|
STDMETHOD_(void, OnBufferStart) (void *pBufferContext);
|
|
STDMETHOD_(void, OnBufferEnd) (void *pBufferContext);
|
|
STDMETHOD_(void, OnLoopEnd) (void *pBufferContext);
|
|
STDMETHOD_(void, OnVoiceError) (void *pBufferContext, HRESULT Error);
|
|
};
|
|
|
|
DECLARE_INTERFACE(IXAudio2Voice)
|
|
{
|
|
STDMETHOD_(void, GetVoiceDetails) (XAUDIO2_VOICE_DETAILS *pVoiceDetails);
|
|
STDMETHOD(SetOutputVoices) (const XAUDIO2_VOICE_SENDS *pSendList);
|
|
STDMETHOD(SetEffectChain) (const XAUDIO2_EFFECT_CHAIN *pEffectChain);
|
|
STDMETHOD(EnableEffect) (UINT32 EffectIndex, UINT32 OperationSet = XAUDIO2_COMMIT_NOW);
|
|
STDMETHOD(DisableEffect) (UINT32 EffectIndex, UINT32 OperationSet = XAUDIO2_COMMIT_NOW);
|
|
STDMETHOD_(void, GetEffectState) (UINT32 EffectIndex, BOOL *pEnabled);
|
|
STDMETHOD(SetEffectParameters) (UINT32 EffectIndex, const void *pParameters, UINT32 ParametersByteSize,
|
|
UINT32 OperationSet = XAUDIO2_COMMIT_NOW);
|
|
STDMETHOD(GetEffectParameters) (UINT32 EffectIndex, void *pParameters, UINT32 ParametersByteSize);
|
|
STDMETHOD(SetFilterParameters) (const XAUDIO2_FILTER_PARAMETERS *pParameters, UINT32 OperationSet = XAUDIO2_COMMIT_NOW);
|
|
STDMETHOD_(void, GetFilterParameters) (XAUDIO2_FILTER_PARAMETERS *pParameters);
|
|
STDMETHOD(SetVolume) (float Volume, UINT32 OperationSet = XAUDIO2_COMMIT_NOW);
|
|
STDMETHOD_(void, GetVolume) (float *pVolume);
|
|
STDMETHOD(SetChannelVolumes) (UINT32 Channels, const float *pVolumes, UINT32 OperationSet = XAUDIO2_COMMIT_NOW);
|
|
STDMETHOD_(void, GetChannelVolumes) (UINT32 Channels, float *pVolumes);
|
|
STDMETHOD(SetOutputMatrix) (IXAudio2Voice *pDestinationVoice, UINT32 SourceChannels, UINT32 DestinationChannels,
|
|
const float *pLevelMatrix, UINT32 OperationSet = XAUDIO2_COMMIT_NOW);
|
|
STDMETHOD_(void, GetOutputMatrix) (IXAudio2Voice *pDestinationVoice, UINT32 SourceChannels,
|
|
UINT32 DestinationChannels, float *pLevelMatrix);
|
|
STDMETHOD_(void, DestroyVoice) (void);
|
|
};
|
|
|
|
DECLARE_INTERFACE_(IXAudio2MasteringVoice, IXAudio2Voice){};
|
|
|
|
DECLARE_INTERFACE_(IXAudio2SubmixVoice, IXAudio2Voice){};
|
|
|
|
DECLARE_INTERFACE_(IXAudio2SourceVoice, IXAudio2Voice)
|
|
{
|
|
STDMETHOD(Start) (UINT32 Flags, UINT32 OperationSet = XAUDIO2_COMMIT_NOW);
|
|
STDMETHOD(Stop) (UINT32 Flags, UINT32 OperationSet = XAUDIO2_COMMIT_NOW);
|
|
STDMETHOD(SubmitSourceBuffer) (const XAUDIO2_BUFFER *pBuffer, const XAUDIO2_BUFFER_WMA *pBufferWMA = NULL);
|
|
STDMETHOD(FlushSourceBuffers) (void);
|
|
STDMETHOD(Discontinuity) (void);
|
|
STDMETHOD(ExitLoop) (UINT32 OperationSet = XAUDIO2_COMMIT_NOW);
|
|
STDMETHOD_(void, GetState) (XAUDIO2_VOICE_STATE *pVoiceState);
|
|
STDMETHOD(SetFrequencyRatio) (float Ratio, UINT32 OperationSet = XAUDIO2_COMMIT_NOW);
|
|
STDMETHOD_(void, GetFrequencyRatio) (float *pRatio);
|
|
};
|
|
|
|
DECLARE_INTERFACE_(IXAudio2, IUnknown)
|
|
{
|
|
STDMETHOD(GetDeviceCount) (UINT32 *pCount);
|
|
STDMETHOD(GetDeviceDetails) (UINT32 Index, XAUDIO2_DEVICE_DETAILS *pDeviceDetails);
|
|
STDMETHOD(Initialize) (UINT32 Flags = 0, XAUDIO2_PROCESSOR XAudio2Processor = XAUDIO2_DEFAULT_PROCESSOR);
|
|
STDMETHOD(RegisterForCallbacks) (IXAudio2EngineCallback *pCallback);
|
|
STDMETHOD_(void, UnregisterForCallbacks) (IXAudio2EngineCallback *pCallback);
|
|
STDMETHOD(CreateSourceVoice) (IXAudio2SourceVoice* *ppSourceVoice, const WAVEFORMATEX *pSourceFormat, UINT32 Flags = 0,
|
|
float MaxFrequencyRatio = XAUDIO2_DEFAULT_FREQ_RATIO, IXAudio2VoiceCallback *pCallback = NULL,
|
|
const XAUDIO2_VOICE_SENDS *pSendList = NULL, const XAUDIO2_EFFECT_CHAIN *pEffectChain = NULL);
|
|
STDMETHOD(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);
|
|
STDMETHOD(CreateMasteringVoice) (IXAudio2MasteringVoice* *ppMasteringVoice,
|
|
UINT32 InputChannels = XAUDIO2_DEFAULT_CHANNELS, UINT32 InputSampleRate = XAUDIO2_DEFAULT_SAMPLERATE,
|
|
UINT32 Flags = 0, UINT32 DeviceIndex = 0, const XAUDIO2_EFFECT_CHAIN *pEffectChain = NULL);
|
|
STDMETHOD(StartEngine) (void);
|
|
STDMETHOD_(void, StopEngine) (void);
|
|
STDMETHOD(CommitChanges) (UINT32 OperationSet);
|
|
STDMETHOD_(void, GetPerformanceData) (XAUDIO2_PERFORMANCE_DATA *pPerfData);
|
|
STDMETHOD_(void, SetDebugConfiguration) (const XAUDIO2_DEBUG_CONFIGURATION *pDebugConfiguration, void *pReserved = NULL);
|
|
};
|
|
|
|
inline HRESULT XAudio2Create(IXAudio2* *ppXAudio2, UINT32 Flags = 0,
|
|
XAUDIO2_PROCESSOR XAudio2Processor = XAUDIO2_DEFAULT_PROCESSOR)
|
|
{
|
|
IXAudio2 *pXAudio2;
|
|
HRESULT hr = CoCreateInstance((Flags & XAUDIO2_DEBUG_ENGINE) ? CLSID_XAudio2_Debug : CLSID_XAudio2, NULL,
|
|
CLSCTX_INPROC_SERVER, IID_IXAudio2, (void**)&pXAudio2);
|
|
if(SUCCEEDED(hr)){
|
|
hr = pXAudio2->Initialize(Flags, XAudio2Processor);
|
|
if(SUCCEEDED(hr))
|
|
*ppXAudio2 = pXAudio2;
|
|
else
|
|
pXAudio2->Release();
|
|
}
|
|
return hr;
|
|
} |