UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
AudioMixerPlatformXAudio2.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "AudioMixer.h"
7
8// Notes on how the headers and libs are used in UE XAudio2 implementation:
9// Intel Windows:
10// Use the MS XAudio2.9 redist header/library/DLL to guarantee 2.9 on any Windows version
11// Arm64 Windows:
12// Must use the system XAudio2_9.dll. We could use the Win10 SDK's verison of xaudio2.h, however
13// UE includes a copy of the DirectX SDK headers, which will interfere with finding the SDK version.
14// The redist header is usable, however, even tho we are not using the redist libraries. We do not
15// need to manually load the DLL because linking with the SDK arm64 .lib, without a DELAYLOAD,
16// will make the OS automatically load the DLL correctly.
17// Consoles:
18// Similar to the Arm64 above, except the copy of DirectX SDK headers are not used, so consoles
19// can use the xaudio2.h from the SDK
20#define USE_REDIST_HEADER PLATFORM_WINDOWS
21#define USE_REDIST_LIB PLATFORM_WINDOWS && !PLATFORM_CPU_ARM_FAMILY
22
23#if USE_REDIST_HEADER
24#include <xaudio2redist.h>
25#else
26#include <xaudio2.h>
27#endif
29
30#include "Async/Future.h"
31
32#ifndef XAUDIO_SUPPORTS_DEVICE_DETAILS
33 #define XAUDIO_SUPPORTS_DEVICE_DETAILS 1
34#endif //XAUDIO_SUPPORTS_DEVICE_DETAILS
35
36// Any platform defines
37namespace Audio
38{
39 class FMixerPlatformXAudio2;
40
47 class FXAudio2VoiceCallback final : public IXAudio2VoiceCallback
48 {
49 public:
52
53 private:
54 void STDCALL OnVoiceProcessingPassStart(UINT32 BytesRequired) {}
55 void STDCALL OnVoiceProcessingPassEnd() {}
56 void STDCALL OnStreamEnd() {}
57 void STDCALL OnBufferStart(void* BufferContext) {}
58 void STDCALL OnLoopEnd(void* BufferContext) {}
59 void STDCALL OnVoiceError(void* BufferContext, HRESULT Error) {}
60
61 void STDCALL OnBufferEnd(void* BufferContext);
62
63 };
64
79
81 {
82 virtual bool IsNewDeviceReady() const override
83 {
85 }
86
87 IXAudio2* NewSystem = nullptr;
90 };
91
93 public IXAudio2EngineCallback
94 {
95
96 public:
97
99 virtual ~FMixerPlatformXAudio2() override;
100
101 //~ Begin IAudioMixerPlatformInterface
102 virtual FString GetPlatformApi() const override { return TEXT("XAudio2"); }
103 virtual bool InitializeHardware() override;
104 virtual bool CheckAudioDeviceChange() override;
105 virtual bool TeardownHardware() override;
106 virtual bool IsInitialized() const override;
107 virtual bool GetNumOutputDevices(uint32& OutNumOutputDevices) override;
108 virtual bool GetOutputDeviceInfo(const uint32 InDeviceIndex, FAudioPlatformDeviceInfo& OutInfo) override;
109 virtual FString GetCurrentDeviceName() const override;
110 virtual bool GetDefaultOutputDeviceIndex(uint32& OutDefaultDeviceIndex) const override;
111 virtual bool OpenAudioStream(const FAudioMixerOpenStreamParams& Params) override;
112 virtual bool CloseAudioStream() override;
113 virtual bool StartAudioStream() override;
114 virtual bool StopAudioStream() override;
115 virtual bool MoveAudioStreamToNewAudioDevice() override;
116
117 virtual FAudioPlatformDeviceInfo GetPlatformDeviceInfo() const override;
118 virtual void SubmitBuffer(const uint8* Buffer) override;
119 virtual FString GetDefaultDeviceName() override;
120 virtual FAudioPlatformSettings GetPlatformSettings() const override;
121 virtual void OnHardwareUpdate() override;
122 virtual IAudioPlatformDeviceInfoCache* GetDeviceInfoCache() const override;
123 virtual bool IsDeviceInfoValid(const FAudioPlatformDeviceInfo& InDeviceInfo) const override;
124 virtual bool ShouldUseDeviceInfoCache() const override { return true; }
125 //~ End IAudioMixerPlatformInterface
126
127 //~ Begin IAudioMixerDeviceChangedListener
128 virtual void RegisterDeviceChangedListener() override;
129 virtual void UnregisterDeviceChangedListener() override;
130 virtual void OnDefaultCaptureDeviceChanged(const EAudioDeviceRole InAudioDeviceRole, const FString& DeviceId) override;
131 virtual void OnDefaultRenderDeviceChanged(const EAudioDeviceRole InAudioDeviceRole, const FString& DeviceId) override;
132 virtual void OnDeviceAdded(const FString& DeviceId, bool bIsRenderDevice) override;
133 virtual void OnDeviceRemoved(const FString& DeviceId, bool bIsRenderDevice) override;
134 virtual void OnDeviceStateChanged(const FString& DeviceId, const EAudioDeviceState InState, bool bIsRenderDevice) override;
136 virtual FString GetDeviceId() const override;
137 //~ End IAudioMixerDeviceChangedListener
138
139 //~ Begin FAudioMixerPlatformSwappable
140 virtual bool InitializeDeviceSwapContext(const FString& InRequestedDeviceID, const TCHAR* InReason) override;
141 virtual bool CheckThreadedDeviceSwap() override;
142 virtual bool PreDeviceSwap() override;
143 virtual void EnqueueAsyncDeviceSwap() override;
144 virtual void SynchronousDeviceSwap() override;
145 virtual bool PostDeviceSwap() override;
146 //~ End FAudioMixerPlatformSwappable
147
148 protected:
149 virtual uint32 GetCreateFlags() const { return 0; }
150 virtual bool ShouldUseDefaultDevice() const { return false; }
151
152 static IXAudio2MasteringVoice* CreateMasteringVoice(IXAudio2& InXAudio2System, const FAudioPlatformDeviceInfo& NewDevice, bool bUseDefaultDevice);
153
154 //~ Begin IXAudio2EngineCallback
155 virtual void OnCriticalError(HRESULT Error) override;
156 virtual void OnProcessingPassStart() override;
157 virtual void OnProcessingPassEnd() override;
158 //~ End IXAudio2EngineCallback
159
160 // Used to teardown and reinitialize XAudio2.
161 // This must be done to repopulate the playback device list in XAudio 2.7.
162 bool ResetXAudio2System();
163
168
169 // Handle to XAudio2DLL
170 HMODULE XAudio2Dll;
171
172 // Bool indicating that the default audio device changed
173 // And that we need to restart the audio device.
174 UE_DEPRECATED(5.6, "bDeviceChanged has been deprecated.")
176
181
182 // When we are running the null device,
183 // we check whether a new audio device was connected every second or so.
185
187
189
192
193 private:
196
199 };
200
201}
202
#define STDCALL
Definition AndroidPlatform.h:136
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::TCHAR TCHAR
Either ANSICHAR or WIDECHAR, depending on whether the platform supports wide characters or the requir...
Definition Platform.h:1135
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition AudioMixer.h:802
Definition AudioMixerPlatformXAudio2.h:94
uint32 bIsInitialized
Definition AudioMixerPlatformXAudio2.h:190
virtual bool GetNumOutputDevices(uint32 &OutNumOutputDevices) override
Definition AudioMixerPlatformXAudio2.cpp:555
FMixerPlatformXAudio2()
Definition AudioMixerPlatformXAudio2.cpp:137
virtual bool IsInitialized() const override
Definition AudioMixerPlatformXAudio2.cpp:550
virtual bool StopAudioStream() override
Definition AudioMixerPlatformXAudio2.cpp:1060
virtual bool PreDeviceSwap() override
Definition AudioMixerPlatformXAudio2.cpp:172
bool ResetXAudio2System()
Definition AudioMixerPlatformXAudio2.cpp:444
virtual bool GetDefaultOutputDeviceIndex(uint32 &OutDefaultDeviceIndex) const override
Definition AudioMixerPlatformXAudio2.cpp:855
IXAudio2MasteringVoice * OutputAudioStreamMasteringVoice
Definition AudioMixerPlatformXAudio2.h:178
virtual uint32 GetCreateFlags() const
Definition AudioMixerPlatformXAudio2.h:149
bool InitDeviceSwapContextInternal(const FString &InRequestedDeviceID, const TCHAR *InReason, const TOptional< FAudioPlatformDeviceInfo > &InDeviceInfo)
Definition AudioMixerPlatformXAudio2.cpp:1164
virtual void OnHardwareUpdate() override
Definition AudioMixerPlatformXAudio2.cpp:1203
virtual bool PostDeviceSwap() override
Definition AudioMixerPlatformXAudio2.cpp:227
virtual FString GetDeviceId() const override
Definition AudioMixerPlatformWindows.cpp:229
virtual FString GetPlatformApi() const override
Definition AudioMixerPlatformXAudio2.h:102
virtual ~FMixerPlatformXAudio2() override
Definition AudioMixerPlatformXAudio2.cpp:151
FXAudio2VoiceCallback OutputVoiceCallback
Definition AudioMixerPlatformXAudio2.h:180
virtual bool ShouldUseDefaultDevice() const
Definition AudioMixerPlatformXAudio2.h:150
virtual bool InitializeHardware() override
Definition AudioMixerPlatformXAudio2.cpp:459
virtual bool MoveAudioStreamToNewAudioDevice() override
Definition AudioMixerPlatformXAudio2.cpp:1104
virtual bool OpenAudioStream(const FAudioMixerOpenStreamParams &Params) override
Definition AudioMixerPlatformXAudio2.cpp:861
virtual bool GetOutputDeviceInfo(const uint32 InDeviceIndex, FAudioPlatformDeviceInfo &OutInfo) override
Definition AudioMixerPlatformXAudio2.cpp:756
virtual FString GetCurrentDeviceName() const override
Definition AudioMixerPlatformXAudio2.cpp:977
virtual bool CheckAudioDeviceChange() override
Definition AudioMixerPlatformXAudio2.cpp:1095
virtual bool StartAudioStream() override
Definition AudioMixerPlatformXAudio2.cpp:1030
virtual FAudioPlatformSettings GetPlatformSettings() const override
Definition AudioMixerPlatformXAudio2.cpp:1194
virtual void SubmitBuffer(const uint8 *Buffer) override
Definition AudioMixerPlatformXAudio2.cpp:1113
virtual void SynchronousDeviceSwap() override
Definition AudioMixerPlatformXAudio2.cpp:287
virtual bool ShouldUseDeviceInfoCache() const override
Definition AudioMixerPlatformXAudio2.h:124
virtual bool TeardownHardware() override
Definition AudioMixerPlatformXAudio2.cpp:517
virtual FAudioPlatformDeviceInfo GetPlatformDeviceInfo() const override
Definition AudioMixerPlatformXAudio2.cpp:972
virtual bool InitializeDeviceSwapContext(const FString &InRequestedDeviceID, const TCHAR *InReason) override
Definition AudioMixerPlatformXAudio2.cpp:1136
virtual void OnDefaultCaptureDeviceChanged(const EAudioDeviceRole InAudioDeviceRole, const FString &DeviceId) override
Definition AudioMixerPlatformWindows.cpp:224
bool FirstBufferSubmitted
Definition AudioMixerPlatformXAudio2.h:186
IXAudio2SourceVoice * OutputAudioStreamSourceVoice
Definition AudioMixerPlatformXAudio2.h:179
virtual IAudioPlatformDeviceInfoCache * GetDeviceInfoCache() const override
Definition AudioMixerPlatformXAudio2.cpp:1207
virtual void RegisterDeviceChangedListener() override
Definition AudioMixerPlatformWindows.cpp:222
uint32 bIsDeviceOpen
Definition AudioMixerPlatformXAudio2.h:191
virtual void OnDefaultRenderDeviceChanged(const EAudioDeviceRole InAudioDeviceRole, const FString &DeviceId) override
Definition AudioMixerPlatformWindows.cpp:225
virtual void OnProcessingPassStart() override
Definition AudioMixerPlatformXAudio2.cpp:1278
virtual bool CloseAudioStream() override
Definition AudioMixerPlatformXAudio2.cpp:982
float TimeSinceNullDeviceWasLastChecked
Definition AudioMixerPlatformXAudio2.h:184
virtual void OnCriticalError(HRESULT Error) override
Definition AudioMixerPlatformXAudio2.cpp:1286
FThreadSafeBool bDeviceChanged
Definition AudioMixerPlatformXAudio2.h:175
virtual void OnDeviceAdded(const FString &DeviceId, bool bIsRenderDevice) override
Definition AudioMixerPlatformWindows.cpp:226
virtual void EnqueueAsyncDeviceSwap() override
Definition AudioMixerPlatformXAudio2.cpp:204
virtual void OnDeviceRemoved(const FString &DeviceId, bool bIsRenderDevice) override
Definition AudioMixerPlatformWindows.cpp:227
TUniquePtr< IAudioPlatformDeviceInfoCache > DeviceInfoCache
Definition AudioMixerPlatformXAudio2.h:188
virtual void OnProcessingPassEnd() override
Definition AudioMixerPlatformXAudio2.cpp:1282
IXAudio2 * XAudio2System
Definition AudioMixerPlatformXAudio2.h:177
virtual FString GetDefaultDeviceName() override
Definition AudioMixerPlatformXAudio2.cpp:1189
virtual void OnSessionDisconnect(Audio::IAudioMixerDeviceChangedListener::EDisconnectReason InReason) override
Definition AudioMixerPlatformXAudio2.cpp:1229
virtual void OnDeviceStateChanged(const FString &DeviceId, const EAudioDeviceState InState, bool bIsRenderDevice) override
Definition AudioMixerPlatformWindows.cpp:228
virtual bool IsDeviceInfoValid(const FAudioPlatformDeviceInfo &InDeviceInfo) const override
Definition AudioMixerPlatformXAudio2.cpp:1217
HMODULE XAudio2Dll
Definition AudioMixerPlatformXAudio2.h:170
virtual bool CheckThreadedDeviceSwap() override
Definition AudioMixerPlatformXAudio2.cpp:163
static IXAudio2MasteringVoice * CreateMasteringVoice(IXAudio2 &InXAudio2System, const FAudioPlatformDeviceInfo &NewDevice, bool bUseDefaultDevice)
Definition AudioMixerPlatformXAudio2.cpp:1249
virtual void UnregisterDeviceChangedListener() override
Definition AudioMixerPlatformWindows.cpp:223
Definition AudioMixerPlatformXAudio2.h:48
FXAudio2VoiceCallback()
Definition AudioMixerPlatformXAudio2.h:50
~FXAudio2VoiceCallback()
Definition AudioMixerPlatformXAudio2.h:51
EDisconnectReason
Definition AudioMixer.h:427
Definition AudioMixer.h:232
Definition ThreadSafeBool.h:17
Definition UniquePtr.h:107
NO_LOGGING.
Definition AudioMixerPlatformAndroid.cpp:53
EAudioDeviceState
Definition AudioMixer.h:340
EAudioDeviceRole
Definition AudioMixer.h:331
Definition AudioMixer.h:250
Definition AudioMixer.h:152
Definition AudioMixer.h:451
Definition AudioMixer.h:465
Definition AudioMixerPlatformXAudio2.h:66
bool bUseDefaultDevice
Definition AudioMixerPlatformXAudio2.h:72
IXAudio2MasteringVoice * PreviousMasteringVoice
Definition AudioMixerPlatformXAudio2.h:74
IXAudio2SourceVoice * PreviousSourceVoice
Definition AudioMixerPlatformXAudio2.h:75
uint32 RenderingSampleRate
Definition AudioMixerPlatformXAudio2.h:77
IXAudio2 * PreviousSystem
Definition AudioMixerPlatformXAudio2.h:73
FXAudio2DeviceSwapContext(const FString &InRequestedDeviceID, const FString &InReason)
Definition AudioMixerPlatformXAudio2.h:68
FXAudio2VoiceCallback * Callbacks
Definition AudioMixerPlatformXAudio2.h:76
Definition AudioMixerPlatformXAudio2.h:81
IXAudio2SourceVoice * NewSourceVoice
Definition AudioMixerPlatformXAudio2.h:89
IXAudio2MasteringVoice * NewMasteringVoice
Definition AudioMixerPlatformXAudio2.h:88
IXAudio2 * NewSystem
Definition AudioMixerPlatformXAudio2.h:87
virtual bool IsNewDeviceReady() const override
Definition AudioMixerPlatformXAudio2.h:82
Definition AudioMixerTypes.h:63
Definition Optional.h:131