UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
WindowsMMDeviceInfoCache.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "HAL/Platform.h"
6
7#include "AudioMixer.h"
8#include "ScopedCom.h"
9
12
14
16#include <mmreg.h> // WAVEFORMATEX
17#include <mmdeviceapi.h> // IMMDeviceEnumerator
19
22
23#define UE_API WINDOWSMMDEVICEENUMERATION_API
24
25namespace Audio
26{
28{
30 {
31 enum class UE_DEPRECATED(5.6, "EEndpointType is deprecated. Please use EDeviceEndpointType instead.") EEndpointType { Unknown, Render, Capture };
32
34 FString FriendlyName;
40 uint32 ChannelBitmask = 0; // Bitfield used to build output channels, for easy comparison.
41 FName HardwareId; // Unique string of the physical hardware device this MMDevice belongs to
42 FString FilterId; // Unique identifier for this device containing product id (pid), vendor id (vid), etc.
43
44 TArray<EAudioMixerChannel::Type> OutputChannels; // TODO. Generate this from the ChannelNum and bitmask when we are asked for it.
46
48
50
52
54
55 FCacheEntry(const FString& InDeviceId);
56 };
57
59
60 mutable FRWLock CacheMutationLock; // R/W lock protects map and default arrays.
61 TMap<FName, FCacheEntry> Cache; // DeviceID GUID -> Info.
64
67 virtual ~FWindowsMMDeviceCache() = default;
68
70
72
74
76
78
80
82
83 UE_API void OnDefaultCaptureDeviceChanged(const EAudioDeviceRole InAudioDeviceRole, const FString& DeviceId) override;
84
85 UE_API void OnDefaultRenderDeviceChanged(const EAudioDeviceRole InAudioDeviceRole, const FString& DeviceId) override;
86
87 UE_API void OnDeviceAdded(const FString& DeviceId, bool bIsRender) override;
88
89 UE_API void OnDeviceRemoved(const FString& DeviceId, bool) override;
90
91 UE_API TOptional<FCacheEntry> BuildCacheEntry(const FString& DeviceId);
92
94
95 UE_API void OnDeviceStateChanged(const FString& DeviceId, const EAudioDeviceState InState, bool) override;
96
97 UE_API void OnFormatChanged(const FString& InDeviceId, const FFormatChangedData& InFormat) override;
98
100
102
103 UE_API virtual bool IsAggregateHardwareDeviceId(const FName InDeviceID) const override;
104
106
108
110
112
114
116
118
119 static UE_API FString ExtractAggregateDeviceName(const FString& InName);
120
121private:
122 struct FCacheKeyFuncs : BaseKeyFuncs<FWindowsMMDeviceCache::FCacheEntry, FName>
123 {
124 static KeyInitType GetSetKey(ElementInitType Element)
125 {
126 return Element.HardwareId;
127 }
128
129 static bool Matches(KeyInitType A, KeyInitType B)
130 {
131 return A.IsEqual(B, ENameCase::CaseSensitive);
132 }
133
134 static uint32 GetKeyHash(KeyInitType Key)
135 {
136 return GetTypeHash(Key);
137 }
138 };
139
140 struct FDeviceChannelInfo
141 {
142 uint32 LogicDeviceChannelCount = 0;
143 uint32 TotalChannelCount = 0;
144 };
145
146 bool bIsAggregateDeviceSupportEnabled = false;
147
149
150 static UE_API FAudioPlatformDeviceInfo CreateAggregateDeviceInfo(const FCacheEntry& InCacheEntry, const FDeviceChannelInfo& InDeviceChannelInfo);
151
152 static UE_API int32 ExtractAggregateChannelNumber(const FString& InName);
153};
154
155}// namespace Audio
156
157#undef UE_API
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define THIRD_PARTY_INCLUDES_START
Definition GenericPlatformCompilerPreSetup.h:63
#define UE_API
Definition SColorGradingComponentViewer.h:12
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition AudioMixer.h:415
Definition AudioMixer.h:232
Definition NameTypes.h:617
Definition Array.h:670
Definition COMPointer.h:19
Definition UnrealString.h.inl:34
Definition CriticalSection.h:14
NO_LOGGING.
Definition AudioMixerPlatformAndroid.cpp:53
EAudioDeviceState
Definition AudioMixer.h:340
EDeviceEndpointType
Definition AudioMixer.h:228
EAudioDeviceRole
Definition AudioMixer.h:331
Definition Voronoi.cpp:10
Definition AudioMixer.h:152
Definition WindowsMMDeviceInfoCache.h:30
TArray< EAudioMixerChannel::Type > OutputChannels
Definition WindowsMMDeviceInfoCache.h:44
EDeviceEndpointType Type
Definition WindowsMMDeviceInfoCache.h:39
FString FriendlyName
Definition WindowsMMDeviceInfoCache.h:34
uint32 ChannelBitmask
Definition WindowsMMDeviceInfoCache.h:40
int32 NumChannels
Definition WindowsMMDeviceInfoCache.h:37
EAudioDeviceState State
Definition WindowsMMDeviceInfoCache.h:36
int32 SampleRate
Definition WindowsMMDeviceInfoCache.h:38
FName HardwareId
Definition WindowsMMDeviceInfoCache.h:41
FCacheEntry & operator=(const FCacheEntry &InOther)
Definition WindowsMMDeviceInfoCache.cpp:54
FName DeviceId
Definition WindowsMMDeviceInfoCache.h:33
FString DeviceFriendlyName
Definition WindowsMMDeviceInfoCache.h:35
FRWLock MutationLock
Definition WindowsMMDeviceInfoCache.h:45
enum UE_DEPRECATED(5.6, "EEndpointType is deprecated. Please use EDeviceEndpointType instead.") EEndpointType
Definition WindowsMMDeviceInfoCache.h:31
FString FilterId
Definition WindowsMMDeviceInfoCache.h:42
Definition WindowsMMDeviceInfoCache.h:28
UE_API EDeviceEndpointType QueryDeviceDataFlow(const TComPtr< IMMDevice > &InDevice) const
Definition WindowsMMDeviceInfoCache.cpp:231
UE_API FWindowsMMDeviceCache()
Definition WindowsMMDeviceInfoCache.cpp:95
UE_API TOptional< FAudioPlatformDeviceInfo > FindDefaultOutputDevice() const override
Definition WindowsMMDeviceInfoCache.cpp:909
UE_API void EnumerateDefaults()
Definition WindowsMMDeviceInfoCache.cpp:452
virtual UE_API TArray< FAudioPlatformDeviceInfo > GetLogicalAggregateDevices(const FName InHardwareId, const EDeviceEndpointType InEndpointType) const override
Definition WindowsMMDeviceInfoCache.cpp:761
TComPtr< IMMDeviceEnumerator > DeviceEnumerator
Definition WindowsMMDeviceInfoCache.h:58
UE_API bool EnumerateDeviceProps(const TComPtr< IMMDevice > &InDevice, FCacheEntry &OutInfo)
Definition WindowsMMDeviceInfoCache.cpp:253
UE_API void OnDeviceAdded(const FString &DeviceId, bool bIsRender) override
Definition WindowsMMDeviceInfoCache.cpp:517
UE_API void OnDeviceRemoved(const FString &DeviceId, bool) override
Definition WindowsMMDeviceInfoCache.cpp:538
UE_API bool EnumerateHardwareTopology(const TComPtr< IMMDevice > &InDevice, FCacheEntry &OutInfo)
Definition WindowsMMDeviceInfoCache.cpp:319
UE_API bool EnumerateChannelFormat(const WAVEFORMATEX *InFormat, FCacheEntry &OutInfo)
Definition WindowsMMDeviceInfoCache.cpp:206
virtual UE_API TOptional< FAudioPlatformDeviceInfo > GetAggregateHardwareDeviceInfo(const FName InHardwareId, const EDeviceEndpointType InEndpointType) const
Definition WindowsMMDeviceInfoCache.cpp:740
UE_API TOptional< FAudioPlatformDeviceInfo > FindActiveOutputDevice(FName InDeviceID) const override
Definition WindowsMMDeviceInfoCache.cpp:914
virtual UE_API bool IsAggregateHardwareDeviceId(const FName InDeviceID) const override
Definition WindowsMMDeviceInfoCache.cpp:720
UE_API bool EnumerateChannelMask(uint32 InMask, FCacheEntry &OutInfo)
Definition WindowsMMDeviceInfoCache.cpp:101
UE_API void OnDefaultRenderDeviceChanged(const EAudioDeviceRole InAudioDeviceRole, const FString &DeviceId) override
Definition WindowsMMDeviceInfoCache.cpp:510
FName DefaultCaptureId[(int32) EAudioDeviceRole::COUNT]
Definition WindowsMMDeviceInfoCache.h:62
UE_API bool IsAggregateDeviceSupportEnabled() const
Definition WindowsMMDeviceInfoCache.cpp:966
UE_API TOptional< FCacheEntry > BuildCacheEntry(const FString &DeviceId)
Definition WindowsMMDeviceInfoCache.cpp:546
UE_API void OnDeviceStateChanged(const FString &DeviceId, const EAudioDeviceState InState, bool) override
Definition WindowsMMDeviceInfoCache.cpp:572
virtual UE_API TArray< FAudioPlatformDeviceInfo > SynthesizeAggregateDeviceList(const EDeviceEndpointType InType) const
Definition WindowsMMDeviceInfoCache.cpp:842
UE_API void OnFormatChanged(const FString &InDeviceId, const FFormatChangedData &InFormat) override
Definition WindowsMMDeviceInfoCache.cpp:592
UE_API FString GetFriendlyName(FName InDeviceId) const
Definition WindowsMMDeviceInfoCache.cpp:563
UE_API FName GetDefaultOutputDevice_NoLock() const
Definition WindowsMMDeviceInfoCache.cpp:896
UE_API void MakeDeviceInfo(const FCacheEntry &InEntry, FName InDefaultDevice, FAudioPlatformDeviceInfo &OutInfo) const
Definition WindowsMMDeviceInfoCache.cpp:645
UE_API void OnDefaultCaptureDeviceChanged(const EAudioDeviceRole InAudioDeviceRole, const FString &DeviceId) override
Definition WindowsMMDeviceInfoCache.cpp:503
FRWLock CacheMutationLock
Definition WindowsMMDeviceInfoCache.h:60
virtual UE_API TArray< FAudioPlatformDeviceInfo > GetAllActiveOutputDevices() const override
Definition WindowsMMDeviceInfoCache.cpp:657
FName DefaultRenderId[(int32) EAudioDeviceRole::COUNT]
Definition WindowsMMDeviceInfoCache.h:63
TMap< FName, FCacheEntry > Cache
Definition WindowsMMDeviceInfoCache.h:61
virtual ~FWindowsMMDeviceCache()=default
static UE_API FString ExtractAggregateDeviceName(const FString &InName)
Definition WindowsMMDeviceInfoCache.cpp:867
UE_API void EnumerateEndpoints()
Definition WindowsMMDeviceInfoCache.cpp:393
Definition SetUtilities.h:23
TCallTraits< FWindowsMMDeviceCache::FCacheEntry >::ParamType ElementInitType
Definition SetUtilities.h:26
TCallTraits< FName >::ParamType KeyInitType
Definition SetUtilities.h:25
Definition Optional.h:131